@event4u/agent-config 16.3.0 → 16.4.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 (486) hide show
  1. package/.augment-plugin/marketplace.json +3 -3
  2. package/.augment-plugin/plugin.json +1 -1
  3. package/.claude-plugin/marketplace.json +1 -1
  4. package/CHANGELOG.md +251 -0
  5. package/README.md +2 -2
  6. package/agents/templates/.ai-council.yml.example +26 -8
  7. package/dist/agent-src/commands/analyze/inbox.md +10 -7
  8. package/dist/agent-src/commands/bug/investigate.md +1 -1
  9. package/dist/agent-src/commands/commit/in-chunks.md +40 -31
  10. package/dist/agent-src/commands/commit.md +72 -33
  11. package/dist/agent-src/commands/condense.md +2 -8
  12. package/dist/agent-src/commands/council/debate.md +11 -7
  13. package/dist/agent-src/commands/council/default.md +10 -9
  14. package/dist/agent-src/commands/council.md +1 -1
  15. package/dist/agent-src/commands/estimate-ticket.md +1 -1
  16. package/dist/agent-src/commands/feature/explore.md +3 -3
  17. package/dist/agent-src/commands/feature/plan.md +1 -1
  18. package/dist/agent-src/commands/fix/ci.md +17 -3
  19. package/dist/agent-src/commands/fix/commit-messages.md +48 -23
  20. package/dist/agent-src/commands/fix/pr-comments.md +3 -6
  21. package/dist/agent-src/commands/implement-ticket.md +3 -3
  22. package/dist/agent-src/commands/memory/add.md +4 -16
  23. package/dist/agent-src/commands/memory/load.md +5 -6
  24. package/dist/agent-src/commands/memory/promote.md +3 -16
  25. package/dist/agent-src/commands/mission/upgrade.md +3 -2
  26. package/dist/agent-src/commands/optimize/agents-dir.md +2 -2
  27. package/dist/agent-src/commands/optimize/deep.md +4 -2
  28. package/dist/agent-src/commands/optimize/rtk.md +4 -26
  29. package/dist/agent-src/commands/pr/create/description-only.md +18 -15
  30. package/dist/agent-src/commands/pr/create.md +42 -34
  31. package/dist/agent-src/commands/pr/merge.md +136 -9
  32. package/dist/agent-src/commands/prepare-for-review.md +13 -11
  33. package/dist/agent-src/commands/project/analyze.md +7 -35
  34. package/dist/agent-src/commands/refine-ticket.md +1 -1
  35. package/dist/agent-src/commands/review/changes.md +14 -19
  36. package/dist/agent-src/commands/roadmap/next.md +10 -1
  37. package/dist/agent-src/commands/roadmap/process-full.md +52 -38
  38. package/dist/agent-src/commands/roadmap/resolve-blockers.md +64 -14
  39. package/dist/agent-src/commands/worktree/create.md +7 -3
  40. package/dist/agent-src/commands/worktree/verify.md +2 -1
  41. package/dist/agent-src/contexts/communication/rules-auto/think-before-action-mechanics.md +5 -3
  42. package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +7 -9
  43. package/dist/agent-src/contexts/contracts/command-suggestion-flow.md +8 -6
  44. package/dist/agent-src/contexts/contracts/frugality-charter.md +8 -5
  45. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +1 -1
  46. package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +0 -1
  47. package/dist/agent-src/contexts/execution/evidence-discipline.md +2 -2
  48. package/dist/agent-src/contexts/execution/non-interactive-contract.md +5 -8
  49. package/dist/agent-src/contexts/execution/rdp-gate.md +4 -4
  50. package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +9 -8
  51. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +67 -52
  52. package/dist/agent-src/contexts/execution/subagent-routing.md +8 -8
  53. package/dist/agent-src/contexts/execution/subagent-steering.md +6 -4
  54. package/dist/agent-src/contexts/execution/terminal-states.md +2 -2
  55. package/dist/agent-src/contexts/execution/toolchain-resolver.md +4 -10
  56. package/dist/agent-src/contexts/subagent-configuration.md +1 -1
  57. package/dist/agent-src/guidelines/agent-infra/active-remediation-mechanics.md +39 -0
  58. package/dist/agent-src/guidelines/agent-infra/context-hygiene-mechanics.md +1 -1
  59. package/dist/agent-src/guidelines/agent-infra/cross-source-consistency-mechanics.md +8 -10
  60. package/dist/agent-src/guidelines/agent-infra/frontier-reasoning-operating-profile.md +3 -2
  61. package/dist/agent-src/guidelines/agent-infra/layered-settings.md +13 -1
  62. package/dist/agent-src/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
  63. package/dist/agent-src/guidelines/agent-infra/self-improvement-pipeline.md +10 -3
  64. package/dist/agent-src/guidelines/agent-infra/size-and-scope.md +36 -0
  65. package/dist/agent-src/guidelines/php/git.md +15 -2
  66. package/dist/agent-src/rules/active-remediation.md +0 -1
  67. package/dist/agent-src/rules/analysis-skill-routing.md +0 -1
  68. package/dist/agent-src/rules/architecture.md +0 -1
  69. package/dist/agent-src/rules/artifact-drafting-protocol.md +0 -1
  70. package/dist/agent-src/rules/artifact-engagement-recording.md +0 -1
  71. package/dist/agent-src/rules/augment-edit-discipline.md +0 -1
  72. package/dist/agent-src/rules/autonomous-execution.md +0 -1
  73. package/dist/agent-src/rules/brand-consistency.md +0 -1
  74. package/dist/agent-src/rules/brand-source-of-truth.md +0 -1
  75. package/dist/agent-src/rules/broken-access-control.md +0 -1
  76. package/dist/agent-src/rules/cli-output-handling.md +0 -1
  77. package/dist/agent-src/rules/code-comment-discipline.md +0 -1
  78. package/dist/agent-src/rules/code-provenance.md +0 -1
  79. package/dist/agent-src/rules/command-suggestion-policy.md +0 -1
  80. package/dist/agent-src/rules/commit-conventions.md +1 -2
  81. package/dist/agent-src/rules/communication-through-line.md +1 -2
  82. package/dist/agent-src/rules/content-quoting-floor.md +1 -2
  83. package/dist/agent-src/rules/context-hygiene.md +5 -5
  84. package/dist/agent-src/rules/copilot-routing.md +1 -2
  85. package/dist/agent-src/rules/council-availability.md +4 -4
  86. package/dist/agent-src/rules/cross-source-consistency.md +4 -6
  87. package/dist/agent-src/rules/decision-revisit-gate.md +2 -3
  88. package/dist/agent-src/rules/delegation-policy.md +2 -3
  89. package/dist/agent-src/rules/design-fidelity.md +0 -1
  90. package/dist/agent-src/rules/design-review-after-ui-write.md +3 -3
  91. package/dist/agent-src/rules/devcontainer-routing.md +1 -2
  92. package/dist/agent-src/rules/doc-screenshot-hygiene.md +0 -1
  93. package/dist/agent-src/rules/docker-commands.md +0 -1
  94. package/dist/agent-src/rules/domain-adoption-policy.md +0 -1
  95. package/dist/agent-src/rules/domain-safety-disclaimer.md +0 -1
  96. package/dist/agent-src/rules/domain-safety-pii.md +0 -1
  97. package/dist/agent-src/rules/domain-safety-retention.md +0 -1
  98. package/dist/agent-src/rules/downstream-changes.md +0 -1
  99. package/dist/agent-src/rules/engineering-safety-floor.md +0 -1
  100. package/dist/agent-src/rules/external-code-graph-interop.md +0 -1
  101. package/dist/agent-src/rules/external-reference-deep-dive.md +0 -1
  102. package/dist/agent-src/rules/fast-path-marker-visibility.md +1 -2
  103. package/dist/agent-src/rules/finance-safety-floor.md +0 -1
  104. package/dist/agent-src/rules/fix-what-you-see.md +6 -32
  105. package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +0 -1
  106. package/dist/agent-src/rules/git-history-discipline.md +1 -2
  107. package/dist/agent-src/rules/guidelines.md +0 -1
  108. package/dist/agent-src/rules/history-discipline.md +0 -1
  109. package/dist/agent-src/rules/icon-consistency.md +0 -1
  110. package/dist/agent-src/rules/image-likeness-and-rights.md +0 -1
  111. package/dist/agent-src/rules/improve-before-implement.md +0 -1
  112. package/dist/agent-src/rules/invite-challenge.md +0 -1
  113. package/dist/agent-src/rules/laravel-routing.md +1 -2
  114. package/dist/agent-src/rules/laravel-translations.md +0 -1
  115. package/dist/agent-src/rules/legal-safety-floor.md +0 -1
  116. package/dist/agent-src/rules/lethal-trifecta-guard.md +0 -1
  117. package/dist/agent-src/rules/linked-projects-onboarding-gate.md +0 -1
  118. package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +0 -1
  119. package/dist/agent-src/rules/markdown-safe-codeblocks.md +0 -1
  120. package/dist/agent-src/rules/media-governance-routing.md +1 -2
  121. package/dist/agent-src/rules/media-sync-ground-truth.md +0 -1
  122. package/dist/agent-src/rules/minimal-safe-diff.md +0 -1
  123. package/dist/agent-src/rules/missing-skill-recovery.md +0 -1
  124. package/dist/agent-src/rules/missing-tool-handling.md +0 -1
  125. package/dist/agent-src/rules/model-recommendation.md +0 -1
  126. package/dist/agent-src/rules/neighbour-precedence.md +64 -0
  127. package/dist/agent-src/rules/no-attribution-footers.md +0 -1
  128. package/dist/agent-src/rules/no-decorative-emojis-in-git-surfaces.md +0 -1
  129. package/dist/agent-src/rules/no-pr-progress-comments.md +0 -1
  130. package/dist/agent-src/rules/no-roadmap-references.md +0 -1
  131. package/dist/agent-src/rules/notes-first-reasoning.md +0 -1
  132. package/dist/agent-src/rules/onboarding-gate.md +0 -1
  133. package/dist/agent-src/rules/output-discipline.md +0 -1
  134. package/dist/agent-src/rules/package-ci-checks.md +0 -1
  135. package/dist/agent-src/rules/persona-governance.md +2 -3
  136. package/dist/agent-src/rules/php-coding.md +0 -1
  137. package/dist/agent-src/rules/prefer-enums-over-literals.md +0 -1
  138. package/dist/agent-src/rules/preservation-guard.md +0 -1
  139. package/dist/agent-src/rules/provider-lifecycle-discipline.md +2 -3
  140. package/dist/agent-src/rules/question-not-instruction.md +0 -1
  141. package/dist/agent-src/rules/reviewer-awareness.md +0 -1
  142. package/dist/agent-src/rules/roadmap-ci-steps-policy.md +0 -1
  143. package/dist/agent-src/rules/roadmap-progress-sync.md +3 -6
  144. package/dist/agent-src/rules/role-mode-adherence.md +0 -1
  145. package/dist/agent-src/rules/rule-type-governance.md +0 -1
  146. package/dist/agent-src/rules/runtime-safety.md +0 -1
  147. package/dist/agent-src/rules/scale-discipline.md +0 -1
  148. package/dist/agent-src/rules/secret-vcs-guard.md +0 -1
  149. package/dist/agent-src/rules/security-sensitive-stop.md +0 -1
  150. package/dist/agent-src/rules/self-repair-loop.md +0 -1
  151. package/dist/agent-src/rules/senior-engineering-discipline.md +0 -1
  152. package/dist/agent-src/rules/session-canary.md +0 -1
  153. package/dist/agent-src/rules/settings-ask-protocol.md +5 -6
  154. package/dist/agent-src/rules/size-enforcement.md +0 -1
  155. package/dist/agent-src/rules/skill-improvement-trigger.md +2 -3
  156. package/dist/agent-src/rules/skill-quality.md +0 -1
  157. package/dist/agent-src/rules/slash-command-routing-policy.md +0 -1
  158. package/dist/agent-src/rules/source-confidentiality.md +0 -1
  159. package/dist/agent-src/rules/source-discovery-gate.md +0 -1
  160. package/dist/agent-src/rules/source-of-truth.md +0 -1
  161. package/dist/agent-src/rules/spreadsheet-source-quality.md +1 -2
  162. package/dist/agent-src/rules/strategy-safety-floor.md +0 -1
  163. package/dist/agent-src/rules/symfony-routing.md +1 -2
  164. package/dist/agent-src/rules/think-before-action.md +0 -1
  165. package/dist/agent-src/rules/token-budget-discipline.md +12 -46
  166. package/dist/agent-src/rules/token-efficiency.md +0 -1
  167. package/dist/agent-src/rules/token-optimizer-maintenance.md +0 -1
  168. package/dist/agent-src/rules/tool-safety.md +0 -1
  169. package/dist/agent-src/rules/ui-audit-gate.md +1 -2
  170. package/dist/agent-src/rules/untrusted-input-defense.md +0 -1
  171. package/dist/agent-src/rules/upstream-proposal.md +0 -1
  172. package/dist/agent-src/rules/user-interaction.md +0 -1
  173. package/dist/agent-src/rules/user-interrupt-priority.md +0 -1
  174. package/dist/agent-src/scripts/gate_budget.ts +47 -23
  175. package/dist/agent-src/scripts/gate_execute.ts +12 -4
  176. package/dist/agent-src/skills/ai-council/SKILL.md +7 -4
  177. package/dist/agent-src/skills/ai-council/references/cost-and-redaction.md +21 -11
  178. package/dist/agent-src/skills/ai-council/references/procedure.md +12 -6
  179. package/dist/agent-src/skills/analysis-autonomous-mode/SKILL.md +1 -1
  180. package/dist/agent-src/skills/bug-analyzer/SKILL.md +1 -1
  181. package/dist/agent-src/skills/command-routing/SKILL.md +3 -4
  182. package/dist/agent-src/skills/conventional-commits-writing/SKILL.md +127 -139
  183. package/dist/agent-src/skills/corpus-grounding/ATTRIBUTION.md +39 -0
  184. package/dist/agent-src/skills/corpus-grounding/SKILL.md +8 -2
  185. package/dist/agent-src/skills/database/data/manifest.json +2 -2
  186. package/dist/agent-src/skills/database/data/query-tuning.csv +13 -13
  187. package/dist/agent-src/skills/design-system-capture/SKILL.md +0 -3
  188. package/dist/agent-src/skills/estimate-ticket/SKILL.md +1 -1
  189. package/dist/agent-src/skills/feature-planning/SKILL.md +1 -1
  190. package/dist/agent-src/skills/git-workflow/SKILL.md +44 -44
  191. package/dist/agent-src/skills/git-workflow/references/branch-update.md +312 -0
  192. package/dist/agent-src/skills/git-workflow/references/commit-subject.md +205 -0
  193. package/dist/agent-src/skills/jira-integration/SKILL.md +3 -3
  194. package/dist/agent-src/skills/merge-conflicts/SKILL.md +10 -4
  195. package/dist/agent-src/skills/po-discovery/SKILL.md +1 -1
  196. package/dist/agent-src/skills/refine-ticket/SKILL.md +4 -4
  197. package/dist/agent-src/skills/roadmap-writing/SKILL.md +2 -2
  198. package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +4 -2
  199. package/dist/agent-src/skills/source-discovery/SKILL.md +1 -1
  200. package/dist/agent-src/skills/tailwind-engineer/SKILL.md +3 -1
  201. package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +1 -1
  202. package/dist/agent-src/skills/using-git-worktrees/SKILL.md +1 -1
  203. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +2 -2
  204. package/dist/agent-src/templates/AGENTS.md +1 -1
  205. package/dist/agent-src/templates/agent-settings.md +46 -129
  206. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +3 -3
  207. package/dist/agent-src/templates/command.md +2 -2
  208. package/dist/agent-src/templates/roadmaps.md +6 -1
  209. package/dist/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +0 -6
  210. package/dist/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +11 -7
  211. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.ts +3 -2
  212. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.ts +2 -1
  213. package/dist/agent-src/templates/scripts/work_engine/hooks/settings.ts +0 -6
  214. package/dist/agent-src/templates/scripts/work_engine/scoring/decision_engine.ts +9 -12
  215. package/dist/agent-src/templates/scripts/work_engine/scoring/memory_visibility.ts +2 -1
  216. package/dist/agent-src/templates/skill.md +1 -1
  217. package/dist/cli/registry.js +1 -0
  218. package/dist/cli-delegate/check_update_banner.js +195 -119
  219. package/dist/cli-delegate/{chunk-TRI6DQZ6.js → chunk-5GPULQBE.js} +60 -42
  220. package/dist/cli-delegate/{chunk-JQVYKIZA.js → chunk-6SRJTYJS.js} +33 -177
  221. package/dist/cli-delegate/chunk-6V5FMA3P.js +186 -0
  222. package/dist/cli-delegate/chunk-6YQC2HLF.js +415 -0
  223. package/dist/cli-delegate/{chunk-E4XIZDIB.js → chunk-7HKRE54K.js} +1 -64
  224. package/dist/cli-delegate/{chunk-NQ7WT43P.js → chunk-AED2VQGM.js} +65 -11
  225. package/dist/cli-delegate/{chunk-7HQ52DHU.js → chunk-AL3RZ22D.js} +1 -1
  226. package/dist/cli-delegate/{chunk-DBH4AHDK.js → chunk-ED7KCMLB.js} +9 -11
  227. package/dist/cli-delegate/{chunk-NXEILF2K.js → chunk-F3QDG2GT.js} +481 -72
  228. package/dist/cli-delegate/{chunk-CQWX336L.js → chunk-G5VVIZRC.js} +3 -3
  229. package/dist/cli-delegate/{chunk-JY2I2DXV.js → chunk-H76PHZBI.js} +137 -60
  230. package/dist/cli-delegate/chunk-IAYTIIQW.js +67 -0
  231. package/dist/cli-delegate/{chunk-LIYTLH6O.js → chunk-KXXWJTDO.js} +5 -10
  232. package/dist/cli-delegate/{chunk-T7L2QK3K.js → chunk-LQOCRFWT.js} +1 -1
  233. package/dist/cli-delegate/{chunk-S4YWNRKO.js → chunk-MDPPKQCQ.js} +34 -1
  234. package/dist/cli-delegate/{chunk-S4UMZNES.js → chunk-MSUL5NYP.js} +5 -5
  235. package/dist/cli-delegate/chunk-OAFSJBHH.js +272 -0
  236. package/dist/cli-delegate/{chunk-GKE7ZVFA.js → chunk-PWX7CKMD.js} +1 -1
  237. package/dist/cli-delegate/{chunk-NDJLNC6Q.js → chunk-T6BP34WI.js} +1 -0
  238. package/dist/cli-delegate/{chunk-RQNNW7IF.js → chunk-T7XSJSUQ.js} +433 -632
  239. package/dist/cli-delegate/{chunk-EEHDXSYD.js → chunk-WQWXGIWB.js} +12 -273
  240. package/dist/cli-delegate/{chunk-QLDHIPWR.js → chunk-XQTPXKFA.js} +1 -1
  241. package/dist/cli-delegate/cmd_analyze_session.js +223 -43
  242. package/dist/cli-delegate/cmd_brand_status.js +3 -2
  243. package/dist/cli-delegate/cmd_conformance.js +105 -35
  244. package/dist/cli-delegate/cmd_converge.js +3 -3
  245. package/dist/cli-delegate/cmd_doctor.js +15 -12
  246. package/dist/cli-delegate/cmd_doctor_neighbours.js +11 -4
  247. package/dist/cli-delegate/cmd_explain.js +43 -19
  248. package/dist/cli-delegate/cmd_export.js +10 -10
  249. package/dist/cli-delegate/cmd_git_convention.js +1851 -0
  250. package/dist/cli-delegate/cmd_handoff.js +40 -21
  251. package/dist/cli-delegate/cmd_mcp_available.js +3 -2
  252. package/dist/cli-delegate/cmd_migrate.js +3 -3
  253. package/dist/cli-delegate/cmd_packs_active.js +4 -3
  254. package/dist/cli-delegate/cmd_prune.js +10 -10
  255. package/dist/cli-delegate/cmd_route_audit.js +7 -7
  256. package/dist/cli-delegate/cmd_route_explain.js +5 -5
  257. package/dist/cli-delegate/cmd_session_recycle.js +9 -7
  258. package/dist/cli-delegate/cmd_settings_check.js +54 -7
  259. package/dist/cli-delegate/cmd_settings_get.js +18 -8
  260. package/dist/cli-delegate/cmd_settings_migrate.js +10 -10
  261. package/dist/cli-delegate/cmd_settings_set.js +1 -1
  262. package/dist/cli-delegate/cmd_sync.js +10 -10
  263. package/dist/cli-delegate/cmd_uninstall.js +10 -10
  264. package/dist/cli-delegate/cmd_update.js +7 -7
  265. package/dist/cli-delegate/cmd_upgrade.js +7 -7
  266. package/dist/cli-delegate/cmd_validate.js +10 -10
  267. package/dist/cli-delegate/cmd_versions.js +5 -5
  268. package/dist/cli-delegate/gate_budget.js +1 -1
  269. package/dist/cli-delegate/gate_execute.js +2 -2
  270. package/dist/cli-delegate/roadmap_gates.js +2 -2
  271. package/dist/discovery/deprecation-report.md +1 -1
  272. package/dist/discovery/discovery-manifest.json +129 -90
  273. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  274. package/dist/discovery/discovery-manifest.summary.md +3 -3
  275. package/dist/discovery/dormancy-report.md +1 -1
  276. package/dist/discovery/orphan-report.md +1 -1
  277. package/dist/discovery/packs.json +24 -9
  278. package/dist/discovery/trust-report.md +3 -3
  279. package/dist/discovery/workspaces.json +5 -4
  280. package/dist/hooks/dispatch.js +2151 -1820
  281. package/dist/hooks/dispatch.sha256 +1 -1
  282. package/dist/install/install.mjs +462 -431
  283. package/dist/install/installThinLayer.js +40 -12
  284. package/dist/install/installedRuleLinks.js +105 -19
  285. package/dist/mcp/awesome-mcp-servers.row.md +1 -1
  286. package/dist/mcp/mcp-cloudflare-catalogue.json +2 -2
  287. package/dist/mcp/registry-manifest.json +5 -5
  288. package/dist/mcp/server.json +2 -2
  289. package/dist/mcp/server.mjs +2702 -1995
  290. package/dist/router.json +1 -1
  291. package/dist/scripts/_lib/agent_settings.js +15 -120
  292. package/dist/scripts/_lib/compile_time_toggles.js +12 -21
  293. package/dist/scripts/_lib/git_convention.js +232 -0
  294. package/dist/scripts/_lib/global_deploy_inventory.js +730 -0
  295. package/dist/scripts/_lib/installed_layer.js +344 -18
  296. package/dist/scripts/_lib/package_root.js +68 -0
  297. package/dist/scripts/_lib/rule_law_section.js +1 -1
  298. package/dist/scripts/_lib/settings_removed_keys.js +168 -0
  299. package/dist/scripts/_lib/thin_rules.js +80 -3
  300. package/dist/server/app.js +2 -1
  301. package/dist/server/gitKeysGate.js +105 -0
  302. package/dist/server/routes/settings.js +67 -8
  303. package/dist/server/routes/wizard.js +4 -0
  304. package/dist/server/schemas/settings.js +23 -81
  305. package/dist/shared/skillRanking.js +30 -4
  306. package/dist/ui/assets/{index-Cwq4d0hX.js → index-C3djEJah.js} +2 -2
  307. package/dist/ui/index.html +1 -1
  308. package/docs/MIGRATION.md +72 -1
  309. package/docs/contracts/settings-classes.md +35 -65
  310. package/docs/guidelines/agent-infra/active-remediation-mechanics.md +39 -0
  311. package/docs/guidelines/agent-infra/context-hygiene-mechanics.md +1 -1
  312. package/docs/guidelines/agent-infra/cross-source-consistency-mechanics.md +8 -10
  313. package/docs/guidelines/agent-infra/frontier-reasoning-operating-profile.md +3 -2
  314. package/docs/guidelines/agent-infra/layered-settings.md +13 -1
  315. package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
  316. package/docs/guidelines/agent-infra/self-improvement-pipeline.md +10 -3
  317. package/docs/guidelines/agent-infra/size-and-scope.md +36 -0
  318. package/docs/guidelines/php/git.md +15 -2
  319. package/package.json +1 -1
  320. package/src/agent-src/scripts/gate_budget.ts +47 -23
  321. package/src/agent-src/scripts/gate_execute.ts +12 -4
  322. package/src/agent-src/templates/AGENTS.md +1 -1
  323. package/src/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +0 -6
  324. package/src/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +11 -7
  325. package/src/agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.ts +3 -2
  326. package/src/agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.ts +2 -1
  327. package/src/agent-src/templates/scripts/work_engine/hooks/settings.ts +0 -6
  328. package/src/agent-src/templates/scripts/work_engine/scoring/decision_engine.ts +9 -12
  329. package/src/agent-src/templates/scripts/work_engine/scoring/memory_visibility.ts +2 -1
  330. package/src/config/agent-settings.template.yml +79 -312
  331. package/src/config/agents-paths.yml +16 -0
  332. package/src/config/assurance-capability-registry.json +7 -3
  333. package/src/config/ci-local-parity.yml +3 -0
  334. package/src/config/continuity-surface.json +3 -3
  335. package/src/config/discovery/packs.yml +17 -1
  336. package/src/config/evaluator-budgets.json +19 -6
  337. package/src/config/gate-coverage.yml +65 -23
  338. package/src/config/gate-violation-baselines.json +53 -13
  339. package/src/config/gitignore-block.txt +19 -0
  340. package/src/config/hook-bundle-budget.json +1 -1
  341. package/src/config/release-gate-locality.yml +2 -1
  342. package/src/config/routing-coverage-seed.json +48 -6
  343. package/src/config/rule-law-ceilings.json +12 -6
  344. package/src/config/rule-obligations.json +833 -0
  345. package/src/install/installThinLayer.ts +76 -10
  346. package/src/install/installedRuleLinks.ts +105 -17
  347. package/src/scripts/_cli/cmd_analyze_session.ts +9 -15
  348. package/src/scripts/_cli/cmd_conformance.ts +13 -2
  349. package/src/scripts/_cli/cmd_doctor.ts +10 -10
  350. package/src/scripts/_cli/cmd_doctor_neighbours.ts +133 -0
  351. package/src/scripts/_cli/cmd_explain.ts +72 -14
  352. package/src/scripts/_cli/cmd_git_convention.ts +637 -0
  353. package/src/scripts/_cli/cmd_settings_check.ts +66 -8
  354. package/src/scripts/_cli/cmd_settings_get.ts +18 -3
  355. package/src/scripts/_cli/doctor_execution.ts +72 -1
  356. package/src/scripts/_dispatch.bash +37 -2
  357. package/src/scripts/_lib/agent_settings.ts +15 -124
  358. package/src/scripts/_lib/blocked_by_marker.ts +1 -1
  359. package/src/scripts/_lib/compile_time_toggles.ts +12 -21
  360. package/src/scripts/_lib/dispatch_import_closure.ts +163 -0
  361. package/src/scripts/_lib/git_base_ref.ts +92 -0
  362. package/src/scripts/_lib/git_convention.ts +291 -0
  363. package/src/scripts/_lib/git_convention_carrier.ts +389 -0
  364. package/src/scripts/_lib/git_convention_grammar.ts +246 -0
  365. package/src/scripts/_lib/git_convention_measure.ts +344 -0
  366. package/src/scripts/_lib/global_deploy_inventory.ts +74 -0
  367. package/src/scripts/_lib/graph_feeder_record.ts +236 -13
  368. package/src/scripts/_lib/installed_layer.ts +448 -23
  369. package/src/scripts/_lib/knowledge_global.ts +14 -1
  370. package/src/scripts/_lib/module_reach.ts +456 -0
  371. package/src/scripts/_lib/neighbour_contradictions.ts +236 -0
  372. package/src/scripts/_lib/neighbour_tool_use.ts +8 -10
  373. package/src/scripts/_lib/ratification_artifact.ts +220 -1
  374. package/src/scripts/_lib/ratification_subject.ts +92 -0
  375. package/src/scripts/_lib/release_findings_ingest.ts +15 -7
  376. package/src/scripts/_lib/release_highlights.ts +5 -0
  377. package/src/scripts/_lib/rule_law_section.ts +1 -1
  378. package/src/scripts/_lib/rule_obligations.ts +205 -0
  379. package/src/scripts/_lib/self_repair.ts +1 -1
  380. package/src/scripts/_lib/settings_removed_keys.ts +173 -0
  381. package/src/scripts/_lib/test_red_state.ts +5 -0
  382. package/src/scripts/_lib/thin_rules.ts +83 -3
  383. package/src/scripts/_lib/touched_file_quality.ts +142 -6
  384. package/src/scripts/_lib/worker_budget.ts +1 -1
  385. package/src/scripts/adr/regenerate_index.ts +16 -1
  386. package/src/scripts/ai_council/config.ts +7 -7
  387. package/src/scripts/ai_council/modification_review.ts +100 -0
  388. package/src/scripts/ai_council/modification_review_questions.ts +90 -0
  389. package/src/scripts/ai_council/orchestrator.ts +5 -5
  390. package/src/scripts/ai_council/spend_gate.ts +18 -7
  391. package/src/scripts/ai_team/config.ts +11 -16
  392. package/src/scripts/audit_user_type_axis.ts +20 -8
  393. package/src/scripts/bench_ab_clone.ts +1 -2
  394. package/src/scripts/bench_concern_spawn_path.ts +129 -0
  395. package/src/scripts/bench_graph_feeder_latency.ts +584 -0
  396. package/src/scripts/check_agent_artifact_location.ts +36 -0
  397. package/src/scripts/check_branch_freshness.ts +147 -24
  398. package/src/scripts/check_enforcement_coverage.ts +130 -0
  399. package/src/scripts/check_evaluator_budgets.ts +4 -0
  400. package/src/scripts/check_finding_dispositions.ts +88 -25
  401. package/src/scripts/check_gate_coverage.ts +4 -3
  402. package/src/scripts/check_gate_reachability.ts +48 -1
  403. package/src/scripts/check_generator_sync.ts +48 -0
  404. package/src/scripts/check_hook_bundle_composition.ts +107 -0
  405. package/src/scripts/check_kernel_edit_ratified.ts +86 -6
  406. package/src/scripts/check_pack_size.ts +1 -1
  407. package/src/scripts/check_release_manifest_content.ts +189 -0
  408. package/src/scripts/check_standing_rule_delivery.ts +96 -0
  409. package/src/scripts/check_suppression_hygiene.ts +2 -5
  410. package/src/scripts/ci_settle.ts +42 -5
  411. package/src/scripts/classify_merge_risk.ts +320 -0
  412. package/src/scripts/closure_scan.ts +91 -1
  413. package/src/scripts/command_suggester/settings.ts +8 -108
  414. package/src/scripts/command_suggester/types.ts +4 -5
  415. package/src/scripts/consumer_matrix.ts +102 -0
  416. package/src/scripts/context_hygiene_hook.ts +13 -23
  417. package/src/scripts/cost/preflight.mjs +12 -1
  418. package/src/scripts/council_cli.ts +7 -7
  419. package/src/scripts/dispatch_r2_reviewer.ts +24 -11
  420. package/src/scripts/explain_run.ts +8 -13
  421. package/src/scripts/generate_git_convention_grammar.ts +127 -0
  422. package/src/scripts/generate_host_cost_table.ts +20 -3
  423. package/src/scripts/handoff_context_hook.ts +86 -37
  424. package/src/scripts/hook_manifest.json +1 -1
  425. package/src/scripts/hook_manifest.yaml +25 -6
  426. package/src/scripts/hooks/block_config_weakening.ts +48 -5
  427. package/src/scripts/hooks/block_plumbing_writes.ts +8 -4
  428. package/src/scripts/hooks/concern_registry.ts +2 -0
  429. package/src/scripts/hooks/delegation_nudge_hook.ts +2 -3
  430. package/src/scripts/hooks/evidence_independence.ts +12 -4
  431. package/src/scripts/hooks/mcp_usage_observation_hook.ts +121 -0
  432. package/src/scripts/hooks/push_settle_hook.ts +4 -3
  433. package/src/scripts/hooks/rule_inject_hook.ts +44 -3
  434. package/src/scripts/hooks/state_io.ts +8 -4
  435. package/src/scripts/hooks/telemetry_usage_hook.ts +7 -46
  436. package/src/scripts/hooks/turn_end_gate_hook.ts +1 -0
  437. package/src/scripts/install-hooks.sh +42 -14
  438. package/src/scripts/install.ts +7 -31
  439. package/src/scripts/lint_blocker_citations.ts +198 -0
  440. package/src/scripts/lint_evidence_artifacts.ts +9 -0
  441. package/src/scripts/lint_hook_concern_budget.ts +10 -21
  442. package/src/scripts/lint_pack_boundaries.ts +406 -28
  443. package/src/scripts/lint_roadmap_blockers.ts +282 -29
  444. package/src/scripts/lint_roadmap_complexity.ts +4 -2
  445. package/src/scripts/lint_rule_law_section.ts +151 -21
  446. package/src/scripts/lint_rule_skill_pack_reach.ts +17 -0
  447. package/src/scripts/lint_settings_classes.ts +1 -1
  448. package/src/scripts/lint_ticked_unmet_criteria.ts +165 -0
  449. package/src/scripts/lint_workflow_security.ts +12 -1
  450. package/src/scripts/measure_skill_ranker_baseline.ts +5 -0
  451. package/src/scripts/model_rule_injection.ts +3 -3
  452. package/src/scripts/onboarding_gate_hook.ts +7 -6
  453. package/src/scripts/print_required_checks.ts +15 -3
  454. package/src/scripts/probe_host_compliance.ts +33 -5
  455. package/src/scripts/probe_turnaround.ts +183 -3
  456. package/src/scripts/ratification_header.ts +77 -0
  457. package/src/scripts/refusal_envelope.ts +138 -0
  458. package/src/scripts/release_publication.ts +29 -3
  459. package/src/scripts/report_dispatch_import_closure.ts +76 -0
  460. package/src/scripts/report_installed_rule_links.ts +118 -1
  461. package/src/scripts/report_module_reach.ts +212 -0
  462. package/src/scripts/report_obligation_mechanism.ts +16 -18
  463. package/src/scripts/report_parked_blockers.ts +222 -0
  464. package/src/scripts/report_required_checks_drift.ts +196 -0
  465. package/src/scripts/report_skill_ranker_confusion.ts +103 -2
  466. package/src/scripts/report_standing_payload_by_host.ts +1 -1
  467. package/src/scripts/routing_doctor.ts +2 -2
  468. package/src/scripts/schemas/agent-settings.schema.json +17 -31
  469. package/src/scripts/schemas/command.schema.json +1 -1
  470. package/src/scripts/schemas/skill.schema.json +1 -1
  471. package/src/scripts/self_review_gate.ts +39 -2
  472. package/src/scripts/skill_tools/score_skill_relevance.ts +28 -19
  473. package/src/scripts/sync_pr_branch.ts +403 -132
  474. package/src/scripts/trigger_eval_grandfather.json +0 -16
  475. package/src/server/schemas/settings.ts +33 -177
  476. package/src/shared/skillRanking.ts +53 -4
  477. package/dist/cli-delegate/chunk-NYX3L2PZ.js +0 -99
  478. package/src/scripts/_lib/config_chain.ts +0 -477
  479. package/src/scripts/_lib/conformance_report.ts +0 -403
  480. package/src/scripts/_lib/eval_discrimination.ts +0 -95
  481. package/src/scripts/_lib/evaluator_promotion.ts +0 -225
  482. package/src/scripts/_lib/file_slicer.ts +0 -117
  483. package/src/scripts/_lib/legacy_boundary_map.ts +0 -228
  484. package/src/scripts/_lib/minimality_tiebreak.ts +0 -168
  485. package/src/scripts/_lib/overbuild_lens_contract.ts +0 -196
  486. package/src/scripts/_lib/role_split.ts +0 -338
