@event4u/agent-config 10.0.0 → 10.2.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 (125) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +172 -5
  3. package/README.md +1 -1
  4. package/dist/agent-src/commands/roadmap/next.md +38 -0
  5. package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +22 -1
  6. package/dist/agent-src/contexts/contracts/frugality-charter.md +1 -1
  7. package/dist/agent-src/rules/context-hygiene.md +39 -0
  8. package/dist/agent-src/rules/token-budget-discipline.md +3 -2
  9. package/dist/agent-src/rules/token-efficiency.md +22 -0
  10. package/dist/agent-src/scripts/archive_completed_roadmaps.ts +17 -0
  11. package/dist/agent-src/skills/adr-create/SKILL.md +5 -0
  12. package/dist/agent-src/skills/ai-council/SKILL.md +28 -6
  13. package/dist/agent-src/skills/check-refs/SKILL.md +5 -0
  14. package/dist/agent-src/skills/condense-memory/SKILL.md +1 -1
  15. package/dist/agent-src/skills/lint-skills/SKILL.md +5 -0
  16. package/dist/agent-src/skills/md-language-check/SKILL.md +5 -0
  17. package/dist/agent-src/skills/roadmap-writing/SKILL.md +1 -1
  18. package/dist/agent-src/skills/token-optimizer/SKILL.md +5 -1
  19. package/dist/agent-src/templates/agent-settings.md +12 -28
  20. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +2 -2
  21. package/dist/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +0 -1
  22. package/dist/cli/registry.js +1 -1
  23. package/dist/cli/registry.js.map +1 -1
  24. package/dist/cli-delegate/{chunk-3JUTT26I.js → chunk-6ENSXSBW.js} +1 -1
  25. package/dist/cli-delegate/{chunk-TVGXH7VA.js → chunk-6LOPHJLD.js} +1 -1
  26. package/dist/cli-delegate/{chunk-XT2YTJCZ.js → chunk-AYKQGIBG.js} +4 -0
  27. package/dist/cli-delegate/{chunk-HJSKTMIF.js → chunk-BV3WR67D.js} +3 -19
  28. package/dist/cli-delegate/{chunk-HTIU3W56.js → chunk-BWMXLD4B.js} +6 -2
  29. package/dist/cli-delegate/{chunk-2H5SE7DU.js → chunk-E4RUZKXB.js} +165 -38
  30. package/dist/cli-delegate/{chunk-XTC5ARB6.js → chunk-IR3IVRVC.js} +7 -2
  31. package/dist/cli-delegate/{chunk-LRXJK6GN.js → chunk-JMQZ7MM5.js} +1 -1
  32. package/dist/cli-delegate/{chunk-NX5AXSLD.js → chunk-X3VOARZD.js} +3 -3
  33. package/dist/cli-delegate/cmd_analyze_session.js +1 -1
  34. package/dist/cli-delegate/cmd_brand_status.js +1 -1
  35. package/dist/cli-delegate/cmd_conformance.js +881 -204
  36. package/dist/cli-delegate/cmd_doctor.js +3 -3
  37. package/dist/cli-delegate/cmd_explain.js +2 -2
  38. package/dist/cli-delegate/cmd_export.js +4 -4
  39. package/dist/cli-delegate/cmd_handoff.js +6 -5
  40. package/dist/cli-delegate/cmd_mcp_available.js +1 -1
  41. package/dist/cli-delegate/cmd_migrate.js +2 -2
  42. package/dist/cli-delegate/cmd_packs_active.js +2 -2
  43. package/dist/cli-delegate/cmd_prune.js +4 -4
  44. package/dist/cli-delegate/cmd_route_audit.js +2 -2
  45. package/dist/cli-delegate/cmd_route_explain.js +1 -1
  46. package/dist/cli-delegate/cmd_session_recycle.js +44 -9
  47. package/dist/cli-delegate/cmd_settings_get.js +2 -2
  48. package/dist/cli-delegate/cmd_settings_migrate.js +4 -4
  49. package/dist/cli-delegate/cmd_settings_set.js +2 -2
  50. package/dist/cli-delegate/cmd_sync.js +4 -4
  51. package/dist/cli-delegate/cmd_uninstall.js +4 -4
  52. package/dist/cli-delegate/cmd_update.js +1 -1
  53. package/dist/cli-delegate/cmd_upgrade.js +1 -1
  54. package/dist/cli-delegate/cmd_validate.js +4 -4
  55. package/dist/cli-delegate/cmd_versions.js +1 -1
  56. package/dist/discovery/deprecation-report.md +1 -1
  57. package/dist/discovery/discovery-manifest.json +15 -15
  58. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  59. package/dist/discovery/discovery-manifest.summary.md +1 -1
  60. package/dist/discovery/dormancy-report.md +1 -1
  61. package/dist/discovery/orphan-report.md +1 -1
  62. package/dist/discovery/packs.json +2 -2
  63. package/dist/discovery/trust-report.md +1 -1
  64. package/dist/discovery/workspaces.json +2 -2
  65. package/dist/hooks/dispatch.js +88 -20
  66. package/dist/install/install.mjs +9 -21
  67. package/dist/mcp/registry-manifest.json +1 -1
  68. package/dist/mcp/server.json +2 -2
  69. package/dist/mcp/server.mjs +1359 -492
  70. package/dist/scripts/_lib/agent_settings.js +25 -2
  71. package/dist/scripts/_lib/agent_settings.js.map +1 -1
  72. package/dist/scripts/_lib/compile_time_toggles.js +4 -3
  73. package/dist/scripts/_lib/compile_time_toggles.js.map +1 -1
  74. package/dist/server/io/yamlIO.js +0 -2
  75. package/dist/server/io/yamlIO.js.map +1 -1
  76. package/dist/server/schemas/settings.js +3 -9
  77. package/dist/server/schemas/settings.js.map +1 -1
  78. package/dist/shared/settingsClasses.js +64 -2
  79. package/dist/shared/settingsClasses.js.map +1 -1
  80. package/dist/ui/assets/{index-B5qGYOJo.js → index-5fXOHoVh.js} +2 -2
  81. package/dist/ui/assets/index-5fXOHoVh.js.map +1 -0
  82. package/dist/ui/index.html +1 -1
  83. package/docs/contracts/settings-classes.md +307 -145
  84. package/docs/guidelines/agent-infra/layered-settings.md +1 -2
  85. package/docs/guidelines/agent-infra/symptom-driven-harvest-loop.md +104 -0
  86. package/package.json +1 -1
  87. package/src/agent-src/scripts/archive_completed_roadmaps.ts +17 -0
  88. package/src/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +0 -1
  89. package/src/config/agent-settings.template.yml +12 -30
  90. package/src/config/gate-violation-baselines.json +9 -3
  91. package/src/config/profiles/balanced.ini +0 -2
  92. package/src/config/profiles/full.ini +1 -3
  93. package/src/config/profiles/minimal.ini +0 -2
  94. package/src/scripts/_cli/cmd_session_recycle.ts +66 -9
  95. package/src/scripts/_cli/handoff_sessions.ts +3 -2
  96. package/src/scripts/_lib/agent_settings.ts +25 -2
  97. package/src/scripts/_lib/bench_telegraph.ts +1 -1
  98. package/src/scripts/_lib/cc_transcript.ts +25 -0
  99. package/src/scripts/_lib/compile_time_toggles.ts +4 -3
  100. package/src/scripts/_lib/untrusted_content.test.ts +175 -0
  101. package/src/scripts/_lib/untrusted_content.ts +184 -0
  102. package/src/scripts/ai_council/clients.ts +228 -33
  103. package/src/scripts/cache_realization_report.ts +3 -2
  104. package/src/scripts/check_rule_projection_integrity.ts +3 -1
  105. package/src/scripts/conformance_scan.ts +282 -9
  106. package/src/scripts/cost/track.mjs +10 -4
  107. package/src/scripts/council_cli.ts +33 -3
  108. package/src/scripts/external_sources_denylist.json +3 -1
  109. package/src/scripts/hook_manifest.yaml +17 -6
  110. package/src/scripts/hooks/block_unauthorized_git.ts +54 -8
  111. package/src/scripts/hooks/delegation_nudge_hook.ts +33 -8
  112. package/src/scripts/hooks/evidence_independence.ts +61 -9
  113. package/src/scripts/hooks/session_eol_hook.ts +123 -3
  114. package/src/scripts/hooks/turn_end_gate_hook.ts +31 -0
  115. package/src/scripts/lint_settings_classes.ts +273 -11
  116. package/src/scripts/lint_symptom_intake.ts +241 -0
  117. package/src/scripts/report_consultation_rate.ts +2 -1
  118. package/src/scripts/report_skill_activation.ts +6 -4
  119. package/src/scripts/report_skill_obligation_violations.ts +2 -1
  120. package/src/scripts/schemas/skill.schema.json +42 -0
  121. package/src/scripts/skill_linter.ts +57 -2
  122. package/src/server/io/yamlIO.ts +0 -2
  123. package/src/server/schemas/settings.ts +3 -19
  124. package/src/shared/settingsClasses.ts +93 -2
  125. package/dist/ui/assets/index-B5qGYOJo.js.map +0 -1
