@event4u/agent-config 14.23.0 → 16.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (541) hide show
  1. package/.augment-plugin/marketplace.json +3 -3
  2. package/.augment-plugin/plugin.json +1 -1
  3. package/.claude-plugin/marketplace.json +1 -1
  4. package/CHANGELOG.md +144 -152
  5. package/README.md +1 -1
  6. package/dist/agent-src/commands/agent-handoff.md +8 -7
  7. package/dist/agent-src/commands/agents/init.md +1 -1
  8. package/dist/agent-src/commands/agents/user/accept.md +4 -4
  9. package/dist/agent-src/commands/agents/user/delete.md +2 -2
  10. package/dist/agent-src/commands/agents/user/init.md +3 -3
  11. package/dist/agent-src/commands/agents/user/review.md +3 -3
  12. package/dist/agent-src/commands/agents/user/show.md +3 -3
  13. package/dist/agent-src/commands/agents/user/update.md +2 -2
  14. package/dist/agent-src/commands/agents/user.md +6 -6
  15. package/dist/agent-src/commands/analytics/prune.md +1 -1
  16. package/dist/agent-src/commands/analytics/show.md +2 -2
  17. package/dist/agent-src/commands/analyze/decision.md +2 -2
  18. package/dist/agent-src/commands/analyze/inbox.md +5 -5
  19. package/dist/agent-src/commands/analyze/incident.md +3 -3
  20. package/dist/agent-src/commands/analyze/near-miss.md +3 -3
  21. package/dist/agent-src/commands/analyze/postmortem.md +4 -4
  22. package/dist/agent-src/commands/analyze/premortem.md +2 -2
  23. package/dist/agent-src/commands/analyze.md +2 -2
  24. package/dist/agent-src/commands/bug/fix.md +1 -1
  25. package/dist/agent-src/commands/bug/investigate.md +2 -2
  26. package/dist/agent-src/commands/cost/profile.md +3 -3
  27. package/dist/agent-src/commands/design.md +1 -1
  28. package/dist/agent-src/commands/feature/explore.md +1 -1
  29. package/dist/agent-src/commands/feature/plan.md +2 -2
  30. package/dist/agent-src/commands/feature/roadmap.md +2 -2
  31. package/dist/agent-src/commands/ghostwriter/fetch.md +4 -4
  32. package/dist/agent-src/commands/ghostwriter/list.md +1 -1
  33. package/dist/agent-src/commands/ghostwriter/show.md +1 -1
  34. package/dist/agent-src/commands/ghostwriter/write.md +9 -9
  35. package/dist/agent-src/commands/humanize.md +6 -6
  36. package/dist/agent-src/commands/jira-ticket.md +1 -1
  37. package/dist/agent-src/commands/judge/solo.md +1 -1
  38. package/dist/agent-src/commands/judge.md +1 -1
  39. package/dist/agent-src/commands/knowledge/cross-repo.md +1 -1
  40. package/dist/agent-src/commands/knowledge/forget.md +1 -1
  41. package/dist/agent-src/commands/knowledge/ingest.md +2 -2
  42. package/dist/agent-src/commands/knowledge/list.md +1 -1
  43. package/dist/agent-src/commands/memory/add.md +3 -3
  44. package/dist/agent-src/commands/memory/load.md +4 -4
  45. package/dist/agent-src/commands/memory/mine-session.md +1 -1
  46. package/dist/agent-src/commands/memory/promote.md +4 -4
  47. package/dist/agent-src/commands/memory/propose.md +2 -2
  48. package/dist/agent-src/commands/mode.md +5 -5
  49. package/dist/agent-src/commands/post-as/ghostwriter.md +3 -3
  50. package/dist/agent-src/commands/post-as/me.md +7 -7
  51. package/dist/agent-src/commands/pr/create.md +1 -1
  52. package/dist/agent-src/commands/pr/merge.md +1 -1
  53. package/dist/agent-src/commands/profile/activate.md +1 -1
  54. package/dist/agent-src/commands/profile/show.md +1 -1
  55. package/dist/agent-src/commands/research/deep.md +2 -2
  56. package/dist/agent-src/commands/research/report.md +2 -2
  57. package/dist/agent-src/commands/review/changes.md +1 -1
  58. package/dist/agent-src/commands/review/routing.md +1 -1
  59. package/dist/agent-src/commands/roadmap/create.md +4 -3
  60. package/dist/agent-src/commands/roadmap/materialize.md +2 -2
  61. package/dist/agent-src/commands/roadmap/next.md +1 -1
  62. package/dist/agent-src/commands/roadmap/process-full.md +2 -2
  63. package/dist/agent-src/commands/security-audit-config.md +3 -3
  64. package/dist/agent-src/commands/skill/preview.md +1 -1
  65. package/dist/agent-src/commands/skills/discover.md +1 -1
  66. package/dist/agent-src/commands/sync/agent-settings.md +2 -2
  67. package/dist/agent-src/commands/sync/gitignore/fix.md +1 -1
  68. package/dist/agent-src/commands/tests/create.md +1 -1
  69. package/dist/agent-src/commands/tests/e2e-heal.md +1 -1
  70. package/dist/agent-src/commands/tests/e2e-plan.md +1 -1
  71. package/dist/agent-src/contexts/authority/kernel-rule-edits.md +6 -6
  72. package/dist/agent-src/contexts/communication/rules-auto/slash-command-routing-policy-mechanics.md +1 -2
  73. package/dist/agent-src/contexts/communication/rules-auto/think-before-action-mechanics.md +2 -2
  74. package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +88 -1
  75. package/dist/agent-src/contexts/communication/rules-auto/user-interaction-mechanics.md +51 -1
  76. package/dist/agent-src/contexts/contracts/frugality-charter.md +1 -1
  77. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +1 -1
  78. package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +1 -1
  79. package/dist/agent-src/contexts/execution/autonomy-mechanics.md +1 -1
  80. package/dist/agent-src/contexts/execution/cheap-question-mechanics.md +1 -1
  81. package/dist/agent-src/contexts/execution/contract-decision-sheet.md +3 -3
  82. package/dist/agent-src/contexts/execution/mandated-lines.md +1 -1
  83. package/dist/agent-src/contexts/execution/non-interactive-contract.md +1 -1
  84. package/dist/agent-src/contexts/execution/orchestration-telemetry.md +1 -1
  85. package/dist/agent-src/contexts/execution/plan-confidence-gate.md +5 -5
  86. package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +1 -1
  87. package/dist/agent-src/contexts/execution/subagent-modes-detail.md +1 -1
  88. package/dist/agent-src/contexts/execution/subagent-routing.md +2 -2
  89. package/dist/agent-src/contexts/execution/subagent-spawn-contract.md +1 -1
  90. package/dist/agent-src/contexts/execution/user-memory-channels.md +3 -3
  91. package/dist/agent-src/contexts/execution/verification-mechanics.md +1 -1
  92. package/dist/agent-src/contexts/judges/persona-voice-rubric.md +2 -2
  93. package/dist/agent-src/guidelines/abstraction-thresholds.md +88 -0
  94. package/dist/agent-src/guidelines/agent-infra/5w2h-analysis.md +260 -0
  95. package/dist/agent-src/guidelines/agent-infra/active-remediation-mechanics.md +99 -0
  96. package/dist/agent-src/guidelines/agent-infra/agent-interaction-and-decision-quality.md +325 -0
  97. package/dist/agent-src/guidelines/agent-infra/api-cost-levers.md +177 -0
  98. package/dist/agent-src/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md +222 -0
  99. package/dist/agent-src/guidelines/agent-infra/ask-when-uncertain-demos.md +134 -0
  100. package/dist/agent-src/guidelines/agent-infra/asking-and-brevity-examples.md +198 -0
  101. package/dist/agent-src/guidelines/agent-infra/break-glass-usage.md +113 -0
  102. package/dist/agent-src/guidelines/agent-infra/carve-out-predicates.md +17 -0
  103. package/dist/agent-src/guidelines/agent-infra/comparison-matrix.md +179 -0
  104. package/dist/agent-src/guidelines/agent-infra/context-hygiene-mechanics.md +165 -0
  105. package/dist/agent-src/guidelines/agent-infra/corpus-grounding-authoring.md +91 -0
  106. package/dist/agent-src/guidelines/agent-infra/critical-thinking.md +156 -0
  107. package/dist/agent-src/guidelines/agent-infra/cross-source-consistency-mechanics.md +109 -0
  108. package/dist/agent-src/guidelines/agent-infra/developer-judgment.md +82 -0
  109. package/dist/agent-src/guidelines/agent-infra/direct-answers-demos.md +142 -0
  110. package/dist/agent-src/guidelines/agent-infra/domain-adoption-gates.md +112 -0
  111. package/dist/agent-src/guidelines/agent-infra/domain-eval-anti-pattern.md +53 -0
  112. package/dist/agent-src/guidelines/agent-infra/domain-pack-architecture.md +56 -0
  113. package/dist/agent-src/guidelines/agent-infra/downstream-changes-mechanics.md +91 -0
  114. package/dist/agent-src/guidelines/agent-infra/emphasis-budget.md +45 -0
  115. package/dist/agent-src/guidelines/agent-infra/engineering-memory-data-format.md +210 -0
  116. package/dist/agent-src/guidelines/agent-infra/evaluator-independence-mechanics.md +92 -0
  117. package/dist/agent-src/guidelines/agent-infra/existence-question-verdicts.md +80 -0
  118. package/dist/agent-src/guidelines/agent-infra/failure-signatures.md +70 -0
  119. package/dist/agent-src/guidelines/agent-infra/false-green.md +233 -0
  120. package/dist/agent-src/guidelines/agent-infra/first-principles.md +192 -0
  121. package/dist/agent-src/guidelines/agent-infra/framework-neutrality-patterns.md +66 -0
  122. package/dist/agent-src/guidelines/agent-infra/frontier-reasoning-operating-profile.md +169 -0
  123. package/dist/agent-src/guidelines/agent-infra/gate-authoring.md +177 -0
  124. package/dist/agent-src/guidelines/agent-infra/guarded-baseline.md +39 -0
  125. package/dist/agent-src/guidelines/agent-infra/installed-tools-manifest.md +142 -0
  126. package/dist/agent-src/guidelines/agent-infra/inversion-thinking.md +388 -0
  127. package/dist/agent-src/guidelines/agent-infra/ios-simulator-guide.md +378 -0
  128. package/dist/agent-src/guidelines/agent-infra/language-and-tone-examples.md +141 -0
  129. package/dist/agent-src/guidelines/agent-infra/layered-settings.md +317 -0
  130. package/dist/agent-src/guidelines/agent-infra/linked-projects-onboarding-gate.md +80 -0
  131. package/dist/agent-src/guidelines/agent-infra/mcp-request-signing.md +197 -0
  132. package/dist/agent-src/guidelines/agent-infra/memory-access.md +149 -0
  133. package/dist/agent-src/guidelines/agent-infra/mental-models.md +314 -0
  134. package/dist/agent-src/guidelines/agent-infra/minimal-safe-diff-mechanics.md +241 -0
  135. package/dist/agent-src/guidelines/agent-infra/missing-tool-handling.md +66 -0
  136. package/dist/agent-src/guidelines/agent-infra/model-recommendation.md +101 -0
  137. package/dist/agent-src/guidelines/agent-infra/naming.md +69 -0
  138. package/dist/agent-src/guidelines/agent-infra/notes-horizon-mechanics.md +90 -0
  139. package/dist/agent-src/guidelines/agent-infra/output-patterns.md +117 -0
  140. package/dist/agent-src/guidelines/agent-infra/recurring-criticism-mechanics.md +96 -0
  141. package/dist/agent-src/guidelines/agent-infra/reuse-verdict-mechanics.md +71 -0
  142. package/dist/agent-src/guidelines/agent-infra/review-routing-data-format.md +143 -0
  143. package/dist/agent-src/guidelines/agent-infra/roadmap-deferred-resolution-provenance.md +54 -0
  144. package/dist/agent-src/guidelines/agent-infra/roadmap-progress-mechanics.md +274 -0
  145. package/dist/agent-src/guidelines/agent-infra/role-contracts.md +209 -0
  146. package/dist/agent-src/guidelines/agent-infra/role-mode-router.md +89 -0
  147. package/dist/agent-src/guidelines/agent-infra/rule-body-migration-inventory.md +241 -0
  148. package/dist/agent-src/guidelines/agent-infra/rule-type-governance.md +73 -0
  149. package/dist/agent-src/guidelines/agent-infra/runtime-layer.md +89 -0
  150. package/dist/agent-src/guidelines/agent-infra/scqa-framework.md +526 -0
  151. package/dist/agent-src/guidelines/agent-infra/security-lint-containment.md +121 -0
  152. package/dist/agent-src/guidelines/agent-infra/self-improvement-pipeline.md +134 -0
  153. package/dist/agent-src/guidelines/agent-infra/simplicity-and-goal-demos.md +211 -0
  154. package/dist/agent-src/guidelines/agent-infra/six-hats.md +353 -0
  155. package/dist/agent-src/guidelines/agent-infra/size-and-scope.md +229 -0
  156. package/dist/agent-src/guidelines/agent-infra/skill-quality-checklist.md +157 -0
  157. package/dist/agent-src/guidelines/agent-infra/source-confidentiality-mechanics.md +109 -0
  158. package/dist/agent-src/guidelines/agent-infra/symptom-driven-harvest-loop.md +104 -0
  159. package/dist/agent-src/guidelines/agent-infra/systems-thinking.md +220 -0
  160. package/dist/agent-src/guidelines/agent-infra/tool-description-as-policy.md +35 -0
  161. package/dist/agent-src/guidelines/agent-infra/tool-integration.md +73 -0
  162. package/dist/agent-src/guidelines/agent-infra/traceability-field-mechanics.md +50 -0
  163. package/dist/agent-src/guidelines/agent-infra/untrusted-input-spotlighting.md +166 -0
  164. package/dist/agent-src/guidelines/agent-infra/verify-before-complete-demos.md +128 -0
  165. package/dist/agent-src/guidelines/augment-portability-patterns.md +70 -0
  166. package/dist/agent-src/guidelines/code-clarity.md +350 -0
  167. package/dist/agent-src/guidelines/component-oriented-and-oop-development.md +189 -0
  168. package/dist/agent-src/guidelines/cross-role-handoff.md +127 -0
  169. package/dist/agent-src/guidelines/design-antipatterns-triggers.json +18 -0
  170. package/dist/agent-src/guidelines/design-antipatterns.md +327 -0
  171. package/dist/agent-src/guidelines/design-asset-discipline.md +38 -0
  172. package/dist/agent-src/guidelines/design-canon.md +63 -0
  173. package/dist/agent-src/guidelines/design-fidelity-mechanics.md +293 -0
  174. package/dist/agent-src/guidelines/design-fidelity-routing.md +78 -0
  175. package/dist/agent-src/guidelines/design-handover-extraction.md +117 -0
  176. package/dist/agent-src/guidelines/design-modes.md +143 -0
  177. package/dist/agent-src/guidelines/design-reconciliation.md +172 -0
  178. package/dist/agent-src/guidelines/docs/readme-size-and-splitting.md +209 -0
  179. package/dist/agent-src/guidelines/e2e/playwright.md +363 -0
  180. package/dist/agent-src/guidelines/gtm-handoff.md +114 -0
  181. package/dist/agent-src/guidelines/monorepo-antipatterns.md +141 -0
  182. package/dist/agent-src/guidelines/php/api-design.md +115 -0
  183. package/dist/agent-src/guidelines/php/artisan-commands.md +81 -0
  184. package/dist/agent-src/guidelines/php/blade-ui.md +78 -0
  185. package/dist/agent-src/guidelines/php/controllers.md +90 -0
  186. package/dist/agent-src/guidelines/php/database.md +194 -0
  187. package/dist/agent-src/guidelines/php/eloquent.md +208 -0
  188. package/dist/agent-src/guidelines/php/flux.md +80 -0
  189. package/dist/agent-src/guidelines/php/general.md +207 -0
  190. package/dist/agent-src/guidelines/php/git.md +164 -0
  191. package/dist/agent-src/guidelines/php/jobs.md +111 -0
  192. package/dist/agent-src/guidelines/php/livewire.md +71 -0
  193. package/dist/agent-src/guidelines/php/logging.md +79 -0
  194. package/dist/agent-src/guidelines/php/naming.md +89 -0
  195. package/dist/agent-src/guidelines/php/patterns/dependency-injection.md +57 -0
  196. package/dist/agent-src/guidelines/php/patterns/dtos.md +199 -0
  197. package/dist/agent-src/guidelines/php/patterns/events.md +67 -0
  198. package/dist/agent-src/guidelines/php/patterns/factory.md +53 -0
  199. package/dist/agent-src/guidelines/php/patterns/pipelines.md +66 -0
  200. package/dist/agent-src/guidelines/php/patterns/policies.md +66 -0
  201. package/dist/agent-src/guidelines/php/patterns/repositories.md +122 -0
  202. package/dist/agent-src/guidelines/php/patterns/service-layer.md +64 -0
  203. package/dist/agent-src/guidelines/php/patterns/strategy.md +247 -0
  204. package/dist/agent-src/guidelines/php/patterns.md +28 -0
  205. package/dist/agent-src/guidelines/php/performance.md +92 -0
  206. package/dist/agent-src/guidelines/php/php-coding-patterns.md +80 -0
  207. package/dist/agent-src/guidelines/php/resources.md +100 -0
  208. package/dist/agent-src/guidelines/php/security.md +110 -0
  209. package/dist/agent-src/guidelines/php/sql.md +97 -0
  210. package/dist/agent-src/guidelines/php/validations.md +119 -0
  211. package/dist/agent-src/guidelines/php/websocket.md +100 -0
  212. package/dist/agent-src/guidelines/prompt-templates.md +189 -0
  213. package/dist/agent-src/guidelines/redundancy-taxonomy.md +208 -0
  214. package/dist/agent-src/guidelines/wing4-handoff.md +127 -0
  215. package/dist/agent-src/personas/README.md +1 -1
  216. package/dist/agent-src/personas/_template-specialist/persona.md +1 -1
  217. package/dist/agent-src/personas/product-owner.md +1 -1
  218. package/dist/agent-src/rules/active-remediation.md +1 -1
  219. package/dist/agent-src/rules/architecture.md +2 -2
  220. package/dist/agent-src/rules/artifact-drafting-protocol.md +1 -1
  221. package/dist/agent-src/rules/ask-when-uncertain.md +2 -2
  222. package/dist/agent-src/rules/brand-source-of-truth.md +9 -7
  223. package/dist/agent-src/rules/code-comment-discipline.md +2 -2
  224. package/dist/agent-src/rules/code-provenance.md +1 -1
  225. package/dist/agent-src/rules/content-quoting-floor.md +1 -1
  226. package/dist/agent-src/rules/context-hygiene.md +5 -5
  227. package/dist/agent-src/rules/cross-source-consistency.md +1 -1
  228. package/dist/agent-src/rules/design-fidelity.md +36 -46
  229. package/dist/agent-src/rules/direct-answers.md +2 -2
  230. package/dist/agent-src/rules/domain-adoption-policy.md +1 -1
  231. package/dist/agent-src/rules/evaluator-independence.md +1 -1
  232. package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +1 -1
  233. package/dist/agent-src/rules/icon-consistency.md +5 -1
  234. package/dist/agent-src/rules/improve-before-implement.md +1 -1
  235. package/dist/agent-src/rules/language-and-tone.md +3 -3
  236. package/dist/agent-src/rules/minimal-safe-diff.md +1 -1
  237. package/dist/agent-src/rules/notes-first-reasoning.md +2 -2
  238. package/dist/agent-src/rules/recurring-criticism.md +1 -1
  239. package/dist/agent-src/rules/roadmap-progress-sync.md +1 -1
  240. package/dist/agent-src/rules/role-mode-adherence.md +2 -2
  241. package/dist/agent-src/rules/security-sensitive-stop.md +1 -1
  242. package/dist/agent-src/rules/size-enforcement.md +1 -1
  243. package/dist/agent-src/rules/source-confidentiality.md +2 -2
  244. package/dist/agent-src/rules/think-before-action.md +1 -1
  245. package/dist/agent-src/rules/token-efficiency.md +7 -5
  246. package/dist/agent-src/rules/ui-audit-gate.md +3 -2
  247. package/dist/agent-src/rules/untrusted-input-defense.md +3 -3
  248. package/dist/agent-src/rules/user-interaction.md +31 -30
  249. package/dist/agent-src/skills/activation-design/SKILL.md +2 -2
  250. package/dist/agent-src/skills/adr-create/SKILL.md +5 -5
  251. package/dist/agent-src/skills/ai-council/SKILL.md +1 -1
  252. package/dist/agent-src/skills/ai-council/references/advanced-modes.md +1 -1
  253. package/dist/agent-src/skills/blade-ui/SKILL.md +1 -1
  254. package/dist/agent-src/skills/blast-radius-analyzer/SKILL.md +1 -1
  255. package/dist/agent-src/skills/brand-to-tokens/SKILL.md +24 -3
  256. package/dist/agent-src/skills/bug-analyzer/SKILL.md +1 -1
  257. package/dist/agent-src/skills/build-buy-partner/SKILL.md +1 -1
  258. package/dist/agent-src/skills/churn-prevention/SKILL.md +2 -2
  259. package/dist/agent-src/skills/code-refactoring/SKILL.md +3 -3
  260. package/dist/agent-src/skills/code-review/SKILL.md +3 -3
  261. package/dist/agent-src/skills/command-writing/SKILL.md +3 -3
  262. package/dist/agent-src/skills/comp-banding/SKILL.md +1 -1
  263. package/dist/agent-src/skills/competitive-moat-analysis/SKILL.md +1 -1
  264. package/dist/agent-src/skills/competitive-positioning/SKILL.md +2 -2
  265. package/dist/agent-src/skills/complexity-first-planning/SKILL.md +1 -1
  266. package/dist/agent-src/skills/condense-memory/SKILL.md +1 -1
  267. package/dist/agent-src/skills/content-funnel-design/SKILL.md +2 -2
  268. package/dist/agent-src/skills/contracts-cognition/SKILL.md +1 -1
  269. package/dist/agent-src/skills/copilot-agents-optimization/SKILL.md +2 -2
  270. package/dist/agent-src/skills/corpus-grounding/SKILL.md +2 -2
  271. package/dist/agent-src/skills/customer-research/SKILL.md +2 -2
  272. package/dist/agent-src/skills/dashboard-design/SKILL.md +1 -1
  273. package/dist/agent-src/skills/data-handling-judgment/SKILL.md +1 -1
  274. package/dist/agent-src/skills/deal-qualification-meddic/SKILL.md +2 -2
  275. package/dist/agent-src/skills/decision-record/SKILL.md +3 -3
  276. package/dist/agent-src/skills/decision-review/SKILL.md +8 -8
  277. package/dist/agent-src/skills/deep-reading-analyst/SKILL.md +22 -22
  278. package/dist/agent-src/skills/design-intelligence/SKILL.md +4 -4
  279. package/dist/agent-src/skills/design-intelligence/references/context-and-registers.md +2 -2
  280. package/dist/agent-src/skills/design-review/SKILL.md +4 -4
  281. package/dist/agent-src/skills/design-system-capture/references/design-system-json.md +20 -1
  282. package/dist/agent-src/skills/design-tokens/SKILL.md +17 -2
  283. package/dist/agent-src/skills/design-variations/SKILL.md +2 -2
  284. package/dist/agent-src/skills/developer-like-execution/SKILL.md +2 -2
  285. package/dist/agent-src/skills/discovery-interview/SKILL.md +2 -2
  286. package/dist/agent-src/skills/doc-coauthoring/SKILL.md +3 -3
  287. package/dist/agent-src/skills/editorial-calendar/SKILL.md +2 -2
  288. package/dist/agent-src/skills/error-handling-patterns/SKILL.md +9 -0
  289. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +44 -1
  290. package/dist/agent-src/skills/existing-ui-audit/references/anti-slop-cross-reference.md +2 -2
  291. package/dist/agent-src/skills/expansion-playbook/SKILL.md +2 -2
  292. package/dist/agent-src/skills/experiment-loop/SKILL.md +1 -1
  293. package/dist/agent-src/skills/experiment-loop/references/protocol.md +1 -1
  294. package/dist/agent-src/skills/fe-design/SKILL.md +3 -3
  295. package/dist/agent-src/skills/fe-design/references/design-patterns.md +1 -1
  296. package/dist/agent-src/skills/fe-design/references/design-read-and-memory.md +3 -3
  297. package/dist/agent-src/skills/fe-design/references/source-led-port.md +1 -1
  298. package/dist/agent-src/skills/feature-planning/SKILL.md +1 -1
  299. package/dist/agent-src/skills/flux/SKILL.md +1 -1
  300. package/dist/agent-src/skills/forecast-accuracy/SKILL.md +2 -2
  301. package/dist/agent-src/skills/forecasting/SKILL.md +2 -2
  302. package/dist/agent-src/skills/fundraising-narrative/SKILL.md +2 -2
  303. package/dist/agent-src/skills/funnel-analysis/SKILL.md +2 -2
  304. package/dist/agent-src/skills/gtm-launch/SKILL.md +2 -2
  305. package/dist/agent-src/skills/hiring-loop-design/SKILL.md +1 -1
  306. package/dist/agent-src/skills/html-deck/SKILL.md +5 -5
  307. package/dist/agent-src/skills/humanizer/SKILL.md +1 -1
  308. package/dist/agent-src/skills/humanizer/data/patterns.md +1 -1
  309. package/dist/agent-src/skills/iconography/SKILL.md +3 -3
  310. package/dist/agent-src/skills/judge-synthesis/SKILL.md +1 -1
  311. package/dist/agent-src/skills/laravel-api-endpoint/SKILL.md +2 -2
  312. package/dist/agent-src/skills/launch-readiness/SKILL.md +3 -3
  313. package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +6 -6
  314. package/dist/agent-src/skills/livewire/SKILL.md +1 -1
  315. package/dist/agent-src/skills/market-entry-analysis/SKILL.md +1 -1
  316. package/dist/agent-src/skills/mcp-builder/SKILL.md +1 -1
  317. package/dist/agent-src/skills/memory-consolidation/SKILL.md +3 -3
  318. package/dist/agent-src/skills/messaging-architecture/SKILL.md +2 -2
  319. package/dist/agent-src/skills/monorepo-workspace/SKILL.md +1 -1
  320. package/dist/agent-src/skills/onboarding-design/SKILL.md +2 -2
  321. package/dist/agent-src/skills/onboarding-program/SKILL.md +1 -1
  322. package/dist/agent-src/skills/one-on-one-cadence/SKILL.md +1 -1
  323. package/dist/agent-src/skills/org-design/SKILL.md +1 -1
  324. package/dist/agent-src/skills/overbuild-review-lens/SKILL.md +3 -3
  325. package/dist/agent-src/skills/override-management/SKILL.md +1 -1
  326. package/dist/agent-src/skills/perf-feedback-craft/SKILL.md +1 -1
  327. package/dist/agent-src/skills/persona-writing/SKILL.md +1 -1
  328. package/dist/agent-src/skills/php-coder/SKILL.md +1 -1
  329. package/dist/agent-src/skills/pipeline-strategy/SKILL.md +2 -2
  330. package/dist/agent-src/skills/playwright-testing/SKILL.md +3 -3
  331. package/dist/agent-src/skills/po-discovery/SKILL.md +1 -1
  332. package/dist/agent-src/skills/positioning-strategy/SKILL.md +2 -2
  333. package/dist/agent-src/skills/privacy-review/SKILL.md +1 -1
  334. package/dist/agent-src/skills/prompt-optimizer/SKILL.md +3 -3
  335. package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +1 -1
  336. package/dist/agent-src/skills/reasoning-orchestrator/SKILL.md +2 -2
  337. package/dist/agent-src/skills/receiving-code-review/SKILL.md +1 -1
  338. package/dist/agent-src/skills/refine-ticket/SKILL.md +2 -2
  339. package/dist/agent-src/skills/release-comms/SKILL.md +2 -2
  340. package/dist/agent-src/skills/retention-loops/SKILL.md +2 -2
  341. package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
  342. package/dist/agent-src/skills/roadmap-management/SKILL.md +1 -1
  343. package/dist/agent-src/skills/roadmap-management/references/archival.md +1 -1
  344. package/dist/agent-src/skills/roadmap-writing/SKILL.md +5 -5
  345. package/dist/agent-src/skills/rule-writing/SKILL.md +6 -6
  346. package/dist/agent-src/skills/runway-cognition/SKILL.md +2 -2
  347. package/dist/agent-src/skills/scenario-modeling/SKILL.md +2 -2
  348. package/dist/agent-src/skills/skill-writing/SKILL.md +2 -2
  349. package/dist/agent-src/skills/skill-writing/references/procedure.md +1 -1
  350. package/dist/agent-src/skills/skill-writing/references/section-patterns.md +3 -3
  351. package/dist/agent-src/skills/spreadsheet-authoring/SKILL.md +1 -1
  352. package/dist/agent-src/skills/stakeholder-tradeoff/SKILL.md +3 -3
  353. package/dist/agent-src/skills/subagent-orchestration/SKILL.md +1 -1
  354. package/dist/agent-src/skills/supply-chain-intake/SKILL.md +1 -1
  355. package/dist/agent-src/skills/systematic-debugging/SKILL.md +2 -2
  356. package/dist/agent-src/skills/tailwind-engineer/SKILL.md +11 -5
  357. package/dist/agent-src/skills/throughput-vs-morale-tradeoff/SKILL.md +1 -1
  358. package/dist/agent-src/skills/token-optimizer/SKILL.md +1 -1
  359. package/dist/agent-src/skills/typography-system/SKILL.md +2 -2
  360. package/dist/agent-src/skills/ui-component-architect/SKILL.md +28 -8
  361. package/dist/agent-src/skills/unit-economics-modeling/SKILL.md +2 -2
  362. package/dist/agent-src/skills/upstream-contribute/SKILL.md +1 -1
  363. package/dist/agent-src/skills/validate-feature-fit/SKILL.md +2 -2
  364. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +2 -2
  365. package/dist/agent-src/skills/vision-articulation/SKILL.md +1 -1
  366. package/dist/agent-src/skills/voc-extract/SKILL.md +2 -2
  367. package/dist/agent-src/skills/voice-and-tone-design/SKILL.md +2 -2
  368. package/dist/agent-src/skills/wireframe/SKILL.md +1 -1
  369. package/dist/agent-src/skills/workspace-link/SKILL.md +1 -1
  370. package/dist/agent-src/templates/agent-settings.md +6 -6
  371. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  372. package/dist/agent-src/templates/contexts/knowledge-pages.md +2 -3
  373. package/dist/agent-src/templates/copilot-instructions.md +1 -1
  374. package/dist/agent-src/templates/roadmaps.md +1 -1
  375. package/dist/agent-src/templates/scripts/README.md +2 -2
  376. package/dist/agent-src/user-types/_template/user-type.md +1 -1
  377. package/dist/cli-delegate/check_update_banner.js +12 -1
  378. package/dist/cli-delegate/{chunk-NLP54U3J.js → chunk-2XY7ILBT.js} +13 -1
  379. package/dist/cli-delegate/{chunk-IAI3XL43.js → chunk-3FKR64R5.js} +22 -6
  380. package/dist/cli-delegate/{chunk-J3RFNKG4.js → chunk-55ACLDUE.js} +2 -2
  381. package/dist/cli-delegate/{chunk-PKOBQADP.js → chunk-57PN4GYJ.js} +1 -1
  382. package/dist/cli-delegate/{chunk-KCNTUSPI.js → chunk-AK6HODNQ.js} +4 -4
  383. package/dist/cli-delegate/{chunk-2FTMENJL.js → chunk-GYC3VRYN.js} +1 -1
  384. package/dist/cli-delegate/{chunk-LWTYTX6F.js → chunk-H32DGUJH.js} +15 -84
  385. package/dist/cli-delegate/{chunk-6RJA2F5A.js → chunk-IVBPRCQO.js} +1 -1
  386. package/dist/cli-delegate/chunk-NUHLI2RX.js +80 -0
  387. package/dist/cli-delegate/{chunk-TYSY33MD.js → chunk-QJWAUMJW.js} +12 -2
  388. package/dist/cli-delegate/{chunk-2KKXJW25.js → chunk-S3VFXMTM.js} +1 -1
  389. package/dist/cli-delegate/{chunk-I6RHFQEG.js → chunk-YUM5KURG.js} +17 -1
  390. package/dist/cli-delegate/cmd_analyze_session.js +1 -1
  391. package/dist/cli-delegate/cmd_brand_status.js +1 -1
  392. package/dist/cli-delegate/cmd_conformance.js +834 -275
  393. package/dist/cli-delegate/cmd_doctor.js +3 -3
  394. package/dist/cli-delegate/cmd_explain.js +5 -3
  395. package/dist/cli-delegate/cmd_export.js +4 -4
  396. package/dist/cli-delegate/cmd_handoff.js +6 -6
  397. package/dist/cli-delegate/cmd_mcp_available.js +1 -1
  398. package/dist/cli-delegate/cmd_memory_get.js +1 -1
  399. package/dist/cli-delegate/cmd_migrate.js +2 -2
  400. package/dist/cli-delegate/cmd_packs_active.js +3 -2
  401. package/dist/cli-delegate/cmd_prune.js +4 -4
  402. package/dist/cli-delegate/cmd_route_audit.js +3 -3
  403. package/dist/cli-delegate/cmd_route_explain.js +1 -1
  404. package/dist/cli-delegate/cmd_session_recycle.js +3 -3
  405. package/dist/cli-delegate/cmd_settings_get.js +15 -9
  406. package/dist/cli-delegate/cmd_settings_migrate.js +4 -4
  407. package/dist/cli-delegate/cmd_settings_set.js +54 -11
  408. package/dist/cli-delegate/cmd_sync.js +4 -4
  409. package/dist/cli-delegate/cmd_uninstall.js +4 -4
  410. package/dist/cli-delegate/cmd_update.js +1 -1
  411. package/dist/cli-delegate/cmd_upgrade.js +1 -1
  412. package/dist/cli-delegate/cmd_validate.js +4 -4
  413. package/dist/cli-delegate/cmd_versions.js +1 -1
  414. package/dist/discovery/deprecation-report.md +1 -1
  415. package/dist/discovery/discovery-manifest.json +25 -78
  416. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  417. package/dist/discovery/discovery-manifest.summary.md +3 -3
  418. package/dist/discovery/dormancy-report.md +1 -1
  419. package/dist/discovery/orphan-report.md +1 -1
  420. package/dist/discovery/packs.json +5 -7
  421. package/dist/discovery/trust-report.md +2 -2
  422. package/dist/discovery/workspaces.json +4 -6
  423. package/dist/hooks/dispatch.js +9684 -9304
  424. package/dist/install/install.mjs +36 -8
  425. package/dist/mcp/registry-manifest.json +3 -3
  426. package/dist/mcp/server.json +2 -2
  427. package/dist/mcp/server.mjs +2147 -1470
  428. package/dist/router.json +1 -1
  429. package/dist/scripts/_lib/agent_settings.js +73 -0
  430. package/dist/scripts/_lib/agent_src.js +20 -0
  431. package/dist/scripts/_lib/guidelines_lane.js +158 -0
  432. package/dist/scripts/_lib/installed_lock.js +1 -1
  433. package/dist/scripts/condense.js +2 -5
  434. package/dist/server/io/yamlIO.js +175 -17
  435. package/dist/server/schemas/settings.js +18 -4
  436. package/dist/shared/settingsSurface.js +6 -1
  437. package/docs/contracts/settings-classes.md +18 -9
  438. package/docs/guidelines/abstraction-thresholds.md +35 -0
  439. package/docs/guidelines/agent-infra/active-remediation-mechanics.md +3 -3
  440. package/docs/guidelines/agent-infra/false-green.md +2 -2
  441. package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
  442. package/docs/guidelines/agent-infra/skill-quality-checklist.md +1 -1
  443. package/docs/guidelines/design-fidelity-mechanics.md +4 -0
  444. package/docs/guidelines/design-fidelity-routing.md +78 -0
  445. package/docs/guidelines/design-reconciliation.md +172 -0
  446. package/docs/guidelines/gtm-handoff.md +2 -2
  447. package/docs/guidelines/wing4-handoff.md +2 -2
  448. package/package.json +7 -3
  449. package/src/config/agent-settings.template.yml +55 -8
  450. package/src/config/ci-local-parity.yml +34 -0
  451. package/src/config/continuity-surface.json +11 -32
  452. package/src/config/gate-coverage.yml +31 -8
  453. package/src/config/gate-reachability-exemptions.json +1 -0
  454. package/src/config/gate-violation-baselines.json +3 -3
  455. package/src/config/hook-token-budget.json +1 -1
  456. package/src/config/host-injection-effect.json +2 -2
  457. package/src/config/pack-size-budget.json +55 -4
  458. package/src/config/platform-anchor.json +47 -0
  459. package/src/config/preamble-payload-budget.json +12 -8
  460. package/src/config/preamble-payload-exceptions.json +28 -0
  461. package/src/config/publish-surface.json +4 -2
  462. package/src/config/ratification-policy.json +7 -0
  463. package/src/config/rule-stub-ceilings.json +16 -9
  464. package/src/scripts/_cli/cmd_settings_get.ts +22 -7
  465. package/src/scripts/_dispatch.bash +3 -1
  466. package/src/scripts/_lib/agent_settings.ts +85 -0
  467. package/src/scripts/_lib/agent_src.ts +21 -0
  468. package/src/scripts/_lib/artifact_maturity.ts +242 -0
  469. package/src/scripts/_lib/base_ref_payload.ts +315 -0
  470. package/src/scripts/_lib/conformance_report.ts +403 -0
  471. package/src/scripts/_lib/continuity_writer.ts +72 -13
  472. package/src/scripts/_lib/design_system_import.ts +20 -0
  473. package/src/scripts/_lib/design_tolerance.ts +281 -0
  474. package/src/scripts/_lib/dropped_decision.ts +142 -0
  475. package/src/scripts/_lib/guidelines_lane.ts +164 -0
  476. package/src/scripts/_lib/installed_lock.ts +1 -1
  477. package/src/scripts/_lib/measured_payload_ceiling.ts +424 -0
  478. package/src/scripts/_lib/obligation_frequency.ts +2 -3
  479. package/src/scripts/_lib/payload_catalogue_completeness.ts +211 -0
  480. package/src/scripts/_lib/platform_anchor.ts +1053 -0
  481. package/src/scripts/_lib/ratification_artifact.ts +278 -0
  482. package/src/scripts/_lib/release_findings_ingest.ts +324 -0
  483. package/src/scripts/_lib/release_tag_dispatch.ts +63 -0
  484. package/src/scripts/_lib/review_baseline.ts +254 -0
  485. package/src/scripts/_lib/review_skipped_record.ts +61 -1
  486. package/src/scripts/_lib/security_lint.ts +23 -2
  487. package/src/scripts/_lib/self_repair.ts +21 -0
  488. package/src/scripts/_lib/session_index_trust.ts +42 -1
  489. package/src/scripts/_lib/standing_bound_ratchet.ts +267 -88
  490. package/src/scripts/_lib/tolerance_shadow.ts +177 -0
  491. package/src/scripts/_lib/turn_end_refusals.ts +51 -4
  492. package/src/scripts/ai_council/redact_low_impact_entry.ts +8 -0
  493. package/src/scripts/autonomy_friction_traffic.ts +379 -0
  494. package/src/scripts/check_beta_review_markers.ts +35 -4
  495. package/src/scripts/check_finding_dispositions.ts +167 -16
  496. package/src/scripts/check_held_object_arrivals.ts +381 -0
  497. package/src/scripts/check_kernel_edit_ratified.ts +462 -0
  498. package/src/scripts/check_loss_class_declared.ts +793 -46
  499. package/src/scripts/check_platform_anchor.ts +390 -0
  500. package/src/scripts/check_preamble_payload_budget.ts +672 -107
  501. package/src/scripts/check_projected_rule_routes.ts +395 -0
  502. package/src/scripts/check_release_published.ts +1 -1
  503. package/src/scripts/check_reply_consistency.ts +86 -17
  504. package/src/scripts/code_graph/cli.ts +6 -0
  505. package/src/scripts/condense.ts +2 -6
  506. package/src/scripts/generate_host_cost_table.ts +354 -0
  507. package/src/scripts/hook_manifest.json +1 -1
  508. package/src/scripts/hook_manifest.yaml +74 -30
  509. package/src/scripts/hooks/block_kernel_rule_writes.ts +12 -2
  510. package/src/scripts/hooks/category_a.ts +1 -1
  511. package/src/scripts/hooks/chain_nudge_hook.ts +311 -25
  512. package/src/scripts/hooks/concern_registry.ts +2 -0
  513. package/src/scripts/hooks/end_review_nudge_hook.ts +101 -21
  514. package/src/scripts/hooks/review_baseline_hook.ts +130 -0
  515. package/src/scripts/hooks/session_eol_hook.ts +68 -154
  516. package/src/scripts/hooks/source_first_gate_hook.ts +12 -0
  517. package/src/scripts/hooks/turn_end_gate_hook.ts +232 -14
  518. package/src/scripts/hooks/ui_route_nudge_hook.ts +52 -15
  519. package/src/scripts/hooks_doctor.ts +4 -1
  520. package/src/scripts/hot_context_hook.ts +41 -401
  521. package/src/scripts/install.ts +1 -1
  522. package/src/scripts/interruption_report.ts +8 -2
  523. package/src/scripts/janitor.ts +8 -1
  524. package/src/scripts/lint_evidence_artifacts.ts +1 -0
  525. package/src/scripts/lint_knowledge_scale.ts +0 -26
  526. package/src/scripts/measure_turn_end_gate.ts +302 -5
  527. package/src/scripts/memory_lookup.ts +9 -9
  528. package/src/scripts/release.ts +52 -64
  529. package/src/scripts/release_drill.ts +193 -14
  530. package/src/scripts/release_env.ts +1 -1
  531. package/src/scripts/release_publication.ts +1 -1
  532. package/src/scripts/report_held_object_arrivals.ts +456 -0
  533. package/src/scripts/report_standing_payload_by_host.ts +7 -7
  534. package/src/scripts/session_memory_index.ts +5 -0
  535. package/src/scripts/sync_agent_settings.ts +394 -12
  536. package/src/server/io/yamlIO.ts +175 -17
  537. package/src/server/schemas/settings.ts +25 -5
  538. package/src/shared/settingsSurface.ts +13 -2
  539. package/src/templates/compact-instructions.md +8 -3
  540. package/dist/agent-src/commands/chat-history/import.md +0 -170
  541. package/dist/agent-src/commands/chat-history.md +0 -63
