@event4u/agent-config 1.18.0 → 1.19.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 (126) hide show
  1. package/.agent-src/commands/council/default.md +74 -76
  2. package/.agent-src/commands/feature/roadmap.md +22 -0
  3. package/.agent-src/commands/roadmap/create.md +38 -6
  4. package/.agent-src/commands/roadmap/execute.md +36 -9
  5. package/.agent-src/rules/agent-authority.md +1 -0
  6. package/.agent-src/rules/agent-docs.md +1 -0
  7. package/.agent-src/rules/analysis-skill-routing.md +1 -0
  8. package/.agent-src/rules/architecture.md +1 -0
  9. package/.agent-src/rules/artifact-drafting-protocol.md +1 -0
  10. package/.agent-src/rules/artifact-engagement-recording.md +1 -0
  11. package/.agent-src/rules/ask-when-uncertain.md +1 -0
  12. package/.agent-src/rules/augment-portability.md +1 -0
  13. package/.agent-src/rules/augment-source-of-truth.md +1 -0
  14. package/.agent-src/rules/autonomous-execution.md +1 -0
  15. package/.agent-src/rules/capture-learnings.md +1 -0
  16. package/.agent-src/rules/chat-history-cadence.md +34 -0
  17. package/.agent-src/rules/chat-history-ownership.md +1 -0
  18. package/.agent-src/rules/chat-history-visibility.md +1 -0
  19. package/.agent-src/rules/cli-output-handling.md +2 -2
  20. package/.agent-src/rules/command-suggestion-policy.md +1 -0
  21. package/.agent-src/rules/commit-conventions.md +1 -0
  22. package/.agent-src/rules/commit-policy.md +1 -0
  23. package/.agent-src/rules/context-hygiene.md +22 -0
  24. package/.agent-src/rules/direct-answers.md +1 -0
  25. package/.agent-src/rules/docker-commands.md +1 -0
  26. package/.agent-src/rules/docs-sync.md +1 -0
  27. package/.agent-src/rules/downstream-changes.md +1 -0
  28. package/.agent-src/rules/e2e-testing.md +1 -0
  29. package/.agent-src/rules/guidelines.md +1 -0
  30. package/.agent-src/rules/improve-before-implement.md +1 -0
  31. package/.agent-src/rules/language-and-tone.md +1 -0
  32. package/.agent-src/rules/laravel-translations.md +1 -0
  33. package/.agent-src/rules/markdown-safe-codeblocks.md +1 -0
  34. package/.agent-src/rules/minimal-safe-diff.md +1 -0
  35. package/.agent-src/rules/missing-tool-handling.md +1 -0
  36. package/.agent-src/rules/model-recommendation.md +1 -0
  37. package/.agent-src/rules/no-cheap-questions.md +1 -0
  38. package/.agent-src/rules/no-roadmap-references.md +1 -0
  39. package/.agent-src/rules/non-destructive-by-default.md +1 -0
  40. package/.agent-src/rules/onboarding-gate.md +26 -0
  41. package/.agent-src/rules/package-ci-checks.md +1 -0
  42. package/.agent-src/rules/php-coding.md +1 -0
  43. package/.agent-src/rules/preservation-guard.md +1 -0
  44. package/.agent-src/rules/review-routing-awareness.md +1 -0
  45. package/.agent-src/rules/reviewer-awareness.md +1 -0
  46. package/.agent-src/rules/roadmap-progress-sync.md +22 -0
  47. package/.agent-src/rules/role-mode-adherence.md +2 -2
  48. package/.agent-src/rules/rule-type-governance.md +1 -0
  49. package/.agent-src/rules/runtime-safety.md +1 -0
  50. package/.agent-src/rules/scope-control.md +1 -0
  51. package/.agent-src/rules/security-sensitive-stop.md +1 -0
  52. package/.agent-src/rules/size-enforcement.md +1 -0
  53. package/.agent-src/rules/skill-improvement-trigger.md +1 -0
  54. package/.agent-src/rules/skill-quality.md +1 -0
  55. package/.agent-src/rules/slash-command-routing-policy.md +39 -0
  56. package/.agent-src/rules/think-before-action.md +1 -0
  57. package/.agent-src/rules/token-efficiency.md +1 -0
  58. package/.agent-src/rules/tool-safety.md +1 -0
  59. package/.agent-src/rules/ui-audit-gate.md +1 -0
  60. package/.agent-src/rules/upstream-proposal.md +1 -0
  61. package/.agent-src/rules/user-interaction.md +1 -0
  62. package/.agent-src/rules/verify-before-complete.md +1 -0
  63. package/.agent-src/skills/roadmap-management/SKILL.md +29 -4
  64. package/.agent-src/skills/verify-completion-evidence/SKILL.md +8 -1
  65. package/.agent-src/templates/agent-settings.md +16 -0
  66. package/.agent-src/templates/roadmaps.md +8 -3
  67. package/.agent-src/templates/scripts/work_engine/hook_bootstrap.py +9 -0
  68. package/.agent-src/templates/scripts/work_engine/hooks/__init__.py +4 -0
  69. package/.agent-src/templates/scripts/work_engine/hooks/builtin/__init__.py +4 -0
  70. package/.agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.py +163 -0
  71. package/.agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.py +111 -0
  72. package/.agent-src/templates/scripts/work_engine/hooks/settings.py +36 -0
  73. package/.agent-src/templates/scripts/work_engine/scoring/decision_trace.py +141 -0
  74. package/.agent-src/templates/scripts/work_engine/scoring/memory_visibility.py +125 -0
  75. package/.claude-plugin/marketplace.json +1 -1
  76. package/CHANGELOG.md +62 -0
  77. package/README.md +19 -19
  78. package/config/agent-settings.template.yml +23 -0
  79. package/docs/catalog.md +5 -2
  80. package/docs/contracts/adr-settings-sync-engine.md +127 -0
  81. package/docs/contracts/decision-trace-v1.md +146 -0
  82. package/docs/contracts/file-ownership-matrix.json +7 -0
  83. package/docs/contracts/hook-architecture-v1.md +213 -0
  84. package/docs/contracts/memory-visibility-v1.md +138 -0
  85. package/docs/contracts/one-off-script-lifecycle.md +109 -0
  86. package/docs/contracts/rule-interactions.yml +22 -0
  87. package/docs/customization.md +1 -0
  88. package/docs/development.md +4 -1
  89. package/docs/guidelines/agent-infra/layered-settings.md +32 -13
  90. package/package.json +1 -1
  91. package/scripts/agent-config +44 -0
  92. package/scripts/ai_council/bundler.py +3 -3
  93. package/scripts/ai_council/clients.py +24 -8
  94. package/scripts/ai_council/one_off_archive/2026-05/README.md +22 -0
  95. package/scripts/ai_council/one_off_archive/2026-05/_one_off_roundtrip.py +13 -8
  96. package/scripts/ai_council/one_off_archive/2026-05/_one_off_tier_retrofit.py +180 -0
  97. package/scripts/ai_council/session.py +92 -0
  98. package/scripts/capture_showcase_session.py +361 -0
  99. package/scripts/chat_history.py +11 -1
  100. package/scripts/check_always_budget.py +7 -2
  101. package/scripts/context_hygiene_hook.py +14 -6
  102. package/scripts/council_cli.py +357 -0
  103. package/scripts/hook_manifest.yaml +184 -0
  104. package/scripts/hooks/__init__.py +1 -0
  105. package/scripts/hooks/augment-dispatcher.sh +72 -0
  106. package/scripts/hooks/cline-dispatcher.sh +86 -0
  107. package/scripts/hooks/cursor-dispatcher.sh +76 -0
  108. package/scripts/hooks/dispatch_hook.py +348 -0
  109. package/scripts/hooks/envelope.py +98 -0
  110. package/scripts/hooks/gemini-dispatcher.sh +117 -0
  111. package/scripts/hooks/state_io.py +122 -0
  112. package/scripts/hooks/windsurf-dispatcher.sh +123 -0
  113. package/scripts/hooks_status.py +146 -0
  114. package/scripts/install.py +725 -87
  115. package/scripts/install.sh +1 -1
  116. package/scripts/lint_hook_manifest.py +216 -0
  117. package/scripts/lint_one_off_age.py +184 -0
  118. package/scripts/lint_rule_tiers.py +78 -0
  119. package/scripts/lint_showcase_sessions.py +148 -0
  120. package/scripts/minimal_safe_diff_hook.py +245 -0
  121. package/scripts/onboarding_gate_hook.py +13 -8
  122. package/scripts/readme_linter.py +12 -3
  123. package/scripts/roadmap_progress_hook.py +5 -0
  124. package/scripts/sync_agent_settings.py +32 -129
  125. package/scripts/sync_yaml_rt.py +734 -0
  126. package/scripts/verify_before_complete_hook.py +216 -0
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  type: "auto"
3
+ tier: "2b"
3
4
  description: "Before implementing features or architectural changes — validate the request against existing code, challenge weak requirements, and suggest improvements"
