@event4u/agent-config 10.1.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 (115) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +109 -0
  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/skills/ai-council/SKILL.md +28 -6
  11. package/dist/agent-src/skills/condense-memory/SKILL.md +1 -1
  12. package/dist/agent-src/skills/roadmap-writing/SKILL.md +1 -1
  13. package/dist/agent-src/skills/token-optimizer/SKILL.md +5 -1
  14. package/dist/agent-src/templates/agent-settings.md +12 -28
  15. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +2 -2
  16. package/dist/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +0 -1
  17. package/dist/cli/registry.js +1 -1
  18. package/dist/cli/registry.js.map +1 -1
  19. package/dist/cli-delegate/{chunk-3JUTT26I.js → chunk-6ENSXSBW.js} +1 -1
  20. package/dist/cli-delegate/{chunk-TVGXH7VA.js → chunk-6LOPHJLD.js} +1 -1
  21. package/dist/cli-delegate/{chunk-XT2YTJCZ.js → chunk-AYKQGIBG.js} +4 -0
  22. package/dist/cli-delegate/{chunk-HJSKTMIF.js → chunk-BV3WR67D.js} +3 -19
  23. package/dist/cli-delegate/{chunk-HTIU3W56.js → chunk-BWMXLD4B.js} +6 -2
  24. package/dist/cli-delegate/{chunk-2H5SE7DU.js → chunk-E4RUZKXB.js} +165 -38
  25. package/dist/cli-delegate/{chunk-XTC5ARB6.js → chunk-IR3IVRVC.js} +7 -2
  26. package/dist/cli-delegate/{chunk-LRXJK6GN.js → chunk-JMQZ7MM5.js} +1 -1
  27. package/dist/cli-delegate/{chunk-NX5AXSLD.js → chunk-X3VOARZD.js} +3 -3
  28. package/dist/cli-delegate/cmd_analyze_session.js +1 -1
  29. package/dist/cli-delegate/cmd_brand_status.js +1 -1
  30. package/dist/cli-delegate/cmd_conformance.js +881 -204
  31. package/dist/cli-delegate/cmd_doctor.js +3 -3
  32. package/dist/cli-delegate/cmd_explain.js +2 -2
  33. package/dist/cli-delegate/cmd_export.js +4 -4
  34. package/dist/cli-delegate/cmd_handoff.js +6 -5
  35. package/dist/cli-delegate/cmd_mcp_available.js +1 -1
  36. package/dist/cli-delegate/cmd_migrate.js +2 -2
  37. package/dist/cli-delegate/cmd_packs_active.js +2 -2
  38. package/dist/cli-delegate/cmd_prune.js +4 -4
  39. package/dist/cli-delegate/cmd_route_audit.js +2 -2
  40. package/dist/cli-delegate/cmd_route_explain.js +1 -1
  41. package/dist/cli-delegate/cmd_session_recycle.js +44 -9
  42. package/dist/cli-delegate/cmd_settings_get.js +2 -2
  43. package/dist/cli-delegate/cmd_settings_migrate.js +4 -4
  44. package/dist/cli-delegate/cmd_settings_set.js +2 -2
  45. package/dist/cli-delegate/cmd_sync.js +4 -4
  46. package/dist/cli-delegate/cmd_uninstall.js +4 -4
  47. package/dist/cli-delegate/cmd_update.js +1 -1
  48. package/dist/cli-delegate/cmd_upgrade.js +1 -1
  49. package/dist/cli-delegate/cmd_validate.js +4 -4
  50. package/dist/cli-delegate/cmd_versions.js +1 -1
  51. package/dist/discovery/deprecation-report.md +1 -1
  52. package/dist/discovery/discovery-manifest.json +11 -11
  53. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  54. package/dist/discovery/discovery-manifest.summary.md +1 -1
  55. package/dist/discovery/dormancy-report.md +1 -1
  56. package/dist/discovery/orphan-report.md +1 -1
  57. package/dist/discovery/packs.json +2 -2
  58. package/dist/discovery/trust-report.md +1 -1
  59. package/dist/discovery/workspaces.json +2 -2
  60. package/dist/hooks/dispatch.js +88 -20
  61. package/dist/install/install.mjs +9 -21
  62. package/dist/mcp/registry-manifest.json +1 -1
  63. package/dist/mcp/server.json +2 -2
  64. package/dist/mcp/server.mjs +1336 -489
  65. package/dist/scripts/_lib/agent_settings.js +25 -2
  66. package/dist/scripts/_lib/agent_settings.js.map +1 -1
  67. package/dist/scripts/_lib/compile_time_toggles.js +4 -3
  68. package/dist/scripts/_lib/compile_time_toggles.js.map +1 -1
  69. package/dist/server/io/yamlIO.js +0 -2
  70. package/dist/server/io/yamlIO.js.map +1 -1
  71. package/dist/server/schemas/settings.js +3 -9
  72. package/dist/server/schemas/settings.js.map +1 -1
  73. package/dist/shared/settingsClasses.js +64 -2
  74. package/dist/shared/settingsClasses.js.map +1 -1
  75. package/dist/ui/assets/{index-B5qGYOJo.js → index-5fXOHoVh.js} +2 -2
  76. package/dist/ui/assets/index-5fXOHoVh.js.map +1 -0
  77. package/dist/ui/index.html +1 -1
  78. package/docs/contracts/settings-classes.md +307 -145
  79. package/docs/guidelines/agent-infra/layered-settings.md +1 -2
  80. package/docs/guidelines/agent-infra/symptom-driven-harvest-loop.md +104 -0
  81. package/package.json +1 -1
  82. package/src/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +0 -1
  83. package/src/config/agent-settings.template.yml +12 -30
  84. package/src/config/gate-violation-baselines.json +9 -3
  85. package/src/config/profiles/balanced.ini +0 -2
  86. package/src/config/profiles/full.ini +1 -3
  87. package/src/config/profiles/minimal.ini +0 -2
  88. package/src/scripts/_cli/cmd_session_recycle.ts +66 -9
  89. package/src/scripts/_cli/handoff_sessions.ts +3 -2
  90. package/src/scripts/_lib/agent_settings.ts +25 -2
  91. package/src/scripts/_lib/bench_telegraph.ts +1 -1
  92. package/src/scripts/_lib/cc_transcript.ts +25 -0
  93. package/src/scripts/_lib/compile_time_toggles.ts +4 -3
  94. package/src/scripts/ai_council/clients.ts +228 -33
  95. package/src/scripts/cache_realization_report.ts +3 -2
  96. package/src/scripts/check_rule_projection_integrity.ts +3 -1
  97. package/src/scripts/conformance_scan.ts +282 -9
  98. package/src/scripts/cost/track.mjs +10 -4
  99. package/src/scripts/council_cli.ts +33 -3
  100. package/src/scripts/external_sources_denylist.json +3 -1
  101. package/src/scripts/hook_manifest.yaml +17 -6
  102. package/src/scripts/hooks/block_unauthorized_git.ts +54 -8
  103. package/src/scripts/hooks/delegation_nudge_hook.ts +33 -8
  104. package/src/scripts/hooks/evidence_independence.ts +61 -9
  105. package/src/scripts/hooks/session_eol_hook.ts +123 -3
  106. package/src/scripts/hooks/turn_end_gate_hook.ts +31 -0
  107. package/src/scripts/lint_settings_classes.ts +273 -11
  108. package/src/scripts/lint_symptom_intake.ts +241 -0
  109. package/src/scripts/report_consultation_rate.ts +2 -1
  110. package/src/scripts/report_skill_activation.ts +6 -4
  111. package/src/scripts/report_skill_obligation_violations.ts +2 -1
  112. package/src/server/io/yamlIO.ts +0 -2
  113. package/src/server/schemas/settings.ts +3 -19
  114. package/src/shared/settingsClasses.ts +93 -2
  115. 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.1.0",
