@event4u/agent-config 14.23.0 → 16.0.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 (541) 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 +144 -152
  5. package/README.md +1 -1
  6. package/dist/agent-src/commands/agent-handoff.md +8 -7
  7. package/dist/agent-src/commands/agents/init.md +1 -1
  8. package/dist/agent-src/commands/agents/user/accept.md +4 -4
  9. package/dist/agent-src/commands/agents/user/delete.md +2 -2
  10. package/dist/agent-src/commands/agents/user/init.md +3 -3
  11. package/dist/agent-src/commands/agents/user/review.md +3 -3
  12. package/dist/agent-src/commands/agents/user/show.md +3 -3
  13. package/dist/agent-src/commands/agents/user/update.md +2 -2
  14. package/dist/agent-src/commands/agents/user.md +6 -6
  15. package/dist/agent-src/commands/analytics/prune.md +1 -1
  16. package/dist/agent-src/commands/analytics/show.md +2 -2
  17. package/dist/agent-src/commands/analyze/decision.md +2 -2
  18. package/dist/agent-src/commands/analyze/inbox.md +5 -5
  19. package/dist/agent-src/commands/analyze/incident.md +3 -3
  20. package/dist/agent-src/commands/analyze/near-miss.md +3 -3
  21. package/dist/agent-src/commands/analyze/postmortem.md +4 -4
  22. package/dist/agent-src/commands/analyze/premortem.md +2 -2
  23. package/dist/agent-src/commands/analyze.md +2 -2
  24. package/dist/agent-src/commands/bug/fix.md +1 -1
  25. package/dist/agent-src/commands/bug/investigate.md +2 -2
  26. package/dist/agent-src/commands/cost/profile.md +3 -3
  27. package/dist/agent-src/commands/design.md +1 -1
  28. package/dist/agent-src/commands/feature/explore.md +1 -1
  29. package/dist/agent-src/commands/feature/plan.md +2 -2
  30. package/dist/agent-src/commands/feature/roadmap.md +2 -2
  31. package/dist/agent-src/commands/ghostwriter/fetch.md +4 -4
  32. package/dist/agent-src/commands/ghostwriter/list.md +1 -1
  33. package/dist/agent-src/commands/ghostwriter/show.md +1 -1
  34. package/dist/agent-src/commands/ghostwriter/write.md +9 -9
  35. package/dist/agent-src/commands/humanize.md +6 -6
  36. package/dist/agent-src/commands/jira-ticket.md +1 -1
  37. package/dist/agent-src/commands/judge/solo.md +1 -1
  38. package/dist/agent-src/commands/judge.md +1 -1
  39. package/dist/agent-src/commands/knowledge/cross-repo.md +1 -1
  40. package/dist/agent-src/commands/knowledge/forget.md +1 -1
  41. package/dist/agent-src/commands/knowledge/ingest.md +2 -2
  42. package/dist/agent-src/commands/knowledge/list.md +1 -1
  43. package/dist/agent-src/commands/memory/add.md +3 -3
  44. package/dist/agent-src/commands/memory/load.md +4 -4
  45. package/dist/agent-src/commands/memory/mine-session.md +1 -1
  46. package/dist/agent-src/commands/memory/promote.md +4 -4
  47. package/dist/agent-src/commands/memory/propose.md +2 -2
  48. package/dist/agent-src/commands/mode.md +5 -5
  49. package/dist/agent-src/commands/post-as/ghostwriter.md +3 -3
  50. package/dist/agent-src/commands/post-as/me.md +7 -7
  51. package/dist/agent-src/commands/pr/create.md +1 -1
  52. package/dist/agent-src/commands/pr/merge.md +1 -1
  53. package/dist/agent-src/commands/profile/activate.md +1 -1
  54. package/dist/agent-src/commands/profile/show.md +1 -1
  55. package/dist/agent-src/commands/research/deep.md +2 -2
  56. package/dist/agent-src/commands/research/report.md +2 -2
  57. package/dist/agent-src/commands/review/changes.md +1 -1
  58. package/dist/agent-src/commands/review/routing.md +1 -1
  59. package/dist/agent-src/commands/roadmap/create.md +4 -3
  60. package/dist/agent-src/commands/roadmap/materialize.md +2 -2
  61. package/dist/agent-src/commands/roadmap/next.md +1 -1
  62. package/dist/agent-src/commands/roadmap/process-full.md +2 -2
  63. package/dist/agent-src/commands/security-audit-config.md +3 -3
  64. package/dist/agent-src/commands/skill/preview.md +1 -1
  65. package/dist/agent-src/commands/skills/discover.md +1 -1
  66. package/dist/agent-src/commands/sync/agent-settings.md +2 -2
  67. package/dist/agent-src/commands/sync/gitignore/fix.md +1 -1
  68. package/dist/agent-src/commands/tests/create.md +1 -1
  69. package/dist/agent-src/commands/tests/e2e-heal.md +1 -1
  70. package/dist/agent-src/commands/tests/e2e-plan.md +1 -1
  71. package/dist/agent-src/contexts/authority/kernel-rule-edits.md +6 -6
  72. package/dist/agent-src/contexts/communication/rules-auto/slash-command-routing-policy-mechanics.md +1 -2
  73. package/dist/agent-src/contexts/communication/rules-auto/think-before-action-mechanics.md +2 -2
  74. package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +88 -1
  75. package/dist/agent-src/contexts/communication/rules-auto/user-interaction-mechanics.md +51 -1
  76. package/dist/agent-src/contexts/contracts/frugality-charter.md +1 -1
  77. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +1 -1
  78. package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +1 -1
  79. package/dist/agent-src/contexts/execution/autonomy-mechanics.md +1 -1
  80. package/dist/agent-src/contexts/execution/cheap-question-mechanics.md +1 -1
  81. package/dist/agent-src/contexts/execution/contract-decision-sheet.md +3 -3
  82. package/dist/agent-src/contexts/execution/mandated-lines.md +1 -1
  83. package/dist/agent-src/contexts/execution/non-interactive-contract.md +1 -1
  84. package/dist/agent-src/contexts/execution/orchestration-telemetry.md +1 -1
  85. package/dist/agent-src/contexts/execution/plan-confidence-gate.md +5 -5
  86. package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +1 -1
  87. package/dist/agent-src/contexts/execution/subagent-modes-detail.md +1 -1
  88. package/dist/agent-src/contexts/execution/subagent-routing.md +2 -2
  89. package/dist/agent-src/contexts/execution/subagent-spawn-contract.md +1 -1
  90. package/dist/agent-src/contexts/execution/user-memory-channels.md +3 -3
  91. package/dist/agent-src/contexts/execution/verification-mechanics.md +1 -1
  92. package/dist/agent-src/contexts/judges/persona-voice-rubric.md +2 -2
  93. package/dist/agent-src/guidelines/abstraction-thresholds.md +88 -0
  94. package/dist/agent-src/guidelines/agent-infra/5w2h-analysis.md +260 -0
  95. package/dist/agent-src/guidelines/agent-infra/active-remediation-mechanics.md +99 -0
  96. package/dist/agent-src/guidelines/agent-infra/agent-interaction-and-decision-quality.md +325 -0
  97. package/dist/agent-src/guidelines/agent-infra/api-cost-levers.md +177 -0
  98. package/dist/agent-src/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md +222 -0
  99. package/dist/agent-src/guidelines/agent-infra/ask-when-uncertain-demos.md +134 -0
  100. package/dist/agent-src/guidelines/agent-infra/asking-and-brevity-examples.md +198 -0
  101. package/dist/agent-src/guidelines/agent-infra/break-glass-usage.md +113 -0
  102. package/dist/agent-src/guidelines/agent-infra/carve-out-predicates.md +17 -0
  103. package/dist/agent-src/guidelines/agent-infra/comparison-matrix.md +179 -0
  104. package/dist/agent-src/guidelines/agent-infra/context-hygiene-mechanics.md +165 -0
  105. package/dist/agent-src/guidelines/agent-infra/corpus-grounding-authoring.md +91 -0
  106. package/dist/agent-src/guidelines/agent-infra/critical-thinking.md +156 -0
  107. package/dist/agent-src/guidelines/agent-infra/cross-source-consistency-mechanics.md +109 -0
  108. package/dist/agent-src/guidelines/agent-infra/developer-judgment.md +82 -0
  109. package/dist/agent-src/guidelines/agent-infra/direct-answers-demos.md +142 -0
  110. package/dist/agent-src/guidelines/agent-infra/domain-adoption-gates.md +112 -0
  111. package/dist/agent-src/guidelines/agent-infra/domain-eval-anti-pattern.md +53 -0
  112. package/dist/agent-src/guidelines/agent-infra/domain-pack-architecture.md +56 -0
  113. package/dist/agent-src/guidelines/agent-infra/downstream-changes-mechanics.md +91 -0
  114. package/dist/agent-src/guidelines/agent-infra/emphasis-budget.md +45 -0
  115. package/dist/agent-src/guidelines/agent-infra/engineering-memory-data-format.md +210 -0
  116. package/dist/agent-src/guidelines/agent-infra/evaluator-independence-mechanics.md +92 -0
  117. package/dist/agent-src/guidelines/agent-infra/existence-question-verdicts.md +80 -0
  118. package/dist/agent-src/guidelines/agent-infra/failure-signatures.md +70 -0
  119. package/dist/agent-src/guidelines/agent-infra/false-green.md +233 -0
  120. package/dist/agent-src/guidelines/agent-infra/first-principles.md +192 -0
  121. package/dist/agent-src/guidelines/agent-infra/framework-neutrality-patterns.md +66 -0
  122. package/dist/agent-src/guidelines/agent-infra/frontier-reasoning-operating-profile.md +169 -0
  123. package/dist/agent-src/guidelines/agent-infra/gate-authoring.md +177 -0
  124. package/dist/agent-src/guidelines/agent-infra/guarded-baseline.md +39 -0
  125. package/dist/agent-src/guidelines/agent-infra/installed-tools-manifest.md +142 -0
  126. package/dist/agent-src/guidelines/agent-infra/inversion-thinking.md +388 -0
  127. package/dist/agent-src/guidelines/agent-infra/ios-simulator-guide.md +378 -0
  128. package/dist/agent-src/guidelines/agent-infra/language-and-tone-examples.md +141 -0
  129. package/dist/agent-src/guidelines/agent-infra/layered-settings.md +317 -0
  130. package/dist/agent-src/guidelines/agent-infra/linked-projects-onboarding-gate.md +80 -0
  131. package/dist/agent-src/guidelines/agent-infra/mcp-request-signing.md +197 -0
  132. package/dist/agent-src/guidelines/agent-infra/memory-access.md +149 -0
  133. package/dist/agent-src/guidelines/agent-infra/mental-models.md +314 -0
  134. package/dist/agent-src/guidelines/agent-infra/minimal-safe-diff-mechanics.md +241 -0
  135. package/dist/agent-src/guidelines/agent-infra/missing-tool-handling.md +66 -0
  136. package/dist/agent-src/guidelines/agent-infra/model-recommendation.md +101 -0
  137. package/dist/agent-src/guidelines/agent-infra/naming.md +69 -0
  138. package/dist/agent-src/guidelines/agent-infra/notes-horizon-mechanics.md +90 -0
  139. package/dist/agent-src/guidelines/agent-infra/output-patterns.md +117 -0
  140. package/dist/agent-src/guidelines/agent-infra/recurring-criticism-mechanics.md +96 -0
  141. package/dist/agent-src/guidelines/agent-infra/reuse-verdict-mechanics.md +71 -0
  142. package/dist/agent-src/guidelines/agent-infra/review-routing-data-format.md +143 -0
  143. package/dist/agent-src/guidelines/agent-infra/roadmap-deferred-resolution-provenance.md +54 -0
  144. package/dist/agent-src/guidelines/agent-infra/roadmap-progress-mechanics.md +274 -0
  145. package/dist/agent-src/guidelines/agent-infra/role-contracts.md +209 -0
  146. package/dist/agent-src/guidelines/agent-infra/role-mode-router.md +89 -0
  147. package/dist/agent-src/guidelines/agent-infra/rule-body-migration-inventory.md +241 -0
  148. package/dist/agent-src/guidelines/agent-infra/rule-type-governance.md +73 -0
  149. package/dist/agent-src/guidelines/agent-infra/runtime-layer.md +89 -0
  150. package/dist/agent-src/guidelines/agent-infra/scqa-framework.md +526 -0
  151. package/dist/agent-src/guidelines/agent-infra/security-lint-containment.md +121 -0
  152. package/dist/agent-src/guidelines/agent-infra/self-improvement-pipeline.md +134 -0
  153. package/dist/agent-src/guidelines/agent-infra/simplicity-and-goal-demos.md +211 -0
  154. package/dist/agent-src/guidelines/agent-infra/six-hats.md +353 -0
  155. package/dist/agent-src/guidelines/agent-infra/size-and-scope.md +229 -0
  156. package/dist/agent-src/guidelines/agent-infra/skill-quality-checklist.md +157 -0
  157. package/dist/agent-src/guidelines/agent-infra/source-confidentiality-mechanics.md +109 -0
  158. package/dist/agent-src/guidelines/agent-infra/symptom-driven-harvest-loop.md +104 -0
  159. package/dist/agent-src/guidelines/agent-infra/systems-thinking.md +220 -0
  160. package/dist/agent-src/guidelines/agent-infra/tool-description-as-policy.md +35 -0
  161. package/dist/agent-src/guidelines/agent-infra/tool-integration.md +73 -0
  162. package/dist/agent-src/guidelines/agent-infra/traceability-field-mechanics.md +50 -0
  163. package/dist/agent-src/guidelines/agent-infra/untrusted-input-spotlighting.md +166 -0
  164. package/dist/agent-src/guidelines/agent-infra/verify-before-complete-demos.md +128 -0
  165. package/dist/agent-src/guidelines/augment-portability-patterns.md +70 -0
  166. package/dist/agent-src/guidelines/code-clarity.md +350 -0
  167. package/dist/agent-src/guidelines/component-oriented-and-oop-development.md +189 -0
  168. package/dist/agent-src/guidelines/cross-role-handoff.md +127 -0
  169. package/dist/agent-src/guidelines/design-antipatterns-triggers.json +18 -0
  170. package/dist/agent-src/guidelines/design-antipatterns.md +327 -0
  171. package/dist/agent-src/guidelines/design-asset-discipline.md +38 -0
  172. package/dist/agent-src/guidelines/design-canon.md +63 -0
  173. package/dist/agent-src/guidelines/design-fidelity-mechanics.md +293 -0
  174. package/dist/agent-src/guidelines/design-fidelity-routing.md +78 -0
  175. package/dist/agent-src/guidelines/design-handover-extraction.md +117 -0
  176. package/dist/agent-src/guidelines/design-modes.md +143 -0
  177. package/dist/agent-src/guidelines/design-reconciliation.md +172 -0
  178. package/dist/agent-src/guidelines/docs/readme-size-and-splitting.md +209 -0
  179. package/dist/agent-src/guidelines/e2e/playwright.md +363 -0
  180. package/dist/agent-src/guidelines/gtm-handoff.md +114 -0
  181. package/dist/agent-src/guidelines/monorepo-antipatterns.md +141 -0
  182. package/dist/agent-src/guidelines/php/api-design.md +115 -0
  183. package/dist/agent-src/guidelines/php/artisan-commands.md +81 -0
  184. package/dist/agent-src/guidelines/php/blade-ui.md +78 -0
  185. package/dist/agent-src/guidelines/php/controllers.md +90 -0
  186. package/dist/agent-src/guidelines/php/database.md +194 -0
  187. package/dist/agent-src/guidelines/php/eloquent.md +208 -0
  188. package/dist/agent-src/guidelines/php/flux.md +80 -0
  189. package/dist/agent-src/guidelines/php/general.md +207 -0
  190. package/dist/agent-src/guidelines/php/git.md +164 -0
  191. package/dist/agent-src/guidelines/php/jobs.md +111 -0
  192. package/dist/agent-src/guidelines/php/livewire.md +71 -0
  193. package/dist/agent-src/guidelines/php/logging.md +79 -0
  194. package/dist/agent-src/guidelines/php/naming.md +89 -0
  195. package/dist/agent-src/guidelines/php/patterns/dependency-injection.md +57 -0
  196. package/dist/agent-src/guidelines/php/patterns/dtos.md +199 -0
  197. package/dist/agent-src/guidelines/php/patterns/events.md +67 -0
  198. package/dist/agent-src/guidelines/php/patterns/factory.md +53 -0
  199. package/dist/agent-src/guidelines/php/patterns/pipelines.md +66 -0
  200. package/dist/agent-src/guidelines/php/patterns/policies.md +66 -0
  201. package/dist/agent-src/guidelines/php/patterns/repositories.md +122 -0
  202. package/dist/agent-src/guidelines/php/patterns/service-layer.md +64 -0
  203. package/dist/agent-src/guidelines/php/patterns/strategy.md +247 -0
  204. package/dist/agent-src/guidelines/php/patterns.md +28 -0
  205. package/dist/agent-src/guidelines/php/performance.md +92 -0
  206. package/dist/agent-src/guidelines/php/php-coding-patterns.md +80 -0
  207. package/dist/agent-src/guidelines/php/resources.md +100 -0
  208. package/dist/agent-src/guidelines/php/security.md +110 -0
  209. package/dist/agent-src/guidelines/php/sql.md +97 -0
  210. package/dist/agent-src/guidelines/php/validations.md +119 -0
  211. package/dist/agent-src/guidelines/php/websocket.md +100 -0
  212. package/dist/agent-src/guidelines/prompt-templates.md +189 -0
  213. package/dist/agent-src/guidelines/redundancy-taxonomy.md +208 -0
  214. package/dist/agent-src/guidelines/wing4-handoff.md +127 -0
  215. package/dist/agent-src/personas/README.md +1 -1
  216. package/dist/agent-src/personas/_template-specialist/persona.md +1 -1
  217. package/dist/agent-src/personas/product-owner.md +1 -1
  218. package/dist/agent-src/rules/active-remediation.md +1 -1
  219. package/dist/agent-src/rules/architecture.md +2 -2
  220. package/dist/agent-src/rules/artifact-drafting-protocol.md +1 -1
  221. package/dist/agent-src/rules/ask-when-uncertain.md +2 -2
  222. package/dist/agent-src/rules/brand-source-of-truth.md +9 -7
  223. package/dist/agent-src/rules/code-comment-discipline.md +2 -2
  224. package/dist/agent-src/rules/code-provenance.md +1 -1
  225. package/dist/agent-src/rules/content-quoting-floor.md +1 -1
  226. package/dist/agent-src/rules/context-hygiene.md +5 -5
  227. package/dist/agent-src/rules/cross-source-consistency.md +1 -1
  228. package/dist/agent-src/rules/design-fidelity.md +36 -46
  229. package/dist/agent-src/rules/direct-answers.md +2 -2
  230. package/dist/agent-src/rules/domain-adoption-policy.md +1 -1
  231. package/dist/agent-src/rules/evaluator-independence.md +1 -1
  232. package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +1 -1
  233. package/dist/agent-src/rules/icon-consistency.md +5 -1
  234. package/dist/agent-src/rules/improve-before-implement.md +1 -1
  235. package/dist/agent-src/rules/language-and-tone.md +3 -3
  236. package/dist/agent-src/rules/minimal-safe-diff.md +1 -1
  237. package/dist/agent-src/rules/notes-first-reasoning.md +2 -2
  238. package/dist/agent-src/rules/recurring-criticism.md +1 -1
  239. package/dist/agent-src/rules/roadmap-progress-sync.md +1 -1
  240. package/dist/agent-src/rules/role-mode-adherence.md +2 -2
  241. package/dist/agent-src/rules/security-sensitive-stop.md +1 -1
  242. package/dist/agent-src/rules/size-enforcement.md +1 -1
  243. package/dist/agent-src/rules/source-confidentiality.md +2 -2
  244. package/dist/agent-src/rules/think-before-action.md +1 -1
  245. package/dist/agent-src/rules/token-efficiency.md +7 -5
  246. package/dist/agent-src/rules/ui-audit-gate.md +3 -2
  247. package/dist/agent-src/rules/untrusted-input-defense.md +3 -3
  248. package/dist/agent-src/rules/user-interaction.md +31 -30
  249. package/dist/agent-src/skills/activation-design/SKILL.md +2 -2
  250. package/dist/agent-src/skills/adr-create/SKILL.md +5 -5
  251. package/dist/agent-src/skills/ai-council/SKILL.md +1 -1
  252. package/dist/agent-src/skills/ai-council/references/advanced-modes.md +1 -1
  253. package/dist/agent-src/skills/blade-ui/SKILL.md +1 -1
  254. package/dist/agent-src/skills/blast-radius-analyzer/SKILL.md +1 -1
  255. package/dist/agent-src/skills/brand-to-tokens/SKILL.md +24 -3
  256. package/dist/agent-src/skills/bug-analyzer/SKILL.md +1 -1
  257. package/dist/agent-src/skills/build-buy-partner/SKILL.md +1 -1
  258. package/dist/agent-src/skills/churn-prevention/SKILL.md +2 -2
  259. package/dist/agent-src/skills/code-refactoring/SKILL.md +3 -3
  260. package/dist/agent-src/skills/code-review/SKILL.md +3 -3
  261. package/dist/agent-src/skills/command-writing/SKILL.md +3 -3
  262. package/dist/agent-src/skills/comp-banding/SKILL.md +1 -1
  263. package/dist/agent-src/skills/competitive-moat-analysis/SKILL.md +1 -1
  264. package/dist/agent-src/skills/competitive-positioning/SKILL.md +2 -2
  265. package/dist/agent-src/skills/complexity-first-planning/SKILL.md +1 -1
  266. package/dist/agent-src/skills/condense-memory/SKILL.md +1 -1
  267. package/dist/agent-src/skills/content-funnel-design/SKILL.md +2 -2
  268. package/dist/agent-src/skills/contracts-cognition/SKILL.md +1 -1
  269. package/dist/agent-src/skills/copilot-agents-optimization/SKILL.md +2 -2
  270. package/dist/agent-src/skills/corpus-grounding/SKILL.md +2 -2
  271. package/dist/agent-src/skills/customer-research/SKILL.md +2 -2
  272. package/dist/agent-src/skills/dashboard-design/SKILL.md +1 -1
  273. package/dist/agent-src/skills/data-handling-judgment/SKILL.md +1 -1
  274. package/dist/agent-src/skills/deal-qualification-meddic/SKILL.md +2 -2
  275. package/dist/agent-src/skills/decision-record/SKILL.md +3 -3
  276. package/dist/agent-src/skills/decision-review/SKILL.md +8 -8
  277. package/dist/agent-src/skills/deep-reading-analyst/SKILL.md +22 -22
  278. package/dist/agent-src/skills/design-intelligence/SKILL.md +4 -4
  279. package/dist/agent-src/skills/design-intelligence/references/context-and-registers.md +2 -2
  280. package/dist/agent-src/skills/design-review/SKILL.md +4 -4
  281. package/dist/agent-src/skills/design-system-capture/references/design-system-json.md +20 -1
  282. package/dist/agent-src/skills/design-tokens/SKILL.md +17 -2
  283. package/dist/agent-src/skills/design-variations/SKILL.md +2 -2
  284. package/dist/agent-src/skills/developer-like-execution/SKILL.md +2 -2
  285. package/dist/agent-src/skills/discovery-interview/SKILL.md +2 -2
  286. package/dist/agent-src/skills/doc-coauthoring/SKILL.md +3 -3
  287. package/dist/agent-src/skills/editorial-calendar/SKILL.md +2 -2
  288. package/dist/agent-src/skills/error-handling-patterns/SKILL.md +9 -0
  289. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +44 -1
  290. package/dist/agent-src/skills/existing-ui-audit/references/anti-slop-cross-reference.md +2 -2
  291. package/dist/agent-src/skills/expansion-playbook/SKILL.md +2 -2
  292. package/dist/agent-src/skills/experiment-loop/SKILL.md +1 -1
  293. package/dist/agent-src/skills/experiment-loop/references/protocol.md +1 -1
  294. package/dist/agent-src/skills/fe-design/SKILL.md +3 -3
  295. package/dist/agent-src/skills/fe-design/references/design-patterns.md +1 -1
  296. package/dist/agent-src/skills/fe-design/references/design-read-and-memory.md +3 -3
  297. package/dist/agent-src/skills/fe-design/references/source-led-port.md +1 -1
  298. package/dist/agent-src/skills/feature-planning/SKILL.md +1 -1
  299. package/dist/agent-src/skills/flux/SKILL.md +1 -1
  300. package/dist/agent-src/skills/forecast-accuracy/SKILL.md +2 -2
  301. package/dist/agent-src/skills/forecasting/SKILL.md +2 -2
  302. package/dist/agent-src/skills/fundraising-narrative/SKILL.md +2 -2
  303. package/dist/agent-src/skills/funnel-analysis/SKILL.md +2 -2
  304. package/dist/agent-src/skills/gtm-launch/SKILL.md +2 -2
  305. package/dist/agent-src/skills/hiring-loop-design/SKILL.md +1 -1
  306. package/dist/agent-src/skills/html-deck/SKILL.md +5 -5
  307. package/dist/agent-src/skills/humanizer/SKILL.md +1 -1
  308. package/dist/agent-src/skills/humanizer/data/patterns.md +1 -1
  309. package/dist/agent-src/skills/iconography/SKILL.md +3 -3
  310. package/dist/agent-src/skills/judge-synthesis/SKILL.md +1 -1
  311. package/dist/agent-src/skills/laravel-api-endpoint/SKILL.md +2 -2
  312. package/dist/agent-src/skills/launch-readiness/SKILL.md +3 -3
  313. package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +6 -6
  314. package/dist/agent-src/skills/livewire/SKILL.md +1 -1
  315. package/dist/agent-src/skills/market-entry-analysis/SKILL.md +1 -1
  316. package/dist/agent-src/skills/mcp-builder/SKILL.md +1 -1
  317. package/dist/agent-src/skills/memory-consolidation/SKILL.md +3 -3
  318. package/dist/agent-src/skills/messaging-architecture/SKILL.md +2 -2
  319. package/dist/agent-src/skills/monorepo-workspace/SKILL.md +1 -1
  320. package/dist/agent-src/skills/onboarding-design/SKILL.md +2 -2
  321. package/dist/agent-src/skills/onboarding-program/SKILL.md +1 -1
  322. package/dist/agent-src/skills/one-on-one-cadence/SKILL.md +1 -1
  323. package/dist/agent-src/skills/org-design/SKILL.md +1 -1
  324. package/dist/agent-src/skills/overbuild-review-lens/SKILL.md +3 -3
  325. package/dist/agent-src/skills/override-management/SKILL.md +1 -1
  326. package/dist/agent-src/skills/perf-feedback-craft/SKILL.md +1 -1
  327. package/dist/agent-src/skills/persona-writing/SKILL.md +1 -1
  328. package/dist/agent-src/skills/php-coder/SKILL.md +1 -1
  329. package/dist/agent-src/skills/pipeline-strategy/SKILL.md +2 -2
  330. package/dist/agent-src/skills/playwright-testing/SKILL.md +3 -3
  331. package/dist/agent-src/skills/po-discovery/SKILL.md +1 -1
  332. package/dist/agent-src/skills/positioning-strategy/SKILL.md +2 -2
  333. package/dist/agent-src/skills/privacy-review/SKILL.md +1 -1
  334. package/dist/agent-src/skills/prompt-optimizer/SKILL.md +3 -3
  335. package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +1 -1
  336. package/dist/agent-src/skills/reasoning-orchestrator/SKILL.md +2 -2
  337. package/dist/agent-src/skills/receiving-code-review/SKILL.md +1 -1
  338. package/dist/agent-src/skills/refine-ticket/SKILL.md +2 -2
  339. package/dist/agent-src/skills/release-comms/SKILL.md +2 -2
  340. package/dist/agent-src/skills/retention-loops/SKILL.md +2 -2
  341. package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
  342. package/dist/agent-src/skills/roadmap-management/SKILL.md +1 -1
  343. package/dist/agent-src/skills/roadmap-management/references/archival.md +1 -1
  344. package/dist/agent-src/skills/roadmap-writing/SKILL.md +5 -5
  345. package/dist/agent-src/skills/rule-writing/SKILL.md +6 -6
  346. package/dist/agent-src/skills/runway-cognition/SKILL.md +2 -2
  347. package/dist/agent-src/skills/scenario-modeling/SKILL.md +2 -2
  348. package/dist/agent-src/skills/skill-writing/SKILL.md +2 -2
  349. package/dist/agent-src/skills/skill-writing/references/procedure.md +1 -1
  350. package/dist/agent-src/skills/skill-writing/references/section-patterns.md +3 -3
  351. package/dist/agent-src/skills/spreadsheet-authoring/SKILL.md +1 -1
  352. package/dist/agent-src/skills/stakeholder-tradeoff/SKILL.md +3 -3
  353. package/dist/agent-src/skills/subagent-orchestration/SKILL.md +1 -1
  354. package/dist/agent-src/skills/supply-chain-intake/SKILL.md +1 -1
  355. package/dist/agent-src/skills/systematic-debugging/SKILL.md +2 -2
  356. package/dist/agent-src/skills/tailwind-engineer/SKILL.md +11 -5
  357. package/dist/agent-src/skills/throughput-vs-morale-tradeoff/SKILL.md +1 -1
  358. package/dist/agent-src/skills/token-optimizer/SKILL.md +1 -1
  359. package/dist/agent-src/skills/typography-system/SKILL.md +2 -2
  360. package/dist/agent-src/skills/ui-component-architect/SKILL.md +28 -8
  361. package/dist/agent-src/skills/unit-economics-modeling/SKILL.md +2 -2
  362. package/dist/agent-src/skills/upstream-contribute/SKILL.md +1 -1
  363. package/dist/agent-src/skills/validate-feature-fit/SKILL.md +2 -2
  364. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +2 -2
  365. package/dist/agent-src/skills/vision-articulation/SKILL.md +1 -1
  366. package/dist/agent-src/skills/voc-extract/SKILL.md +2 -2
  367. package/dist/agent-src/skills/voice-and-tone-design/SKILL.md +2 -2
  368. package/dist/agent-src/skills/wireframe/SKILL.md +1 -1
  369. package/dist/agent-src/skills/workspace-link/SKILL.md +1 -1
  370. package/dist/agent-src/templates/agent-settings.md +6 -6
  371. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  372. package/dist/agent-src/templates/contexts/knowledge-pages.md +2 -3
  373. package/dist/agent-src/templates/copilot-instructions.md +1 -1
  374. package/dist/agent-src/templates/roadmaps.md +1 -1
  375. package/dist/agent-src/templates/scripts/README.md +2 -2
  376. package/dist/agent-src/user-types/_template/user-type.md +1 -1
  377. package/dist/cli-delegate/check_update_banner.js +12 -1
  378. package/dist/cli-delegate/{chunk-NLP54U3J.js → chunk-2XY7ILBT.js} +13 -1
  379. package/dist/cli-delegate/{chunk-IAI3XL43.js → chunk-3FKR64R5.js} +22 -6
  380. package/dist/cli-delegate/{chunk-J3RFNKG4.js → chunk-55ACLDUE.js} +2 -2
  381. package/dist/cli-delegate/{chunk-PKOBQADP.js → chunk-57PN4GYJ.js} +1 -1
  382. package/dist/cli-delegate/{chunk-KCNTUSPI.js → chunk-AK6HODNQ.js} +4 -4
  383. package/dist/cli-delegate/{chunk-2FTMENJL.js → chunk-GYC3VRYN.js} +1 -1
  384. package/dist/cli-delegate/{chunk-LWTYTX6F.js → chunk-H32DGUJH.js} +15 -84
  385. package/dist/cli-delegate/{chunk-6RJA2F5A.js → chunk-IVBPRCQO.js} +1 -1
  386. package/dist/cli-delegate/chunk-NUHLI2RX.js +80 -0
  387. package/dist/cli-delegate/{chunk-TYSY33MD.js → chunk-QJWAUMJW.js} +12 -2
  388. package/dist/cli-delegate/{chunk-2KKXJW25.js → chunk-S3VFXMTM.js} +1 -1
  389. package/dist/cli-delegate/{chunk-I6RHFQEG.js → chunk-YUM5KURG.js} +17 -1
  390. package/dist/cli-delegate/cmd_analyze_session.js +1 -1
  391. package/dist/cli-delegate/cmd_brand_status.js +1 -1
  392. package/dist/cli-delegate/cmd_conformance.js +834 -275
  393. package/dist/cli-delegate/cmd_doctor.js +3 -3
  394. package/dist/cli-delegate/cmd_explain.js +5 -3
  395. package/dist/cli-delegate/cmd_export.js +4 -4
  396. package/dist/cli-delegate/cmd_handoff.js +6 -6
  397. package/dist/cli-delegate/cmd_mcp_available.js +1 -1
  398. package/dist/cli-delegate/cmd_memory_get.js +1 -1
  399. package/dist/cli-delegate/cmd_migrate.js +2 -2
  400. package/dist/cli-delegate/cmd_packs_active.js +3 -2
  401. package/dist/cli-delegate/cmd_prune.js +4 -4
  402. package/dist/cli-delegate/cmd_route_audit.js +3 -3
  403. package/dist/cli-delegate/cmd_route_explain.js +1 -1
  404. package/dist/cli-delegate/cmd_session_recycle.js +3 -3
  405. package/dist/cli-delegate/cmd_settings_get.js +15 -9
  406. package/dist/cli-delegate/cmd_settings_migrate.js +4 -4
  407. package/dist/cli-delegate/cmd_settings_set.js +54 -11
  408. package/dist/cli-delegate/cmd_sync.js +4 -4
  409. package/dist/cli-delegate/cmd_uninstall.js +4 -4
  410. package/dist/cli-delegate/cmd_update.js +1 -1
  411. package/dist/cli-delegate/cmd_upgrade.js +1 -1
  412. package/dist/cli-delegate/cmd_validate.js +4 -4
  413. package/dist/cli-delegate/cmd_versions.js +1 -1
  414. package/dist/discovery/deprecation-report.md +1 -1
  415. package/dist/discovery/discovery-manifest.json +25 -78
  416. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  417. package/dist/discovery/discovery-manifest.summary.md +3 -3
  418. package/dist/discovery/dormancy-report.md +1 -1
  419. package/dist/discovery/orphan-report.md +1 -1
  420. package/dist/discovery/packs.json +5 -7
  421. package/dist/discovery/trust-report.md +2 -2
  422. package/dist/discovery/workspaces.json +4 -6
  423. package/dist/hooks/dispatch.js +9684 -9304
  424. package/dist/install/install.mjs +36 -8
  425. package/dist/mcp/registry-manifest.json +3 -3
  426. package/dist/mcp/server.json +2 -2
  427. package/dist/mcp/server.mjs +2147 -1470
  428. package/dist/router.json +1 -1
  429. package/dist/scripts/_lib/agent_settings.js +73 -0
  430. package/dist/scripts/_lib/agent_src.js +20 -0
  431. package/dist/scripts/_lib/guidelines_lane.js +158 -0
  432. package/dist/scripts/_lib/installed_lock.js +1 -1
  433. package/dist/scripts/condense.js +2 -5
  434. package/dist/server/io/yamlIO.js +175 -17
  435. package/dist/server/schemas/settings.js +18 -4
  436. package/dist/shared/settingsSurface.js +6 -1
  437. package/docs/contracts/settings-classes.md +18 -9
  438. package/docs/guidelines/abstraction-thresholds.md +35 -0
  439. package/docs/guidelines/agent-infra/active-remediation-mechanics.md +3 -3
  440. package/docs/guidelines/agent-infra/false-green.md +2 -2
  441. package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
  442. package/docs/guidelines/agent-infra/skill-quality-checklist.md +1 -1
  443. package/docs/guidelines/design-fidelity-mechanics.md +4 -0
  444. package/docs/guidelines/design-fidelity-routing.md +78 -0
  445. package/docs/guidelines/design-reconciliation.md +172 -0
  446. package/docs/guidelines/gtm-handoff.md +2 -2
  447. package/docs/guidelines/wing4-handoff.md +2 -2
  448. package/package.json +7 -3
  449. package/src/config/agent-settings.template.yml +55 -8
  450. package/src/config/ci-local-parity.yml +34 -0
  451. package/src/config/continuity-surface.json +11 -32
  452. package/src/config/gate-coverage.yml +31 -8
  453. package/src/config/gate-reachability-exemptions.json +1 -0
  454. package/src/config/gate-violation-baselines.json +3 -3
  455. package/src/config/hook-token-budget.json +1 -1
  456. package/src/config/host-injection-effect.json +2 -2
  457. package/src/config/pack-size-budget.json +55 -4
  458. package/src/config/platform-anchor.json +47 -0
  459. package/src/config/preamble-payload-budget.json +12 -8
  460. package/src/config/preamble-payload-exceptions.json +28 -0
  461. package/src/config/publish-surface.json +4 -2
  462. package/src/config/ratification-policy.json +7 -0
  463. package/src/config/rule-stub-ceilings.json +16 -9
  464. package/src/scripts/_cli/cmd_settings_get.ts +22 -7
  465. package/src/scripts/_dispatch.bash +3 -1
  466. package/src/scripts/_lib/agent_settings.ts +85 -0
  467. package/src/scripts/_lib/agent_src.ts +21 -0
  468. package/src/scripts/_lib/artifact_maturity.ts +242 -0
  469. package/src/scripts/_lib/base_ref_payload.ts +315 -0
  470. package/src/scripts/_lib/conformance_report.ts +403 -0
  471. package/src/scripts/_lib/continuity_writer.ts +72 -13
  472. package/src/scripts/_lib/design_system_import.ts +20 -0
  473. package/src/scripts/_lib/design_tolerance.ts +281 -0
  474. package/src/scripts/_lib/dropped_decision.ts +142 -0
  475. package/src/scripts/_lib/guidelines_lane.ts +164 -0
  476. package/src/scripts/_lib/installed_lock.ts +1 -1
  477. package/src/scripts/_lib/measured_payload_ceiling.ts +424 -0
  478. package/src/scripts/_lib/obligation_frequency.ts +2 -3
  479. package/src/scripts/_lib/payload_catalogue_completeness.ts +211 -0
  480. package/src/scripts/_lib/platform_anchor.ts +1053 -0
  481. package/src/scripts/_lib/ratification_artifact.ts +278 -0
  482. package/src/scripts/_lib/release_findings_ingest.ts +324 -0
  483. package/src/scripts/_lib/release_tag_dispatch.ts +63 -0
  484. package/src/scripts/_lib/review_baseline.ts +254 -0
  485. package/src/scripts/_lib/review_skipped_record.ts +61 -1
  486. package/src/scripts/_lib/security_lint.ts +23 -2
  487. package/src/scripts/_lib/self_repair.ts +21 -0
  488. package/src/scripts/_lib/session_index_trust.ts +42 -1
  489. package/src/scripts/_lib/standing_bound_ratchet.ts +267 -88
  490. package/src/scripts/_lib/tolerance_shadow.ts +177 -0
  491. package/src/scripts/_lib/turn_end_refusals.ts +51 -4
  492. package/src/scripts/ai_council/redact_low_impact_entry.ts +8 -0
  493. package/src/scripts/autonomy_friction_traffic.ts +379 -0
  494. package/src/scripts/check_beta_review_markers.ts +35 -4
  495. package/src/scripts/check_finding_dispositions.ts +167 -16
  496. package/src/scripts/check_held_object_arrivals.ts +381 -0
  497. package/src/scripts/check_kernel_edit_ratified.ts +462 -0
  498. package/src/scripts/check_loss_class_declared.ts +793 -46
  499. package/src/scripts/check_platform_anchor.ts +390 -0
  500. package/src/scripts/check_preamble_payload_budget.ts +672 -107
  501. package/src/scripts/check_projected_rule_routes.ts +395 -0
  502. package/src/scripts/check_release_published.ts +1 -1
  503. package/src/scripts/check_reply_consistency.ts +86 -17
  504. package/src/scripts/code_graph/cli.ts +6 -0
  505. package/src/scripts/condense.ts +2 -6
  506. package/src/scripts/generate_host_cost_table.ts +354 -0
  507. package/src/scripts/hook_manifest.json +1 -1
  508. package/src/scripts/hook_manifest.yaml +74 -30
  509. package/src/scripts/hooks/block_kernel_rule_writes.ts +12 -2
  510. package/src/scripts/hooks/category_a.ts +1 -1
  511. package/src/scripts/hooks/chain_nudge_hook.ts +311 -25
  512. package/src/scripts/hooks/concern_registry.ts +2 -0
  513. package/src/scripts/hooks/end_review_nudge_hook.ts +101 -21
  514. package/src/scripts/hooks/review_baseline_hook.ts +130 -0
  515. package/src/scripts/hooks/session_eol_hook.ts +68 -154
  516. package/src/scripts/hooks/source_first_gate_hook.ts +12 -0
  517. package/src/scripts/hooks/turn_end_gate_hook.ts +232 -14
  518. package/src/scripts/hooks/ui_route_nudge_hook.ts +52 -15
  519. package/src/scripts/hooks_doctor.ts +4 -1
  520. package/src/scripts/hot_context_hook.ts +41 -401
  521. package/src/scripts/install.ts +1 -1
  522. package/src/scripts/interruption_report.ts +8 -2
  523. package/src/scripts/janitor.ts +8 -1
  524. package/src/scripts/lint_evidence_artifacts.ts +1 -0
  525. package/src/scripts/lint_knowledge_scale.ts +0 -26
  526. package/src/scripts/measure_turn_end_gate.ts +302 -5
  527. package/src/scripts/memory_lookup.ts +9 -9
  528. package/src/scripts/release.ts +52 -64
  529. package/src/scripts/release_drill.ts +193 -14
  530. package/src/scripts/release_env.ts +1 -1
  531. package/src/scripts/release_publication.ts +1 -1
  532. package/src/scripts/report_held_object_arrivals.ts +456 -0
  533. package/src/scripts/report_standing_payload_by_host.ts +7 -7
  534. package/src/scripts/session_memory_index.ts +5 -0
  535. package/src/scripts/sync_agent_settings.ts +394 -12
  536. package/src/server/io/yamlIO.ts +175 -17
  537. package/src/server/schemas/settings.ts +25 -5
  538. package/src/shared/settingsSurface.ts +13 -2
  539. package/src/templates/compact-instructions.md +8 -3
  540. package/dist/agent-src/commands/chat-history/import.md +0 -170
  541. package/dist/agent-src/commands/chat-history.md +0 -63
@@ -41,15 +41,21 @@ import * as path from 'node:path';
41
41
  import { read_lockfile } from './installed_lock.js';
42
42
 
43
43
  /**
44
- * The four detectors, in the order the gate runs them.
44
+ * The five detectors, in the order the gate runs them.
45
45
  *
46
46
  * The roadmap's § 0 names three (A promissory, B language, C verification).
47
47
  * That was true of the draft and is not true of the tree: detector D
48
- * (`completion`) landed under round 7 § Phase 1 and runs in the same detector
49
- * list as the other three. Counting three would silently drop a detector's
48
+ * (`completion`) landed under round 7 § Phase 1, detector E
49
+ * (`pending-decision`) under road-to-a-question-that-survives-the-turn, and
50
+ * detector F (`untested`) on 2026-09-11 — all of which run in the same detector
51
+ * list as the first three. Counting three would silently drop a detector's
50
52
  * refusals, so the set is read off `DetectorId` in the gate rather than off the
51
53
  * prose.
52
54
  *
55
+ * F is the one that asks whether a change is TESTED rather than whether
56
+ * something ran: C is satisfied by `eslint`, which is how a feature with zero
57
+ * test lines passed every guard in that file.
58
+ *
53
59
  * This said "the same UNCONDITIONAL list" until 2026-08-18, which was wrong and
54
60
  * is worth naming rather than quietly rewording: `main()` runs A and D only when
55
61
  * no subagent dispatch is open. It does not change this set — every detector
@@ -63,6 +69,8 @@ export const DETECTOR_IDS = [
63
69
  'language',
64
70
  'verification',
65
71
  'completion',
72
+ 'pending-decision',
73
+ 'untested',
66
74
  ] as const;
67
75
 
68
76
  export type RefusalDetectorId = (typeof DETECTOR_IDS)[number];
@@ -138,10 +146,39 @@ export interface RefusalRecord {
138
146
  counts?: Partial<DetectorCounts>;
139
147
  /** Package version recorded at the most recent refusal, when readable. */
140
148
  agent_config_version?: string;
149
+ /**
150
+ * The host's own id for the prompt being processed at the most recent
151
+ * refusal, when the payload carries one.
152
+ *
153
+ * Recorded BESIDE `refused_turn`, never instead of it. The ordinal stays the
154
+ * re-entrancy key — its drift history is why both guard layers exist, and
155
+ * swapping the key of a wedge-critical guard on an axis nothing measures is
156
+ * a behaviour change dressed as a correction. What the pair buys is the
157
+ * measurement: two refusals carrying the same `refused_prompt_id` and
158
+ * different `refused_turn` are one prompt whose ordinal drifted, which is
159
+ * the failure this file's own header describes and which the ordinal alone
160
+ * cannot distinguish from two genuine turns.
161
+ */
162
+ refused_prompt_id?: string;
141
163
  }
142
164
 
165
+ /**
166
+ * A zeroed counter per detector, DERIVED from `DETECTOR_IDS` rather than
167
+ * written out.
168
+ *
169
+ * It was an object literal of four keys until detector E landed, and the
170
+ * literal is what made adding a detector a silent arithmetic defect rather than
171
+ * a type error: `DetectorCounts` is `Record<RefusalDetectorId, number>`, the
172
+ * literal satisfied it for the union of the day, and a fifth id then read back
173
+ * as `undefined` — so every `+=` over it produced `NaN` and the whole rollup
174
+ * went quiet. The sibling test asserts that the id list and the gate's union
175
+ * agree; nothing asserted that the COUNTER covered the list, which is the half
176
+ * this construction removes the need to assert.
177
+ */
143
178
  export function emptyCounts(): DetectorCounts {
144
- return { promissory: 0, language: 0, verification: 0, completion: 0 };
179
+ const out = {} as DetectorCounts;
180
+ for (const id of DETECTOR_IDS) out[id] = 0;
181
+ return out;
145
182
  }
146
183
 
147
184
  function isDetector(v: unknown): v is RefusalDetectorId {
@@ -174,6 +211,9 @@ export function parseRecord(raw: string): RefusalRecord | null {
174
211
  if (typeof o['agent_config_version'] === 'string') {
175
212
  rec.agent_config_version = o['agent_config_version'];
176
213
  }
214
+ if (typeof o['refused_prompt_id'] === 'string') {
215
+ rec.refused_prompt_id = o['refused_prompt_id'];
216
+ }
177
217
  const counts = o['counts'];
178
218
  if (typeof counts === 'object' && counts !== null && !Array.isArray(counts)) {
179
219
  const parsed: Partial<DetectorCounts> = {};
@@ -231,6 +271,7 @@ export function foldRefusal(
231
271
  turnOrdinal: number;
232
272
  at: string;
233
273
  version?: string | undefined;
274
+ promptId?: string | undefined;
234
275
  },
235
276
  ): RefusalRecord {
236
277
  const counts = prev === null ? emptyCounts() : countsOf(prev);
@@ -247,6 +288,12 @@ export function foldRefusal(
247
288
  else if (prev?.agent_config_version !== undefined) {
248
289
  rec.agent_config_version = prev.agent_config_version;
249
290
  }
291
+ // Not inherited from `prev` when this refusal carries none: the field
292
+ // describes THIS refusal's prompt, and carrying a previous one forward would
293
+ // read as an identity the payload never supplied.
294
+ if (input.promptId !== undefined && input.promptId !== '') {
295
+ rec.refused_prompt_id = input.promptId;
296
+ }
250
297
  return rec;
251
298
  }
252
299
 
@@ -33,6 +33,14 @@
33
33
  * 7. Business-context SQL identifiers — caller-supplied table / column
34
34
  * allow-list. Default empty.
35
35
  * 8. Inline code excerpts > 40 chars — any backtick-fenced run > 40.
36
+ *
37
+ * loss_class: exact
38
+ *
39
+ * Named despite the module's name: the redactor never rewrites. It returns a
40
+ * {@link RedactionResult} verdict and the caller refuses, so no byte of the
41
+ * input is dropped or replaced here — "a rewritten secret is still a leaked
42
+ * secret". `exact` is the class that says nothing is lost, and it is what this
43
+ * module guarantees its callers.
36
44
  */
37
45
 
38
46
  import { _RAW_KEY_PREFIXES } from './config.js';
@@ -0,0 +1,379 @@
1
+ /**
2
+ * autonomy_friction_traffic — what share of REAL Bash traffic this package
3
+ * can spare a host confirmation, and what the rest is shaped like.
4
+ *
5
+ * WHY A SECOND FRICTION INSTRUMENT. `autonomy_friction_corpus` measures seven
6
+ * declared payload classes through the real dispatcher: it answers "does the
7
+ * classifier behave as designed" and it answers it exactly. What it cannot
8
+ * answer is "how much of what the agent actually types does the design
9
+ * cover", because a hand-written corpus contains the shapes its author
10
+ * thought of. That number turned out to be the one that mattered: measured
11
+ * over 7,569 distinct real Bash calls in 39 transcripts on 2026-09-10,
12
+ * category A covered 126 of them — 1.7 %.
13
+ *
14
+ * WHAT IT MEASURES, STATED NARROWLY. Three things, over a transcript store:
15
+ * the share of Bash calls that are category A (the calls this package hands
16
+ * the host an explicit `permissionDecision: allow` for); which disqualifier
17
+ * each remaining call hits FIRST; and how many carry one of the two shapes
18
+ * the chain-nudge concern flags. It is NOT a measurement of confirmations the
19
+ * operator saw. The host's own permission documentation records that
20
+ * `permissions.allow` does not bypass the auto-mode classifier, so a consumer
21
+ * whose settings already allow a call may see no prompt for a call counted
22
+ * here as uncovered, and a call inside category A may still be classified by
23
+ * the host. Reading this as host behaviour is the
24
+ * fact-about-our-plumbing-written-as-a-fact-about-the-host collapse the hook
25
+ * contract warns about three times.
26
+ *
27
+ * NOT A GATE. It has no baseline and fails nothing. A gate over this number
28
+ * would ratchet a figure that moves with how the operator happened to work
29
+ * that week, which is a measurement of the week and not of the tree. Exit 1
30
+ * means the store was unreadable or empty — a probe that reports zeros from
31
+ * an absent store is worse than one that refuses.
32
+ *
33
+ * SHARED DETECTORS, NOT A SECOND COPY. The avoidable-shape counts come from
34
+ * the concern's own exported `detectEditByShell` / `detectChaining`, and the
35
+ * metacharacter class is `category_a`'s own exported constant, so a change to
36
+ * either moves this report and the live carrier together. A private copy here
37
+ * would let the two drift and the report would then describe a carrier that
38
+ * does not exist — the first draft held exactly such a copy, and it computed
39
+ * the split the whole report turns on.
40
+ *
41
+ * WHAT MAKES A FIGURE FROM THIS PROBE COMPARABLE. Two properties, both of
42
+ * which the first draft lacked. Calls are deduplicated by tool-use id, because
43
+ * a resumed session rewrites its earlier turns into a new transcript and a
44
+ * window of files therefore counts them twice. And the running session's own
45
+ * transcript is excluded by default, because every call the probe itself makes
46
+ * lands in a file it is about to read — two runs minutes apart reported 7,518
47
+ * and 7,653 for the same tree before that. What remains uncontrolled is the
48
+ * window: `--limit 40` names the 40 most recent transcripts, and which files
49
+ * those are moves as new sessions appear. So pin the DATE with the figure and
50
+ * read a later run as measuring the window as well as the tree.
51
+ *
52
+ * Usage:
53
+ * ./scripts-run src/scripts/autonomy_friction_traffic [--store DIR] [--limit N] [--json]
54
+ * … [--include-current] include the running session's own transcript
55
+ */
56
+ import * as fs from "node:fs";
57
+ import * as os from "node:os";
58
+ import * as path from "node:path";
59
+ import process from "node:process";
60
+ import { fileURLToPath } from "node:url";
61
+
62
+ import { detectChaining, detectEditByShell } from "./hooks/chain_nudge_hook.js";
63
+ import {
64
+ isCategoryABashCommand,
65
+ namesConsequenceOperation,
66
+ SHELL_METACHARACTERS,
67
+ } from "./hooks/category_a.js";
68
+
69
+ // Re-exported so a test can assert this module refuses on the CLASSIFIER's
70
+ // metacharacter set rather than on a copy of it. The first draft held a private
71
+ // regex literal here while the header claimed shared detectors, and that copy
72
+ // computed the split the whole report turns on.
73
+ export { SHELL_METACHARACTERS };
74
+
75
+ /** How many transcripts to read when `--limit` is absent. */
76
+ const DEFAULT_LIMIT = 40;
77
+
78
+ /** One measured report. */
79
+ export interface TrafficReport {
80
+ store: string;
81
+ transcripts: number;
82
+ calls: number;
83
+ categoryA: number;
84
+ /** First disqualifier for each non-category-A call. */
85
+ disqualifiers: Record<string, number>;
86
+ /** Head token → count, for non-category-A calls only. */
87
+ heads: Record<string, number>;
88
+ /** The chain-nudge shape classes, counted over every call. */
89
+ shapes: { editByShell: number; chain: number };
90
+ /** Which write shapes, in the concern's own words. */
91
+ editShapes: Record<string, number>;
92
+ }
93
+
94
+ /** One Bash call, with the tool-use id that identifies it across files. */
95
+ export interface BashCall {
96
+ /** The host's `tool_use` id, or `""` when the record carries none. */
97
+ id: string;
98
+ command: string;
99
+ }
100
+
101
+ /**
102
+ * Every Bash call in one transcript's text.
103
+ *
104
+ * Line-delimited JSON, one record per line, so a malformed line is skipped
105
+ * rather than costing the file. The `"Bash"` pre-filter is a cheap reject: a
106
+ * transcript is megabytes and most lines carry no tool call at all.
107
+ *
108
+ * The id comes out with the command because a resumed session writes a new
109
+ * transcript carrying the earlier turns again — counting a window of files
110
+ * therefore counts some calls twice, and the id is what tells the copies apart
111
+ * from two genuinely identical commands.
112
+ */
113
+ export function extractCommands(text: string): BashCall[] {
114
+ const out: BashCall[] = [];
115
+ for (const line of text.split("\n")) {
116
+ if (!line.includes('"Bash"')) continue;
117
+ let rec: unknown;
118
+ try {
119
+ rec = JSON.parse(line) as unknown;
120
+ } catch {
121
+ continue;
122
+ }
123
+ const content = (rec as { message?: { content?: unknown } })?.message?.content;
124
+ if (!Array.isArray(content)) continue;
125
+ for (const block of content) {
126
+ const b = block as { type?: unknown; name?: unknown; id?: unknown; input?: { command?: unknown } };
127
+ if (b?.type !== "tool_use" || b?.name !== "Bash") continue;
128
+ if (typeof b.input?.command !== "string") continue;
129
+ out.push({ id: typeof b.id === "string" ? b.id : "", command: b.input.command });
130
+ }
131
+ }
132
+ return out;
133
+ }
134
+
135
+ /**
136
+ * The distinct calls in `calls`, keyed by tool-use id.
137
+ *
138
+ * A call with no id cannot be deduplicated and is kept — dropping it would
139
+ * silently shrink the denominator, and an over-count biases the report toward
140
+ * looking worse than it is, which is the safe direction for a friction figure.
141
+ */
142
+ export function dedupeCalls(calls: readonly BashCall[]): string[] {
143
+ const seen = new Set<string>();
144
+ const out: string[] = [];
145
+ for (const call of calls) {
146
+ if (call.id) {
147
+ if (seen.has(call.id)) continue;
148
+ seen.add(call.id);
149
+ }
150
+ out.push(call.command);
151
+ }
152
+ return out;
153
+ }
154
+
155
+ /**
156
+ * The transcript of the session running this probe, if the host names one.
157
+ *
158
+ * Excluded by default. A probe whose window includes its own session measures
159
+ * the measurement: every call this run makes lands in the file it is reading,
160
+ * so two runs minutes apart report different totals for the same tree and the
161
+ * figure cannot be pinned. `--include-current` opts back in.
162
+ */
163
+ export function currentSessionTranscript(store: string): string | null {
164
+ const id = process.env["CLAUDE_CODE_SESSION_ID"];
165
+ return id ? path.join(store, `${id}.jsonl`) : null;
166
+ }
167
+
168
+ /** The head token of a command, lower-cased, or `""`. */
169
+ export function headToken(command: string): string {
170
+ return (command.trim().split(/\s+/)[0] ?? "").toLowerCase();
171
+ }
172
+
173
+ /**
174
+ * Why this call is not category A, in one word.
175
+ *
176
+ * Only the FIRST disqualifier is reported, because that is the one a change
177
+ * would have to remove: a chained command whose head is also unlisted stays
178
+ * uncovered if only the head is added.
179
+ *
180
+ * The buckets mirror `category_a`'s own order of refusal, including the
181
+ * consequence-word check — without it `git push origin main` and `gh pr merge`
182
+ * landed in the head bucket, and a report saying "N fail on the head token"
183
+ * then counted operations that would be refused whatever the head list said.
184
+ *
185
+ * The last bucket is still an UPPER BOUND rather than an exact head count: a
186
+ * simple command can also be refused for a directory flag whose value escapes
187
+ * the working tree, and that case is not separable from here without
188
+ * reimplementing the argv walk. Read it as "refused after the shape and the
189
+ * operation were cleared", and never as "adding this head would cover it".
190
+ */
191
+ export function firstDisqualifier(command: string): string {
192
+ if (!command.trim()) return "empty-command";
193
+ if (SHELL_METACHARACTERS.test(command)) return "shell-metacharacter";
194
+ if (namesConsequenceOperation(command)) return "names-a-consequence-operation";
195
+ return "not-an-allowlisted-operation";
196
+ }
197
+
198
+ /** Classify a command set. Pure — the caller supplies the strings. */
199
+ export function classify(store: string, transcripts: number, commands: readonly string[]): TrafficReport {
200
+ const report: TrafficReport = {
201
+ store,
202
+ transcripts,
203
+ calls: commands.length,
204
+ categoryA: 0,
205
+ disqualifiers: {},
206
+ heads: {},
207
+ shapes: { editByShell: 0, chain: 0 },
208
+ editShapes: {},
209
+ };
210
+ for (const command of commands) {
211
+ const write = detectEditByShell(command);
212
+ if (write) {
213
+ report.shapes.editByShell += 1;
214
+ report.editShapes[write] = (report.editShapes[write] ?? 0) + 1;
215
+ } else if (detectChaining(command)) {
216
+ report.shapes.chain += 1;
217
+ }
218
+ if (isCategoryABashCommand(command)) {
219
+ report.categoryA += 1;
220
+ continue;
221
+ }
222
+ const why = firstDisqualifier(command);
223
+ report.disqualifiers[why] = (report.disqualifiers[why] ?? 0) + 1;
224
+ const head = headToken(command);
225
+ report.heads[head] = (report.heads[head] ?? 0) + 1;
226
+ }
227
+ return report;
228
+ }
229
+
230
+ /** The default transcript store for the checkout this file lives in. */
231
+ export function defaultStore(repoRoot: string): string {
232
+ const slug = repoRoot.replace(/\//g, "-");
233
+ return path.join(os.homedir(), ".claude", "projects", slug);
234
+ }
235
+
236
+ /** The `--limit` most recently modified transcripts in `store`. */
237
+ export function transcriptPaths(store: string, limit: number): string[] {
238
+ let names: string[];
239
+ try {
240
+ names = fs.readdirSync(store);
241
+ } catch {
242
+ return [];
243
+ }
244
+ return names
245
+ .filter((n) => n.endsWith(".jsonl"))
246
+ .map((n) => path.join(store, n))
247
+ .map((p) => {
248
+ try {
249
+ return { p, m: fs.statSync(p).mtimeMs };
250
+ } catch {
251
+ return { p, m: 0 };
252
+ }
253
+ })
254
+ .sort((a, b) => b.m - a.m)
255
+ .slice(0, limit)
256
+ .map((x) => x.p);
257
+ }
258
+
259
+ /** Top `n` entries of a histogram, descending. */
260
+ function top(hist: Record<string, number>, n: number): Array<[string, number]> {
261
+ return Object.entries(hist)
262
+ .sort((a, b) => b[1] - a[1])
263
+ .slice(0, n);
264
+ }
265
+
266
+ function pct(part: number, whole: number): string {
267
+ return whole === 0 ? "n/a" : `${((part / whole) * 100).toFixed(1)} %`;
268
+ }
269
+
270
+ export function render(r: TrafficReport): string {
271
+ const lines: string[] = [];
272
+ lines.push("autonomy_friction_traffic — category-A coverage over real Bash traffic\n");
273
+ lines.push(` store ${r.store}`);
274
+ lines.push(` transcripts ${r.transcripts}`);
275
+ lines.push(` Bash calls ${r.calls}\n`);
276
+ lines.push(` category A (this package hands the host an allow) ${r.categoryA} (${pct(r.categoryA, r.calls)})`);
277
+ lines.push(` no allow emitted ${r.calls - r.categoryA} (${pct(r.calls - r.categoryA, r.calls)})\n`);
278
+ lines.push(" first disqualifier:");
279
+ for (const [k, v] of top(r.disqualifiers, 10)) lines.push(` ${String(v).padStart(6)} ${k}`);
280
+ lines.push("\n top head tokens among the uncovered:");
281
+ for (const [k, v] of top(r.heads, 15)) lines.push(` ${String(v).padStart(6)} ${k}`);
282
+ lines.push("\n chain-nudge shape classes (counted over every call):");
283
+ lines.push(` ${String(r.shapes.editByShell).padStart(6)} edit-by-shell (${pct(r.shapes.editByShell, r.calls)})`);
284
+ lines.push(` ${String(r.shapes.chain).padStart(6)} chain (${pct(r.shapes.chain, r.calls)})`);
285
+ for (const [k, v] of top(r.editShapes, 6)) lines.push(` ${String(v).padStart(4)} ${k}`);
286
+ lines.push("\n Not a gate: no baseline, fails nothing. See this file's header for what");
287
+ lines.push(" the number does and does not say about what the operator was prompted for.\n");
288
+ return `${lines.join("\n")}\n`;
289
+ }
290
+
291
+ /**
292
+ * The value of `flag`, `undefined` when the flag is absent, `null` when it is
293
+ * present with no value.
294
+ *
295
+ * The three states are distinct because the caller must refuse the third. A
296
+ * valueless `--store` used to collapse into "absent" and fall back to the
297
+ * default store silently, which is the same class of defect as the `--limit`
298
+ * coercion beside it: an argument that silently changes the window.
299
+ */
300
+ function argValue(argv: readonly string[], flag: string): string | null | undefined {
301
+ const i = argv.indexOf(flag);
302
+ if (i === -1) return undefined;
303
+ const value = argv[i + 1];
304
+ return value === undefined || value.startsWith("--") ? null : value;
305
+ }
306
+
307
+ export function main(argv: string[] = process.argv.slice(2)): number {
308
+ if (argv.includes("--help") || argv.includes("-h")) {
309
+ process.stdout.write(
310
+ "usage: autonomy_friction_traffic [--store DIR] [--limit N] [--json] [--include-current]\n" +
311
+ " Category-A coverage over the Bash calls in a transcript store,\n" +
312
+ " plus the shape classes the chain-nudge concern flags. Calls are\n" +
313
+ " deduplicated by tool-use id and the running session's own\n" +
314
+ " transcript is excluded unless --include-current is passed.\n" +
315
+ " Exit 1 when the store is unreadable or holds no Bash call.\n",
316
+ );
317
+ return 0;
318
+ }
319
+ const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..");
320
+ const storeArg = argValue(argv, "--store");
321
+ if (storeArg === null) {
322
+ process.stderr.write("autonomy_friction_traffic: --store needs a directory\n");
323
+ return 1;
324
+ }
325
+ const store = storeArg ?? defaultStore(repoRoot);
326
+ const limitRaw = argValue(argv, "--limit");
327
+ let limit = DEFAULT_LIMIT;
328
+ if (limitRaw !== undefined) {
329
+ const parsed = limitRaw === null ? NaN : Number(limitRaw);
330
+ // Validated rather than coerced: `--limit -5` silently dropped the
331
+ // five OLDEST transcripts through `Array.slice`, `--limit 0` reported
332
+ // an empty store as the reason, and a typo fell back to 40 without
333
+ // saying so. A window is the report's denominator; a wrong one is a
334
+ // wrong measurement wearing the right shape.
335
+ if (!Number.isInteger(parsed) || parsed < 1) {
336
+ process.stderr.write(`autonomy_friction_traffic: --limit must be a positive integer, got ${limitRaw ?? "no value"}\n`);
337
+ return 1;
338
+ }
339
+ limit = parsed;
340
+ }
341
+
342
+ const current = argv.includes("--include-current") ? null : currentSessionTranscript(store);
343
+ const paths = transcriptPaths(store, limit).filter((p) => p !== current);
344
+ const calls: BashCall[] = [];
345
+ for (const p of paths) {
346
+ let text: string;
347
+ try {
348
+ text = fs.readFileSync(p, "utf8");
349
+ } catch {
350
+ continue;
351
+ }
352
+ calls.push(...extractCommands(text));
353
+ }
354
+ const commands = dedupeCalls(calls);
355
+ if (commands.length === 0) {
356
+ process.stderr.write(
357
+ `autonomy_friction_traffic: no Bash call found under ${store} ` +
358
+ `(${paths.length} transcript(s) read) — nothing measured\n`,
359
+ );
360
+ return 1;
361
+ }
362
+ const report = classify(store, paths.length, commands);
363
+ process.stdout.write(argv.includes("--json") ? `${JSON.stringify(report, null, 2)}\n` : render(report));
364
+ return 0;
365
+ }
366
+
367
+ function _isCliEntry(): boolean {
368
+ const argv1 = process.argv[1];
369
+ if (argv1 === undefined) return false;
370
+ try {
371
+ return fs.realpathSync(argv1) === fs.realpathSync(fileURLToPath(import.meta.url));
372
+ } catch {
373
+ return false;
374
+ }
375
+ }
376
+
377
+ if (_isCliEntry()) {
378
+ process.exit(main());
379
+ }
@@ -42,6 +42,12 @@ const KEEP_RE = /^keep-beta-until:\s*(\d{4}-\d{2}-\d{2})\s*$/m;
42
42
  * - a lapsed contract **in** the baseline -> warning (inherited debt)
43
43
  * - a lapsed contract **not** in it -> ERROR (a fresh lapse, today)
44
44
  *
45
+ * SUPERSEDED 2026-09-11 on the second line: a fresh lapse is a warning too, and
46
+ * the reason is at {@link LAPSED_SEVERITY_FRESH}. The council's choice of a
47
+ * ratchet over a flat error stands as the record of what was decided then; what
48
+ * changed is the owner's ruling that no date may red CI by itself. The baseline
49
+ * therefore labels rather than gates.
50
+ *
45
51
  * So new work is enforced immediately while the 86-contract cohort does not red
46
52
  * an arbitrary future PR whose author caused none of it. The cohort is real:
47
53
  * 44 of the 86 lapsed on the same day and 64 within four days, which is one past
@@ -116,7 +122,31 @@ export function _resetLapsedBaseline(): void {
116
122
  * whether this becomes an error is that roadmap's step 0.2 and is not taken here.
117
123
  */
118
124
  const LAPSED_SEVERITY_IN_BASELINE: 'error' | 'warning' = 'warning';
119
- const LAPSED_SEVERITY_FRESH: 'error' | 'warning' = 'error';
125
+ /**
126
+ * A fresh lapse is a WARNING since 2026-09-11, by owner decision.
127
+ *
128
+ * It was an error, and the error said: this contract must still be beta,
129
+ * because a date passed. That is the one thing a date cannot establish.
130
+ * Stability is decided on observable criteria — active enforcement, consumer
131
+ * reliance, no known pending incompatible change — and none of them contains an
132
+ * elapsed-time term. `keep-beta-until` SCHEDULES A REVIEW. It does not prohibit
133
+ * promotion before that date, does not require continued beta after it, and
134
+ * must not turn CI red on its own.
135
+ *
136
+ * What this gate still errors on is unchanged and is the part that was never
137
+ * about time: a beta contract declaring NO disposition at all, one declaring
138
+ * two, and a window set further out than the maximum — a contract that says
139
+ * nothing about its own maturity, or parks the question indefinitely. Those are
140
+ * statements about missing or contradictory evidence, which CI may absolutely
141
+ * refuse. "The window expired" is not one of them.
142
+ *
143
+ * The inherited/fresh distinction stays in the REPORT because it still tells a
144
+ * reader which lapses are cohort debt and which arrived since. It no longer
145
+ * gates anything, so the frozen baseline is now a label rather than a ratchet;
146
+ * retiring it is the remaining step, recorded in
147
+ * `stubs/road-to-evidence-driven-stability.md`.
148
+ */
149
+ const LAPSED_SEVERITY_FRESH: 'error' | 'warning' = 'warning';
120
150
  const SUPERSEDED_RE = /^superseded-by:\s*\S+\s*$/m;
121
151
 
122
152
  const MAX_REVIEW_WINDOW_DAYS = 90;
@@ -569,9 +599,10 @@ function main(): number {
569
599
  }
570
600
  if (upcoming.length > 0) {
571
601
  process.stdout.write(
572
- `\nUpcoming FRESH lapses within ${String(args.horizon)} day(s) — advisory, ` +
573
- 'exit code unchanged. These are absent from the frozen baseline, so each\n' +
574
- 'becomes an ERROR on its date rather than an inherited warning:\n',
602
+ `\nReviews falling due within ${String(args.horizon)} day(s) — advisory, ` +
603
+ 'exit code unchanged, and it stays unchanged when the date passes:\n' +
604
+ 'the window schedules a maturity DECISION, it does not require continued\n' +
605
+ 'beta and it never reds CI on its own. Evidence decides; the date only asks:\n',
575
606
  );
576
607
  for (const u of upcoming) {
577
608
  process.stdout.write(