4
5
  alwaysApply: false
5
6
  source: package
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  type: "always"
3
+ tier: "3"
3
4
  description: "Language and tone — informal German Du, English code comments, .md files always English"
4
5
  alwaysApply: true
5
6
  source: package
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  type: "auto"
3
+ tier: "2a"
3
4
  alwaysApply: false
4
5
  description: "Laravel language files, translations, i18n, lang/de, lang/en, __() helper, localization, multilingual text"
5
6
  source: package
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  type: "auto"
3
+ tier: "2b"
3
4
  description: "Generating markdown output that contains code blocks — prevent broken nesting"
4
5
  alwaysApply: false
5
6
  source: package
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  type: "auto"
3
+ tier: "2a"
3
4
  alwaysApply: false
4
5
  description: "When writing or reviewing a diff — the smallest change that solves the stated problem; no drive-by edits, no opportunistic refactors, no reformatting of untouched code"
5
6
  source: package
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  type: auto
3
+ tier: "2a"
3
4
  source: package
4
5
  description: "When a CLI tool needed for the task is not installed — ask before working around it; do NOT install silently"
5
6
  ---
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  type: "auto"
3
+ tier: "2a"
3
4
  description: "Starting a new task, switching task type, or invoking a command — detect task complexity and recommend the optimal model (Opus/Sonnet/GPT) before any work"
