@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
@@ -40,6 +40,25 @@ function formatScalar(value: unknown): string {
40
40
  return yamlDump(value, { lineWidth: -1, flowLevel: 0 }).replace(/\n$/, '').trim();
41
41
  }
42
42
 
43
+ /**
44
+ * A NESTED mapping key, as both the presence probe and the insertion walk read
45
+ * one. Shared so the writer and its own existence-probe cannot drift apart —
46
+ * that drift is the shape this file has now hit four times.
47
+ *
48
+ * `-` is in the class because a dashed key is ordinary YAML (`first-name`,
49
+ * `dry-run`, `retry-count`) and `detectIndentWidth` already accepted one.
50
+ * While this pattern did not, `findScalarLine` could never find such a key:
51
+ * `mergeIntoTemplate` then wrote a bogus top-level `x.first-principles:` line
52
+ * beside the real nested one and the intended value was never written — a save
53
+ * that silently did nothing — and `upsertScalar` appended another child line on
54
+ * EVERY call, growing without bound until the file stopped parsing.
55
+ *
56
+ * `.` stays OUT, deliberately. A dotted key is the FLAT form, which
57
+ * `replaceFlatDottedKey` owns; letting this pattern match `a.b:` would make the
58
+ * nested probe claim a line that is one key literally named "a.b".
59
+ */
60
+ const NESTED_KEY_RE = /^([A-Za-z_][A-Za-z0-9_-]*)\s*:/;
61
+
43
62
  interface FlatEntry {
44
63
  path: string[];
45
64
  value: unknown;
@@ -68,6 +87,25 @@ export function replaceScalar(template: string, dottedPath: string[], value: unk
68
87
  const key = dottedPath[dottedPath.length - 1];
69
88
 
70
89
  const lines = template.split('\n');
90
+ const at = findScalarLine(lines, sections, key);
91
+ if (at === -1) return template;
92
+ const width = detectIndentWidth(lines);
93
+ lines[at] = `${' '.repeat(width * sections.length)}${key}: ${formatScalar(value)}`;
94
+ return lines.join('\n');
95
+ }
96
+
97
+ /**
98
+ * Index of the line holding the scalar at `sections`/`key`, or -1.
99
+ *
100
+ * Split out of `replaceScalar` so that "is this path present?" is answerable
101
+ * WITHOUT writing. `mergeIntoTemplate` used to infer presence from
102
+ * `replaceScalar` returning a changed string, which conflates "absent" with
103
+ * "present and already equal to the value being written" — under that test a
104
+ * no-op write reads as a miss and the caller appends a duplicate mapping key.
105
+ * A presence question answered by a mutation's side effect is the shape to
106
+ * look for here; the file already carries two earlier rounds of it.
107
+ */
108
+ function findScalarLine(lines: readonly string[], sections: readonly string[], key: string | undefined): number {
71
109
  // The document's own width, the same read `upsertScalar` performs.
72
110
  //
73
111
  // R2 round 5, finding 1, and it is the second half of round 4's finding 7.
@@ -84,9 +122,7 @@ export function replaceScalar(template: string, dottedPath: string[], value: unk
84
122
  // A writer and its own existence-probe disagreeing about the format is the
85
123
  // shape to look for whenever one of a pair is taught something new.
86
124
  const width = detectIndentWidth(lines);
87
- const targetIndent = ' '.repeat(width * sections.length);
88
125
  const currentPath: (string | null)[] = new Array<string | null>(sections.length).fill(null);
89
- const formatted = formatScalar(value);
90
126
 
91
127
  for (let i = 0; i < lines.length; i++) {
92
128
  const line = lines[i];
@@ -98,7 +134,7 @@ export function replaceScalar(template: string, dottedPath: string[], value: unk
98
134
  const level = indentLen / width;
99
135
  if (level > sections.length) continue;
100
136
 
101
- const m = /^([A-Za-z_][A-Za-z0-9_]*)\s*:/.exec(stripped);
137
+ const m = NESTED_KEY_RE.exec(stripped);
102
138
  if (!m) continue;
103
139
  const lineKey = m[1];
104
140
  if (lineKey === undefined) continue;
@@ -115,10 +151,9 @@ export function replaceScalar(template: string, dottedPath: string[], value: unk
115
151
  const parentsMatch = sections.every((s, idx) => currentPath[idx] === s);
116
152
  if (!parentsMatch) continue;
117
153
  if (lineKey !== key) continue;
118
- lines[i] = `${targetIndent}${key}: ${formatted}`;
119
- return lines.join('\n');
154
+ return i;
120
155
  }
121
- return template;
156
+ return -1;
122
157
  }
123
158
 
124
159
  /**
@@ -182,11 +217,21 @@ export function detectIndentWidth(lines: readonly string[]): number {
182
217
  */
183
218
  export function upsertScalar(template: string, dottedPath: string[], value: unknown): string {
184
219
  if (dottedPath.length === 0) return template;
185
- const replaced = replaceScalar(template, dottedPath, value);
186
- if (replaced !== template) return replaced;
187
-
188
220
  const sections = dottedPath.slice(0, -1);
189
221
  const key = dottedPath[dottedPath.length - 1] as string;
222
+
223
+ // Presence is asked, never inferred from the write changing the text. The
224
+ // string compare that used to stand here read "key already holds this
225
+ // value" as "key absent" and fell through to the append below — so saving
226
+ // the wizard's council page twice WITHOUT changing a toggle wrote a second
227
+ // `api_on_quota:` into the same block, over two `{ok: true}` responses, and
228
+ // left `.ai-council.yml` rejected by a strict parser. Third instance of one
229
+ // shape in this file; `findScalarLine` exists to end it, and a fix that
230
+ // taught only `mergeIntoTemplate` would have left the live path here.
231
+ if (findScalarLine(template.split('\n'), sections, key) !== -1) {
232
+ return replaceScalar(template, dottedPath, value);
233
+ }
234
+
190
235
  const formatted = formatScalar(value);
191
236
  const lines = template.split('\n');
192
237
  // The document's OWN indent width, not an assumed two.
@@ -228,7 +273,7 @@ export function upsertScalar(template: string, dottedPath: string[], value: unkn
228
273
  if (line.trim() === '' || line.trim().startsWith('#')) continue;
229
274
  const indentLen = line.length - line.trimStart().length;
230
275
  if (indentLen !== indent.length) continue;
231
- const m = /^([A-Za-z_][A-Za-z0-9_]*)\s*:/.exec(line.trim());
276
+ const m = NESTED_KEY_RE.exec(line.trim());
232
277
  if (m !== null && m[1] === want) {
233
278
  found = i;
234
279
  break;
@@ -269,23 +314,136 @@ export function upsertScalar(template: string, dottedPath: string[], value: unkn
269
314
  return lines.join('\n');
270
315
  }
271
316
 
317
+ /**
318
+ * Rewrite an existing top-level `a.b.c: value` line — the FLAT form
319
+ * `mergeIntoTemplate` itself appends when a path has no template entry.
320
+ * Returns the template unchanged when no such line exists.
321
+ *
322
+ * `replaceScalar` cannot see this line: its key pattern is
323
+ * `[A-Za-z_][A-Za-z0-9_]*`, with no dot, so a path this module appended on
324
+ * one pass is invisible to the probe on the next and `mergeIntoTemplate`
325
+ * appends a SECOND copy. Two wizard saves therefore produce a file carrying
326
+ * duplicate mapping keys — a strict parser rejects it outright, which is what
327
+ * wedged `task release`: its `sync` step exits 2 with "Map keys must be
328
+ * unique" before the release does any git work.
329
+ *
330
+ * A pre-existing duplicate run is COLLAPSED, not merely updated: the first
331
+ * occurrence keeps its position and takes the new value, every later one is
332
+ * dropped. Collapsing is value-neutral — a lenient reader already resolved
333
+ * such a run last-wins — and it is the only way a file corrupted by the old
334
+ * behaviour becomes parseable again through the ordinary write path.
335
+ *
336
+ * Deliberately NOT folded into `replaceScalar`: `upsertScalar` calls that
337
+ * probe and documents the flat form as the WRONG shape for a nested key (a
338
+ * reader sees one key literally named "a.b"). Teaching the shared probe to
339
+ * match it would make `upsertScalar` write into that broken line instead of
340
+ * creating the nesting. The flat form is legitimate only here, where this
341
+ * function is the one that wrote it.
342
+ */
343
+ function replaceFlatDottedKey(
344
+ template: string,
345
+ dottedPath: string[],
346
+ value: unknown,
347
+ ): { found: boolean; body: string } {
348
+ if (dottedPath.length < 2) return { found: false, body: template };
349
+ const flat = dottedPath.join('.');
350
+ const lines = template.split('\n');
351
+ const hits: number[] = [];
352
+ for (let i = 0; i < lines.length; i++) {
353
+ const line = lines[i];
354
+ if (line === undefined) continue;
355
+ // Top level only — an indented `a.b:` is somebody else's child key.
356
+ if (line.length !== line.trimStart().length) continue;
357
+ const m = /^([A-Za-z_][A-Za-z0-9_.-]*)\s*:/.exec(line);
358
+ if (m === null || m[1] !== flat) continue;
359
+ hits.push(i);
360
+ }
361
+ if (hits.length === 0) return { found: false, body: template };
362
+ lines[hits[0] as number] = `${flat}: ${formatScalar(value)}`;
363
+ // Drop the later copies back-to-front so the earlier indices stay valid.
364
+ for (let i = hits.length - 1; i >= 1; i--) lines.splice(hits[i] as number, 1);
365
+ return { found: true, body: lines.join('\n') };
366
+ }
367
+
368
+ /**
369
+ * Drop every top-level `a.b.c:` line for a path whose NESTED form the caller
370
+ * has just resolved.
371
+ *
372
+ * Which reader this preserves, because the two forms can disagree and only one
373
+ * of them is ever consulted: by YAML semantics `a.b.c` is reached by walking
374
+ * the `a` mapping, so a top-level key literally named "a.b.c" is a DIFFERENT
375
+ * path that no lookup of the dotted one visits. Removing it therefore changes
376
+ * no reader's answer — strict and lenient alike already resolve through the
377
+ * nesting — while leaving it keeps the one line a human scanning the file
378
+ * reads as the value, saying something the program never agreed with. It
379
+ * cannot self-heal either: the duplicate-key pass sees a single occurrence,
380
+ * and `mergeIntoTemplate` writes the nested side, so the line is permanent.
381
+ *
382
+ * The nested twin IS the safety argument, not a convenience. A flat `a.b:`
383
+ * standing ALONE is a key somebody may have meant — `mergeIntoTemplate`'s own
384
+ * fallback branch writes exactly that shape for a path the template lacks — and
385
+ * this function is never reached for one: the caller takes the
386
+ * `replaceFlatDottedKey` branch instead, which updates that line in place.
387
+ *
388
+ * Two bounds, each of which turns the sweep into a data-loss bug if dropped:
389
+ *
390
+ * - Two segments minimum. A one-segment path joins to a name with no dot, so
391
+ * the match below would hit the very line `replaceScalar` just wrote and
392
+ * delete the key the caller asked to set — a rewrite silently becoming a
393
+ * removal. Same guard, same reason, as `replaceFlatDottedKey`.
394
+ * - Top level only, the bound `replaceFlatDottedKey` also draws: an INDENTED
395
+ * `a.b:` is somebody else's child key (`parent:` / ` a.b:` means
396
+ * `parent['a.b']`), an unrelated path this sweep has no claim on.
397
+ */
398
+ function dropFlatDottedTwins(template: string, dottedPath: string[]): string {
399
+ if (dottedPath.length < 2) return template;
400
+ const flat = dottedPath.join('.');
401
+ const lines = template.split('\n');
402
+ const kept = lines.filter((line) => {
403
+ if (line.length !== line.trimStart().length) return true;
404
+ const m = /^([A-Za-z_][A-Za-z0-9_.-]*)\s*:/.exec(line);
405
+ return m === null || m[1] !== flat;
406
+ });
407
+ if (kept.length === lines.length) return template;
408
+ return kept.join('\n');
409
+ }
410
+
272
411
  /**
273
412
  * Apply every leaf change from `newValues` to `templateBody`. Paths that
274
413
  * are not present in the template are appended at the end. Comments are
275
414
  * preserved for every key that already exists in the template.
415
+ *
416
+ * Idempotent: applying the same values twice yields the same document, so a
417
+ * second wizard save re-writes the flat block instead of duplicating it.
276
418
  */
277
419
  export function mergeIntoTemplate(templateBody: string, newValues: Record<string, unknown>): string {
278
420
  let body = templateBody;
279
421
  const appended: string[] = [];
280
422
  for (const entry of flatten(newValues)) {
281
- const before = body;
282
- body = replaceScalar(body, entry.path, entry.value);
283
- if (body === before) {
284
- // Path is not in the template — append a flat key=value at EOF.
285
- // Form coverage is asserted by parity test, so this branch only
286
- // fires on hand-edited templates.
287
- appended.push(`${entry.path.join('.')}: ${formatScalar(entry.value)}`);
423
+ const sections = entry.path.slice(0, -1);
424
+ const leaf = entry.path[entry.path.length - 1];
425
+ // Presence is asked, never inferred from the write changing the text —
426
+ // see `findScalarLine`. Writing the value it already holds is a hit.
427
+ if (findScalarLine(body.split('\n'), sections, leaf) !== -1) {
428
+ body = replaceScalar(body, entry.path, entry.value);
429
+ // The nested form won, so any flat twin of this same path is dead
430
+ // and stays dead. The probe above is what licenses the removal:
431
+ // without a nested key to resolve through, a flat `a.b:` is the
432
+ // real entry and the branch below owns it.
433
+ body = dropFlatDottedTwins(body, entry.path);
434
+ continue;
435
+ }
436
+ // Not in the template's nested form. It may still be here as a flat
437
+ // dotted line this function appended on an earlier pass.
438
+ const flat = replaceFlatDottedKey(body, entry.path, entry.value);
439
+ if (flat.found) {
440
+ body = flat.body;
441
+ continue;
288
442
  }
443
+ // Genuinely absent — append a flat key=value at EOF. Form coverage is
444
+ // asserted by parity test, so this branch only fires on hand-edited
445
+ // templates.
446
+ appended.push(`${entry.path.join('.')}: ${formatScalar(entry.value)}`);
289
447
  }
290
448
  if (appended.length > 0) {
291
449
  if (!body.endsWith('\n')) body += '\n';
@@ -173,7 +173,7 @@ export const settingsSchema = z.object({
173
173
  }),
174
174
  chat_history: z.object({
175
175
  enabled: z.boolean().default(true).describe(
176
- 'Persist a structured log of every chat turn to .agent-config/chat-history/ so /chat-history:show, :import, and :learn can replay sessions. Turn off if you never want chat transcripts on disk.',
176
+ 'Persist a structured log of every chat turn to agents/runtime/.agent-chat-history (JSONL). Recording only — no command in this package replays a session from the file; it is a record on disk that a human or a later tool can read. Turn off if you never want chat transcripts on disk.',
177
177
  ),
178
178
  frequency: chatFreq.default('per_turn').describe(
179
179
  'How often the chat-history writer flushes to disk. per_turn = after every user / agent exchange (default, lowest data loss on crash). per_phase = at phase boundaries (cheaper I/O). per_tool = after every tool call (highest fidelity, noisiest log).',
@@ -247,7 +247,27 @@ export const settingsSchema = z.object({
247
247
  fidelity_mode: fidelityMode.default('strict').describe(
248
248
  'How strictly the agent must follow a user-provided prototype / mockup / design system (consumed by the design-fidelity rule). strict = build 1:1, every visible deviation needs confirmation; structural = structure locked, silent gaps fillable with a stated assumption; hard-floor = any deviation is never autonomous.',
249
249
  ),
250
- }).default({ fidelity_mode: 'strict' }),
250
+ approximation: z
251
+ .object({
252
+ enabled: z.boolean().default(false).describe(
253
+ 'Whether a value INSIDE the configured tolerance may be replaced by the project\'s own token without a per-value confirmation. Ships false. The distance from the artifact\'s value to the nearest project token is computed and REPORTED on every value row regardless of this switch — what it decides is whether the agent may act on it without asking. Turning it on for a whole install is a consumer-facing default flip and is owner-reserved (agents/roadmaps/stubs/road-to-frontend-power-default-flip.md); design.fidelity_mode: hard-floor overrides it to off.',
254
+ ),
255
+ tolerance: z
256
+ .object({
257
+ color: z.number().nullable().default(null).describe(
258
+ 'Colour distance below which a value may be reconciled, in OKLab ΔEOK. Ships null, and null means "preserve and report" rather than "reconcile freely". No number is set because none is supported: zero of seven design-to-code benchmarks in the evidence set score token conformance, and a number in a config file — even flagged unmeasured — shapes behavior and acquires the authority of a default. Not an RGB channel delta: RGB distance is not perceptually uniform.',
259
+ ),
260
+ length: z.number().nullable().default(null).describe(
261
+ 'Length distance below which a value may be reconciled, in absolute CSS pixels. Ships null, same reasoning as color. GitHub Primer\'s ±1px spacing widening is recorded as an externally observed candidate in src/scripts/_lib/design_tolerance.ts and is deliberately not the shipped value; max(1px, 2%) was rejected for growing more permissive at large dimensions with no evidence that this is wanted.',
262
+ ),
263
+ })
264
+ .default({ color: null, length: null }),
265
+ })
266
+ .default({ enabled: false, tolerance: { color: null, length: null } }),
267
+ }).default({
268
+ fidelity_mode: 'strict',
269
+ approximation: { enabled: false, tolerance: { color: null, length: null } },
270
+ }),
251
271
  consistency: z.object({
252
272
  cross_source: crossSourceMode.default('on').describe(
253
273
  'Consumed by the cross-source-consistency rule. When the agent works from multiple sources (ticket text, an attached image/mockup, the spec, the codebase) it checks them against each other and asks before proceeding on a discrepancy — instead of silently guessing. on (default) = surface every real cross-source contradiction / silent-scope-expansion as one question; auto = surface only high-confidence contradictions, state low-confidence as an assumption; off = no cross-source checking.',
@@ -450,11 +470,11 @@ export const settingsSchema = z.object({
450
470
  }),
451
471
  }),
452
472
  continuity: z.object({
453
- auto_record: z.enum(['on', 'off']).default('off').describe(
454
- 'Deterministic continuity-record writer at session end (road-to-continuity-writer-activation Phase 1). on = the session-eol concern writes the continuity_record capsule variant on Stop for a substantive session that has claimed a roadmap; every field is computed from on-disk state, with no model spend and no subprocess. off (default) = no automatic record — while session:recycle is still the normal path, a second producer on it before the parity evidence is in would be unverified.',
473
+ auto_record: z.enum(['on', 'off']).default('on').describe(
474
+ 'Deterministic continuity-record writer at session end (road-to-continuity-writer-activation Phase 1). on (default since 2026-09-10) = the session-eol concern writes the continuity_record capsule variant on Stop for a substantive session that has claimed a roadmap; every field is computed from on-disk state, with no model spend and no subprocess. off = no automatic record, and only the explicit agent-config session:recycle writes one. The default flipped once the parity evidence landed, so the normal path carries an automatic writer rather than a remembered command; session:recycle is retained because the automatic writer skips a session that claimed no roadmap and omits the git-status anchors.',
455
475
  ),
456
476
  run_checkpoints: z.enum(['on', 'off']).default('on').describe(
457
- 'Deterministic run-checkpoint production at session end (road-to-continuity-writer-activation Phase 1.4). on (default) = a session above the recycle threshold and inside a running roadmap contract leaves agents/runtime/state/checkpoints/<run>.json, so a killed run resumes from a derived checkpoint rather than from bookkeeping. off = no checkpoint; continuity writing, the recycle advisory and the context-fill surface are unaffected. Default ON because it is the behaviour the tree already had — the switch exists to make the three session-end handlers independently disableable, not to change what ships.',
477
+ 'Deterministic run-checkpoint production at session end (road-to-continuity-writer-activation Phase 1.4). on (default) = a session above the recycle threshold and inside a running roadmap contract leaves agents/runtime/state/checkpoints/<run>.json, so a killed run resumes from a derived checkpoint rather than from bookkeeping. off = no checkpoint; continuity writing, the recycle advisory and the context-fill surface are unaffected. Default ON because it is the behavior the tree already had — the switch exists to make the three session-end handlers independently disableable, not to change what ships.',
458
478
  ),
459
479
  }),
460
480
  memory: z.object({
@@ -23,7 +23,13 @@ export type JsonLike =
23
23
  | { [key: string]: JsonLike };
24
24
 
25
25
  export interface SurfaceEntry {
26
- type: string;
26
+ /**
27
+ * JSON-schema type. A STRING for an ordinary key, and an ARRAY for a
28
+ * nullable one (`["number", "null"]`) — which is what the generator has
29
+ * always produced for a `z.number().nullable()`, though this field was
30
+ * declared `string` until the first such key shipped.
31
+ */
32
+ type: string | string[];
27
33
  default?: JsonLike;
28
34
  enum?: Array<string | number>;
29
35
  description?: string;
@@ -129,7 +135,12 @@ export function computeSurfaceDelta(oldS: SettingsSurface, newS: SettingsSurface
129
135
  continue;
130
136
  }
131
137
  const o = oldS.entries[key] as SurfaceEntry;
132
- if (o.type !== n.type) {
138
+ // `sameJson`, not `!==`: `type` is an array for a nullable key, and two
139
+ // structurally equal arrays are never `===`. Left as a strict compare
140
+ // it reported `type_changed` on EVERY version bump for every nullable
141
+ // key, forever — caught by the identical-surface test the moment the
142
+ // first one shipped (`design.approximation.tolerance.*`).
143
+ if (!sameJson(o.type, n.type)) {
133
144
  changes.push({ key, kind: 'type_changed', old: o, new: n });
134
145
  }
135
146
  if (!sameJson(o.default, n.default)) {
@@ -1,9 +1,14 @@
1
1
  # Compact-instructions template — lose less when you compact anyway
2
2
 
3
3
  Fallback lane of `road-to-token-economy-recycling` Phase 3.3. The recycle
4
- envelope (`agent-config session:recycle` + `/clear`) is the primary path —
5
- validated state, no summarizer. This template is for the user who compacts
6
- instead: Claude Code honours a `# Compact instructions` section in the
4
+ envelope is the primary path — validated state, no summarizer — and since
5
+ 2026-09-10 it is written for you: the `session-eol` concern publishes the
6
+ continuity record at session end by default (`continuity.auto_record`), so
7
+ `/clear` resumes from it with no command to remember.
8
+ `agent-config session:recycle` still exists as an explicit affordance for the
9
+ cases the automatic writer does not cover (a session that claimed no roadmap, or
10
+ a record that should carry the `git status` anchors). This template is for the
11
+ user who compacts instead: Claude Code honours a `# Compact instructions` section in the
7
12
  project's `CLAUDE.md` when it summarizes (see the "Manage context
8
13
  proactively" section of the host's cost docs), and `/compact <instructions>`
9
14
  accepts the same guidance ad hoc.
@@ -1,170 +0,0 @@
1
- ---
2
- model_tier: medium
3
- name: chat-history-import
4
- pack: memory
5
- visibility: internal
6
- cluster: chat-history
7
- sub: import
8
- description: Surface prior chat-history sessions as a numbered table, let the user pick one, read it silently, and emit a short summary plus a resume offer — selective, user-driven cross-session import
9
- suggestion:
10
- eligible: false
11
- rationale: "Cluster sub-command — reached via its cluster head's routing or its explicit /cluster:sub name; not independently suggested (surface-consolidation)."
12
- workspaces:
13
- - agent-config-maintainer
14
- packs:
15
- - memory
16
- ---
17
- <!-- cloud_safe: noop -->
18
-
19
- # /chat-history import
20
-
21
- Read-only, **user-driven** cross-session import. Surfaces prior
22
- sessions logged in `agents/runtime/.agent-chat-history` as a numbered table,
23
- the user picks **one**, the agent reads that session **silently**
24
- and emits a 2–5 sentence summary, then offers to resume the last
25
- task from that session. The agent does **not** render entries
26
- verbatim, auto-import, or rewrite the user's context without an
27
- explicit instruction.
28
-
29
- This is the opt-in counterpart to the read-path filter (Phase 3 of
30
- `road-to-chat-history-session-isolation`): default reads stay
31
- session-scoped; `import` is the explicit surface for crossing the
32
- session boundary. For project-improving learnings derived from a
33
- prior session, see [`/memory mine-session --mode=proposals`](../memory/mine-session/command.md).
34
-
35
- ## When NOT to use
36
-
37
- - Inspect the current session — use the host's native transcript /
38
- session view, or `./scripts-run scripts/chat_history read`.
39
- - Generate a learning proposal from a prior session — use
40
- [`/memory mine-session --mode=proposals`](../memory/mine-session/command.md),
41
- which frames the session's signals and runs `learning-to-rule-or-skill`.
42
- - Bulk-import all sessions — out of scope for v1. One session per
43
- invocation; multi-pick is v2.
44
- - Search prior sessions by content — out of scope for v1; no fuzzy
45
- search, no full-text grep. The user picks by `last_ts` and
46
- `summary` from the listing.
47
-
48
- ## Steps
49
-
50
- ### 1. Check if enabled
51
-
52
- Read `chat_history.enabled` from `.agent-settings.yml`. If `false`
53
- or the section is missing, say so and stop:
54
-
55
- ```
56
- > 📒 chat-history is disabled (chat_history.enabled = false).
57
- > Set it to true in .agent-settings.yml to start logging.
58
- ```
59
-
60
- ### 2. List sessions
61
-
62
- Run `./scripts-run scripts/chat_history sessions --json --limit 20 --summary`.
63
- The helper returns an array of
64
- `{id, count, first_ts, last_ts, preview, summary}` sorted by
65
- `last_ts` desc. The `summary` field is built **inside the helper**
66
- from at most 10 sampled entries per session (5 oldest + 5 newest) —
67
- token-cheap, no need to ever read the full body for the picker.
68
- Default excludes empty buckets — only sessions with at least one
69
- body entry are surfaced.
70
-
71
- If the array is empty, stop:
72
-
73
- ```
74
- > 📒 No prior sessions found in agents/runtime/.agent-chat-history.
75
- ```
76
-
77
- ### 3. Surface as a numbered table
78
-
79
- Render the sessions as a markdown table — the row number is the
80
- option (per `user-interaction` Iron Law: numbered options for any
81
- picker). The session `id` is noise to humans; keep it **internal**
82
- for step 5's `read --session <id>` call and never render it.
83
- Format:
84
-
85
- ```
86
- Pick a session to import:
87
-
88
- | # | Date | Entries | Summary |
89
- |----|------------------|---------|---------|
90
- | 1 | YYYY-MM-DD HH:MM | N | {summary} |
91
- | 2 | YYYY-MM-DD HH:MM | N | {summary} |
92
- | … | | | |
93
- | N | — | — | abort — do not read any session |
94
- ```
95
-
96
- Format the timestamp as `YYYY-MM-DD HH:MM` (drop seconds and
97
- timezone — the listing is for orientation, not forensics). Lead the
98
- `Summary` cell with the helper's `summary` field — that is the
99
- rough arc the user picks by (`<first user msg> → <last user msg>`
100
- for normal sessions, or `(N entries — no user prompts; t-mix: …)`
101
- for tool-only sessions). Do **not** truncate or rewrite `summary` —
102
- markdown table wrap handles long values. Always include an explicit
103
- `abort` row as the last numbered option. Track option-number → `id`
104
- internally so step 5 can call `./scripts-run scripts/chat_history read
105
- --session <id>` with the right id.
106
-
107
- ### 4. Wait for the pick
108
-
109
- **One question per turn** (per `ask-when-uncertain`). Do not chain
110
- the listing with anything else; do not auto-pick; do not surface a
111
- default. Wait for the user's response.
112
-
113
- If the user picks the abort option, stop without reading.
114
-
115
- ### 5. Read the picked session silently
116
-
117
- Run `./scripts-run scripts/chat_history read --session <id> --last <count>`,
118
- where `<count>` is the picked row's `count` from step 2. The
119
- `--last` flag is **required** — the helper defaults to 5 entries,
120
- which would silently truncate any longer session. The helper returns
121
- the entries as JSON.
122
-
123
- **Do not render the entries.** The verbose dump was reversed by the
124
- user — token cost and scroll fatigue outweighed the verbatim
125
- contract. Read the JSON in-context, then proceed to step 6.
126
-
127
- ### 6. Summarise and offer to resume
128
-
129
- Emit a **2–5 sentence** summary of the picked session: the topic,
130
- what was decided or built, and where it left off (the last task in
131
- progress, if any). Plain prose — no bullets, no headings, no
132
- verbatim quotes.
133
-
134
- Then offer the resume choice as numbered options
135
- (per `user-interaction`), one question per turn:
136
-
137
- ```
138
- 1. resume — pick up the last task from that session
139
- 2. stop — keep the summary in context, do nothing else
140
- ```
141
-
142
- Wait for the pick. Do **not** auto-resume. If the user picks
143
- `resume`, hand off to the relevant skill or command for that work;
144
- do not silently start editing files. The agent does not write to
145
- the current session's log on the user's behalf without an explicit
146
- instruction.
147
-
148
- ## Gotchas
149
-
150
- - **Summary, not verbatim.** Earlier Council R2-2 favoured verbatim
151
- rendering; reversed in practice — too slow, too token-expensive.
152
- The agent reads the picked session in-context and emits a 2–5
153
- sentence summary. Verbatim rendering is no longer part of the
154
- contract.
155
- - **One pick per invocation.** Multi-pick is v2. If the user wants
156
- a second session, run `/chat-history import` again.
157
- - **Read-only.** This command never writes to `agents/runtime/.agent-chat-history`
158
- and never rotates.
159
- - **`<legacy>` and `<unknown>` buckets** show up like any other
160
- session id when they have body entries — the user can pick them
161
- too. The helper aggregates body entries with no `s` field into
162
- `<legacy>` and entries with `s == "<unknown>"` into `<unknown>`.
163
-
164
- ## See also
165
-
166
- - [`/memory mine-session --mode=proposals`](../memory/mine-session/command.md) — pick a prior session and turn it into a project-improving proposal via `learning-to-rule-or-skill` (the former `/chat-history learn`)
167
- - [`chat-history-platform-hooks`](../../../agents/settings/contexts/chat-history-platform-hooks.md) — read contract, isolation default, opt-in cross-session path
168
- - [`scripts/chat_history.ts`](../../../scripts/chat_history.ts) — `sessions` and `read --session` CLI surface
169
- - [`user-interaction`](../../rules/user-interaction.md) — numbered-options Iron Law
170
- - [`ask-when-uncertain`](../../rules/ask-when-uncertain.md) — one-question-per-turn Iron Law
@@ -1,63 +0,0 @@
1
- ---
2
- model_tier: medium
3
- name: chat-history
4
- disable-model-invocation: true
5
- argument-hint: "[import]"
6
- pack: memory
7
- visibility: internal
8
- description: Chat-history orchestrator — routes to import (selective cross-session resume). Mining moved to /memory mine-session; raw-log inspection uses the host's native transcript view.
9
- cluster: chat-history
10
- routes_to: [chat-history-import]
11
- type: orchestrator
12
- suggestion:
13
- eligible: true
14
- trigger_description: "import a prior session into the current chat, resume a previous session, pull a prior session in verbatim"
15
- trigger_context: "user wants to pull a prior session from the agents/runtime/.agent-chat-history log into the current chat verbatim and optionally resume it"
16
- workspaces:
17
- - agent-config-maintainer
18
- packs:
19
- - memory
20
- ---
21
-
22
- <!-- cloud_safe: noop -->
23
-
24
- # /chat-history
25
-
26
- Top-level orchestrator for the `/chat-history` family. Writes and overflow
27
- handling are driven entirely by platform hooks + `scripts/chat_history.ts`
28
- internals (`road-to-chat-history-hook-only`); the surfaced sub-command is
29
- read-only on the cross-host log (`agents/runtime/.agent-chat-history`).
30
- Sessions coexist in one log file — each entry self-tags via the `s` field —
31
- so there is no ownership layer to recover from.
32
-
33
- ## Sub-commands
34
-
35
- | Sub-command | Routes to | Purpose |
36
- |---|---|---|
37
- | `/chat-history import` | `commands/chat-history/import.md` | List prior sessions, pick one, render its entries verbatim — selective cross-session import + resume |
38
-
39
- **Consolidated elsewhere** (see `road-to-memory-pipeline-consolidation.md`):
40
-
41
- - **Mining a session for learnings** — use
42
- [`/memory mine-session --mode=proposals`](../memory/mine-session/command.md)
43
- (the former `/chat-history learn`; now the single mining command, reading the
44
- same cross-host log).
45
- - **Inspecting the raw log** (size, entries, header) — use the host's native
46
- transcript / session view; the bespoke `/chat-history show` was dropped as
47
- redundant.
48
-
49
- ## Dispatch
50
-
51
- 1. Parse the user's argument: `/chat-history <sub-command> [args]`.
52
- 2. The only sub-command is `import`. Bare `/chat-history` (or an unknown
53
- sub-command) → route to `import`.
54
- 3. Load `commands/chat-history/import.md` and follow its `## Steps` verbatim
55
- with the remaining args.
56
-
57
- ## Rules
58
-
59
- - **Do NOT commit, push, or open a PR** — `import` is read-only (it renders a
60
- prior session into the current chat; it writes nothing).
61
- - **Do NOT chain sub-commands.** One `/chat-history import` per turn.
62
- - **`import` crosses the session boundary** — only run it when the user
63
- explicitly asked for cross-session reading.