@lumenflow/cli 5.3.2 → 5.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/README.md +20 -18
  2. package/dist/agent-session.js +21 -0
  3. package/dist/agent-session.js.map +1 -1
  4. package/dist/commands/integrate.js +25 -1
  5. package/dist/commands/integrate.js.map +1 -1
  6. package/dist/gate-defaults.js +154 -9
  7. package/dist/gate-defaults.js.map +1 -1
  8. package/dist/gate-registry.js.map +1 -1
  9. package/dist/gates-runners.js +358 -0
  10. package/dist/gates-runners.js.map +1 -1
  11. package/dist/gates.js +347 -3
  12. package/dist/gates.js.map +1 -1
  13. package/dist/hooks/enforcement-generator.js +14 -8
  14. package/dist/hooks/enforcement-generator.js.map +1 -1
  15. package/dist/hooks/enforcement-sync.js +2 -1
  16. package/dist/hooks/enforcement-sync.js.map +1 -1
  17. package/dist/hooks/generators/index.js +1 -0
  18. package/dist/hooks/generators/index.js.map +1 -1
  19. package/dist/hooks/generators/signal-received.js +4 -0
  20. package/dist/hooks/generators/signal-received.js.map +1 -0
  21. package/dist/mem-converged.js +101 -0
  22. package/dist/mem-converged.js.map +1 -0
  23. package/dist/mem-inbox.js +85 -22
  24. package/dist/mem-inbox.js.map +1 -1
  25. package/dist/mem-roster.js +11 -1
  26. package/dist/mem-roster.js.map +1 -1
  27. package/dist/mem-signal.js +162 -16
  28. package/dist/mem-signal.js.map +1 -1
  29. package/dist/mem-watch.js +207 -0
  30. package/dist/mem-watch.js.map +1 -0
  31. package/dist/metrics-cli.js +19 -2
  32. package/dist/metrics-cli.js.map +1 -1
  33. package/dist/metrics-snapshot.js +25 -2
  34. package/dist/metrics-snapshot.js.map +1 -1
  35. package/dist/public-manifest.js +14 -0
  36. package/dist/public-manifest.js.map +1 -1
  37. package/dist/session-cross-link.js +14 -2
  38. package/dist/session-cross-link.js.map +1 -1
  39. package/dist/sidecar-manager.js +25 -0
  40. package/dist/sidecar-manager.js.map +1 -1
  41. package/dist/signal-hook.js +351 -0
  42. package/dist/signal-hook.js.map +1 -0
  43. package/dist/wu-done-gates.js +112 -3
  44. package/dist/wu-done-gates.js.map +1 -1
  45. package/dist/wu-done.js +30 -6
  46. package/dist/wu-done.js.map +1 -1
  47. package/dist/wu-prep.js +185 -2
  48. package/dist/wu-prep.js.map +1 -1
  49. package/dist/wu-spawn-prompt-builders.js.map +1 -1
  50. package/dist/wu-spawn-strategy-resolver.js +46 -4
  51. package/dist/wu-spawn-strategy-resolver.js.map +1 -1
  52. package/package.json +13 -11
  53. package/packs/agent-runtime/auto-session-integration.ts +14 -0
  54. package/packs/agent-runtime/package.json +1 -1
  55. package/packs/agent-runtime/session-schema.ts +44 -0
  56. package/packs/sidekick/package.json +1 -1
  57. package/packs/software-delivery/manifest.ts +3 -0
  58. package/packs/software-delivery/manifest.yaml +7 -0
  59. package/packs/software-delivery/package.json +1 -1
  60. package/packs/software-delivery/src/constants/wu-cli-constants.ts +12 -0
  61. package/packs/software-delivery/tool-impl/memory-tools.ts +56 -1
  62. package/packs/software-delivery/tool-impl/runtime-cli-adapter.ts +1 -0
  63. package/templates/core/AGENTS.md.template +98 -8
  64. package/templates/core/LUMENFLOW.md.template +197 -19
  65. package/templates/core/ai/onboarding/agent-invocation-guide.md.template +0 -5
  66. package/templates/core/ai/onboarding/agent-safety-card.md.template +63 -1
  67. package/templates/core/ai/onboarding/initiative-orchestration.md.template +4 -0
  68. package/templates/core/ai/onboarding/release-process.md.template +7 -7
  69. package/templates/core/ai/onboarding/vendor-support.md.template +74 -10
  70. package/templates/vendors/claude/.claude/skills/frontend-design/SKILL.md.template +1 -1
  71. package/templates/vendors/claude/.claude/skills/wu-lifecycle/SKILL.md.template +28 -0
@@ -205,7 +205,7 @@ intentionally exempt and the workspace policy does not already exclude it.
205
205
  ## Core Principles
206
206
 