9
+ "version": "10.2.0",
10
10
  "keywords": [
11
11
  "agent-config",
12
12
  "skills",
package/CHANGELOG.md CHANGED
@@ -339,6 +339,115 @@ 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.2.0](https://github.com/event4u-app/agent-config/compare/10.1.0...10.2.0) (2026-08-13)
343
+
344
+ ### Release highlights
345
+
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 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
+
342
451
  ## [10.1.0](https://github.com/event4u-app/agent-config/compare/10.0.0...10.1.0) (2026-08-12)
343
452
 
344
453
  ### Release highlights
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.
@@ -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
@@ -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.
@@ -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) |
@@ -176,12 +176,6 @@ chat_history:
176
176
  # Logging granularity: per_turn | per_phase | per_tool
177
177
  frequency: per_phase
178
178
 
179
- # Max file size in KB before overflow handling kicks in
180
- max_size_kb: 256
181
-
182
- # Overflow behavior: rotate (drop oldest) | condense (summarize)
183
- on_overflow: rotate
184
-
185
179
  # --- Work-engine hooks ---
186
180
  #
187
181
  # Lifecycle hook surface of the `work_engine` Python engine
@@ -288,12 +282,6 @@ quality:
288
282
  # never claimed as passing.
289
283
  local_auto_run: false