4
5
  alwaysApply: false
5
6
  source: package
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  type: "always"
3
+ tier: "3"
3
4
  description: "No cheap questions — never ask what context answers, never offer Iron-Law-violating options, never stage no-trade-off choices; mode-independent (off / auto / on)"
4
5
  alwaysApply: true
5
6
  source: package
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  type: "auto"
3
+ tier: "mechanical-already"
3
4
  description: "Adding a link to a specific file in agents/roadmaps/ from any stable artifact (rule, skill, command, context, guideline) — roadmaps are transient; promote durable findings to agents/contexts/ instead"
4
5
  alwaysApply: false
5
6
  source: package
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  type: "always"
3
+ tier: "safety-floor"
3
4
  description: "Agent is never destructive — Hard Floor always asks for prod-trunk merges, deploys, pushes, prod data/infra, bulk deletions, and bulk-deletion/infra commits; no autonomy or roadmap bypass"
4
5
  alwaysApply: true
5
6
  source: package
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  type: "auto"
3
+ tier: "1"
3
4
  description: "First turn of a conversation on a project — check onboarding.onboarded in .agent-settings.yml; when false, prompt the user to run /onboard before executing any other request"
4
5
  alwaysApply: false
5
6
  source: package
@@ -92,6 +93,31 @@ gate. This protects projects that were set up before this rule shipped.
92
93
  - `scope-control` — option `2` writes exactly one key; no side effects.
93
94
  - `role-mode-adherence` — gate runs BEFORE the mode marker is emitted.
94
95
 
96
+ ## Copilot fallback
97
+
98
+ GitHub Copilot has no `SessionStart` hook surface, so
99
+ `scripts/onboarding_gate_hook.py` cannot run structurally and
100
+ `agents/state/onboarding-gate.json` is not refreshed for the agent.
101
+ On the first turn of a Copilot conversation:
102
+
103
+ 1. Read `onboarding.onboarded` from `.agent-settings.yml` directly
104
+ (one read per conversation, then cache as the prose above
105
+ describes).
106
+ 2. Optionally refresh the state file manually so other tooling sees
107
+ the same value the hook would have written:
108
+
109
+ ```bash
110
+ python3 scripts/onboarding_gate_hook.py < /dev/null
111
+ ```
112
+
113
+ The script reads `.agent-settings.yml`, atomically writes
114
+ `agents/state/onboarding-gate.json`, and exits 0 — same payload
115
+ the Augment / Claude / Cursor / Cline / Windsurf / Gemini hook
116
+ would have produced.
117
+ 3. Apply the gate behavior from "Gate behavior when `onboarded:
118
+ false`" above. The cooperative path is the spec; the hook is the
119
+ cache.
120
+
95
121
  ## See also
96
122
 
97
123
  - [`/onboard`](../commands/onboard.md) — the command this gate invokes
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  type: "auto"
3
+ tier: "mechanical-already"
3
4
  alwaysApply: false
4
5
  description: "Before pushing to remote or creating a PR in the agent-config package — run all CI checks locally first"
5
6
  source: package
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  type: "auto"
3
+ tier: "3"
3
4
  description: "Writing or reviewing PHP code — strict types, naming, comparisons, early returns, Eloquent conventions"
4
5
  alwaysApply: false
5
6
  source: package
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  type: "auto"
3
+ tier: "2b"
3
4
  alwaysApply: false
4
5
  description: "When merging, refactoring, compressing, or restructuring skills, rules, commands, or guidelines — prevent quality loss"
5
6
  source: package
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  type: "auto"
3
+ tier: "2a"
3
4
  description: "When routing reviewers or flagging risk hotspots — consult ownership-map and historical-bug-patterns before suggesting reviewers or claiming a change is safe"
4
5
  source: package
5
6
  load_context:
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  type: "auto"
3
+ tier: "2a"
3
4
  description: "When suggesting reviewers for a change — anchor the choice in paths and risk, never prestige or seniority; require primary + secondary role for medium/high risk"
4
5
  source: package
5
6
  ---
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  type: "auto"
3
+ tier: "1"
3
4
  description: "Any touch to agents/roadmaps/ — create/rename/delete/move, edit checkboxes ([x]/[~]/[-]), add/rename/remove phases — must regenerate dashboard and archive if 0 open items, same response"
4
5
  alwaysApply: false
5
6
  source: package
@@ -156,3 +157,24 @@ the mandatory pre-send self-check, the failure-mode catalog, and the
156
157
  [`contexts/communication/rules-auto/roadmap-progress-sync-mechanics.md`](../contexts/communication/rules-auto/roadmap-progress-sync-mechanics.md).
157
158
  Pull it whenever a trigger fires — the rule above is the obligation
158
159
  surface; the mechanics file is the lookup material.
160
+
161
+ ## Copilot fallback
162
+
163
+ GitHub Copilot has no `PostToolUse` hook surface, so
164
+ `scripts/roadmap_progress_hook.py` cannot detect roadmap-file writes
165
+ structurally. The dashboard at `agents/roadmaps-progress.md` will
166
+ not regenerate on its own.
167
+
168
+ The cooperative path: every time a roadmap touch fires (per the
169
+ trigger list in the mechanics context above), the agent regenerates
170
+ the dashboard in the same response — which is the same Iron Law the
171
+ hook enforces, just executed manually:
172
+
173
+ ```bash
174
+ ./agent-config roadmap:progress
175
+ ```
176
+
177
+ The hook implementation is the specification; on Copilot the agent
178
+ runs the regenerator itself after the same triggers fire. Skipping
179
+ it is a rule violation, not a hook gap — the Iron Law on dashboard
180
+ sync survives the missing hook surface.
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  type: "auto"
3
+ tier: "2a"
3
4
  description: "When roles.active_role is set in .agent-settings.yml — closing outputs must match the mode's contract and emit the structured mode marker"
4
5
  alwaysApply: false
5
6
  source: package
@@ -12,8 +13,7 @@ one of the six modes defined in
12
13
  [`role-contracts`](../../docs/guidelines/agent-infra/role-contracts.md):
13
14
  `developer`, `reviewer`, `tester`, `po`, `incident`, `planner`.
14
15
 
15
- Read `roles.active_role` from `.agent-settings.yml` at session start.
16
- Empty or missing → rule is inert. Do NOT guess a mode.
16
+ Read `roles.active_role` from `.agent-settings.yml` at session start. Empty / missing → rule is inert; do NOT guess a mode.
17
17
 
18
18
  When active, every closing output MUST:
19
19
 
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  type: "auto"
3
+ tier: "2a"
3
4
  description: "Creating or editing rules, or auditing rule types — decides when a rule should be always vs auto"
4
5
  alwaysApply: false
5
6
  source: package
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  type: auto
3
+ tier: "2b"
3
4
  source: package
4
5
  description: "When a skill declares execution metadata — enforce safety constraints for assisted and automated execution types"
5
6
  ---
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  type: "always"
3
+ tier: "safety-floor"
3
4
  description: "Scope control — no unsolicited architectural changes, refactors, or library replacements"
4
5
  alwaysApply: true
5
6
  source: package
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  type: "auto"
3
+ tier: "2a"
3
4
  alwaysApply: false
4
5
  description: "Security-sensitive paths — auth, billing, tenant boundaries, secrets, file uploads, external integrations, webhooks, public endpoints — stop and run threat analysis BEFORE editing"
5
6
  source: package
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  type: "auto"
3
+ tier: "mechanical-already"
3
4
  description: "Creating or editing rules, skills, commands, guidelines, AGENTS.md, or copilot-instructions.md — enforce size and scope limits"
4
5
  alwaysApply: false
5
6
  source: package
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  type: "auto"
3
+ tier: "2a"
3
4
  description: "After completing a meaningful task — trigger post-task learning capture if pipelines.skill_improvement is enabled"
4
5
  alwaysApply: false
5
6
  source: package
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  type: "auto"
3
+ tier: "mechanical-already"
3
4
  description: "Creating, editing, or reviewing skills — minimum quality standard, every skill must be executable, validated, and self-contained"
4
5
  alwaysApply: false
5
6
  source: package
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  type: "auto"
3
+ tier: "1"
3
4
  description: "When user types a slash command like /create-pr, /commit, or pastes command file content"
4
5
  alwaysApply: false
5
6
  source: package
@@ -31,3 +32,41 @@ This is **irrelevant** for command detection.
31
32
  - If command file content appears in the context alongside an open file, the **command invocation takes priority**.
32
33
  - Do NOT confuse "file is open" with "user wants to discuss this file".
33
34
  - The user's typed message determines intent — not editor state.
35
+
36
+ ## Read the whole prompt — command is the operator, prose is the target
37
+
38
+ ```
39
+ /<command> IS THE OPERATOR.
40
+ THE REST OF THE USER MESSAGE NAMES THE TARGET.
41
+ NEVER ASSUME THE COMMAND NAME IS THE TARGET.
42
+ ```
43
+
44
+ Slash token = **what to do**; surrounding prose = **what to do it on**.
45
+
46
+ - `/council and analyse chat-history` → target is `chat-history`,
47
+ not `council`. Council is the *tool*, prose names the *artefact*.
48
+ - `/work the memory bug from PROJ-123` → target is "the memory bug
49
+ from PROJ-123".
50
+ - `/fix ci and then open a PR` → target is "CI failure"; trailing
51
+ "open a PR" is a follow-up needing separate permission (per
52
+ `scope-control`).
53
+
54
+ ### Pre-flight before expensive operations
55
+
56
+ Before any operation costing real time or money — external API call,
57
+ large codebase analysis, multi-file refactor, council run, generated
58
+ test suite — run silently:
59
+
60
+ 1. Re-read the **whole** user message, not just slash + first token.
61
+ 2. Identify the target the prose actually names.
62
+ 3. Target unambiguous → execute, no question.
63
+ 4. Target **genuinely** ambiguous after re-reading (prose names *two*
64
+ artefacts, can't tell which is the operand) → ask ONE
65
+ disambiguating numbered-options question per
66
+ [`ask-when-uncertain`](ask-when-uncertain.md), then proceed.
67
+
68
+ **Not** a license to re-introduce cheap questions (`no-cheap-questions`
69
+ still binds). Threshold: *"would this guess waste the user's tokens,
70
+ money, or trust?"* — not *"I'd feel safer asking"*. Single failure
71
+ mode to avoid: spending API spend on the wrong artefact because the
72
+ agent fixated on the command name.
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  type: "auto"
3
+ tier: "2b"
3
4
  description: "Before coding, modifying, or debugging — analyze first, verify with real tools, never guess or trial-and-error"
4
5
  alwaysApply: false
5
6
  source: package
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  type: "auto"
3
+ tier: "2a"
3
4
  description: "When running CLI tools, fetching logs, or producing replies — redirect verbose output, minimize tool calls, keep replies concise"
4
5
  alwaysApply: false
5
6
  source: package
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  type: auto
3
+ tier: "2b"
3
4
  source: package
4
5
  description: "When a skill uses external tools — enforce allowlist, deny-by-default, and no hidden credential patterns"
5
6
  ---
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  type: "auto"
3
+ tier: "2b"
3
4
  description: "Writing or editing UI — components, screens, partials, layouts, design tokens — require existing-ui-audit findings in state.ui_audit before non-trivial UI change; gate, not suggestion"
4
5
  alwaysApply: false
5
6
  source: package
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  type: "auto"
3
+ tier: "2a"
3
4
  description: "After creating or significantly improving a skill, rule, guideline, or command — ask if it should be contributed upstream to the shared package"
4
5
  alwaysApply: false
5
6
  source: package
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  type: "auto"
3
+ tier: "3"
3
4
  description: "Asking the user a question, presenting options, or summarizing progress — numbered-options Iron Law, single-recommendation rule, progress indicators"
4
5
  alwaysApply: false
5
6
  source: package
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  type: "always"
3
+ tier: "2a"
3
4
  description: "Verify before completion — run tests and quality tools before claiming done"
4
5
  alwaysApply: true
5
6
  source: package
@@ -117,11 +117,28 @@ Every roadmap follows this structure:
117
117
 
118
118
  ### Quality gates
119
119
 
120
- Every roadmap implicitly includes these gates (run after each step that changes code):
120
+ Every roadmap implicitly includes the project's quality pipeline
121
+ (static analysis, autofixes, tests). What's configurable is **when**
122
+ the pipeline runs during `/roadmap execute`, controlled by
123
+ `roadmap.quality_cadence` in `.agent-settings.yml`:
121
124
 
122
- - PHPStan must pass (detect command: artisan vs composer, see `rules/docker-commands.md`)
123
- - Rector: run with fix flag, verify no new PHPStan errors
124
- - Tests: run affected tests
125
+ | Cadence | Pipeline runs | Trade-off |
126
+ |---|---|---|
127
+ | `end_of_roadmap` (default) | Once before archiving | Fastest, fewest tokens; errors compound across phases |
128
+ | `per_phase` | After every completed phase + final | Balanced; catches drift at phase boundaries |
129
+ | `per_step` | After every completed step + final | Legacy verbose; highest token cost |
130
+
131
+ The default is `end_of_roadmap` because most steps are checkbox-only
132
+ content edits and a final pipeline run is the cheapest way to satisfy
133
+ `verify-before-complete`. Switch to `per_phase` for risky migrations or
134
+ unfamiliar codebases.
135
+
136
+ **Always-on, regardless of cadence:**
137
+
138
+ - Step checkboxes flip `[ ] → [x]` and the dashboard regenerates **same
139
+ response** (enforced by `roadmap-progress-sync`).
140
+ - Before any "roadmap complete" claim or archival, the pipeline runs
141
+ fresh (enforced by `verify-before-complete`).
125
142
 
126
143
  ### Step granularity
127
144
 
@@ -149,6 +166,14 @@ Every roadmap implicitly includes these gates (run after each step that changes
149
166
  the roadmap text. If the user declines, do **not** re-propose during
150
167
  `roadmap-execute`. Decline = silence. See [`scope-control`](../../rules/scope-control.md#decline--silence--no-re-asking-on-the-same-task).
151
168
  5. Save with a kebab-case filename (e.g. `optimize-webhook-jobs.md`).
169
+ **Before writing**, scan the entire roadmap namespace for a
170
+ collision — active, `archive/`, `skipped/`, and nested subdirs —
171
+ with `find agents/roadmaps -type f -iname "<name>.md"`. If any
172
+ hit comes back, stop and ask the user to rename, open the
173
+ existing file, or abort. Never silently overwrite an archived
174
+ or skipped roadmap. Detailed prompt in
175
+ [`commands/roadmap/create.md`](../../commands/roadmap/create.md)
176
+ step 6.
152
177
  6. Regenerate the dashboard so the new roadmap is included.
153
178
 
154
179
  ### Executing a roadmap
@@ -128,7 +128,12 @@ When reporting completion to the user:
128
128
  3. **Result** — numeric breakdown (tests passed/failed/skipped, errors,
129
129
  warnings)
130
130
  4. **Caveats** — anything the output flagged but you chose to accept
131
- 5. **Next step** — e.g. "Ready for `/commit`" or "Awaiting review"
131
+ 5. **Untracked files** — if `git status --short` shows any untracked
132
+ files in the working tree, list them verbatim in the report. This
133
+ prevents silently-shipped artefacts (logs, scratch scripts, ad-hoc
134
+ notes) from disappearing into a future commit. Empty list means
135
+ omit the section.
136
+ 6. **Next step** — e.g. "Ready for `/commit`" or "Awaiting review"
132
137
 
133
138
  ## Gotchas
134
139
 
@@ -188,3 +193,5 @@ Before sending a completion message:
188
193
  * [ ] No warnings or skips are hidden
189
194
  * [ ] Targeted tests green → full suite green → quality pipeline clean
190
195
  * [ ] `git status` reflects only the intended change set
196
+ * [ ] If `git status --short` shows untracked files, the report lists
197
+ them verbatim under "Untracked files"
@@ -217,6 +217,21 @@ pipelines:
217
217
  # Included by every cost_profile except `custom`.
218
218
  skill_improvement: true
219
219
 
220
+ # --- Roadmap execution ---
221
+ #
222
+ # Controls when /roadmap execute runs the project's quality pipeline.
223
+ # Step checkboxes and the dashboard are ALWAYS updated in the same
224
+ # response — that cadence is governed by `roadmap-progress-sync` and
225
+ # is non-negotiable. This setting only governs *quality tool runs*.
226
+ roadmap:
227
+ # When to run quality tools during /roadmap execute.
228
+ # end_of_roadmap = once, before archiving (default — fastest, fewest tokens)
229
+ # per_phase = once after every completed phase
230
+ # per_step = after every completed step (legacy; highest token cost)
231
+ # Iron Law `verify-before-complete` still applies — fresh output is
232
+ # mandatory before any "roadmap complete" claim, regardless of cadence.
233
+ quality_cadence: end_of_roadmap
234
+
220
235
  # --- Subagent orchestration ---
221
236
  subagents:
222
237
  # Model for implementer subagents (empty = same tier as the session model)
@@ -362,6 +377,7 @@ lives under `personal:` in YAML.
362
377
  | `hooks.chat_history.enabled` | `true`, `false` | `true` | Register the four chat-history hooks (turn-check, append, halt-append, heartbeat). Gated by **both** this flag AND `chat_history.enabled`; either off → no chat-history hook registers. |
363
378
  | `hooks.chat_history.script` | path | `scripts/chat_history.py` | Override path to the chat-history CLI. Set only when the script lives outside the standard location. |
364
379
  | `pipelines.skill_improvement` | `true`, `false` | `true` | When `true`: propose learning capture after meaningful tasks. When `false`: silent. Included in every profile except `custom`. |
380
+ | `roadmap.quality_cadence` | `end_of_roadmap`, `per_phase`, `per_step` | `end_of_roadmap` | When `/roadmap execute` runs the project's quality pipeline. Default skips per-step / per-phase runs and gates only the final archival. `per_phase` runs once after every phase; `per_step` is the legacy verbose mode. Step checkboxes and the dashboard are always updated regardless. `verify-before-complete` still requires fresh output before any "roadmap complete" claim. |
365
381
  | `subagents.implementer_model` | model alias or empty | _(empty)_ | Model for implementer subagents. Empty = same tier as session model. See [subagent-configuration](../contexts/subagent-configuration.md). |
366
382
  | `subagents.judge_model` | model alias or empty | _(empty)_ | Model for judge subagents. Empty = one tier above implementer (opus if sonnet, sonnet if haiku). |
367
383
  | `subagents.max_parallel` | integer | `3` | Maximum parallel subagent invocations. `1` serializes. |
@@ -39,11 +39,16 @@ Templates for roadmap files stored in `agents/roadmaps/` or `app/Modules/{Module
39
39
 
40
40
  ---
41
41
 
42
- ## Quality Gates (always apply)
42
+ ## Quality Gates (always apply at completion)
43
43
 
44
- Every roadmap must pass these before it is considered done:
44
+ Every roadmap must pass the project's quality pipeline before it is
45
+ considered done. **When** the pipeline runs during `/roadmap execute` is
46
+ governed by `roadmap.quality_cadence` in `.agent-settings.yml`
47
+ (`end_of_roadmap` default → once before archival; `per_phase` → after
48
+ every phase; `per_step` → after every step). Either way, a final fresh
49
+ run is mandatory before "complete" per `verify-before-complete`.
45
50
 
46
- Run the project's quality pipeline and test suite. Common commands:
51
+ Common commands:
47
52
 
48
53
  ```bash
49
54
  # PHP projects (inside Docker container if applicable)
@@ -19,8 +19,10 @@ from .hooks.builtin import (
19
19
  ChatHistoryHaltAppendHook,
20
20
  ChatHistoryHeartbeatHook,
21
21
  ChatHistoryTurnCheckHook,
22
+ DecisionTraceHook,
22
23
  DirectiveSetGuardHook,
23
24
  HaltSurfaceAuditHook,
25
+ MemoryVisibilityHook,
24
26
  StateShapeValidationHook,
25
27
  TraceHook,
26
28
  )
@@ -56,6 +58,13 @@ def _build_hook_registry(args: argparse.Namespace) -> HookRegistry:
56
58
  StateShapeValidationHook().register(registry)
57
59
  if settings.directive_set_guard:
58
60
  DirectiveSetGuardHook().register(registry)
61
+ if settings.decision_trace:
62
+ DecisionTraceHook().register(registry)
63
+ if settings.memory_visibility:
64
+ MemoryVisibilityHook(
65
+ cost_profile=settings.cost_profile,
66
+ visibility_off=settings.memory_visibility_off,
67
+ ).register(registry)
59
68
  if settings.chat_history_enabled:
60
69
  _register_chat_history_hooks(registry, settings)
61
70
 
@@ -24,8 +24,10 @@ from .builtin import (
24
24
  ChatHistoryHaltAppendHook,
25
25
  ChatHistoryHeartbeatHook,
26
26
  ChatHistoryTurnCheckHook,
27
+ DecisionTraceHook,
27
28
  DirectiveSetGuardHook,
28
29
  HaltSurfaceAuditHook,
30
+ MemoryVisibilityHook,
29
31
  StateShapeValidationHook,
30
32
  TraceHook,
31
33
  )
@@ -40,6 +42,7 @@ __all__ = [
40
42
  "ChatHistoryHaltAppendHook",
41
43
  "ChatHistoryHeartbeatHook",
42
44
  "ChatHistoryTurnCheckHook",
45
+ "DecisionTraceHook",
43
46
  "DirectiveSetGuardHook",
44
47
  "HaltSurfaceAuditHook",
45
48
  "HookCallback",
@@ -49,6 +52,7 @@ __all__ = [
49
52
  "HookHalt",
50
53
  "HookRegistry",
51
54
  "HookRunner",
55
+ "MemoryVisibilityHook",
52
56
  "StateShapeValidationHook",
53
57
  "TraceHook",
54
58
  ]
@@ -15,8 +15,10 @@ from .chat_history_append import ChatHistoryAppendHook
15
15
  from .chat_history_halt_append import ChatHistoryHaltAppendHook
16
16
  from .chat_history_heartbeat import ChatHistoryHeartbeatHook
17
17
  from .chat_history_turn_check import ChatHistoryTurnCheckHook
18
+ from .decision_trace import DecisionTraceHook
18
19
  from .directive_set_guard import DirectiveSetGuardHook
19
20
  from .halt_surface_audit import HaltSurfaceAuditHook
21
+ from .memory_visibility import MemoryVisibilityHook
20
22
  from .state_shape_validation import StateShapeValidationHook
21
23
  from .trace import TraceHook
22
24
 
@@ -25,8 +27,10 @@ __all__ = [
25
27
  "ChatHistoryHaltAppendHook",
26
28
  "ChatHistoryHeartbeatHook",
27
29
  "ChatHistoryTurnCheckHook",
30
+ "DecisionTraceHook",
28
31
  "DirectiveSetGuardHook",
29
32
  "HaltSurfaceAuditHook",
33
+ "MemoryVisibilityHook",
30
34
  "StateShapeValidationHook",
31
35
  "TraceHook",
32
36
  ]