207
207
  1. **Design-First** (feature/refactor WUs): Load the `design-first` skill before implementation. Question requirements, delete unnecessary, simplify before optimizing. Invocation varies by vendor — see [Skills & Agents](#skills--agents) below.
208
- 2. **Fit-For-Surface Verification**: Choose the least brittle verification that gives strong confidence. Prefer TDD for runtime logic when repository policy requires it; prefer behavior-focused integration, smoke, visual, or manual verification for UI, content, and presentation work. Never assert inline styles, CSS values, exact copy, or DOM shape in E2E/integration tests.
208
+ 2. **Fit-For-Surface Verification**: Choose the least brittle verification that gives strong confidence. Prefer TDD for runtime logic when repository policy requires it; prefer behavior-focused integration, smoke, visual, or manual verification for UI, content, and presentation work. Never assert inline styles, CSS values, exact copy, or DOM shape in E2E/integration tests. For the boundary between framework-owned gates, generated brief content, and consumer-authored local guidance, see [ADR-017](docs/09-architecture-decisions/ADR-017-lumenflow-configurability-principle.md).
209
209
  3. **Library-First**: Search existing libraries before custom code
210
210
  4. **DRY/SOLID/KISS/YAGNI**: No magic numbers, no hardcoded strings
211
211
  5. **Worktree Discipline**: After `wu:claim`, work ONLY in the worktree
@@ -252,17 +252,59 @@ pnpm mem:inbox # coordination signals (defaults to unread)
252
252
  The memory layer also supports live-session addressing for active agents:
253
253
 
254
254
  ```bash
255
- pnpm mem:roster # list active session_id/display_name/role rows
256
- pnpm mem:signal 'please review' --wu WU-XXXX --to Planck
257
- pnpm mem:inbox --for Planck # targeted + broadcast signals for that session
255
+ pnpm mem:roster # list active session_id/display_name/agent_identity/role rows
256
+ pnpm mem:signal 'please review' --wu WU-XXXX --to Planck,codex:implementer:host42 --intent PROPOSE --requires-ack
257
+ pnpm mem:inbox --for Planck --thread thread-1234 # directed + broadcast signals for that identity
258
+ pnpm mem:converged --thread thread-1234 # exit 0 when every root recipient replied AGREE
258
259
  pnpm mem:context --wu WU-XXXX --no-roster # opt out when a test needs stable output
259
260
  ```
260
261
 
262
+ The wire contract for agent-to-agent coordination is `A2A.V1`, exported from
263
+ `@lumenflow/control-plane-sdk/a2a`. Local files under `.lumenflow/memory/`, the
264
+ Claude `PostToolUse` hook, and `mem:watch` are adapters over that contract, not
265
+ separate schemas. `workspace_id` is optional for local worktrees and required
266
+ for hosted transports such as lumenflow.cloud, where it is the tenant/workspace
267
+ routing key.
268
+
261
269
  `display_name` is an ephemeral live-session handle, not a stable role alias. It
262
270
  is assigned from `.lumenflow/agents/display-name-pool.yaml` when a session
263
271
  starts and released when the session ends. `mem:signal --to` / `mem:inbox --for`
264
- resolve either a `session_id` or a current `display_name` against the live
265
- roster before reading or writing `target_agent`.
272
+ accept a `session_id`, current `display_name`, or explicit `agent_identity`.
273
+ `mem:signal --to` also accepts comma-separated recipients. Directed signals are
274
+ persisted as canonical A2A `recipients[]`; `target_agent` remains only as the
275
+ single-recipient legacy alias.
276
+
277
+ `agent_identity` is an explicit stable reader identity for A2A receipt
278
+ coalescing across restarts or concurrent sessions. Set it with
279
+ `pnpm agent:session --agent-identity <owner>:<role>:<purpose>` or
280
+ `LUMENFLOW_AGENT_IDENTITY`; LumenFlow never derives it from PID, hostname, or
281
+ runtime metadata. When it is absent, receipt state falls back to the ephemeral
282
+ `session_id`.
283
+
284
+ A2A signal semantics are structured, not prose-only. `mem:signal` supports
285
+ `--thread`, `--reply-to`, `--intent INFO|PROPOSE|COUNTER|AGREE|REJECT`,
286
+ `--interrupt advisory|priority|urgent|soon|immediate`, and `--requires-ack`.
287
+ Directed root signals default to `interrupt_class: priority` and get a generated
288
+ `thread_id`; broadcasts default to `interrupt_class: advisory`. Replies inherit
289
+ the parent thread unless `--thread` is explicit. When a recipient posts
290
+ `--intent AGREE` or `--intent REJECT` on that thread, the root signal receipt is
291
+ promoted to `acked` or `rejected`, and `mem:converged --thread <id>` reports
292
+ whether every root recipient has agreed. Local JSONL remains only the dev
293
+ adapter over `A2ASignalV1` / `A2AReceiptV1`; lumenflow.cloud should use the same
294
+ contract over its hosted transport.
295
+
296
+ Claude Code projects with generated LumenFlow hooks receive addressed
297
+ `signal:received` events at the next `PostToolUse` boundary. The hook surfaces
298
+ `intent`, `interrupt_class`, `requires_ack`, and same-thread ACK/REJECT commands
299
+ without replacing the `wu:prep` unread-directed-signal gate. Other local clients
300
+ can run `pnpm mem:watch --session <session_id|display_name|agent_identity>` in
301
+ a side terminal for foreground `signal:received` delivery through the same event
302
+ queue and receipt model.
303
+
304
+ Before `wu:prep`, any unread directed signal addressed to the current reader on
305
+ the WU or its initiative is a decision point. Read, ACK, or dismiss it before
306
+ continuing. `pnpm wu:prep --allow-unread-signals --reason '<audit reason>'`
307
+ exists for explicit audited overrides only.
266
308
 
267
309
  ### During the WU (capture, don't hoard)
268
310
 
@@ -552,6 +594,126 @@ For the full worktree lifecycle (parallel execution, bootstrap, isolation guaran
552
594
  | `pnpm typecheck` | Run TypeScript type checking |
553
595
  | `pnpm test` | Run all tests (Vitest) |
554
596
 
597
+ #### Per-gate skip (WU-2925)
598
+
599
+ `pnpm wu:prep` and `pnpm wu:done` accept `--skip-gate <name>` (repeatable) to
600
+ suppress a single named gate. The legacy `--skip-gates` (binary) is deprecated
601
+ for one minor cycle and emits a deprecation warning pointing to the public
602
+ [Gates Reference](https://lumenflow.dev/reference/gates#per-gate-skip); use
603
+ `--skip-gate` per gate.
604
+
605
+ ```bash
606
+ # Skip a single environmental gate (allow-list)
607
+ pnpm wu:done --id WU-XXX --skip-gate lane-health \
608
+ --reason "pre-existing 50-file coverage gap" --fix-wu WU-YYY
609
+
610
+ # Repeat the flag to skip multiple gates
611
+ pnpm wu:prep --id WU-XXX \
612
+ --skip-gate lane-health --skip-gate migration-verify \
613
+ --reason "no DB infra in agent worktree" --fix-wu WU-YYY
614
+ ```
615
+
616
+ **Allow-list (skippable: true by default):** `migration-verify`,
617
+ `lane-health`, `tdd-diff-evidence`, plus the WU-2927 opt-in local-prep gates
618
+ `build`, `integration-test`, `e2e-smoke`. All other framework gates default to
619
+ `skippable: false` and require a per-repo override at
620
+ `software_delivery.gates.overrides.<gate_id>.skippable=true` to be skipped:
621
+
622
+ ```bash
623
+ pnpm config:set software_delivery.gates.overrides.db-dod-gate.skippable=true
624
+ ```
625
+
626
+ Audit format gains a discriminated `source` field
627
+ (`agent` | `auto-skip-not-applicable` | `auto-skip-missing-prereq` | `blocked`)
628
+ and a `lifecycle` field (`prep` | `done`) so the trail spans both lifecycle
629
+ commands. Legacy entries without `source` are read as `agent` for DORA/CFR
630
+ back-compat. CFR (Change Failure Rate) only counts `source: 'agent'` rows;
631
+ auto-skips and blocks are excluded.
632
+
633
+ MCP exposes both `skip_gate` (array, preferred) and `skip_gates` (boolean,
634
+ deprecated) for one minor cycle, symmetric with the CLI.
635
+
636
+ #### Discriminated GateResult states (WU-2926)
637
+
638
+ Each gate run produces one of six `GateResult` discriminated states. Stable
639
+ glyphs/labels (also surfaced verbatim in the public
640
+ [Gates Reference](https://lumenflow.dev/reference/gates#discriminated-gateresult-states)):
641
+
642
+ | State | Glyph | Meaning |
643
+ | ----------------------------- | ------------------- | ----------------------------------------------------------------------------------------------------- |
644
+ | `passed` | ✅ PASSED | Gate ran successfully. |
645
+ | `failed` | ❌ FAILED | Gate ran and failed (or `applicable + missing + skippable + 'fail'`). |
646
+ | `skipped-by-agent` | ⏭ SKIPPED-BY-AGENT | Explicit `--skip-gate <name>` (audit `source: 'agent'`). |
647
+ | `skipped-auto-not-applicable` | ⊘ AUTO-SKIPPED | `checkApplicability` returned not-applicable (audit `source: 'auto-skip-not-applicable'`). |
648
+ | `skipped-auto-missing-prereq` | ⊘ AUTO-SKIPPED | Applicable + missing prereq + skippable + `'auto-skip'` (audit `source: 'auto-skip-missing-prereq'`). |
649
+ | `blocked-missing-prereq` | 🚫 BLOCKED | Applicable + missing prereq + `skippable: false` (audit `source: 'blocked'`, exits non-zero). |
650
+
651
+ Decision matrix:
652
+
653
+ | Applicability | Preconditions | Skippable | `prereq_strategy` | Result |
654
+ | -------------- | ------------- | --------- | ----------------- | -------------------------------- |
655
+ | not-applicable | — | — | — | `skipped-auto-not-applicable` |
656
+ | applicable | satisfied | — | — | run → `passed` or `failed` |
657
+ | applicable | missing | false | — | `blocked-missing-prereq` (BLOCK) |
658
+ | applicable | missing | true | `'auto-skip'` | `skipped-auto-missing-prereq` |
659
+ | applicable | missing | true | `'fail'` | `failed` |
660
+
661
+ Each `GateDefinition` may implement `checkApplicability` and
662
+ `checkPreconditions`. Defaults return `'applicable'` and `'satisfied'` so
663
+ existing simple gates inherit always-runs semantics with no per-gate code
664
+ change. `safety-critical-test` ships with `skippable_default: false` and a
665
+ default applicability of `'applicable'` for every change set — preserving
666
+ today's runs-on-every-WU behaviour. Per-repo override:
667
+
668
+ ```bash
669
+ # Narrow safety-critical-test applicability without flipping the default
670
+ pnpm config:set software_delivery.gates.overrides.safety-critical-test.applicability_paths \
671
+ --json-value '["app/security/**","lib/auth/**"]'
672
+ ```
673
+
674
+ Auto-skip + blocked states write audit NDJSON with the discriminated `source`
675
+ field; CFR only counts `source: 'agent'` rows so auto-skips and blocks never
676
+ inflate change-failure-rate.
677
+
678
+ #### Extended local-prep profile (WU-2927)
679
+
680
+ `software_delivery.gates.local_prep` is an opt-in profile that extends
681
+ `wu:prep` with the build / integration-test / e2e-smoke gates that previously
682
+ only ran in CI. Driven by lumenflow.cloud's three P0 hotfixes in 24h
683
+ (WU-1497..WU-1499) — each slipped past local gates because `wu:prep` did not
684
+ run `pnpm build`, `pnpm test:integration`, or `pnpm test:e2e --smoke`.
685
+
686
+ ```yaml
687
+ software_delivery:
688
+ gates:
689
+ local_prep:
690
+ build:
691
+ enabled: false # opt-in: pnpm build on every wu:prep
692
+ integration_test:
693
+ enabled: false # opt-in: pnpm test:integration on every wu:prep
694
+ e2e_smoke:
695
+ enabled: false # opt-in: pnpm test:e2e --tag <tag>
696
+ tag: smoke
697
+ latency_budget_warn_ms: 180000 # 3 min soft warn, never blocks
698
+ ```
699
+
700
+ | Field | Default | Effect |
701
+ | --------------------------- | ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
702
+ | `build.enabled` | `false` | When `true`, registers a build gate that runs `pnpm build`. `prereq_strategy: 'fail'` — missing `build` script in `package.json` is a misconfig (`failed`), not an environmental gap. |
703
+ | `integration_test.enabled` | `false` | When `true`, makes the (now unconditionally registered) `integration-test` gate applicable. Runs `RUN_INTEGRATION_TESTS=1 pnpm vitest run '**/*.integration.*' '**/golden-*.test.*'`. Missing script → `failed`. |
704
+ | `e2e_smoke.enabled` + `tag` | `false` / `smoke` | When `true` AND `playwright.config.{ts,js,mjs}` exists at repo root, registers an `e2e-smoke` gate that runs `pnpm test:e2e --tag <tag>`. Repos without Playwright are auto `not-applicable` (clean opt-out — no explicit disable required). |
705
+ | `latency_budget_warn_ms` | `180000` | `wu:prep` prints total elapsed seconds; if it exceeds the budget, emits a non-failing warning. Soft signal only. |
706
+
707
+ All three gates are added to the `--skip-gate` allow-list (`skippable: true`),
708
+ extending WU-2925's initial `{migration-verify, lane-health, tdd-diff-evidence}`
709
+ set. Rationale: local-prep gates are opt-in environmental gates; agents need
710
+ `--skip-gate <name>` for legitimate hotfix scenarios where the gate is broken
711
+ or irrelevant for that WU. Skips are captured in audit per WU-2925 semantics
712
+ with `source: 'agent'`.
713
+
714
+ Backward-compat: omitting `local_prep` (the default) preserves today's
715
+ behaviour — none of the new gates is applicable, no new commands run.
716
+
555
717
  ### Lane Management
556
718
 
557
719
  | Command | Description |
@@ -578,7 +740,9 @@ For the full worktree lifecycle (parallel execution, bootstrap, isolation guaran
578
740
  | `pnpm mem:cleanup` | Clean up stale memory data |
579
741
  | `pnpm mem:context` | Get context for current lane/WU |
580
742
  | `pnpm mem:create` | Create memory node (bug discovery) |
743
+ | `pnpm mem:converged` | Check A2A thread agreement |
581
744
  | `pnpm mem:inbox` | Check coordination signals |
745
+ | `pnpm mem:watch` | Deliver A2A signal events without hooks |
582
746
  | `pnpm mem:roster` | List active sessions and display names |
583
747
  | `pnpm mem:summarize` | Summarize memory context |
584
748
  | `pnpm mem:triage` | Triage discovered bugs |
@@ -635,6 +799,7 @@ For the full worktree lifecycle (parallel execution, bootstrap, isolation guaran
635
799
  | `pnpm lumenflow:doctor` | Diagnose LumenFlow configuration |
636
800
  | `pnpm lumenflow:commands` | List all available CLI commands |
637
801
  | `pnpm lumenflow:release` | Run release workflow |
802
+ | `pnpm distribution:preflight` | Audit consumer repos for npm-access flip readiness |
638
803
  | `pnpm lumenflow:docs-sync` | Refresh core docs, onboarding docs, and vendor assets |
639
804
  | `pnpm lumenflow:sync-templates` | Sync templates to project |
640
805
  | `pnpm lumenflow:upgrade` | Upgrade LumenFlow packages |
@@ -678,19 +843,6 @@ For the full worktree lifecycle (parallel execution, bootstrap, isolation guaran
678
843
  | `pnpm pack:install` | Install a domain pack into workspace |
679
844
  | `pnpm pack:search` | Search for domain packs in a registry |
680
845
 
681
- ### Audited Wrappers
682
-
683
- | Command | Description |
684
- | ------------------ | -------------------------------- |
685
- | `pnpm file:read` | Read file with audit trail |
686
- | `pnpm file:write` | Write file with audit trail |
687
- | `pnpm file:edit` | Edit file with audit trail |
688
- | `pnpm file:delete` | Delete file with audit trail |
689
- | `pnpm git:status` | Show git status with audit trail |
690
- | `pnpm git:diff` | Show git diff with audit trail |
691
- | `pnpm git:log` | Show git log with audit trail |
692
- | `pnpm git:branch` | Show git branch with audit trail |
693
-
694
846
  Commands include **context-aware validation** that checks location, WU status, and git state. When validation fails, commands provide copy-paste ready fix commands.
695
847
 
696
848
  ---
@@ -727,6 +879,16 @@ If you're an AI agent, read the onboarding docs:
727
879
 
728
880
  Skills are reusable workflow/knowledge bundles that agents load on demand. The `SKILL.md` format pioneered by Claude Code has converged into a de-facto standard adopted by OpenAI Codex (Dec 2025), Cursor (v2.4), and Windsurf Cascade (Jan 2026). LumenFlow stores vendor-neutral skill sources in `.lumenflow/skills/` and projects them to each vendor surface via `pnpm lumenflow:integrate --client <x>`.
729
881
 
882
+ Agent plugins are a distribution on-ramp, not a replacement for these repo-level
883
+ projections or for the Software Delivery Pack runtime. Per
884
+ [ADR-018](docs/09-architecture-decisions/ADR-018-agent-plugin-distribution-boundary.md),
885
+ standalone projected skills keep local names such as `design-first`, while
886
+ plugin-installed Claude skills use plugin-qualified names such as
887
+ `/lumenflow:design-first`. If both surfaces exist, prompts and handoff text must
888
+ say which one they mean. Installing a plugin gives the agent methodology and
889
+ entrypoint guidance; repo-level enforcement still requires `npx lumenflow init`,
890
+ `pnpm lumenflow:integrate`, or `pnpm lumenflow:integrate --sync`.
891
+
730
892
  ### Core skills (vendor-neutral)
731
893
 
732
894
  | Skill | Load before... |
@@ -752,6 +914,15 @@ A skill name written in prose does nothing — it must be **loaded** through the
752
914
  | Aider | `CONVENTIONS.md` | `/read CONVENTIONS.md` or `aider --read CONVENTIONS.md` |
753
915
  | Cline | `.clinerules` | Auto-loaded |
754
916
 
917
+ For plugin-distributed skills, prefer the vendor's plugin-qualified invocation
918
+ surface instead of rewriting all canonical skill names. Claude Code plugin
919
+ skills are namespaced as `/lumenflow:<skill>`. Codex plugin use should name the
920
+ installed `lumenflow` plugin or one of its bundled skills through Codex's `@`
921
+ plugin selection surface. **Plugin packaging is scoped under INIT-065 and not
922
+ yet shipped as of 5.4.0** — these invocations apply once the packaging WUs land.
923
+ Standalone projections remain valid until a future explicit cleanup command such
924
+ as `--plugin-only` exists and is run intentionally.
925
+
755
926
  For vendor-specific setup details and per-vendor quirks, see:
756
927
 
757
928
  - Claude Code: [.claude/CLAUDE.md](.claude/CLAUDE.md)
@@ -794,6 +965,12 @@ Durable artifacts carry `requested_role` (from the orchestrator) and `actual_rol
794
965
 
795
966
  ---
796
967
 
968
+ ## Remote / MCP Dispatch
969
+
970
+ LumenFlow ships `pnpm file:*` and `pnpm git:*` CLIs (`file:read`, `file:write`, `file:edit`, `file:delete`, `git:status`, `git:diff`, `git:log`, `git:branch`). These commands exist for non-native-tool agents (MCP remote dispatch, server-side sandbox). Local agents with native Read/Edit/Write should use those directly — they're faster and already audited via the client transcript. The wrappers are not part of the canonical local-development CLI surface.
971
+
972
+ ---
973
+
797
974
  ## References
798
975
 
799
976
  - [LumenFlow Agent Capsule]({{DOCS_OPERATIONS_PATH}}/_frameworks/lumenflow/lumenflow-agent-capsule.md) -- Full framework reference (lifecycle, lanes, gates, DoD)
@@ -802,5 +979,6 @@ Durable artifacts carry `requested_role` (from the orchestrator) and `actual_rol
802
979
  - [.lumenflow/constraints.md](.lumenflow/constraints.md) -- Non-negotiable rules and forbidden commands
803
980
  - [WU Sizing Guide]({{DOCS_OPERATIONS_PATH}}/_frameworks/lumenflow/wu-sizing-guide.md) -- Scoping work without needless fragmentation
804
981
  - [ADR-014: Typed Agent-Role Contract](docs/09-architecture-decisions/ADR-014-typed-agent-role-contract.md) — Canonical orchestration role vocabulary
982
+ - [ADR-017: LumenFlow Configurability Principle](docs/09-architecture-decisions/ADR-017-lumenflow-configurability-principle.md) — Defaults are allowed; framework prescription must be configurable or consumer-authored
805
983
  - [Skills Index](.lumenflow/skills/INDEX.md)
806
984
  - [Agents README](.claude/agents/README.md)
@@ -146,10 +146,6 @@ These surfaces already assemble the objective, scope, code paths, tests, recover
146
146
  constraints block, and evidence metadata. Do not prepend or append a second wrapper block around
147
147
  them.
148
148
 
149
- The role aliases referenced by these handoffs are vendor-neutral framework names (`general-purpose`,
150
- `lumenflow-pm`, `initiative-architect`, and so on). Client-specific overlays may implement those
151
- aliases differently, but the orchestration brief should keep the shared alias vocabulary intact.
152
-
153
149
  If you are building a fully custom or experimental prompt outside those canonical surfaces, use
154
150
  this structure:
155
151
 
@@ -218,7 +214,6 @@ Before spawning:
218
214
 
219
215
  - Confirm WU status and lane availability
220
216
  - Ensure worktree exists (or claim first)
221
- - Use the shared framework alias vocabulary in the brief, not vendor-specific display names
222
217
  - Provide explicit code_paths and tests
223
218
  - Require `mem:checkpoint` at 50+ tool calls
224
219
  - Require `mem:signal` for milestones
@@ -98,7 +98,69 @@ not guess-and-retry.
98
98
  1. Read the error message
99
99
  2. Fix the underlying issue
100
100
  3. Re-run gates
101
- 4. Never use `--skip-gates` for new failures
101
+ 4. Never use `--skip-gate` (or legacy `--skip-gates`) for new failures
102
+ 5. WU-2925: prefer `--skip-gate <name>` (repeatable, per-gate) over
103
+ `--skip-gates` (legacy binary, deprecated for one minor cycle). Only gates
104
+ marked `skippable: true` (allow-list: `migration-verify`, `lane-health`,
105
+ `tdd-diff-evidence`, plus the WU-2927 opt-in local-prep gates `build`,
106
+ `integration-test`, `e2e-smoke`) or overridden per-repo at
107
+ `software_delivery.gates.overrides.<gate_id>.skippable=true` may be skipped.
108
+ Both flags require `--reason` and `--fix-wu`.
109
+
110
+ ### Skip-vs-Block decision matrix (WU-2926)
111
+
112
+ The runtime distinguishes six discriminated `GateResult` states with stable
113
+ glyphs. The decision matrix encodes when a gate runs, auto-skips, or BLOCKS:
114
+
115
+ | Applicability | Preconditions | Skippable | `prereq_strategy` | Result | Glyph |
116
+ | -------------- | ------------- | --------- | ----------------- | -------------------------------- | ----- |
117
+ | not-applicable | — | — | — | `skipped-auto-not-applicable` | ⊘ |
118
+ | applicable | satisfied | — | — | run → `passed` or `failed` | ✅/❌ |
119
+ | applicable | missing | false | — | `blocked-missing-prereq` (BLOCK) | 🚫 |
120
+ | applicable | missing | true | `'auto-skip'` | `skipped-auto-missing-prereq` | ⊘ |
121
+ | applicable | missing | true | `'fail'` | `failed` | ❌ |
122
+
123
+ Key invariant: `applicable + missing + skippable=false` ALWAYS blocks. This is
124
+ the silent-bypass guard. `--skip-gate <name>` cannot bypass it. The only
125
+ escape hatch is a deliberate per-repo override at
126
+ `software_delivery.gates.overrides.<gate_id>.skippable=true`, used only when
127
+ the missing prerequisite is genuinely environmental (not a missing
128
+ implementation).
129
+
130
+ Audit NDJSON `source` field discriminates all four non-running outcomes:
131
+ `agent` | `auto-skip-not-applicable` | `auto-skip-missing-prereq` | `blocked`.
132
+ CFR/DORA only counts `source: 'agent'` so auto-skips and blocks never inflate
133
+ change-failure-rate.
134
+
135
+ ### Override syntax (copy-pasteable, WU-2925/2926)
136
+
137
+ ```bash
138
+ # Per-gate skip at wu:prep or wu:done (--skip-gate is repeatable)
139
+ pnpm wu:prep --id WU-XXX --skip-gate lane-health \
140
+ --reason "no DB infra in agent worktree" --fix-wu WU-YYY
141
+
142
+ # Make a non-allow-listed gate skippable per repo
143
+ pnpm config:set software_delivery.gates.overrides.<gate_id>.skippable=true
144
+
145
+ # Narrow a safety-critical gate's reach via applicability_paths
146
+ # (preferred over flipping skippable for safety-critical gates)
147
+ pnpm config:set software_delivery.gates.overrides.safety-critical-test.applicability_paths \
148
+ --json-value '["app/security/**","lib/auth/**"]'
149
+ ```
150
+
151
+ ### Latency-budget guidance (`local_prep` profile, WU-2927)
152
+
153
+ The opt-in `software_delivery.gates.local_prep` profile extends `wu:prep` with
154
+ `build`, `integration-test`, and `e2e-smoke` gates. All three are
155
+ `skippable: true` and accept `--skip-gate <name>`. Latency budget defaults:
156
+
157
+ - **`latency_budget_warn_ms: 180000`** (3 min): default soft warn, never blocks.
158
+ - **60–90s**: tight, suits greenfield repos; expect false-positive warnings as
159
+ suites grow.
160
+ - **5–10 min**: loose, suits monorepos with full Playwright; consider
161
+ `--skip-gate e2e-smoke` per-WU for cosmetic-only changes.
162
+
163
+ Public reference: <https://lumenflow.dev/reference/gates#local_prep-profile-550>.
102
164
 
103
165
  ---
104
166
 
@@ -87,6 +87,10 @@ pnpm wu:brief --id WU-100 --client claude-code
87
87
  pnpm wu:delegate --id WU-100 --parent-wu WU-050 --client claude-code
88
88
  ```
89
89
 
90
+ When the work is initiative decomposition or execution design rather than direct implementation, the
91
+ default framework role to brief or delegate is `initiative-architect`. That role now replaces the
92
+ retired docs-planning vocabulary in the default agent roster.
93
+
90
94
  **Use `wu:delegate` (not `wu:brief`) when:**
91
95
 
92
96
  - You are the orchestrator agent managing the initiative
@@ -39,14 +39,14 @@ pnpm release --release-version 1.3.0 --skip-publish
39
39
 
40
40
  ### Options
41
41
 
42
- | Flag | Description |
43
- | --------------------------- | --------------------------------------- |
44
- | `--release-version <X.Y.Z>` | **Required.** Semver version to release |
45
- | `--dry-run` | Preview changes without making them |
42
+ | Flag | Description |
43
+ | --------------------------- | -------------------------------------------- |
44
+ | `--release-version <X.Y.Z>` | **Required.** Semver version to release |
45
+ | `--dry-run` | Preview changes without making them |
46
46
  | `--skip-publish` | Skip npm publish only; validation still runs |
47
- | `--skip-build` | Skip build step (use existing dist) |
48
- | `--version`, `-V` | Show CLI version |
49
- | `--help`, `-h` | Show help |
47
+ | `--skip-build` | Skip build step (use existing dist) |
48
+ | `--version`, `-V` | Show CLI version |
49
+ | `--help`, `-h` | Show help |
50
50
 
51
51
  ### Examples
52
52
 
@@ -31,15 +31,73 @@ lumenflow init
31
31
 
32
32
  For popular AI coding assistants, LumenFlow provides **optional enhanced integrations** with deeper features like auto-detection, skills, and vendor-specific configurations.
33
33
 
34
- | Assistant | Config File | Auto-detected | Enhanced Features |
35
- | ----------- | ------------------------------ | ------------- | ------------------------------- |
36
- | Claude Code | `CLAUDE.md`, `.claude/` | Yes | Skills, agents, hooks, settings |
37
- | Cursor | `.cursor/rules/lumenflow.md` | Yes | Rules integration |
38
- | Windsurf | `.windsurf/rules/lumenflow.md` | Yes | Rules integration |
39
- | Cline | `.clinerules` | No | Rules file |
40
- | Codex | `AGENTS.md` (native) | No | Uses universal files directly |
41
- | Aider | `.aider.conf.yml` | No | Config file |
42
- | Antigravity | `AGENTS.md` (native) | Unknown | Research phase |
34
+ | Assistant | Config File | Auto-detected | Enhanced Features |
35
+ | ----------- | -------------------------------------------------- | ------------- | ---------------------------------------------------------------- |
36
+ | Claude Code | `CLAUDE.md`, `.claude/` | Yes | Skills, agents, hooks, settings, A2A `signal:received` delivery |
37
+ | Cursor | `AGENTS.md`, `.cursor/rules/` | Yes | Rules integration; foreground `mem:watch` A2A delivery |
38
+ | Windsurf | `AGENTS.md`, `.agents/skills/`, `.windsurf/rules/` | Yes | Rules integration plus shared skills; foreground `mem:watch` A2A |
39
+ | Cline | `.clinerules` | No | Rules file; foreground `mem:watch` or `mem:inbox` for A2A |
40
+ | Codex | `AGENTS.md`, `.agents/skills/`, `.codex/agents/` | No | Universal files plus overlays; foreground `mem:watch` A2A |
41
+ | Aider | `.aider.conf.yml` | No | Config file; foreground `mem:watch` or `mem:inbox` for A2A |
42
+ | Antigravity | `AGENTS.md` (native) | Unknown | Research phase |
43
+
44
+ ### Shared Cross-Vendor Surfaces
45
+
46
+ LumenFlow stays vendor-agnostic by anchoring on shared repo surfaces first, then layering
47
+ vendor-specific overlays where a client has extra capabilities.
48
+
49
+ - `AGENTS.md` is the shared instruction baseline. Codex reads it natively, Cursor and Windsurf
50
+ both support it as a repo instruction surface, and other vendors can usually consume it as plain
51
+ project guidance.
52
+ - `.agents/skills/` is the shared skills projection surface. Codex and Windsurf can both consume
53
+ it today, while Claude Code still uses its own `.claude/skills/` overlay.
54
+ - Vendor overlays stay additive: `.claude/agents/`, `.codex/agents/`, `.cursor/rules/`,
55
+ `.windsurf/rules/`, and similar files add client-specific behavior on top of the shared
56
+ instruction and skills layers.
57
+
58
+ ### Agent Plugin Distribution
59
+
60
+ ADR-018 adds plugin distribution as a discoverability on-ramp for Claude Code and Codex. It does
61
+ not replace the repo-level integration surfaces above and it does not replace the Software Delivery
62
+ Pack runtime.
63
+
64
+ **Current source identity:**
65
+
66
+ - Canonical bundle: `plugins/lumenflow/`
67
+ - Claude manifest: `plugins/lumenflow/.claude-plugin/plugin.json`
68
+ - Codex manifest: `plugins/lumenflow/.codex-plugin/plugin.json`
69
+ - Claude repo marketplace catalog: `.claude-plugin/marketplace.json`
70
+ - Codex repo marketplace catalog: `.agents/plugins/marketplace.json`
71
+
72
+ The `lumenflow-dev` repository is the first release train's marketplace source repository. Do not
73
+ create a separate `lumenflow-marketplace` repository unless ADR-018 is amended.
74
+
75
+ **Namespace and coexistence rules:**
76
+
77
+ - Canonical skill authoring remains `.lumenflow/skills/<name>/SKILL.md`.
78
+ - Standalone projections keep local names such as `design-first` and `tdd-workflow`.
79
+ - Claude plugin skills are plugin-qualified, for example `/lumenflow:design-first`.
80
+ - Codex plugin prompts should name the installed `lumenflow` plugin or bundled skill through
81
+ Codex's `@` plugin selection surface; do not invent a Codex slash namespace.
82
+ - Plugin installation must not delete `.claude/skills/`, `.agents/skills/`, or other standalone
83
+ projections. A future `--plugin-only` cleanup path must be explicit and dry-run-first.
84
+
85
+ **First-run handoff:**
86
+
87
+ The plugin can provide skills, hooks, MCP configuration, and first-run guidance. It cannot install
88
+ `.husky/`, GitHub Actions, WU state, conditional gates, co-change gates, or package aliases inside a
89
+ consumer repository. First-run plugin text must direct users to run `npx lumenflow init` for a new
90
+ repo or `pnpm lumenflow:integrate --sync` in an already initialized repo when they want governed
91
+ workflow state, enforcement, gates, and evidence.
92
+
93
+ **Marketplace preflight:**
94
+
95
+ - Anthropic official marketplace submission exists today, so a maintainer must confirm or reserve
96
+ the `lumenflow` plugin name through the Anthropic submission path before marketplace packaging
97
+ relies on `/lumenflow:*` names.
98
+ - Codex official self-serve publishing is documented as coming later. Until then, Codex readiness
99
+ targets repo/personal marketplace install with the `lumenflow` id and an official-directory
100
+ checklist that does not claim undocumented vendor gates.
43
101
 
44
102
  ---
45
103
 
@@ -70,6 +128,7 @@ Cursor is an AI-first code editor built on VS Code.
70
128
 
71
129
  **Config Files:**
72
130
 
131
+ - `AGENTS.md` - Shared repo instructions
73
132
  - `.cursor/rules/lumenflow.md` - LumenFlow rules
74
133
 
75
134
  **Auto-detection:** Environment variables starting with `CURSOR_`
@@ -86,6 +145,8 @@ Windsurf (Codeium) is an AI IDE with agentic capabilities.
86
145
 
87
146
  **Config Files:**
88
147
 
148
+ - `AGENTS.md` - Shared repo instructions
149
+ - `.agents/skills/` - Shared skills discovered by Windsurf
89
150
  - `.windsurf/rules/lumenflow.md` - LumenFlow rules
90
151
 
91
152
  **Auto-detection:** Environment variables starting with `WINDSURF_`
@@ -114,11 +175,14 @@ lumenflow init --client cline
114
175
 
115
176
  ### OpenAI Codex
116
177
 
117
- Codex reads the AGENTS.md file directly for universal instructions.
178
+ Codex reads shared repo instructions from `AGENTS.md`, shared skills from `.agents/skills/`, and
179
+ vendor-specific subagent overlays from `.codex/agents/`.
118
180
 
119
181
  **Config Files:**
120
182
 
121
183
  - `AGENTS.md` - Universal agent instructions (always created)
184
+ - `.agents/skills/` - Shared skills surface
185
+ - `.codex/agents/` - Codex subagent overlays (explicit invocation only)
122
186
 
123
187
  **Initialize:**
124
188
 
@@ -2,7 +2,7 @@
2
2
  name: frontend-design
3
3
  description: Create distinctive, production-grade frontend interfaces. Use when building React components, pages, UI features, or when user requests visual/design work.
4
4
  version: 1.0.0
5
- source: docs/operations/_frameworks/lumenflow/lumenflow-agent-capsule.md
5
+ source: {{DOCS_OPERATIONS_PATH}}/_frameworks/lumenflow/lumenflow-agent-capsule.md
6
6
  last_updated: {{DATE}}
7
7
  allowed-tools: Read, Write, Edit, Bash
8
8
  ---
@@ -65,6 +65,34 @@ pnpm wu:prune --execute # Clean stale worktrees
65
65
  pnpm wu:cleanup --id WU-XXX # After PR merge
66
66
  ```
67
67
 
68
+ ## Coordination Signal Checkpoints
69
+
70
+ `wu:brief` includes an Inbox Snapshot for the current WU/session when memory is enabled.
71
+ Treat every unread signal surfaced there, at any `mem:checkpoint`, or before `wu:prep`
72
+ as a decision point, not background noise.
73
+
74
+ Before continuing after an unread signal:
75
+
76
+ 1. Read the signal context.
77
+ 2. Decide whether it changes the work, blocks progress, or is not actionable.
78
+ 3. Reply, acknowledge, or dismiss it through `mem:signal` / shared memory before moving on.
79
+
80
+ Do not wait until `wu:done` to inspect coordination traffic. Mid-flight redirects, peer review,
81
+ and orchestrator-worker handoffs depend on agents consuming signals during the WU.
82
+
83
+ ## A2A Signal Hook Delivery
84
+
85
+ Claude Code sessions with generated LumenFlow hooks receive directed A2A
86
+ `signal:received` events at the next `PostToolUse` boundary. Treat the hook
87
+ payload the same way as an unread `mem:inbox` result:
88
+
89
+ 1. Read the signal message, `intent`, `interrupt_class`, and WU/thread scope.
90
+ 2. If `requires_ack: true`, reply on the same thread with `pnpm mem:signal ... --reply-to <signal_id> --intent AGREE` or `--intent REJECT`.
91
+ 3. Continue only after the decision is recorded, unless an explicit `wu:prep --allow-unread-signals --reason '<audit reason>'` override is justified.
92
+
93
+ Non-hook clients still rely on `wu:brief`, `mem:checkpoint`, and explicit
94
+ `mem:inbox` polling until the daemon fallback lands.
95
+
68
96
  ## wu:prep + wu:done Workflow (WU-1223)
69
97
 
70
98
  **Two-step completion:**