@@ -0,0 +1,254 @@
1
+ /**
2
+ * Session review baseline — the shape, the path, and the subtraction.
3
+ *
4
+ * WHY IT EXISTS. `end_review_nudge_hook` measures "did this session mutate
5
+ * enough to owe a review" as `git diff --numstat HEAD` plus untracked non-doc
6
+ * files, and its own header records the defect that reading produces: an
7
+ * uncommitted change that PREDATES the session is charged to the session. The
8
+ * header also records why it was not fixed — "no such baseline exists anywhere a
9
+ * `stop` concern can read it (recording one would be new session-wide state, out
10
+ * of this roadmap phase's one-concern scope)".
11
+ *
12
+ * That reason went stale. `session_start` is bound on seven hosts carrying
13
+ * fourteen concerns (`hook_manifest.yaml`), so a per-session baseline has a slot
14
+ * to be written from. The measured cost of leaving it: on an accumulator branch
15
+ * the nudge fired on 1,771 lines of another session's uncommitted work and
16
+ * became noise, which is worse than silence — an advisory that always fires is
17
+ * an advisory nobody reads.
18
+ *
19
+ * ONE MODULE FOR BOTH SIDES, deliberately. The writer is a `session_start`
20
+ * concern and the reader is a `stop` concern; if each owned its own idea of the
21
+ * path or the field names, the reader would silently find nothing and the whole
22
+ * mechanism would degrade to today's behaviour with no signal. That is the same
23
+ * argument `turn_end_refusals.ts` makes for its own shared path, and it is why
24
+ * `BASELINE_STATE_REL` is here rather than in either hook.
25
+ *
26
+ * ONE SELF-REFERENCE, named because it is invisible: the file this concern
27
+ * writes is itself an untracked non-doc file, so in a workspace where
28
+ * `agents/runtime/` is NOT gitignored it is counted by the very measurement it
29
+ * feeds — about six lines, once. This repository ignores that path, so the
30
+ * effect is zero here; a consumer whose ignore file does not cover it sees the
31
+ * nudge's count six lines high for the session.
32
+ *
33
+ * WHAT IT IS NOT. It is not a change set: no paths, no fingerprints, no patch.
34
+ * It answers exactly the question the nudge asks — how many non-doc lines were
35
+ * already dirty when this session began — and nothing else. A path-level ledger
36
+ * is a bigger object with a bigger privacy surface, and nothing in the nudge
37
+ * consumes one.
38
+ */
39
+ import { spawnSync } from 'node:child_process';
40
+ import * as fs from 'node:fs';
41
+ import * as path from 'node:path';
42
+
43
+ /**
44
+ * HEAD at this moment, or null.
45
+ *
46
+ * It lives HERE rather than in the writer because both sides need it and the
47
+ * writer already imports from the reader's module: putting it in the hook would
48
+ * make `end_review_nudge_hook → review_baseline_hook → end_review_nudge_hook` a
49
+ * cycle. The shared module is the only place with no edge back.
50
+ *
51
+ * Null is a real answer and not an error path — a workspace that is not a git
52
+ * repository, or one with no commit yet, has no HEAD, and `applyBaseline`
53
+ * compares null to null happily. What it must never do is throw: one caller runs
54
+ * on session start and the other on the stop path.
55
+ */
56
+ export function currentHeadSha(cwd: string): string | null {
57
+ try {
58
+ const r = spawnSync('git', ['rev-parse', 'HEAD'], { cwd, encoding: 'utf8' });
59
+ if (r.status !== 0) return null;
60
+ const out = (r.stdout ?? '').trim();
61
+ return out === '' ? null : out;
62
+ } catch {
63
+ return null;
64
+ }
65
+ }
66
+
67
+ /** State directory, relative to a workspace root. */
68
+ export const BASELINE_STATE_REL = path.join('agents', 'runtime', 'state', 'review-baseline');
69
+
70
+ export function baselineStateDir(workspaceRoot: string): string {
71
+ return path.join(workspaceRoot, BASELINE_STATE_REL);
72
+ }
73
+
74
+ export function baselineStateFile(workspaceRoot: string, sessionKey: string): string {
75
+ return path.join(baselineStateDir(workspaceRoot), `${sessionKey}.json`);
76
+ }
77
+
78
+ /**
79
+ * Whether a line count is an exact sum or the capped, guaranteed-over-threshold
80
+ * approximation `end_review_nudge_hook` returns past `UNTRACKED_FILE_CAP`.
81
+ *
82
+ * Structurally identical to that module's `MutationMeasure` and deliberately
83
+ * NOT imported from it: this module is the shared floor both hooks sit on, and
84
+ * importing the consumer would put the cycle back that `currentHeadSha` lives
85
+ * here to avoid.
86
+ */
87
+ export type BaselineMeasure = 'exact' | 'capped_approximation';
88
+
89
+ /** What `session_start` records, and `stop` reads back. */
90
+ export interface ReviewBaseline {
91
+ /** HEAD at session start, or null where there is no repo / no commit yet. */
92
+ head_sha: string | null;
93
+ /** Non-doc mutated lines already present when the session began. */
94
+ baseline_lines: number;
95
+ /**
96
+ * Whether `baseline_lines` is exact or the capped approximation.
97
+ *
98
+ * It is recorded because subtracting one kind from the other is arithmetic
99
+ * over two different quantities — the same defect `head_sha` catches on the
100
+ * other axis. The capped path returns `THRESHOLD + 1 + tracked`, a synthetic
101
+ * number chosen to be over the bar rather than to be true, so a session that
102
+ * starts past the cap and then cleans up would have a real `exact` stop
103
+ * measurement reduced by a number that never counted anything.
104
+ *
105
+ * Optional: a record written before this field existed has no measure, and
106
+ * defaulting it to `exact` would assert the more permissive of the two on no
107
+ * evidence. Absent reads as unknown and refuses to subtract.
108
+ */
109
+ measure?: BaselineMeasure;
110
+ written_at: string;
111
+ }
112
+
113
+ /**
114
+ * Why a `stop` read could not subtract. Each value is written into the
115
+ * `review_skipped` telemetry row, because a fallback nobody can see is
116
+ * indistinguishable from the mechanism never having shipped.
117
+ */
118
+ export type BaselineFallback =
119
+ | 'absent' // no file — a host without session_start, or a session older than this
120
+ | 'unreadable' // present and malformed, or unreadable for any non-ENOENT reason
121
+ | 'head-moved' // the session committed, so the baseline's denominator is gone
122
+ | 'mixed-measure'; // one side is a capped approximation and the other is not
123
+
124
+ export type BaselineOutcome =
125
+ | { readonly applied: true; readonly baseline: ReviewBaseline; readonly lines: number }
126
+ | { readonly applied: false; readonly fallback: BaselineFallback; readonly lines: number };
127
+
128
+ export function parseBaseline(raw: string): ReviewBaseline | null {
129
+ let decoded: unknown;
130
+ try {
131
+ decoded = JSON.parse(raw);
132
+ } catch {
133
+ return null;
134
+ }
135
+ if (typeof decoded !== 'object' || decoded === null || Array.isArray(decoded)) return null;
136
+ const o = decoded as Record<string, unknown>;
137
+ const lines = o['baseline_lines'];
138
+ if (typeof lines !== 'number' || !Number.isFinite(lines) || lines < 0) return null;
139
+ const written = o['written_at'];
140
+ if (typeof written !== 'string') return null;
141
+ const head = o['head_sha'];
142
+ const measure = o['measure'];
143
+ return {
144
+ head_sha: typeof head === 'string' && head !== '' ? head : null,
145
+ baseline_lines: lines,
146
+ ...(measure === 'exact' || measure === 'capped_approximation' ? { measure } : {}),
147
+ written_at: written,
148
+ };
149
+ }
150
+
151
+ /**
152
+ * The baseline, or WHICH of the two not-found states applies.
153
+ *
154
+ * `absent` and `unreadable` are kept apart all the way to the telemetry row,
155
+ * and collapsing them would have been the easy shape: both mean "cannot
156
+ * subtract", both fall back identically. They are different findings. `absent`
157
+ * is the expected steady state on a host with no `session_start` slot and on
158
+ * every session that started before this shipped; `unreadable` is a corrupt
159
+ * write, and a rate of it above noise is a defect in this mechanism rather than
160
+ * a property of the host. A single bucket would hide the second inside the
161
+ * first, which is the population it is smallest against.
162
+ */
163
+ export function readBaseline(
164
+ workspaceRoot: string,
165
+ sessionKey: string,
166
+ ): ReviewBaseline | 'absent' | 'unreadable' {
167
+ const file = baselineStateFile(workspaceRoot, sessionKey);
168
+ let raw: string;
169
+ try {
170
+ raw = fs.readFileSync(file, 'utf-8');
171
+ } catch (exc) {
172
+ // ONLY a genuinely missing file is `absent`. Every other IO failure —
173
+ // EACCES, EISDIR, EMFILE — is a defect in this mechanism, which is the
174
+ // population `unreadable` exists to make visible; routing them all to
175
+ // `absent` would bury them inside the one bucket that is legitimately
176
+ // large on every host without a session_start slot.
177
+ const code = (exc as NodeJS.ErrnoException | null)?.code;
178
+ return code === 'ENOENT' ? 'absent' : 'unreadable';
179
+ }
180
+ return parseBaseline(raw) ?? 'unreadable';
181
+ }
182
+
183
+ /**
184
+ * Apply the baseline to a measured line count.
185
+ *
186
+ * FAIL OPEN, NEVER SILENT — the three not-applied branches all return the
187
+ * UNSUBTRACTED count, so every failure mode of this mechanism degrades to
188
+ * exactly the behaviour that shipped before it. The alternative, returning zero
189
+ * or refusing to fire, would let a missing state file silence a genuine review
190
+ * obligation, and a safety advisory must not be disarmed by its own
191
+ * instrumentation failing.
192
+ *
193
+ * `head-moved` is the branch worth naming, and worth naming honestly: it is
194
+ * TERMINAL for the session. A session that committed mid-run moved HEAD, so
195
+ * `git diff HEAD` now measures against a different base than the baseline did
196
+ * and the subtraction is arithmetic over two different quantities. It is caught
197
+ * rather than absorbed, because absorbing it would UNDER-report on exactly the
198
+ * sessions that did the most work — but the baseline is written once per
199
+ * session and never refreshed, so from the first commit onward that session is
200
+ * charged for the whole pre-existing dirty tree again. The mechanism's useful
201
+ * life is "until this session's first commit", which is stated here rather than
202
+ * discovered later. Re-baselining after a commit is the obvious repair and is
203
+ * NOT taken here: a second write has to distinguish "HEAD moved because we
204
+ * committed our own work" from "a peer session committed underneath us", and
205
+ * nothing in a stop payload answers that.
206
+ *
207
+ * `mixed-measure` is the same defect on the third axis, and it covers the
208
+ * SYMMETRIC case too. Past `UNTRACKED_FILE_CAP` the measurement is a synthetic
209
+ * `THRESHOLD + 1 + tracked` chosen to be over the bar rather than to be true, so
210
+ * subtracting it from — or out of — an exact count is meaningless in both
211
+ * directions; and subtracting one capped reading from another cancels the
212
+ * constant, which is worse than meaningless because it silences the nudge. The
213
+ * name is kept over a more literal `not-both-exact` because the fallback's
214
+ * subject is the measure, and a telemetry enum is read far more often than it is
215
+ * renamed.
216
+ *
217
+ * The clamp at zero is not cosmetic either: a session that reverts part of a
218
+ * pre-existing dirty tree measures below its own baseline, and a negative
219
+ * comparison against the threshold would read as "no mutation" for a session
220
+ * that deleted a thousand lines.
221
+ */
222
+ export function applyBaseline(
223
+ measuredLines: number,
224
+ baseline: ReviewBaseline | 'absent' | 'unreadable',
225
+ headSha: () => string | null,
226
+ measuredMeasure: BaselineMeasure = 'exact',
227
+ ): BaselineOutcome {
228
+ if (baseline === 'absent' || baseline === 'unreadable') {
229
+ return { applied: false, fallback: baseline, lines: measuredLines };
230
+ }
231
+ // The measure check runs BEFORE the HEAD check because it needs no subprocess.
232
+ // `headSha` is a thunk for the same reason: on the two fallback branches above
233
+ // — the steady state on every host without the nudge, and on every session
234
+ // before its first baseline write — the value is discarded, and evaluating it
235
+ // eagerly spent an 11-14 ms `git rev-parse` on each of those stops.
236
+ // Refused when the two measures DISAGREE, and equally when both are capped.
237
+ // The symmetric case is the dangerous one and the first version missed it:
238
+ // the capped path returns `THRESHOLD + 1 + tracked`, so two capped readings
239
+ // cancel their synthetic constant and an untracked-only session that started
240
+ // past the cap subtracts to ZERO — silencing the nudge, which is the one
241
+ // direction this module's own header forbids. Only `exact` minus `exact` is
242
+ // arithmetic over two counts of the same thing.
243
+ if (baseline.measure !== 'exact' || measuredMeasure !== 'exact') {
244
+ return { applied: false, fallback: 'mixed-measure', lines: measuredLines };
245
+ }
246
+ if (baseline.head_sha !== headSha()) {
247
+ return { applied: false, fallback: 'head-moved', lines: measuredLines };
248
+ }
249
+ return {
250
+ applied: true,
251
+ baseline,
252
+ lines: Math.max(0, measuredLines - baseline.baseline_lines),
253
+ };
254
+ }
@@ -34,6 +34,49 @@
34
34
  */
