@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
@@ -0,0 +1,590 @@
1
+ /**
2
+ * Phase-3 verbs a gate can read (`road-to-a-graph-that-is-shipped` 3.1–3.3).
3
+ *
4
+ * `query` / `explain` / `affected` / `path` answer a question a human asked.
5
+ * These four answer a question a GATE asks, which is a different shape: the
6
+ * output has to be a decidable set rather than a readable neighbourhood, and it
7
+ * has to say what it filtered out, because a gate that acts on a set nobody can
8
+ * audit is a gate nobody should trust.
9
+ *
10
+ * THE ACCEPTED-EDGE FILTER, and why it is `resolved_via` and not `confidence`.
11
+ *
12
+ * An edge is ACCEPTED when its `resolved_via` is not in
13
+ * {@link NON_ACCEPTED_VIA} — `name-lookup` and `dynamic`. Both are guesses:
14
+ * `name-lookup` is the repo-wide same-name table (or a lookup that found
15
+ * nothing), and `dynamic` is a receiver the extractor cannot type. Neither
16
+ * states where the target came from, so neither may drive a gate.
17
+ *
18
+ * The filter cannot be expressed on the confidence axis at all, which is the
19
+ * whole reason 2.2 added the field: a `name-lookup` hit and a `same-file` hit
20
+ * can both be INFERRED, and an AMBIGUOUS `import-specifier` edge carries a real
21
+ * specifier the file itself states. Filtering on `confidence` would drop the
22
+ * second and keep the first — exactly backwards.
23
+ *
24
+ * EVERY VERB REPORTS ITS OWN FILTERING.
25
+ *
26
+ * Each result carries a `resolved_via` histogram over the edges it CONSIDERED
27
+ * (accepted and rejected, separately) plus the graph's staleness state. A
28
+ * caller can therefore tell "no callers" from "no callers I would trust", and
29
+ * "dead" from "dead as of a graph 40 commits behind".
30
+ */
31
+ import * as fs from 'node:fs';
32
+ import * as path from 'node:path';
33
+
34
+ import type { GraphState } from './detect.js';
35
+ import type { LoadedGraph, RecommendedRead } from './query.js';
36
+ import { resolveSeeds } from './query.js';
37
+ import { sanitizeLabel } from './sanitize.js';
38
+ import { type CodeEdge, EXT_LANG, GUESS_RESOLVED_VIA, isStatedResolution, type ResolvedVia } from './types.js';
39
+
40
+ /**
41
+ * Mechanisms a gate-facing verb refuses to walk.
42
+ *
43
+ * Named as the REJECTED set rather than the accepted one deliberately: the
44
+ * accepted set grows every time a resolution tier lands (2.3 added `path-alias`
45
+ * and `psr4`; a future route table adds `route-table`), and an allowlist would
46
+ * have silently excluded each new mechanism until someone remembered to add it.
47
+ * A denylist of the two guesses is the invariant.
48
+ */
49
+ export const NON_ACCEPTED_VIA: ReadonlySet<ResolvedVia> = GUESS_RESOLVED_VIA;
50
+
51
+ export function isAcceptedEdge(e: CodeEdge): boolean {
52
+ return isStatedResolution(e.resolved_via);
53
+ }
54
+
55
+ /**
56
+ * Relations that constitute a REFERENCE to the target, as opposed to
57
+ * containment of it.
58
+ *
59
+ * `member` is the one exclusion and it is load-bearing for `dead`: the build
60
+ * pass emits `file --member--> symbol` and `class --member--> method` for every
61
+ * declaration, so on the fixture that motivated this every one of the ten nodes
62
+ * had an accepted in-edge and `dead` returned the empty set — a verb that can
63
+ * never report anything, which is worse than a wrong one because it looks calm.
64
+ * A declaration is not a use.
65
+ *
66
+ * `tests` IS a reference: a symbol only a test imports is referenced, and
67
+ * whether that makes it live is the caller's judgement, not the graph's.
68
+ * `untested` is the verb that answers the other question.
69
+ */
70
+ export const REFERENCE_RELATIONS: ReadonlySet<CodeEdge['relation']> = new Set<CodeEdge['relation']>([
71
+ 'calls',
72
+ 'imports',
73
+ 'uses',
74
+ 'inherits',
75
+ 'tests',
76
+ ]);
77
+
78
+ export function isReferenceEdge(e: CodeEdge): boolean {
79
+ return REFERENCE_RELATIONS.has(e.relation);
80
+ }
81
+
82
+ /** Descending-by-count `resolved_via` histogram, ties broken alphabetically. */
83
+ export function viaHistogram(edges: readonly CodeEdge[]): string {
84
+ const counts = new Map<string, number>();
85
+ for (const e of edges) counts.set(e.resolved_via, (counts.get(e.resolved_via) ?? 0) + 1);
86
+ if (counts.size === 0) return '(none)';
87
+ return [...counts.entries()]
88
+ .sort((a, b) => b[1] - a[1] || (a[0] < b[0] ? -1 : 1))
89
+ .map(([via, n]) => `${via} ${n}`)
90
+ .join(' · ');
91
+ }
92
+
93
+ /** Common envelope: what answered, how stale it was, what was filtered. */
94
+ export interface VerbReport {
95
+ source: string;
96
+ state: GraphState;
97
+ /** `resolved_via` histogram of the edges the walk ACCEPTED. */
98
+ accepted_via: string;
99
+ /** `resolved_via` histogram of the edges the walk REFUSED to walk. */
100
+ rejected_via: string;
101
+ lines: string[];
102
+ recommended_reads: RecommendedRead[];
103
+ }
104
+
105
+ function readFor(g: LoadedGraph, id: string): RecommendedRead | null {
106
+ const n = g.byId.get(id);
107
+ if (!n) return null;
108
+ const loc = n.source_location;
109
+ return { path: n.source_file, lines: loc.length >= 3 ? [loc[0] as number, loc[2] as number] : null };
110
+ }
111
+
112
+ function dedupeReads(reads: readonly (RecommendedRead | null)[]): RecommendedRead[] {
113
+ const m = new Map<string, RecommendedRead>();
114
+ for (const r of reads) {
115
+ if (!r) continue;
116
+ m.set(r.lines ? `${r.path}:${r.lines[0]}-${r.lines[1]}` : r.path, r);
117
+ }
118
+ return [...m.values()];
119
+ }
120
+
121
+ // 3.1 impact.
122
+
123
+ /** One reverse-reachable node, with how far away it is and what reached it. */
124
+ export interface ReachedNode {
125
+ node: string;
126
+ /** Hop distance from the nearest seed. Never 0 — a seed is not a dependent. */
127
+ depth: number;
128
+ /** The relation of the edge that FIRST reached it, at its shallowest depth. */
129
+ via: CodeEdge['relation'];
130
+ /** That edge's mechanism. */
131
+ resolved_via: ResolvedVia;
132
+ }
133
+
134
+ export interface ImpactResult extends VerbReport {
135
+ /** Node ids the diff touched that the graph knows. */
136
+ seeds: string[];
137
+ /**
138
+ * Touched files the graph SHOULD know and does not — a real gap.
139
+ *
140
+ * A file in a language the engine indexes (php / ts / js) that carries no
141
+ * node. Distinct from {@link ImpactResult.not_indexed_files}, and the
142
+ * distinction is the finding: an unindexed `.md` is not an unknown
143
+ * neighbourhood.
144
+ */
145
+ unresolved_files: string[];
146
+ /** Touched files in a language the engine does not index. Not a gap. */
147
+ not_indexed_files: string[];
148
+ /** Reverse-reachable callers/dependents over accepted edges, sorted. */
149
+ dependents: string[];
150
+ /**
151
+ * The same set as `dependents`, carrying depth and the reaching relation.
152
+ *
153
+ * Two shapes for one set, deliberately: `dependents` is what a human reads
154
+ * and what the golden fixtures pin, while a consumer that has to explain
155
+ * WHY a node is in the set — the regression selector, 3.4 — needs the hop
156
+ * count and the relation, and reconstructing them by re-running the walk at
157
+ * increasing depths would be the same BFS three times.
158
+ */
159
+ reached: ReachedNode[];
160
+ /** The subset of `dependents` declared in a test file. */
161
+ test_files: string[];
162
+ /** The edges that produced `dependents`, rendered. */
163
+ producing_edges: string[];
164
+ }
165
+
166
+ /**
167
+ * Node ids declared in `files`, plus the file nodes themselves.
168
+ *
169
+ * `idsInFiles` deliberately excludes `kind: 'file'` nodes (it exists to seed a
170
+ * symbol walk), but an `imports` edge's source IS the file node, so a diff that
171
+ * only changes a file's import list would seed nothing without them. Added here
172
+ * rather than by changing `idsInFiles`, whose two existing callers want the
173
+ * symbol-only behaviour.
174
+ */
175
+ export function seedsForFiles(
176
+ g: LoadedGraph,
177
+ files: readonly string[],
178
+ ): { seeds: string[]; unresolved: string[]; not_indexed: string[] } {
179
+ const symbols = g.idsInFiles(files);
180
+ const seeds = new Set(symbols);
181
+ const unresolved: string[] = [];
182
+ const notIndexed: string[] = [];
183
+ for (const f of files) {
184
+ if (g.byId.has(f)) {
185
+ seeds.add(f);
186
+ continue;
187
+ }
188
+ if (symbols.some((s) => s.startsWith(`${f}#`))) continue;
189
+ // A `.md`, `.json` or `.yaml` the engine never indexes is NOT an
190
+ // unknown neighbourhood — it is a file with no symbols, which is a fact
191
+ // about the language set and not a gap in the graph. Conflating the two
192
+ // made `selectionVerdict` refuse unconditionally for any candidate that
193
+ // touched a doc, and made `impact --diff` print a long
194
+ // "unresolved changed files" list on every normal diff. Found by an
195
+ // independent review, demonstrated with `touches: ['…Mailer.php',
196
+ // 'README.md']`.
197
+ if (EXT_LANG[path.extname(f).toLowerCase()] === undefined) notIndexed.push(f);
198
+ else unresolved.push(f);
199
+ }
200
+ return {
201
+ seeds: [...seeds].sort(),
202
+ unresolved: unresolved.sort(),
203
+ not_indexed: notIndexed.sort(),
204
+ };
205
+ }
206
+
207
+ /**
208
+ * `impact` — everything that reaches the changed symbols over ACCEPTED edges.
209
+ *
210
+ * Reverse BFS, so `dependents` are the things a change to the seeds can break,
211
+ * never the things the seeds themselves use. `depth` bounds the walk; the
212
+ * default of 2 matches `affected`'s so the two verbs do not disagree about what
213
+ * "reachable" means.
214
+ */
215
+ export function impact(
216
+ g: LoadedGraph,
217
+ files: readonly string[],
218
+ state: GraphState,
219
+ depth = 2,
220
+ isTest: (relPath: string) => boolean = () => false,
221
+ ): ImpactResult {
222
+ const { seeds, unresolved, not_indexed } = seedsForFiles(g, files);
223
+ const accepted: CodeEdge[] = [];
224
+ const rejected: CodeEdge[] = [];
225
+ const seen = new Set(seeds);
226
+ const reached = new Map<string, ReachedNode>();
227
+ let frontier = [...seeds];
228
+ for (let d = 0; d < depth && frontier.length; d += 1) {
229
+ const next: string[] = [];
230
+ for (const t of frontier) {
231
+ // Containment first, for the same reason `dead` does it: a
232
+ // `member` in-edge is the declaring file, never a dependent, and
233
+ // counting it as a rejected MECHANISM would misreport the filter.
234
+ for (const e of (g.in.get(t) ?? []).filter(isReferenceEdge)) {
235
+ if (!isAcceptedEdge(e)) {
236
+ rejected.push(e);
237
+ continue;
238
+ }
239
+ accepted.push(e);
240
+ if (seen.has(e.source)) continue;
241
+ seen.add(e.source);
242
+ reached.set(e.source, {
243
+ node: e.source,
244
+ depth: d + 1,
245
+ via: e.relation,
246
+ resolved_via: e.resolved_via,
247
+ });
248
+ next.push(e.source);
249
+ }
250
+ }
251
+ frontier = next;
252
+ }
253
+ const deps = [...reached.keys()].sort();
254
+ const fileOf = (id: string): string => g.byId.get(id)?.source_file ?? '';
255
+ const testFiles = [...new Set(deps.map(fileOf).filter((f) => f !== '' && isTest(f)))].sort();
256
+ return {
257
+ source: g.source,
258
+ state,
259
+ accepted_via: viaHistogram(accepted),
260
+ rejected_via: viaHistogram(rejected),
261
+ seeds,
262
+ unresolved_files: unresolved,
263
+ not_indexed_files: not_indexed,
264
+ dependents: deps,
265
+ reached: deps.map((d) => reached.get(d) as ReachedNode),
266
+ test_files: testFiles,
267
+ producing_edges: accepted.map(renderEdge).sort(),
268
+ lines: deps.map((d) => `${d}`),
269
+ recommended_reads: dedupeReads(deps.map((d) => readFor(g, d))),
270
+ };
271
+ }
272
+
273
+ function renderEdge(e: CodeEdge): string {
274
+ return `${e.confidence} ${sanitizeLabel(e.source)} --${e.relation}/${e.resolved_via}--> ${sanitizeLabel(e.target)}`;
275
+ }
276
+
277
+ // 3.2 tests-for / untested.
278
+
279
+ export interface TestsForResult extends VerbReport {
280
+ seeds: string[];
281
+ /** Test-file node ids whose `tests` edge reaches a seed, sorted. */
282
+ tests: string[];
283
+ /** The `tests` edges this walk accepted — so a caller aggregating several
284
+ * symbols reports the histogram of the walk the decision came from. */
285
+ accepted_edges: CodeEdge[];
286
+ /** The `tests` edges this walk refused, for the same reason. */
287
+ rejected_edges: CodeEdge[];
288
+ }
289
+
290
+ /**
291
+ * `tests-for <symbol>` — the test files that import the symbol, or its file.
292
+ *
293
+ * Two hops of one specific shape, not a general BFS: a `tests` edge points at
294
+ * whatever the test file imported, which is usually the SYMBOL but is the FILE
295
+ * node when the test imports a module rather than a name. So a seed's own
296
+ * `tests` in-edges are collected, and so are its declaring file's — otherwise
297
+ * `tests-for someFunction` would answer empty for a test that does
298
+ * `import * as m from './mod.js'`.
299
+ */
300
+ export function testsFor(g: LoadedGraph, symbol: string, state: GraphState): TestsForResult {
301
+ const seeds = resolveSeeds(g, symbol);
302
+ const targets = new Set(seeds);
303
+ for (const s of seeds) {
304
+ const f = g.byId.get(s)?.source_file;
305
+ if (f && g.byId.has(f)) targets.add(f);
306
+ }
307
+ const accepted: CodeEdge[] = [];
308
+ const rejected: CodeEdge[] = [];
309
+ const tests = new Set<string>();
310
+ for (const t of targets) {
311
+ for (const e of g.in.get(t) ?? []) {
312
+ if (e.relation !== 'tests') continue;
313
+ if (!isAcceptedEdge(e)) {
314
+ rejected.push(e);
315
+ continue;
316
+ }
317
+ accepted.push(e);
318
+ tests.add(e.source);
319
+ }
320
+ }
321
+ const list = [...tests].sort();
322
+ return {
323
+ source: g.source,
324
+ state,
325
+ accepted_via: viaHistogram(accepted),
326
+ rejected_via: viaHistogram(rejected),
327
+ seeds,
328
+ tests: list,
329
+ accepted_edges: accepted,
330
+ rejected_edges: rejected,
331
+ lines: list,
332
+ recommended_reads: dedupeReads(list.map((t) => readFor(g, t))),
333
+ };
334
+ }
335
+
336
+ export interface UntestedResult extends VerbReport {
337
+ seeds: string[];
338
+ unresolved_files: string[];
339
+ not_indexed_files: string[];
340
+ /** Changed nodes with no `tests` edge reaching them or their file. */
341
+ untested: string[];
342
+ /** Changed nodes that do have one — reported so the ratio is readable. */
343
+ tested: string[];
344
+ }
345
+
346
+ /**
347
+ * `untested --diff <rev>` — changed symbols no test file imports.
348
+ *
349
+ * File nodes are excluded from the answer: a file is "tested" exactly when
350
+ * something in it is, so listing both the file and its symbols would double
351
+ * count and make the ratio meaningless.
352
+ */
353
+ export function untested(g: LoadedGraph, files: readonly string[], state: GraphState): UntestedResult {
354
+ const { seeds, unresolved, not_indexed } = seedsForFiles(g, files);
355
+ const accepted: CodeEdge[] = [];
356
+ const rejected: CodeEdge[] = [];
357
+ const tested: string[] = [];
358
+ const bare: string[] = [];
359
+ for (const s of seeds) {
360
+ if (g.byId.get(s)?.kind === 'file') continue;
361
+ const r = testsFor(g, s, state);
362
+ // Both histograms come from the SAME walk the decision came from —
363
+ // `testsFor`, which also consults the declaring FILE's edges. They used
364
+ // to be assembled here from the seed's own edges with `rejected_via`
365
+ // hardcoded to `(none)`, so the envelope could report "nothing was
366
+ // rejected" without measuring, and "accepted: (none)" for a symbol it
367
+ // had just called tested. An independent review found both.
368
+ accepted.push(...r.accepted_edges);
369
+ rejected.push(...r.rejected_edges);
370
+ if (r.tests.length) tested.push(s);
371
+ else bare.push(s);
372
+ }
373
+ return {
374
+ source: g.source,
375
+ state,
376
+ accepted_via: viaHistogram(accepted),
377
+ rejected_via: viaHistogram(rejected),
378
+ seeds,
379
+ unresolved_files: unresolved,
380
+ not_indexed_files: not_indexed,
381
+ untested: bare.sort(),
382
+ tested: tested.sort(),
383
+ lines: bare.sort(),
384
+ recommended_reads: dedupeReads(bare.map((b) => readFor(g, b))),
385
+ };
386
+ }
387
+
388
+ // 3.3 dead.
389
+
390
+ /** One declared entry-point source, and whether it could be read. */
391
+ export interface EntryPointSource {
392
+ name: 'routes' | 'exports' | 'cli-registry' | 'hook-manifest' | 'allowlist';
393
+ /** `read` — consulted successfully. `empty` — consulted, nothing declared.
394
+ * `unavailable` — the graph or the tree cannot answer it at all. */
395
+ status: 'read' | 'empty' | 'unavailable';
396
+ /** Why, when `unavailable`. */
397
+ detail?: string;
398
+ /** Node ids or labels this source declares as entry points. */
399
+ entries: string[];
400
+ }
401
+
402
+ export interface DeadResult extends VerbReport {
403
+ sources: EntryPointSource[];
404
+ /** Non-null when the verb REFUSED to answer. The list is then empty. */
405
+ refusal: string | null;
406
+ dead: string[];
407
+ /** Entry points excluded from `dead` — the audit trail for the exclusion. */
408
+ excluded: string[];
409
+ }
410
+
411
+ /**
412
+ * Symbols with zero accepted in-edges, minus declared entry points.
413
+ *
414
+ * WHY THIS VERB CAN REFUSE.
415
+ *
416
+ * AI council 2026-09-08 (2/2 convergent, round 2 Fork 4, option 2). Step 3.3
417
+ * names four entry-point sources — routes, exports, the CLI registry, the hook
418
+ * manifest — and one of them, `exports`, cannot be evaluated from this graph at
419
+ * all: the extractor records no exportedness (`FileExtract` carries
420
+ * `nodes / rawEdges / inherits / parseError`; `CodeNode` carries no export
421
+ * flag). Without it, every exported-but-not-yet-imported public symbol in a
422
+ * library-shaped tree reports as dead — which is Risk-Register rank 4 arriving
423
+ * through the verb rather than around it: *"A confident false 'dead' is worse
424
+ * than no verb: it invites a deletion the graph cannot justify."*
425
+ *
426
+ * So the verb is fail-closed in the shape this repository already uses for
427
+ * `selectionVerdict` (`_lib/regression_neighbourhood.ts`): the refusal is not
428
+ * relaxable by an option object, only by the caller supplying the missing
429
+ * source (`--entry-points <file>`) or explicitly acknowledging its absence
430
+ * (`--accept-missing-exports`). Both are visible in a command line and in a
431
+ * diff; a boolean buried in an options bag is not.
432
+ *
433
+ * WHAT IT DOES NOT CLAIM.
434
+ *
435
+ * Nothing here says an unreferenced symbol should be deleted. `dead` reports
436
+ * "no accepted in-edge, and no declared entry point names it", which is a
437
+ * question worth asking and not an answer.
438
+ */
439
+ export function dead(
440
+ g: LoadedGraph,
441
+ sources: readonly EntryPointSource[],
442
+ state: GraphState,
443
+ opts: { acceptMissingExports?: boolean } = {},
444
+ ): DeadResult {
445
+ const unavailable = sources.filter((s) => s.status === 'unavailable');
446
+ const base = {
447
+ source: g.source,
448
+ state,
449
+ sources: [...sources],
450
+ };
451
+ if (unavailable.length > 0 && opts.acceptMissingExports !== true) {
452
+ return {
453
+ ...base,
454
+ accepted_via: '(none)',
455
+ rejected_via: '(none)',
456
+ refusal:
457
+ `entry-point source(s) unavailable: ${unavailable
458
+ .map((s) => `${s.name} (${s.detail ?? 'no detail'})`)
459
+ .join('; ')}. ` +
460
+ 'A symbol they would have declared an entry point is indistinguishable from a dead one, ' +
461
+ 'so no list is produced. Supply the missing source with --entry-points <file>, or state ' +
462
+ 'that you accept the gap with --accept-missing-exports.',
463
+ dead: [],
464
+ excluded: [],
465
+ lines: [],
466
+ recommended_reads: [],
467
+ };
468
+ }
469
+
470
+ const entries = new Set<string>();
471
+ for (const s of sources) for (const e of s.entries) entries.add(e);
472
+ const accepted: CodeEdge[] = [];
473
+ const rejected: CodeEdge[] = [];
474
+ const candidates: string[] = [];
475
+ const excluded: string[] = [];
476
+ for (const id of g.allNodeIds()) {
477
+ const n = g.byId.get(id);
478
+ if (!n || n.kind === 'file' || n.kind === 'skipped') continue;
479
+ // Containment is filtered BEFORE acceptance, so the histogram counts
480
+ // only edges the verb actually reasoned about — a `member` edge in
481
+ // `rejected_via` would read as a rejected mechanism, which it is not.
482
+ const incoming = (g.in.get(id) ?? []).filter(isReferenceEdge);
483
+ const acc = incoming.filter(isAcceptedEdge);
484
+ accepted.push(...acc);
485
+ rejected.push(...incoming.filter((e) => !isAcceptedEdge(e)));
486
+ if (acc.length > 0) continue;
487
+ if (entries.has(id) || entries.has(n.label)) {
488
+ excluded.push(id);
489
+ continue;
490
+ }
491
+ candidates.push(id);
492
+ }
493
+ const list = candidates.sort();
494
+ return {
495
+ ...base,
496
+ accepted_via: viaHistogram(accepted),
497
+ rejected_via: viaHistogram(rejected),
498
+ refusal: null,
499
+ dead: list,
500
+ excluded: excluded.sort(),
501
+ lines: list,
502
+ recommended_reads: dedupeReads(list.map((d) => readFor(g, d))),
503
+ };
504
+ }
505
+
506
+ // Entry-point providers.
507
+
508
+ /**
509
+ * DECLARED names in a registry or manifest — quoted string literals and YAML
510
+ * scalar values, never every identifier in the file.
511
+ *
512
+ * The first version matched `/[A-Za-z_$][A-Za-z0-9_$]*​/g` over the whole file,
513
+ * which on this tree yielded ~2,595 tokens including `name`, `build`, `query`,
514
+ * `path`, `main`, `run`, `get`, `set`, `value` and `status`. Every symbol whose
515
+ * LABEL happened to be one of those was silently excluded from `dead` and
516
+ * dumped into a list described as "the audit trail for the exclusion" — at that
517
+ * size unable to distinguish a declared entry point from a coincidental word.
518
+ * An independent review measured it.
519
+ *
520
+ * A registry and a manifest both DECLARE by value: `{ name: 'code-graph', … }`,
521
+ * `id: code-graph-context`. So the extraction is quoted strings plus
522
+ * `key: value` scalars, which is narrower by construction and still a scan
523
+ * rather than a parse — a provider that half-parses a TypeScript module is a
524
+ * provider that goes wrong quietly.
525
+ *
526
+ * Still a heuristic, and the direction is the safe one: a missed declaration
527
+ * makes `dead` report a real entry point (loud, and caught by the reader), a
528
+ * spurious one makes it miss a dead symbol (quiet). That asymmetry is why the
529
+ * narrowing is worth the risk of missing one.
530
+ */
531
+ function declaredNames(text: string): string[] {
532
+ const out = new Set<string>();
533
+ for (const m of text.matchAll(/'([^'\n]{1,120})'|"([^"\n]{1,120})"|`([^`\n]{1,120})`/g)) {
534
+ const v = (m[1] ?? m[2] ?? m[3] ?? '').trim();
535
+ if (v !== '') out.add(v);
536
+ }
537
+ for (const m of text.matchAll(/^[ \t-]*[A-Za-z_][\w-]*:[ \t]+([^\n#]{1,120})$/gm)) {
538
+ const v = (m[1] ?? '').trim().replace(/^['"]|['"]$/g, '');
539
+ if (v !== '') out.add(v);
540
+ }
541
+ return [...out];
542
+ }
543
+
544
+ /**
545
+ * The four sources step 3.3 names, read from `root`.
546
+ *
547
+ * `exports` is ALWAYS `unavailable` here, with the reason stated, until the
548
+ * extractor records exportedness. That is the honest reading and it is what
549
+ * makes {@link dead} refuse by default rather than lie by default.
550
+ */
551
+ export function repoEntryPoints(root: string): EntryPointSource[] {
552
+ const out: EntryPointSource[] = [];
553
+
554
+ const registry = path.join(root, 'src', 'cli', 'registry.ts');
555
+ if (fs.existsSync(registry)) {
556
+ out.push({ name: 'cli-registry', status: 'read', entries: declaredNames(fs.readFileSync(registry, 'utf-8')) });
557
+ } else {
558
+ out.push({ name: 'cli-registry', status: 'empty', entries: [] });
559
+ }
560
+
561
+ const manifest = path.join(root, 'src', 'scripts', 'hook_manifest.yaml');
562
+ if (fs.existsSync(manifest)) {
563
+ out.push({ name: 'hook-manifest', status: 'read', entries: declaredNames(fs.readFileSync(manifest, 'utf-8')) });
564
+ } else {
565
+ out.push({ name: 'hook-manifest', status: 'empty', entries: [] });
566
+ }
567
+
568
+ // Routes: no route table exists in this repository. `empty` rather than
569
+ // `unavailable` — consulted, nothing declared — because an absent route
570
+ // table is a fact about the tree, not a gap in the graph.
571
+ out.push({ name: 'routes', status: 'empty', entries: [] });
572
+
573
+ out.push({
574
+ name: 'exports',
575
+ status: 'unavailable',
576
+ detail: 'the extractor records no exportedness — CodeNode carries no export flag',
577
+ entries: [],
578
+ });
579
+ return out;
580
+ }
581
+
582
+ /** An operator-supplied entry-point list: one id or label per line, `#` comments. */
583
+ export function entryPointsFromFile(file: string): EntryPointSource {
584
+ const lines = fs
585
+ .readFileSync(file, 'utf-8')
586
+ .split('\n')
587
+ .map((l) => l.trim())
588
+ .filter((l) => l !== '' && !l.startsWith('#'));
589
+ return { name: 'allowlist', status: lines.length ? 'read' : 'empty', entries: lines };
590
+ }