@@ -0,0 +1,196 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Required-check drift report — compares the live ruleset to the contract.
4
+ *
5
+ * `print_required_checks.ts` carries the list of status contexts the `main
6
+ * protection` ruleset requires, and it is contractually offline: it never calls
7
+ * `gh`. So nothing compared that list to the ruleset, and it drifted — it named
8
+ * one required context for a month after the ruleset gained a second. This
9
+ * report is the comparison: it reads the ruleset through `gh api`, extracts the
10
+ * required status contexts, and exits non-zero when they differ from
11
+ * `ENFORCED_CHECKS`.
12
+ *
13
+ * READ-ONLY. It writes nothing and changes nothing on the ruleset. It is run by
14
+ * hand or on a schedule and is NOT wired as a required check — a network read
15
+ * cannot sit on the path of every pull request, and the token it needs is a
16
+ * repository-read token, not something each PR should depend on.
17
+ *
18
+ * Usage:
19
+ * ./scripts-run src/scripts/report_required_checks_drift
20
+ * ./scripts-run src/scripts/report_required_checks_drift --repo <owner/name>
21
+ * ./scripts-run src/scripts/report_required_checks_drift --from-json <file>
22
+ *
23
+ * `--from-json` reads a ruleset object (the shape `gh api
24
+ * repos/{owner}/{repo}/rulesets/{id}` returns) from a file instead of the
25
+ * network, so the comparison itself is testable offline.
26
+ *
27
+ * Exit codes: 0 the lists agree · 1 they differ · 2 usage error, or the ruleset
28
+ * could not be read or carries no required-status-checks rule.
29
+ */
30
+ import { spawnSync } from 'node:child_process';
31
+ import * as fs from 'node:fs';
32
+ import * as path from 'node:path';
33
+ import { fileURLToPath, pathToFileURL } from 'node:url';
34
+
35
+ import { ENFORCED_CHECKS } from './print_required_checks.js';
36
+
37
+ const _HERE = fileURLToPath(import.meta.url);
38
+
39
+ export const RULESET_NAME = 'main protection';
40
+ const DEFAULT_REPO = 'event4u-app/agent-config';
41
+
42
+ export interface Drift {
43
+ readonly missingFromContract: readonly string[];
44
+ readonly missingFromRuleset: readonly string[];
45
+ }
46
+
47
+ class ReadError extends Error {}
48
+
49
+ /** The required status contexts of one ruleset object, sorted. */
50
+ export function requiredContexts(ruleset: unknown): string[] {
51
+ const rules = (ruleset as { rules?: unknown }).rules;
52
+ if (!Array.isArray(rules)) {
53
+ throw new ReadError('the ruleset object carries no `rules` array');
54
+ }
55
+ const lists = rules
56
+ .filter(
57
+ (r): r is { parameters?: { required_status_checks?: unknown } } =>
58
+ typeof r === 'object' && r !== null && (r as { type?: unknown }).type === 'required_status_checks',
59
+ )
60
+ .map((r) => r.parameters?.required_status_checks)
61
+ .filter((c): c is unknown[] => Array.isArray(c));
62
+ if (lists.length === 0) {
63
+ throw new ReadError('the ruleset has no `required_status_checks` rule');
64
+ }
65
+ // Every such rule counts: a context required by any of them blocks the merge.
66
+ const contexts = new Set(
67
+ lists
68
+ .flat()
69
+ .map((c) => (c as { context?: unknown }).context)
70
+ .filter((c): c is string => typeof c === 'string'),
71
+ );
72
+ return [...contexts].sort();
73
+ }
74
+
75
+ /** Set difference in both directions; empty both ways means agreement. */
76
+ export function compare(live: readonly string[], contract: readonly string[]): Drift {
77
+ const liveSet = new Set(live);
78
+ const contractSet = new Set(contract);
79
+ return {
80
+ missingFromContract: live.filter((c) => !contractSet.has(c)).sort(),
81
+ missingFromRuleset: contract.filter((c) => !liveSet.has(c)).sort(),
82
+ };
83
+ }
84
+
85
+ function ghJson(endpoint: string, paginate = false): unknown {
86
+ const args = paginate ? ['api', '--paginate', '--slurp', endpoint] : ['api', endpoint];
87
+ const r = spawnSync('gh', args, { encoding: 'utf-8', maxBuffer: 16 * 1024 * 1024 });
88
+ if (r.status !== 0) {
89
+ throw new ReadError(`gh api ${endpoint} failed: ${(r.stderr ?? '').trim() || `exit ${String(r.status)}`}`);
90
+ }
91
+ return JSON.parse(r.stdout) as unknown;
92
+ }
93
+
94
+ function readLiveRuleset(repo: string): unknown {
95
+ // --paginate --slurp: one array per page, so a ruleset past the first page
96
+ // of 30 is still found.
97
+ const pages = ghJson(`repos/${repo}/rulesets`, true);
98
+ if (!Array.isArray(pages) || !pages.every((p) => Array.isArray(p))) {
99
+ throw new ReadError('the rulesets listing is not an array of pages');
100
+ }
101
+ const list = (pages as unknown[][]).flat();
102
+ const hit = list.find((r) => (r as { name?: unknown }).name === RULESET_NAME) as { id?: unknown } | undefined;
103
+ if (hit === undefined || typeof hit.id !== 'number') {
104
+ throw new ReadError(`no ruleset named "${RULESET_NAME}" on ${repo}`);
105
+ }
106
+ return ghJson(`repos/${repo}/rulesets/${String(hit.id)}`);
107
+ }
108
+
109
+ interface Options {
110
+ repo: string;
111
+ fromJson: string | null;
112
+ }
113
+
114
+ function parseArgs(argv: readonly string[]): Options | string {
115
+ let repo = DEFAULT_REPO;
116
+ let fromJson: string | null = null;
117
+ for (let i = 0; i < argv.length; i++) {
118
+ const a = argv[i] as string;
119
+ if (a === '--repo' || a === '--from-json') {
120
+ const v = argv[i + 1];
121
+ if (v === undefined || v.startsWith('--')) {
122
+ return `${a} needs a value`;
123
+ }
124
+ if (a === '--repo') {
125
+ repo = v;
126
+ } else {
127
+ fromJson = v;
128
+ }
129
+ i++;
130
+ } else {
131
+ return `unknown argument: ${a}`;
132
+ }
133
+ }
134
+ return { repo, fromJson };
135
+ }
136
+
137
+ export function main(argv: readonly string[] = process.argv.slice(2)): number {
138
+ const opts = parseArgs(argv);
139
+ if (typeof opts === 'string') {
140
+ process.stderr.write(`❌ report_required_checks_drift: ${opts}\n`);
141
+ process.stderr.write('usage: report_required_checks_drift [--repo OWNER/NAME] [--from-json FILE]\n');
142
+ return 2;
143
+ }
144
+ let live: string[];
145
+ try {
146
+ const ruleset =
147
+ opts.fromJson === null
148
+ ? readLiveRuleset(opts.repo)
149
+ : (JSON.parse(fs.readFileSync(opts.fromJson, 'utf-8')) as unknown);
150
+ live = requiredContexts(ruleset);
151
+ } catch (e) {
152
+ process.stderr.write(`❌ report_required_checks_drift: ${e instanceof Error ? e.message : String(e)}\n`);
153
+ return 2;
154
+ }
155
+ const drift = compare(live, ENFORCED_CHECKS);
156
+ const source = opts.fromJson === null ? `${opts.repo} ruleset "${RULESET_NAME}"` : opts.fromJson;
157
+ process.stdout.write(`required contexts read from ${source}: ${String(live.length)}\n`);
158
+ for (const c of live) {
159
+ process.stdout.write(` - ${c}\n`);
160
+ }
161
+ if (drift.missingFromContract.length === 0 && drift.missingFromRuleset.length === 0) {
162
+ process.stdout.write(
163
+ '✅ agrees with ENFORCED_CHECKS in src/scripts/print_required_checks.ts\n',
164
+ );
165
+ return 0;
166
+ }
167
+ for (const c of drift.missingFromContract) {
168
+ process.stdout.write(` ❌ required by the ruleset, absent from the contract: ${c}\n`);
169
+ }
170
+ for (const c of drift.missingFromRuleset) {
171
+ process.stdout.write(` ❌ named by the contract, not required by the ruleset: ${c}\n`);
172
+ }
173
+ process.stdout.write(
174
+ '❌ drift — update ENFORCED_CHECKS and docs/contracts/branch-protection-policy.md ' +
175
+ 'together, with the date the ruleset was read.\n',
176
+ );
177
+ return 1;
178
+ }
179
+
180
+ function _isCliEntry(): boolean {
181
+ if (process.argv[1] === undefined) {
182
+ return false;
183
+ }
184
+ if (pathToFileURL(path.resolve(process.argv[1])).href === import.meta.url) {
185
+ return true;
186
+ }
187
+ try {
188
+ return fs.realpathSync(path.resolve(process.argv[1])) === fs.realpathSync(_HERE);
189
+ } catch {
190
+ return false;
191
+ }
192
+ }
193
+
194
+ if (_isCliEntry()) {
195
+ process.exitCode = main();
196
+ }
@@ -55,7 +55,7 @@ import {
55
55
  sliceForId,
56
56
  sliceSizes,
57
57
  } from './measure_skill_ranker_baseline.js';
