@event4u/agent-config 14.22.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 (557) 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 +333 -356
  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 +48 -39
  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 +9 -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 +13 -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 +36 -25
  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/scripts/archive_completed_roadmaps.ts +106 -4
  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-intelligence/SKILL.md +57 -1
  260. package/dist/agent-src/skills/code-refactoring/SKILL.md +3 -3
  261. package/dist/agent-src/skills/code-review/SKILL.md +3 -3
  262. package/dist/agent-src/skills/command-writing/SKILL.md +3 -3
  263. package/dist/agent-src/skills/comp-banding/SKILL.md +1 -1
  264. package/dist/agent-src/skills/competitive-moat-analysis/SKILL.md +1 -1
  265. package/dist/agent-src/skills/competitive-positioning/SKILL.md +2 -2
  266. package/dist/agent-src/skills/complexity-first-planning/SKILL.md +1 -1
  267. package/dist/agent-src/skills/condense-memory/SKILL.md +1 -1
  268. package/dist/agent-src/skills/content-funnel-design/SKILL.md +2 -2
  269. package/dist/agent-src/skills/contracts-cognition/SKILL.md +1 -1
  270. package/dist/agent-src/skills/copilot-agents-optimization/SKILL.md +2 -2
  271. package/dist/agent-src/skills/corpus-grounding/SKILL.md +2 -2
  272. package/dist/agent-src/skills/customer-research/SKILL.md +2 -2
  273. package/dist/agent-src/skills/dashboard-design/SKILL.md +1 -1
  274. package/dist/agent-src/skills/data-handling-judgment/SKILL.md +1 -1
  275. package/dist/agent-src/skills/deal-qualification-meddic/SKILL.md +2 -2
  276. package/dist/agent-src/skills/decision-record/SKILL.md +3 -3
  277. package/dist/agent-src/skills/decision-review/SKILL.md +8 -8
  278. package/dist/agent-src/skills/deep-reading-analyst/SKILL.md +22 -22
  279. package/dist/agent-src/skills/design-intelligence/SKILL.md +4 -4
  280. package/dist/agent-src/skills/design-intelligence/references/context-and-registers.md +2 -2
  281. package/dist/agent-src/skills/design-review/SKILL.md +4 -4
  282. package/dist/agent-src/skills/design-system-capture/references/design-system-json.md +20 -1
  283. package/dist/agent-src/skills/design-tokens/SKILL.md +17 -2
  284. package/dist/agent-src/skills/design-variations/SKILL.md +2 -2
  285. package/dist/agent-src/skills/developer-like-execution/SKILL.md +2 -2
  286. package/dist/agent-src/skills/discovery-interview/SKILL.md +2 -2
  287. package/dist/agent-src/skills/doc-coauthoring/SKILL.md +3 -3
  288. package/dist/agent-src/skills/editorial-calendar/SKILL.md +2 -2
  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/git-workflow/references/push-closes-its-loop.md +9 -0
  305. package/dist/agent-src/skills/gtm-launch/SKILL.md +2 -2
  306. package/dist/agent-src/skills/hiring-loop-design/SKILL.md +1 -1
  307. package/dist/agent-src/skills/html-deck/SKILL.md +5 -5
  308. package/dist/agent-src/skills/humanizer/SKILL.md +1 -1
  309. package/dist/agent-src/skills/humanizer/data/patterns.md +1 -1
  310. package/dist/agent-src/skills/iconography/SKILL.md +3 -3
  311. package/dist/agent-src/skills/judge-synthesis/SKILL.md +1 -1
  312. package/dist/agent-src/skills/laravel-api-endpoint/SKILL.md +2 -2
  313. package/dist/agent-src/skills/launch-readiness/SKILL.md +3 -3
  314. package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +6 -6
  315. package/dist/agent-src/skills/livewire/SKILL.md +1 -1
  316. package/dist/agent-src/skills/market-entry-analysis/SKILL.md +1 -1
  317. package/dist/agent-src/skills/mcp-builder/SKILL.md +1 -1
  318. package/dist/agent-src/skills/memory-consolidation/SKILL.md +3 -3
  319. package/dist/agent-src/skills/messaging-architecture/SKILL.md +2 -2
  320. package/dist/agent-src/skills/monorepo-workspace/SKILL.md +1 -1
  321. package/dist/agent-src/skills/onboarding-design/SKILL.md +2 -2
  322. package/dist/agent-src/skills/onboarding-program/SKILL.md +1 -1
  323. package/dist/agent-src/skills/one-on-one-cadence/SKILL.md +1 -1
  324. package/dist/agent-src/skills/org-design/SKILL.md +1 -1
  325. package/dist/agent-src/skills/overbuild-review-lens/SKILL.md +3 -3
  326. package/dist/agent-src/skills/override-management/SKILL.md +1 -1
  327. package/dist/agent-src/skills/perf-feedback-craft/SKILL.md +1 -1
  328. package/dist/agent-src/skills/persona-writing/SKILL.md +1 -1
  329. package/dist/agent-src/skills/php-coder/SKILL.md +1 -1
  330. package/dist/agent-src/skills/pipeline-strategy/SKILL.md +2 -2
  331. package/dist/agent-src/skills/playwright-testing/SKILL.md +3 -3
  332. package/dist/agent-src/skills/po-discovery/SKILL.md +1 -1
  333. package/dist/agent-src/skills/positioning-strategy/SKILL.md +2 -2
  334. package/dist/agent-src/skills/privacy-review/SKILL.md +1 -1
  335. package/dist/agent-src/skills/prompt-optimizer/SKILL.md +3 -3
  336. package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +1 -1
  337. package/dist/agent-src/skills/reasoning-orchestrator/SKILL.md +2 -2
  338. package/dist/agent-src/skills/receiving-code-review/SKILL.md +1 -1
  339. package/dist/agent-src/skills/refine-ticket/SKILL.md +2 -2
  340. package/dist/agent-src/skills/release-comms/SKILL.md +2 -2
  341. package/dist/agent-src/skills/retention-loops/SKILL.md +2 -2
  342. package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
  343. package/dist/agent-src/skills/roadmap-management/SKILL.md +1 -1
  344. package/dist/agent-src/skills/roadmap-management/references/archival.md +1 -1
  345. package/dist/agent-src/skills/roadmap-writing/SKILL.md +5 -5
  346. package/dist/agent-src/skills/rule-writing/SKILL.md +6 -6
  347. package/dist/agent-src/skills/runway-cognition/SKILL.md +2 -2
  348. package/dist/agent-src/skills/scenario-modeling/SKILL.md +2 -2
  349. package/dist/agent-src/skills/skill-writing/SKILL.md +2 -2
  350. package/dist/agent-src/skills/skill-writing/references/procedure.md +1 -1
  351. package/dist/agent-src/skills/skill-writing/references/section-patterns.md +3 -3
  352. package/dist/agent-src/skills/spreadsheet-authoring/SKILL.md +1 -1
  353. package/dist/agent-src/skills/stakeholder-tradeoff/SKILL.md +3 -3
  354. package/dist/agent-src/skills/subagent-orchestration/SKILL.md +1 -1
  355. package/dist/agent-src/skills/supply-chain-intake/SKILL.md +1 -1
  356. package/dist/agent-src/skills/systematic-debugging/SKILL.md +2 -2
  357. package/dist/agent-src/skills/tailwind-engineer/SKILL.md +60 -4
  358. package/dist/agent-src/skills/throughput-vs-morale-tradeoff/SKILL.md +1 -1
  359. package/dist/agent-src/skills/token-optimizer/SKILL.md +1 -1
  360. package/dist/agent-src/skills/typography-system/SKILL.md +2 -2
  361. package/dist/agent-src/skills/ui-component-architect/SKILL.md +28 -8
  362. package/dist/agent-src/skills/unit-economics-modeling/SKILL.md +2 -2
  363. package/dist/agent-src/skills/upstream-contribute/SKILL.md +1 -1
  364. package/dist/agent-src/skills/validate-feature-fit/SKILL.md +2 -2
  365. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +2 -2
  366. package/dist/agent-src/skills/vision-articulation/SKILL.md +1 -1
  367. package/dist/agent-src/skills/voc-extract/SKILL.md +2 -2
  368. package/dist/agent-src/skills/voice-and-tone-design/SKILL.md +2 -2
  369. package/dist/agent-src/skills/wireframe/SKILL.md +1 -1
  370. package/dist/agent-src/skills/workspace-link/SKILL.md +1 -1
  371. package/dist/agent-src/templates/agent-settings.md +6 -6
  372. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  373. package/dist/agent-src/templates/contexts/knowledge-pages.md +2 -3
  374. package/dist/agent-src/templates/copilot-instructions.md +1 -1
  375. package/dist/agent-src/templates/roadmaps.md +1 -1
  376. package/dist/agent-src/templates/scripts/README.md +2 -2
  377. package/dist/agent-src/user-types/_template/user-type.md +1 -1
  378. package/dist/cli/registry.js +1 -1
  379. package/dist/cli-delegate/archive_completed_roadmaps.js +52 -4
  380. package/dist/cli-delegate/check_update_banner.js +12 -1
  381. package/dist/cli-delegate/{chunk-TGIPZBCW.js → chunk-2KKXJW25.js} +22 -8
  382. package/dist/cli-delegate/{chunk-NLP54U3J.js → chunk-2XY7ILBT.js} +13 -1
  383. package/dist/cli-delegate/{chunk-4FS4WRXP.js → chunk-3FKR64R5.js} +34 -6
  384. package/dist/cli-delegate/{chunk-J3RFNKG4.js → chunk-55ACLDUE.js} +2 -2
  385. package/dist/cli-delegate/{chunk-PKOBQADP.js → chunk-57PN4GYJ.js} +1 -1
  386. package/dist/cli-delegate/{chunk-BIXEDQPZ.js → chunk-AK6HODNQ.js} +4 -4
  387. package/dist/cli-delegate/{chunk-2FTMENJL.js → chunk-GYC3VRYN.js} +1 -1
  388. package/dist/cli-delegate/{chunk-LWTYTX6F.js → chunk-HZ52BRGG.js} +24 -18
  389. package/dist/cli-delegate/{chunk-6RJA2F5A.js → chunk-IVBPRCQO.js} +1 -1
  390. package/dist/cli-delegate/{chunk-I6RHFQEG.js → chunk-YUM5KURG.js} +17 -1
  391. package/dist/cli-delegate/cmd_analyze_session.js +1 -1
  392. package/dist/cli-delegate/cmd_brand_status.js +1 -1
  393. package/dist/cli-delegate/cmd_conformance.js +3 -3
  394. package/dist/cli-delegate/cmd_doctor.js +3 -3
  395. package/dist/cli-delegate/cmd_explain.js +2 -2
  396. package/dist/cli-delegate/cmd_export.js +4 -4
  397. package/dist/cli-delegate/cmd_handoff.js +24 -16
  398. package/dist/cli-delegate/cmd_mcp_available.js +1 -1
  399. package/dist/cli-delegate/cmd_memory_get.js +1 -1
  400. package/dist/cli-delegate/cmd_migrate.js +2 -2
  401. package/dist/cli-delegate/cmd_packs_active.js +2 -2
  402. package/dist/cli-delegate/cmd_prune.js +4 -4
  403. package/dist/cli-delegate/cmd_route_audit.js +3 -3
  404. package/dist/cli-delegate/cmd_route_explain.js +1 -1
  405. package/dist/cli-delegate/cmd_session_recycle.js +4 -14
  406. package/dist/cli-delegate/cmd_settings_get.js +15 -9
  407. package/dist/cli-delegate/cmd_settings_migrate.js +4 -4
  408. package/dist/cli-delegate/cmd_settings_set.js +41 -11
  409. package/dist/cli-delegate/cmd_sync.js +4 -4
  410. package/dist/cli-delegate/cmd_uninstall.js +4 -4
  411. package/dist/cli-delegate/cmd_update.js +1 -1
  412. package/dist/cli-delegate/cmd_upgrade.js +1 -1
  413. package/dist/cli-delegate/cmd_validate.js +4 -4
  414. package/dist/cli-delegate/cmd_versions.js +1 -1
  415. package/dist/discovery/deprecation-report.md +1 -1
  416. package/dist/discovery/discovery-manifest.json +27 -80
  417. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  418. package/dist/discovery/discovery-manifest.summary.md +3 -3
  419. package/dist/discovery/dormancy-report.md +1 -1
  420. package/dist/discovery/orphan-report.md +1 -1
  421. package/dist/discovery/packs.json +5 -7
  422. package/dist/discovery/trust-report.md +2 -2
  423. package/dist/discovery/workspaces.json +4 -6
  424. package/dist/hooks/dispatch.js +9249 -8981
  425. package/dist/install/install.mjs +47 -8
  426. package/dist/mcp/registry-manifest.json +3 -3
  427. package/dist/mcp/server.json +2 -2
  428. package/dist/mcp/server.mjs +5496 -2400
  429. package/dist/router.json +1 -1
  430. package/dist/scripts/_lib/agent_settings.js +73 -0
  431. package/dist/scripts/_lib/agent_src.js +20 -0
  432. package/dist/scripts/_lib/guidelines_lane.js +158 -0
  433. package/dist/scripts/_lib/lean_projection_mode.js +108 -0
  434. package/dist/scripts/_lib/router_match.js +243 -0
  435. package/dist/scripts/_lib/rule_injection.js +216 -0
  436. package/dist/scripts/condense.js +22 -25
  437. package/dist/scripts/project_thin_rules.js +139 -19
  438. package/dist/server/io/yamlIO.js +125 -17
  439. package/dist/server/schemas/settings.js +32 -5
  440. package/dist/shared/settingsSurface.js +6 -1
  441. package/docs/MIGRATION.md +56 -0
  442. package/docs/contracts/settings-classes.md +48 -7
  443. package/docs/guidelines/abstraction-thresholds.md +35 -0
  444. package/docs/guidelines/agent-infra/active-remediation-mechanics.md +3 -3
  445. package/docs/guidelines/agent-infra/false-green.md +2 -2
  446. package/docs/guidelines/agent-infra/notes-horizon-mechanics.md +90 -0
  447. package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
  448. package/docs/guidelines/agent-infra/skill-quality-checklist.md +1 -1
  449. package/docs/guidelines/design-fidelity-mechanics.md +4 -0
  450. package/docs/guidelines/design-fidelity-routing.md +78 -0
  451. package/docs/guidelines/design-reconciliation.md +172 -0
  452. package/docs/guidelines/gtm-handoff.md +2 -2
  453. package/docs/guidelines/wing4-handoff.md +2 -2
  454. package/llms.txt +1 -1
  455. package/package.json +7 -3
  456. package/src/agent-src/scripts/archive_completed_roadmaps.ts +106 -4
  457. package/src/config/agent-settings.template.yml +94 -1
  458. package/src/config/ci-local-parity.yml +34 -0
  459. package/src/config/continuity-surface.json +8 -29
  460. package/src/config/evaluator-budgets.json +4 -4
  461. package/src/config/gate-coverage.yml +31 -8
  462. package/src/config/gate-reachability-exemptions.json +1 -0
  463. package/src/config/gate-violation-baselines.json +3 -3
  464. package/src/config/hook-token-budget.json +8 -7
  465. package/src/config/host-injection-effect.json +2 -2
  466. package/src/config/pack-size-budget.json +55 -4
  467. package/src/config/packed-binary-manifest.json +1 -1
  468. package/src/config/platform-anchor.json +47 -0
  469. package/src/config/preamble-payload-budget.json +2 -3
  470. package/src/config/publish-surface.json +4 -2
  471. package/src/config/ratification-policy.json +7 -0
  472. package/src/config/routing-coverage-seed.json +9 -2
  473. package/src/config/rule-stub-ceilings.json +16 -9
  474. package/src/scripts/_cli/cmd_session_recycle.ts +2 -25
  475. package/src/scripts/_cli/cmd_settings_get.ts +22 -7
  476. package/src/scripts/_cli/handoff_sessions.ts +14 -44
  477. package/src/scripts/_lib/agent_settings.ts +85 -0
  478. package/src/scripts/_lib/agent_src.ts +21 -0
  479. package/src/scripts/_lib/artifact_maturity.ts +242 -0
  480. package/src/scripts/_lib/conformance_report.ts +403 -0
  481. package/src/scripts/_lib/continuity_slot.ts +295 -0
  482. package/src/scripts/_lib/continuity_writer.ts +312 -0
  483. package/src/scripts/_lib/design_system_import.ts +20 -0
  484. package/src/scripts/_lib/design_tolerance.ts +281 -0
  485. package/src/scripts/_lib/guidelines_lane.ts +164 -0
  486. package/src/scripts/_lib/hook_settings.ts +85 -0
  487. package/src/scripts/_lib/lean_projection_mode.ts +127 -0
  488. package/src/scripts/_lib/obligation_frequency.ts +2 -3
  489. package/src/scripts/_lib/packed_binary_predicate.ts +37 -0
  490. package/src/scripts/_lib/platform_anchor.ts +1053 -0
  491. package/src/scripts/_lib/ratification_artifact.ts +278 -0
  492. package/src/scripts/_lib/recycle_envelope_paths.ts +109 -21
  493. package/src/scripts/_lib/regression_neighbourhood.ts +159 -22
  494. package/src/scripts/_lib/security_lint.ts +23 -2
  495. package/src/scripts/_lib/self_repair.ts +21 -0
  496. package/src/scripts/_lib/session_eol.ts +44 -0
  497. package/src/scripts/_lib/session_index_trust.ts +387 -0
  498. package/src/scripts/_lib/standing_bound_ratchet.ts +220 -0
  499. package/src/scripts/_lib/tolerance_shadow.ts +177 -0
  500. package/src/scripts/_lib/vendored_grammar_upstream.ts +280 -0
  501. package/src/scripts/ai_council/redact_low_impact_entry.ts +8 -0
  502. package/src/scripts/audit_mcp_tools.ts +69 -25
  503. package/src/scripts/autonomy_friction_traffic.ts +379 -0
  504. package/src/scripts/build_mcp_catalog.ts +24 -1
  505. package/src/scripts/check_host_tree_parity.ts +291 -0
  506. package/src/scripts/check_kernel_edit_ratified.ts +462 -0
  507. package/src/scripts/check_loss_class_declared.ts +793 -46
  508. package/src/scripts/check_platform_anchor.ts +390 -0
  509. package/src/scripts/check_preamble_payload_budget.ts +424 -7
  510. package/src/scripts/check_projected_rule_routes.ts +395 -0
  511. package/src/scripts/check_rule_projection_integrity.ts +102 -2
  512. package/src/scripts/ci_settle.ts +205 -5
  513. package/src/scripts/code_graph/build.ts +79 -0
  514. package/src/scripts/code_graph/cli.ts +264 -7
  515. package/src/scripts/code_graph/detect.ts +38 -0
  516. package/src/scripts/code_graph/query.ts +25 -2
  517. package/src/scripts/code_graph/sqlite_store.ts +16 -1
  518. package/src/scripts/code_graph/types.ts +52 -3
  519. package/src/scripts/code_graph/validate.ts +3 -1
  520. package/src/scripts/code_graph/verbs.ts +590 -0
  521. package/src/scripts/condense.ts +22 -26
  522. package/src/scripts/generate_host_cost_table.ts +354 -0
  523. package/src/scripts/handoff_context_hook.ts +39 -1
  524. package/src/scripts/hook_manifest.json +1 -1
  525. package/src/scripts/hook_manifest.yaml +59 -28
  526. package/src/scripts/hooks/block_speaking_inbox_dir.ts +182 -16
  527. package/src/scripts/hooks/category_a.ts +1 -1
  528. package/src/scripts/hooks/chain_nudge_hook.ts +311 -25
  529. package/src/scripts/hooks/code_graph_context_hook.ts +7 -18
  530. package/src/scripts/hooks/push_settle_hook.ts +3 -2
  531. package/src/scripts/hooks/rule_inject_hook.ts +107 -20
  532. package/src/scripts/hooks/session_eol_hook.ts +177 -145
  533. package/src/scripts/hooks/source_first_gate_hook.ts +12 -0
  534. package/src/scripts/hooks/ui_route_nudge_hook.ts +52 -15
  535. package/src/scripts/hot_context_hook.ts +103 -408
  536. package/src/scripts/lint_evidence_artifacts.ts +1 -0
  537. package/src/scripts/lint_knowledge_scale.ts +0 -26
  538. package/src/scripts/lint_roadmap_blockers.ts +164 -1
  539. package/src/scripts/mcp_server/consumer_tool_catalog.json +152 -2
  540. package/src/scripts/mcp_server/graph_tools.ts +294 -0
  541. package/src/scripts/mcp_server/path_util.ts +31 -0
  542. package/src/scripts/mcp_server/tool_catalog_source.ts +7 -1
  543. package/src/scripts/mcp_server/tools.ts +3 -13
  544. package/src/scripts/memory_lookup.ts +9 -9
  545. package/src/scripts/model_rule_injection.ts +61 -4
  546. package/src/scripts/project_thin_rules.ts +149 -16
  547. package/src/scripts/report_standing_payload_by_host.ts +650 -0
  548. package/src/scripts/schemas/agent-settings.schema.json +7 -1
  549. package/src/scripts/session_memory_index.ts +86 -8
  550. package/src/scripts/sync_agent_settings.ts +270 -10
  551. package/src/server/io/yamlIO.ts +127 -17
  552. package/src/server/schemas/settings.ts +45 -6
  553. package/src/shared/settingsSurface.ts +13 -2
  554. package/src/templates/compact-instructions.md +8 -3
  555. package/src/vendor/grammars/README.md +27 -2
  556. package/dist/agent-src/commands/chat-history/import.md +0 -170
  557. package/dist/agent-src/commands/chat-history.md +0 -63
@@ -1,7 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * session-eol — Stop-slot session end-of-life instrument + recycle advisory
4
- * (road-to-token-economy-recycling Phases 1.1 / 3.2 / 4.2).
3
+ * session-eol — Stop-slot session end-of-life instrument + automatic
4
+ * continuity record (road-to-token-economy-recycling Phases 1.1 / 3.2 / 4.2,
5
+ * road-to-continuity-writer-activation Phase 1 and step 3.2).
5
6
  *
6
7
  * Phase 1.1 (record-only): per session, maintain counts-only end-of-life
7
8
  * state — final main-chain context size in parsed tokens (via
@@ -10,22 +11,31 @@
10
11
  * `agents/runtime/state/session-eol/<sha256(session)>.json`. Incremental:
11
12
  * each Stop reads only the transcript bytes appended since the last scan.
12
13
  *
13
- * Phase 3.2 (advisory, once per session): past the committed recycle
14
- * threshold (`src/config/recycle-threshold-budget.json`), inject ONE line
15
- * advising `session:recycle` — the F2 once-per-session pattern of
16
- * `end_review_nudge_hook.ts`. Absent/unreadable config or transcript is
17
- * SILENCE, never a block (fail-open); hooks cannot inject `/clear`, so the
18
- * recycle action itself stays advisory-carried by design (roadmap 5.1).
14
+ * Phase 3.2 — RETIRED 2026-09-10 (road-to-continuity-writer-activation step
15
+ * 3.2). This hook used to inject one line past the committed recycle threshold
16
+ * (`src/config/recycle-threshold-budget.json`) advising a human to run
17
+ * `agent-config session:recycle` before `/clear`, plus a second line when that
18
+ * advice had been given and no envelope had appeared. Both are gone. They
19
+ * existed because nothing else wrote the continuity record, and
20
+ * `writeContinuityRecord` below now does — armed by default since the same
21
+ * change, on an AI-council verdict of 2026-09-10 (2 seats, convergent, under
22
+ * the owner's written delegation). An advisory telling a human to do by hand
23
+ * what the concern now does on its own is a manual action on the normal path,
24
+ * which is what step 3.2 removes and what `check_continuity_surface` counts on
25
+ * its `normal_path_manual_actions` axis.
19
26
  *
20
- * Counter-check (second warn path, also once per session): when the advisory
21
- * fired on an earlier Stop and no envelope written since then exists, inject
22
- * one further line saying so — the advisory recommends an action whose next
23
- * step destroys the session, so recommending it without ever checking the
24
- * result is how a silent write failure becomes total context loss. Stamped by
25
- * `missing_envelope_warned_at`, gated on the same threshold, so the emergency
26
- * off-switch silences BOTH paths. Two independent emitters, at most one line
27
- * each per session — the budget the Stop slot carries from this hook is two,
28
- * not one.
27
+ * `agent-config session:recycle` itself is RETAINED, and deliberately: the
28
+ * same verdict refused to retire a public callable contract, and the automatic
29
+ * writer is not a strict superset of it — it skips a session that claimed no
30
+ * roadmap and omits the `git status` anchors the command collects. It is an
31
+ * explicit affordance now, not a step anybody is told to remember.
32
+ *
33
+ * What SURVIVES the retirement is the state machine underneath it.
34
+ * `advisory_fired_at` still stamps the first Stop at which a session crosses
35
+ * the recycle threshold, because the run-checkpoint writer below gates on
36
+ * exactly that edge. The field keeps its name: it is a persisted state key
37
+ * under `agents/runtime/state/session-eol/`, and renaming it would strand
38
+ * every state file already on disk to make one docblock read better.
29
39
  *
30
40
  * Phase 4.2 (read surface): every Stop also overwrites
31
41
  * `agents/runtime/state/context-fill.json` with the machine-readable fill
@@ -33,9 +43,10 @@
33
43
  * carries counts only, and this hook's behaviour is identical whether or
34
44
  * not anything reads it.
35
45
  *
36
- * Never blocks: exit 0 on every silent path; the advisory reports at
37
- * exit 2 ({decision:"warn", additional_context}) which `host_semantics`
38
- * reduces to a non-blocking warn on claude. `AGENT_CONFIG_REPLAY=1` → no-op.
46
+ * Never blocks: exit 0 on every path. With both advisory emitters retired this
47
+ * hook no longer returns the warn exit at all — it records, writes the context
48
+ * fill, the run checkpoint and the continuity record, and says nothing.
49
+ * `AGENT_CONFIG_REPLAY=1` → no-op.
39
50
  */
40
51
 
41
52
  import * as fs from 'node:fs';
@@ -45,7 +56,10 @@ import { fileURLToPath, pathToFileURL } from 'node:url';
45
56
 
46
57
  import recycleThresholdConfig from '../../config/recycle-threshold-budget.json';
47
58
 
48
- import { recycle_envelope_rel } from '../_lib/recycle_envelope_paths.js';
59
+ import {
60
+ listContinuityRecords,
61
+ RECYCLE_MAX_AGE_HOURS,
62
+ } from '../_lib/recycle_envelope_paths.js';
49
63
  import {
50
64
  emptyCounters,
51
65
  eolSessionKey,
@@ -56,18 +70,23 @@ import {
56
70
  } from '../_lib/session_eol.js';
57
71
  import { readContextObservation } from '../_lib/context_observation.js';
58
72
  import { buildCheckpoint, writeCheckpoint } from '../_lib/run_checkpoint.js';
73
+ import {
74
+ auto_record_enabled,
75
+ buildContinuityRecord,
76
+ run_checkpoints_enabled,
77
+ } from '../_lib/continuity_writer.js';
78
+ import { publishContinuityRecord } from '../_lib/continuity_slot.js';
59
79
  import { read_claimed_slug } from '../session_register_hook.js';
60
80
  import { unwrap, type JsonObject, type JsonValue } from './envelope.js';
61
81
  import { readHookStdin } from './hook_stdin.js';
62
82
  import { atomic_write_json, is_replay_mode } from './state_io.js';
63
83
  import { isSafeTranscriptPath } from './end_review_nudge_hook.js';
64
84
 
65
- const EXIT_WARN = 2;
66
-
67
85
  /**
68
86
  * Per-process threshold override — the test seam and the emergency off
69
- * switch (`0` or any non-positive value disables the advisory lane while
70
- * recording continues). The committed value lives in
87
+ * switch (`0` or any non-positive value disables the threshold lane, so the
88
+ * run checkpoint and the continuity record stop while plain recording
89
+ * continues). The committed value lives in
71
90
  * `src/config/recycle-threshold-budget.json` and is statically imported so
72
91
  * the hook bundle carries it into consumers — one threshold, one constant.
73
92
  */
@@ -79,11 +98,24 @@ export const CONTEXT_FILL_REL = path.join('agents', 'runtime', 'state', 'context
79
98
  export interface SessionEolState {
80
99
  schema_version: 1;
81
100
  counters: EolCounters;
82
- /** ISO stamp when the recycle advisory fired for this session (F2), or null. */
101
+ /**
102
+ * ISO stamp of the first Stop at which this session crossed the recycle
103
+ * threshold, or null.
104
+ *
105
+ * Named for the advisory it used to fire (retired 2026-09-10, step 3.2).
106
+ * The name is kept because this is a persisted key: renaming it would
107
+ * strand every `session-eol/<key>.json` already on disk. What it marks is
108
+ * the threshold-crossing edge, which the run-checkpoint writer still gates
109
+ * on.
110
+ */
83
111
  advisory_fired_at: string | null;
84
112
  /**
85
113
  * ISO stamp when the follow-up "advised, but no envelope exists" line
86
- * fired, or null. Separate from `advisory_fired_at` so the counter-check
114
+ * fired, or null. NOTHING WRITES THIS ANY MORE — the counter-check was
115
+ * retired with the advisory on 2026-09-10 (step 3.2). It is still parsed,
116
+ * and `session_eol_report.ts` still counts it, because state files written
117
+ * before that date carry it and dropping the read would silently reinterpret
118
+ * their history as "never happened". Separate from `advisory_fired_at` so the counter-check
87
119
  * is once-per-session in its own right: one reminder is a safety net, one
88
120
  * per Stop for the rest of the session is a nag the reader learns to skip.
89
121
  */
@@ -163,70 +195,59 @@ export function readState(file: string): SessionEolState {
163
195
  }
164
196
 
165
197
  /**
166
- * Is there a recycle envelope under this workspace, written since `since`?
198
+ * Records that were written and never read — the detection layer this defect
199
+ * did not have.
167
200
  *
168
- * Two properties, both load-bearing:
201
+ * `road-to-a-recycle-envelope-that-is-consumed` step 1.2. Twelve unconsumed
202
+ * envelopes accumulated across the estate over roughly a month, and the only
203
+ * reason anyone found them was a stray-copy check during an unrelated task. The
204
+ * producer reported success, the consumer reported `absent`, and nothing
205
+ * compared the two — so the mechanism was inert for weeks with no signal.
169
206
  *
170
- * **Only ENOENT counts as missing.** `fs.existsSync` swallows every error into
171
- * `false`, so an unreadable directory (EACCES on a mounted or root-owned tree)
172
- * would read as "no envelope" and produce the manufactured "your envelope is
173
- * gone" warning this check exists to avoid. `statSync` + an errno test is the
174
- * only shape that can tell the two apart.
207
+ * Advisory ONLY. A hook that blocks a session end over a stale runtime file is
208
+ * worse than the file, and that is Kill-register K3 of the roadmap rather than
209
+ * a preference here.
175
210
  *
176
- * **Freshness, not mere existence.** The consumer moves the envelope aside at
177
- * session_start, so a file still sitting here belongs to a session that never
178
- * cleared. Counting it would silence the warning in the case it exists to
179
- * catch, and worse: `/clear` would then resume the successor from another
180
- * session's state — a wrong resume instead of an empty one. An envelope whose
181
- * `written_at` predates the advisory is not this session's.
211
+ * Silent in the normal case, which is what keeps it worth reading: a record
212
+ * younger than {@link RECYCLE_MAX_AGE_HOURS} is a pending resume, not a defect,
213
+ * and past that age the consumer discards it loudly on its own. What this
214
+ * reports is the third state — old enough to be dead, still sitting there,
215
+ * which means no successor ever came for it.
182
216
  */
183
- export function envelopeExists(
217
+ export function unconsumedRecordLines(
184
218
  workspaceRoot: string,
185
- since: string | null = null,
186
- sessionId: string | null = null,
187
- ): boolean {
188
- // Phase 2.1: the record is keyed by session, so the counter-check must look
189
- // at THIS session's path. Checking the shared name would read a peer's
190
- // record as proof that this session wrote one — the same cross-session
191
- // confusion the key exists to remove, re-created in the checker.
192
- const target = path.join(workspaceRoot, recycle_envelope_rel(sessionId));
193
- let raw: string;
194
- try {
195
- raw = fs.readFileSync(target, 'utf-8');
196
- } catch (exc) {
197
- // ENOENT is the real "no envelope"; anything else is a failed CHECK,
198
- // and a failed check must never assert absence.
199
- return (exc as NodeJS.ErrnoException)?.code !== 'ENOENT';
200
- }
201
- if (since === null) return true;
202
- try {
203
- const written = (JSON.parse(raw) as { written_at?: unknown }).written_at;
204
- // Unparseable or undated: present, and not provably stale. Treat it as
205
- // this session's — the alternative warns about a file that is there.
206
- if (typeof written !== 'string') return true;
207
- return Date.parse(written) >= Date.parse(since);
208
- } catch {
209
- return true;
219
+ now: Date = new Date(),
220
+ maxAgeHours: number = RECYCLE_MAX_AGE_HOURS,
221
+ ): string[] {
222
+ const out: string[] = [];
223
+ for (const file of listContinuityRecords(workspaceRoot)) {
224
+ let raw: string;
225
+ try {
226
+ raw = fs.readFileSync(file, 'utf-8');
227
+ } catch {
228
+ continue; // an unreadable record proves nothing in either direction
229
+ }
230
+ let written: unknown;
231
+ let nextTask: unknown;
232
+ try {
233
+ const parsed = JSON.parse(raw) as { written_at?: unknown; next_task?: unknown };
234
+ written = parsed.written_at;
235
+ nextTask = parsed.next_task;
236
+ } catch {
237
+ continue;
238
+ }
239
+ if (typeof written !== 'string') continue;
240
+ const stamp = Date.parse(written);
241
+ if (Number.isNaN(stamp)) continue;
242
+ const ageHours = (now.getTime() - stamp) / 3_600_000;
243
+ if (ageHours <= maxAgeHours) continue;
244
+ const task = typeof nextTask === 'string' && nextTask.trim() !== '' ? nextTask.trim() : '(no next_task)';
245
+ out.push(
246
+ `unconsumed continuity record: ${path.relative(workspaceRoot, file)} is ` +
247
+ `${ageHours.toFixed(0)}h old and was never read — next_task was "${task.slice(0, 120)}"`,
248
+ );
210
249
  }
211
- }
212
-
213
- /**
214
- * The follow-up line: the advisory already fired, and no envelope arrived.
215
- *
216
- * This is the half of the reported minimum fix that lives outside the command
217
- * — the hook that recommends the call making the same counter-check before the
218
- * operator acts on it. Whatever stopped the write (a wrong root, a refusal
219
- * scrolled past, a forgotten step), the state visible here is identical, and
220
- * the next action the advisory recommended is the one that destroys the
221
- * session.
222
- */
223
- export function buildMissingEnvelopeLine(workspaceRoot: string, sessionId: string | null = null): string {
224
- return (
225
- `recycle advised earlier, but no envelope exists at ` +
226
- `${path.join(workspaceRoot, recycle_envelope_rel(sessionId))} — /clear now starts the successor ` +
227
- `from nothing. Re-run \`agent-config session:recycle\` and check that it prints the ` +
228
- `absolute path it wrote before clearing.`
229
- );
250
+ return out;
230
251
  }
231
252
 
232
253
  /**
@@ -246,25 +267,6 @@ export function readThresholdTokens(): number | null {
246
267
  return typeof value === 'number' && Number.isFinite(value) && value > 0 ? value : null;
247
268
  }
248
269
 
249
- /**
250
- * The exactly-one advisory line injected past threshold (Phase 3.2).
251
- *
252
- * The `/clear` half is conditional on purpose. An earlier wording read
253
- * `run X … then /clear`, which is an instruction to destroy the session with
254
- * no check in between — and a reader who followed it while the command was
255
- * silently writing nothing lost everything. The proof to wait for is the
256
- * absolute path the command prints; naming it costs one clause.
257
- */
258
- export function buildAdvisoryLine(tokens: number, threshold: number): string {
259
- return (
260
- `context past recycle threshold (${tokens.toLocaleString('en-US')} of ` +
261
- `${threshold.toLocaleString('en-US')} tokens): run \`agent-config session:recycle\` to ` +
262
- `write the recycle envelope. It prints the absolute path it wrote — /clear only after ` +
263
- `you have seen that line. The successor session then resumes from the envelope at ` +
264
- `session_start (road-to-token-economy-recycling)`
265
- );
266
- }
267
-
268
270
  /** Overwrite the Phase 4.2 read surface. Counts only; failures are swallowed. */
269
271
  function writeContextFill(
270
272
  workspaceRoot: string,
@@ -326,38 +328,32 @@ export function main(): number {
326
328
  const threshold = readThresholdTokens();
327
329
  const tokens = counters.final_context_tokens;
328
330
 
329
- const shouldAdvise =
331
+ // The threshold-crossing edge: the first Stop at which this session went
332
+ // past the recycle threshold. It used to fire the recycle advisory (retired
333
+ // 2026-09-10, step 3.2) and it still gates the run-checkpoint writer below,
334
+ // which needs "crossed, once" rather than "is above".
335
+ const crossedThresholdNow =
330
336
  threshold !== null &&
331
337
  tokens !== null &&
332
338
  tokens >= threshold &&
333
339
  state.advisory_fired_at === null;
334
340
 
335
- // The counter-check: the advisory fired on an EARLIER Stop (so `state`,
336
- // the pre-update snapshot, already carries the stamp) and no envelope has
337
- // appeared since. It can never collide with `shouldAdvise` — that branch
338
- // requires `advisory_fired_at === null` — so at most one line is emitted
339
- // per Stop, and this one at most once per session.
340
- //
341
- // `threshold !== null` gates it for the same reason the advisory is gated:
342
- // `AGENT_RECYCLE_THRESHOLD_TOKENS=0` is documented as the emergency switch
343
- // for the whole advisory lane, and a lane that keeps one more warn after
344
- // being switched off is not off.
345
341
  // Raw id, not `sessionKey`: the record path is built from the id the host
346
342
  // exported (`safe_stem`), never from the hashed state-file key.
347
343
  const rawSessionId = payloadSessionId(payload, envelope) || null;
348
- const shouldWarnMissing =
349
- threshold !== null &&
350
- state.advisory_fired_at !== null &&
351
- (state.missing_envelope_warned_at ?? null) === null &&
352
- !envelopeExists(workspaceRoot, state.advisory_fired_at, rawSessionId);
353
344
 
345
+ // `missing_envelope_warned_at` is carried forward, never set. Its writer —
346
+ // the "advised, but no envelope exists" counter-check — retired with the
347
+ // advisory it was checking on: with the record written automatically there
348
+ // is no advice to have been ignored, and the line it emitted told a human
349
+ // to run the command that step 3.2 removed from the normal path. The field
350
+ // is preserved on read so state written before that date keeps its history
351
+ // (`session_eol_report.ts` still counts it).
354
352
  const nextState: SessionEolState = {
355
353
  schema_version: 1,
356
354
  counters,
357
- advisory_fired_at: shouldAdvise ? now : state.advisory_fired_at,
358
- missing_envelope_warned_at: shouldWarnMissing
359
- ? now
360
- : (state.missing_envelope_warned_at ?? null),
355
+ advisory_fired_at: crossedThresholdNow ? now : state.advisory_fired_at,
356
+ missing_envelope_warned_at: state.missing_envelope_warned_at ?? null,
361
357
  updated_at: now,
362
358
  };
363
359
  try {
@@ -389,7 +385,7 @@ export function main(): number {
389
385
  // Best-effort throughout. A checkpoint is a recovery aid, and a
390
386
  // recovery aid that can fail a Stop is a liability.
391
387
  const checkpointRunId = payloadSessionId(payload, envelope);
392
- if (shouldAdvise && checkpointRunId !== '') {
388
+ if (crossedThresholdNow && checkpointRunId !== '' && run_checkpoints_enabled(workspaceRoot)) {
393
389
  try {
394
390
  const slug = read_claimed_slug(workspaceRoot, checkpointRunId);
395
391
  if (slug !== null) {
@@ -411,29 +407,65 @@ export function main(): number {
411
407
  }
412
408
  }
413
409
 
414
- if (shouldAdvise && threshold !== null && tokens !== null) {
415
- process.stdout.write(
416
- `${JSON.stringify({
417
- decision: 'warn',
418
- reason: `session-eol: context ${tokens} >= recycle threshold ${threshold}`,
419
- additional_context: buildAdvisoryLine(tokens, threshold),
420
- })}\n`,
421
- );
422
- return EXIT_WARN;
423
- }
424
- if (shouldWarnMissing) {
425
- process.stdout.write(
426
- `${JSON.stringify({
427
- decision: 'warn',
428
- reason: 'session-eol: recycle advised, no envelope written',
429
- additional_context: buildMissingEnvelopeLine(workspaceRoot, rawSessionId),
430
- })}\n`,
431
- );
432
- return EXIT_WARN;
433
- }
410
+ writeContinuityRecord(workspaceRoot, rawSessionId, counters, threshold, tokens);
411
+
412
+ // No warn path. Both emitters this hook used to carry were the recycle
413
+ // advisory and its counter-check, and both are retired (step 3.2). The hook
414
+ // records, writes the context fill, the checkpoint and the continuity
415
+ // record, and returns silently.
434
416
  return 0;
435
417
  }
436
418
 
419
+ /**
420
+ * The continuity-record handler — one of the three lifecycle handlers this
421
+ * concern carries, and independently switchable from the other two.
422
+ *
423
+ * `road-to-continuity-writer-activation` step 1.2, and it lands INSIDE this
424
+ * concern rather than as a fourth concern id on purpose: `check_estate_count`
425
+ * ratchets `concern_count` with allowance 0, and the 2026-09-08 AI council
426
+ * refused a temporary allowance 2/2. The substance the 2026-09-07 council's D2
427
+ * asked for is independent switching and failure isolation, and a handler
428
+ * behind its own settings key inside a `try` gives both without a manifest
429
+ * split. The split itself is step 2.1 and stays blocked until a concern is
430
+ * retired to pay for it.
431
+ *
432
+ * Fires from the recycle THRESHOLD, not from the once-per-session advisory
433
+ * stamp: the stamp fires once, so a record written from it would be frozen at
434
+ * the moment the session crossed the threshold and would go stale as the
435
+ * session continued. Driving it from the raw threshold condition instead means
436
+ * every later Stop supersedes the record under the slot's own policy, so what a
437
+ * successor reads is always the newest state, and the write rate is still
438
+ * bounded to the end phase of a session rather than every turn of it.
439
+ *
440
+ * Best-effort throughout, like the checkpoint above it: a continuity record is
441
+ * a recovery aid, and a recovery aid that can fail a Stop is a liability.
442
+ */
443
+ function writeContinuityRecord(
444
+ workspaceRoot: string,
445
+ rawSessionId: string | null,
446
+ counters: EolCounters,
447
+ threshold: number | null,
448
+ tokens: number | null,
449
+ ): void {
450
+ if (threshold === null || tokens === null || tokens < threshold) return;
451
+ const sessionId = String(rawSessionId ?? '').trim();
452
+ if (sessionId === '') return;
453
+ try {
454
+ if (!auto_record_enabled(workspaceRoot)) return;
455
+ const slug = read_claimed_slug(workspaceRoot, sessionId);
456
+ const decision = buildContinuityRecord({
457
+ root: workspaceRoot,
458
+ sessionId,
459
+ slug,
460
+ counters,
461
+ });
462
+ if (decision.record === null) return;
463
+ publishContinuityRecord(workspaceRoot, sessionId, decision.record);
464
+ } catch {
465
+ // never block the Stop path, and never suppress a sibling handler
466
+ }
467
+ }
468
+
437
469
  // Bundle-safety: never auto-run when inlined into an esbuild bundle, where
438
470
  // every module shares the bundle's `import.meta.url` (see cmd_migrate.ts).
439
471
  declare const __AGENT_CONFIG_BUNDLE__: boolean | undefined;
@@ -70,6 +70,18 @@
70
70
  * candidate spread is what tells them apart. Picking one now would be the
71
71
  * threshold-first mistake the activation policy names.
72
72
  *
73
+ * ── A SECOND RECORD KIND SHARES THIS LOG ──────────────────────────────────
74
+ *
75
+ * `_lib/tolerance_shadow.ts` appends `record: "tolerance_shadow"` lines here.
76
+ * It is NOT a second concern and registers nothing: `check_estate_count`
77
+ * reports zero growth allowance on hook concerns, so the value-reconciliation
78
+ * window rides this file rather than opening its own
79
+ * (`road-to-design-intent-conformance` 4.2). Readers of this log MUST
80
+ * discriminate on `record` — a consumer that assumed one shape would silently
81
+ * mis-parse the other. That module carries its own pre-registered flip
82
+ * criterion, on the same terms as the one above and with the same reverse
83
+ * trigger discipline.
84
+ *
73
85
  * PRIVACY BY CONSTRUCTION: booleans, counts, a matcher label, and the
74
86
  * id-shaped `agent_type` enum (recorded verbatim, the same stance
75
87
  * `subagent_ledger_hook.ts` states for that field). No prompt, no command
@@ -132,12 +132,17 @@ export function isUiWrite(event: ToolEvent): boolean {
132
132
  * `path_prefix: .claude/design-system/`. Reading one is the agent reaching
133
133
  * rung 1 of the data-basis ladder before it writes.
134
134
  *
135
- * A SHARED PREDICATE, NOT A DECISION INPUT HERE. `decide` does not branch on
136
- * it: the nudge's behaviour is unchanged by an artifact read, and the phase
137
- * that introduced this states `nothing behavioural`. The one consumer is
138
- * `report_consultation_rate`, which measures over transcripts. Keeping the
139
- * predicate beside `isUiWrite` / `isConsultation` is what stops the analyzer
140
- * and the nudge from classifying the same event differently.
135
+ * A SHARED PREDICATE, AND A RECORDED ONE — NOT A DECISION INPUT. `decide`
136
+ * evaluates it on every event and latches the result into `SessionState`, but
137
+ * no branch reads that latch: every `warn` value is what it was before, so the
138
+ * nudge's behaviour is unchanged and the phase's `nothing behavioural` still
139
+ * holds. Recording it closes the gap the predicate shipped with — it was
140
+ * exported here and consumed only by `report_consultation_rate`, so a live
141
+ * session's own state said nothing about whether the artifact had been read.
142
+ * The concern is default-OFF, so this changes nothing for a consumer and makes
143
+ * the shadow record honest (`road-to-design-intent-conformance` 2.6). Keeping
144
+ * the predicate beside `isUiWrite` / `isConsultation` is what stops the
145
+ * analyzer and the nudge from classifying the same event differently.
141
146
  *
142
147
  * THIS IS A COPY OF THE RULE'S TRIGGERS, NOT A READ OF THEM — same honesty
143
148
  * boundary the header states for `ui_surface.ts`: nothing here parses
@@ -162,12 +167,27 @@ export function isUiWrite(event: ToolEvent): boolean {
162
167
  export function isArtifactRead(event: ToolEvent): boolean {
163
168
  if (event.isWrite || !event.file) return false;
164
169
  const normalized = event.file.replace(/\\/g, '/').toLowerCase();
165
- return normalized.endsWith('design.html') || normalized.includes('.claude/design-system/');
170
+ return (
171
+ normalized.endsWith('design.html') ||
172
+ // The Claude Design canvas artboard. NOT covered by the line above:
173
+ // `ToDo.dc.html` does not end in `design.html`, which is exactly why
174
+ // the rule needed a second file pattern (2.5) and why the drift guard
175
+ // below reds when one is added here without the other.
176
+ normalized.endsWith('.dc.html') ||
177
+ normalized.includes('.claude/design-system/')
178
+ );
166
179
  }
167
180
 
168
181
  export interface SessionState {
169
182
  consulted: boolean;
170
183
  nudges: number;
184
+ /**
185
+ * Latched once a provided design artifact has been READ this session.
186
+ * Shadow-only: nothing branches on it. It exists so the session's own
187
+ * record can answer "did this agent open the handover before writing UI",
188
+ * which until 2.6 only a transcript analyzer could answer after the fact.
189
+ */
190
+ artifactRead: boolean;
171
191
  }
172
192
 
173
193
  function stateFile(root: string): string {
@@ -182,12 +202,17 @@ export function readState(root: string, session: string): SessionState {
182
202
  >;
183
203
  const entry = all[session];
184
204
  if (entry && typeof entry.consulted === 'boolean' && typeof entry.nudges === 'number') {
185
- return entry;
205
+ // `artifactRead` arrived after the file shape did, so a state file
206
+ // written by an older build carries the two older fields and not
207
+ // this one. Default it rather than rejecting the entry: dropping a
208
+ // valid latch to gain a boolean would lose the `consulted` flag and
209
+ // re-nudge a session that had already consulted.
210
+ return { ...entry, artifactRead: entry.artifactRead === true };
186
211
  }
187
212
  } catch {
188
213
  /* fresh session */
189
214
  }
190
- return { consulted: false, nudges: 0 };
215
+ return { consulted: false, nudges: 0, artifactRead: false };
191
216
  }
192
217
 
193
218
  /** Sessions retained in the state file; oldest entries drop past this. */
@@ -236,13 +261,21 @@ export function decide(
236
261
  event: ToolEvent,
237
262
  state: SessionState,
238
263
  ): { state: SessionState; warn: boolean } {
264
+ // Evaluated FIRST and independently of every branch below, because
265
+ // `isArtifactRead` and `isConsultation` are NOT disjoint — a read of
266
+ // `src/skills/design-review/references/design.html` satisfies both. Folding
267
+ // it into one of the branches would silently drop such an event from
268
+ // whichever classification lost the race, which is the failure
269
+ // `isArtifactRead`'s own header warns callers about. Latching, never
270
+ // clearing: the question is "was it read at any point this session".
271
+ const artifactRead = state.artifactRead || isArtifactRead(event);
239
272
  if (isConsultation(event)) {
240
- return { state: { ...state, consulted: true }, warn: false };
273
+ return { state: { ...state, artifactRead, consulted: true }, warn: false };
241
274
  }
242
- if (!isUiWrite(event)) return { state, warn: false };
243
- if (state.consulted) return { state, warn: false };
244
- if (state.nudges >= MAX_NUDGES) return { state, warn: false };
245
- return { state: { ...state, nudges: state.nudges + 1 }, warn: true };
275
+ if (!isUiWrite(event)) return { state: { ...state, artifactRead }, warn: false };
276
+ if (state.consulted) return { state: { ...state, artifactRead }, warn: false };
277
+ if (state.nudges >= MAX_NUDGES) return { state: { ...state, artifactRead }, warn: false };
278
+ return { state: { ...state, artifactRead, nudges: state.nudges + 1 }, warn: true };
246
279
  }
247
280
 
248
281
  /**
@@ -256,7 +289,11 @@ export function decide(
256
289
  * but the guard stays enumerated and this note stays with it.
257
290
  */
258
291
  export function stateChanged(before: SessionState, after: SessionState): boolean {
259
- return before.consulted !== after.consulted || before.nudges !== after.nudges;
292
+ return (
293
+ before.consulted !== after.consulted ||
294
+ before.nudges !== after.nudges ||
295
+ before.artifactRead !== after.artifactRead
296
+ );
260
297
  }
261
298
 
262
299
  export function nudgeReason(file: string): string {