290
284
 
291
- # Wait for remote CI to finish on the PR / pipeline (true, false)
292
- # true = poll GitHub check-runs / pipeline after push and report
293
- # green / red before handing back
294
- # false = push and hand back immediately (default)
295
- wait_for_remote_ci: false
296
-
297
285
  # --- Subagent orchestration ---
298
286
  subagents:
299
287
  # Model for implementer subagents (empty = same tier as the session model)
@@ -485,19 +473,18 @@ verbosity:
485
473
  # safe task per Phase 10.3.
486
474
  taskfile_command_echo: false
487
475
 
488
- # --- Telegraph speak (authoring-only) ---
476
+ # --- Telegraph condensation (output-side) ---
489
477
  #
490
- # Telegraph-style condensation scope for newly authored prose. The
491
- # compile-time toggle (`telegraph.speak`) is added in Phase 8.
492
- # `speak_scope` lands now so the charter and consumers can pin it.
478
+ # One lever, deliberately: whether the telegraph-speak rule ships at all.
479
+ # The rule body states its own grammar scope — which carve-outs (numbered
480
+ # options, Iron-Law literals, code, paths) stay full prose — so there is no
481
+ # separate scope key to pin.
493
482
  telegraph:
494
- # speak_scope = how widely telegraph-speak grammar applies in chat
495
- # off = no telegraph grammar in output (compile-time still
496
- # governed by telegraph.speak)
497
- # prose_only = telegraph in body prose; numbered options +
498
- # Iron-Law-literal blocks stay full prose
499
- # aggressive = telegraph everywhere except Iron-Law literals
500
- speak_scope: prose_only
483
+ # speak: false = DORMANT (the shipped default). The rule is omitted from
484
+ # dist/router.json entirely, so its body never reaches a host. That
485
+ # omission is what stops the cost. Set true only after an output-side
486
+ # bench clears the kill-criterion bar.
487
+ speak: false
501
488
 
502
489
  telemetry:
503
490
  artifact_engagement:
@@ -552,7 +539,7 @@ Personal and project-level settings (initial file written by
552
539
  **Key paths use dot-notation** to denote nesting: `personal.user_name`
553
540
  lives under `personal:` in YAML.
554
541
 
555
- The `verbosity.*` and `telegraph.speak_scope` rows are summarized below;
542
+ The `verbosity.*` rows are summarized below;
556
543
  the canonical narrative lives in
557
544
  [`docs/customization.md` § Verbosity](../../docs/customization.md#verbosity).
558
545
 
@@ -575,8 +562,6 @@ the canonical narrative lives in
575
562
  | `code_style.docblocks` | `minimal`, `full` | `minimal` | Consumed by the `code-comment-discipline` rule. `minimal`: no signature-mirroring docblocks; docblocks only for machine-relevant precision (generics, array shapes) or genuine why-context. `full`: exported public library surface may carry one-line summary docblocks; the redundancy ban still holds. |
576
563
  | `chat_history.enabled` | `true`, `false` | `true` | Persist chat events to `agents/runtime/.agent-chat-history` (JSONL) for crash recovery. |
577
564
  | `chat_history.frequency` | `per_turn`, `per_phase`, `per_tool` | per profile | Logging granularity. Defaults: `minimal`→`per_turn`, `balanced`→`per_phase`, `full`→`per_tool`. |
578
- | `chat_history.max_size_kb` | integer | per profile | Max file size before overflow handling. Defaults: `minimal`→`128`, `balanced`→`256`, `full`→`512`. |
579
- | `chat_history.on_overflow` | `rotate`, `condense` | per profile | On overflow: `rotate` drops oldest entries; `condense` marks the file for summarization on the next turn. Defaults: `minimal`/`balanced`→`rotate`, `full`→`condense`. |
580
565
  | `chat_history.text_limits.{user,agent,tool,phase}` | integer (chars) | `user=0`, `agent=5000`, `tool=200`, `phase=200` | Per-entry-type text-length cap. `0` = verbatim, no slice. `N > 0` = collapse whitespace, slice to N chars, append `" … [+K chars]"` so the log self-reports truncation. Defaults match `DEFAULT_TEXT_LIMITS` in `scripts/chat_history.ts`. |
581
566
  | `hooks.concern_budget.{max_per_event,tier1_concerns,hard_fail}` | integer / list / `true`,`false` | `8` / `[]` / `false` | Concern budget gate for the hook dispatcher (`lint_hook_concern_budget`): caps concerns per (platform, event) cell, restricts `fail_closed: true` to the `tier1_concerns` allowlist, and `hard_fail: false` keeps the gate warn-only. |
582
567
  | `hooks.injection_scan.enabled` | `true`, `false` | `false` | PostToolUse prompt-injection scanner: scans tool output for injection signatures and warns in context (exit 2) — never blocks. |
@@ -587,7 +572,6 @@ the canonical narrative lives in
587
572
  | `roadmap.skip_pre_run_gate` | `true`, `false` | `true` | When `true` (default): `/roadmap:process-step\|phase\|full` skips the interactive pre-run summary and starts the loop immediately — the resolved roadmap, cadence, and council are surfaced inline so an unwanted pick can still be aborted. When `false`: the loop shows the pre-run summary with numbered options (Go / Different roadmap / Different scope / Toggle council / Abort) and waits. The gate is always shown — regardless of this flag — when the roadmap is ambiguous (multiple active, none named) or a scope / cadence conflict has no sensible default. |
588
573
  | `roadmap.quality_cadence` | `end_of_roadmap`, `per_phase`, `per_step` | `end_of_roadmap` | When `/roadmap:process-step|phase|full` runs the project's quality pipeline — only relevant when `quality.local_auto_run` is `true`; when it is `false` (the default) local pipeline runs are suppressed at every cadence and remote CI is the gate. Default skips per-step / per-phase runs and gates only the final archival. `per_phase` runs once after every phase; `per_step` is the legacy verbose mode. Step checkboxes and the dashboard are always updated regardless. |
589
574
  | `quality.local_auto_run` | `true`, `false` | `false` | When `false` (default): agent NEVER runs the project's quality pipeline (`task ci`, `make test`, `npm run check`, PHPStan, ECS, Rector, test suites) proactively — and does not ask. The user runs quality tools manually; remote CI is the authoritative gate. The agent runs one only on (1) an explicit ask this turn, (2) a concrete CI failure (run exactly that failing check), or (3) the new-gate carve-out. When `true`: opt-in legacy — agent runs the pipeline autonomously when work is ready for verification. **Carve-out**: NEW CI gates / smoke tests / test files MUST run locally regardless of this flag — without execution the new gate is unverified evidence. Iron Law `verify-before-complete` still applies; suppressed runs are surfaced ("quality gates delegated to remote CI"), never claimed as passing. |
590
- | `quality.wait_for_remote_ci` | `true`, `false` | `false` | When `true`: after `git push`, the agent polls GitHub check-runs / pipeline status on the PR and reports green / red before handing back. When `false`: agent pushes and hands back immediately; the user inspects CI themselves (default — saves agent runtime and tokens). |
591
575
  | `subagents.implementer_model` | model alias or empty | _(empty)_ | Model for implementer subagents. Empty = same tier as session model. See [subagent-configuration](../contexts/subagent-configuration.md). |
592
576
  | `subagents.judge_model` | model alias or empty | _(empty)_ | Model for judge subagents. Empty = one tier above implementer (opus if sonnet, sonnet if haiku). |
593
577
  | `subagents.max_parallel` | integer | `3` | Maximum parallel subagent invocations. `1` serializes. |
@@ -613,7 +597,7 @@ the canonical narrative lives in
613
597
  | `verbosity.offer_council_in_delivery` | `true`, `false` | `false` | Offer "run AI Council on this?" inside delivery commands (`/feature-plan`, `/review-changes`, `/roadmap-create`). Council commands themselves are unaffected. |
614
598
  | `verbosity.post_action_reports` | `off`, `minimal`, `full` | `minimal` | Multi-line status / summary blocks after a successful action. `off` = no report; `minimal` = one-line confirmation; `full` = bullet list. |
615
599
  | `verbosity.intent_announcements` | `true`, `false` | `false` | Intent announcements ("Let me check…", "Now I will…", "Found it") in skill bodies. `false` = act and emit the result. |
616
- | `telegraph.speak_scope` | `off`, `prose_only`, `aggressive` | `off` | How widely telegraph-speak grammar applies in chat. `off` = no telegraph grammar; `prose_only` = telegraph in body prose, numbered options + Iron-Law-literal blocks stay full prose; `aggressive` = telegraph everywhere except Iron-Law literals. The compile-time toggle `telegraph.speak` ships as `false` (dormant) — the projector gates the rule on `speak`, never on `speak_scope`. |
600
+ | `telegraph.speak` | `true`, `false` | `false` | Whether the telegraph-speak rule ships at all. `false` (default) = dormant: the projector omits the rule from `dist/router.json`, so its body never reaches a host. The rule body states its own grammar scope and carve-outs (numbered options, Iron-Law literals, code, paths), so this is the only lever. |
617
601
  | `telemetry.artifact_engagement.enabled` | `true`, `false` | `false` | Master switch for the artefact engagement log. Not in the shipped template — a missing `telemetry:` section means disabled (the recording rule no-ops). Default-off; zero file IO and zero token cost when `false`. Maintainer-targeted; consumers leave it off. |
618
602
  | `telemetry.artifact_engagement.granularity` | `task`, `phase-step`, `tool-call` | `task` | Boundary at which events are recorded. `tool-call` is expensive — opt-in only. |
619
603
  | `telemetry.artifact_engagement.record.consulted` | `true`, `false` | `true` | When `true`: record artefacts loaded into context. |
@@ -8,7 +8,7 @@
8
8
  # 1. Package defaults (shipped by event4u/agent-config)
9
9
  # 2. ~/.event4u/agent-config/agent-settings.yml — user-global DX-comfort
10
10
  # defaults (whitelist: name, ide, rule_loading_tier, personal.bot_icon,
11
- # personal.autonomy, telegraph.speak_scope). Created on opt-in via
11
+ # personal.autonomy, memory.cadence). Created on opt-in via
12
12
  # /onboard; project-local files always win. Legacy
13
13
  # ~/.config/agent-config/agent-settings.yml is read as a fallback.
14
14
  # 3. This file (.agent-project-settings.yml) — team defaults
@@ -39,7 +39,7 @@ schema_version: 1
39
39
  # CI guard: a release bump of `package.json` must update this value
40
40
  # in lockstep — see scripts/check_template_pin_drift.ts (road-to-
41
41
  # portable-runtime-and-update-check P3.3).
42
- agent_config_version: "10.1.0"
42
+ agent_config_version: "10.2.0"
43
43
 
44
44
  # --- Project identity ---
45
45
  project:
@@ -210,7 +210,6 @@ export const MERGEABLE_KEYS: readonly string[] = [
210
210
  'memory.cadence',
211
211
  'personal.bot_icon',
212
212
  'personal.autonomy',
213
- 'telegraph.speak_scope',
214
213
  // Knowledge-card global cross-project sharing is a USER-GLOBAL setting
215
214
  // (ADR-100 / road-to-structure-grounding-v2). Whitelisted so the
216
215
  // ~/.event4u/agent-config/agent-settings.yml values are honoured.
@@ -58,7 +58,7 @@ export const REGISTRY = [
58
58
  { name: 'use', disposition: 'delegate', synopsis: 'Switch the active experience/profile (writes profile.id).' },
59
59
  { name: 'sessions:list', disposition: 'delegate', synopsis: 'List live agent sessions plus unmerged branches held by other worktrees; --json, --branches.' },
60
60
  { name: 'sessions:claim', disposition: 'delegate', synopsis: 'Claim a roadmap for this session so other sessions skip it; --release clears it.' },
61
- { name: 'session:recycle', disposition: 'delegate', synopsis: 'Validate + write the main-session recycle envelope (--verify validates only); the successor resumes from it after /clear.' },
61
+ { name: 'session:recycle', disposition: 'delegate', synopsis: 'Validate + write the main-session recycle envelope (--verify validates only, --project names the repo); the successor resumes from it after /clear.' },
62
62
  { name: 'roadmap:progress', disposition: 'delegate', synopsis: 'Regenerate agents/roadmaps-progress.md from open roadmaps.' },
63
63
  { name: 'roadmap:progress-check', disposition: 'delegate', synopsis: 'Fail if agents/roadmaps-progress.md is stale (for CI).' },
64
64
  { name: 'roadmap:archive', disposition: 'delegate', synopsis: 'Archive completed roadmaps (PR-gate sweep).' },