@event4u/agent-config 9.6.0 → 9.8.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 (204) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +207 -942
  3. package/README.md +21 -21
  4. package/dist/agent-src/README.md +2 -2
  5. package/dist/agent-src/commands/commit/in-chunks.md +8 -0
  6. package/dist/agent-src/commands/commit.md +17 -0
  7. package/dist/agent-src/commands/pr/create.md +4 -0
  8. package/dist/agent-src/contexts/override-system.md +75 -5
  9. package/dist/agent-src/rules/context-hygiene.md +2 -0
  10. package/dist/agent-src/rules/doc-screenshot-hygiene.md +97 -0
  11. package/dist/agent-src/rules/domain-safety-pii.md +1 -0
  12. package/dist/agent-src/rules/downstream-changes.md +31 -1
  13. package/dist/agent-src/rules/external-code-graph-interop.md +13 -3
  14. package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +2 -0
  15. package/dist/agent-src/rules/git-history-discipline.md +2 -0
  16. package/dist/agent-src/rules/language-and-tone.md +2 -0
  17. package/dist/agent-src/rules/lethal-trifecta-guard.md +3 -0
  18. package/dist/agent-src/rules/media-governance-routing.md +2 -0
  19. package/dist/agent-src/rules/minimal-safe-diff.md +2 -0
  20. package/dist/agent-src/rules/no-roadmap-references.md +3 -0
  21. package/dist/agent-src/rules/non-destructive-by-default.md +20 -0
  22. package/dist/agent-src/rules/onboarding-gate.md +2 -0
  23. package/dist/agent-src/rules/output-discipline.md +2 -0
  24. package/dist/agent-src/rules/persona-governance.md +2 -0
  25. package/dist/agent-src/rules/preservation-guard.md +3 -0
  26. package/dist/agent-src/rules/roadmap-progress-sync.md +2 -0
  27. package/dist/agent-src/rules/secret-vcs-guard.md +106 -0
  28. package/dist/agent-src/rules/security-sensitive-stop.md +1 -1
  29. package/dist/agent-src/rules/skill-quality.md +2 -0
  30. package/dist/agent-src/rules/source-confidentiality.md +2 -0
  31. package/dist/agent-src/rules/source-of-truth.md +2 -0
  32. package/dist/agent-src/rules/telegraph-speak.md +2 -0
  33. package/dist/agent-src/rules/token-optimizer-maintenance.md +2 -0
  34. package/dist/agent-src/rules/tool-safety.md +1 -0
  35. package/dist/agent-src/rules/verify-before-complete.md +2 -0
  36. package/dist/agent-src/skills/adr-create/SKILL.md +17 -1
  37. package/dist/agent-src/skills/agent-docs-writing/SKILL.md +34 -16
  38. package/dist/agent-src/skills/agents-md-thin-root/SKILL.md +9 -9
  39. package/dist/agent-src/skills/code-intelligence/SKILL.md +94 -0
  40. package/dist/agent-src/skills/gated-reach/SKILL.md +185 -0
  41. package/dist/agent-src/skills/gated-reach/evals/triggers.json +72 -0
  42. package/dist/agent-src/skills/image-analyser/SKILL.md +14 -12
  43. package/dist/agent-src/skills/image-editing/SKILL.md +1 -0
  44. package/dist/agent-src/skills/readme-writing/SKILL.md +6 -1
  45. package/dist/agent-src/skills/screenshot-hygiene/SKILL.md +171 -0
  46. package/dist/agent-src/skills/secrets-management/SKILL.md +44 -1
  47. package/dist/agent-src/skills/subagent-orchestration/prompts/adversarial-verification-council.md +29 -0
  48. package/dist/agent-src/skills/subagent-orchestration/prompts/do-and-judge-two-stage.md +29 -0
  49. package/dist/agent-src/skills/subagent-orchestration/prompts/do-and-judge.md +29 -0
  50. package/dist/agent-src/skills/subagent-orchestration/prompts/do-competitively.md +29 -0
  51. package/dist/agent-src/skills/subagent-orchestration/prompts/do-in-parallel.md +29 -0
  52. package/dist/agent-src/skills/subagent-orchestration/prompts/do-in-steps.md +29 -0
  53. package/dist/agent-src/skills/subagent-orchestration/prompts/do-in-worktrees.md +29 -0
  54. package/dist/agent-src/skills/subagent-orchestration/prompts/judge-with-debate.md +29 -0
  55. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +4 -0
  56. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  57. package/dist/agent-src/templates/github-workflows/doc-impact.yml +101 -0
  58. package/dist/agent-src/templates/github-workflows/secret-scan.yml +65 -0
  59. package/dist/cli/configRoot.js +112 -0
  60. package/dist/cli/configRoot.js.map +1 -0
  61. package/dist/cli/configRoot.test.js +97 -0
  62. package/dist/cli/configRoot.test.js.map +1 -0
  63. package/dist/cli/help.js +4 -1
  64. package/dist/cli/help.js.map +1 -1
  65. package/dist/cli/main.js +19 -2
  66. package/dist/cli/main.js.map +1 -1
  67. package/dist/cli/registry.js +1 -0
  68. package/dist/cli/registry.js.map +1 -1
  69. package/dist/discovery/deprecation-report.md +1 -1
  70. package/dist/discovery/discovery-manifest.json +164 -47
  71. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  72. package/dist/discovery/discovery-manifest.summary.md +4 -4
  73. package/dist/discovery/orphan-report.md +1 -1
  74. package/dist/discovery/packs.json +13 -8
  75. package/dist/discovery/trust-report.md +11 -11
  76. package/dist/discovery/workspaces.json +11 -6
  77. package/dist/install/install.mjs +16 -0
  78. package/dist/mcp/awesome-mcp-servers.row.md +1 -1
  79. package/dist/mcp/mcp-cloudflare-catalogue.json +1 -1
  80. package/dist/mcp/registry-manifest.json +4 -4
  81. package/dist/router.json +1 -1
  82. package/dist/server/app.js +10 -0
  83. package/dist/server/app.js.map +1 -1
  84. package/dist/server/routes/ping.js +18 -0
  85. package/dist/server/routes/ping.js.map +1 -1
  86. package/dist/server/schemas/settings.js +8 -0
  87. package/dist/server/schemas/settings.js.map +1 -1
  88. package/dist/server/serverInfo.js +6 -2
  89. package/dist/server/serverInfo.js.map +1 -1
  90. package/dist/server/token.js +11 -4
  91. package/dist/server/token.js.map +1 -1
  92. package/dist/server/writeRoot.js +15 -1
  93. package/dist/server/writeRoot.js.map +1 -1
  94. package/dist/shared/capabilities.js +33 -0
  95. package/dist/shared/capabilities.js.map +1 -0
  96. package/dist/shared/capabilities.test.js +39 -0
  97. package/dist/shared/capabilities.test.js.map +1 -0
  98. package/dist/ui/assets/{index-BiEZiZ31.js → index-CrmZ34Rg.js} +16 -16
  99. package/dist/ui/assets/index-CrmZ34Rg.js.map +1 -0
  100. package/dist/ui/index.html +14 -5
  101. package/docs/CLAIMS.md +64 -38
  102. package/docs/architecture.md +2 -2
  103. package/docs/archive/CHANGELOG-6.0.0-overview.md +953 -0
  104. package/docs/benchmark.md +170 -9
  105. package/docs/catalog.md +8 -3
  106. package/docs/comparison.yaml +44 -2
  107. package/docs/contracts/local-server-ports.md +53 -0
  108. package/docs/contracts/no-runtime-boundary.md +1 -1
  109. package/docs/contracts/subagent-boundary.md +15 -0
  110. package/docs/customization.md +14 -3
  111. package/docs/decisions/ADR-016-installer-architecture.md +2 -0
  112. package/docs/decisions/ADR-088-no-external-runtime-federation.md +1 -1
  113. package/docs/decisions/ADR-094-agent-memory-layer-removal.md +1 -1
  114. package/docs/decisions/ADR-109-subagent-v1-contract.md +2 -0
  115. package/docs/decisions/ADR-110-discipline-profile-resolution-locus.md +2 -0
  116. package/docs/decisions/ADR-113-ci-native-release-label-trigger.md +11 -3
  117. package/docs/decisions/ADR-122-adversarial-verification-council.md +30 -0
  118. package/docs/decisions/ADR-123-runtime-security-scope-and-spawn-hardening.md +31 -0
  119. package/docs/decisions/ADR-124-embedded-engine-doctrine.md +255 -0
  120. package/docs/decisions/ADR-125-doc-screenshot-anonymization.md +131 -0
  121. package/docs/decisions/ADR-126-internet-reach-operator-tooling.md +254 -0
  122. package/docs/decisions/ADR-127-enforcement-claims-must-resolve.md +150 -0
  123. package/docs/decisions/ADR-128-executable-evidence-and-measured-escalation.md +201 -0
  124. package/docs/decisions/INDEX.md +21 -0
  125. package/docs/decisions/engine-reclassification-2026-07.md +104 -0
  126. package/docs/distribution/awesome-list-submission.md +1 -1
  127. package/docs/distribution/registries.md +36 -27
  128. package/docs/enforcement-by-host.md +7 -0
  129. package/docs/featured-skills.md +2 -2
  130. package/docs/getting-started-by-role.md +1 -1
  131. package/docs/getting-started.md +1 -1
  132. package/docs/governance-advantage.md +1 -1
  133. package/docs/guides/gated-platform-reads.md +221 -0
  134. package/docs/positioning-evidence.md +1 -1
  135. package/docs/proof.md +92 -16
  136. package/docs/spawn-site-policy.md +72 -0
  137. package/docs/threat-model.md +2 -1
  138. package/package.json +6 -3
  139. package/src/agent-src/README.md +2 -2
  140. package/src/config/agent-settings.template.yml +43 -0
  141. package/src/config/reach-channels.yml +217 -0
  142. package/src/config/reach-prescriptions-intake.yml +200 -0
  143. package/src/scripts/_dispatch.bash +15 -0
  144. package/src/scripts/_lib/adversarial_bench_score.ts +106 -0
  145. package/src/scripts/_lib/exec_evidence.ts +251 -0
  146. package/src/scripts/_lib/fixtures/secret-detector/negatives.txt +10 -0
  147. package/src/scripts/_lib/fixtures/secret-detector/positives.txt +11 -0
  148. package/src/scripts/_lib/kernel_rules.ts +46 -0
  149. package/src/scripts/_lib/reddit_thread_parse.ts +598 -0
  150. package/src/scripts/_lib/risk_paths.ts +160 -0
  151. package/src/scripts/_lib/secret_detector.test.ts +103 -0
  152. package/src/scripts/_lib/secret_detector.ts +319 -0
  153. package/src/scripts/_lib/spawn_env.ts +24 -4
  154. package/src/scripts/_lib/tool_probe.ts +359 -0
  155. package/src/scripts/adr/regenerate_index.ts +81 -6
  156. package/src/scripts/audit_adr_coverage.ts +33 -0
  157. package/src/scripts/bench_adversarial_council.ts +292 -0
  158. package/src/scripts/build_proof.ts +162 -0
  159. package/src/scripts/check_adr_frontmatter.ts +195 -0
  160. package/src/scripts/check_artefact_count_messaging.ts +4 -0
  161. package/src/scripts/check_backstop_debt.ts +200 -0
  162. package/src/scripts/check_claims.ts +188 -8
  163. package/src/scripts/check_comparison.ts +12 -0
  164. package/src/scripts/check_enforcement_coverage.ts +592 -0
  165. package/src/scripts/check_kernel_rule_bundle.ts +16 -12
  166. package/src/scripts/check_no_new_legacy_path.ts +2 -0
  167. package/src/scripts/check_reach_channels.ts +407 -0
  168. package/src/scripts/check_reach_staleness.ts +364 -0
  169. package/src/scripts/check_secret_leak.test.ts +47 -0
  170. package/src/scripts/check_secret_leak.ts +290 -0
  171. package/src/scripts/check_source_pointer_freshness.ts +165 -0
  172. package/src/scripts/code_graph/build.ts +0 -0
  173. package/src/scripts/code_graph/cli.ts +207 -0
  174. package/src/scripts/code_graph/detect.ts +134 -0
  175. package/src/scripts/code_graph/extract.ts +386 -0
  176. package/src/scripts/code_graph/loader.ts +123 -0
  177. package/src/scripts/code_graph/query.ts +176 -0
  178. package/src/scripts/code_graph/sanitize.ts +30 -0
  179. package/src/scripts/code_graph/types.ts +83 -0
  180. package/src/scripts/code_graph/validate.ts +63 -0
  181. package/src/scripts/external_sources_denylist.json +3 -1
  182. package/src/scripts/generate_subagent_floor.ts +194 -0
  183. package/src/scripts/hook_manifest.yaml +13 -3
  184. package/src/scripts/hooks/code_graph_nudge_hook.ts +184 -0
  185. package/src/scripts/hooks/dispatch_hook.ts +5 -1
  186. package/src/scripts/iron_law_sha.ts +3 -12
  187. package/src/scripts/lint_override_kernel_guard.ts +219 -0
  188. package/src/scripts/lint_readme_serial_comma.ts +169 -0
  189. package/src/scripts/measure_rule_budget.ts +3 -12
  190. package/src/scripts/postinstall_gui.ts +129 -0
  191. package/src/scripts/reach_doctor.ts +1651 -0
  192. package/src/scripts/release.ts +24 -3
  193. package/src/scripts/risk_escalation_shadow.ts +160 -0
  194. package/src/scripts/schemas/agent-settings.schema.json +23 -0
  195. package/src/scripts/schemas/reach-channels.schema.json +134 -0
  196. package/src/scripts/schemas/reach-doctor-payload.schema.json +220 -0
  197. package/src/scripts/schemas/rule.schema.json +10 -0
  198. package/src/scripts/skill_linter.ts +55 -0
  199. package/src/scripts/validate_reach_prescriptions.ts +751 -0
  200. package/src/server/schemas/settings.ts +16 -0
  201. package/src/shared/capabilities.test.ts +43 -0
  202. package/src/shared/capabilities.ts +75 -0
  203. package/src/templates/minimal/agents-overrides-readme.md +20 -0
  204. package/dist/ui/assets/index-BiEZiZ31.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -16,948 +16,67 @@ Entry-shape contract: [`docs/contracts/CHANGELOG-conventions.md`](docs/contracts
16
16
 
17
17
  ## [Unreleased]
18
18
 
19
- ### 6.0.0 at a glance — release overview
20
-
21
- > A reader who never saw the PRs should understand 6.0.0 in under two
22
- > minutes. Seven headlines here; migration steps in **Breaking changes**
23
- > below; granular per-roadmap detail in the entries further down.
24
-
25
- 6.0.0 is the release that turns agent-config into a **workplace**, not just a
26
- rule pack:
27
-
28
- 1. **Workspace.** A task-orchestration layer owns the host-session lifecycle,
29
- continuation, and drive health — the engine behind `/work` and
30
- `/implement-ticket`.
31
- 2. **Multi-turn continuation.** A long task survives across turns: the
32
- workspace resumes where it left off instead of restarting cold.
33
- 3. **Secure local stores.** Session state and sensitive local data live in an
34
- encrypted-at-rest store under `~/.event4u/agent-config/`, not loose files.
35
- 4. **MCP server.** agent-config exposes its skills and commands over MCP, so
36
- MCP-aware hosts can reach them directly.
37
- 5. **AI-video Creative Pack (optional).** The AI-video surface graduates from
38
- prototype to validated provider adapters, shipped as an **opt-in Creative
39
- Pack** — not core identity, not a new platform.
40
- 6. **Breaking — condensed output relocated.** The repo-root `.agent-src/` tree
41
- is removed; condensed output now lives at `dist/agent-src/` ([ADR-058]).
42
- 7. **Upgrade cleanup.** Upgrading reaps stale deployed files (renamed/removed
43
- skills and commands) so old installs don't rot; `agent-config --dry-run`
44
- previews exactly what gets removed before any deletion.
45
-
46
- Pack-scoped projection (opt-in) and the TypeScript CLI + local-server
47
- foundation also land — both non-breaking by default.
48
-
49
- ### Breaking changes (6.0.0)
50
-
51
- **1. Condensed output moved: root `.agent-src/` → `dist/agent-src/`** ([ADR-058])
52
-
53
- - **Who is affected:** consumers whose scripts or tool configs hard-code
54
- `.agent-src/…` paths (plugin-marketplace clones, custom symlinks, CI globs).
55
- Default installs are **not** affected — regenerated projections pick up the
56
- new location automatically.
57
- - **What breaks:** the repo-root `.agent-src/` tree is removed, so any
58
- hard-coded `.agent-src/<x>` path no longer resolves.
59
- - **How to migrate:** replace `.agent-src/` with `dist/agent-src/` in any
60
- path you hard-code.
61
- - **Which command:** `agent-config install` (consumers) — or `task sync` +
62
- `task generate-tools` (this repo) — regenerates projections at the new
63
- location; the upgrade reaper removes the stale root tree. No manual path
64
- edits beyond your own hard-codes.
65
- - **Rationale:** the root tree conflated source and build output; moving
66
- condensed output under `dist/` makes "generated, do not edit" unambiguous
67
- and keeps the repo root clean.
68
-
69
- **2. Settings key renamed: `cost_profile` → `rule_loading_tier`**
70
-
71
- - **Who is affected:** anyone with a hand-edited `cost_profile` in
72
- `.agent-settings.yml`.
73
- - **What breaks:** nothing immediately — `cost_profile` is read as a fallback
74
- during the grace period. The colliding memory-cadence meaning moved to its
75
- own `memory.cadence` key (`auto`/`always`/`never`).
76
- - **How to migrate:** automatic.
77
- - **Which command:** `agent-config install` / `setup` migrates existing
78
- settings on the next run. No manual action required.
79
- - **Rationale:** one key carried two unrelated meanings (rule-loading footprint
80
- vs. memory-line cadence); splitting them removes the collision.
81
-
82
- [ADR-058]: docs/decisions/ADR-058-condensed-output-relocation-to-dist.md
83
-
84
- ### Feedback wanted — multi-agent MCP config (demand probe, `ADR-086`)
85
-
86
- We are deciding whether to build a cross-agent MCP discovery / install helper.
87
- One question — answer in [Discussions](https://github.com/event4u-app/agent-config/discussions):
88
-
89
- > **Do you run more than one AI coding agent in the same project, and is keeping
90
- > MCP-server config in sync across them painful?**
91
- > (a) very painful · (b) somewhat · (c) single-agent, not applicable · (d) I already
92
- > self-script it.
93
-
94
- This gates the read-only MCP discovery helper (`agent-config mcp:search`) and the
95
- deferred auto-install question (`ADR-086`).
96
-
97
- ### Added — humanizer (AI-tell removal for deliverable prose) (`road-to-humanized-writing` + `road-to-humanizer-hardening`)
98
-
99
- - **`humanizer` skill + `/humanize` command** (gtm-marketing pack) — remove
100
- AI-writing tells from deliverable prose (posts, articles, drafts) via a
101
- draft→audit→final loop; scoped to deliverable text only, never chat replies
102
- or repo docs.
103
- - **`detect_ai_tells.ts` detector** — deterministic hard-tell / weighted-cluster
104
- / em-dash-density scan (EN + DE), with a hidden-unicode ingestion scan and a
105
- ReDoS length bound on untrusted input.
106
- - **Behavior change — write-engine step 4b is default-on.** Ghostwriter /
107
- `post-as` drafts now pass a humanize audit before delivery; opt out per run
108
- with `--raw`. The mechanical detector pass runs when a Node runtime is
109
- present and degrades to a prose-only audit otherwise — the new
110
- `humanizer-runtime` doctor check reports which path an install gets.
111
- - **Disclosure footer stays inviolable** through the audit; quoted/secondhand
112
- text is never rewritten.
113
-
114
- ### Added — `agents/` directory contract + gitignore hygiene (`road-to-agents-dir-and-gitignore-hygiene`)
115
-
116
- - **`docs/contracts/agents-layout.md`** — authoritative contract for every top-level entry in `agents/` (purpose, git policy, retention, consumer-scope); includes the User Inbox Workflow (`agents/tmp/` → `agents/tmp.old/`).
117
- - **`src/config/agents-paths.yml`** — machine-readable classification manifest for all agent-managed paths; feeds the new CI freshness gate.
118
- - **`agents/tmp/` + `agents/tmp.old/` now covered in consumer `gitignore-block.txt`** — both dirs were previously unignored for consumers.
119
- - **New CI gates** (all wired into `task ci`):
120
- - `check-gitignore-freshness` — verifies every manifest entry is in the consumer block.
121
- - `check-generator-output-coverage` — every `generate_*` output root in `condense.ts` must be classified.
122
- - `check-tracked-but-ignored` — fails if any git-tracked file is now covered by an ignore pattern (makes the bench-run class of drift impossible to reintroduce).
123
- - `check-generated-artefact-headers` — validates freshness markers on regenerable analysis artefacts.
124
- - **`lint_agents_layout.ts` extended** — in source-repo mode, unknown **directories** at the `agents/` root are now CI errors (previously only flat files were checked); `CONSUMER_EXPECTED_ENTRIES` extended with the full consumer-scope allowlist.
125
- - **Janitor** (`task janitor` / `task janitor-apply`) — TTL sweep for `agents/tmp.old/` (30 days) and `agents/runtime/tmp/` (7 days); reports user inbox state and `.harvest-local/` size; never auto-sweeps the user inbox.
126
- - **`/sync-gitignore:fix` extended** (Steps 5–6) — now also reports ignored-but-tracked files with the exact `git rm --cached` commands, and runs the manifest coverage check.
127
- - **`/roadmap:create`** — moves consumed `agents/tmp/` files to `agents/tmp.old/` in the same reply (inbox workflow).
128
- - **`agent-docs-writing` skill** — documents the user inbox contract; redirected `prediction-pool` agent scratch from `agents/tmp/` to `agents/runtime/tmp/`.
129
-
130
- #### Migration
131
-
132
- If you have a consumer project:
133
-
134
- 1. Run `agent-config sync-gitignore --cleanup-legacy` to add `/agents/tmp/` and `/agents/tmp.old/` to your `.gitignore`.
135
- 2. Run `git ls-files -ci --exclude-standard` — if any files appear, run the printed `git rm --cached` commands and commit.
136
-
137
- ### Added — pack-scoped projection (opt-in, `road-to-6.0.0-b`)
138
-
139
- The projector can now write only the **active profile + packs'** artefacts into
140
- the host-tool trees instead of all 150 commands / 223 skills (ADR-040 —
141
- projection-time filtering, not a runtime resolver).
142
-
143
- - **Non-breaking by default.** A new `projection.mode` setting defaults to
144
- `legacy-all` — `npm update` to 6.0.0 changes nothing. Scoped projection is
145
- **opt-in** and never inferred from `profile.id`.
146
- - **Opt in** with `agent-config use --profile=<id>` (sets `projection.mode:
147
- scoped`), then `agent-config refresh` to re-project. Selected packs are the
148
- profile's base `packs` unioned with the `runtime.active_packs` session
149
- overlay, expanded over the `requires` graph. `agent-config use
150
- --profile=legacy-all` restores the full surface.
151
- - **Profiles are self-sufficient** — every `skills_hint` skill resolves from
152
- the profile's base packs (the new `profile.packs` field). Resolved in the AI
153
- council, 2026-06-03.
154
- - **Atomic.** A failed scoped projection restores the full (legacy-all) tree.
155
- The committed plugin marketplace (`.claude-plugin/`) and the Augment tree
156
- (`.augment/`) always project the full set in 6.0.0.
157
-
158
- **Staged rollout (this release ships 6.0.0 only):**
159
-
160
- 1. **6.0.0** — default `legacy-all` (opt-in profiles). *This release.*
161
- 2. **6.1.0** — default flips to profile/scoped mode with a `--legacy` escape.
162
- 3. **7.0.0** — removes `legacy-all` **only if** telemetry shows <10% usage.
163
-
164
- The default flip and removal are explicitly **out of scope** for 6.0.0 and
165
- gated on the telemetry from 6.0.0-C. Deferred to 6.0.0-C: a
166
- `skills_discoverable` field, reactive just-in-time pack activation, and the
167
- per-pack budget lint.
168
-
169
- ### Added — team mode: governed cross-model review (default-off, `road-to-team-mode`)
170
-
171
- A new default-off `/team` command family (`review`, `adversarial`, `delegate`,
172
- `status`) that governs the official `openai/codex-plugin-cc` as the Claude-Code
173
- transport — a second strong model reviewing the real working-tree diff (depth),
174
- the complement to the council's neutral-artefact breadth.
175
-
176
- - **Default-off + fail-closed.** With `ai_team.enabled: false` (default) no
177
- command is suggested and invocation prints an enable pointer — byte-identical
178
- to pre-roadmap behaviour. On Claude-Code hosts the wrappers are thin
179
- delegations to `/codex:*`; absent the plugin they fail closed with the
180
- `agent-config doctor --check team` remediation, never a silent no-op.
181
- - **Multi-host fallback (review lens only).** On non-Claude-Code hosts
182
- `/team:review` sends a size-capped repo-diff bundle through the existing
183
- subscription `OpenAICliClient`, with an honest capability-delta header.
184
- - **Governed, not rebuilt.** Nothing upstream-maintained is reimplemented; the
185
- Review-Gate stays upstream's (we add an opt-in loop-bound + ledger line), and
186
- `/team:delegate` (write access) sits behind a second opt-in
187
- `ai_team.allow_delegate: false`. Config: `docs/contracts/ai-team-config.md`.
188
- - **No quality claim yet.** Cross-model defect-finding lift is unproven until
189
- the Phase 5 benchmark runs (spend-gated); the docs describe workflow value
190
- only, never a lift claim.
191
-
192
- ### Breaking — v4.0.0 unified setup (`road-to-unified-setup`)
193
-
194
- `v4.0.0` is a **hard-cut** release. The legacy Python installer at
195
- `scripts/install.py` and the standalone TypeScript installer workspace
196
- at `packages/core/installer/{src,tests}` are no longer the canonical
197
- install path; the wizard now boots a single Fastify process at
198
- `agent-config install` / `agent-config setup` and drives the whole
199
- plan + apply through the TypeScript engine under `src/install/`.
200
-
201
- **Migrating from v3.x**
202
-
203
- 1. The first `agent-config install` run detects an existing v3 tree at
204
- `~/.event4u/agent-config/` and renders a **backup screen** before
205
- any write. Pick **"Backup v3 and proceed"** — the wizard copies the
206
- v3 layout to `~/.event4u/agent-config.v3.bak/` atomically and runs
207
- the v4 install against a clean slate.
208
- 2. No auto-migration runs. Rolling back is a single rename:
209
- `mv ~/.event4u/agent-config.v3.bak ~/.event4u/agent-config`.
210
- 3. Re-running `npx @event4u/agent-config install` against an active v3
211
- layout (without backup) is refused — silent overwrite is gone.
212
-
213
- **Removed / retired**
214
-
215
- - `packages/core/installer/{src,tests,package.json,tsconfig.json,
216
- vitest.config.ts}` (the standalone `@event4u/installer` workspace)
217
- and its workspaces declaration in the root `package.json`.
218
- - `/install-via-agent` command — its JSON agent-mode protocol shipped
219
- with the removed installer.
220
- - `task installer-typecheck` / `task installer-test` gates in
221
- `taskfiles/ci-fast.yml`.
222
-
223
- **Kept for one release**
224
-
225
- - `scripts/install.py` remains so the `curl | bash setup.sh` CURL
226
- fallback + `smoke-public-install.yml` CI matrix keep working. It is
227
- **not** invoked from the modern npx flow. Full removal is scheduled
228
- for v5.
229
-
230
- **New features (Phase B / C / E)**
231
-
232
- - Hard-stop **continue-screen** after Step 3 (modules) when entering
233
- via `agent-config install`; `setup` lands directly at Step 4
234
- (identity) via `?mode=setup`. (B5)
235
- - `WIZARD_READY <url>` line on stdout once Fastify is bound; the new
236
- `scripts/bootstrap.sh` watches for it so a Node bootstrap does not
237
- poll the port. (B4 + C1)
238
- - **Recovery-pre-step** — `GET /api/v1/install/recovery` surfaces an
239
- abort marker (Resume / Rollback / Ignore) when the previous run
240
- closed mid-apply. (B4 + Council Finding #24)
241
- - **v3 backup screen** — `GET /api/v1/install/legacy-v3` +
242
- `POST /api/v1/install/backup-v3` drive the migration. (E2 +
243
- Council Finding #21)
244
- - **Batch-conflict resolution** at ≥ 5 conflicts (B3 + Council
245
- Finding #19).
246
-
247
- **TypeScript CLI shell + local server foundation (`typescript-cli-and-local-gui-foundation`)** —
248
- Phase-5 cutover of the `agent-config` binary from a 955-line Bash
249
- dispatcher to a compiled TypeScript entry point. The shell handles
250
- native commands (`versions`, `doctor-shell`, `ui:serve`) and forwards
251
- every other subcommand to the legacy logic, now living at
252
- `scripts/_dispatch.bash`. New surfaces:
253
-
254
- - **TS bin entry** — `package.json#bin` flipped to
255
- `dist/cli/agent-config.js`. `npm run build:cli` compiles and
256
- `chmod +x`-es the entry; `scripts/prepack-check.mjs` runs on
257
- `npm pack` / `npm publish` and asserts the compiled file exists,
258
- is executable, and carries the Node shebang.
259
- - **Bash shim** — the old path `scripts/agent-config` is now a
260
- ~30-line deprecation shim that forwards to the TS binary. The real
261
- dispatch logic moved to `scripts/_dispatch.bash` to prevent the
262
- forward-and-back loop. Doctor probes both paths.
263
- - **Embedded Fastify server** — `agent-config ui:serve` boots a
264
- local server bound to `127.0.0.1`, on the first free port in
265
- `41000–41999`. Wire shape locked in
266
- [`docs/contracts/local-server-api.md`](docs/contracts/local-server-api.md)
267
- (beta): per-process bearer token, Host-header guard, Origin
268
- allow-list, `GET /api/v1/ping` liveness probe.
269
- - **CI gates** — `task lint-ts`, `task typecheck-ts`, `task test-ts`,
270
- `task build-ts` wired into `task ci` and `task ci-strict`. New
271
- GitHub Actions job `TypeScript Tests` runs the same harness across
272
- `ubuntu-latest` and `macos-latest` on Node 20, including the
273
- `prepack-check.mjs` gate.
274
- - **Test coverage** — 47 Vitest tests across
275
- `tests/cli/{paths,registry,cli-e2e}.test.ts`,
276
- `tests/server/{app,port,token}.test.ts`, and
277
- `tests/ui/build.test.ts`. CLI-e2e exercises the shim → dispatcher
278
- → TS round trip; server tests cover the auth gate and 421/403/401
279
- failure modes.
280
-
281
- Decision record: [`docs/decisions/ADR-012-typescript-cli-shell.md`](docs/decisions/ADR-012-typescript-cli-shell.md).
282
-
283
- **Discovery polish — `--root` override, doctor diagnostics, install-mode marker (`step-8-discovery-polish`)** —
284
- follow-up to step-7 driven by AI Council review of PR #157. Adds an
285
- explicit escape hatch for monorepos, surfaces the resolution decision
286
- path, and replaces install-mode heuristics with an authoritative
287
- marker file. New surfaces:
288
-
289
- - **Global `--root <dir>` flag** — parsed by the bash dispatcher
290
- before any subcommand and wins over every other channel (subcommand
291
- `--project`, `AGENT_CONFIG_PROJECT_ROOT` env-pin, anchor walk).
292
- Implemented as `AGENT_CONFIG_ROOT_OVERRIDE=1` +
293
- `AGENT_CONFIG_PROJECT_ROOT` plus a new `ORIGIN_ROOT_FLAG` so doctor
294
- can attribute the resolution. Wrapper-coupling warning emitted on
295
- stderr when `--root` overrides a wrapper-pinned env-pin.
296
- - **Fail-loud root validation** — `--root`, `--project`, and
297
- `AGENT_CONFIG_PROJECT_ROOT` all reject non-existent paths and
298
- non-directories via `ProjectRootError` mapped to exit code `2`. No
299
- silent CWD fallback when the operator explicitly named a path.
300
- - **`agent-config doctor --trace-root`** — read-only diagnostic that
301
- prints every ancestor probed during root discovery, the winning
302
- anchor, and the originating channel. `--json` for machine-readable
303
- output. Short-circuits the drift report.
304
- - **`agent-config doctor --context`** — prints effective project
305
- root, origin, install mode + source, settings-layer chain, wrapper
306
- state, and env-pin/override flags. `--json` available.
307
- - **Install-mode marker file** — `agents/.agent-state/install-mode.txt`
308
- written by `install.py` with `minimal\n` or `full\n`. Doctor uses
309
- the marker authoritatively for new installs; back-compat heuristic
310
- (`AGENTS.md` + copilot bridges) only fires when the marker is absent.
311
- - **Minimal-install upgrade hint** — `install.py` emits a stderr
312
- hint after a `--minimal` install describing how to upgrade to a
313
- full install when the user is ready.
314
- - **Test coverage** — `tests/test_root_override.py` (precedence,
315
- fail-loud for each channel, end-to-end CLI exit-2 check),
316
- `tests/test_doctor_trace.py` (text + JSON shape for both flags,
317
- marker-vs-heuristic install-mode detection, origin propagation).
318
- Twenty new tests, full suite green.
319
-
320
- Council artefacts:
321
- `agents/council-sessions/step-8-discovery-polish-decision.md` — 2
322
- rounds + peer-review, $0.12. Decision cut `template-gen` (A4) and
323
- `anchor-freeze AC` (A6), kept `--trace-root` and `--context` as two
324
- distinct flags (host override of Claude's consolidation proposal),
325
- and added the install-mode marker file as the hybrid resolution to
326
- Q5 (marker for new installs, filesystem heuristic for back-compat).
327
-
328
- **Agent-folder discovery + `--minimal` init (`step-7-agent-folder-discovery-and-minimal-init`)** —
329
- project-root discovery widens beyond `.git` so non-git checkouts,
330
- monorepo sub-trees, and `agent-config`-only worktrees resolve
331
- correctly, and a new minimal-init payload lets teams keep the
332
- runtime global while committing only the per-project shell. New
333
- surfaces:
334
-
335
- - **Boundary anchors (D1+D3)** — `.git` plus `agents/` containing
336
- **any** of `roadmaps/`, `.ai-council.yml`, `roadmaps-progress.md`.
337
- Bare `agents/` is **not** an anchor (false-positive guard). When
338
- no boundary anchor exists in any ancestor, the **outermost**
339
- `.agent-settings.yml` becomes the root so the layered-settings
340
- cascade survives. Same-level tiebreaker:
341
- `.agent-settings.yml` > `agents/` > `.git` (diagnostic anchor
342
- name only — resolved path is identical).
343
- - **`resolve_project_root(arg)` helper** (`scripts/_lib/agent_settings.py`)
344
- — single entry point used by every `cmd_*.py`. Precedence:
345
- explicit `--project`/`--target` → `AGENT_CONFIG_PROJECT_ROOT` env
346
- → anchor walk → CWD fallback. Returns `(root, origin)` so doctor
347
- can surface which step resolved.
348
- - **`AGENT_CONFIG_PROJECT_ROOT` env pin** — the `./agent-config`
349
- wrapper exports its own directory before forwarding to the master
350
- CLI, so subcommands invoked from a subdirectory (or after
351
- `os.chdir`) stay pinned to the right root without re-walking.
352
- - **`agent-config init --minimal`** — writes exactly three files:
353
- `.agent-settings.yml`, `agents/.gitkeep`, and the `./agent-config`
354
- wrapper. No `.augment/` / `.claude/` / `.cursor/` / `AGENTS.md`.
355
- Refuses to run when an ancestor already carries an anchor
356
- (nested-install guard); override with explicit `--target`.
357
- Does **not** pin `agent_config_version` (D4) — consumer follows
358
- the global CLI.
359
- - **`AGENT_CONFIG_LEGACY_ANCHOR=1` kill-switch (D5)** — reverts
360
- discovery to the pre-step-7 `.git`-only walk for one minor-version
361
- soak. Scheduled for removal after the soak window unless
362
- telemetry surfaces a missing case.
363
- - **Performance budget (D6)** — anchor walk is `O(depth)` with at
364
- most three `Path.exists()` calls per level. Test asserts
365
- `< 5 ms` at depth 20 (`tests/test_anchor_perf.py`).
366
- - **Test coverage** — `tests/test_project_root_anchors.py`
367
- (precedence, mixed-anchor edge case, bare `agents/` rejection),
368
- `tests/test_kill_switch.py`, `tests/test_minimal_init.py`
369
- (payload shape + nested-install refusal), `tests/test_subdir_invocation.py`
370
- (env-var precedence, wrapper-pin surviving `chdir`),
371
- `tests/test_anchor_perf.py`.
372
-
373
- Council artefacts: `agents/council-sessions/step-7-d3-cascade-conflict-{question,decision}.md`
374
- — D3 strict closest-leaf-wins was relaxed to boundary-vs-layer
375
- split after the analysis lens flagged four pre-existing cascade
376
- tests as the contract, not edge cases.
377
-
378
- **PR #150 follow-up hardening (`step-9-pr150-feedback-hardening`)** —
379
- twelve-phase response to the Claude+GPT review findings on PR #150 plus
380
- three user-requested settings-shape changes (CLI-default, preferred-single
381
- member, low-impact dispatch) under one roadmap. New surfaces:
382
-
383
- - **`defaults.member_mode: cli | api`** (default `cli`) — flips the
384
- global transport default to CLI-first onboarding (subscription auth,
385
- no API key). Per-member explicit `mode:` keeps overriding.
386
- - **`routing.solo_member_fallback_chain: [provider, ...]`** — ordered
387
- preference list for single-member dispatch. Disabled members are
388
- skipped; duplicates rejected at config-load time; all-invalid
389
- escalates to full council (never fails the decision). 15-minute
390
- auth cache, 3-second timeout per probe.
391
- - **`low_impact.dispatch: full | single`** (default `full`) — opt-in
392
- cost-efficient routing for low-impact decisions through
393
- `routing.solo_member_fallback_chain`. **Iron Law:** `high_impact`
394
- and `user_required` dispatch are NOT configurable — config validator
395
- rejects both top-level and `decision_resolution.classes.*` forms,
396
- including YAML `<<:` anchor smuggling attempts. Sentinel in
397
- `tests/test_iron_law_config.py`.
398
- - **Shadow-mode safety net** — when `low_impact.dispatch: single` is
399
- active, sample (default `0.1`) decisions go to both solo + full
400
- council. Disagreements append to `agents/council-shadow-log.jsonl`
401
- (privacy-redactor enforced). `agent-config council shadow-report`
402
- computes the 7-day rolling SLO (`OK <5%` / `WARN 5–8%` / `BREACH
403
- >8%`); pre-flight cost disclosure surfaces the verdict. No auto-
404
- revert — humans decide.
405
- - **Confidence gate — auto-escalation on uncertain solo runs**
406
- (`scripts/ai_council/confidence_gate.py`) — every solo response is
407
- scored before the verdict is returned. Four escalation reasons in
408
- priority order: `refusal` (empty / refusal markers), `split`
409
- (two-verdict / option-A-vs-B / Variante 1/2), `short_response`
410
- (< 20 chars), `low_confidence` (explicit `Confidence: 0.X` marker
411
- or hedge-word density below floor). Zero extra LLM calls —
412
- heuristics run in-process. Escalations append `escalated: true` +
413
- `escalation_reason` to `agents/council-shadow-log.jsonl`; the SLO
414
- banner appends the rolling auto-escalation rate so quiet uncertainty
415
- cannot hide behind a flat disagreement rate.
416
- - **`low_impact.solo_confidence_floor: float`** (default `0.7`,
417
- range `[0.0, 1.0]`) — threshold for the confidence gate.
418
- **Iron Law:** `solo_confidence_floor` is also rejected on
419
- top-level `high_impact:` and `user_required:` — those classes
420
- never run solo, so a solo-specific knob there is incoherent.
421
- - **`AGENT_CONFIG_FORCE_FULL_COUNCIL=1`** — per-invocation kill-switch
422
- that forces full council regardless of `low_impact.dispatch`.
423
- - **Airgap detection** (`scripts/ai_council/airgap.py`) — installer
424
- first-run probes DNS for `api.anthropic.com`, `api.openai.com`,
425
- `generativelanguage.googleapis.com` with 1s timeout per host. All
426
- fail → banner `airgapped environment detected — defaulting to
427
- mode: api` and `defaults.member_mode: api` recommendation.
428
- - **Fast-path marker visibility Iron-Law rule**
429
- (`.agent-src.uncondensed/rules/fast-path-marker-visibility.md`,
430
- kernel-tier, always-active) — host agents MUST surface
431
- `Resolved via low-impact council fast-path: …` markers verbatim;
432
- swallowing them is a rule violation.
433
- - **`/memory learn-low-impact --preview`** (default) / `--apply` —
434
- preview shows promoted entries, refused entries with redaction
435
- reasons, source-project-stripped diff, and the upstream PR body
436
- draft before anything is written.
437
- - **Corpus parser hardening** — typed `CorpusParseError(reason=...)`
438
- replaces silent skip; seven failure-mode fixtures in
439
- `tests/fixtures/corpus-robust/` (missing anchor · renamed heading ·
440
- bullet-without-quotes · duplicate entry · anti-example wrongly
441
- under Validated · malformed ISO timestamp · redactor-bypass).
442
- Contract in `docs/contracts/low-impact-corpus-format.md`.
443
- - **Fuzzy corpus matching (opt-in)** —
444
- `low_impact.fuzzy_match.{enabled,threshold}` (defaults `false`,
445
- `0.92`) using `difflib.SequenceMatcher`. High-impact trigger veto
446
- + anti-example veto preserve the Iron Law.
447
- - **CLI-binary UX** — pre-flight cost disclosure now prints
448
- `member X skipped: binary not found, install via <hint>` per
449
- skipped CLI member; hints sourced from
450
- `scripts/ai_council/cli_hints.py`.
451
- - **Doctor CLI checks** — `agent-config doctor --check council-cli`
452
- reports per CLI member: binary present · auth probe · parse
453
- fixture · quota remaining · billable flag.
454
- - **Iron-Law bypass linter** — `audit_cloud_compatibility.py
455
- --iron-law` scans `scripts/` for raw YAML loads of `ai-council.yml`
456
- that skip the config validator; baseline is 0 findings; suppress
457
- legitimate cases with `# iron-law-ok: <reason>` on the load line.
458
-
459
- Surface delta: **4 new config knobs** (`defaults.member_mode`,
460
- `routing.solo_member_fallback_chain`, `low_impact.dispatch`,
461
- `low_impact.solo_confidence_floor`),
462
- **1 new env-var kill-switch** (`AGENT_CONFIG_FORCE_FULL_COUNCIL`),
463
- **1 new CLI subcommand** (`council shadow-report`), **1 new CLI flag**
464
- (`council run --single`), **1 new always-active rule**
465
- (`fast-path-marker-visibility`), **2 new local-only files**
466
- (`agents/council-shadow-log.jsonl`, gitignored;
467
- `scripts/ai_council/airgap.py`). Backward-compat: defaults map the
468
- existing behaviour (`dispatch=full`, empty chain, `member_mode=cli`
469
- in fresh installs; existing configs read unchanged). No migration
470
- script — defaults are silent-safe.
471
-
472
- **Low-impact corpus YAML lockfile (`step-10-corpus-yaml-lockfile`)** —
473
- follow-up to the PR #150 review (Punkt 4): the Markdown parser used to
474
- be the runtime source-of-truth for the low-impact decisions corpus,
475
- making every human edit-variation (curly quotes, bullet style,
476
- whitespace, heading rename) a potential parser bomb on the hot path.
477
- Switched the runtime to a generated YAML lockfile while keeping
478
- Markdown as the human-editable source. New surfaces:
479
-
480
- - **`scripts/ai_council/compile_corpus.py`** — build tool that runs
481
- `parse_corpus_strict()` over `agents/low-impact-decisions.md` and
482
- emits `agents/low-impact-decisions.lock.yaml` (schema-v1, sorted
483
- keys, deterministic). `--check` mode exits `1` on drift, `2` on
484
- parse error.
485
- - **`agents/low-impact-decisions.lock.yaml`** — generated, **committed**
486
- lockfile. Schema `{schema_version: 1, provenance: {source_path,
487
- source_sha256, last_upstreamed}, validated, probation, anti_examples}`.
488
- Diffed in PR reviews alongside the Markdown source.
489
- - **`low_impact_corpus.load_corpus_lock()`** — new primitive that
490
- loads the YAML lockfile and re-materialises a `CorpusParseResult`.
491
- Schema-version mismatch raises `CorpusParseError` with reason
492
- `schema_version_mismatch`.
493
- - **Lenient loaders prefer YAML** — `load_validated_phrases` and
494
- `load_anti_example_phrases` (consumed by `necessity.py` and
495
- `low_impact.py` on the hot path) check for the sibling `.lock.yaml`
496
- first. Missing / malformed lockfile → silent fallback to lenient
497
- Markdown parsing, so a fresh clone before `task sync` still works.
498
- - **CI gate** — `task compile-corpus` runs as part of `task sync` and
499
- `task consistency` (before `git diff --quiet`). A stale lockfile
500
- fails CI the same way `.agent-src/` drift does.
501
- - **Preview tool unchanged** — `learn_low_impact_preview.py` keeps
502
- reading the Markdown directly via `parse_corpus_strict`; it runs
503
- *before* `task sync` rebuilds the lockfile, so it must read whatever
504
- the user just edited.
505
-
506
- The Markdown parser stays in the repo as a build-time dependency, not
507
- a runtime dependency — a parser regression breaks `task consistency`,
508
- never the live council. Privacy floor (`low-impact-corpus-privacy-floor`)
509
- unchanged: the redactor scans entry text, not file format.
510
-
511
- **Council quota & necessity transparency (`step-8-quota-necessity-transparency`)** —
512
- the council's two pre-flight gates (`cli_call_budget` and
513
- `necessity_classifier`) become observable and aligned with the
514
- "Council always active when enabled" mental model. New surfaces:
515
-
516
- - `council run` / `council debate` print a one-line
517
- `council:quota · <provider> used/limit · …` summary before the
518
- first member fires. Only providers with a configured per-day cap
519
- appear; uncapped providers are omitted (no false metering).
520
- - `cli_call_budget.warn_at` (float, default `0.8`) — once
521
- `used / max_calls_per_day >= warn_at`, the summary line is
522
- prefixed `⚠️` and a `council:quota · WARN` line names the
523
- providers near the wall.
524
- - New `agent-config council quota` subcommand dumps today's
525
- `~/.event4u/agent-config/cli-calls.json` state plus the configured
526
- caps. `--reset <provider> --confirm` clears today's counter for one
527
- provider for manual rollover.
528
- - **Necessity tier split (D2):** `necessity_classifier.user_explicit_mode`
529
- (default `warn-only`) separates the agent and user_explicit tiers.
530
- User-typed `/council` calls proceed by default with an annotated
531
- stdout line; agent-initiated dispatches keep `educate` behaviour.
532
- New `warn-only` mode joins the existing `off | educate | block`
533
- enum — annotates the verdict but never skips.
534
- - **Persistent events log (D3):** every necessity-gate decision
535
- (`proceed` / `skip_necessity`) and every quota block
536
- (`block_quota`) appends one JSON line to `agents/council-events.log`
537
- (gitignored; never committed). Schema v1 with `schema_version`,
538
- `ts_utc`, `lens`, `invocation`, `action`, `verdict`,
539
- `provider_caps`, `original_ask_hash`. `original_ask` is hashed
540
- `sha256[:12]` before write — the raw prompt is never persisted
541
- (privacy floor per `agents/low-impact-decisions.md`).
542
- - **Kill-switch (D5):** `AGENT_CONFIG_NO_EVENTS_LOG=1` disables
543
- every events-log write in-process. Mirrors the
544
- `AGENT_CONFIG_LEGACY_ANCHOR=1` pattern from step-7.
545
-
546
- Surface delta: **1 new subcommand** (`council quota`), **2 new
547
- config knobs** (`cli_call_budget.warn_at`,
548
- `necessity_classifier.user_explicit_mode`), **1 new local-only file**
549
- (`agents/council-events.log`, gitignored). Backward-compat:
550
- existing `.agent-settings.yml` and `agents/.ai-council.yml` work
551
- unchanged; new knobs are optional. Docs:
552
- [`docs/contracts/ai-council-config.md`](docs/contracts/ai-council-config.md)
553
- + [`docs/installation.md`](docs/installation.md) § AI Council local
554
- state.
555
-
556
- Four roadmaps land in this release.
557
-
558
- **Tier-0 trim (`road-to-surface-discipline` Phase 1)** — six CLI
559
- commands moved from Tier-0 to Tier-1 in `./agent-config --help` to
560
- collapse the daily-driver surface down to the seven commands a new
561
- contributor actually needs in their first session. Commands stay
562
- fully invokable by full name — only the default `--help` view
563
- changed. Source of truth: `docs/contracts/command-surface-tiers.md`.
564
-
565
- Pre/post diff of `./agent-config --help` Tier-0 block:
566
-
567
- | Command | Pre | Post | Rationale |
568
- |---|:-:|:-:|---|
569
- | `init` | Tier-0 | Tier-0 | daily-driver entrypoint |
570
- | `sync` | Tier-0 | Tier-0 | daily-driver entrypoint |
571
- | `validate` | Tier-0 | Tier-0 | daily-driver entrypoint |
572
- | `work` | Tier-0 | Tier-0 | daily-driver entrypoint |
573
- | `implement-ticket` | Tier-0 | Tier-0 | daily-driver entrypoint |
574
- | `help` | Tier-0 | Tier-0 | help meta-command |
575
- | `--version` | Tier-0 | Tier-0 | help meta-command |
576
- | `first-run` | Tier-0 | **Tier-1** | one-time setup; not in daily loop |
577
- | `keys:install-anthropic` | Tier-0 | **Tier-1** | one-time credential setup |
578
- | `keys:install-openai` | Tier-0 | **Tier-1** | one-time credential setup |
579
- | `council:estimate` | Tier-0 | **Tier-1** | on-demand review tool |
580
- | `council:run` | Tier-0 | **Tier-1** | on-demand review tool |
581
- | `council:render` | Tier-0 | **Tier-1** | on-demand review tool |
582
-
583
- Net surface delta: **0 new commands, 0 removed commands.** Only the
584
- `--help` surfacing changed. Run `./agent-config --help --tier=1` for
585
- the full power-user view (15 commands) or `--tier=all` for
586
- maintenance / hooks / MCP / telemetry (26 additional commands).
587
-
588
- **Diagnostic Hub (`road-to-surface-discipline` Phase 2)** — the
589
- existing `./agent-config doctor` is repositioned as the single
590
- entrypoint for health checks. New `CHECK_IDS` registry plus
591
- `doctor --check <id>` filter; `--list-checks` enumerates every
592
- runner; failing checks print the literal command line that
593
- reproduces the failure. Surface delta: **0 new commands** — only
594
- flags and registry plumbing.
595
-
596
- **MCP beta gating (`road-to-surface-discipline` Phase 3)** — MCP
597
- promotion criteria pinned in
598
- [`docs/contracts/mcp-beta-criteria.md`](docs/contracts/mcp-beta-criteria.md)
599
- with a four-gate contract (offline-readiness, scope, drift, runtime).
600
- `doctor --check mcp-beta-readiness` enforces the gates; failing tests
601
- under `tests/test_mcp_beta_gates.py` codify the promotion bar.
602
- Cloud-scope behaviour cross-referenced from
603
- [`docs/contracts/mcp-cloud-scope.md`](docs/contracts/mcp-cloud-scope.md).
604
-
605
- **Architecture refresh (`road-to-surface-discipline` Phase 4)** —
606
- [`docs/architecture.md`](docs/architecture.md) and
607
- [`docs/mcp-server.md`](docs/mcp-server.md) re-anchor the 6-layer
608
- system model (consumer → tools → installer → package → kernel →
609
- runtime). `AGENTS.md` re-trimmed to honour the Thin-Root contract
610
- (< 3,000 chars). No code churn — docs only.
611
-
612
- **Tier-usage telemetry (`road-to-surface-discipline` Phase 5)** —
613
- empirical retiering signal added behind a default-off opt-in. New
614
- `telemetry.tier_usage` namespace in `.agent-settings.yml`; signal
615
- contract pinned in
616
- [`docs/contracts/command-clusters.md`](docs/contracts/command-clusters.md)
617
- § tier-usage (whitelist: `ts_bucket`, `command`, `tier`, `outcome`,
618
- `user_hash`; hourly time buckets; 16-char salted user hash; no paths,
619
- no argv). Retiering thresholds (≥ 20 invocations and ≥ 3 distinct
620
- users over 30 days) live in the same contract. A new
621
- `tier_usage_report.py` template script aggregates the local log into
622
- a frequency table and refuses to render rows that violate the
623
- privacy floor. The existing `doctor` gains a `tier-usage-readiness`
624
- check (warn when disabled or empty; fail when every record is
625
- poisoned; ok when ≥ 1 record passes the floor). Surface delta: **0
626
- new commands, 0 new skills, 0 new personas** — telemetry rides on
627
- the existing dispatcher and the existing `doctor` entrypoint.
628
-
629
-
630
- **Package consolidation** — the standalone wrapper package
631
- `@event4u/create-agent-config` is retired. `npx @event4u/agent-config init`
632
- is now the canonical one-shot entrypoint; the bundle package gains an
633
- `init` subcommand that delegates to `scripts/install`. `packages/create-agent-config/`
634
- is removed from the repo, and every doc / template / help string is
635
- updated to the new command. Existing users running the old wrapper
636
- should switch — the old package name will stop receiving releases.
637
-
638
- **Global-First Install (R4)** — `npx @event4u/agent-config init`
639
- now defaults to a **global** install (`~/.claude/`, `~/.cursor/`, …)
640
- when run outside a project, and a **project** install when run inside
641
- one. A new global lockfile at `~/.config/agent-config/installed.lock`
642
- records `agent_config_version` + `tools[]` and refuses mismatched
643
- re-installs (exit 1) until `update` or `--force` realigns it. New
644
- `agent-config export --tool=<id> --output=<path>` subcommand ejects a
645
- named tool's resolved content into the project tree (idempotent;
646
- `--force` overrides drift). 12 supported tool ids (claude-code,
647
- cursor, windsurf, cline, aider, codex, gemini, copilot,
648
- claude-desktop, continue, kilocode, zed, jetbrains, kiro). Windows
649
- CI matrix added for the lockfile + export paths. See
650
- [`docs/decisions/ADR-007-agent-discovery-scopes.md`](docs/decisions/ADR-007-agent-discovery-scopes.md)
651
- and [`docs/decisions/ADR-008-installed-tools-manifest.md`](docs/decisions/ADR-008-installed-tools-manifest.md).
652
-
653
- Three roadmaps land in this release.
654
-
655
- **Universal Execution Engine (R1)** — the `/implement-ticket` runtime is
656
- renamed and re-shaped into a universal dispatcher. **No user-visible
657
- behavior change** — the `/implement-ticket` slash command and the
658
- `./agent-config implement-ticket` CLI are byte-stable, gated by the
659
- new Golden-Transcript replay harness.
660
-
661
- **Prompt-Driven Execution (R2)** — a new `/work` command drives free-form
662
- prompts through the same `work_engine` dispatcher with a
663
- confidence-band gate at `refine`. R1 goldens remain byte-equal across
664
- the R2 changes.
665
-
666
- **Product UI Track (R3)** — three new directive sets (`ui`,
667
- `ui-trivial`, `mixed`) turn UI work from "writes the code" into
668
- "produces UI that feels designed". An existing-UI audit is enforced
669
- as a hard gate before any `apply`; design briefs lock microcopy
670
- verbatim; polish has a 2-round ceiling. Stack-aware dispatch routes
671
- implementation to `blade-livewire-flux` / `react-shadcn` / `vue` /
672
- `plain` skill bundles. Happy-path halt budget is 2 (audit pick +
673
- design sign-off). R1 + R2 goldens stay byte-equal; 12 new GT-U
674
- baselines pin the R3 contract.
675
-
676
- ### Features
677
-
678
- * **engine:** universal `work_engine` Python module with explicit
679
- `version: 1` state schema, `directive_set` envelope (backend / ui-stub
680
- / mixed-stub), and `input.kind`-based dispatch ready for prompt-driven
681
- and UI directives in R2 / R3.
682
- * **migration:** `work_engine.migration.v0_to_v1` auto-migrates
683
- `.implement-ticket-state.json` → `.work-state.json` on first run;
684
- v0 file preserved as `.implement-ticket-state.json.bak`. Idempotent
685
- and refuses to overwrite an existing v1 destination.
686
- * **tests:** Golden-Transcript replay harness with 5 live-captured
687
- baseline transcripts (`tests/golden/baseline/GT-{1..5}/`),
688
- `CHECKSUMS.txt` SHA-256 manifest, four strict comparators
689
- (exit codes, state-snapshot structure, halt-marker shape, delivery
690
- report headings) with allow-listed free-text drift on `questions`
691
- and `report` bodies. Both pytest (`tests/golden/test_replay.py`) and
692
- CLI (`python3 -m tests.golden.harness`) entry points.
693
- * **command:** `/work` — sibling entrypoint to `/implement-ticket` that
694
- drives free-form prompts through the same `work_engine` dispatcher
695
- with `input.kind="prompt"`. Backed by the `command-routing` and
696
- `refine-prompt` skills.
697
- * **engine (R2):** prompt resolver (`work_engine.resolvers.prompt`)
698
- builds the prompt envelope; `directives/backend/refine.py::_run_prompt`
699
- reconstructs acceptance criteria, scores the prompt on five
700
- dimensions, and dispatches on the resulting band.
701
- * **scoring:** deterministic, heuristic-only confidence scorer at
702
- `work_engine.scoring.confidence` — single source of truth for the
703
- rubric (`goal_clarity`, `scope_boundary`, `ac_evidence`, `stack_data`,
704
- `reversibility`) and band thresholds (`high ≥ 0.8`, `medium ≥ 0.5`,
705
- `low < 0.5`).
706
- * **band-action gate:** silent proceed on `high`, assumptions-report
707
- halt on `medium`, one-question halt on `low` (per the
708
- `ask-when-uncertain` Iron Law).
709
- * **tests (R2):** four new Golden Transcripts (`GT-P1` high-band happy,
710
- `GT-P2` medium-band release, `GT-P3` low-band one-question halt,
711
- `GT-P4` UI-intent rejection — superseded by the R3 UI track but kept
712
- to pin pre-R3 behaviour) pinned alongside the R1 goldens.
713
-
714
- ### Changed
715
-
716
- * **engine (refactor):** internal Python module renamed
717
- `implement_ticket` → `work_engine`. Public CLI surface, slash command,
718
- user-facing prompts, halts, and delivery report are unchanged. State
719
- filename moves from `.implement-ticket-state.json` to `.work-state.json`
720
- with auto-migration.
721
- * **engine (R2):** `refine` SUCCESS paths now mirror
722
- `data["reconstructed_ac"]` into `state.ticket["acceptance_criteria"]`
723
- as an independent list copy, so downstream gates (`analyze`, `plan`)
724
- read the same AC slot regardless of envelope kind.
725
-
726
- ### Deprecated
727
-
728
- * **`implement_ticket` Python module** — re-export shim retained for
729
- backwards compatibility; emits `DeprecationWarning` on import.
730
- Internal Python consumers should migrate to `from work_engine import …`.
731
- Removal is a separate user-driven decision, not pinned to a release.
732
-
733
- ### CI
734
-
735
- * **freeze-guard:** named `task golden-replay` step in `Taskfile.yml`
736
- and a dedicated `Golden Replay` step in `.github/workflows/tests.yml`,
737
- both invoked before the main pytest sweep so structural regressions
738
- surface first. Freeze-guard workflow rejects baseline edits outside
739
- `R1-P1`-tagged commits.
740
- * **roadmap-progress-check** wired into `task ci` (1.13.0 carry-over).
741
-
742
- ### Documentation
743
-
744
- * **ADR (R1):** [`agents/contexts/adr-work-engine-rename.md`](agents/contexts/adr-work-engine-rename.md)
745
- — rationale, scope of the rename, compatibility shim policy, state
746
- migration, golden-test contract, tradeoffs, non-goals.
747
- * **ADR (R2):** [`docs/contracts/adr-prompt-driven-execution.md`](docs/contracts/adr-prompt-driven-execution.md)
748
- — naming decision (`/work` over `/do`), confidence-band gate,
749
- AC-projection fix, R3 deferral boundary, and golden contract.
750
- * **flow:** `docs/contracts/implement-ticket-flow.md` gains a "Replay
751
- protocol — Strict-Verb comparison" section (R1) and a
752
- "Prompt envelopes and confidence bands (R2)" section pinning the
753
- band-action mapping to the scorer module.
754
- * **README + AGENTS.md template:** document `/work` as the sibling
755
- entrypoint, the confidence-band rubric, and the
756
- `/work` vs. `/implement-ticket` selection rule.
757
- * **rules:** `scope-control` forbids release / version / deprecation-date
758
- language in roadmaps, plans, and ADRs; introduces a `Decline = silence`
759
- policy preventing branch-switch and PR proposals from being re-asked
760
- on the same task.
761
-
762
- ### Features (R3 — Product UI Track)
763
-
764
- * **directive sets:** `directives/ui/` (`audit → design → apply →
765
- review → polish → report`), `directives/ui_trivial/` (provably
766
- bounded edits, `MAX_FILES = 1` and `MAX_LINES_CHANGED = 5`), and
767
- `directives/mixed/` (`contract → ui → stitch`). Dispatched at the
768
- engine boundary on `state.directive_set`; the audit gate is enforced
769
- at the dispatcher AND at always-on rule level
770
- ([`ui-audit-gate`](.agent-src/rules/ui-audit-gate.md))
771
- so cloud surfaces and free-form edits cannot bypass it.
772
- * **stack detection:** `scripts/work_engine/stack/detect.py` reads
773
- `composer.json` + `package.json` and labels the frontend as
774
- `blade-livewire-flux` / `react-shadcn` / `vue` / `plain`. Cached on
775
- `state.stack` against manifest `mtime`; recoverable on parse error
776
- (downgrades to `plain`). `apply` / `review` / `polish` route on the
777
- label.
778
- * **audit gate:** `state.ui_audit` must carry `≥ 1 components_found`
779
- OR `greenfield = True` with a user-chosen `greenfield_decision` ∈
780
- `{scaffold, bare, external_reference}`. Empty dict, `None`, or
781
- populated-without-keys is rejected; the dispatcher emits
782
- `@agent-directive: existing-ui-audit` and refuses to advance.
783
- * **design brief lock:** `apply` rejects components carrying
784
- `PLACEHOLDER_PATTERNS` (`<placeholder>`, `lorem`, `todo:`, `tbd`,
785
- `xxx`); both producer and consumer enforce.
786
- * **polish ceiling:** hard `POLISH_CEILING = 2` rounds, validated at
787
- in-memory state, on-disk schema, AND dispatcher layers. After round
788
- 2 the engine halts with ship-as-is / abort / hand-off.
789
- * **token-violation extraction:** polish classifies
790
- `kind == "token_violation"` findings against
791
- `state.ui_audit.design_tokens`; matched values use the named token,
792
- unmatched values repeated > `TOKEN_REPEAT_THRESHOLD = 2` times
793
- trigger token extraction before the next round.
794
- * **trivial-path reclassification:** `directives/ui_trivial/apply.py`
795
- flips `state.directive_set = "ui"` when the bounded preconditions
796
- fail, restarting the dispatcher at audit. Reclassification is loud
797
- and counted in the delivery report.
798
- * **mixed orchestration:** sentinels `state.contract.contract_confirmed`
799
- (UI sub-flow refuses to start without it) and
800
- `state.stitch.verdict = "success"` (stitch's success condition;
801
- `blocked` / `partial` halts unless `integration_confirmed` flips).
802
- * **skills:** new `existing-ui-audit`, `react-shadcn-ui`, plus
803
- stack-specific apply / review / polish bundles. `fe-design`
804
- repositioned as a framework-agnostic reference cited by
805
- `directives/ui/design.py`.
806
- * **tests (R3):** twelve new Golden Transcripts (`GT-U1`..`GT-U4`,
807
- `GT-U9`..`GT-U12`) covering high-confidence happy path
808
- (1 halt budget), ambiguous (2 halts max), greenfield decisions,
809
- trivial-path apply, polish ceiling hit, and mixed orchestration.
810
- All R1 + R2 + R3 baselines auto-discovered by `tests/golden/test_replay.py`.
811
-
812
- ### Documentation (R3)
813
-
814
- * **ADR (R3):** [`docs/contracts/adr-product-ui-track.md`](docs/contracts/adr-product-ui-track.md)
815
- — audit-as-hard-gate rationale, design-review loop, halt-budget
816
- reasoning, trivial-path-and-reclassification, stack-detection
817
- strategy, fe-design migration, tradeoffs, non-goals.
818
- * **flow contract:** [`docs/contracts/ui-track-flow.md`](docs/contracts/ui-track-flow.md)
819
- — slot-by-slot wiring for `ui` / `ui-trivial` / `mixed`, the
820
- audit-path table (`STRONG_SIMILARITY = 0.7`, `TIE_GAP = 0.05`),
821
- design-brief lock + placeholder patterns, stack-dispatch tables,
822
- polish ceiling, trivial preconditions, mixed sentinels,
823
- idempotency table, declared ambiguities across all eight directives.
824
- * **extension recipe:** [`docs/contracts/ui-stack-extension.md`](docs/contracts/ui-stack-extension.md)
825
- — how to add a new stack (Svelte, SolidJS, Astro, …): label
826
- conventions, detector heuristic, three required skills, dispatch
827
- wiring, version anchor, Golden fixture, end-to-end verification.
828
- * **README + AGENTS.md template:** UI track flow table (`ui` /
829
- `ui-trivial` / `mixed`), audit-gate property, design-brief lock,
830
- polish ceiling, stack-dispatch summary; the pre-R3 "rejected,
831
- backend-only" wording is removed.
832
- * **golden test capture:** [`tests/golden/CAPTURING.md`](tests/golden/CAPTURING.md)
833
- — central regeneration recipe, lock policy, when to relock; replaces
834
- 17 per-baseline `reproduction-notes.md` files (the loadable artefacts
835
- — `transcript.json`, `state-snapshots/`, `halt-markers.json`,
836
- `exit-codes.json`, `delivery-report.md` — stay).
837
-
838
- ### Archived (R3)
839
-
840
- * **roadmap:** `agents/roadmaps/intent-based-orchestration.md` moved to
841
- `agents/roadmaps/archive/`; superseded by R1 + R2 + R3.
842
-
843
- **Artefact-Engagement Telemetry** — opt-in, default-off measurement layer
844
- that records which skills, rules, commands, and guidelines the agent
845
- consults and applies during a `/implement-ticket` or `/work` run.
846
- Maintainer-targeted; consumers see no prompts.
847
-
848
- ### Features
849
-
850
- * **telemetry:** `./agent-config telemetry:record` and
851
- `./agent-config telemetry:report` CLI scripts + `telemetry/` Python
852
- package (boundary, aggregator, renderer, schema). Default-off via
853
- `telemetry.artifact_engagement.enabled` in `.agent-settings.yml`.
854
- * **schema:** `schema_version: 1` JSONL events with `task_id`,
855
- `boundary_kind`, `consulted` / `applied` (kind→ids), `ts`,
856
- `tokens_estimate`. Aggregator silently skips lines with unknown
857
- schema versions.
858
- * **report:** quartile bucketing on applied/consulted ratio — Essential
859
- (top 20 %), Useful (mid 60 %), Retirement Candidates (bottom 20 %) —
860
- emitted as Markdown or JSON.
861
- * **rule:** `artifact-engagement-recording` — fires per phase-step
862
- inside `/implement-ticket` and `/work`; no-op under the default-off
863
- gate so the recording path costs nothing when disabled.
864
- * **privacy:** `check_id_redaction` validator enforces a redaction
865
- floor (no path separators, no file extensions, no control characters,
866
- no whitespace, non-empty) on **both** write and export. Tampered or
867
- legacy logs cannot leak through reports — renderer re-validates.
868
- * **tests:** 36 redaction test cases plus end-to-end CLI coverage
869
- in `tests/telemetry/`.
870
-
871
- ### Documentation
872
-
873
- * **ADR:** [`agents/contexts/adr-artifact-engagement.md`](agents/contexts/adr-artifact-engagement.md)
874
- — rationale, default-off doctrine, privacy contract, schema
875
- versioning, deprecation horizon.
876
- * **flow:** `docs/contracts/artifact-engagement-flow.md` is the
877
- cross-cutting reference for what gets recorded, when, and under
878
- which constraints; includes the maintainer hand-audit recipe.
879
- * **AGENTS.md + README.md:** short *Maintainer telemetry (opt-in)*
880
- pointer; consumers see nothing.
881
- * **`/onboard`:** Step 9 emits a one-screen maintainer-only hint
882
- describing the feature; no question, no prompt.
883
-
884
- **Context-Aware Command Suggestion** — deterministic, read-only layer
885
- that surfaces eligible slash commands as numbered options when a
886
- non-`/`-prefixed user prompt matches their `suggestion.trigger_*`
887
- frontmatter. **Nothing auto-executes** — the user picks every time;
888
- the as-is option is always present and always last.
889
-
890
- ### Features
891
-
892
- * **engine:** `scripts/command_suggester/` Python package
893
- (`match` / `rank` / `cooldown` / `sanitize` / `render` / `loader`).
894
- Heuristic-only scoring (substring + Jaccard token overlap +
895
- structural-bonus boosts), per-conversation cooldown keyed on
896
- `(command, evidence)`, and a sanitiser that strips fenced + inline
897
- code blocks plus the suggester's own previous block shape before
898
- scoring.
899
- * **rule:** `command-suggestion` (always-on) — emits one
900
- numbered-options block per turn under the `user-interaction` Iron
901
- Law. Subordinate to `scope-control`, `ask-when-uncertain`,
902
- `verify-before-complete`, and any active role-mode contract or
903
- engine halt; on conflict → silent.
904
- * **frontmatter:** every command carries
905
- `suggestion.eligible` (default `true`) plus a flat
906
- `trigger_description` + `trigger_context` pair (linter-validated,
907
- ≥ 10 chars each). Locked eligibility table at
908
- [`agents/contexts/command-suggestion-eligibility.md`](agents/contexts/command-suggestion-eligibility.md).
909
- * **settings:** `commands.suggestion` block in
910
- `.agent-settings.yml` — `enabled` (global), `blocklist`
911
- (per-command), `confidence_floor` (default `0.6`), `cooldown`
912
- (default `10m`), `max_options` (default `4`, plus the always-extra
913
- as-is option). Per-command overrides via frontmatter.
914
- * **opt-out paths (3):** global (`enabled: false`), per-command
915
- (`blocklist`), per-conversation (`/command-suggestion-off` /
916
- `/command-suggestion-on` directives detected by `cooldown.py`).
917
- * **anti-noise heuristics:** sub-floor suppression, lonely-match
918
- guard within `floor + 0.1`, vague-prompt guard (< 6 words +
919
- > 2 matches without structural bonus), continuation-phrase guard
920
- (`ok`, `weiter`, `continue`, …). Structural bonuses (ticket key,
921
- file path) override every suppressor.
922
- * **tests:** 84 unit cases in `tests/test_command_suggester.py`
923
- (matcher, rank, cooldown, sanitiser, render, settings, directive)
924
- plus 9 GT-CS goldens in `tests/test_command_suggester_goldens.py`
925
- (single-match, tie-break, sub-floor, slash-bypass, as-is pick,
926
- cooldown, settings off, clarification-wins, adversarial echo).
927
- * **no behavioural change to slash invocation:** explicit `/command`
928
- bypasses the suggester entirely; per-command halts intact.
929
-
930
- ### Documentation
931
-
932
- * **ADR:** [`docs/contracts/adr-command-suggestion.md`](docs/contracts/adr-command-suggestion.md)
933
- — "suggest, never invoke" anchor, eligibility rubric, anti-noise
934
- heuristics, hardening list, three opt-out paths.
935
- * **flow:** [`docs/contracts/command-suggestion-flow.md`](docs/contracts/command-suggestion-flow.md)
936
- — scoring breakdown, evidence semantics, subordination order, and
937
- hardening tests.
938
- * **README + AGENTS.md:** short *Context-aware command suggestion*
939
- section pointing to the ADR and the flow doc.
940
-
941
- **Install-path pruning (relabel only)** — `docs/installation.md`
942
- reorders install paths by recommendation prominence. Composer + npm
943
- remain the default; manual / submodule / VS Code Git URL are tagged
944
- `advanced`; Claude.ai Web Skills UI is tagged `experimental`; Linear
945
- AI workspace guidance is tagged `staged`. **No installer or shipped
946
- artefact is removed in 1.15.0** — every path on the page still works
947
- and is still tested. The labels describe how prominent the path is in
948
- our recommendation order, not its support status.
949
-
950
- ### Documentation
951
-
952
- * **`docs/installation.md`:** new label table at the top
953
- (`(no label)` / `advanced` / `experimental` / `staged`) plus a
954
- preamble that calls out the no-removal contract explicitly. Section
955
- headers carry their label inline for skim-readers.
956
- * **rationale:** see R9 in
957
- [`agents/roadmaps/archive/road-to-post-pr29-optimize.md`](agents/roadmaps/archive/road-to-post-pr29-optimize.md)
958
- — relabelling addresses the "four install paths at zero external
959
- users" tension without removing any path that an existing user
960
- might rely on.
19
+ ### Added
20
+
21
+ - **Internet-reach operator tooling** — upstream-tool health and install-pinning
22
+ discipline for the tools a reach recipe needs. The router skill this was
23
+ scoped around was **cancelled pre-authoring by its own benchmark gate**: the
24
+ pre-registered run returned 0/12 outright wins against the host's native web
25
+ tools (`band: stop`), so no skill, no triggers, no capability-area claim. The
26
+ null is published in [`docs/benchmark.md`](docs/benchmark.md) § internet-reach;
27
+ the decision is [ADR-126](docs/decisions/ADR-126-internet-reach-operator-tooling.md).
28
+ - `reach:doctor` — new read-only command: per-channel probe status,
29
+ `active_backend`, tier, lifecycle, and the exact **pinned** fix command for
30
+ the current platform when a backend is missing or broken. No writes, no
31
+ installs, no network (`--deep` is the explicit opt-in that makes one real
32
+ request per backend and still writes nothing).
33
+ - `src/config/reach-channels.yml` + `reach-channels.schema.json` — ordered
34
+ backend candidates per channel (swapping a backend is a config reorder, not
35
+ a code edit), the four-value lifecycle vocabulary reused from
36
+ `provider-lifecycle`, `last_verified` staleness metadata, and an install
37
+ pattern that **rejects** unpinned versions, `latest`/`main`/`HEAD` refs and
38
+ archive-URL install sources.
39
+ - `tool_probe` — five-state probe taxonomy (`ok`/`missing`/`broken`/`timeout`/
40
+ `error`) with stale-shim detection (resolvable shim, dead interpreter),
41
+ exit-126/127 mapping, timeout-only single retry, and per-channel error
42
+ isolation. Every spawn routes through `hardenedSpawnEnv()`.
43
+ - `check-reach-channels` + `check-reach-prescriptions` CI gates — pinning and
44
+ intake-record discipline is machine-checked, not an honour system; a
45
+ prescription that cannot be pinned does not ship.
46
+ - `check-reach-staleness` CI gate — offline: a channel unverified for >90 days,
47
+ a `deprecated` channel with no `replacement`, or a channel past its
48
+ `removal_after` date and still present fails the build.
49
+ - Registry trust is enforced at runtime, not just in CI: `reach:doctor` (incl.
50
+ `--registry <path>`) validates the registry against its schema and refuses to
51
+ probe on any violation (exit 2). `probe_args` is a flag-shaped **allowlist**
52
+ and `probe_cmd` must equal its backend `id`, so a registry entry can neither
53
+ smuggle a shell payload nor label a row with a binary other than the one that
54
+ ran — both closed by an adversarial pre-merge review, with permanent
55
+ regression fixtures.
56
+
57
+ - **Doc-follows-code discipline** — deterministic, framework-agnostic mechanism
58
+ so documentation is updated when code changes.
59
+ - `downstream-changes` rule gains a first-class **Doc-Impact** obligation:
60
+ a change to a public surface (route, exported signature, CLI flag, config/
61
+ settings key, env var, DB schema, event payload) is incomplete until the
62
+ doc that describes it is updated in the same change; escape hatch for
63
+ refactor-only / no-surface changes.
64
+ - `agent-docs-writing` skill: the advisory doc-sync table becomes an
65
+ actionable, cross-stack Doc-Impact procedure with a falsifiable-claim
66
+ fire/no-fire test.
67
+ - `check_source_pointer_freshness` CI gate — fails when an authoring file
68
+ names the retired `.agent-src.uncondensed/` tree as source of truth.
69
+ - Opt-in consumer CI template `github-workflows/doc-impact.yml` (warn-first,
70
+ `[docs:not-needed]` / `refactor:` escape hatch, `STRICT` toggle).
71
+
72
+ ### Fixed
73
+
74
+ - Source-of-truth pointer drift: `src/agent-src/README.md` and the
75
+ `agents-md-thin-root` skill named the retired `.agent-src.uncondensed/`
76
+ tree; corrected to `src/`.
77
+
78
+ > The former "6.0.0 at a glance" overview was drained on 2026-07-21 to
79
+ > [`docs/archive/CHANGELOG-6.0.0-overview.md`](docs/archive/CHANGELOG-6.0.0-overview.md).
961
80
 
962
81
  # Era: pre-4.5.0 — archived
963
82
 
@@ -1056,6 +175,152 @@ our recommendation order, not its support status.
1056
175
  > that forces a new era split (`# Era: 9.3.x`, etc.) — see
1057
176
  > [`docs/contracts/CHANGELOG-conventions.md § Era splits`](docs/contracts/CHANGELOG-conventions.md).
1058
177
 
178
+ ## [9.8.0](https://github.com/event4u-app/agent-config/compare/9.7.0...9.8.0) (2026-07-26)
179
+
180
+ ### Features
181
+
182
+ * **proof:** publish what re-derives itself, and what it prevents ([8ba878f](https://github.com/event4u-app/agent-config/commit/8ba878f0bb2244b33ce57f3484d5c0d0f887a5e9))
183
+ * **governance:** classify trust-boundary risk, measure before gating ([1421f82](https://github.com/event4u-app/agent-config/commit/1421f829ee58fe56a4c41a15c5f2e3925f17b5e9))
184
+ * **claims:** add exec: evidence that re-runs the command ([081b9ed](https://github.com/event4u-app/agent-config/commit/081b9ed36e29e3bb9e665004c16f3db9f831a107))
185
+ * **ci:** run the backstops rules declare, and baseline the five that were already red ([545d9cc](https://github.com/event4u-app/agent-config/commit/545d9ccd02cba430c8b5cb7c9b15fb0c9fe40463))
186
+ * **proof:** read the same checked rows as failure modes, not just as comparisons ([d2196de](https://github.com/event4u-app/agent-config/commit/d2196de10a220300b2897a379bf419c89416c117))
187
+ * **adr:** index the decisions filed outside the ADR directory, and stop auditing a hardcoded list ([2a2999a](https://github.com/event4u-app/agent-config/commit/2a2999a437f98fa94eae76638598923f0ba85bcd))
188
+ * **claims:** see the figure shapes that actually ship, and refuse a qual claim as a licence for a number ([5d7b166](https://github.com/event4u-app/agent-config/commit/5d7b1666364bb227fc687704560c93ddfb5fad2f))
189
+ * **host-integration:** config-root spawn flag + embed contract v1 ([a9f0038](https://github.com/event4u-app/agent-config/commit/a9f0038631ed97b815ab255d3a307a617423f091))
190
+ * **skill:** gated-reach — ship-tier channels only ([88f03c3](https://github.com/event4u-app/agent-config/commit/88f03c349fd89ffa36ca642eeef4bb8cd31263a8))
191
+ * **lint:** refuse nag phrasing in skill bodies ([004d696](https://github.com/event4u-app/agent-config/commit/004d696d3afae203e1581c63de979d0571031331))
192
+ * **reach:** distinguish "installed" from "able to extract" in reach:doctor ([e012bf7](https://github.com/event4u-app/agent-config/commit/e012bf784d0544002ec86128cc2fb2d6805e44d0))
193
+ * **reach:** read Reddit and single tweets credential-free ([9b89a34](https://github.com/event4u-app/agent-config/commit/9b89a34cf863167fda437f51ab54396f11229b60))
194
+ * **adr:** name the condition that reopens a decision, and validate ADR frontmatter at all ([5315ca1](https://github.com/event4u-app/agent-config/commit/5315ca1a05cb110dec839083dc8ef61b5f4fad9e))
195
+ * **subagents:** deliver the safety floor the contract already promised ([48ccf6a](https://github.com/event4u-app/agent-config/commit/48ccf6a10a45ba2ee2583a5dd3765ab0b8db9605))
196
+ * **overrides:** a kernel rule may be tightened, never replaced ([7821e22](https://github.com/event4u-app/agent-config/commit/7821e2202e9a03d9b0f80f299374a9cad3969139))
197
+ * **enforcement:** resolve what enforces each rule, instead of trusting the claim ([efc0fab](https://github.com/event4u-app/agent-config/commit/efc0fab2b8fc1bf181ba89ecc9f427312996dc56))
198
+ * **reach:** mechanize the supply-chain and staleness discipline as CI gates ([3d1b0f6](https://github.com/event4u-app/agent-config/commit/3d1b0f6375ba0f193fa198817bfa145091deebb1))
199
+ * **reach:** channel registry, five-state probe engine and read-only reach:doctor ([2cf6f04](https://github.com/event4u-app/agent-config/commit/2cf6f0406e3e82f955832698db556c7cba8887e2))
200
+ * **reach:** pre-registered reach-vs-native benchmark, published as an honest null ([8238f8b](https://github.com/event4u-app/agent-config/commit/8238f8bf78ac3f5cd47ad6ffdc703bbd562a206f))
201
+ * **code-graph:** code-intelligence skill + interop routing + host degradation (Phase 4) ([eabe48c](https://github.com/event4u-app/agent-config/commit/eabe48c49311278cfcb96ba3401b5240b4707261))
202
+ * **code-graph:** PreToolUse code-graph nudge hook (Phase 4) ([6d674ee](https://github.com/event4u-app/agent-config/commit/6d674ee421581a72094d581d35fc429006f7f4b4))
203
+ * **code-graph:** incremental --update + symlink-confinement fix (Phase 4) ([c0c846c](https://github.com/event4u-app/agent-config/commit/c0c846c222fc76bfcc685de96ae0dd0055a2fd38))
204
+ * add doc-screenshot anonymization discipline (rule + skill + ADR-125) ([c3e4671](https://github.com/event4u-app/agent-config/commit/c3e4671fd7822976d1293632b3b1ee7d707034a5))
205
+ * **code-graph:** source-agnostic query tier + detection (Phase 3) ([f5a0117](https://github.com/event4u-app/agent-config/commit/f5a0117a3445c4c3070f4432788a645cc2522f5a))
206
+ * **code-graph:** native WASM tree-sitter extract+build engine (Phase 2) ([8d78fef](https://github.com/event4u-app/agent-config/commit/8d78fefd788c6da88516ccdcdfde6ca84e572938))
207
+ * **adr-124:** land embedded-engine doctrine + reclassification sweep (Phase 0-1) ([e1db617](https://github.com/event4u-app/agent-config/commit/e1db617307d13de6d520b9aacc6aa0bb5472fb92))
208
+ * **install:** restart/launch the GUI on a global (re)install ([fae7a6c](https://github.com/event4u-app/agent-config/commit/fae7a6c6ad60441e2df9d056b92cc083ca63940d))
209
+ * secret-scan pre-flight in /commit, /commit:in-chunks, /pr:create ([ab69931](https://github.com/event4u-app/agent-config/commit/ab6993114bb57f6d8f2fea98ec4c2ec0e82366e7))
210
+ * secret-vcs-guard rule + secrets-management runtime guard ([9426f7e](https://github.com/event4u-app/agent-config/commit/9426f7e175b6b1325a4989eb07f709c8d9090bbe))
211
+ * secret detector library + CI leak-scan gate ([3168244](https://github.com/event4u-app/agent-config/commit/316824447b277f966dfe194e0c7c6741121b7e9f))
212
+
213
+ ### Bug Fixes
214
+
215
+ * **roadmaps:** inline the council convergence instead of linking the transcript ([c47d9fc](https://github.com/event4u-app/agent-config/commit/c47d9fc0f8e390a8edce2a30d3dd8c5350ae0fd1))
216
+ * **docs:** replace stale 3.2.0 registry submission body and guard the file ([b393514](https://github.com/event4u-app/agent-config/commit/b393514dfa2a891ae24294d43155fa080ca115cd))
217
+ * **ci:** give the backstop gates their baseline, and stop an empty scan reading as clean ([69083f5](https://github.com/event4u-app/agent-config/commit/69083f577975c0de1d9535b4b45c27f475a676d7))
218
+ * **claims:** derive the denominator, and stop citing a gate that does not run ([89049f1](https://github.com/event4u-app/agent-config/commit/89049f1db36d63e33c7bb4f4a80712f3f2f72556))
219
+ * **enforcement:** say which build — a taskfile-named validator is not a CI gate ([7a87271](https://github.com/event4u-app/agent-config/commit/7a87271cce6b0cabeb664ccf890acd1f0335a0e7))
220
+ * **ci:** regenerate docs/proof.md and stop tracking a per-run eval artifact ([e8973c7](https://github.com/event4u-app/agent-config/commit/e8973c784513e33d7a0eb8e43d55c4a46b446a17))
221
+ * **claims:** the witness-sweep fixture encoded the bug it was testing ([b7b8621](https://github.com/event4u-app/agent-config/commit/b7b8621966d82f7f0cda87838974f1066258a6ec))
222
+ * **claims:** correct three shipped numbers, one of them understated by 3x ([2c52959](https://github.com/event4u-app/agent-config/commit/2c529590bce9ccb8cdabb1835f01670d7f60140a))
223
+ * **ci:** three self-inflicted reds — my own schema, my own legacy path, my own hand-edit ([7945f6c](https://github.com/event4u-app/agent-config/commit/7945f6cd74640a8f401451896c7a8c9cadce9dfd))
224
+ * **enforcement:** satisfy noUncheckedIndexedAccess in the two new scripts ([6501cce](https://github.com/event4u-app/agent-config/commit/6501ccebb757dd482dbd69bd5b784db447080e4a))
225
+ * **output-discipline:** wire the linter the rule already claimed was wired ([d996c6d](https://github.com/event4u-app/agent-config/commit/d996c6d7372add7e9b738bca2064078bbbc4a958))
226
+ * **kernel:** single-source the kernel list, and point the slow-rollout gate at a directory that exists ([676d74f](https://github.com/event4u-app/agent-config/commit/676d74f67d8db05d9f404e7a17d43172a2786bb1))
227
+ * **reach:** close the content-echo class at all four sites, not three ([17e806d](https://github.com/event4u-app/agent-config/commit/17e806d37af0894908f9b12a5044dc7c1fb1d51c))
228
+ * **reach:** confine credential_path, refuse non-files, and name what --deep consents to ([ffd02d0](https://github.com/event4u-app/agent-config/commit/ffd02d0d33b85f5e70de442d1c8dc4d5208b4c50))
229
+ * **reach:** redact echoed file content, unify error sanitization, document the gate boundaries ([52a1ded](https://github.com/event4u-app/agent-config/commit/52a1ded5314c99a51414ad3b6f44a60177ce40e5))
230
+ * **settings:** declare hooks.code_graph.enabled in the Zod settings schema ([ef475ce](https://github.com/event4u-app/agent-config/commit/ef475ce39a0e937f1f6cbfe9ed544633a789c969))
231
+ * **proof:** regenerate proof.md after code-intelligence skill-count bump ([8ad88c8](https://github.com/event4u-app/agent-config/commit/8ad88c82eee0252d903c9efb93b62e380a6acba5))
232
+ * sync settings Zod schema + regenerate proof/capabilities for screenshots config ([4812a6e](https://github.com/event4u-app/agent-config/commit/4812a6e232c7323695faf6a90328b13b2e48bbe0))
233
+ * **proof:** regenerate proof.md after comparison.yaml row-1 rewording ([f36f583](https://github.com/event4u-app/agent-config/commit/f36f583c1aab82da7171e4c9f3f28306b5e1345a))
234
+ * **roadmap:** unlink future reclassification-doc path in sequencing plan ([d74b4b0](https://github.com/event4u-app/agent-config/commit/d74b4b060cb01569c47615822b09ed2f055a2474))
235
+ * **review:** reclassify MCP server B, machine-visible partial supersession ([1b2ed21](https://github.com/event4u-app/agent-config/commit/1b2ed21046a6c904d435dd48472f512477436cad))
236
+ * **install:** make postinstall_gui self-contained (prepack-check) ([54a77b1](https://github.com/event4u-app/agent-config/commit/54a77b1bf981053f7e778ec2e6643637f608c313))
237
+ * widen check_secret_leak opts types for exactOptionalPropertyTypes ([593dfab](https://github.com/event4u-app/agent-config/commit/593dfab595be8c8f5cc722f038e8e60fcdb2609b))
238
+ * **release:** make the tag-workflow dispatch non-fatal + document actions:write ([d47949e](https://github.com/event4u-app/agent-config/commit/d47949e1357e5b4794b442c3b69fd84c999d23fa))
239
+
240
+ ### Documentation
241
+
242
+ * **roadmaps:** record adoption progress and add two new roadmaps ([7af5375](https://github.com/event4u-app/agent-config/commit/7af537591d3628d4a2285553c41adcdf5e23e734))
243
+ * **readme:** reorder the opening to lead with the wedge, not the catalog ([ab66da8](https://github.com/event4u-app/agent-config/commit/ab66da8e968a540528fffca05ce65184c0817740))
244
+ * **adr:** record the cut as ADR-128, and archive the roadmap ([b365e90](https://github.com/event4u-app/agent-config/commit/b365e907461312f5e71e502de21333b10a211655))
245
+ * **roadmap:** archive road-to-wiring-truth, complete ([aaafb9e](https://github.com/event4u-app/agent-config/commit/aaafb9e7543b9b4a75f40b09805725dc437ca564))
246
+ * **roadmap:** archive road-to-number-truth, complete ([a12bbae](https://github.com/event4u-app/agent-config/commit/a12bbae9d83e60531a87b69fd135c37cbb02de8a))
247
+ * **contracts:** write the local-server-ports + host-integration contract ([610e539](https://github.com/event4u-app/agent-config/commit/610e539538bac8a914ce28a2b4f9c9ef91165b61))
248
+ * **roadmaps:** track the AC host-integration roadmaps + landed status ([34fcc27](https://github.com/event4u-app/agent-config/commit/34fcc271fe9eda5d24d8ee2a3260cdfbddad5722))
249
+ * **roadmap:** close gated-reach, spawn the YouTube follow-up, park five successors ([530917a](https://github.com/event4u-app/agent-config/commit/530917a3a1c4be5c514fe4eb507dea83a65b4b53))
250
+ * register the gated-reach claim, comparison row, and amend ADR-126 ([bb0b263](https://github.com/event4u-app/agent-config/commit/bb0b263292236a623e7cb71d2a9832f1e090cc3a))
251
+ * **bench:** publish the gated-reach outcomes, ships and parks alike ([5ca8930](https://github.com/event4u-app/agent-config/commit/5ca89304c517b91d2d3950213c835e6336ef5d57))
252
+ * **reach:** operator prescriptions for platforms the host cannot fetch ([844bb1b](https://github.com/event4u-app/agent-config/commit/844bb1b3cfa3633c2e4f383496ae04393ea15a48))
253
+ * **roadmap:** archive road-to-enforcement-proof, complete ([a590aca](https://github.com/event4u-app/agent-config/commit/a590aca449b9aa0a186d4739c9931f2b46458fcf))
254
+ * **proof:** publish both numbers, including the unflattering one ([eabe545](https://github.com/event4u-app/agent-config/commit/eabe545965648adbe4637f4b6f80ea3dcbc5de46))
255
+ * **reach:** make Reddit ranking + thread structure the goal — and it stays credential-free ([4c3b3cb](https://github.com/event4u-app/agent-config/commit/4c3b3cbafba3087078ff3a2ff0f0509e36dc29e1))
256
+ * **reach:** roadmap for credential-free gated reach — Reddit, single tweets, transcripts ([ff4b40c](https://github.com/event4u-app/agent-config/commit/ff4b40c83a8925fabfbf9c87ae29af092bcc1f0a))
257
+ * **reach:** correct my own overstatement about what the witness contains ([0e46437](https://github.com/event4u-app/agent-config/commit/0e46437e6377b863245e769cce9c0721e39a4698))
258
+ * **reach:** record all four council divergences, and give both accepted costs a re-entry point ([7f85378](https://github.com/event4u-app/agent-config/commit/7f853788973a3fcfac61e34866047d8704d61bd6))
259
+ * **reach:** ADR-126, archived roadmap, comparison row and maintenance log ([4bfc9da](https://github.com/event4u-app/agent-config/commit/4bfc9da38cd809465713e8544b953e38781594b4))
260
+ * **roadmap:** add native-code-intelligence roadmap + engine queue ([7c7ac11](https://github.com/event4u-app/agent-config/commit/7c7ac1149b8715794be0baac5b3285e514fb9b65))
261
+ * **adr:** propose ADR-124 embedded-engine doctrine ([d8c90a5](https://github.com/event4u-app/agent-config/commit/d8c90a52397a048b52abf17575f6d67d298b364b))
262
+ * **roadmap:** sync dashboard for archived Starlight roadmap ([d30846c](https://github.com/event4u-app/agent-config/commit/d30846c1299ef9784ea33a8572f830a0ae1b571f))
263
+ * **roadmap:** complete + archive Starlight project-docs roadmap ([4c7b91f](https://github.com/event4u-app/agent-config/commit/4c7b91f407f1238ffc83c1700f444e136c476400))
264
+ * **roadmap:** add Starlight project-docs roadmap ([f63e87f](https://github.com/event4u-app/agent-config/commit/f63e87f3ebc2cc53e2ceccb6a43591fd394aa90e))
265
+ * **site:** add setup, configuration, CLI and agent-command docs ([7c05e68](https://github.com/event4u-app/agent-config/commit/7c05e68fdc27c391c0882d2f2d0284bb3f3f9d8f))
266
+ * **site:** restyle docs site to the data-helpers look ([ef0e7a0](https://github.com/event4u-app/agent-config/commit/ef0e7a05de293d49c7f6fb474c40f157f621de13))
267
+ * document the secret-in-VCS guardrail (threat model + SECURITY) ([e10e316](https://github.com/event4u-app/agent-config/commit/e10e3160bb07b6457602b2c2ee70f2215a66dfb5))
268
+
269
+ ### Tests
270
+
271
+ * **bench:** gated-reach — pre-registration, rows, per-channel verdict ([8233aed](https://github.com/event4u-app/agent-config/commit/8233aedd50c80156a9d8996967e1fd2a7db70109))
272
+ * **reach:** drop the witness instrument that watched shared state, and say what that costs ([1be7ab9](https://github.com/event4u-app/agent-config/commit/1be7ab98373f20cbfd0048184cc62a0c93de1151))
273
+ * **reach:** cover the sanitized error path, the export gate and the win32 skip ([3b5a47a](https://github.com/event4u-app/agent-config/commit/3b5a47a5c30d0968f2631924c813d3c6b13884d2))
274
+ * **reach:** the read-only witness parses the AST instead of grepping the source ([e54f22d](https://github.com/event4u-app/agent-config/commit/e54f22d994736c3e6cbb37390bc4b843975fa05e))
275
+
276
+ ### Chores
277
+
278
+ * **reports:** regenerate the originality audit, stale on main ([aef5b53](https://github.com/event4u-app/agent-config/commit/aef5b53bbaf918a6b849060063e6c40196ab5dd4))
279
+ * regenerate drifted originality report (pre-push consistency sync) ([66c7f04](https://github.com/event4u-app/agent-config/commit/66c7f04afe9005b91c07457902edcf2ee0cf3a78))
280
+ * **test:** remove two orphans the depythonization left in the linter test ([e800c8e](https://github.com/event4u-app/agent-config/commit/e800c8e8627e26388de29c2b3e38b95620932b64))
281
+ * **regen:** sync skill counts + meta-pack membership after code-intelligence ([0775e14](https://github.com/event4u-app/agent-config/commit/0775e148c1fbd61da13f9ad5646e4f8ef7bfe324))
282
+ * **roadmap:** park native-code-intelligence in later/ (Phases 0-4 done, 5-6 gated) ([f7b3c2f](https://github.com/event4u-app/agent-config/commit/f7b3c2f63339efb81b497e6eeda05a3e843171d7))
283
+ * regenerate docs/proof.md for the +1 rule count ([620614c](https://github.com/event4u-app/agent-config/commit/620614c901b1c7971c8c55d97477c74e5b2f2ba2))
284
+ * regenerate dist projections + counts, archive completed roadmap ([55052c9](https://github.com/event4u-app/agent-config/commit/55052c941be45cea1d4dfc65fc048a0c8f450958))
285
+
286
+ ## [9.7.0](https://github.com/event4u-app/agent-config/compare/9.6.0...9.7.0) (2026-07-21)
287
+
288
+ ### Features
289
+
290
+ * **templates:** opt-in consumer doc-impact CI workflow ([c02c878](https://github.com/event4u-app/agent-config/commit/c02c87810d0ee60f8544f17c9d7cefdafc59c826))
291
+ * **scripts:** add check_source_pointer_freshness CI gate + test ([f5895f7](https://github.com/event4u-app/agent-config/commit/f5895f784da4cc4c0d5b93fd55629589ec2f56c4))
292
+ * **rules,skills:** docs-follow-code — Doc-Impact discipline + fix source-of-truth pointer drift ([9f8f666](https://github.com/event4u-app/agent-config/commit/9f8f6665d9ea3b1baa48a3aa2b30a516b9878912))
293
+ * **bench:** adversarial-council residual-detection corpus + harness ([784202e](https://github.com/event4u-app/agent-config/commit/784202e5a33d94c0fe507cfb526e9dd2487dc89a))
294
+
295
+ ### Bug Fixes
296
+
297
+ * **ci:** exempt check_source_pointer_freshness from the legacy-path guard ([5254683](https://github.com/event4u-app/agent-config/commit/5254683f492bb52e8fe3262f08b91a240867e3be))
298
+ * **bench:** typecheck + lint the adversarial-council runner ([14e81cd](https://github.com/event4u-app/agent-config/commit/14e81cd9f2034a66b448b70440f77916ed054d5d))
299
+ * **security:** close GIT_CONFIG_* config-injection RCE residual in hardenedSpawnEnv ([48941a6](https://github.com/event4u-app/agent-config/commit/48941a6d3be2bd125758f7899690e5bf36bb2843))
300
+
301
+ ### Documentation
302
+
303
+ * **roadmap:** archive completed road-to-doc-follows-code ([2695aad](https://github.com/event4u-app/agent-config/commit/2695aade3be5e4a87acd19af8032c655e3bd10fe))
304
+ * **changelog:** record the docs-follow-code discipline under [Unreleased] ([54703a5](https://github.com/event4u-app/agent-config/commit/54703a5e930e01a2a124e22ded5ef5fc3aadfbd8))
305
+ * **roadmap:** archive completed adversarial-council-benchmark roadmap ([ae30ddb](https://github.com/event4u-app/agent-config/commit/ae30ddb4156365d17ac97c8ff1af7c5902c76337))
306
+ * **bench:** resolve adversarial-council-finding-coverage — HONEST NULL ([9bd5fe4](https://github.com/event4u-app/agent-config/commit/9bd5fe489fb9a324da9a096fc4170e820d7b2888))
307
+ * **roadmap:** archive completed changelog-unreleased-drain roadmap ([361f72f](https://github.com/event4u-app/agent-config/commit/361f72fe681e04b0ab717314c2fdb24e13939048))
308
+ * **changelog:** drain the stale 6.0.0 fossil out of [Unreleased] ([ca99ced](https://github.com/event4u-app/agent-config/commit/ca99ced83eee2b23ea18b33f9852cfe718ebbb2f))
309
+ * **roadmap:** archive completed spawn-env-completion roadmap ([c4fd083](https://github.com/event4u-app/agent-config/commit/c4fd0839c83f2c580bb08ce2581bcceb8d62d095))
310
+ * **security:** spawn-site policy inventory + ADR-123 follow-up (lint rejected) ([bec13d1](https://github.com/event4u-app/agent-config/commit/bec13d1c7acb0a17e2d8a561ca279a6cebb97446))
311
+ * drop serial comma in README + package.json prose ([dec73af](https://github.com/event4u-app/agent-config/commit/dec73affaca0a000c5fab656017be15c67e0f884))
312
+
313
+ ### Tests
314
+
315
+ * **changelog:** guard [Unreleased] against at-a-glance fossil reopening ([75993e4](https://github.com/event4u-app/agent-config/commit/75993e4426bb2b103ae89706d59a70195513d624))
316
+
317
+ ### Chores
318
+
319
+ * **condense:** re-mark 19 commands after dependency-hash cascade ([07ddac7](https://github.com/event4u-app/agent-config/commit/07ddac7a80661693852ae68ce31d530020d95305))
320
+ * **ci:** guard README against serial-comma drift ([a7caa83](https://github.com/event4u-app/agent-config/commit/a7caa83e0771244e16845505028f812f59d26624))
321
+
322
+ Tests: 7854 (+16 since 9.6.0)
323
+
1059
324
  ## [9.6.0](https://github.com/event4u-app/agent-config/compare/9.5.0...9.6.0) (2026-07-20)
1060
325
 
1061
326
  ### Features