@@ -6,7 +6,7 @@
6
6
  },
7
7
  "metadata": {
8
8
  "description": "Bootstrap shim for the event4u agent-config suite. This plugin ships ONLY the dispatcher hooks plus one install-pointer skill — ALL content (skills, rules, commands) is installed via `npx -y @event4u/agent-config init`, which writes the file projection AND registers the same hooks in ~/.claude/settings.json. DEPRECATED as a content channel; kept so the marketplace listing stays discoverable and existing installs keep working hooks.",
9
- "version": "10.0.0",
9
+ "version": "10.2.0",
10
10
  "keywords": [
11
11
  "agent-config",
12
12
  "skills",
package/CHANGELOG.md CHANGED
@@ -339,15 +339,177 @@ Entry-shape contract: [`docs/contracts/CHANGELOG-conventions.md`](docs/contracts
339
339
  > that forces a new era split (`# Era: 9.37.x`, etc.) — see
340
340
  > [`docs/contracts/CHANGELOG-conventions.md § Era splits`](docs/contracts/CHANGELOG-conventions.md).
341
341
 
342
- ## [10.0.0](https://github.com/event4u-app/agent-config/compare/9.36.0...10.0.0) (2026-08-12)
342
+ ## [10.2.0](https://github.com/event4u-app/agent-config/compare/10.1.0...10.2.0) (2026-08-13)
343
343
 
344
344
  ### Release highlights
345
345
 
346
346
  <!-- Curated head: fill before merge, keep it under 10 lines, and leave `_none_` where it is genuinely the answer. The generated log below is unchanged. -->
347
- - **Behaviour changes:** _auto-derived, rewrite before merge:_ rule/schema diffs, breaking commits or removed public surface in 030ca0d, c1bc2aa, 4eda4ff.
347
+ - **Behaviour changes:** _auto-derived, rewrite before merge:_ rule/schema diffs, breaking commits or removed public surface in 1bb1076, 698aa3f, d805133, 973787a.
348
+ - **Default changes + migration:** _none_
349
+ - **Security and correctness:** _auto-derived, rewrite before merge:_ security-scoped commits in 0309b8e.
350
+ - **Honest nulls:** _auto-derived, rewrite before merge:_ commits carrying an honest-null marker in c428ac6.
351
+ - **Known limitations:** _none_
352
+
353
+ ### Features
354
+
355
+ * **process:** give operator symptoms a home and codify the loop that resolves them ([6e01a24](https://github.com/event4u-app/agent-config/commit/6e01a24bb9c0a2496feca0a5dfb69d50fefa5fbf))
356
+ * **gates:** warn on unresolved operator symptom entries past 30 days ([ef98cfa](https://github.com/event4u-app/agent-config/commit/ef98cfa7d02c98ec88abf0ec9b778af12b2b6e91))
357
+ * **rules:** size-gated reads — probe a large file before loading it whole ([1bb1076](https://github.com/event4u-app/agent-config/commit/1bb10767269e1d348a874b845f0176fc1c83deba))
358
+ * **hooks:** severity follows the input type — prose alone may not block ([2716d4f](https://github.com/event4u-app/agent-config/commit/2716d4f87280b71f7301a885a9c10da1f1f00ffd))
359
+ * **settings:** gate the deletion side of the surface, not just the addition side ([da3bc3c](https://github.com/event4u-app/agent-config/commit/da3bc3c536184462c73a7214be953b8a57f9c432))
360
+ * **settings:** delete the six keys no code path read ([973787a](https://github.com/event4u-app/agent-config/commit/973787a6026d9b18f86f9961d7286993c6a491b8))
361
+ * **settings:** add the disposition axis to lint_settings_classes ([4c9ced8](https://github.com/event4u-app/agent-config/commit/4c9ced8908a9e89e2f9b8684cb4f1f6642d55c55))
362
+ * **conformance:** give task-completeness a denominator, and cover it ([18e4a0c](https://github.com/event4u-app/agent-config/commit/18e4a0c85cd705e5f404ea5b08f7a1018b7a7c3b))
363
+ * **conformance:** measure task completeness before refusing on it ([11610f8](https://github.com/event4u-app/agent-config/commit/11610f85c46d0eeb024ccb224e9236d264ffe0fe))
364
+
365
+ ### Bug Fixes
366
+
367
+ * **roadmap-writing:** fit the symptom-loop route without tripping the size check ([d5b3253](https://github.com/event4u-app/agent-config/commit/d5b3253f7875ab4da2da45a869cbbcb134a03763))
368
+ * **roadmaps:** anonymize the vendored corpus upstream outside its attribution file ([8406ac8](https://github.com/event4u-app/agent-config/commit/8406ac8c52a75355e0c704184aea123c7895d2fc))
369
+ * **roadmaps:** satisfy the complexity and blocker contracts on two active plans ([498cea7](https://github.com/event4u-app/agent-config/commit/498cea7c93bdbea57e00b5d6ba56ca828692e34f))
370
+ * **contracts:** the rule-router described a Claude Code gap that closed in PR #1231 ([f87240d](https://github.com/event4u-app/agent-config/commit/f87240d899e5418fa256e6462160b74466ad728d))
371
+ * **context-hygiene:** name the wait shape both loop clauses miss ([698aa3f](https://github.com/event4u-app/agent-config/commit/698aa3f65e704e3fa796be606c54a880c0736d01))
372
+ * **turn-end-gate:** stop refusing the honest "not done yet" line ([f85a8c7](https://github.com/event4u-app/agent-config/commit/f85a8c713d7bfa1d577ed1897261493ab1336d33))
373
+ * **git-guard:** classify the verb that is invoked, not the one that is named ([1b0d42d](https://github.com/event4u-app/agent-config/commit/1b0d42dd4135af012647853a469b1e43070d6502))
374
+ * **transcripts:** close the store-slug character class instead of widening it ([580f12d](https://github.com/event4u-app/agent-config/commit/580f12ddb9e1dc1c2d0a5ca9d0d2961707fa3b76))
375
+ * **evidence:** a worktree location is not a verdict subject ([351f245](https://github.com/event4u-app/agent-config/commit/351f245b946d5ec186d454888dfa65764003de32))
376
+ * **review:** stop the findings artefact citing a path that is the finding ([3dc1f86](https://github.com/event4u-app/agent-config/commit/3dc1f863d6c15b1afdccf0700897cc463eb80ccb))
377
+ * **council:** close the seven review findings, including two tests of mine that could not fail ([368c895](https://github.com/event4u-app/agent-config/commit/368c895d78d50b79520b686ade54e7d9aeddfe76))
378
+ * **council:** the spawned member answered the caller's hooks, and held tools it never needed ([67efa72](https://github.com/event4u-app/agent-config/commit/67efa720e380e54989c0e95b14285b729f5e279b))
379
+ * **council:** gemini rejects --system too, and two members dropped the system prompt entirely ([9faee19](https://github.com/event4u-app/agent-config/commit/9faee19e22fcf51cd21c04b7b12bd0a4da7bfb4e))
380
+ * **council:** close six of the eight review findings ([01c7b1f](https://github.com/event4u-app/agent-config/commit/01c7b1fb23ecfee991477d5c086ebc977fa5720b))
381
+ * **roadmap:** make the PR the end condition of /roadmap:next, not a step ([0184f3b](https://github.com/event4u-app/agent-config/commit/0184f3b92c8ce975c6f9eab815060f09e0479149))
382
+ * **council:** print the post-run quorum, not only the pre-run one ([cd8e518](https://github.com/event4u-app/agent-config/commit/cd8e518c115b2b873e2c85fc8aaf1c85edc37f67))
383
+ * **council:** codex exec has no --system flag, so stop passing one ([990d698](https://github.com/event4u-app/agent-config/commit/990d6982ff7f79c1979a96e5b8a37beaa788e65c))
384
+ * **review:** close the R2 findings, one of them by admitting the fix was half-built ([ff8be31](https://github.com/event4u-app/agent-config/commit/ff8be31c5aea39a2b85874b1d1224f463a12b0d7))
385
+ * **session-eol:** stop recommending /clear without checking the envelope exists ([ee27132](https://github.com/event4u-app/agent-config/commit/ee2713277230081929096719893739f64b416913))
386
+ * **session-recycle:** refuse a write into an unanchored working directory ([825df09](https://github.com/event4u-app/agent-config/commit/825df094771c44bbab37de44ea03c713e39980cd))
387
+
388
+ ### Documentation
389
+
390
+ * **roadmaps:** archive the symptom-driven harvest loop, fully executed ([d8ddccb](https://github.com/event4u-app/agent-config/commit/d8ddccb8707be0e39b15106f5181964c6f32f531))
391
+ * **roadmaps:** adopt the four August plans plus their program layer ([f84ba70](https://github.com/event4u-app/agent-config/commit/f84ba70e4bc56c9413d05ae6f9aa0189c3e629d1))
392
+ * **review:** re-bind the skip declaration to the Phase 2 re-cut scope ([ceac026](https://github.com/event4u-app/agent-config/commit/ceac02600bc198309163b7d269b87c6c648e4049))
393
+ * **roadmap:** re-cut Phase 2 to the downstream evidence control, cancel Phase 3 ([614f3df](https://github.com/event4u-app/agent-config/commit/614f3dfdfe6f4eb3e0c805769bd19ad1846c61ed))
394
+ * **contracts:** correct the prompt-channel residual — the prompt IS readable ([35a7796](https://github.com/event4u-app/agent-config/commit/35a7796ce728c6c6e70d10d813eb0da083c343bb))
395
+ * **roadmap:** corpus knowledge skills — the compiler gap, with eight corrections to the source ([c428ac6](https://github.com/event4u-app/agent-config/commit/c428ac61f8da7aa8e83f0f71758166fcf7e2eb42))
396
+ * **review:** declare the structured-guard-input measurement a no-code-surface skip ([44c5092](https://github.com/event4u-app/agent-config/commit/44c5092c522fbf4cff0db2ade5e731266c521784))
397
+ * **evidence:** measure the three Phase-1 falsifiers before building the field ([e817d50](https://github.com/event4u-app/agent-config/commit/e817d5084d67d5d937e65fcf86926ab4e640a566))
398
+ * **contracts:** state which text a guard reads, pre- or post-expansion ([953e7c1](https://github.com/event4u-app/agent-config/commit/953e7c1efca019061ba37842726fcf8fd27a198e))
399
+ * **review:** declare the waiter-discipline completion a no-code-surface skip ([cf2019e](https://github.com/event4u-app/agent-config/commit/cf2019ea2da0473ee36906f99b98a76be50541fa))
400
+ * **roadmap:** regenerate the dashboard after resolving the merge ([f2e6179](https://github.com/event4u-app/agent-config/commit/f2e617964b360f61d3cf32cf3094564498f25f44))
401
+ * **roadmap:** risk register for the structured-guard-input plan ([224eda9](https://github.com/event4u-app/agent-config/commit/224eda90be5f1918bc0f59cf6aa0072ef0c259a1))
402
+ * **council:** record the convergence and the work it does not fit in ([806e40c](https://github.com/event4u-app/agent-config/commit/806e40c25dbc148d51cccd51438c6622c451f9bc))
403
+ * **roadmap:** close zero-settings 2.1, 2.2 and 4.1, and re-date the blocker ([9acf679](https://github.com/event4u-app/agent-config/commit/9acf679f83a5ec260cc0b8be73aa98cd5bb3a219))
404
+ * **roadmap:** regenerate the dashboard after the merge ([945d614](https://github.com/event4u-app/agent-config/commit/945d6148a4e1cda1f01bdd8da769b58bd66a880e))
405
+ * **roadmap:** record that a failed council attempt still spends quota ([d6e6f11](https://github.com/event4u-app/agent-config/commit/d6e6f11ab78b2ec593098b3e850be94e7e342800))
406
+ * **roadmap:** close zero-settings 2.1, 2.2 and 4.1; record why 3.1 and 3.2 stay open ([c5499d9](https://github.com/event4u-app/agent-config/commit/c5499d94529da815709afa2d9776b69acc6ee5b4))
407
+ * **settings:** the telegraph rule states its own scope, and four contracts stop naming a dead key ([d805133](https://github.com/event4u-app/agent-config/commit/d805133257302e0beaa732cb1dd33ee413ceb4a6))
408
+ * **settings:** republish the counts, the floor, and the reclassification argument ([e53a799](https://github.com/event4u-app/agent-config/commit/e53a7992f4eb49b0859a267c7814434a263fdf4e))
409
+ * **audit:** record the cross-project session audit and its refusals ([dddafe9](https://github.com/event4u-app/agent-config/commit/dddafe91e36f2eceb243d8292e1da087eeff00d0))
410
+ * **review:** re-bind the adapter-follow-up artefact to the fixed scope ([783b784](https://github.com/event4u-app/agent-config/commit/783b784456429ff897538f23ffd83250c8e67b89))
411
+ * **review:** record the R2 findings on the adapter follow-up before fixing them ([a910931](https://github.com/event4u-app/agent-config/commit/a910931b3fe915c97902b90ecdea9540d4b07284))
412
+ * **review:** re-bind the context manifest, not only the marker ([3a22d35](https://github.com/event4u-app/agent-config/commit/3a22d357e7d6f5c93e4a8b855a58dd423762c09f))
413
+ * **review:** re-bind the R2 artefact to the fixed scope ([e6b4ce8](https://github.com/event4u-app/agent-config/commit/e6b4ce8e968d54a5bb22ca0b8d9f0d36ee7069fb))
414
+ * **review:** record the R2 completion review before the fixes ([169fcfd](https://github.com/event4u-app/agent-config/commit/169fcfd9d454ef9951c698783ea8859ff94462a4))
415
+ * **evidence:** task-completeness measures 0 of 3 precision — detector D is not built ([a7f6ffd](https://github.com/event4u-app/agent-config/commit/a7f6ffd459c7b5f19db087b31ccd42de5a85504b))
416
+ * **roadmap:** close zero-settings Phase 1 + 4.2, file the consent blocker ([99e6df2](https://github.com/event4u-app/agent-config/commit/99e6df2aebfae9433eff3ba7ce24c46090706196))
417
+ * **settings:** classify all 140 leaves and ratchet the derivable surface ([4a40578](https://github.com/event4u-app/agent-config/commit/4a405780354a7432d615373577f2e2f0bba4efa6))
418
+ * **review:** ship the reviewer prompt and scope beside the verdict ([0e57c8e](https://github.com/event4u-app/agent-config/commit/0e57c8e27621350fe086304b6f8f4f9143ffb8f4))
419
+ * **review:** re-bind the R2 artefact to the fixed scope, dispositions terminal ([8492864](https://github.com/event4u-app/agent-config/commit/8492864e2a6540fad5d1970cf76ae6a0dea2259c))
420
+ * **evidence:** pre-register the bar for detector D, contamination disclosed ([ee3f43f](https://github.com/event4u-app/agent-config/commit/ee3f43faca834a44eaaf3dab1770e9f422aeae9c))
421
+ * **review:** record the R2 findings before fixing any of them ([a151f36](https://github.com/event4u-app/agent-config/commit/a151f368422afbd18cf1f81175e69129acfa0e05))
422
+ * **roadmap:** close the rootless-write roadmap and record the sibling inventory ([4f5447a](https://github.com/event4u-app/agent-config/commit/4f5447a5ce022adf8e356ebc93419cababa1af0a))
423
+
424
+ ### Refactoring
425
+
426
+ * **settings:** delete the five keys nothing ever read ([94b9134](https://github.com/event4u-app/agent-config/commit/94b913481610deb1e981760280019c7ef0ae4aa1))
427
+
428
+ ### Tests
429
+
430
+ * **settings:** pin what a deleted unread key can and cannot do ([db0c6bd](https://github.com/event4u-app/agent-config/commit/db0c6bdba4eef271ae6803e4adb12c202d14ee2b))
431
+ * **settings:** pin the inverted invariant per deleted key ([e87af34](https://github.com/event4u-app/agent-config/commit/e87af347d9f0eacfd5f753737fadc85813b181fb))
432
+
433
+ ### Build
434
+
435
+ * take the trunk install bundle instead of a worktree rebuild ([f3ef74c](https://github.com/event4u-app/agent-config/commit/f3ef74c800b492cab4327953de7bb8af706e83bc))
436
+ * regenerate the derived outputs after the reconciliation merge ([50b4ce6](https://github.com/event4u-app/agent-config/commit/50b4ce6df13dff915ec0adbbe4f03f0f08475d02))
437
+ * rebuild the tracked install bundle after the schema deletion ([7b143ae](https://github.com/event4u-app/agent-config/commit/7b143ae4e0611f478e0ddd86c8e837d01a738940))
438
+
439
+ ### Chores
440
+
441
+ * **index:** regenerate the artifact index and catalog for the new guideline ([5d2d563](https://github.com/event4u-app/agent-config/commit/5d2d56351048163930fba8c8871d4eaddb5d203b))
442
+ * **security:** backstop the anonymization obligation for one more harvest source ([0309b8e](https://github.com/event4u-app/agent-config/commit/0309b8efc7f304bdbbc1886701dad1706c22f543))
443
+ * **tests:** drop the template handle the trimmed assertion orphaned ([ed764a9](https://github.com/event4u-app/agent-config/commit/ed764a9e600d330e5a33d3c49981f2e7e84b840e))
444
+ * **tests:** finish the orphan chain the previous deletion opened ([9bc6020](https://github.com/event4u-app/agent-config/commit/9bc6020a9ddf9578b98898024a2191ffc480a906))
445
+ * **tests:** drop two dead declarations the changed-files linter surfaced ([2d7ff19](https://github.com/event4u-app/agent-config/commit/2d7ff19b3dba4584b83e393a5e6f6c2fdafdd816))
446
+ * **roadmap:** archive road-to-feedback-9-35, which merged complete but unarchived ([2e26094](https://github.com/event4u-app/agent-config/commit/2e26094de27c845466229c6e7842a8217ac3b21f))
447
+ * **roadmaps:** archive road-to-completion-loop, closed as a published null ([92f9b9a](https://github.com/event4u-app/agent-config/commit/92f9b9aa675cbc42cc81e7eb829e68d6ddd3c4b7))
448
+
449
+ Tests: 13506 (+95 since 10.1.0)
450
+
451
+ ## [10.1.0](https://github.com/event4u-app/agent-config/compare/10.0.0...10.1.0) (2026-08-12)
452
+
453
+ ### Release highlights
454
+
455
+ <!-- Curated head: fill before merge, keep it under 10 lines, and leave `_none_` where it is genuinely the answer. The generated log below is unchanged. -->
456
+ - **Behaviour changes:** _auto-derived, rewrite before merge:_ rule/schema diffs, breaking commits or removed public surface in 0992c92, 20a8606, 63aeba1.
348
457
  - **Default changes + migration:** _none_
349
458
  - **Security and correctness:** _none_
350
- - **Honest nulls:** _auto-derived, rewrite before merge:_ commits carrying an honest-null marker in 7c6b404.
459
+ - **Honest nulls:** _auto-derived, rewrite before merge:_ commits carrying an honest-null marker in 0f3ce9b.
460
+ - **Known limitations:** _none_
461
+
462
+ ### Features
463
+
464
+ * **untrusted-content:** tag external content where it enters, with an unforgeable boundary ([7a313ec](https://github.com/event4u-app/agent-config/commit/7a313ecfae4eadd06ff547a4a67d363a6758707b))
465
+ * **skill-schema:** structured runtime requirements, and the rule that gives them teeth ([63aeba1](https://github.com/event4u-app/agent-config/commit/63aeba1070af3d72bcaac0c7f999788d3b833354))
466
+
467
+ ### Bug Fixes
468
+
469
+ * **roadmap,context:** satisfy the two gates this branch newly tripped ([e61d461](https://github.com/event4u-app/agent-config/commit/e61d46142a9dc41841c98360377cc89176ce1057))
470
+ * **roadmap-archival:** an open blocker outlives its steps, and the sweep did not look ([710dc26](https://github.com/event4u-app/agent-config/commit/710dc266a27a82aad9a527c525650e8d43accfdc))
471
+ * **review:** close all eight R2 findings, one of them by admitting a gap instead of papering it ([0992c92](https://github.com/event4u-app/agent-config/commit/0992c92219364bc646e78c29fa3072b5e46361ef))
472
+ * **diff:** drop a regenerated report my git add -A swept in ([3aec031](https://github.com/event4u-app/agent-config/commit/3aec031b160a8bc676053be370b2fddfbeab250c))
473
+ * **skill-schema:** rename requires to runtime_requires — the key was already taken ([20a8606](https://github.com/event4u-app/agent-config/commit/20a86065cc5d9c86e9fdf0710c51ddf850ca7ae4))
474
+ * **roadmap:** anonymize the harvest source per source-confidentiality ([195e444](https://github.com/event4u-app/agent-config/commit/195e444a7b1f9d7d05ac5cb768b0be17a1ac58ea))
475
+
476
+ ### Documentation
477
+
478
+ * **changelog:** curate the 10.0.0 head, which shipped the same placeholder hours later ([0f3ce9b](https://github.com/event4u-app/agent-config/commit/0f3ce9b22c1858e12556a4b0fe95bec1931dde91))
479
+ * **roadmap:** the verified residue of five external release reviews ([a25579f](https://github.com/event4u-app/agent-config/commit/a25579fdf4d13cf6057ccdfeba5dc87990dd11e0))
480
+ * **analysis:** threat-model the confirmation store, and enumerate the buried decisions ([8b18f1c](https://github.com/event4u-app/agent-config/commit/8b18f1c4a850a9b08906aceccbe3562f381de7c3))
481
+ * **records:** three figures five reviews keep re-deriving, corrected at the source ([1612a70](https://github.com/event4u-app/agent-config/commit/1612a70e3e13daa0572fefb4803533708c1273f0))
482
+ * **changelog:** curate the 9.36.0 head that shipped its own placeholder ([83a3922](https://github.com/event4u-app/agent-config/commit/83a3922f63efbe5aca280e775acc85b36573c3f4))
483
+ * **review:** re-bind after the count correction ([9dd75ec](https://github.com/event4u-app/agent-config/commit/9dd75ecf178152641f8744a8f1b81f045befde7b))
484
+ * **roadmap:** correct the test count the review fixes moved ([ec52c42](https://github.com/event4u-app/agent-config/commit/ec52c421ba69dc85ee78095323f8495b93f3dd26))
485
+ * **review:** re-bind the R2 artefact to the fixed scope, dispositions terminal ([e601648](https://github.com/event4u-app/agent-config/commit/e6016487e883f611b2b7b989f23ed682796a6a73))
486
+ * **review:** record the R2 findings before fixing any of them ([1cf8d78](https://github.com/event4u-app/agent-config/commit/1cf8d787c015f51261bdd22b7388e47d127003f6))
487
+ * **roadmap:** add the Acceptance Criteria the completion review needs to bind to ([f35becd](https://github.com/event4u-app/agent-config/commit/f35becd885c09a5ac7f5a678adf29a360e776efa))
488
+ * **roadmap:** follow the schema key rename, and record why the obvious name was unavailable ([5720847](https://github.com/event4u-app/agent-config/commit/572084763fef97eb66fa91fd722d75a9c527440a))
489
+ * **roadmap:** the executable-payload harvest, with four source claims corrected ([2f4d8a8](https://github.com/event4u-app/agent-config/commit/2f4d8a8be5891d6045d4605a4a6d8fe3dc28a65e))
490
+
491
+ ### Tests
492
+
493
+ * **council-cli:** the quota case asserted a property of the developer machine ([35037f9](https://github.com/event4u-app/agent-config/commit/35037f96d3e631d6ee1a235415e716e2a29f8f8c))
494
+
495
+ Tests: 13411 (+27 since 10.0.0)
496
+
497
+ ## [10.0.0](https://github.com/event4u-app/agent-config/compare/9.36.0...10.0.0) (2026-08-12)
498
+
499
+ ### Release highlights
500
+
501
+ - **Behaviour changes:** council transport is **resolved per machine rather than
502
+ configured** — the breaking change this major carries (4eda4ff); every member
503
+ now resolves as `auto`, so a configured CLI call budget applies wherever a
504
+ council config exists. The turn-end gate is armed unconditionally and loses its
505
+ settings surface (42cd613). Conformance round 7 records its downgrades rather
506
+ than restating them (030ca0d, c1bc2aa).
507
+ - **Default changes + migration:** _none_
508
+ - **Security and correctness:** _none_
509
+ - **Honest nulls:** a blocker whose resolution condition no passage of time could
510
+ satisfy — a default-OFF gate cannot soak, so the switch removal discharges it
511
+ and the original wording stays verbatim beside the resolution, because the
512
+ unsatisfiable condition is itself the finding (7c6b404).
351
513
  - **Known limitations:** _none_
352
514
 
353
515
  ### BREAKING CHANGES
@@ -400,8 +562,13 @@ Tests: 13384 (+51 since 9.36.0)
400
562
 
401
563
  ### Release highlights
402
564
 
403
- <!-- Curated head: fill before merge, keep it under 10 lines, and leave `_none_` where it is genuinely the answer. The generated log below is unchanged. -->
404
- - **Behaviour changes:** _auto-derived, rewrite before merge:_ rule/schema diffs, breaking commits or removed public surface in 9f69017, 924cad8, 3c20d47, 72bb1bc.
565
+ - **Behaviour changes:** the demand gate reads `project.audience` and is inert at
566
+ `self` — a market-demand ladder no longer fires on a project that intends no
567
+ market (9f69017). The two UI rules stop claiming the `ui-route-nudge` concern
568
+ reads their `keyword:` triggers; it does not, and six surfaces said it did
569
+ (3c20d47). The design skills now reach the consumers they were written for
570
+ (72bb1bc). The CI-side change in 924cad8 is internal to the pipeline and
571
+ changes no consumer-visible behaviour.
405
572
  - **Default changes + migration:** _none_
406
573
  - **Security and correctness:** _none_
407
574
  - **Honest nulls:** _none_
package/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  [![Smoke](https://github.com/event4u-app/agent-config/actions/workflows/smoke.yml/badge.svg)](https://github.com/event4u-app/agent-config/actions/workflows/smoke.yml) [![Public install smoke (3 OS × 2 Node)](https://github.com/event4u-app/agent-config/actions/workflows/smoke-public-install.yml/badge.svg)](https://github.com/event4u-app/agent-config/actions/workflows/smoke-public-install.yml) [![npm](https://img.shields.io/npm/v/@event4u/agent-config?style=flat-square&label=npm&color=orange)](https://www.npmjs.com/package/@event4u/agent-config) [![agent-config MCP server](https://glama.ai/mcp/servers/event4u-app/agent-config/badges/score.svg)](https://glama.ai/mcp/servers/event4u-app/agent-config) [![MCP Toplist](https://mcptoplist.com/badge/glama%2Fevent4u-app%2Fagent-config.svg)](https://mcptoplist.com/server/glama%2Fevent4u-app%2Fagent-config)
6
6
 
7
- [![Skills](https://img.shields.io/badge/Skills-289-orange?style=flat-square)](dist/agent-src/skills/) [![Rules](https://img.shields.io/badge/Rules-116-orange?style=flat-square)](dist/agent-src/rules/) [![Commands](https://img.shields.io/badge/Commands-196-orange?style=flat-square)](dist/agent-src/commands/) [![Guidelines](https://img.shields.io/badge/Guidelines-104-orange?style=flat-square)](docs/guidelines/) [![Personas](https://img.shields.io/badge/Personas-29-orange?style=flat-square)](dist/agent-src/personas/) [![Advisors](https://img.shields.io/badge/Advisors-5-orange?style=flat-square)](dist/agent-src/personas/advisors/)
7
+ [![Skills](https://img.shields.io/badge/Skills-289-orange?style=flat-square)](dist/agent-src/skills/) [![Rules](https://img.shields.io/badge/Rules-116-orange?style=flat-square)](dist/agent-src/rules/) [![Commands](https://img.shields.io/badge/Commands-196-orange?style=flat-square)](dist/agent-src/commands/) [![Guidelines](https://img.shields.io/badge/Guidelines-105-orange?style=flat-square)](docs/guidelines/) [![Personas](https://img.shields.io/badge/Personas-29-orange?style=flat-square)](dist/agent-src/personas/) [![Advisors](https://img.shields.io/badge/Advisors-5-orange?style=flat-square)](dist/agent-src/personas/advisors/)
8
8
 
9
9
  **Try it in 30 seconds** — drop one read-only subagent into any repo and watch it gate "done": `@production-validator check this branch is actually done`. No wizard, no lock-in, nothing else installed — the [30-second wedge ↓](#quickstart) is the whole first step. Start at the proof, not the catalog: **[event4u-app.github.io/agent-config/proof/](https://event4u-app.github.io/agent-config/proof/)**.
10
10
 
@@ -224,6 +224,11 @@ Chunked commits (the agent picks the split — never ask how, per
224
224
  [`/create-pr`](../../git/pr/create.md): archival sweep, preflight,
225
225
  push, PR opened **ready for review** (not draft).
226
226
 
227
+ This step is where the run **ends**, not a step it may stop before — see the
228
+ second Iron Law below. The invocation already authorised the push and the PR;
229
+ asking for them again is the re-ask
230
+ [`no-cheap-questions`](../../rules/no-cheap-questions.md) § IL 5 forbids.
231
+
227
232
  ### 7. CI — fix locally, honour the push gate
228
233
 
229
234
  Follow [`/create-pr` § 4d](../../git/pr/create.md): wait for the
@@ -258,6 +263,39 @@ A ROADMAP CLAIMED "IN FLIGHT", "MERGED", OR "DONE" WITHOUT A LIVE CHECK
258
263
  AT THE MOMENT OF THE CLAIM IS AN UNVERIFIED CLAIM.
259
264
  ```
260
265
 
266
+ ## Iron Law — the run ends at a PR, never at an offer to open one
267
+
268
+ ```
269
+ STEP 6 IS AN END CONDITION, NOT A STEP THE RUN MAY STOP BEFORE REACHING.
270
+ A RUN THAT PRODUCED COMMITS ENDS WITH A PR OPENED FOR REVIEW.
271
+ THE INVOCATION IS THE ACCEPT — IT COVERS THE BRANCH, THE CHUNKED COMMITS,
272
+ THE FIRST PUSH TO THAT BRANCH, AND THE PR. NEVER RE-ASK FOR THEM.
273
+ "SAY THE WORD AND I'LL OPEN IT" IS A PROMISSORY CLOSE, WHICH
274
+ verify-before-complete ALREADY FORBIDS. SO IS ENDING ON COMMITTED-BUT-UNPUSHED
275
+ WORK WITHOUT NAMING IT.
276
+ STOPPING EARLIER IS LEGAL ONLY AS ONE OF process-full's FIVE NAMED HALTS,
277
+ A HARD-FLOOR TRIGGER, OR AN N=3 EXHAUSTION — AND THE HALT IS NAMED IN THE
278
+ REPORT TOGETHER WITH WHAT IS STILL UNPUSHED.
279
+ ```
280
+
281
+ **What this does NOT lift.** § 7's re-push restriction stands unchanged: the
282
+ invocation covers the *first* push that opens the PR, never the pushes that
283
+ follow a CI fix. Those are Hard-Floor triggers needing the user's word that turn
284
+ ([`non-destructive-by-default`](../../rules/non-destructive-by-default.md)), and
285
+ no reading of this law manufactures a per-PR standing mandate.
286
+
287
+ **Why it needed saying, measured on this command's own run.** A session screened
288
+ 30 roadmaps, recovered from a live claim collision, picked, branched and did the
289
+ work — then closed with a status report and no PR, because § 6 read as a step in
290
+ a list rather than as the condition the run terminates on. The user had to ask
291
+ for the PR the invocation had already authorised. A step that can be narrated
292
+ instead of executed is not an obligation; an end condition is.
293
+
294
+ **Honest scope.** `enforced_by: none` — nothing inspects a chat turn for a
295
+ missing PR, so this is model-carried like the live screen above it. The
296
+ deterministic half is elsewhere and unchanged: `/create-pr` runs the archival
297
+ sweep and preflight, and CI gates the branch once the PR exists.
298
+
261
299
  ## Rules
262
300
 
263
301
  - **One roadmap per invocation.** Never chain a second pick after the
@@ -83,10 +83,31 @@ When `personal.minimal_output: true`:
83
83
  ### Minimize tool calls
84
84
 
85
85
  - Parallel reads — don't read 5 files sequentially.
86
- - Regex search over full file reads. View specific line ranges.
87
86
  - One codebase search call with all symbols — not 5 separate.
88
87
  - Short question → short answer. Summary tables only for 3+ items.
89
88
 
89
+ ### Size-gated read procedure (the 800-line threshold)
90
+
91
+ The rule states the obligation; this is how to discharge it. Three steps, in
92
+ order, and each one narrows the next:
93
+
94
+ 1. **Size** — `wc -l <file>`. Under the threshold, stop here and read it.
95
+ 2. **Shape** — a structural grep for the anchors you need, emitting offsets:
96
+ `grep -nE '^(class|function|def|export|## )' <file>` for a map, or
97
+ `grep -n '<the symbol>' <file>` when you know what you are after.
98
+ 3. **Slice** — a ranged read around those offsets only (the host's
99
+ `offset`/`limit` read, or `sed -n 'A,Bp'`), widened once if the slice
100
+ straddles a boundary.
101
+
102
+ Two failure modes this replaces. **Blind full read:** loading a 3,000-line file
103
+ to answer a question one function answers — the cost is paid on every later turn
104
+ that carries it. **Blind slice:** reading lines 1–200 of an unknown file and
105
+ guessing the rest, which is the probe skipped rather than performed.
106
+
107
+ The step-2 grep is not a second probe of the same file for the same fact — it
108
+ returns information step 1 did not have, so it is one operation with step 3, per
109
+ the enumerated-set carve-out.
110
+
90
111
  ### Exceptions
91
112
 
92
113
  - Small output (< 30 lines) — read directly.
@@ -38,7 +38,7 @@ Live Phase 1 schema (see [`templates/agent-settings.md`](../../templates/agent-s
38
38
  | `verbosity.offer_council_in_delivery` | When `false`, delivery commands skip the optional "run Council on this?" offer. |
39
39
  | `verbosity.post_action_reports` | `off` / `minimal` / `full` — multi-line status blocks after a successful action. |
40
40
  | `verbosity.intent_announcements` | When `false`, writers must not generate "Let me…", "Now I will…", "Found it" openers. |
41
- | `telegraph.speak_scope` | `off` / `prose_only` / `aggressive` — telegraph-speak grammar scope. Iron-Law fenced blocks never touched. |
41
+ | `telegraph.speak` | When `false` (the shipped default) the telegraph-speak rule does not ship at all; when `true` its own carve-out list states the grammar's scope — options blocks, Iron-Law literals, code, and paths stay byte-stable. |
42
42
 
43
43
  Phase 10 adds `verbosity.script_output` (`silent` / `minimal` / `verbose`) and `verbosity.taskfile_command_echo` (`true` / `false`); writer artifacts cite this row when those land.
44
44
 
@@ -72,6 +72,45 @@ Calling the **same tool** more than **2 times in a row** with similar parameters
72
72
  **"Similar parameters" is the load-bearing word — an enumerated set is not a loop.** Walking N *declared, distinct* targets (a downstream-caller sweep per [`downstream-changes`](downstream-changes.md), an override chain, the members of a grep result) is one operation whose parameters differ every call. Counting it as N repetitions makes `downstream-changes`' "find **ALL** callers, tests, imports" unsatisfiable — it cannot be done in two calls. The loop this detects is *repetition without new information*: same target, same parameters, hoping for a different answer. Mirrors the same carve-out in [`token-efficiency`](token-efficiency.md).
73
73
  `sequentialthinking` is especially prone to loops: at most **once** per task, NEVER for simple file operations, command execution, or straightforward edits.
74
74
 
75
+ ### Waiting is one waiter, never a fleet
76
+
77
+ ```
78
+ ONE WAITER PER CONDITION. NEVER A TIMER AND A WATCHER FOR THE SAME WAIT.
79
+ NEVER START A NEW WAITER WHILE ONE IS STILL LIVE FOR THAT CONDITION.
80
+ A NUMBER THAT CHANGED IS NOT NEW INFORMATION UNLESS IT CHANGES WHAT YOU DO NEXT.
81
+ ```
82
+
83
+ Waiting on something external — CI, a deploy, a queue, a background job — is the
84
+ one shape the loop test above systematically misses, in both of its clauses.
85
+
86
+ - **"Same parameters" fails.** A `sleep 240` followed by `sleep 420` followed by
87
+ `sleep 595` are three different calls by any parameter comparison, so nothing
88
+ reads them as repetition.
89
+ - **"Repetition without new information" fails too**, and this is the subtler
90
+ half: the poll genuinely returns a different value each round — 31 green, then
91
+ 34, then 36 — which *feels* like progress. It is not information unless a
92
+ different digit would make you act differently. It would not: the only actions
93
+ available were wait, or stop and report, and 34 licensed neither more than 31
94
+ did. **The discriminator is the decision, not the digits.**
95
+
96
+ So state it separately: pick **one** waiter for the condition and let it finish.
97
+ Where the harness re-invokes on completion, waiting costs nothing and polling
98
+ costs a turn per expiry — and every stacked waiter is a turn that arrives *after*
99
+ the answer already did. Where it does not, one `until <condition>` loop is still
100
+ one call rather than N.
101
+
102
+ **Measured once, at n=1, and worth naming for its shape rather than its
103
+ frequency** (2026-08-12): a CI wait started roughly 35 background commands —
104
+ a fresh timer *and* a fresh condition-watcher per round, none cancelled when the
105
+ next pair started. CI settled with about fifteen still live; each then expired
106
+ and produced an empty turn. Nothing was corrupted, which is exactly why it ran
107
+ so long: every individual step looked reasonable.
108
+
109
+ **Enforcement: none, and the reason is structural.** The `context-hygiene` hook
110
+ counts tool calls; a waiter is indistinguishable from any other call at that
111
+ layer, and nothing in the envelope says two live waiters are watching one
112
+ condition. This is model-carried on every host.
113
+
75
114
  ## Read-Loop Detection — the 15 / 25 rule
76
115
 
77
116
  ```
@@ -74,8 +74,9 @@ from. Where a consumer has enabled it, it **exempts** skills marked
74
74
  - Preserve all worked examples, decision tables, and code blocks verbatim
75
75
 
76
76
  This exemption is limited to the skill's guidance content; reply prose from the
77
- *agent* (not from the skill body) remains subject to telegraph-speak unless the
78
- user has set `telegraph.speak_scope: off`.
77
+ *agent* (not from the skill body) remains subject to telegraph-speak wherever
78
+ that rule ships at all (`telegraph.speak`), within the carve-outs the rule
79
+ itself names.
79
80
 
80
81
  ## Value-over-budget escalation
81
82
 
@@ -52,6 +52,28 @@ cohorts (batch), or a cost-aware model/effort decision → route via the
52
52
  [`token-optimizer`](../skills/token-optimizer/SKILL.md) index branch
53
53
  (`api-cost-levers` row) — single source of truth for the billing levers.
54
54
 
55
+ ## Size-gated reads — probe a large file before loading it whole
56
+
57
+ ```
58
+ A FILE OVER THE THRESHOLD IS PROBED, NEVER LOADED WHOLE ON SPEC.
59
+ SIZE CHECK → STRUCTURAL GREP → BOUNDED SLICE. FULL READ BELOW IT.
60
+ ```
61
+
62
+ **Threshold: 800 lines.** Above it, establish the file's shape before its
63
+ content — size, then a structural grep for the offsets that matter, then a
64
+ ranged read of those offsets. Below it, just read it: a probe you did not need
65
+ costs a call and teaches nothing.
66
+
67
+ The number is a **stated default, not a measured optimum** — said plainly rather
68
+ than implying a derivation it does not have. *Revisit-if:* a run records a
69
+ probe-then-slice that cost more than the full read would have, or the host's
70
+ ranged-read primitive changes its own default. Either falsifies the number, not
71
+ the obligation.
72
+
73
+ Additive: the repetition discriminator above is untouched, an enumerated
74
+ multi-file sweep stays ONE operation, and re-probing a file whose shape you
75
+ already established this session is the loop, not the fix.
76
+
55
77
  ## Mechanics
56
78
 
57
79
  Anti-loop patterns, act-skip-narration / stop-early / minimize-tool-calls clauses, and small-output / debugging exceptions: [`token-efficiency-mechanics`](../contexts/communication/rules-auto/token-efficiency-mechanics.md). Precedence: never overrides `user-interaction` or command rules.
@@ -335,6 +335,23 @@ function archive_completed(
335
335
  if (stats.open_ !== 0 || stats.deferred !== 0) {
336
336
  continue; // not complete
337
337
  }
338
+ // An unresolved blocker outlives its steps. Closing every box does not
339
+ // answer a question the roadmap raised for a human, and archiving on
340
+ // step-count alone is how `b-highlights-mechanism` left the active tree
341
+ // unanswered in the 9.29 roadmap — four releases before the failure it
342
+ // predicted shipped in the 9.36.0 changelog head. Same discipline
343
+ // `roadmap-progress-sync` Iron Law 3 applies to `[~]` steps: a roadmap
344
+ // carrying an open decision stays visible until the decision is made.
345
+ const open_blockers = stats.open_blockers;
346
+ if (open_blockers.length > 0) {
347
+ const ids = open_blockers.map((b) => b.id).join(', ');
348
+ process.stderr.write(
349
+ ` ⚠️ ${stats.rel}: all steps closed but ${open_blockers.length} ` +
350
+ `blocker(s) still open (${ids}) — not archived. Resolve them, ` +
351
+ 'or record the decision, then re-run the sweep.\n',
352
+ );
353
+ continue;
354
+ }
338
355
  const old_rel = `agents/roadmaps/${stats.rel}`;
339
356
  if (changed_only && !(touched as Set<string>).has(old_rel)) {
340
357
  continue; // complete, but not this branch's work
@@ -11,6 +11,11 @@ execution:
11
11
  command:
12
12
  - ./scripts-run
13
13
  - src/scripts/adr/regenerate_index
14
+ runtime_requires:
15
+ bins:
16
+ - bash
17
+ - node
18
+ network: []
14
19
  workspaces:
15
20
  - agent-config-maintainer
16
21
  packs:
@@ -228,10 +228,12 @@ Three vendor CLIs are wired:
228
228
  model: claude-sonnet-4-5
229
229
  ```
230
230
 
231
- - **OpenAI / Codex** — invokes `codex exec --json` and walks the
232
- newline-delimited JSON event stream, pulling text from
233
- `item.completed` and tokens from `turn.completed`. Session id
234
- is preserved.
231
+ - **OpenAI / Codex** — invokes `codex exec --json -` with the prompt piped on
232
+ stdin, and walks the newline-delimited JSON event stream, pulling text from
233
+ `item.completed` and tokens from `turn.completed`. Session id is preserved.
234
+ Unlike the Anthropic client, there is **no separate system-prompt channel**:
235
+ `codex exec` has no `--system` flag, so a system prompt is prepended to the
236
+ user prompt in the same payload.
235
237
 
236
238
  ```yaml
237
239
  members:
@@ -244,12 +246,23 @@ Three vendor CLIs are wired:
244
246
  - **Google / Gemini** — invokes `gemini --output-format json` with
245
247
  the prompt piped on stdin, parses the `response` + `stats.models.<m>.tokens`
246
248
  envelope. OAuth consent must be granted once interactively before
247
- the CLI is usable from a non-interactive shell.
249
+ the CLI is usable from a non-interactive shell. Like Codex and unlike Claude,
250
+ it has **no system-prompt flag** — `--system` is rejected outright with
251
+ `Unknown argument: system` — so the system prompt is prepended to the piped
252
+ payload.
253
+
254
+ Two caveats before enabling it, both measured 2026-08-12 and neither resolved.
255
+ The CLI's own `--help` says `-p/--prompt` is what selects non-interactive
256
+ mode, and this invocation passes neither `-p` nor the `query` positional;
257
+ whether piped stdin alone keeps it headless is **unestablished**. And the
258
+ free tier now refuses this client outright with `IneligibleTierError`, so a
259
+ round-trip could not be completed here at all. Enable it only if you can
260
+ confirm both on your own account.
248
261
 
249
262
  ```yaml
250
263
  members:
251
264
  gemini:
252
- enabled: true
265
+ enabled: false # see the two caveats above before flipping this
253
266
  mode: cli
254
267
  model: gemini-2.5-pro
255
268
  ```
@@ -265,6 +278,15 @@ substitutes.
265
278
  their community CLIs DO consume the API key and DO NOT bypass
266
279
  per-token billing — the contract doc warns explicitly.
267
280
 
281
+ Both take a single `-p <prompt>` and have no second channel, so the system
282
+ prompt is folded into that same value. Until 2026-08-12 it was **discarded**,
283
+ and these two members answered every question with no role, no neutrality
284
+ framing and no output contract while the run counted the reply as a peer
285
+ verdict. Two consequences worth knowing: their whole prompt travels on argv, so
286
+ a very large one can fail with `os_error: E2BIG` (the response carries a `hint`
287
+ saying so), and because their CLIs report no usage block, the input side of
288
+ their cost is an estimate rather than a provider figure.
289
+
268
290
  ### Cost-gate bypass for non-billable members
269
291
 
270
292
  `ExternalAIClient.billable` is the contract. Clients with
@@ -11,6 +11,11 @@ execution:
11
11
  command:
12
12
  - ./scripts-run
13
13
  - src/scripts/check_references
14
+ runtime_requires:
15
+ bins:
16
+ - bash
17
+ - node
18
+ network: []
14
19
  workspaces:
15
20
  - agent-config-maintainer
16
21
  packs:
@@ -118,7 +118,7 @@ A future `telegraph-v2.md` will tabulate the realised input-token saving against
118
118
 
119
119
  ## Cross-references
120
120
 
121
- - [`telegraph-speak`](../../rules/telegraph-speak.md) — runtime rule the script mirrors for input-side targets; `telegraph.speak_scope` does **not** gate this script (input-side runs regardless).
121
+ - [`telegraph-speak`](../../rules/telegraph-speak.md) — runtime rule the script mirrors for input-side targets; that output-side rule does **not** gate this script (input-side runs regardless).
122
122
  - [`src/scripts/validate_safe_paths.ts`](../../../src/scripts/validate_safe_paths.ts) — Phase 0 gate; ported from upstream Telegraph `63a91ec`.
123
123
  - [`src/scripts/condense_memory.ts`](../../../src/scripts/condense_memory.ts) — implementation.
124
124
  - [`tests/scripts/condense_memory.test.ts`](../../../tests/scripts/condense_memory.test.ts) — regression locks for each carve-out + idempotency + denylist.
@@ -12,6 +12,11 @@ execution:
12
12
  - ./scripts-run
13
13
  - src/scripts/skill_linter
14
14
  - "--all"
15
+ runtime_requires:
16
+ bins:
17
+ - bash
18
+ - node
19
+ network: []
15
20
  workspaces:
16
21
  - agent-config-maintainer
17
22
  packs:
@@ -11,6 +11,11 @@ execution:
11
11
  command:
12
12
  - ./scripts-run
13
13
  - src/scripts/check_md_language
14
+ runtime_requires:
15
+ bins:
16
+ - bash
17
+ - node
18
+ network: []
14
19
  workspaces:
15
20
  - agent-config-maintainer
16
21
  packs:
@@ -22,7 +22,7 @@ packs:
22
22
  * Rewriting an existing roadmap (phase restructure, goal pivot,
23
23
  council-pass integration — not a checkbox flip)
24
24
  * Drafting a phase block, exit criteria, or rollback section that
25
- will land inside an existing roadmap
25
+ will land inside an existing roadmap — an operator **symptom** as the input has its own entry procedure: [`symptom-driven harvest`](../../../docs/guidelines/agent-infra/symptom-driven-harvest-loop.md)
26
26
 
27
27
  Do NOT use this skill when:
28
28
 
@@ -56,6 +56,10 @@ INTENT
56
56
  │ → cite markitdown (upstream: https://github.com/microsoft/markitdown)
57
57
  │ Convert FIRST, then read the markdown — never paste raw binary.
58
58
  │
59
+ ├── Large file read (source / data / log already in the tree, > 800 lines)
60
+ │ → cite [token-efficiency § Size-gated reads](../../rules/token-efficiency.md)
61
+ │ (size → structural grep → bounded slice; never a full read on spec)
62
+ │
59
63
  ├── Repeated tool-call across N targets
60
64
  │ → cite [token-efficiency](../../rules/token-efficiency.md)
61
65
  │ (batch, parallelize, prune; one tool call > many)
@@ -81,7 +85,7 @@ INTENT
81
85
  |---|---|---|---|
82
86
  | `cli-output-handling` | `src/rules/cli-output-handling.md` | `verbose`, `tail`, `grep`, `CLI` | Wrap-tail-grep contract for any verbose command |
83
87
  | `rtk-output-filtering` | `src/skills/rtk-output-filtering/SKILL.md` | `rtk`, `verbose`, `filter`, `wrap` | Project-local rtk filters; wrapper command |
84
- | `token-efficiency` | `src/rules/token-efficiency.md` | `redirect`, `verbose`, `concise`, `tool` | Batch + parallelize tool calls; brevity floor |
88
+ | `token-efficiency` | `src/rules/token-efficiency.md` | `redirect`, `verbose`, `concise`, `tool`, `large file` | Batch + parallelize tool calls; brevity floor; size-gated reads (probe → grep → slice above 800 lines) |
85
89
  | `agent-handoff` | `src/domains/meta/agent-handoff/command.md` | `handoff`, `fresh`, `chat`, `context`, `resume`, `session` | Session picker + generated handoff auto-seeding the next session |
86
90
  | `direct-answers` | `src/rules/direct-answers.md` | `brevity`, `flattery`, `severity`, `tiered` | Iron-Law brevity floor (kernel) |
87
91
  | `markitdown` | upstream: github.com/microsoft/markitdown | `PDF`, `DOCX`, `HTML`, `convert` | Document → markdown converter (authoritative-link only) |