58
- import { _globSkillMd, rank, type RankRow } from './skill_tools/score_skill_relevance.js';
58
+ import { _globSkillMd, rank, rankDetailed, type RankRow } from './skill_tools/score_skill_relevance.js';
59
59
 
60
60
  /** How deep "outside the top ten" is. 1.3's own number, not a derived one. */
61
61
  export const DEEP_MISS_DEPTH = 10;
@@ -92,6 +92,38 @@ export interface RowReading {
92
92
  rankedFirst: string | null;
93
93
  topScore: number;
94
94
  rankOfExpected: number;
95
+ /** An expected skill shares the winner's integer score (hit or miss). */
96
+ expectedInTopScoreBlock: boolean;
97
+ /** An expected skill shares the winner's whole ordering key and loses on name. */
98
+ lostOnTie: boolean;
99
+ }
100
+
101
+ /**
102
+ * The two tie readings for one ranking.
103
+ *
104
+ * `inBlock` asks whether an expected skill scored the winner's INTEGER — the
105
+ * block the alphabet orders under `keyword-v1`. `lostOnTie` asks whether the
106
+ * row was a top-1 miss that nothing but the name decided: the expected skill
107
+ * shares the winner's integer score and, under `tieBreakUnrounded`, its
108
+ * unrounded score too. Without the flag the two keys coincide, so `lostOnTie`
109
+ * is the evidence page's "scored exactly the winner's score and lost on its
110
+ * initial" class; with it, `lostOnTie` is what the unrounded score left.
111
+ */
112
+ export function tieReading(
113
+ rows: readonly RankRow[],
114
+ raw: ReadonlyMap<string, number>,
115
+ expected: readonly string[],
116
+ tieBreakUnrounded: boolean,
117
+ ): { inBlock: boolean; lostOnTie: boolean } {
118
+ const first = rows[0];
119
+ if (!first) return { inBlock: false, lostOnTie: false };
120
+ const block = rows.filter((r) => r[1] === first[1]);
121
+ const inBlock = block.some((r) => expected.includes(r[0]));
122
+ if (!inBlock || expected.includes(first[0])) return { inBlock, lostOnTie: false };
123
+ const lostOnTie = block.some(
124
+ (r) => expected.includes(r[0]) && (!tieBreakUnrounded || raw.get(r[0]) === raw.get(first[0])),
125
+ );
126
+ return { inBlock, lostOnTie };
95
127
  }
