Skip to content

Presentation-feedback epics (GOV/RES/AIX/EXEC) + Flow Editor resource UX#51

Merged
raffelino merged 6 commits into
mainfrom
feat/gov-deployment-governance
Jun 18, 2026
Merged

Presentation-feedback epics (GOV/RES/AIX/EXEC) + Flow Editor resource UX#51
raffelino merged 6 commits into
mainfrom
feat/gov-deployment-governance

Conversation

@raffelino

Copy link
Copy Markdown
Collaborator

Folds the four presentation-feedback epics plus the Flow Editor custom-resource UX wave into main. Each was built via the BMAD flow (PRD → architecture → impl → review) with real-UI E2E.

Epics

  • GOV (790e327) — deployment feature lockdown: ROBOSCOPE_FEATURE_* ENV > DB > default-ON flag resolver, per-endpoint require_feature/require_package_op enforcement (absolute 403, audited), token-guarded useFeatureFlags frontend gate.
  • RES (1086ebb) — repository .resource keywords usable: inserting a .resource keyword auto-adds the matching Resource import (open-file-relative path).
  • AIX (8eea70d) — LiteLLM provider type + AI-analysis verbosity control.
  • EXEC (5a43237) — Include/Exclude tag selection in the run dialog, threaded to the existing robot --include/--exclude runner.
  • docs/i18n gate (fe55579) — EN/FR/ES doc-subsection parity pinned as a release gate.

Flow Editor resource UX wave — D1–D6 (9100039)

From the scoped UX spec _bmad-output/planning-artifacts/ux-flow-editor-resources.md:

  • D1 pinned "Your resources" palette section + split Resources/Libraries imports panel
  • D2 import-confirmation toast (only when an import is actually added; no Undo)
  • D3 required-argument slots pre-filled on insert
  • D4 title tooltips + pinned badges for long names
  • D5 sort control (Most used / A–Z / Imported first), persisted
  • D6 "what's shown" filter with an adaptive default (env + sophisticated-file heuristic) + persisted override

Filter/sort/heuristic logic lives in a pure, unit-tested module (paletteView.ts).

Verification

  • Full vitest suite green (851); prod build clean (no i18n escaping break); type-check clean.
  • Real-UI E2E: gov-feature-lockdown, resource-autoimport, run-tags, flow-editor-resource-ux, plus 12 adjacent flow-editor specs green.
  • i18n complete EN/DE/FR/ES (ZH deep-merges over EN); Release Gate 8 (locale + doc parity) green.

🤖 Generated with Claude Code

raffelino and others added 6 commits June 18, 2026 09:19
…agement)

Operators can disable feature areas per deployment, independent of user roles —
addressing the Provinzial blocker (managed/remote installs where package
provisioning is centrally administered).

GOV-1 — feature-flag foundation: src/governance/flags.py resolves ENV >
  app_settings(DB) > default-ON; GET /config/features + useFeatureFlags()
  (token-guarded singleton, default-enabled while loading; refetch on login,
  reset on logout). Flag rows seeded in DEFAULT_SETTINGS.
GOV-2 — lock package management: require_package_op() on install/uninstall/
  upgrade/retry/docker-build/rfbrowser-init AND setup-default; 403 even for
  ADMIN when off (read endpoints stay 200). Environments UI hides mutating
  controls + shows a localized read-only notice.
GOV-3 — read-only environments = the locked-state UX.
GOV-4 — configurable per-op role floor (features.packageManagement.role.*,
  default editor); Settings disables ENV-locked toggles with a hint.

Enforcement is server-side authoritative (UI hiding is cosmetic). Blocked
attempts are audit-logged in the dependency (the audit middleware skips >=400),
detail feature_disabled:* / insufficient_role:*.

Docs: CLAUDE.md gotcha (precedence + audit-middleware-skips-403 trap), in-app
Feature Governance section (EN/DE/FR/ES), managedByAdmin + lockedByEnv i18n in
all 5 locales (incl. ZH). Also folds in the German Language-Support docs
subsection (parity follow-up).

Tests: backend tests/governance/ (28 — precedence/parse edges, lockdown incl.
setup-default, DB-toggle path, role-floor boundaries, audit-on-block),
frontend useFeatureFlags.spec.ts, e2e gov-feature-lockdown.spec.ts (real UI:
locked hides controls + notice + API 403). BMAD artifacts: gov-prd.md,
gov-architecture.md, presentation-feedback-epics.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…-import)

Two-part fix so keywords from repo .resource files are usable, not just listed:

RES-1 (root cause) — GET /explorer/{id}/keywords was 500ing on a NameError
  (`_get_repo` undefined); the frontend swallowed it (.catch(()=>[])), so
  project/resource keywords never loaded into the palette at all. Fixed to
  get_repository(...) + 404 guard (matches sibling endpoints). Pinned by
  tests/explorer/test_router.py::TestProjectKeywords (endpoint was untested).

RES-2 — inserting a keyword sourced from a .resource (or other) file now
  auto-adds `Resource    <open-file-relative path>` to *** Settings *** (it
  previously added nothing, so the keyword failed at runtime). New
  resourcePath.ts::resourceImportPath threads the source path through the
  palette's importHintFor into FlowEditor.addLibrary (which already creates +
  dedupes Resource imports). Same-file / BuiltIn / Library inserts unchanged.

Tests: resourcePath.spec.ts (7 path cases), backend endpoint regression,
e2e resource-autoimport.spec.ts (real UI: insert a .resource keyword →
`Resource    ../resources/common.resource` in the generated .robot).
BMAD artifacts: res-prd.md, res-architecture.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
AIX-1 — LiteLLM gateway: add 'litellm' provider type (FE form option + freeform
  model + base-URL-required hint in EN/DE/FR/ES/ZH; AiProviderType union). It
  routes through the existing OpenAI-compatible client; llm_client now raises a
  clear error if a litellm provider has no Base URL (instead of falling back to
  api.openai.com).
AIX-2 — analysis verbosity: concise|standard|detailed selector on the analysis
  card (ReportDetail + RunDetail), threaded request→dispatch→prompt exactly like
  the language directive. verbosity_directive() tunes length; standard/None is a
  no-op (non-breaking). i18n in all 5 locales.

Tests: tests/ai/test_aix.py (verbosity directive + LiteLLM base-URL guard);
backend AI suite green (41); frontend type-check/build/827 unit green.
BMAD artifact: aix-prd.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
… dialog

The runner already turns a run's tags_include/tags_exclude into
`robot --include/--exclude`, but the New Run dialog never exposed them — so the
capability was unreachable. Add Include/Exclude tag inputs to the dialog,
threaded through runForm → RunCreateRequest (already typed) → the existing
backend. i18n EN/DE/FR/ES/ZH. Real-UI E2E (run-tags.spec.ts) asserts the
create-run request carries tags_include.

Deferred to backlog (see exec-prd.md): free-form robot args + variables UI
(needs a migration), PreRunModifiers (EXEC-2), Long Name/Jira (EXEC-4),
__init__.robot (EXEC-5), DataDriver (EXEC-6), RF best-practices spike (EXEC-7).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Close the parked doc-parity gap:
- Add an "API Access" subsection to EN/FR/ES (advanced) — DE already had it.
- Add "Branch Switching & Auto-Sync" to EN (repositories) — FR/ES already had
  it; DE already covers the topic under its combined sync section (left as-is).
- EN/FR/ES are now subsection-identical. Gate 8 (language-and-docs-consistency)
  now asserts EN/FR/ES share identical per-section subsection ids; DE stays
  top-level-only (its docs use an independent structure + id scheme, so
  subsection parity would force artificial content changes).

type-check + prod build green; gate spec green (4 tests).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Make using your own repository keywords in the Flow Editor direct,
legible, and trustworthy (ux-flow-editor-resources.md):

- D1 — pinned "Your resources" palette section (file glyph + relative
  path subtitle, no SHOUTY); imports panel split into labelled
  Resources / Libraries lists so a .resource never sits under Libraries.
- D2 — import-confirmation toast on auto-import (addLibrary now reports
  the kind it added); fires only when an import was actually added.
- D3 — inserting a keyword pre-seeds one slot per required positional
  argument from its signature (fixes the empty "+ add argument").
- D4 — every palette item carries a title tooltip; name flexes, badges
  stay pinned right.
- D5 — header sort control (Most used / A–Z / Imported first), persisted.
- D6 — "what's shown" filter with an adaptive default (env + a
  sophisticated-file heuristic) + persisted manual override + hidden hint.

Filter/sort/heuristic logic extracted to a pure, unit-tested module
(paletteView.ts). i18n EN/DE/FR/ES (ZH falls back to EN).

Tests: PaletteView.spec.ts, FlowEditorPrefillArgs.spec.ts,
e2e/flow-editor-resource-ux.spec.ts. Full vitest suite green; prod build
clean; adjacent flow-editor E2E + RES autoimport green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

@raffelino raffelino left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm

@raffelino raffelino merged commit 8aaf9f5 into main Jun 18, 2026
9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant