@event4u/agent-config 14.23.0 → 15.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 (503) 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 +198 -0
  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 +1 -1
  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 +1 -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/skills/activation-design/SKILL.md +2 -2
  249. package/dist/agent-src/skills/adr-create/SKILL.md +5 -5
  250. package/dist/agent-src/skills/ai-council/SKILL.md +1 -1
  251. package/dist/agent-src/skills/ai-council/references/advanced-modes.md +1 -1
  252. package/dist/agent-src/skills/blade-ui/SKILL.md +1 -1
  253. package/dist/agent-src/skills/blast-radius-analyzer/SKILL.md +1 -1
  254. package/dist/agent-src/skills/brand-to-tokens/SKILL.md +24 -3
  255. package/dist/agent-src/skills/bug-analyzer/SKILL.md +1 -1
  256. package/dist/agent-src/skills/build-buy-partner/SKILL.md +1 -1
  257. package/dist/agent-src/skills/churn-prevention/SKILL.md +2 -2
  258. package/dist/agent-src/skills/code-refactoring/SKILL.md +3 -3
  259. package/dist/agent-src/skills/code-review/SKILL.md +3 -3
  260. package/dist/agent-src/skills/command-writing/SKILL.md +3 -3
  261. package/dist/agent-src/skills/comp-banding/SKILL.md +1 -1
  262. package/dist/agent-src/skills/competitive-moat-analysis/SKILL.md +1 -1
  263. package/dist/agent-src/skills/competitive-positioning/SKILL.md +2 -2
  264. package/dist/agent-src/skills/complexity-first-planning/SKILL.md +1 -1
  265. package/dist/agent-src/skills/condense-memory/SKILL.md +1 -1
  266. package/dist/agent-src/skills/content-funnel-design/SKILL.md +2 -2
  267. package/dist/agent-src/skills/contracts-cognition/SKILL.md +1 -1
  268. package/dist/agent-src/skills/copilot-agents-optimization/SKILL.md +2 -2
  269. package/dist/agent-src/skills/corpus-grounding/SKILL.md +2 -2
  270. package/dist/agent-src/skills/customer-research/SKILL.md +2 -2
  271. package/dist/agent-src/skills/dashboard-design/SKILL.md +1 -1
  272. package/dist/agent-src/skills/data-handling-judgment/SKILL.md +1 -1
  273. package/dist/agent-src/skills/deal-qualification-meddic/SKILL.md +2 -2
  274. package/dist/agent-src/skills/decision-record/SKILL.md +3 -3
  275. package/dist/agent-src/skills/decision-review/SKILL.md +8 -8
  276. package/dist/agent-src/skills/deep-reading-analyst/SKILL.md +22 -22
  277. package/dist/agent-src/skills/design-intelligence/SKILL.md +4 -4
  278. package/dist/agent-src/skills/design-intelligence/references/context-and-registers.md +2 -2
  279. package/dist/agent-src/skills/design-review/SKILL.md +4 -4
  280. package/dist/agent-src/skills/design-system-capture/references/design-system-json.md +20 -1
  281. package/dist/agent-src/skills/design-tokens/SKILL.md +17 -2
  282. package/dist/agent-src/skills/design-variations/SKILL.md +2 -2
  283. package/dist/agent-src/skills/developer-like-execution/SKILL.md +2 -2
  284. package/dist/agent-src/skills/discovery-interview/SKILL.md +2 -2
  285. package/dist/agent-src/skills/doc-coauthoring/SKILL.md +3 -3
  286. package/dist/agent-src/skills/editorial-calendar/SKILL.md +2 -2
  287. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +44 -1
  288. package/dist/agent-src/skills/existing-ui-audit/references/anti-slop-cross-reference.md +2 -2
  289. package/dist/agent-src/skills/expansion-playbook/SKILL.md +2 -2
  290. package/dist/agent-src/skills/experiment-loop/SKILL.md +1 -1
  291. package/dist/agent-src/skills/experiment-loop/references/protocol.md +1 -1
  292. package/dist/agent-src/skills/fe-design/SKILL.md +3 -3
  293. package/dist/agent-src/skills/fe-design/references/design-patterns.md +1 -1
  294. package/dist/agent-src/skills/fe-design/references/design-read-and-memory.md +3 -3
  295. package/dist/agent-src/skills/fe-design/references/source-led-port.md +1 -1
  296. package/dist/agent-src/skills/feature-planning/SKILL.md +1 -1
  297. package/dist/agent-src/skills/flux/SKILL.md +1 -1
  298. package/dist/agent-src/skills/forecast-accuracy/SKILL.md +2 -2
  299. package/dist/agent-src/skills/forecasting/SKILL.md +2 -2
  300. package/dist/agent-src/skills/fundraising-narrative/SKILL.md +2 -2
  301. package/dist/agent-src/skills/funnel-analysis/SKILL.md +2 -2
  302. package/dist/agent-src/skills/gtm-launch/SKILL.md +2 -2
  303. package/dist/agent-src/skills/hiring-loop-design/SKILL.md +1 -1
  304. package/dist/agent-src/skills/html-deck/SKILL.md +5 -5
  305. package/dist/agent-src/skills/humanizer/SKILL.md +1 -1
  306. package/dist/agent-src/skills/humanizer/data/patterns.md +1 -1
  307. package/dist/agent-src/skills/iconography/SKILL.md +3 -3
  308. package/dist/agent-src/skills/judge-synthesis/SKILL.md +1 -1
  309. package/dist/agent-src/skills/laravel-api-endpoint/SKILL.md +2 -2
  310. package/dist/agent-src/skills/launch-readiness/SKILL.md +3 -3
  311. package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +6 -6
  312. package/dist/agent-src/skills/livewire/SKILL.md +1 -1
  313. package/dist/agent-src/skills/market-entry-analysis/SKILL.md +1 -1
  314. package/dist/agent-src/skills/mcp-builder/SKILL.md +1 -1
  315. package/dist/agent-src/skills/memory-consolidation/SKILL.md +3 -3
  316. package/dist/agent-src/skills/messaging-architecture/SKILL.md +2 -2
  317. package/dist/agent-src/skills/monorepo-workspace/SKILL.md +1 -1
  318. package/dist/agent-src/skills/onboarding-design/SKILL.md +2 -2
  319. package/dist/agent-src/skills/onboarding-program/SKILL.md +1 -1
  320. package/dist/agent-src/skills/one-on-one-cadence/SKILL.md +1 -1
  321. package/dist/agent-src/skills/org-design/SKILL.md +1 -1
  322. package/dist/agent-src/skills/overbuild-review-lens/SKILL.md +3 -3
  323. package/dist/agent-src/skills/override-management/SKILL.md +1 -1
  324. package/dist/agent-src/skills/perf-feedback-craft/SKILL.md +1 -1
  325. package/dist/agent-src/skills/persona-writing/SKILL.md +1 -1
  326. package/dist/agent-src/skills/php-coder/SKILL.md +1 -1
  327. package/dist/agent-src/skills/pipeline-strategy/SKILL.md +2 -2
  328. package/dist/agent-src/skills/playwright-testing/SKILL.md +3 -3
  329. package/dist/agent-src/skills/po-discovery/SKILL.md +1 -1
  330. package/dist/agent-src/skills/positioning-strategy/SKILL.md +2 -2
  331. package/dist/agent-src/skills/privacy-review/SKILL.md +1 -1
  332. package/dist/agent-src/skills/prompt-optimizer/SKILL.md +3 -3
  333. package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +1 -1
  334. package/dist/agent-src/skills/reasoning-orchestrator/SKILL.md +2 -2
  335. package/dist/agent-src/skills/receiving-code-review/SKILL.md +1 -1
  336. package/dist/agent-src/skills/refine-ticket/SKILL.md +2 -2
  337. package/dist/agent-src/skills/release-comms/SKILL.md +2 -2
  338. package/dist/agent-src/skills/retention-loops/SKILL.md +2 -2
  339. package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
  340. package/dist/agent-src/skills/roadmap-management/SKILL.md +1 -1
  341. package/dist/agent-src/skills/roadmap-management/references/archival.md +1 -1
  342. package/dist/agent-src/skills/roadmap-writing/SKILL.md +5 -5
  343. package/dist/agent-src/skills/rule-writing/SKILL.md +6 -6
  344. package/dist/agent-src/skills/runway-cognition/SKILL.md +2 -2
  345. package/dist/agent-src/skills/scenario-modeling/SKILL.md +2 -2
  346. package/dist/agent-src/skills/skill-writing/SKILL.md +2 -2
  347. package/dist/agent-src/skills/skill-writing/references/procedure.md +1 -1
  348. package/dist/agent-src/skills/skill-writing/references/section-patterns.md +3 -3
  349. package/dist/agent-src/skills/spreadsheet-authoring/SKILL.md +1 -1
  350. package/dist/agent-src/skills/stakeholder-tradeoff/SKILL.md +3 -3
  351. package/dist/agent-src/skills/subagent-orchestration/SKILL.md +1 -1
  352. package/dist/agent-src/skills/supply-chain-intake/SKILL.md +1 -1
  353. package/dist/agent-src/skills/systematic-debugging/SKILL.md +2 -2
  354. package/dist/agent-src/skills/tailwind-engineer/SKILL.md +11 -5
  355. package/dist/agent-src/skills/throughput-vs-morale-tradeoff/SKILL.md +1 -1
  356. package/dist/agent-src/skills/token-optimizer/SKILL.md +1 -1
  357. package/dist/agent-src/skills/typography-system/SKILL.md +2 -2
  358. package/dist/agent-src/skills/ui-component-architect/SKILL.md +28 -8
  359. package/dist/agent-src/skills/unit-economics-modeling/SKILL.md +2 -2
  360. package/dist/agent-src/skills/upstream-contribute/SKILL.md +1 -1
  361. package/dist/agent-src/skills/validate-feature-fit/SKILL.md +2 -2
  362. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +2 -2
  363. package/dist/agent-src/skills/vision-articulation/SKILL.md +1 -1
  364. package/dist/agent-src/skills/voc-extract/SKILL.md +2 -2
  365. package/dist/agent-src/skills/voice-and-tone-design/SKILL.md +2 -2
  366. package/dist/agent-src/skills/wireframe/SKILL.md +1 -1
  367. package/dist/agent-src/skills/workspace-link/SKILL.md +1 -1
  368. package/dist/agent-src/templates/agent-settings.md +6 -6
  369. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  370. package/dist/agent-src/templates/contexts/knowledge-pages.md +2 -3
  371. package/dist/agent-src/templates/copilot-instructions.md +1 -1
  372. package/dist/agent-src/templates/roadmaps.md +1 -1
  373. package/dist/agent-src/templates/scripts/README.md +2 -2
  374. package/dist/agent-src/user-types/_template/user-type.md +1 -1
  375. package/dist/cli-delegate/check_update_banner.js +12 -1
  376. package/dist/cli-delegate/{chunk-NLP54U3J.js → chunk-2XY7ILBT.js} +13 -1
  377. package/dist/cli-delegate/{chunk-IAI3XL43.js → chunk-3FKR64R5.js} +22 -6
  378. package/dist/cli-delegate/{chunk-J3RFNKG4.js → chunk-55ACLDUE.js} +2 -2
  379. package/dist/cli-delegate/{chunk-PKOBQADP.js → chunk-57PN4GYJ.js} +1 -1
  380. package/dist/cli-delegate/{chunk-KCNTUSPI.js → chunk-AK6HODNQ.js} +4 -4
  381. package/dist/cli-delegate/{chunk-2FTMENJL.js → chunk-GYC3VRYN.js} +1 -1
  382. package/dist/cli-delegate/{chunk-LWTYTX6F.js → chunk-HZ52BRGG.js} +24 -18
  383. package/dist/cli-delegate/{chunk-6RJA2F5A.js → chunk-IVBPRCQO.js} +1 -1
  384. package/dist/cli-delegate/{chunk-I6RHFQEG.js → chunk-YUM5KURG.js} +17 -1
  385. package/dist/cli-delegate/cmd_analyze_session.js +1 -1
  386. package/dist/cli-delegate/cmd_brand_status.js +1 -1
  387. package/dist/cli-delegate/cmd_conformance.js +3 -3
  388. package/dist/cli-delegate/cmd_doctor.js +3 -3
  389. package/dist/cli-delegate/cmd_explain.js +2 -2
  390. package/dist/cli-delegate/cmd_export.js +4 -4
  391. package/dist/cli-delegate/cmd_handoff.js +4 -4
  392. package/dist/cli-delegate/cmd_mcp_available.js +1 -1
  393. package/dist/cli-delegate/cmd_memory_get.js +1 -1
  394. package/dist/cli-delegate/cmd_migrate.js +2 -2
  395. package/dist/cli-delegate/cmd_packs_active.js +2 -2
  396. package/dist/cli-delegate/cmd_prune.js +4 -4
  397. package/dist/cli-delegate/cmd_route_audit.js +3 -3
  398. package/dist/cli-delegate/cmd_route_explain.js +1 -1
  399. package/dist/cli-delegate/cmd_session_recycle.js +1 -1
  400. package/dist/cli-delegate/cmd_settings_get.js +15 -9
  401. package/dist/cli-delegate/cmd_settings_migrate.js +4 -4
  402. package/dist/cli-delegate/cmd_settings_set.js +41 -11
  403. package/dist/cli-delegate/cmd_sync.js +4 -4
  404. package/dist/cli-delegate/cmd_uninstall.js +4 -4
  405. package/dist/cli-delegate/cmd_update.js +1 -1
  406. package/dist/cli-delegate/cmd_upgrade.js +1 -1
  407. package/dist/cli-delegate/cmd_validate.js +4 -4
  408. package/dist/cli-delegate/cmd_versions.js +1 -1
  409. package/dist/discovery/deprecation-report.md +1 -1
  410. package/dist/discovery/discovery-manifest.json +22 -75
  411. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  412. package/dist/discovery/discovery-manifest.summary.md +3 -3
  413. package/dist/discovery/dormancy-report.md +1 -1
  414. package/dist/discovery/orphan-report.md +1 -1
  415. package/dist/discovery/packs.json +5 -7
  416. package/dist/discovery/trust-report.md +2 -2
  417. package/dist/discovery/workspaces.json +4 -6
  418. package/dist/hooks/dispatch.js +8607 -8930
  419. package/dist/install/install.mjs +35 -8
  420. package/dist/mcp/registry-manifest.json +3 -3
  421. package/dist/mcp/server.json +2 -2
  422. package/dist/mcp/server.mjs +1433 -1342
  423. package/dist/router.json +1 -1
  424. package/dist/scripts/_lib/agent_settings.js +73 -0
  425. package/dist/scripts/_lib/agent_src.js +20 -0
  426. package/dist/scripts/_lib/guidelines_lane.js +158 -0
  427. package/dist/scripts/condense.js +2 -5
  428. package/dist/server/io/yamlIO.js +125 -17
  429. package/dist/server/schemas/settings.js +18 -4
  430. package/dist/shared/settingsSurface.js +6 -1
  431. package/docs/contracts/settings-classes.md +18 -9
  432. package/docs/guidelines/abstraction-thresholds.md +35 -0
  433. package/docs/guidelines/agent-infra/active-remediation-mechanics.md +3 -3
  434. package/docs/guidelines/agent-infra/false-green.md +2 -2
  435. package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
  436. package/docs/guidelines/agent-infra/skill-quality-checklist.md +1 -1
  437. package/docs/guidelines/design-fidelity-mechanics.md +4 -0
  438. package/docs/guidelines/design-fidelity-routing.md +78 -0
  439. package/docs/guidelines/design-reconciliation.md +172 -0
  440. package/docs/guidelines/gtm-handoff.md +2 -2
  441. package/docs/guidelines/wing4-handoff.md +2 -2
  442. package/package.json +7 -3
  443. package/src/config/agent-settings.template.yml +55 -8
  444. package/src/config/ci-local-parity.yml +34 -0
  445. package/src/config/continuity-surface.json +4 -32
  446. package/src/config/gate-coverage.yml +31 -8
  447. package/src/config/gate-reachability-exemptions.json +1 -0
  448. package/src/config/gate-violation-baselines.json +3 -3
  449. package/src/config/hook-token-budget.json +1 -1
  450. package/src/config/host-injection-effect.json +2 -2
  451. package/src/config/pack-size-budget.json +55 -4
  452. package/src/config/platform-anchor.json +47 -0
  453. package/src/config/preamble-payload-budget.json +2 -3
  454. package/src/config/publish-surface.json +4 -2
  455. package/src/config/ratification-policy.json +7 -0
  456. package/src/config/rule-stub-ceilings.json +16 -9
  457. package/src/scripts/_cli/cmd_settings_get.ts +22 -7
  458. package/src/scripts/_lib/agent_settings.ts +85 -0
  459. package/src/scripts/_lib/agent_src.ts +21 -0
  460. package/src/scripts/_lib/artifact_maturity.ts +242 -0
  461. package/src/scripts/_lib/conformance_report.ts +403 -0
  462. package/src/scripts/_lib/continuity_writer.ts +72 -13
  463. package/src/scripts/_lib/design_system_import.ts +20 -0
  464. package/src/scripts/_lib/design_tolerance.ts +281 -0
  465. package/src/scripts/_lib/guidelines_lane.ts +164 -0
  466. package/src/scripts/_lib/obligation_frequency.ts +2 -3
  467. package/src/scripts/_lib/platform_anchor.ts +1053 -0
  468. package/src/scripts/_lib/ratification_artifact.ts +278 -0
  469. package/src/scripts/_lib/security_lint.ts +23 -2
  470. package/src/scripts/_lib/self_repair.ts +21 -0
  471. package/src/scripts/_lib/session_index_trust.ts +42 -1
  472. package/src/scripts/_lib/standing_bound_ratchet.ts +103 -37
  473. package/src/scripts/_lib/tolerance_shadow.ts +177 -0
  474. package/src/scripts/ai_council/redact_low_impact_entry.ts +8 -0
  475. package/src/scripts/autonomy_friction_traffic.ts +379 -0
  476. package/src/scripts/check_kernel_edit_ratified.ts +462 -0
  477. package/src/scripts/check_loss_class_declared.ts +793 -46
  478. package/src/scripts/check_platform_anchor.ts +390 -0
  479. package/src/scripts/check_preamble_payload_budget.ts +292 -4
  480. package/src/scripts/check_projected_rule_routes.ts +395 -0
  481. package/src/scripts/code_graph/cli.ts +6 -0
  482. package/src/scripts/condense.ts +2 -6
  483. package/src/scripts/generate_host_cost_table.ts +354 -0
  484. package/src/scripts/hook_manifest.json +1 -1
  485. package/src/scripts/hook_manifest.yaml +35 -27
  486. package/src/scripts/hooks/category_a.ts +1 -1
  487. package/src/scripts/hooks/chain_nudge_hook.ts +311 -25
  488. package/src/scripts/hooks/session_eol_hook.ts +68 -154
  489. package/src/scripts/hooks/source_first_gate_hook.ts +12 -0
  490. package/src/scripts/hooks/ui_route_nudge_hook.ts +52 -15
  491. package/src/scripts/hot_context_hook.ts +41 -401
  492. package/src/scripts/lint_evidence_artifacts.ts +1 -0
  493. package/src/scripts/lint_knowledge_scale.ts +0 -26
  494. package/src/scripts/memory_lookup.ts +9 -9
  495. package/src/scripts/report_standing_payload_by_host.ts +7 -7
  496. package/src/scripts/session_memory_index.ts +5 -0
  497. package/src/scripts/sync_agent_settings.ts +270 -10
  498. package/src/server/io/yamlIO.ts +127 -17
  499. package/src/server/schemas/settings.ts +25 -5
  500. package/src/shared/settingsSurface.ts +13 -2
  501. package/src/templates/compact-instructions.md +8 -3
  502. package/dist/agent-src/commands/chat-history/import.md +0 -170
  503. package/dist/agent-src/commands/chat-history.md +0 -63
@@ -0,0 +1,177 @@
1
+ /**
2
+ * Shadow records for the value-reconciliation tolerance — the window whose
3
+ * distribution a threshold may later be read off.
4
+ *
5
+ * NO NEW CONCERN. `check_estate_count` reports zero growth allowance on hook
6
+ * concerns, and the roadmap step says so in as many words: extend the existing
7
+ * shadow gate. These records therefore ride `source_first_gate_hook.ts`'s
8
+ * `SHADOW_LOG` — the same JSONL file, the same gitignored local-only path — and
9
+ * are told apart by their own `record` discriminator. Nothing new is registered,
10
+ * nothing new fires, and the concern count is unmoved.
11
+ *
12
+ * NO SELF-REPORTED VERDICT, which is the property the step's verify clause
13
+ * names and the one most easily lost. A record says what the distance WAS and
14
+ * what each candidate threshold WOULD have done with it. It never says whether
15
+ * that was right. A field like `was_correct` would be the mechanism grading its
16
+ * own homework, and a distribution of self-assessments measures the assessor —
17
+ * the same reason `source_first_gate_hook` records `would_warn` per candidate
18
+ * instead of one `warn`.
19
+ *
20
+ * COUNTERFACTUAL, NOT CHOSEN. `CANDIDATE_COLOR_THRESHOLDS` and
21
+ * `CANDIDATE_LENGTH_THRESHOLDS` are evaluation points, not defaults: every
22
+ * record carries the outcome at each, so the window yields a curve rather than
23
+ * a yes/no. That is the council's own instruction — evaluate several candidate
24
+ * thresholds counterfactually, never select one as behaviour — and it is why a
25
+ * spread exists at all. `SHIPPED_TOLERANCE` stays `null` on both axes
26
+ * throughout the window.
27
+ *
28
+ * PRIVACY BY CONSTRUCTION. The record type carries a kind, a metric, numbers,
29
+ * a token NAME, and booleans. It has no field able to hold a file path, a
30
+ * prompt, a selector, or any document content — the same stance
31
+ * `source_first_gate_hook.ts` states for its own record. A token name is a
32
+ * project's own vocabulary and is the one string here; it is what makes a
33
+ * distribution readable per token rather than only in aggregate.
34
+ */
35
+ import { appendShadowLine } from '../hooks/source_first_gate_hook.js';
36
+
37
+ import type {
38
+ COLOR_DISTANCE_METRIC,
39
+ LENGTH_DISTANCE_METRIC,
40
+ ValueKind,
41
+ ValueRow,
42
+ } from './design_tolerance.js';
43
+
44
+ /**
45
+ * Colour ΔEOK evaluation points. Spread deliberately across two orders of
46
+ * magnitude: the window has to show where the curve bends, and a spread
47
+ * clustered around a guess would only confirm the guess.
48
+ */
49
+ export const CANDIDATE_COLOR_THRESHOLDS: readonly number[] = [0.001, 0.005, 0.01, 0.02, 0.05];
50
+
51
+ /**
52
+ * Length evaluation points, in CSS pixels. `1` is here because it is the one
53
+ * externally observed candidate in the evidence set (Primer's spacing plugin),
54
+ * and it is one point on a curve rather than a preferred value.
55
+ */
56
+ export const CANDIDATE_LENGTH_THRESHOLDS: readonly number[] = [0.5, 1, 2, 4];
57
+
58
+ /** Discriminator on the shared shadow log. */
59
+ export const TOLERANCE_SHADOW_RECORD = 'tolerance_shadow' as const;
60
+
61
+ export interface CounterfactualOutcome {
62
+ threshold: number;
63
+ /** Would this value have been reconciled onto the token at that threshold? */
64
+ would_reconcile: boolean;
65
+ }
66
+
67
+ export interface ToleranceShadowRecord {
68
+ record: typeof TOLERANCE_SHADOW_RECORD;
69
+ kind: ValueKind;
70
+ metric: typeof COLOR_DISTANCE_METRIC | typeof LENGTH_DISTANCE_METRIC;
71
+ /** Distance to the nearest project token, in `metric`. */
72
+ distance: number;
73
+ /** The token's own name. No value, no path, no content. */
74
+ nearest_token: string;
75
+ /** What the mechanism actually did — `false` throughout the shadow window. */
76
+ acted: boolean;
77
+ counterfactual: CounterfactualOutcome[];
78
+ }
79
+
80
+ export function candidatesFor(kind: ValueKind): readonly number[] {
81
+ return kind === 'color' ? CANDIDATE_COLOR_THRESHOLDS : CANDIDATE_LENGTH_THRESHOLDS;
82
+ }
83
+
84
+ /**
85
+ * Build a record from a reconciled value row, or `null` when the row carries
86
+ * nothing to measure.
87
+ *
88
+ * A row with no candidate token is deliberately NOT recorded as a distance of
89
+ * zero or of infinity: it is the absence of a measurement, and a window that
90
+ * silently folded those in would report a distribution over a population that
91
+ * includes non-observations.
92
+ */
93
+ export function toleranceShadowRecord(
94
+ kind: ValueKind,
95
+ row: ValueRow,
96
+ ): ToleranceShadowRecord | null {
97
+ if (row.nearest === null || row.distance === null || row.metric === null) return null;
98
+ const distance = row.distance;
99
+ return {
100
+ record: TOLERANCE_SHADOW_RECORD,
101
+ kind,
102
+ metric: row.metric,
103
+ distance,
104
+ nearest_token: row.nearest.name,
105
+ acted: row.outcome === 'reconciled',
106
+ counterfactual: candidatesFor(kind).map((threshold) => ({
107
+ threshold,
108
+ would_reconcile: distance <= threshold,
109
+ })),
110
+ };
111
+ }
112
+
113
+ /**
114
+ * Append the records for one reconciliation pass to the shared shadow log.
115
+ *
116
+ * THE WINDOW IS ONLY OPEN IF SOMETHING WRITES TO IT. A blind review of the
117
+ * branch that shipped this module found the header above claiming records ride
118
+ * `SHADOW_LOG` while the module had no writer and no caller — so
119
+ * `FLIP_CRITERION`'s reverse trigger ("fewer than 20 records in 8 weeks")
120
+ * was satisfied by construction, which is a criterion that measures nothing.
121
+ * The writer is `appendShadowLine`, reused rather than reimplemented: it is
122
+ * already replay-aware and already fail-open, and a second writer to one log is
123
+ * two chances to disagree about the format.
124
+ *
125
+ * Returns the number of records written — rows with nothing to measure are
126
+ * skipped, so this is not `rows.length`.
127
+ */
128
+ export function recordToleranceShadow(
129
+ root: string,
130
+ rows: ReadonlyArray<{ kind: ValueKind; row: ValueRow }>,
131
+ ): number {
132
+ let written = 0;
133
+ for (const { kind, row } of rows) {
134
+ const record = toleranceShadowRecord(kind, row);
135
+ if (record === null) continue;
136
+ appendShadowLine(root, record as unknown as Record<string, unknown>);
137
+ written += 1;
138
+ }
139
+ return written;
140
+ }
141
+
142
+ /**
143
+ * Pre-registered flip criterion, written BEFORE the window opens — which is the
144
+ * third clause of the step's verify and the one a later reader cannot
145
+ * reconstruct. Prose rather than code on purpose: nothing evaluates it
146
+ * automatically, and a function that returned `true` here would be the
147
+ * mechanism authorising its own promotion.
148
+ */
149
+ export const FLIP_CRITERION = `
150
+ Shadow -> a shipped tolerance, when ALL of:
151
+
152
+ a. >= 200 tolerance_shadow records, or >= 4 weeks of window, whichever comes
153
+ first, with at least 50 records on EACH axis. Colour and length are
154
+ separate distributions and a threshold read off a pooled one is read off
155
+ the wrong population.
156
+ b. The chosen candidate's counterfactual FALSE-RECONCILIATION share -- rows a
157
+ human reviewer marks as "should have been preserved" that the candidate
158
+ would have reconciled -- is at or below 1 %, estimated per axis. The
159
+ reviewer labels are collected OUTSIDE this record type on purpose: a
160
+ record that carried its own correctness label would be the self-report
161
+ this module refuses.
162
+ c. The MISSED-reconciliation share is reported alongside it and is not
163
+ optimised away. A threshold of zero trivially satisfies (b) and is useless;
164
+ both error directions are stated or the criterion is not met.
165
+ d. The distribution is not obviously bimodal. A bimodal curve means the
166
+ tolerance model itself is wrong -- two populations are being measured as
167
+ one -- and the response is to re-cut the model, never to pick a threshold
168
+ between the modes.
169
+
170
+ Reverse trigger: fewer than 20 records in 8 weeks -> evaluate removing the
171
+ mechanism. A reconciliation nobody exercises is prose with a config key.
172
+
173
+ Never lifted by this criterion: enabling the mechanism BY DEFAULT is a
174
+ consumer-facing default flip and stays owner-reserved, recorded in
175
+ agents/roadmaps/stubs/road-to-frontend-power-default-flip.md. Meeting a to d
176
+ authorises a shipped tolerance VALUE, not a shipped default.
177
+ `.trim();
@@ -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
+ }