35
35
  export type MutationMeasure = 'exact' | 'capped_approximation';
36
36
 
37
+ /**
38
+ * Whether `diff_lines` had this session's start-of-session baseline subtracted,
39
+ * and when it did not, WHY.
40
+ *
41
+ * A closed enum, never free text, so the privacy floor below still holds by
42
+ * construction. It exists because the subtraction's failure modes all fall back
43
+ * to the unsubtracted count — which is the safe direction and also an invisible
44
+ * one: without this field, a line reading 1,771 cannot be told apart from a
45
+ * session that really did mutate 1,771 lines.
46
+ *
47
+ * WHAT IT MEASURES, and the half it cannot. This line is written only when the
48
+ * nudge FIRES, so the distribution here is the fallback rate among firing
49
+ * sessions. The sessions the subtraction silenced — the mechanism working —
50
+ * produce no line at all, so the silence rate is NOT observable from this
51
+ * stream and no clause here should be read as claiming it is. Recording a row
52
+ * for a nudge that did not fire would put a `review_skipped` event in the audit
53
+ * log for a session where no review was skipped, which is a worse defect than
54
+ * the blind spot; measuring it properly needs a counter of its own, and that is
55
+ * a decision rather than an oversight.
56
+ *
57
+ * `absent` is the expected steady state on a host with no `session_start` slot
58
+ * and on every session that predates the baseline concern; `unreadable` is a
59
+ * corrupt write and a rate above noise is a defect in the mechanism itself;
60
+ * `head_moved` is a session that committed mid-run, which moves `git diff
61
+ * HEAD`'s base and makes the subtraction arithmetic over two different
62
+ * quantities; `mixed_measure` is the same failure on the capped-approximation
63
+ * axis, where one side is a synthetic over-threshold number rather than a count.
64
+ */
65
+ export type BaselineApplication =
66
+ | 'applied'
67
+ | 'absent'
68
+ | 'unreadable'
69
+ | 'head_moved'
70
+ | 'mixed_measure';
71
+
72
+ const BASELINE_APPLICATIONS: readonly BaselineApplication[] = [
73
+ 'applied',
74
+ 'absent',
75
+ 'unreadable',
76
+ 'head_moved',
77
+ 'mixed_measure',
78
+ ];
79
+
37
80
  import { appliedIds } from './audit_field_provenance.js';
