@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,278 @@
1
+ /**
2
+ * The ratification artifact — ADR-268 § 4's control, in one reader.
3
+ *
4
+ * ADR-268 § 4 permits an agent to edit kernel rules, governance hooks and
5
+ * authority schemas inside an authorised mission, and forbids it to ratify its
6
+ * own increase in power:
7
+ *
8
+ * ```
9
+ * AN AGENT MAY MODIFY ITS CONSTITUTION. IT MAY NOT RATIFY ITS OWN INCREASE IN POWER.
10
+ * THE PARTY GAINING THE AUTHORITY IS NEVER THE PARTY RECORDING THE RATIFICATION.
11
+ * PROVIDER DIVERSITY IS REQUIRED WHERE TWO PROVIDERS ARE CONFIGURED.
12
+ * ```
13
+ *
14
+ * That sentence is the whole reason this module exists as a pure reader with
15
+ * no filesystem and no network: the gate that reds a PR
16
+ * (`check_kernel_edit_ratified`) and the tests that prove it reds must decide
17
+ * from the same code, or the fixture proves a second implementation rather
18
+ * than the shipped one.
19
+ *
20
+ * Why `reviewed_by` is checked against BOTH producer fields.
21
+ * `road-to-typed-grants-that-persist` Phase 5.1 names one fixture — an
22
+ * artifact whose `proposed_by` equals its `reviewed_by` is rejected. The Iron
23
+ * Law above is broader than that fixture: the party gaining the authority is
24
+ * the party that proposed the expansion AND the party that implemented it, and
25
+ * an artifact reviewed by its own implementer is the same defect wearing the
26
+ * other field's name. Both are rejected, and this paragraph is why the code is
27
+ * wider than the step that asked for it.
28
+ *
29
+ * What this module does NOT decide: whether a diff is authority-EXPANDING.
30
+ * That is a judgement over rule prose, not a property of the artifact, and
31
+ * ADR-268 § 4 makes the artifact required for the expanding case only.
32
+ * `check_kernel_edit_ratified` requires the artifact for every kernel-rule
33
+ * diff instead — a strictly stronger and decidable rule — and says so in its
34
+ * own header rather than pretending to classify.
35
+ */
36
+
37
+ import { readAdrFrontmatter, type AdrFrontmatter } from './adr_frontmatter.js';
38
+
39
+ /** Where a ratification artifact lives. One directory, so the gate can find it. */
40
+ export const RATIFICATION_DIR = 'agents/evidence/ratifications';
41
+
42
+ /**
43
+ * The verdict vocabulary — closed, because an open one is a free-text field
44
+ * that always reads as approval to a grep.
45
+ */
46
+ export const RATIFICATION_VERDICTS = [
47
+ 'ratified',
48
+ 'confirmed-non-expanding',
49
+ 'refused',
50
+ 'non-convergent',
51
+ ] as const;
52
+ export type RatificationVerdict = (typeof RATIFICATION_VERDICTS)[number];
53
+
54
+ /**
55
+ * The two verdicts that let a diff land.
56
+ *
57
+ * `confirmed-non-expanding` exists because the gate demands an artifact for
58
+ * EVERY kernel and governance-hook diff, including a typo fix. Calling that a
59
+ * ratification of an authority expansion would be false, and a vocabulary that
60
+ * forces a false label is a vocabulary people route around. Adopted from the
61
+ * round-1 review, which named the pressure this relieves.
62
+ */
63
+ export const PASSING_VERDICTS: ReadonlySet<string> = new Set([
64
+ 'ratified',
65
+ 'confirmed-non-expanding',
66
+ ]);
67
+
68
+ /** The six fields Phase 5.1 names, all required. */
69
+ export const RATIFICATION_FIELDS = [
70
+ 'proposed_by',
71
+ 'implemented_by',
72
+ 'reviewed_by',
73
+ 'providers',
74
+ 'verdict',
75
+ 'effective_after',
76
+ ] as const;
77
+
78
+ export interface RatificationArtifact {
79
+ proposed_by: string;
80
+ implemented_by: string;
81
+ reviewed_by: string;
82
+ /** Provider ids consulted, in source order. Diversity is counted over this. */
83
+ providers: string[];
84
+ verdict: RatificationVerdict;
85
+ /** `merge`, or an ISO-8601 instant. Never a bare "later". */
86
+ effective_after: string;
87
+ }
88
+
89
+ export interface RatificationProblem {
90
+ /** Stable code, so a test asserts the reason rather than the wording. */
91
+ code:
92
+ | 'no-frontmatter'
93
+ | 'missing-field'
94
+ | 'unknown-verdict'
95
+ | 'self-ratified'
96
+ | 'no-providers'
97
+ | 'diversity-required'
98
+ | 'diversity-unverifiable'
99
+ | 'bad-effective-after';
100
+ message: string;
101
+ }
102
+
103
+ export interface RatificationReading {
104
+ artifact: RatificationArtifact | null;
105
+ problems: RatificationProblem[];
106
+ }
107
+
108
+ /** `merge`, or an ISO-8601 instant with a timezone. */
109
+ const EFFECTIVE_AFTER_RE =
110
+ /^(merge|\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2}))$/;
111
+
112
+ function scalarOf(fm: AdrFrontmatter, key: string): string | null {
113
+ const raw = fm.scalars[key];
114
+ if (typeof raw !== 'string') {
115
+ return null;
116
+ }
117
+ const trimmed = raw.trim();
118
+ return trimmed === '' ? null : trimmed;
119
+ }
120
+
121
+ /**
122
+ * Read `providers` in either shape the frontmatter parser can produce — a YAML
123
+ * list (nested) or an inline `[a, b]` scalar. Accepting both is not laxity:
124
+ * the ADR frontmatter corpus already carries both shapes for `basis`, and a
125
+ * reader that took only one would reject a correctly-authored artifact.
126
+ */
127
+ export function readProviders(fm: AdrFrontmatter): string[] {
128
+ const nested = fm.nested['providers'];
129
+ if (Array.isArray(nested)) {
130
+ return nested.map((p) => String(p).trim()).filter((p) => p !== '');
131
+ }
132
+ const scalar = scalarOf(fm, 'providers');
133
+ if (scalar === null) {
134
+ return [];
135
+ }
136
+ return scalar
137
+ .replace(/^\[|\]$/g, '')
138
+ .split(',')
139
+ .map((p) => p.trim().replace(/^["']|["']$/g, ''))
140
+ .filter((p) => p !== '');
141
+ }
142
+
143
+ /**
144
+ * Validate one artifact's text.
145
+ *
146
+ * `configuredProviders` is the count `agent-config council:status` reports.
147
+ * Pass `null` when it could not be established — the diversity rule then does
148
+ * not fire, and the caller says so, because an unmeasured count is not
149
+ * evidence that diversity was unavailable.
150
+ */
151
+ export function readRatification(
152
+ text: string,
153
+ configuredProviders: number | null,
154
+ ): RatificationReading {
155
+ const problems: RatificationProblem[] = [];
156
+ const fm = readAdrFrontmatter(text);
157
+ if (fm === null) {
158
+ return {
159
+ artifact: null,
160
+ problems: [{ code: 'no-frontmatter', message: 'no YAML frontmatter block' }],
161
+ };
162
+ }
163
+
164
+ const providers = readProviders(fm);
165
+ const values: Record<string, string | null> = {};
166
+ for (const field of RATIFICATION_FIELDS) {
167
+ if (field === 'providers') {
168
+ continue;
169
+ }
170
+ values[field] = scalarOf(fm, field);
171
+ if (values[field] === null) {
172
+ problems.push({ code: 'missing-field', message: `missing or empty \`${field}:\`` });
173
+ }
174
+ }
175
+ if (providers.length === 0) {
176
+ problems.push({ code: 'no-providers', message: 'missing or empty `providers:`' });
177
+ }
178
+
179
+ const verdict = values['verdict'] ?? null;
180
+ if (verdict !== null && !(RATIFICATION_VERDICTS as readonly string[]).includes(verdict)) {
181
+ problems.push({
182
+ code: 'unknown-verdict',
183
+ message: `verdict \`${verdict}\` is not one of ${RATIFICATION_VERDICTS.join(', ')}`,
184
+ });
185
+ }
186
+
187
+ const effective = values['effective_after'] ?? null;
188
+ if (effective !== null && !EFFECTIVE_AFTER_RE.test(effective)) {
189
+ problems.push({
190
+ code: 'bad-effective-after',
191
+ message: `effective_after \`${effective}\` is neither \`merge\` nor an ISO-8601 instant`,
192
+ });
193
+ }
194
+
195
+ // The Iron Law. Checked against both producer fields — see the header.
196
+ const reviewer = values['reviewed_by'];
197
+ if (reviewer !== null) {
198
+ for (const producerField of ['proposed_by', 'implemented_by'] as const) {
199
+ const producer = values[producerField];
200
+ if (producer !== null && producer === reviewer) {
201
+ problems.push({
202
+ code: 'self-ratified',
203
+ message:
204
+ `\`${producerField}\` equals \`reviewed_by\` (${reviewer}) — ` +
205
+ 'the party gaining the authority may not record the ratification (ADR-268 section 4)',
206
+ });
207
+ }
208
+ }
209
+ }
210
+
211
+ // Diversity, against the REQUIRED count.
212
+ //
213
+ // Round 1 refused the previous shape: the count came from the user-global
214
+ // council config, which is absent on a CI runner, so the rule silently did
215
+ // not fire there. `null` now means the required count could not be
216
+ // established, and that is a REFUSAL rather than a skip — a control that
217
+ // passes when it cannot measure is advisory.
218
+ if (configuredProviders === null) {
219
+ problems.push({
220
+ code: 'diversity-unverifiable',
221
+ message:
222
+ 'the required provider count could not be read, so diversity is unverifiable — ' +
223
+ 'a control that cannot measure fails closed (src/config/ratification-policy.json)',
224
+ });
225
+ } else if (configuredProviders >= 2) {
226
+ const distinct = new Set(providers);
227
+ if (distinct.size < configuredProviders) {
228
+ problems.push({
229
+ code: 'diversity-required',
230
+ message:
231
+ `${configuredProviders} distinct providers are required; ` +
232
+ `the artifact names ${distinct.size} (${providers.join(', ') || 'none'})`,
233
+ });
234
+ }
235
+ }
236
+
237
+ if (problems.length > 0) {
238
+ return { artifact: null, problems };
239
+ }
240
+
241
+ return {
242
+ artifact: {
243
+ proposed_by: values['proposed_by'] as string,
244
+ implemented_by: values['implemented_by'] as string,
245
+ reviewed_by: reviewer as string,
246
+ providers,
247
+ verdict: verdict as RatificationVerdict,
248
+ effective_after: effective as string,
249
+ },
250
+ problems: [],
251
+ };
252
+ }
253
+
254
+ /** True when the artifact parses and carries a verdict that lets the diff land. */
255
+ export function isRatified(reading: RatificationReading): boolean {
256
+ return reading.artifact !== null && PASSING_VERDICTS.has(reading.artifact.verdict);
257
+ }
258
+
259
+ /**
260
+ * The required distinct-provider count, from the repository's own policy file.
261
+ *
262
+ * Returns `null` when the file is missing or unparseable, and the caller turns
263
+ * that into a refusal — never a skip. Reading the policy from the repository
264
+ * rather than from the user-global council config is the round-1 fix: a runner
265
+ * has the repository and does not have the operator's home directory.
266
+ */
267
+ export function readRequiredProviders(policyText: string | null): number | null {
268
+ if (policyText === null) {
269
+ return null;
270
+ }
271
+ try {
272
+ const parsed = JSON.parse(policyText) as { required_providers?: unknown };
273
+ const n = parsed.required_providers;
274
+ return typeof n === 'number' && Number.isInteger(n) && n >= 1 ? n : null;
275
+ } catch {
276
+ return null;
277
+ }
278
+ }
@@ -149,18 +149,39 @@ export function path_weight(rel_path: string): number {
149
149
  }
150
150
 
151
151
  const PROJECTION_PREFIX = 'dist/agent-src/';
152
+ /**
153
+ * Lanes whose source does NOT live under `src/`. The projection folds several
154
+ * trees into one output directory, so the `src/` default below is right for
155
+ * most of it and wrong for these.
156
+ */
157
+ const PROJECTION_SOURCE_LANES: ReadonlyArray<readonly [string, string]> = [
158
+ // The guidelines lane copies `docs/guidelines/` (`_lib/guidelines_lane.ts`),
159
+ // not `src/guidelines/`, which does not exist. Without this row a projected
160
+ // guideline gets a DIFFERENT identity from its own source, so a bound
161
+ // pragma written in the source cannot suppress the projection's copy of the
162
+ // very same line — measured on
163
+ // `untrusted-input-spotlighting.md`, a defense guideline that quotes
164
+ // role-takeover phrases to teach refusal and carries three accepted
165
+ // fingerprints for exactly that.
166
+ ['guidelines/', 'docs/guidelines/'],
167
+ ];
152
168
 
153
169
  /**
154
170
  * Fold a projected path back onto the source it was copied from.
155
171
  *
156
- * `dist/agent-src/` is a byte-for-byte copy of `src/` with paths rewritten
172
+ * `dist/agent-src/` is a byte-for-byte copy of its sources with paths rewritten
157
173
  * (ADR-201), so an artifact and its projection are the same artifact for the
158
174
  * purpose of "which evidence did a human accept". Two identities would mean two
159
175
  * fingerprints for one accepted line, and only one of them could be written
160
176
  * into the pragma the projection copies verbatim.
161
177
  */
162
178
  export function source_identity(rel: string): string {
163
- return rel.startsWith(PROJECTION_PREFIX) ? `src/${rel.slice(PROJECTION_PREFIX.length)}` : rel;
179
+ if (!rel.startsWith(PROJECTION_PREFIX)) return rel;
180
+ const tail = rel.slice(PROJECTION_PREFIX.length);
181
+ for (const [lane, sourceRoot] of PROJECTION_SOURCE_LANES) {
182
+ if (tail.startsWith(lane)) return sourceRoot + tail.slice(lane.length);
183
+ }
184
+ return `src/${tail}`;
164
185
  }
165
186
 
166
187
  /** A file pre-split into lines with a fence/pragma mask the linters reuse. */
@@ -24,6 +24,27 @@
24
24
  *
25
25
  * Everything in this module is pure and clock-injected so the detectors can be
26
26
  * unit-tested without a host, a transcript, or a network.
27
+ *
28
+ * loss_class: ephemeral-lossy
29
+ *
30
+ * `sanitizeEvidence` replaces home paths and e-mail addresses with placeholders
31
+ * and hard-cuts the span at `MAX_EVIDENCE`. It owes no recovery locator and
32
+ * must not have one: storing what was dropped for privacy would defeat the
33
+ * reason it was dropped, which is the same ruling the retired `hot_context_hook`
34
+ * carried. `egressBlockedReason` is the gate; this is a narrowing pass.
35
+ *
36
+ * THE GATE DOES NOT SEE THAT CAP, and the declaration is here anyway.
37
+ * `check_loss_class_declared`'s cap pattern requires a unit word followed by a
38
+ * size noun (`ROW_CAP`, `WORD_CHARS`), so `MAX_EVIDENCE` does not match it.
39
+ * What pulls this module into the corpus is `\bredact` firing on the
40
+ * `redact_low_impact_entry` identifier imported just below — for the EGRESS
41
+ * gate, which loses nothing. So the real lossy operation in this file is
42
+ * declared and unenforced, and the enforcement rests on an unrelated import:
43
+ * rename or drop that import and this module leaves the corpus while still
44
+ * cutting the span. Widening the pattern to any `MAX_<WORD>` was measured and
45
+ * refused (it admits seven constants that cut nothing — see that gate's
46
+ * docstring), so the mismatch is recorded rather than closed. Keep this
47
+ * declaration on its own merits, not because the gate is watching.
27
48
  */
28
49
  import { createHash } from 'node:crypto';
29
50
 
@@ -34,6 +34,18 @@
34
34
  * check's. Nor does it make the index trustworthy in the sense that a model may
35
35
  * act on it: the block stays spotlighted as DATA, per `untrusted-input-defense`,
36
36
  * and this module bounds only WHICH bytes reach that block.
37
+ *
38
+ * loss_class: recoverable-lossy
39
+ * loss_recovery: agents/memory/ — every row the P6 cap drops is a projection of
40
+ * a curated entry that stays on disk untouched and stays addressable by id
41
+ * through `agent-config memory:lookup` / `memory:get`.
42
+ *
43
+ * The cap bounds what the index ADVERTISES, never what the corpus holds, which
44
+ * is why this is not `ephemeral-lossy`: nothing is destroyed, and the drop is a
45
+ * cost bound rather than a privacy one. The retired `hot_context_hook` went the
46
+ * other way for exactly that reason — storing a recovery for a line dropped for
47
+ * privacy would have defeated the reason it was dropped. Nothing here is
48
+ * dropped for privacy.
37
49
  */
38
50
  import * as fs from 'node:fs';
39
51
  import * as path from 'node:path';
@@ -54,6 +66,35 @@ export const SESSION_INDEX_ROW_CAP = 30;
54
66
  */
55
67
  export const MAX_ROOT_AGE_DAYS = 400;
56
68
 
69
+ /**
70
+ * P3's other direction — how far ahead of now a source mtime may sit.
71
+ *
72
+ * A STATED DEFAULT, on the same terms as `MAX_ROOT_AGE_DAYS` above, and written
73
+ * down because a 14.23.0 self-review finding named it as the one threshold in
74
+ * this module carrying no threat model while its neighbour carried one. That
75
+ * asymmetry was the real defect; the number was not.
76
+ *
77
+ * What the grace is FOR: ordinary clock disagreement. An NTP correction, a
78
+ * resumed VM snapshot, or a filesystem whose mtime comes from a host with a
79
+ * slightly different clock can date a file a few seconds ahead of this process
80
+ * without anything being wrong. Zero grace would refuse those, and a refusal
81
+ * there costs the session its memory index for a reason the operator cannot act
82
+ * on.
83
+ *
84
+ * What it is NOT for, stated because the finding read it as an attack window:
85
+ * it buys an attacker nothing. Writing a curated source requires write access
86
+ * INSIDE the workspace, and an attacker holding that can date the file at `now`
87
+ * and pass P3 outright — a future date is strictly worse for them. Freshness
88
+ * here bounds an ABANDONED root, not a hostile one; the module's own docblock
89
+ * says content authenticity is out of scope and that boundary is unchanged.
90
+ *
91
+ * The grace is only harmless while that reading holds. If this check is ever
92
+ * repurposed as a content-integrity control, or a measured population of
93
+ * legitimate skew exceeds the value, the number has to be derived rather than
94
+ * stated.
95
+ */
96
+ export const MAX_FUTURE_SKEW_MS = 60_000;
97
+
57
98
  /**
58
99
  * Curated sources, matching the layouts `memory_lookup._iter_curated_entries`
59
100
  * actually reads: `<root>/<type>.yml` AND `<root>/<type>/**\/*.yml`, plus the
@@ -255,7 +296,7 @@ export function verifyMemoryRoot(input: TrustInput): TrustVerdict {
255
296
 
256
297
  // P3 — freshness, in the two directions it can fail.
257
298
  const newestSourceMs = walk.newestMs;
258
- if (newestSourceMs > now.getTime() + 60_000) {
299
+ if (newestSourceMs > now.getTime() + MAX_FUTURE_SKEW_MS) {
259
300
  return refuse(
260
301
  'source-mtime-in-future',
261
302
  `newest curated source is dated in the future (${new Date(newestSourceMs).toISOString()}) — clock skew or tampering`,
@@ -57,6 +57,17 @@ export interface BoundsRatchetVerdict {
57
57
  baseRef: string | null;
58
58
  /** Why the comparison was skipped, when it was. Printed, never silent. */
59
59
  note: string | null;
60
+ /**
61
+ * `false` means the bound could not be READ, not that it rose.
62
+ *
63
+ * Two refusals reach a caller with `ok: false` and they need opposite
64
+ * actions: a risen ceiling is fixed by lowering the addition, an
65
+ * unverifiable one by repairing the checkout. A completion review caught
66
+ * both being rendered as "ROSE", which would send an operator to shrink a
67
+ * rule over what was a fetch problem. Absent means verified — the only
68
+ * `ok: false` that predates this field is a genuine rise.
69
+ */
70
+ verified: boolean;
60
71
  }
61
72
 
62
73
  function showAtRef(git: GitRunner, repoRoot: string, ref: string, relPath: string): string | null {
@@ -64,22 +75,84 @@ function showAtRef(git: GitRunner, repoRoot: string, ref: string, relPath: strin
64
75
  return r.ok ? r.stdout : null;
65
76
  }
66
77
 
78
+ /**
79
+ * A condition that stops the comparison: skip when advisory, refuse when not.
80
+ *
81
+ * One helper for all four causes rather than four inline branches, so the
82
+ * posture cannot drift between them — the failure this closes was four
83
+ * independent `ok: true` returns that all had to be found before any of them
84
+ * could be trusted.
85
+ */
86
+ function unverified(
87
+ reason: string,
88
+ requireBase: boolean,
89
+ baseGraceCeiling: number | null,
90
+ baseRef: string | null,
91
+ ): BoundsRatchetVerdict {
92
+ if (requireBase) {
93
+ return {
94
+ ok: false,
95
+ verified: false,
96
+ baseGraceCeiling,
97
+ baseRef,
98
+ note: `${reason}, so the shrink-only bound was NOT verified in this run`,
99
+ violations: [
100
+ `the shrink-only bound could not be verified: ${reason}. This run is `
101
+ + 'ENFORCING, so an unverifiable bound refuses rather than skips — an '
102
+ + 'unreadable base would otherwise grant budget on an infrastructure '
103
+ + 'failure. This is NOT a ceiling rise: fix the checkout (a full fetch '
104
+ + 'of the base ref) rather than lowering the addition.',
105
+ ],
106
+ };
107
+ }
108
+ return {
109
+ ok: true,
110
+ verified: false,
111
+ violations: [],
112
+ baseGraceCeiling,
113
+ baseRef,
114
+ note: `${reason}, so the shrink-only bound was NOT verified in this run`,
115
+ };
116
+ }
117
+
67
118
  /**
68
119
  * Compare the grace ceiling in this tree against the one at the base ref.
69
120
  *
70
- * SKIPS rather than fails when the base ref or the base config cannot be read.
71
- * That is the opposite of the fail-closed posture the same council demanded for
72
- * the reserve, and the asymmetry is deliberate: an unreadable base there would
73
- * have GRANTED budget on an infrastructure failure, whereas here it would REFUSE
74
- * a change on one. A shallow clone, a first commit and a detached build all
75
- * legitimately have no base, and a gate that reds on them gets switched off —
76
- * which is how a repository loses the enforcement it just built. The skip is
77
- * reported in both the human and JSON output so it cannot pass for a check.
121
+ * TWO POSTURES, AND WHICH ONE APPLIES IS THE CALLER'S TO DECLARE.
122
+ *
123
+ * Advisory (the default, and what every caller got before `requireBase`): a
124
+ * base ref or base config that cannot be read SKIPS, reported in both the human
125
+ * and JSON output so it cannot pass for a check. That default is not laziness
126
+ * and the original reasoning still holds — a shallow clone, a first commit and
127
+ * a detached build all legitimately have no base, and a gate that reds on them
128
+ * gets switched off, which is how a repository loses the enforcement it just
129
+ * built.
130
+ *
131
+ * Enforcing (`requireBase: true`): the same conditions REFUSE. An AI council
132
+ * (2/2, 2026-09-10) made this blocking for the move to a base-measured ceiling,
133
+ * and the reason is that the asymmetry above inverts once the base ref stops
134
+ * being a cross-check and becomes the ceiling itself. Today an unreadable base
135
+ * costs a comparison; there it would grant an unbounded budget on an
136
+ * infrastructure failure — the exact fail-open the reserve decision refused.
137
+ * anthropic's wording was "replaced or mode-gated"; this is the mode gate, so
138
+ * that no existing caller silently changes behaviour.
139
+ *
140
+ * The flag is the caller's rather than derived from `GITHUB_ACTIONS` here: this
141
+ * module cannot tell an enforcing CI run from a diagnostic one on the same
142
+ * runner, and a gate that guesses its own strictness from an environment
143
+ * variable is one `env` change away from being advisory everywhere.
78
144
  */
79
145
  export function assertBoundsDidNotRise(opts: {
80
146
  repoRoot: string;
81
147
  baseRef: string | null;
82
148
  git?: GitRunner;
149
+ /**
150
+ * Refuse instead of skipping when the base cannot be read.
151
+ *
152
+ * Absent is advisory, which keeps every pre-existing caller on the
153
+ * behaviour it was written against. The CI path sets it.
154
+ */
155
+ requireBase?: boolean;
83
156
  /**
84
157
  * The ceiling this run actually compares the payload against.
85
158
  *
@@ -91,24 +164,18 @@ export function assertBoundsDidNotRise(opts: {
91
164
  headGraceCeiling: number;
92
165
  }): BoundsRatchetVerdict {
93
166
  const git = opts.git ?? realGit;
167
+ const requireBase = opts.requireBase === true;
94
168
  if (opts.baseRef === null || opts.baseRef.trim() === '') {
95
- return {
96
- ok: true,
97
- violations: [],
98
- baseGraceCeiling: null,
99
- baseRef: null,
100
- note: 'no base ref resolved, so the shrink-only bound was NOT verified in this run',
101
- };
169
+ return unverified('no base ref resolved', requireBase, null, null);
102
170
  }
103
171
  const cfg = showAtRef(git, opts.repoRoot, opts.baseRef, BUDGET_CONFIG_PATH);
104
172
  if (cfg === null) {
105
- return {
106
- ok: true,
107
- violations: [],
108
- baseGraceCeiling: null,
109
- baseRef: opts.baseRef,
110
- note: `${BUDGET_CONFIG_PATH} could not be read at ${opts.baseRef}, so the shrink-only bound was NOT verified`,
111
- };
173
+ return unverified(
174
+ `${BUDGET_CONFIG_PATH} could not be read at ${opts.baseRef}`,
175
+ requireBase,
176
+ null,
177
+ opts.baseRef,
178
+ );
112
179
  }
113
180
  let baseGrace: number | null = null;
114
181
  try {
@@ -117,26 +184,25 @@ export function assertBoundsDidNotRise(opts: {
117
184
  const n = Number(delivery['grace_ceiling']);
118
185
  baseGrace = Number.isFinite(n) ? n : null;
119
186
  } catch {
120
- return {
121
- ok: true,
122
- violations: [],
123
- baseGraceCeiling: null,
124
- baseRef: opts.baseRef,
125
- note: `${BUDGET_CONFIG_PATH} at ${opts.baseRef} is not parseable, so the shrink-only bound was NOT verified`,
126
- };
187
+ return unverified(
188
+ `${BUDGET_CONFIG_PATH} at ${opts.baseRef} is not parseable`,
189
+ requireBase,
190
+ null,
191
+ opts.baseRef,
192
+ );
127
193
  }
128
194
  if (baseGrace === null) {
129
- return {
130
- ok: true,
131
- violations: [],
132
- baseGraceCeiling: null,
133
- baseRef: opts.baseRef,
134
- note: `no ci_delivery.grace_ceiling at ${opts.baseRef}, so there is no earlier bound to ratchet against`,
135
- };
195
+ return unverified(
196
+ `there is no ci_delivery.grace_ceiling at ${opts.baseRef} to ratchet against`,
197
+ requireBase,
198
+ null,
199
+ opts.baseRef,
200
+ );
136
201
  }
137
202
  if (opts.headGraceCeiling > baseGrace) {
138
203
  return {
139
204
  ok: false,
205
+ verified: true,
140
206
  baseGraceCeiling: baseGrace,
141
207
  baseRef: opts.baseRef,
142
208
  note: null,
@@ -150,5 +216,5 @@ export function assertBoundsDidNotRise(opts: {
150
216
  ],
151
217
  };
152
218
  }
153
- return { ok: true, violations: [], baseGraceCeiling: baseGrace, baseRef: opts.baseRef, note: null };
219
+ return { ok: true, verified: true, violations: [], baseGraceCeiling: baseGrace, baseRef: opts.baseRef, note: null };
154
220
  }