96
128
 
97
129
  export function readRows(
@@ -101,13 +133,16 @@ export function readRows(
101
133
  ): RowReading[] {
102
134
  const opts = rankOptionsFor(ranker);
103
135
  return prompts.map((p) => {
104
- const rows = rank(p.prompt, skillsDir, opts);
136
+ const { rows, raw } = rankDetailed(p.prompt, skillsDir, opts);
137
+ const tie = tieReading(rows, raw, p.expected, Boolean(opts.tieBreakUnrounded));
105
138
  return {
106
139
  id: p.id,
107
140
  expected: p.expected,
108
141
  rankedFirst: rows[0]?.[0] ?? null,
109
142
  topScore: rows[0]?.[1] ?? 0,
110
143
  rankOfExpected: firstExpectedRank(rows, p.expected),
144
+ expectedInTopScoreBlock: tie.inBlock,
145
+ lostOnTie: tie.lostOnTie,
111
146
  };
112
147
  });
113
148
  }
@@ -262,6 +297,41 @@ export function falseActivation(
262
297
  };
263
298
  }
264
299
 
300
+ export interface AbstentionReading {
301
+ empties: number;
302
+ /** Empties whose top score is 0 — the ranker already abstains. */
303
+ noSkill: number;
304
+ threshold: number | null;
305
+ /** Empties whose top score is below `threshold`. */
306
+ abstainedEmpties: number;
307
+ correctHits: number;
308
+ /** Correct top-1 hits whose top score is below `threshold`. */
309
+ hitsLost: number;
310
+ }
311
+
312
+ /**
313
+ * What abstaining below one threshold buys on the empties and costs on the hits.
314
+ *
315
+ * A `null` threshold reads the no-skill rate only: with no correct hit there is
316
+ * no recall to cost, and inventing a cutoff would put a number chosen here
317
+ * beside a measured one.
318
+ */
319
+ export function abstentionReading(
320
+ labelled: readonly RowReading[],
321
+ emptyTopScores: readonly number[],
322
+ threshold: number | null,
323
+ ): AbstentionReading {
324
+ const hits = labelled.filter((r) => r.rankOfExpected === 1);
325
+ return {
326
+ empties: emptyTopScores.length,
327
+ noSkill: emptyTopScores.filter((s) => s === 0).length,
328
+ threshold,
329
+ abstainedEmpties: threshold === null ? 0 : emptyTopScores.filter((s) => s < threshold).length,
330
+ correctHits: hits.length,
331
+ hitsLost: threshold === null ? 0 : hits.filter((r) => r.topScore < threshold).length,
332
+ };
333
+ }
334
+
265
335
  function interval(successes: number, trials: number): string {
266
336
  const raw = wilsonInterval(successes, trials);
267
337
  return `${round3(raw.lower).toFixed(3)} – ${round3(raw.upper).toFixed(3)}`;
@@ -286,6 +356,8 @@ export function renderReport(opts: {
286
356
  const misses = readings.filter((r) => r.rankOfExpected !== 1);
287
357
  const deep = misses.filter((r) => r.rankOfExpected === 0 || r.rankOfExpected > DEEP_MISS_DEPTH).length;
288
358
  const mrr = meanReciprocalRank(readings);
359
+ const tieLoss = readings.filter((r) => r.lostOnTie).length;
360
+ const inBlock = readings.filter((r) => r.expectedInTopScoreBlock).length;
289
361
 
290
362
  const empties = emptyRowIds(opts.repo, opts.slice);
291
363
  const rankOpts = rankOptionsFor(opts.ranker);
@@ -368,6 +440,18 @@ export function renderReport(opts: {
368
440
  L.push('of the existing signal can recover a skill the formula never surfaces. The two');
369
441
  L.push('take different fixes, which is why the split is reported rather than an average.');
370
442
  L.push('');
443
+ L.push('## Ties');
444
+ L.push('');
445
+ L.push('| metric | rows | share of rows read |');
446
+ L.push('|---|---:|---:|');
447
+ L.push(`| \`top1_loss_due_to_tie\` | ${String(tieLoss)} | ${pct(tieLoss, n)} |`);
448
+ L.push(`| \`expected_in_top_score_block\` | ${String(inBlock)} | ${pct(inBlock, n)} |`);
449
+ L.push('');
450
+ L.push('`top1_loss_due_to_tie` counts top-1 misses where an expected skill shares the');
451
+ L.push('winner\'s whole ordering key and loses on the name alone — the integer score, and');
452
+ L.push('under `tieBreakUnrounded` the unrounded score as well. `expected_in_top_score_block`');
453
+ L.push('counts rows, hit or miss, whose expected skill scores the winner\'s integer.');
454
+ L.push('');
371
455
  L.push('## False activation on the no-skill prompts');
372
456
  L.push('');
373
457
  L.push('| | |');
@@ -393,6 +477,23 @@ export function renderReport(opts: {
393
477
  L.push('populations at all. A share near one half means it does not: a prompt a seat');
394
478
  L.push('judged to have no skill answer is scored as confidently as a prompt it got right.');
395
479
  L.push('');
480
+ const ab = abstentionReading(readings, emptyScores, fa.correct_hits > 0 ? fa.median_correct_hit_score : null);
481
+ L.push('## Abstention, beside its cost');
482
+ L.push('');
483
+ L.push('| | |');
484
+ L.push('|---|---:|');
485
+ L.push(`| empties the ranker already returns nothing for (no-skill rate) | ${String(ab.noSkill)} of ${String(ab.empties)} (${pct(ab.noSkill, ab.empties)}) |`);
486
+ if (ab.threshold === null) {
487
+ L.push('| abstention threshold | n/a — no correct top-1 hit, so no threshold |');
488
+ } else {
489
+ L.push(`| abstention threshold (abstain below the median correct-hit score) | ${String(ab.threshold)} |`);
490
+ L.push(`| empties that threshold abstains on | ${String(ab.abstainedEmpties)} of ${String(ab.empties)} (${pct(ab.abstainedEmpties, ab.empties)}) |`);
491
+ L.push(`| correct top-1 hits it would suppress (recall cost) | ${String(ab.hitsLost)} of ${String(ab.correctHits)} (${pct(ab.hitsLost, ab.correctHits)}) |`);
492
+ }
493
+ L.push('');
494
+ L.push('One threshold, the same median the false-activation table compares against, so');
495
+ L.push('the gain on the empties and the recall it costs are read off one number.');
496
+ L.push('');
396
497
  L.push(`## Per-pack top-1, worst first`);
397
498
  L.push('');
398
499
  L.push('| pack | labelled rows | top-1 |');
@@ -229,7 +229,7 @@ export const HOST_SURFACES: readonly HostSurface[] = [
229
229
  },
230
230
  {
231
231
  host: 'codex', surface: '.codex/agent-config.md', perRuleTree: false,
232
- writer: 'src/scripts/install.ts:1382',
232
+ writer: 'src/scripts/install.ts:1377',
233
233
  // Scoped to `.codex` rather than the bare filename: nine other lines in
234
234
  // `install.ts` write an `agent-config.md` for some other host, so the
235
235
  // unscoped anchor would have accepted a drift onto any of them — the
@@ -355,10 +355,10 @@ export function collect_orchestration(
355
355
  platform_assumed: boolean,
356
356
  ): OrchestrationReport {
357
357
  const settings = load_agent_settings({ cwd: workspace_root });
358
- const sub = (settings["subagents"] ?? {}) as Record<string, unknown>;
359
358
  const emergency = (settings["emergency"] ?? {}) as Record<string, unknown>;
360
359
  const halted = emergency["orchestration_halt"] === true;
361
- const downshift = sub["downshift"] !== false;
360
+ // Fixed on: the `subagents.downshift` key was retired with this default.
361
+ const downshift = true;
362
362
  const { manifest: host_manifest, sources: host_manifest_sources } =
363
363
  describeHostCapabilities(platform);
364
364
  const activationInputs: ActivationInputs = {
@@ -11,17 +11,6 @@
11
11
  "enum": ["minimal", "balanced", "full", "custom"],
12
12
  "description": "Rule-tier loading footprint. See docs/contracts/cost-profile-defaults.md and docs/contracts/rule-router.md. NOT a memory or model lever."
13
13
  },
14
- "memory": {
15
- "type": "object",
16
- "additionalProperties": true,
17
- "properties": {
18
- "cadence": {
19
- "type": "string",
20
- "enum": ["auto", "always", "never"],
21
- "description": "Cadence of the 🧠 memory-visibility line. See docs/contracts/memory-visibility-v1.md. Owns its own key since the 2026-06-01 untangle; previously collided with rule_loading_tier."
22
- }
23
- }
24
- },
25
14
  "model": {
26
15
  "type": "object",
27
16
  "additionalProperties": true,
@@ -79,25 +68,34 @@
79
68
  }
80
69
  }
81
70
  },
82
- "design": {
71
+ "git": {
83
72
  "type": "object",
84
73
  "additionalProperties": true,
85
74
  "properties": {
86
- "fidelity_mode": {
75
+ "commit_format": {
87
76
  "type": "string",
88
- "enum": ["strict", "structural", "hard-floor"],
89
- "description": "How strictly the agent must follow a user-provided prototype / mockup / design system. Consumed by the design-fidelity rule. strict = build 1:1, every visible deviation needs confirmation; structural = structure locked, silent gaps fillable with a stated assumption; hard-floor = any deviation is never autonomous."
77
+ "enum": ["ticket-scope", "ticket-conventional"],
78
+ "description": "Where a ticket id goes in a commit subject. ticket-scope (default) = `feat(DEV-1234): …`; ticket-conventional = `DEV-1234 feat(area): …`, a ticket is never a scope."
79
+ },
80
+ "branch_pattern": {
81
+ "type": "string",
82
+ "description": "Shape of a branch name the agent creates. Placeholders {type}, {ticket}, {slug}. Default {type}/{slug}."
83
+ },
84
+ "update_strategy": {
85
+ "type": "string",
86
+ "enum": ["merge", "rebase"],
87
+ "description": "How a feature branch is brought up to date with its base. merge (default) = merge the base in; rebase = rebase onto origin/<base> and push with --force-with-lease, still asked for each time per git-history-discipline."
90
88
  }
91
89
  }
92
90
  },
93
- "consistency": {
91
+ "design": {
94
92
  "type": "object",
95
93
  "additionalProperties": true,
96
94
  "properties": {
97
- "cross_source": {
95
+ "fidelity_mode": {
98
96
  "type": "string",
99
- "enum": ["on", "auto", "off"],
100
- "description": "Consumed by the cross-source-consistency rule. When the agent works from multiple sources (ticket text, an attached image/mockup, the spec, the codebase) it checks them against each other and asks before proceeding on a discrepancy. on (default) = surface every real cross-source contradiction / silent-scope-expansion as one question; auto = surface only high-confidence contradictions, state low-confidence as an assumption; off = no cross-source checking."
97
+ "enum": ["strict", "structural", "hard-floor"],
98
+ "description": "How strictly the agent must follow a user-provided prototype / mockup / design system. Consumed by the design-fidelity rule. strict = build 1:1, every visible deviation needs confirmation; structural = structure locked, silent gaps fillable with a stated assumption; hard-floor = any deviation is never autonomous."
101
99
  }
102
100
  }
103
101
  },
@@ -158,18 +156,6 @@
158
156
  }
159
157
  }
160
158
  },
161
- "tokens": {
162
- "type": "object",
163
- "additionalProperties": true,
164
- "description": "Token-spend governance for skills marked token_budget_class: rich. See token-budget-discipline rule.",
165
- "properties": {
166
- "rich_skills": {
167
- "type": "string",
168
- "enum": ["on", "ask", "off"],
169
- "description": "Controls whether skills marked token_budget_class: rich may load in full (exempt from telegraph-speak and thin-projector trimming). on = allowed (default); off = fall back to standard condensed behavior; ask = surface an estimated token delta (tokens, not dollars) and ask the user once per session before loading."
170
- }
171
- }
172
- },
173
159
  "commands": {
174
160
  "type": "object",
175
161
  "additionalProperties": true,
@@ -306,7 +306,7 @@
306
306
  },
307
307
  "auto_detect": {
308
308
  "type": "boolean",
309
- "description": "6.1.0 orchestrator auto-detection opt-in (Step 1, non-interactive-contract). When true, the orchestrator auto-detects its sub-command per the confidence-tiered detection table instead of always showing the menu, honoring the non-interactive-contract (TTY/CI detection, --yes/--json, abort schemas). Per-orchestrator kill-switch: set false to always show the menu; overridable globally via commands.auto_detect in .agent-settings.yml and per-invocation via --no-auto-detect. Only orchestrators (type: orchestrator) carry it."
309
+ "description": "6.1.0 orchestrator auto-detection opt-in (Step 1, non-interactive-contract). When true, the orchestrator auto-detects its sub-command per the confidence-tiered detection table instead of always showing the menu, honoring the non-interactive-contract (TTY/CI detection, --yes/--json, abort schemas). Per-orchestrator kill-switch: set false to always show the menu; per-invocation override via --no-auto-detect (there is no global settings switch). Only orchestrators (type: orchestrator) carry it."
310
310
  }
311
311
  }
312
312
  }
@@ -505,7 +505,7 @@
505
505
  "standard",
506
506
  "rich"
507
507
  ],
508
- "description": "Token-cost class for this skill. `lean` (default): subject to telegraph-speak condensation and thin-projector trimming; optimize for <500 tokens. `standard`: balanced guidance, normal condensation. `rich`: exempt from telegraph-speak and thin-projector trimming; detailed examples preserved; eager-load eligible; ≤15% of skills in a suite may be `rich` (CI-enforced). A `rich` skill MUST carry a '## Why this skill is rich' section explaining the irreducible complexity that makes condensation harmful. Governed by `token-budget-discipline` rule + `tokens.rich_skills` consumer setting. See docs/guidelines/token-budget-governance.md."
508
+ "description": "Token-cost class for this skill. `lean` (default): subject to telegraph-speak condensation and thin-projector trimming; optimize for <500 tokens. `standard`: balanced guidance, normal condensation. `rich`: exempt from telegraph-speak and thin-projector trimming; detailed examples preserved; eager-load eligible; ≤15% of skills in a suite may be `rich` (CI-enforced). A `rich` skill MUST carry a '## Why this skill is rich' section explaining the irreducible complexity that makes condensation harmful. Governed by the `token-budget-discipline` rule; rich skills always load in full. See docs/guidelines/token-budget-governance.md."
509
509
  },
510
510
  "parallelizable": {
511
511
  "type": "string",
@@ -116,12 +116,30 @@ export function gateVerdict(findings: readonly Finding[], opts: { enforce: boole
116
116
  const SKIP_PREFIXES = ['dist/agent-src/', '.augment/', '.claude/', '.cursor/', '.clinerules/'];
117
117
  const SKIP_EXACT = new Set(['.windsurfrules', 'GEMINI.md', 'package-lock.json']);
118
118
 
119
+ /**
120
+ * Review artefacts, `.review-input/` copies included: a copy of a diff that was
121
+ * already reviewed. The R2 reviewer excludes the same tree
122
+ * (`REVIEW_SCOPE_EXCLUDES` in `dispatch_r2_reviewer.ts`); here they used to
123
+ * compete for `MAX_REVIEW_CHUNKS` — 154 of 16.3.0's 603 unreviewed paths sat
124
+ * under it. Counted separately in the coverage record, never as unreviewed.
125
+ */
126
+ export const REVIEW_COPY_PREFIX = 'agents/evidence/reviews/';
127
+
128
+ export function isReviewCopyPath(p: string): boolean {
129
+ return p.startsWith(REVIEW_COPY_PREFIX);
130
+ }
131
+
119
132
  export function isReviewablePath(p: string): boolean {
120
133
  if (SKIP_EXACT.has(p)) return false;
134
+ if (isReviewCopyPath(p)) return false;
121
135
  return !SKIP_PREFIXES.some((pre) => p.startsWith(pre));
122
136
  }
123
137
 
124
138
  function changedFiles(baseRef: string, cwd: string = REPO_ROOT): string[] {
139
+ return allChangedFiles(baseRef, cwd).filter(isReviewablePath);
140
+ }
141
+
142
+ function allChangedFiles(baseRef: string, cwd: string = REPO_ROOT): string[] {
125
143
  // `-c core.quotePath=false`: by default git renders a non-ASCII path as an
126
144
  // escaped, QUOTED string (`"gr\303\274e.ts"`), which then matches no
127
145
  // pathspec when fed back to `git diff`. The file was silently skipped by
@@ -138,8 +156,7 @@ function changedFiles(baseRef: string, cwd: string = REPO_ROOT): string[] {
138
156
  return (r.stdout ?? '')
139
157
  .split('\n')
140
158
  .map((s) => s.trim())
141
- .filter(Boolean)
142
- .filter(isReviewablePath);
159
+ .filter(Boolean);
143
160
  }
144
161
 
145
162
  /**
@@ -758,6 +775,8 @@ export interface ReviewPlan {
758
775
  requests: number;
759
776
  /** Files no request will carry, with the reason. */
760
777
  unreviewed: { path: string; reason: string }[];
778
+ /** Changed paths under `REVIEW_COPY_PREFIX` — copies of a reviewed diff, sent to no request. */
779
+ reviewCopies: string[];
761
780
  promptChars: number;
762
781
  note: string;
763
782
  escalation: string[];
@@ -787,6 +806,7 @@ export function buildPlan(baseRef: string, cwd: string = REPO_ROOT): ReviewPlan
787
806
  }
788
807
 
789
808
  const files = analysisBase === baseRef ? packagingFiles : changedFiles(analysisBase, cwd);
809
+ const reviewCopies = allChangedFiles(analysisBase, cwd).filter(isReviewCopyPath);
790
810
  const diff = diffText(analysisBase, files, cwd);
791
811
  const escalation = escalationReasons(files, changedLineCount(analysisBase, files, cwd));
792
812
  const systemPrompt = buildSystemPrompt(release, baseRef);
@@ -810,6 +830,7 @@ export function buildPlan(baseRef: string, cwd: string = REPO_ROOT): ReviewPlan
810
830
  facts,
811
831
  requests: partition.chunks.length,
812
832
  unreviewed: partition.unreviewed,
833
+ reviewCopies,
813
834
  skills: [...REVIEW_SKILLS],
814
835
  files,
815
836
  analysisBase,
@@ -904,6 +925,12 @@ export function coverageBlock(coverage?: ReviewCoverage): string {
904
925
  `\n\n**Coverage.** ${String(coverage.chunks)} request(s) over ` +
905
926
  `${String(coverage.filesReviewed)} of ${String(coverage.filesTotal)} changed file(s).`,
906
927
  ];
928
+ if ((coverage.reviewCopies ?? 0) > 0) {
929
+ parts.push(
930
+ ` ${String(coverage.reviewCopies)} further path(s) under \`${REVIEW_COPY_PREFIX}\` are ` +
931
+ 'copies of an already-reviewed diff and were not re-read.',
932
+ );
933
+ }
907
934
  if (coverage.unreviewed.length > 0) {
908
935
  parts.push(
909
936
  ` **NOT reviewed (${String(coverage.unreviewed.length)}):**\n` +
@@ -927,6 +954,12 @@ export interface ReviewCoverage {
927
954
  /** Files the span changed, so the reader sees the fraction, not a bare count. */
928
955
  filesTotal: number;
929
956
  unreviewed: { path: string; reason: string }[];
957
+ /**
958
+ * Changed paths under `REVIEW_COPY_PREFIX`, not re-read because each is a
959
+ * copy of a diff already reviewed. Neither reviewed nor unreviewed, and not
960
+ * in `filesTotal`. Optional: a record written before this field has none.
961
+ */
962
+ reviewCopies?: number;
930
963
  }
931
964
 
932
965
  export function renderReview(findings: Finding[], enforce: boolean, escalation: readonly string[] = [], coverage?: ReviewCoverage): string {
@@ -1089,6 +1122,9 @@ export function main(argv: string[]): 0 | 2 {
1089
1122
  `packaging diff ${plan.release.packagingFiles.length} file(s))\n`
1090
1123
  : '') +
1091
1124
  ` files: ${plan.files.length}\n` +
1125
+ (plan.reviewCopies.length > 0
1126
+ ? ` review copies (not re-read): ${String(plan.reviewCopies.length)}\n`
1127
+ : '') +
1092
1128
  ` calls: ${plan.requests} (budget ${String(PROMPT_BUDGET_CHARS)} chars/request, ` +
1093
1129
  `ceiling ${String(MAX_REVIEW_CHUNKS)})\n` +
1094
1130
  (plan.unreviewed.length > 0
@@ -1242,6 +1278,7 @@ export function main(argv: string[]): 0 | 2 {
1242
1278
  filesReviewed: filesRead,
1243
1279
  filesTotal: plan.files.length,
1244
1280
  unreviewed,
1281
+ reviewCopies: plan.reviewCopies.length,
1245
1282
  };
1246
1283
  // Ground-truth pass, ONCE, before anything reads the finding set. A
1247
1284
  // deletion claim the range and the tree both disprove is annotated