38
81
  import type { NoFreeForm } from './runtime_journal.js';
39
82
  import { type PrivacyClass } from './privacy_class.js';
@@ -51,6 +94,13 @@ export interface ReviewSkippedInput {
51
94
  diff_lines: number;
52
95
  /** Whether `diff_lines` is exact or a capped approximation — see above. */
53
96
  mutation_measure: MutationMeasure;
97
+ /**
98
+ * Whether the session baseline was subtracted from `diff_lines`, and if not
99
+ * why. OPTIONAL, and absence is honest rather than a default: a line written
100
+ * by a producer that predates the baseline mechanism recorded nothing about
101
+ * it, and writing `absent` for those would assert a measurement nobody made.
102
+ */
103
+ baseline?: BaselineApplication | undefined;
54
104
  /** ISO-8601 UTC timestamp; caller supplies (keeps this fn pure/deterministic). */
55
105
  ts: string;
56
106
  /** Stable id (ULID, UUID, or content hash); caller supplies. */
@@ -103,6 +153,9 @@ export function buildReviewSkippedLine(input: ReviewSkippedInput): BuiltReviewSk
103
153
  }
104
154
  if (!input.ts) errors.push('ts (ISO-8601 UTC) is required');
105
155
  if (!input.id) errors.push('id (ULID, UUID, or content hash) is required');
156
+ if (input.baseline !== undefined && !BASELINE_APPLICATIONS.includes(input.baseline)) {
157
+ errors.push(`baseline must be one of ${BASELINE_APPLICATIONS.join(', ')}`);
158
+ }
106
159
 
107
160
  if (errors.length) return { line: null, errors };
108
161
 
@@ -131,7 +184,14 @@ export function buildReviewSkippedLine(input: ReviewSkippedInput): BuiltReviewSk
131
184
  persona: null,
132
185
  input_kind: 'prompt',
133
186
  type: 'note',
134
- review_skipped: { diff_lines: input.diff_lines, mutation_measure: input.mutation_measure },
187
+ review_skipped: {
188
+ diff_lines: input.diff_lines,
189
+ mutation_measure: input.mutation_measure,
190
+ // Omitted, not defaulted, when the producer recorded nothing —
191
+ // audit-log-v1's absent-versus-present split is the same one
192
+ // `skills_applied` uses above, for the same reason.
193
+ ...(input.baseline === undefined ? {} : { baseline: input.baseline }),
194
+ },
135
195
  };
136
196
 
137
197
  return { line, errors: [] };
@@ -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`,