@event4u/agent-config 2.25.0 → 3.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 (804) hide show
  1. package/.agent-src/commands/agent-handoff.md +15 -3
  2. package/.agent-src/commands/agent-status.md +12 -0
  3. package/.agent-src/commands/agents/audit.md +12 -0
  4. package/.agent-src/commands/agents/init.md +12 -0
  5. package/.agent-src/commands/agents/optimize.md +12 -0
  6. package/.agent-src/commands/agents/user/accept.md +12 -0
  7. package/.agent-src/commands/agents/user/init.md +12 -0
  8. package/.agent-src/commands/agents/user/review.md +12 -0
  9. package/.agent-src/commands/agents/user/show.md +12 -0
  10. package/.agent-src/commands/agents/user/update.md +12 -0
  11. package/.agent-src/commands/agents/user.md +12 -0
  12. package/.agent-src/commands/agents.md +12 -0
  13. package/.agent-src/commands/analyze-reference-repo.md +15 -3
  14. package/.agent-src/commands/bug-fix.md +13 -0
  15. package/.agent-src/commands/bug-investigate.md +13 -1
  16. package/.agent-src/commands/challenge-me/vision.md +12 -0
  17. package/.agent-src/commands/challenge-me/with-docs.md +12 -0
  18. package/.agent-src/commands/challenge-me.md +12 -0
  19. package/.agent-src/commands/chat-history/import.md +16 -4
  20. package/.agent-src/commands/chat-history/learn.md +15 -3
  21. package/.agent-src/commands/chat-history/show.md +17 -5
  22. package/.agent-src/commands/chat-history.md +14 -2
  23. package/.agent-src/commands/check-current-md.md +12 -0
  24. package/.agent-src/commands/commit/in-chunks.md +12 -0
  25. package/.agent-src/commands/commit.md +12 -0
  26. package/.agent-src/commands/compress.md +12 -0
  27. package/.agent-src/commands/context/create.md +17 -5
  28. package/.agent-src/commands/context/refactor.md +15 -3
  29. package/.agent-src/commands/context.md +12 -0
  30. package/.agent-src/commands/cost-report.md +12 -0
  31. package/.agent-src/commands/council/analysis.md +15 -3
  32. package/.agent-src/commands/council/debate.md +17 -5
  33. package/.agent-src/commands/council/default.md +17 -5
  34. package/.agent-src/commands/council/design.md +12 -0
  35. package/.agent-src/commands/council/optimize.md +12 -0
  36. package/.agent-src/commands/council/pr.md +12 -0
  37. package/.agent-src/commands/council.md +13 -1
  38. package/.agent-src/commands/create-pr/description-only.md +12 -0
  39. package/.agent-src/commands/create-pr.md +39 -0
  40. package/.agent-src/commands/e2e-heal.md +12 -0
  41. package/.agent-src/commands/e2e-plan.md +12 -0
  42. package/.agent-src/commands/estimate-ticket.md +12 -0
  43. package/.agent-src/commands/feature/dev.md +13 -1
  44. package/.agent-src/commands/feature/explore.md +12 -0
  45. package/.agent-src/commands/feature/plan.md +14 -2
  46. package/.agent-src/commands/feature/refactor.md +12 -0
  47. package/.agent-src/commands/feature/roadmap.md +14 -2
  48. package/.agent-src/commands/feature.md +12 -0
  49. package/.agent-src/commands/fix/ci.md +12 -0
  50. package/.agent-src/commands/fix/portability.md +12 -0
  51. package/.agent-src/commands/fix/pr-bot-comments.md +12 -0
  52. package/.agent-src/commands/fix/pr-comments.md +12 -0
  53. package/.agent-src/commands/fix/pr-developer-comments.md +12 -0
  54. package/.agent-src/commands/fix/refs.md +12 -0
  55. package/.agent-src/commands/fix/seeder.md +15 -2
  56. package/.agent-src/commands/fix.md +12 -0
  57. package/.agent-src/commands/ghostwriter/delete.md +20 -8
  58. package/.agent-src/commands/ghostwriter/fetch.md +19 -7
  59. package/.agent-src/commands/ghostwriter/list.md +19 -7
  60. package/.agent-src/commands/ghostwriter/show.md +14 -2
  61. package/.agent-src/commands/ghostwriter/write.md +15 -3
  62. package/.agent-src/commands/ghostwriter.md +14 -2
  63. package/.agent-src/commands/grill-me.md +12 -0
  64. package/.agent-src/commands/implement-ticket.md +12 -0
  65. package/.agent-src/commands/jira-ticket.md +12 -0
  66. package/.agent-src/commands/judge/on-diff.md +12 -0
  67. package/.agent-src/commands/judge/solo.md +12 -0
  68. package/.agent-src/commands/judge/steps.md +12 -0
  69. package/.agent-src/commands/judge.md +12 -0
  70. package/.agent-src/commands/memory/add.md +15 -3
  71. package/.agent-src/commands/memory/learn-low-impact.md +18 -6
  72. package/.agent-src/commands/memory/load.md +12 -0
  73. package/.agent-src/commands/memory/mine-session.md +12 -0
  74. package/.agent-src/commands/memory/promote.md +12 -0
  75. package/.agent-src/commands/memory/propose.md +12 -0
  76. package/.agent-src/commands/memory.md +12 -0
  77. package/.agent-src/commands/mode.md +12 -0
  78. package/.agent-src/commands/module/create.md +13 -0
  79. package/.agent-src/commands/module/explore.md +23 -7
  80. package/.agent-src/commands/module.md +12 -0
  81. package/.agent-src/commands/optimize/agents-dir.md +14 -2
  82. package/.agent-src/commands/optimize/augmentignore.md +64 -20
  83. package/.agent-src/commands/optimize/rtk.md +68 -30
  84. package/.agent-src/commands/optimize/skills.md +12 -0
  85. package/.agent-src/commands/optimize-prompt.md +12 -0
  86. package/.agent-src/commands/optimize.md +12 -0
  87. package/.agent-src/commands/orchestrate.md +13 -1
  88. package/.agent-src/commands/override/create.md +12 -0
  89. package/.agent-src/commands/override/manage.md +12 -0
  90. package/.agent-src/commands/override.md +12 -0
  91. package/.agent-src/commands/package-reset.md +12 -0
  92. package/.agent-src/commands/package-test.md +98 -10
  93. package/.agent-src/commands/post-as/ghostwriter.md +12 -0
  94. package/.agent-src/commands/post-as/me.md +13 -1
  95. package/.agent-src/commands/post-as.md +12 -0
  96. package/.agent-src/commands/prepare-for-review.md +12 -0
  97. package/.agent-src/commands/project-analyze.md +27 -15
  98. package/.agent-src/commands/project-health.md +13 -1
  99. package/.agent-src/commands/quality-fix.md +61 -27
  100. package/.agent-src/commands/refine-ticket.md +12 -0
  101. package/.agent-src/commands/research/deep.md +12 -0
  102. package/.agent-src/commands/research/report.md +12 -0
  103. package/.agent-src/commands/research.md +12 -0
  104. package/.agent-src/commands/review-changes.md +12 -0
  105. package/.agent-src/commands/review-routing.md +12 -0
  106. package/.agent-src/commands/roadmap/ai-council.md +15 -3
  107. package/.agent-src/commands/roadmap/create.md +13 -1
  108. package/.agent-src/commands/roadmap/process-full.md +12 -0
  109. package/.agent-src/commands/roadmap/process-phase.md +12 -0
  110. package/.agent-src/commands/roadmap/process-step.md +12 -0
  111. package/.agent-src/commands/roadmap.md +12 -0
  112. package/.agent-src/commands/rule-compliance-audit.md +12 -0
  113. package/.agent-src/commands/set-cost-profile.md +12 -0
  114. package/.agent-src/commands/sync-agent-settings.md +12 -0
  115. package/.agent-src/commands/sync-gitignore/fix.md +32 -13
  116. package/.agent-src/commands/sync-gitignore.md +13 -1
  117. package/.agent-src/commands/tests/create.md +12 -0
  118. package/.agent-src/commands/tests/execute.md +12 -0
  119. package/.agent-src/commands/tests.md +12 -0
  120. package/.agent-src/commands/threat-model.md +12 -0
  121. package/.agent-src/commands/update-form-request-messages.md +14 -1
  122. package/.agent-src/commands/upstream-contribute.md +12 -0
  123. package/.agent-src/commands/video/from-script.md +12 -0
  124. package/.agent-src/commands/video/scene.md +12 -0
  125. package/.agent-src/commands/video/stitch.md +13 -1
  126. package/.agent-src/commands/video/storyboard.md +12 -0
  127. package/.agent-src/commands/video.md +12 -0
  128. package/.agent-src/commands/work.md +12 -0
  129. package/.agent-src/contexts/augment-infrastructure.md +6 -9
  130. package/.agent-src/contexts/authority/scope-mechanics.md +11 -0
  131. package/.agent-src/contexts/communication/rules-auto/guidelines-mechanics.md +1 -1
  132. package/.agent-src/contexts/contracts/agents-md-anatomy.md +1 -1
  133. package/.agent-src/contexts/contracts/research-schema.md +1 -1
  134. package/.agent-src/contexts/documentation-hierarchy.md +2 -2
  135. package/.agent-src/contexts/execution/interrupt-examples.md +34 -0
  136. package/.agent-src/contexts/execution/roadmap-process-loop.md +19 -0
  137. package/.agent-src/contexts/skills-and-commands.md +2 -2
  138. package/.agent-src/ghostwriter/README.md +2 -2
  139. package/.agent-src/ghostwriter/fictional-fixture-v1.md +1 -1
  140. package/.agent-src/personas/README.md +1 -1
  141. package/.agent-src/personas/advisors/contrarian.md +1 -1
  142. package/.agent-src/personas/advisors/executor.md +1 -1
  143. package/.agent-src/personas/advisors/expansionist.md +1 -1
  144. package/.agent-src/personas/advisors/first-principles.md +1 -1
  145. package/.agent-src/personas/advisors/outsider.md +1 -1
  146. package/.agent-src/rules/agent-authority.md +12 -0
  147. package/.agent-src/rules/analysis-skill-routing.md +12 -0
  148. package/.agent-src/rules/architecture.md +37 -11
  149. package/.agent-src/rules/artifact-drafting-protocol.md +19 -1
  150. package/.agent-src/rules/artifact-engagement-recording.md +13 -1
  151. package/.agent-src/rules/ask-when-uncertain.md +12 -0
  152. package/.agent-src/rules/augment-edit-discipline.md +40 -0
  153. package/.agent-src/rules/augment-source-of-truth.md +15 -3
  154. package/.agent-src/rules/autonomous-execution.md +44 -1
  155. package/.agent-src/rules/caveman-speak.md +13 -1
  156. package/.agent-src/rules/cli-output-handling.md +13 -1
  157. package/.agent-src/rules/command-suggestion-policy.md +13 -1
  158. package/.agent-src/rules/commit-conventions.md +13 -1
  159. package/.agent-src/rules/commit-policy.md +12 -0
  160. package/.agent-src/rules/context-hygiene.md +16 -4
  161. package/.agent-src/rules/copilot-routing.md +13 -1
  162. package/.agent-src/rules/devcontainer-routing.md +13 -1
  163. package/.agent-src/rules/direct-answers.md +12 -0
  164. package/.agent-src/rules/docker-commands.md +13 -1
  165. package/.agent-src/rules/domain-adoption-policy.md +21 -10
  166. package/.agent-src/rules/domain-safety-disclaimer.md +126 -0
  167. package/.agent-src/rules/domain-safety-pii.md +154 -0
  168. package/.agent-src/rules/domain-safety-retention.md +98 -0
  169. package/.agent-src/rules/downstream-changes.md +17 -5
  170. package/.agent-src/rules/external-reference-deep-dive.md +13 -1
  171. package/.agent-src/rules/fast-path-marker-visibility.md +21 -1
  172. package/.agent-src/rules/framework-neutrality-in-generic-skills.md +142 -0
  173. package/.agent-src/rules/git-history-discipline.md +111 -0
  174. package/.agent-src/rules/guidelines.md +12 -0
  175. package/.agent-src/rules/improve-before-implement.md +13 -1
  176. package/.agent-src/rules/invite-challenge.md +13 -1
  177. package/.agent-src/rules/language-and-tone.md +12 -0
  178. package/.agent-src/rules/laravel-routing.md +13 -1
  179. package/.agent-src/rules/laravel-translations.md +13 -1
  180. package/.agent-src/rules/low-impact-corpus-privacy-floor.md +17 -5
  181. package/.agent-src/rules/markdown-safe-codeblocks.md +13 -1
  182. package/.agent-src/rules/media-governance-routing.md +27 -15
  183. package/.agent-src/rules/minimal-safe-diff.md +19 -1
  184. package/.agent-src/rules/missing-tool-handling.md +13 -1
  185. package/.agent-src/rules/model-recommendation.md +13 -1
  186. package/.agent-src/rules/no-attribution-footers.md +13 -1
  187. package/.agent-src/rules/no-cheap-questions.md +12 -0
  188. package/.agent-src/rules/no-roadmap-references.md +32 -18
  189. package/.agent-src/rules/non-destructive-by-default.md +12 -0
  190. package/.agent-src/rules/onboarding-gate.md +19 -6
  191. package/.agent-src/rules/package-ci-checks.md +12 -0
  192. package/.agent-src/rules/persona-governance.md +13 -1
  193. package/.agent-src/rules/php-coding.md +13 -1
  194. package/.agent-src/rules/preservation-guard.md +13 -1
  195. package/.agent-src/rules/provider-lifecycle-discipline.md +14 -2
  196. package/.agent-src/rules/reviewer-awareness.md +13 -1
  197. package/.agent-src/rules/roadmap-ci-steps-policy.md +13 -1
  198. package/.agent-src/rules/roadmap-progress-sync.md +18 -1
  199. package/.agent-src/rules/role-mode-adherence.md +13 -1
  200. package/.agent-src/rules/rule-type-governance.md +13 -1
  201. package/.agent-src/rules/runtime-safety.md +13 -1
  202. package/.agent-src/rules/scope-control.md +12 -0
  203. package/.agent-src/rules/security-sensitive-stop.md +13 -1
  204. package/.agent-src/rules/size-enforcement.md +12 -0
  205. package/.agent-src/rules/skill-improvement-trigger.md +13 -1
  206. package/.agent-src/rules/skill-quality.md +13 -1
  207. package/.agent-src/rules/slash-command-routing-policy.md +13 -1
  208. package/.agent-src/rules/symfony-routing.md +13 -1
  209. package/.agent-src/rules/think-before-action.md +13 -1
  210. package/.agent-src/rules/token-efficiency.md +13 -1
  211. package/.agent-src/rules/token-optimizer-maintenance.md +12 -0
  212. package/.agent-src/rules/tool-safety.md +13 -1
  213. package/.agent-src/rules/ui-audit-gate.md +13 -1
  214. package/.agent-src/rules/upstream-proposal.md +13 -1
  215. package/.agent-src/rules/user-interaction.md +13 -1
  216. package/.agent-src/rules/user-interrupt-priority.md +58 -0
  217. package/.agent-src/rules/verify-before-complete.md +23 -2
  218. package/.agent-src/skills/accessibility-auditor/SKILL.md +12 -0
  219. package/.agent-src/skills/activation-design/SKILL.md +12 -0
  220. package/.agent-src/skills/adr-create/SKILL.md +12 -0
  221. package/.agent-src/skills/adversarial-review/SKILL.md +13 -1
  222. package/.agent-src/skills/agent-docs-writing/SKILL.md +16 -4
  223. package/.agent-src/skills/agents-md-thin-root/SKILL.md +14 -2
  224. package/.agent-src/skills/ai-council/SKILL.md +29 -15
  225. package/.agent-src/skills/analysis-autonomous-mode/SKILL.md +12 -0
  226. package/.agent-src/skills/analysis-skill-router/SKILL.md +12 -0
  227. package/.agent-src/skills/api-design/SKILL.md +13 -3
  228. package/.agent-src/skills/api-endpoint/SKILL.md +70 -154
  229. package/.agent-src/skills/api-testing/SKILL.md +23 -0
  230. package/.agent-src/skills/architecture-review-lens/SKILL.md +12 -0
  231. package/.agent-src/skills/artisan-commands/SKILL.md +12 -0
  232. package/.agent-src/skills/async-python-patterns/SKILL.md +13 -1
  233. package/.agent-src/skills/authz-review/SKILL.md +12 -2
  234. package/.agent-src/skills/aws-infrastructure/SKILL.md +12 -0
  235. package/.agent-src/skills/blade-ui/SKILL.md +12 -0
  236. package/.agent-src/skills/blast-radius-analyzer/SKILL.md +12 -0
  237. package/.agent-src/skills/bug-analyzer/SKILL.md +14 -2
  238. package/.agent-src/skills/build-buy-partner/SKILL.md +12 -0
  239. package/.agent-src/skills/canvas-design/SKILL.md +12 -0
  240. package/.agent-src/skills/character-consistency/SKILL.md +23 -11
  241. package/.agent-src/skills/check-refs/SKILL.md +12 -0
  242. package/.agent-src/skills/churn-prevention/SKILL.md +12 -0
  243. package/.agent-src/skills/code-refactoring/SKILL.md +52 -34
  244. package/.agent-src/skills/code-review/SKILL.md +53 -36
  245. package/.agent-src/skills/command-routing/SKILL.md +12 -0
  246. package/.agent-src/skills/command-writing/SKILL.md +14 -2
  247. package/.agent-src/skills/comp-banding/SKILL.md +12 -0
  248. package/.agent-src/skills/competitive-moat-analysis/SKILL.md +12 -2
  249. package/.agent-src/skills/competitive-positioning/SKILL.md +12 -2
  250. package/.agent-src/skills/composer-packages/SKILL.md +12 -0
  251. package/.agent-src/skills/compress-memory/SKILL.md +12 -0
  252. package/.agent-src/skills/content-funnel-design/SKILL.md +12 -2
  253. package/.agent-src/skills/context-authoring/SKILL.md +19 -7
  254. package/.agent-src/skills/context-document/SKILL.md +17 -5
  255. package/.agent-src/skills/contracts-cognition/SKILL.md +12 -2
  256. package/.agent-src/skills/conventional-commits-writing/SKILL.md +12 -0
  257. package/.agent-src/skills/copilot-agents-optimization/SKILL.md +13 -1
  258. package/.agent-src/skills/copilot-config/SKILL.md +12 -0
  259. package/.agent-src/skills/customer-research/SKILL.md +12 -0
  260. package/.agent-src/skills/dashboard-design/SKILL.md +13 -2
  261. package/.agent-src/skills/data-flow-mapper/SKILL.md +12 -0
  262. package/.agent-src/skills/data-handling-judgment/SKILL.md +12 -2
  263. package/.agent-src/skills/database/SKILL.md +22 -5
  264. package/.agent-src/skills/dcf-modeling/SKILL.md +12 -2
  265. package/.agent-src/skills/deal-qualification-meddic/SKILL.md +12 -2
  266. package/.agent-src/skills/decision-record/SKILL.md +12 -0
  267. package/.agent-src/skills/deep-reading-analyst/SKILL.md +12 -0
  268. package/.agent-src/skills/defense-in-depth/SKILL.md +13 -1
  269. package/.agent-src/skills/dependency-upgrade/SKILL.md +77 -19
  270. package/.agent-src/skills/description-assist/SKILL.md +12 -0
  271. package/.agent-src/skills/design-review/SKILL.md +12 -0
  272. package/.agent-src/skills/devcontainer/SKILL.md +12 -0
  273. package/.agent-src/skills/developer-like-execution/SKILL.md +37 -14
  274. package/.agent-src/skills/discovery-interview/SKILL.md +12 -2
  275. package/.agent-src/skills/doc-coauthoring/SKILL.md +12 -0
  276. package/.agent-src/skills/docker/SKILL.md +12 -0
  277. package/.agent-src/skills/editorial-calendar/SKILL.md +12 -2
  278. package/.agent-src/skills/eloquent/SKILL.md +13 -1
  279. package/.agent-src/skills/eloquent/evals/triggers.json +1 -1
  280. package/.agent-src/skills/error-handling-patterns/SKILL.md +13 -1
  281. package/.agent-src/skills/estimate-ticket/SKILL.md +12 -0
  282. package/.agent-src/skills/existing-ui-audit/SKILL.md +12 -0
  283. package/.agent-src/skills/expansion-playbook/SKILL.md +12 -0
  284. package/.agent-src/skills/fe-design/SKILL.md +12 -0
  285. package/.agent-src/skills/feature-planning/SKILL.md +13 -1
  286. package/.agent-src/skills/file-editor/SKILL.md +57 -19
  287. package/.agent-src/skills/finishing-a-development-branch/SKILL.md +14 -2
  288. package/.agent-src/skills/flux/SKILL.md +12 -0
  289. package/.agent-src/skills/forecast-accuracy/SKILL.md +12 -2
  290. package/.agent-src/skills/forecasting/SKILL.md +12 -2
  291. package/.agent-src/skills/form-handler/SKILL.md +12 -0
  292. package/.agent-src/skills/fundraising-narrative/SKILL.md +12 -2
  293. package/.agent-src/skills/funnel-analysis/SKILL.md +12 -0
  294. package/.agent-src/skills/git-workflow/SKILL.md +16 -4
  295. package/.agent-src/skills/github-ci/SKILL.md +12 -0
  296. package/.agent-src/skills/grafana/SKILL.md +12 -0
  297. package/.agent-src/skills/gtm-launch/SKILL.md +12 -2
  298. package/.agent-src/skills/guideline-writing/SKILL.md +12 -0
  299. package/.agent-src/skills/hiring-loop-design/SKILL.md +12 -0
  300. package/.agent-src/skills/incident-commander/SKILL.md +12 -2
  301. package/.agent-src/skills/jira-integration/SKILL.md +12 -0
  302. package/.agent-src/skills/jobs-events/SKILL.md +12 -0
  303. package/.agent-src/skills/judge-bug-hunter/SKILL.md +12 -0
  304. package/.agent-src/skills/judge-code-quality/SKILL.md +12 -0
  305. package/.agent-src/skills/judge-security-auditor/SKILL.md +12 -0
  306. package/.agent-src/skills/judge-test-coverage/SKILL.md +12 -0
  307. package/.agent-src/skills/laravel/SKILL.md +12 -0
  308. package/.agent-src/skills/laravel-api-endpoint/SKILL.md +199 -0
  309. package/.agent-src/skills/{dto-creator → laravel-dto}/SKILL.md +19 -6
  310. package/.agent-src/skills/laravel-horizon/SKILL.md +12 -0
  311. package/.agent-src/skills/laravel-mail/SKILL.md +12 -0
  312. package/.agent-src/skills/laravel-middleware/SKILL.md +12 -0
  313. package/.agent-src/skills/{migration-creator → laravel-migration}/SKILL.md +23 -10
  314. package/.agent-src/skills/laravel-notifications/SKILL.md +12 -0
  315. package/.agent-src/skills/laravel-pennant/SKILL.md +12 -0
  316. package/.agent-src/skills/laravel-pulse/SKILL.md +12 -0
  317. package/.agent-src/skills/laravel-reverb/SKILL.md +15 -3
  318. package/.agent-src/skills/laravel-scheduling/SKILL.md +12 -0
  319. package/.agent-src/skills/laravel-validation/SKILL.md +12 -0
  320. package/.agent-src/skills/{websocket → laravel-websocket}/SKILL.md +16 -3
  321. package/.agent-src/skills/launch-readiness/SKILL.md +12 -2
  322. package/.agent-src/skills/learning-to-rule-or-skill/SKILL.md +16 -4
  323. package/.agent-src/skills/lint-skills/SKILL.md +12 -0
  324. package/.agent-src/skills/livewire/SKILL.md +12 -0
  325. package/.agent-src/skills/livewire-architect/SKILL.md +12 -0
  326. package/.agent-src/skills/logging-monitoring/SKILL.md +12 -0
  327. package/.agent-src/skills/market-entry-analysis/SKILL.md +12 -0
  328. package/.agent-src/skills/markitdown/SKILL.md +14 -2
  329. package/.agent-src/skills/mcp/SKILL.md +12 -0
  330. package/.agent-src/skills/mcp-builder/SKILL.md +14 -2
  331. package/.agent-src/skills/md-language-check/SKILL.md +13 -1
  332. package/.agent-src/skills/memory-consolidation/SKILL.md +12 -0
  333. package/.agent-src/skills/merge-conflicts/SKILL.md +61 -17
  334. package/.agent-src/skills/messaging-architecture/SKILL.md +12 -2
  335. package/.agent-src/skills/migration-architect/SKILL.md +18 -6
  336. package/.agent-src/skills/mobile-e2e-strategy/SKILL.md +12 -0
  337. package/.agent-src/skills/module-management/SKILL.md +13 -0
  338. package/.agent-src/skills/motion-choreographer/SKILL.md +16 -4
  339. package/.agent-src/skills/multi-tenancy/SKILL.md +29 -10
  340. package/.agent-src/skills/nextjs-patterns/SKILL.md +12 -0
  341. package/.agent-src/skills/okr-tree-modeling/SKILL.md +12 -2
  342. package/.agent-src/skills/onboarding-design/SKILL.md +12 -0
  343. package/.agent-src/skills/onboarding-program/SKILL.md +12 -0
  344. package/.agent-src/skills/one-on-one-cadence/SKILL.md +12 -0
  345. package/.agent-src/skills/openapi/SKILL.md +13 -1
  346. package/.agent-src/skills/org-design/SKILL.md +12 -0
  347. package/.agent-src/skills/override-management/SKILL.md +12 -0
  348. package/.agent-src/skills/perf-feedback-craft/SKILL.md +12 -0
  349. package/.agent-src/skills/performance/SKILL.md +12 -0
  350. package/.agent-src/skills/performance-analysis/SKILL.md +12 -0
  351. package/.agent-src/skills/persona-writing/SKILL.md +12 -0
  352. package/.agent-src/skills/pest-testing/SKILL.md +30 -0
  353. package/.agent-src/skills/php-coder/SKILL.md +12 -0
  354. package/.agent-src/skills/php-debugging/SKILL.md +40 -0
  355. package/.agent-src/skills/php-service/SKILL.md +15 -3
  356. package/.agent-src/skills/pipeline-strategy/SKILL.md +12 -2
  357. package/.agent-src/skills/pixar-storyteller/SKILL.md +17 -5
  358. package/.agent-src/skills/playwright-architect/SKILL.md +12 -2
  359. package/.agent-src/skills/playwright-testing/SKILL.md +28 -1
  360. package/.agent-src/skills/po-discovery/SKILL.md +12 -0
  361. package/.agent-src/skills/positioning-strategy/SKILL.md +12 -0
  362. package/.agent-src/skills/privacy-review/SKILL.md +12 -2
  363. package/.agent-src/skills/project-analysis-core/SKILL.md +12 -0
  364. package/.agent-src/skills/project-analysis-hypothesis-driven/SKILL.md +12 -0
  365. package/.agent-src/skills/project-analysis-laravel/SKILL.md +12 -0
  366. package/.agent-src/skills/project-analysis-nextjs/SKILL.md +12 -0
  367. package/.agent-src/skills/project-analysis-node-express/SKILL.md +12 -0
  368. package/.agent-src/skills/project-analysis-react/SKILL.md +12 -0
  369. package/.agent-src/skills/project-analysis-symfony/SKILL.md +12 -0
  370. package/.agent-src/skills/project-analysis-zend-laminas/SKILL.md +12 -0
  371. package/.agent-src/skills/project-analyzer/SKILL.md +98 -60
  372. package/.agent-src/skills/project-docs/SKILL.md +25 -13
  373. package/.agent-src/skills/prompt-engineering-patterns/SKILL.md +13 -1
  374. package/.agent-src/skills/prompt-optimizer/SKILL.md +13 -1
  375. package/.agent-src/skills/quality-tools/SKILL.md +12 -2
  376. package/.agent-src/skills/react-native-setup/SKILL.md +12 -0
  377. package/.agent-src/skills/react-shadcn-ui/SKILL.md +12 -0
  378. package/.agent-src/skills/readme-reviewer/SKILL.md +12 -0
  379. package/.agent-src/skills/readme-writing/SKILL.md +12 -0
  380. package/.agent-src/skills/readme-writing-package/SKILL.md +106 -23
  381. package/.agent-src/skills/receiving-code-review/SKILL.md +12 -0
  382. package/.agent-src/skills/refine-prompt/SKILL.md +13 -1
  383. package/.agent-src/skills/refine-ticket/SKILL.md +14 -2
  384. package/.agent-src/skills/refine-ticket/detection-map.yml +2 -2
  385. package/.agent-src/skills/release-comms/SKILL.md +12 -2
  386. package/.agent-src/skills/repomix-packer/SKILL.md +13 -1
  387. package/.agent-src/skills/requesting-code-review/SKILL.md +12 -0
  388. package/.agent-src/skills/retention-loops/SKILL.md +12 -0
  389. package/.agent-src/skills/review-routing/SKILL.md +12 -0
  390. package/.agent-src/skills/rice-prioritization/SKILL.md +12 -0
  391. package/.agent-src/skills/risk-officer/SKILL.md +12 -0
  392. package/.agent-src/skills/roadmap-management/SKILL.md +13 -1
  393. package/.agent-src/skills/roadmap-writing/SKILL.md +12 -0
  394. package/.agent-src/skills/rtk-output-filtering/SKILL.md +35 -8
  395. package/.agent-src/skills/rule-refactor/SKILL.md +157 -0
  396. package/.agent-src/skills/rule-writing/SKILL.md +46 -8
  397. package/.agent-src/skills/runway-cognition/SKILL.md +12 -2
  398. package/.agent-src/skills/scenario-modeling/SKILL.md +12 -2
  399. package/.agent-src/skills/scene-expander/SKILL.md +18 -6
  400. package/.agent-src/skills/script-writing/SKILL.md +13 -1
  401. package/.agent-src/skills/secrets-management/SKILL.md +13 -3
  402. package/.agent-src/skills/security/SKILL.md +50 -29
  403. package/.agent-src/skills/security-audit/SKILL.md +12 -0
  404. package/.agent-src/skills/sentry-integration/SKILL.md +12 -0
  405. package/.agent-src/skills/sequential-thinking/SKILL.md +12 -0
  406. package/.agent-src/skills/skill-improvement-pipeline/SKILL.md +12 -0
  407. package/.agent-src/skills/skill-management/SKILL.md +12 -0
  408. package/.agent-src/skills/skill-reviewer/SKILL.md +13 -1
  409. package/.agent-src/skills/skill-writing/SKILL.md +12 -0
  410. package/.agent-src/skills/sql-writing/SKILL.md +12 -0
  411. package/.agent-src/skills/stakeholder-tradeoff/SKILL.md +12 -0
  412. package/.agent-src/skills/subagent-orchestration/SKILL.md +13 -1
  413. package/.agent-src/skills/symfony-workflow/SKILL.md +12 -0
  414. package/.agent-src/skills/systematic-debugging/SKILL.md +12 -0
  415. package/.agent-src/skills/tailwind-engineer/SKILL.md +12 -0
  416. package/.agent-src/skills/tech-debt-tracker/SKILL.md +12 -2
  417. package/.agent-src/skills/technical-specification/SKILL.md +12 -0
  418. package/.agent-src/skills/terraform/SKILL.md +12 -0
  419. package/.agent-src/skills/terragrunt/SKILL.md +12 -0
  420. package/.agent-src/skills/test-driven-development/SKILL.md +16 -4
  421. package/.agent-src/skills/test-performance/SKILL.md +19 -6
  422. package/.agent-src/skills/testing-anti-patterns/SKILL.md +13 -1
  423. package/.agent-src/skills/threat-modeling/SKILL.md +12 -0
  424. package/.agent-src/skills/throughput-vs-morale-tradeoff/SKILL.md +12 -0
  425. package/.agent-src/skills/token-optimizer/SKILL.md +12 -0
  426. package/.agent-src/skills/traefik/SKILL.md +12 -0
  427. package/.agent-src/skills/ui-component-architect/SKILL.md +12 -0
  428. package/.agent-src/skills/unit-economics-modeling/SKILL.md +12 -2
  429. package/.agent-src/skills/universal-project-analysis/SKILL.md +12 -0
  430. package/.agent-src/skills/upstream-contribute/SKILL.md +12 -0
  431. package/.agent-src/skills/using-git-worktrees/SKILL.md +12 -0
  432. package/.agent-src/skills/validate-feature-fit/SKILL.md +12 -0
  433. package/.agent-src/skills/verify-completion-evidence/SKILL.md +36 -27
  434. package/.agent-src/skills/video-director/SKILL.md +18 -6
  435. package/.agent-src/skills/vision-articulation/SKILL.md +12 -0
  436. package/.agent-src/skills/voc-extract/SKILL.md +12 -2
  437. package/.agent-src/skills/voice-and-tone-design/SKILL.md +12 -2
  438. package/.agent-src/templates/agent-settings.md +5 -5
  439. package/.agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  440. package/.agent-src/templates/agents/memory/ownership.example.yml +1 -1
  441. package/.agent-src/templates/agents/proposal.example.md +12 -0
  442. package/.agent-src/templates/command.md +1 -1
  443. package/.agent-src/templates/contexts/auth-model.md +2 -2
  444. package/.agent-src/templates/contexts/data-sensitivity.md +3 -3
  445. package/.agent-src/templates/contexts/deployment-order.md +2 -2
  446. package/.agent-src/templates/contexts/observability.md +3 -3
  447. package/.agent-src/templates/contexts/tenant-boundaries.md +3 -3
  448. package/.agent-src/templates/contexts.md +1 -1
  449. package/.agent-src/templates/copilot-instructions.md +2 -2
  450. package/.agent-src/templates/rule.md +3 -3
  451. package/.agent-src/templates/scripts/work_engine/_lib/agent_settings.py +3 -3
  452. package/.agent-src/templates/scripts/work_engine/cli.py +6 -6
  453. package/.agent-src/templates/scripts/work_engine/emitters.py +29 -4
  454. package/.agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.py +3 -3
  455. package/.agent-src/templates/scripts/work_engine/state.py +53 -0
  456. package/.agent-src/templates/skill-archive-note.md +4 -4
  457. package/.claude-plugin/marketplace.json +6 -5
  458. package/AGENTS.md +5 -4
  459. package/CHANGELOG.md +178 -194
  460. package/CONTRIBUTING.md +61 -0
  461. package/README.md +23 -20
  462. package/config/agent-settings.template.yml +11 -1
  463. package/config/discovery/packs.yml +142 -0
  464. package/config/discovery/unassigned-artefacts.yml +66 -0
  465. package/config/discovery/workspaces.yml +59 -0
  466. package/config/gitignore-block.txt +17 -20
  467. package/dist/cli/agent-config.js +199 -0
  468. package/dist/cli/agent-config.js.map +1 -0
  469. package/dist/cli/bash/runBash.js +40 -0
  470. package/dist/cli/bash/runBash.js.map +1 -0
  471. package/dist/cli/commands/doctorShell.js +91 -0
  472. package/dist/cli/commands/doctorShell.js.map +1 -0
  473. package/dist/cli/commands/packs.js +59 -0
  474. package/dist/cli/commands/packs.js.map +1 -0
  475. package/dist/cli/commands/settings.js +35 -0
  476. package/dist/cli/commands/settings.js.map +1 -0
  477. package/dist/cli/commands/uiServe.js +110 -0
  478. package/dist/cli/commands/uiServe.js.map +1 -0
  479. package/dist/cli/commands/versions.js +64 -0
  480. package/dist/cli/commands/versions.js.map +1 -0
  481. package/dist/cli/commands/workspaces.js +58 -0
  482. package/dist/cli/commands/workspaces.js.map +1 -0
  483. package/dist/cli/discovery/loadManifest.js +62 -0
  484. package/dist/cli/discovery/loadManifest.js.map +1 -0
  485. package/dist/cli/log/logger.js +41 -0
  486. package/dist/cli/log/logger.js.map +1 -0
  487. package/dist/cli/paths.js +60 -0
  488. package/dist/cli/paths.js.map +1 -0
  489. package/dist/cli/python/resolvePython.js +38 -0
  490. package/dist/cli/python/resolvePython.js.map +1 -0
  491. package/dist/cli/registry.js +75 -0
  492. package/dist/cli/registry.js.map +1 -0
  493. package/dist/discovery/discovery-manifest.json +9195 -0
  494. package/dist/discovery/discovery-manifest.json.sha256 +1 -0
  495. package/dist/discovery/discovery-manifest.summary.md +93 -0
  496. package/dist/mcp/awesome-mcp-servers.row.md +1 -0
  497. package/dist/mcp/mcp-cloudflare-catalogue.json +27 -0
  498. package/dist/mcp/registry-manifest.json +63 -0
  499. package/dist/server/app.js +117 -0
  500. package/dist/server/app.js.map +1 -0
  501. package/dist/server/io/atomicMultiWrite.js +202 -0
  502. package/dist/server/io/atomicMultiWrite.js.map +1 -0
  503. package/dist/server/io/atomicWrite.js +79 -0
  504. package/dist/server/io/atomicWrite.js.map +1 -0
  505. package/dist/server/io/substituteTemplate.js +87 -0
  506. package/dist/server/io/substituteTemplate.js.map +1 -0
  507. package/dist/server/io/yamlIO.js +140 -0
  508. package/dist/server/io/yamlIO.js.map +1 -0
  509. package/dist/server/port.js +97 -0
  510. package/dist/server/port.js.map +1 -0
  511. package/dist/server/routes/discovery.js +72 -0
  512. package/dist/server/routes/discovery.js.map +1 -0
  513. package/dist/server/routes/ping.js +49 -0
  514. package/dist/server/routes/ping.js.map +1 -0
  515. package/dist/server/routes/schema.js +41 -0
  516. package/dist/server/routes/schema.js.map +1 -0
  517. package/dist/server/routes/settings.js +155 -0
  518. package/dist/server/routes/settings.js.map +1 -0
  519. package/dist/server/routes/userMd.js +117 -0
  520. package/dist/server/routes/userMd.js.map +1 -0
  521. package/dist/server/routes/wizard.js +138 -0
  522. package/dist/server/routes/wizard.js.map +1 -0
  523. package/dist/server/schemas/settings.js +138 -0
  524. package/dist/server/schemas/settings.js.map +1 -0
  525. package/dist/server/token.js +68 -0
  526. package/dist/server/token.js.map +1 -0
  527. package/dist/server/writeRoot.js +67 -0
  528. package/dist/server/writeRoot.js.map +1 -0
  529. package/dist/server/writeRoot.test.js +73 -0
  530. package/dist/server/writeRoot.test.js.map +1 -0
  531. package/dist/shared/userMd/formAdapter.js +105 -0
  532. package/dist/shared/userMd/formAdapter.js.map +1 -0
  533. package/dist/shared/userMd/schema.js +118 -0
  534. package/dist/shared/userMd/schema.js.map +1 -0
  535. package/dist/shared/userMd/utils.js +74 -0
  536. package/dist/shared/userMd/utils.js.map +1 -0
  537. package/dist/ui/assets/index-BTRcKDlB.js +39 -0
  538. package/dist/ui/assets/index-BTRcKDlB.js.map +1 -0
  539. package/dist/ui/assets/index-Dqfhmg-d.css +1 -0
  540. package/dist/ui/index.html +14 -0
  541. package/docs/adrs/caveman/0001-default-off-until-bench.md +2 -2
  542. package/docs/adrs/cost/0001-hard-stop-hook.md +1 -1
  543. package/docs/adrs/schema/0001-json-schema-frontmatter.md +4 -4
  544. package/docs/adrs/schema/README.md +1 -1
  545. package/docs/adrs/smoke/0001-per-tier-smoke-scripts.md +2 -2
  546. package/docs/architecture/setup-vs-settings-shared-surface.md +114 -0
  547. package/docs/architecture.md +4 -3
  548. package/docs/archive/CHANGELOG-pre-2.2.0.md +7 -7
  549. package/docs/archive/CHANGELOG-pre-2.25.0.md +191 -0
  550. package/docs/archive/CHANGELOG-pre-3.0.0.md +130 -0
  551. package/docs/catalog.md +77 -84
  552. package/docs/contracts/STABILITY.md +1 -1
  553. package/docs/contracts/adr-architectural-consensus-mechanism.md +5 -5
  554. package/docs/contracts/adr-chat-history-split.md +1 -1
  555. package/docs/contracts/adr-implement-ticket-runtime.md +1 -1
  556. package/docs/contracts/adr-install-user-type-axis.md +1 -1
  557. package/docs/contracts/adr-mcp-runtime.md +2 -2
  558. package/docs/contracts/agent-user-schema.md +11 -2
  559. package/docs/contracts/ai-council-config.md +13 -13
  560. package/docs/contracts/audit-log-v1.md +2 -2
  561. package/docs/contracts/command-clusters.md +2 -2
  562. package/docs/contracts/compression-default-kill-criterion.md +3 -3
  563. package/docs/contracts/decision-trace-v1.md +5 -5
  564. package/docs/contracts/discovery-manifest.schema.json +146 -0
  565. package/docs/contracts/explain-trace.schema.json +144 -0
  566. package/docs/contracts/file-ownership-matrix.json +515 -309
  567. package/docs/contracts/file-ownership-matrix.md +1 -1
  568. package/docs/contracts/ghostwriter-schema.md +3 -3
  569. package/docs/contracts/hook-architecture-v1.md +10 -10
  570. package/docs/contracts/kernel-membership.md +21 -4
  571. package/docs/contracts/linter-structural-model.md +3 -3
  572. package/docs/contracts/load-context-schema.md +5 -5
  573. package/docs/contracts/local-server-api.md +134 -0
  574. package/docs/contracts/low-impact-corpus-format.md +1 -1
  575. package/docs/contracts/mcp-cloud-scope.md +2 -2
  576. package/docs/contracts/mcp-discovery-phase-notice.md +1 -1
  577. package/docs/contracts/mcp-phase-1-scope.md +5 -4
  578. package/docs/contracts/mcp-registry-manifest.schema.json +129 -0
  579. package/docs/contracts/mcp-tool-stub-envelope.md +1 -1
  580. package/docs/contracts/memory-visibility-v1.md +2 -2
  581. package/docs/contracts/multi-tool-projection-fidelity.md +3 -3
  582. package/docs/contracts/namespace.md +1 -1
  583. package/docs/contracts/one-off-script-lifecycle.md +1 -1
  584. package/docs/contracts/package-self-orientation.md +1 -1
  585. package/docs/contracts/provider-lifecycle.md +2 -2
  586. package/docs/contracts/router-blending.md +1 -1
  587. package/docs/contracts/rule-classification.md +2 -2
  588. package/docs/contracts/settings-api.md +160 -0
  589. package/docs/contracts/settings-gui-agent-mode.schema.json +128 -0
  590. package/docs/contracts/smoke-contracts.md +8 -8
  591. package/docs/contracts/tier-3-contrib-plugin.md +1 -1
  592. package/docs/contracts/universal-skills.md +1 -1
  593. package/docs/contracts/write-engine.md +1 -1
  594. package/docs/customization.md +137 -11
  595. package/docs/decisions/ADR-001-kernel-swap-deferred.md +1 -1
  596. package/docs/decisions/ADR-002-kernel-bucket-overrides.md +1 -1
  597. package/docs/decisions/ADR-004-rule-governance-pruning.md +8 -8
  598. package/docs/decisions/ADR-006-skill-tools-python-pilot.md +5 -5
  599. package/docs/decisions/ADR-007-agent-discovery-scopes.md +4 -4
  600. package/docs/decisions/ADR-008-installed-tools-manifest.md +2 -2
  601. package/docs/decisions/ADR-010-profile-pack-preset-boundary.md +2 -2
  602. package/docs/decisions/ADR-011-domain-pack-readiness.md +4 -4
  603. package/docs/decisions/ADR-012-typescript-cli-shell.md +162 -0
  604. package/docs/decisions/ADR-013-discovery-frontmatter-contract.md +210 -0
  605. package/docs/decisions/ADR-014-gui-framework-choice.md +136 -0
  606. package/docs/decisions/ADR-rule-kernel-and-router.md +2 -2
  607. package/docs/decisions/INDEX.md +3 -0
  608. package/docs/distribution/mcp-submission-checklist.md +95 -0
  609. package/docs/distribution/topics-equivalents-decay-policy.md +51 -0
  610. package/docs/examples/agent-user.example.md +3 -1
  611. package/docs/getting-started.md +6 -5
  612. package/docs/guidelines/agent-infra/ask-when-uncertain-demos.md +1 -1
  613. package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +10 -1
  614. package/docs/guidelines/agent-infra/rule-type-governance.md +2 -2
  615. package/docs/guidelines/agent-infra/tool-integration.md +1 -1
  616. package/docs/guidelines/php/api-design.md +2 -2
  617. package/docs/guidelines/php/controllers.md +1 -1
  618. package/docs/guidelines/php/resources.md +1 -1
  619. package/docs/guidelines/php/validations.md +1 -1
  620. package/docs/guidelines/prompt-templates.md +2 -2
  621. package/docs/hook-payload-capture.md +3 -3
  622. package/docs/installation.md +12 -4
  623. package/docs/migrations/commands-1.15.0.md +3 -3
  624. package/docs/parity/bench-ruflo.json +1 -1
  625. package/docs/parity/ruflo.md +3 -3
  626. package/docs/profiles.md +1 -1
  627. package/docs/quality.md +2 -2
  628. package/docs/recruits/_template.md +3 -3
  629. package/docs/setup/enterprise-and-offline.md +3 -3
  630. package/docs/setup/mcp-server-docker.md +5 -3
  631. package/docs/skills-catalog.md +62 -18
  632. package/docs/wizard.md +121 -0
  633. package/llms.txt +61 -17
  634. package/package.json +46 -3
  635. package/scripts/__pycache__/validate_frontmatter.cpython-312.pyc +0 -0
  636. package/scripts/_archive/README.md +2 -2
  637. package/scripts/_archive/_p4_migrate.py +1 -1
  638. package/scripts/_cli/cmd_doctor.py +5 -5
  639. package/scripts/_cli/cmd_explain.py +106 -2
  640. package/scripts/_cli/cmd_migrate.py +2 -2
  641. package/scripts/_cli/explain_last/__init__.py +122 -0
  642. package/scripts/_cli/explain_last/assumptions.py +59 -0
  643. package/scripts/_cli/explain_last/council.py +105 -0
  644. package/scripts/_cli/explain_last/halt.py +44 -0
  645. package/scripts/_cli/explain_last/inputs.py +125 -0
  646. package/scripts/_cli/explain_last/memory.py +94 -0
  647. package/scripts/_cli/explain_last/provider.py +52 -0
  648. package/scripts/_cli/explain_last/render.py +52 -0
  649. package/scripts/_cli/explain_last/route.py +58 -0
  650. package/scripts/_cli/explain_last/scrubber.py +105 -0
  651. package/scripts/_cli/explain_last/sections/__init__.py +35 -0
  652. package/scripts/_cli/explain_last/sections/assumptions.py +21 -0
  653. package/scripts/_cli/explain_last/sections/council.py +27 -0
  654. package/scripts/_cli/explain_last/sections/halt.py +31 -0
  655. package/scripts/_cli/explain_last/sections/header.py +24 -0
  656. package/scripts/_cli/explain_last/sections/inputs.py +27 -0
  657. package/scripts/_cli/explain_last/sections/memory.py +21 -0
  658. package/scripts/_cli/explain_last/sections/pack.py +16 -0
  659. package/scripts/_cli/explain_last/sections/provider.py +26 -0
  660. package/scripts/_cli/explain_last/sections/route.py +22 -0
  661. package/scripts/_cli/explain_last/state_loader.py +76 -0
  662. package/scripts/_dispatch.bash +954 -0
  663. package/scripts/_lib/agent_settings.py +3 -3
  664. package/scripts/_lib/agents_overlay.py +3 -3
  665. package/scripts/_phase4_bucket.py +210 -0
  666. package/scripts/agent-config +35 -943
  667. package/scripts/ai-video/adapters/higgsfield.sh +1 -1
  668. package/scripts/ai-video/adapters/sora.sh +1 -1
  669. package/scripts/ai-video/test-pipeline.sh +2 -2
  670. package/scripts/ai_council/_default_prices.py +5 -5
  671. package/scripts/ai_council/advisors.py +1 -1
  672. package/scripts/ai_council/clients.py +2 -2
  673. package/scripts/ai_council/compile_corpus.py +9 -8
  674. package/scripts/ai_council/config.py +3 -3
  675. package/scripts/ai_council/events_log.py +8 -4
  676. package/scripts/ai_council/low_impact_corpus.py +1 -1
  677. package/scripts/ai_council/low_impact_intake.py +1 -1
  678. package/scripts/ai_council/one_off_archive/2026-05/_one_off_budget_v2_audit.py +2 -2
  679. package/scripts/ai_council/one_off_archive/2026-05/_one_off_structural_optimization.py +1 -1
  680. package/scripts/ai_council/one_off_archive/2026-05/_one_off_tier_retrofit.py +3 -3
  681. package/scripts/ai_council/pricing.py +8 -7
  682. package/scripts/ai_council/probation_gate.py +1 -1
  683. package/scripts/ai_council/redact_low_impact_entry.py +1 -1
  684. package/scripts/ai_council/session.py +13 -13
  685. package/scripts/ai_council/shadow_dispatch.py +2 -2
  686. package/scripts/annotate_discovery.py +149 -0
  687. package/scripts/audit_adr_coverage.py +1 -1
  688. package/scripts/audit_auto_rules.py +2 -2
  689. package/scripts/audit_cloud_compatibility.py +1 -1
  690. package/scripts/audit_command_surface.py +2 -2
  691. package/scripts/audit_likelihood.py +4 -4
  692. package/scripts/audit_overlap.py +3 -3
  693. package/scripts/audit_user_type_axis.py +1 -1
  694. package/scripts/build_discovery_manifest.py +302 -0
  695. package/scripts/build_linear_digest.py +0 -1
  696. package/scripts/build_mcp_registry_manifest.py +181 -0
  697. package/scripts/build_rule_trigger_matrix.py +2 -2
  698. package/scripts/capture_showcase_session.py +1 -1
  699. package/scripts/chat_history.py +5 -5
  700. package/scripts/check_always_budget.py +7 -2
  701. package/scripts/check_council_layout.py +26 -20
  702. package/scripts/check_council_references.py +10 -10
  703. package/scripts/check_discovery_determinism.py +70 -0
  704. package/scripts/check_kernel_rule_bundle.py +2 -2
  705. package/scripts/check_no_roadmap_refs.py +2 -2
  706. package/scripts/check_one_off_location.py +1 -1
  707. package/scripts/check_public_links.py +2 -2
  708. package/scripts/check_references.py +14 -21
  709. package/scripts/check_release_includes_discovery.py +61 -0
  710. package/scripts/ci_summary.py +2 -2
  711. package/scripts/ci_time_ratio.py +1 -1
  712. package/scripts/command_suggester/__init__.py +1 -1
  713. package/scripts/context_hygiene_hook.py +2 -2
  714. package/scripts/council_cli.py +22 -22
  715. package/scripts/council_prune.py +3 -3
  716. package/scripts/extract_audit_patterns.py +2 -2
  717. package/scripts/gen_discovery_baseline.py +127 -0
  718. package/scripts/generate_ownership_matrix.py +1 -1
  719. package/scripts/hook_manifest.yaml +5 -5
  720. package/scripts/hooks/cline-dispatcher.sh +1 -1
  721. package/scripts/hooks/cowork-dispatcher.sh +1 -1
  722. package/scripts/hooks/dispatch_hook.py +3 -3
  723. package/scripts/hooks/gemini-dispatcher.sh +1 -1
  724. package/scripts/hooks/replay_hook.py +1 -1
  725. package/scripts/hooks/state_io.py +5 -5
  726. package/scripts/hooks_doctor.py +4 -4
  727. package/scripts/install-hooks.sh +2 -2
  728. package/scripts/install.py +3 -3
  729. package/scripts/install.sh +120 -18
  730. package/scripts/inventory_frontmatter.py +1 -1
  731. package/scripts/lint_agents_layout.py +103 -0
  732. package/scripts/lint_archived_skills.py +3 -3
  733. package/scripts/lint_artefact_frontmatter.py +180 -0
  734. package/scripts/lint_discovery_manifest.py +136 -0
  735. package/scripts/lint_discovery_vocabulary.py +148 -0
  736. package/scripts/lint_explain_trace.py +80 -0
  737. package/scripts/lint_framework_leakage.py +348 -0
  738. package/scripts/lint_framework_leakage_allowlist.json +477 -0
  739. package/scripts/lint_ghostwriter_source.py +1 -1
  740. package/scripts/lint_load_context.py +3 -3
  741. package/scripts/lint_mcp_registry_manifest.py +69 -0
  742. package/scripts/lint_media_policy_linkage.py +6 -6
  743. package/scripts/lint_positioning.py +143 -0
  744. package/scripts/lint_rule_tiers.py +2 -2
  745. package/scripts/lint_skill_tools.py +1 -1
  746. package/scripts/lint_topics_yaml.py +89 -0
  747. package/scripts/mcp_server/consumer_tool_catalog.json +3 -3
  748. package/scripts/mcp_server/telemetry.py +2 -2
  749. package/scripts/mcp_server/tools.py +27 -11
  750. package/scripts/mcp_telemetry_health.py +2 -2
  751. package/scripts/mcp_telemetry_store.py +1 -1
  752. package/scripts/measure_augment_budget.py +9 -3
  753. package/scripts/measure_density.py +2 -2
  754. package/scripts/measure_frugality_savings.py +3 -3
  755. package/scripts/measure_roadmap_trajectory.py +1 -1
  756. package/scripts/measure_rule_budget.py +3 -3
  757. package/scripts/memory_report.py +1 -1
  758. package/scripts/migrate_command_suggestions.py +3 -3
  759. package/scripts/minimal_safe_diff_hook.py +1 -1
  760. package/scripts/onboarding_gate_hook.py +4 -4
  761. package/scripts/prepack-check.mjs +62 -0
  762. package/scripts/probe_projection_fidelity.py +2 -2
  763. package/scripts/refine_ticket_detect.py +1 -1
  764. package/scripts/schemas/command.schema.json +46 -1
  765. package/scripts/schemas/persona.schema.json +1 -1
  766. package/scripts/schemas/rule.schema.json +44 -4
  767. package/scripts/schemas/skill.schema.json +46 -1
  768. package/scripts/score_skill_selection.py +1 -1
  769. package/scripts/skill_collision_clusters.py +1 -1
  770. package/scripts/skill_linter.py +62 -9
  771. package/scripts/skill_overlap.py +1 -1
  772. package/scripts/skill_tools/run_block_d_eval.py +1 -1
  773. package/scripts/skill_usage_collect.py +3 -3
  774. package/scripts/skill_usage_report.py +3 -3
  775. package/scripts/smoke/kernel.sh +4 -4
  776. package/scripts/smoke/router.sh +2 -2
  777. package/scripts/smoke_quickstart.py +1 -1
  778. package/scripts/spotcheck_thin_root.py +1 -1
  779. package/scripts/sync_github_metadata.py +147 -0
  780. package/scripts/sync_gitignore.py +15 -5
  781. package/scripts/update_prices.py +4 -3
  782. package/scripts/verify_before_complete_hook.py +1 -1
  783. package/scripts/verify_roadmap_closure.py +1 -1
  784. package/templates/agent-user.md +35 -0
  785. package/.agent-src/commands/onboard.md +0 -459
  786. package/.agent-src/rules/agent-docs.md +0 -20
  787. package/.agent-src/rules/augment-portability.md +0 -23
  788. package/.agent-src/rules/capture-learnings.md +0 -19
  789. package/.agent-src/rules/docs-sync.md +0 -20
  790. package/.agent-src/rules/domain-safety-disclaimer-consulting.md +0 -52
  791. package/.agent-src/rules/domain-safety-disclaimer-financial.md +0 -54
  792. package/.agent-src/rules/domain-safety-disclaimer-legal.md +0 -49
  793. package/.agent-src/rules/domain-safety-disclaimer-medical.md +0 -56
  794. package/.agent-src/rules/domain-safety-export-redact.md +0 -65
  795. package/.agent-src/rules/domain-safety-logging-pii-floor.md +0 -55
  796. package/.agent-src/rules/domain-safety-pii-finance.md +0 -57
  797. package/.agent-src/rules/domain-safety-pii-marketing.md +0 -60
  798. package/.agent-src/rules/domain-safety-pii-recruiting.md +0 -56
  799. package/.agent-src/rules/domain-safety-pii-support.md +0 -57
  800. package/.agent-src/rules/domain-safety-retention-finance.md +0 -48
  801. package/.agent-src/rules/domain-safety-retention-support.md +0 -55
  802. package/.agent-src/rules/e2e-testing.md +0 -19
  803. package/.agent-src/rules/no-unsolicited-rebase.md +0 -107
  804. package/.agent-src/rules/post-push-rewrite-discipline.md +0 -70
@@ -0,0 +1,122 @@
1
+ """``agent-config explain last`` — execution-trace builder.
2
+
3
+ Phase 2 of the *Explainability v2* roadmap
4
+ (``agents/roadmaps/explainability-v2-explain-last.md``). Reads the
5
+ persisted :mod:`work_engine` state plus its sibling artefacts (council
6
+ sessions, memory hits, router snapshot) and projects them into the
7
+ versioned :data:`ExplainTrace` v1 contract documented at
8
+ ``docs/contracts/explain-trace.schema.json``.
9
+
10
+ Read-only by construction:
11
+
12
+ * never writes back to disk;
13
+ * never opens a network socket (Phase 4 enforces via ``test_no_network``);
14
+ * never raises on missing data — every slot degrades to ``null`` and the
15
+ Markdown renderer emits a ``(none)`` placeholder instead.
16
+
17
+ The public surface is :func:`build_trace`. Everything else is internal
18
+ plumbing. The CLI dispatcher lives in :mod:`scripts._cli.cmd_explain`
19
+ and is the only intended caller besides the test suite.
20
+ """
21
+ from __future__ import annotations
22
+
23
+ from datetime import datetime, timezone
24
+ from pathlib import Path
25
+ from typing import Any
26
+
27
+ from scripts._cli.explain_last import (
28
+ assumptions as _assumptions,
29
+ council as _council,
30
+ halt as _halt,
31
+ inputs as _inputs,
32
+ memory as _memory,
33
+ provider as _provider,
34
+ route as _route,
35
+ )
36
+ from scripts._cli.explain_last.scrubber import scrub_string
37
+ from scripts._cli.explain_last.state_loader import StateLoadError, load_state
38
+
39
+ TRACE_VERSION = 1
40
+ SUBJECT_BY_KIND = {
41
+ "ticket": "implement-ticket",
42
+ "prompt": "work",
43
+ "diff": "work",
44
+ "file": "work",
45
+ }
46
+
47
+
48
+ def _derive_subject(state: dict[str, Any]) -> str:
49
+ """Map ``state.input.kind`` + ``state.directive_set`` to a trace subject.
50
+
51
+ The schema enum is ``work | implement-ticket | council | video |
52
+ unknown``. ``council`` and ``video`` are reserved for Phase 3 and
53
+ forward; today they only fire when the engine explicitly stamps the
54
+ directive set, never from a kind alone.
55
+ """
56
+ directive_set = state.get("directive_set") or ""
57
+ if directive_set == "video":
58
+ return "video"
59
+ if directive_set == "council":
60
+ return "council"
61
+ kind = (state.get("input") or {}).get("kind")
62
+ return SUBJECT_BY_KIND.get(kind or "", "unknown")
63
+
64
+
65
+ def _derive_run_id(state: dict[str, Any], state_file: Path) -> str:
66
+ """Pull ``state.input.data.id`` with mtime fallback.
67
+
68
+ Schema requires a non-empty string; the file mtime serialised as
69
+ ISO-8601 UTC is the documented fallback. Both branches return scrub
70
+ pre-processed values so a ticket id containing PII never leaks.
71
+ """
72
+ data = (state.get("input") or {}).get("data") or {}
73
+ raw_id = data.get("id")
74
+ if isinstance(raw_id, str) and raw_id.strip():
75
+ return scrub_string(raw_id.strip())
76
+ try:
77
+ mtime = state_file.stat().st_mtime
78
+ except OSError:
79
+ mtime = 0.0
80
+ return datetime.fromtimestamp(mtime, tz=timezone.utc).isoformat()
81
+
82
+
83
+ def build_trace(
84
+ project_root: Path,
85
+ state_file: Path,
86
+ *,
87
+ now: datetime | None = None,
88
+ ) -> dict[str, Any]:
89
+ """Aggregate every why-slot for the most recent ``/work`` run.
90
+
91
+ Returns a JSON-serialisable dict that conforms to
92
+ ``explain-trace.schema.json``. ``now`` is only injected by the test
93
+ harness; the production caller passes ``None`` and gets the wall
94
+ clock. All free-form strings pass through :func:`scrub_string`
95
+ before being placed in the output (FATAL council fix — see roadmap
96
+ § "External AI-Council pass").
97
+ """
98
+ state = load_state(state_file)
99
+ generated_at = (now or datetime.now(tz=timezone.utc)).isoformat()
100
+ return {
101
+ "version": TRACE_VERSION,
102
+ "generated_at": generated_at,
103
+ "run_id": _derive_run_id(state, state_file),
104
+ "subject": _derive_subject(state),
105
+ "inputs": _inputs.build(project_root),
106
+ "route": _route.build(project_root, state),
107
+ "council": _council.build(project_root, state_file),
108
+ "memory": _memory.build(project_root, state),
109
+ "pack": _inputs.build_pack(project_root),
110
+ "assumptions": _assumptions.build(state),
111
+ "halt": _halt.build(state),
112
+ "provider": _provider.build(state),
113
+ }
114
+
115
+
116
+ __all__ = [
117
+ "TRACE_VERSION",
118
+ "StateLoadError",
119
+ "build_trace",
120
+ "load_state",
121
+ "scrub_string",
122
+ ]
@@ -0,0 +1,59 @@
1
+ """Resolve the ``assumptions`` why-slot for the trace.
2
+
3
+ The work-engine writes ``state.input.data.assumptions[]`` at the end
4
+ of the ``refine`` step and on every ``halt``. Each entry is either a
5
+ plain string (legacy shape) or a dict with ``{id, accepted, source}``
6
+ (R2+ shape). Both shapes are normalised here so the schema gate sees a
7
+ uniform list of objects.
8
+ """
9
+ from __future__ import annotations
10
+
11
+ from typing import Any
12
+
13
+ from scripts._cli.explain_last.scrubber import scrub_string
14
+
15
+
16
+ def _normalise(raw: Any, fallback_idx: int) -> dict[str, Any] | None:
17
+ if isinstance(raw, str):
18
+ text = raw.strip()
19
+ if not text:
20
+ return None
21
+ return {
22
+ "id": scrub_string(text)[:120] or f"assumption-{fallback_idx}",
23
+ "accepted": True,
24
+ "source": "refine",
25
+ }
26
+ if isinstance(raw, dict):
27
+ ident = raw.get("id") or raw.get("text") or f"assumption-{fallback_idx}"
28
+ if not isinstance(ident, str):
29
+ ident = str(ident)
30
+ ident = scrub_string(ident.strip()) or f"assumption-{fallback_idx}"
31
+ accepted = bool(raw.get("accepted", True))
32
+ source = raw.get("source") or raw.get("step") or "refine"
33
+ return {
34
+ "id": ident,
35
+ "accepted": accepted,
36
+ "source": scrub_string(str(source)),
37
+ }
38
+ return None
39
+
40
+
41
+ def build(state: dict[str, Any]) -> list[dict[str, Any]]:
42
+ """Return the assumptions list (possibly empty).
43
+
44
+ Schema requires an array; ``null`` is not allowed. An empty list
45
+ is the documented signal that no assumptions were captured.
46
+ """
47
+ data = (state.get("input") or {}).get("data") or {}
48
+ raw_list = data.get("assumptions") or []
49
+ if not isinstance(raw_list, list):
50
+ return []
51
+ out: list[dict[str, Any]] = []
52
+ for idx, raw in enumerate(raw_list):
53
+ entry = _normalise(raw, idx)
54
+ if entry is not None:
55
+ out.append(entry)
56
+ return out
57
+
58
+
59
+ __all__ = ["build"]
@@ -0,0 +1,105 @@
1
+ """Resolve the ``council`` why-slot for the trace.
2
+
3
+ Picks the most recent ``council-responses.json`` whose ``mtime`` lies
4
+ within the run window (state file mtime ± 1h). Cost-metadata fields
5
+ (``input_tokens``, ``output_tokens``, ``cost_usd``, ``latency_ms``) are
6
+ intentionally NOT surfaced — they leak business-intelligence about
7
+ spend rate per the security-engineer council fix.
8
+ """
9
+ from __future__ import annotations
10
+
11
+ import json
12
+ from pathlib import Path
13
+ from typing import Any
14
+
15
+ from scripts._cli.explain_last.scrubber import scrub_string
16
+
17
+ RUN_WINDOW_SECONDS = 3600
18
+
19
+
20
+ def _candidate_files(project_root: Path) -> list[Path]:
21
+ """Return every council-response file the loader knows about.
22
+
23
+ Implementation spec for the council loader; the glob path is the
24
+ contract it implements.
25
+ """
26
+ # council-ref-allowed: council loader implementation per roadmap.
27
+ sessions_root = project_root / "agents" / "runtime" / "council" / "sessions"
28
+ tmp_root = project_root / "tmp"
29
+ candidates: list[Path] = []
30
+ if sessions_root.exists():
31
+ for sub in sessions_root.iterdir():
32
+ if sub.is_dir():
33
+ candidate = sub / "council-responses.json"
34
+ if candidate.exists():
35
+ candidates.append(candidate)
36
+ if tmp_root.exists():
37
+ candidates.extend(sorted(tmp_root.glob("council-*.json")))
38
+ return candidates
39
+
40
+
41
+ def _pick_recent(candidates: list[Path], anchor_mtime: float) -> Path | None:
42
+ best: tuple[float, Path] | None = None
43
+ for path in candidates:
44
+ try:
45
+ mtime = path.stat().st_mtime
46
+ except OSError:
47
+ continue
48
+ if abs(mtime - anchor_mtime) > RUN_WINDOW_SECONDS:
49
+ continue
50
+ if best is None or mtime > best[0]:
51
+ best = (mtime, path)
52
+ return best[1] if best else None
53
+
54
+
55
+ def _extract_member(entry: dict[str, Any]) -> dict[str, Any] | None:
56
+ provider = entry.get("provider") or ""
57
+ model = entry.get("model") or ""
58
+ member_id = "/".join(part for part in (provider, model) if part) or "unknown"
59
+ text = entry.get("text")
60
+ if not isinstance(text, str) or not text.strip():
61
+ return None
62
+ verdict = scrub_string(text.strip().splitlines()[0][:200])
63
+ citations = []
64
+ for cite in entry.get("citations", []) or []:
65
+ if isinstance(cite, str):
66
+ citations.append(scrub_string(cite))
67
+ return {
68
+ "member_id": scrub_string(member_id),
69
+ "verdict": verdict,
70
+ "citations": citations,
71
+ }
72
+
73
+
74
+ def build(
75
+ project_root: Path,
76
+ state_file: Path,
77
+ ) -> list[dict[str, Any]] | None:
78
+ """Return the ``council`` slot or ``None`` if no session matches."""
79
+ try:
80
+ anchor = state_file.stat().st_mtime
81
+ except OSError:
82
+ return None
83
+ candidates = _candidate_files(project_root)
84
+ if not candidates:
85
+ return None
86
+ picked = _pick_recent(candidates, anchor)
87
+ if picked is None:
88
+ return None
89
+ try:
90
+ raw = json.loads(picked.read_text(encoding="utf-8"))
91
+ except (OSError, json.JSONDecodeError):
92
+ return None
93
+ if not isinstance(raw, dict):
94
+ return None
95
+ members: list[dict[str, Any]] = []
96
+ for entry in raw.get("responses", []) or []:
97
+ if not isinstance(entry, dict):
98
+ continue
99
+ member = _extract_member(entry)
100
+ if member is not None:
101
+ members.append(member)
102
+ return members or None
103
+
104
+
105
+ __all__ = ["build"]
@@ -0,0 +1,44 @@
1
+ """Builder for the ``trace.halt`` slot.
2
+
3
+ Reads ``state.halts[]`` (the append-only halt log persisted by
4
+ :mod:`work_engine.emitters._emit_halt`) and projects the most recent
5
+ entry into the v1 explain-trace shape: ``{reason, step, surface}``.
6
+
7
+ Returns ``None`` when the engine never halted (clean run) or when the
8
+ state file predates the halts-bearing schema (forward-compatible read:
9
+ older state files just omit the key). Free-form strings pass through
10
+ :func:`scripts._cli.explain_last.scrubber.scrub_string` so PII or
11
+ cost-metadata leakage from halt surfaces never escapes the trace.
12
+ """
13
+ from __future__ import annotations
14
+
15
+ from typing import Any
16
+
17
+ from scripts._cli.explain_last.scrubber import scrub_string
18
+
19
+
20
+ def build(state: dict[str, Any]) -> dict[str, Any] | None:
21
+ halts = state.get("halts") or []
22
+ if not isinstance(halts, list) or not halts:
23
+ return None
24
+ last = halts[-1]
25
+ if not isinstance(last, dict):
26
+ return None
27
+ reason = last.get("reason")
28
+ if not isinstance(reason, str) or not reason:
29
+ return None
30
+ step = last.get("step")
31
+ surface = last.get("surface") or []
32
+ scrubbed_surface: list[str] = []
33
+ if isinstance(surface, list):
34
+ for line in surface:
35
+ if isinstance(line, str):
36
+ scrubbed_surface.append(scrub_string(line))
37
+ return {
38
+ "reason": scrub_string(reason),
39
+ "step": scrub_string(step) if isinstance(step, str) and step else "",
40
+ "surface": scrubbed_surface,
41
+ }
42
+
43
+
44
+ __all__ = ["build"]
@@ -0,0 +1,125 @@
1
+ """Resolve the ``inputs`` and ``pack`` why-slots for the trace.
2
+
3
+ Reuses :mod:`scripts.config.profiles` and :mod:`scripts.config.presets`
4
+ so the rendered chain matches what the runtime loader actually
5
+ consulted (no parallel logic — the v1 ``explain config`` surface
6
+ already covers this and we read through the same resolvers).
7
+ """
8
+ from __future__ import annotations
9
+
10
+ import logging
11
+ from contextlib import contextmanager
12
+ from pathlib import Path
13
+ from typing import Any
14
+
15
+ from scripts._cli.explain_last.scrubber import scrub_string
16
+ from scripts._lib.agent_settings import DEFAULT_PROJECT_FILE, load_agent_settings
17
+ from scripts.config import presets, profiles
18
+
19
+ _DEFAULT_COST_PROFILE = "balanced"
20
+ _SILENCED_LOGGERS = ("scripts.config.profiles", "scripts.config.presets")
21
+
22
+
23
+ @contextmanager
24
+ def _silence_resolver_warnings():
25
+ # Profile / preset loggers emit absolute paths on read failure;
26
+ # the explain trace must never leak them. Failures bubble up via
27
+ # ProfileError / PresetError anyway, so the warning has no signal.
28
+ previous: list[tuple[logging.Logger, int]] = []
29
+ for name in _SILENCED_LOGGERS:
30
+ log = logging.getLogger(name)
31
+ previous.append((log, log.level))
32
+ log.setLevel(logging.ERROR)
33
+ try:
34
+ yield
35
+ finally:
36
+ for log, level in previous:
37
+ log.setLevel(level)
38
+
39
+
40
+ def _load_settings(project_root: Path) -> dict[str, Any]:
41
+ path = project_root / DEFAULT_PROJECT_FILE
42
+ if not path.exists():
43
+ return {}
44
+ return load_agent_settings(project_path=path) or {}
45
+
46
+
47
+ def build(project_root: Path) -> dict[str, Any] | None:
48
+ """Return the ``inputs`` slot or ``None`` on broken settings.
49
+
50
+ Each knob carries its source (``pack | profile | preset | user |
51
+ env | runtime | default``) so the renderer's table can attribute
52
+ the value to the layer that won the resolution race.
53
+ """
54
+ try:
55
+ with _silence_resolver_warnings():
56
+ settings = _load_settings(project_root)
57
+ resolved_profile = profiles.resolve_profile(
58
+ project_root=project_root,
59
+ user_settings=settings,
60
+ )
61
+ resolved_preset = presets.resolve_preset(
62
+ project_root=project_root,
63
+ user_settings=settings,
64
+ profile_preset_id=resolved_profile.preset_id,
65
+ )
66
+ except (profiles.ProfileError, presets.PresetError, OSError):
67
+ return None
68
+ cost_profile = settings.get("cost_profile") if isinstance(settings, dict) else None
69
+ cost_profile_source = "user" if cost_profile else "default"
70
+ if not cost_profile or cost_profile == "__COST_PROFILE__":
71
+ cost_profile = _DEFAULT_COST_PROFILE
72
+ cost_profile_source = "default"
73
+ return {
74
+ "profile": scrub_string(resolved_profile.id),
75
+ "preset": scrub_string(resolved_preset.id),
76
+ "cost_profile": scrub_string(str(cost_profile)),
77
+ "source_per_knob": {
78
+ "profile": resolved_profile.source,
79
+ "preset": resolved_preset.source,
80
+ "cost_profile": cost_profile_source,
81
+ },
82
+ }
83
+
84
+
85
+ def _pack_marker(project_root: Path) -> Path | None:
86
+ for candidate in (
87
+ project_root / ".agent-pack.yml",
88
+ project_root / ".agent-src.uncompressed" / ".agent-pack.yml",
89
+ ):
90
+ if candidate.exists():
91
+ return candidate
92
+ return None
93
+
94
+
95
+ def build_pack(project_root: Path) -> dict[str, Any] | None:
96
+ """Return the active workspace pack or ``None``.
97
+
98
+ The discovery pipeline (R3) writes a ``.agent-pack.yml`` marker
99
+ when a pack is bound to the project. We surface only the id and a
100
+ short reason; pack-internal payloads stay invisible to the trace.
101
+ """
102
+ marker = _pack_marker(project_root)
103
+ if marker is None:
104
+ return None
105
+ try:
106
+ import yaml # type: ignore[import-not-found]
107
+ except ImportError:
108
+ return None
109
+ try:
110
+ raw = yaml.safe_load(marker.read_text(encoding="utf-8")) or {}
111
+ except (OSError, yaml.YAMLError):
112
+ return None
113
+ if not isinstance(raw, dict):
114
+ return None
115
+ pack_id = raw.get("id") or raw.get("pack")
116
+ if not isinstance(pack_id, str) or not pack_id.strip():
117
+ return None
118
+ reason = raw.get("reason") or f"declared in {marker.name}"
119
+ return {
120
+ "id": scrub_string(pack_id.strip()),
121
+ "reason": scrub_string(str(reason)),
122
+ }
123
+
124
+
125
+ __all__ = ["build", "build_pack"]
@@ -0,0 +1,94 @@
1
+ """Resolve the ``memory`` why-slot for the trace.
2
+
3
+ Two sources are consulted:
4
+
5
+ * ``state.memory[]`` — the work-engine writes per-run memory hits here
6
+ during the ``memory`` step. Each entry carries ``{entry_id,
7
+ hit_score, used_in}`` already shaped to the trace contract.
8
+ * ``<root>/.agent-memory/hits.jsonl`` — optional sidecar produced by
9
+ the memory-MCP integration. Filtered to entries tagged with the run
10
+ id when present.
11
+
12
+ Returns ``null`` when neither source produced a non-empty list (the
13
+ schema accepts a null memory slot so the renderer can drop the
14
+ section cleanly).
15
+ """
16
+ from __future__ import annotations
17
+
18
+ import json
19
+ from pathlib import Path
20
+ from typing import Any
21
+
22
+ from scripts._cli.explain_last.scrubber import scrub_string
23
+
24
+ MEMORY_SIDECAR = Path(".agent-memory") / "hits.jsonl"
25
+
26
+
27
+ def _coerce_entry(raw: dict[str, Any]) -> dict[str, Any] | None:
28
+ entry_id = raw.get("entry_id") or raw.get("id")
29
+ if not isinstance(entry_id, str) or not entry_id.strip():
30
+ return None
31
+ hit_score = raw.get("hit_score")
32
+ if hit_score is None:
33
+ hit_score = raw.get("score", 0.0)
34
+ try:
35
+ hit_score = float(hit_score)
36
+ except (TypeError, ValueError):
37
+ hit_score = 0.0
38
+ used_in = raw.get("used_in") or raw.get("step") or "unspecified"
39
+ return {
40
+ "entry_id": scrub_string(entry_id.strip()),
41
+ "hit_score": hit_score,
42
+ "used_in": scrub_string(str(used_in)),
43
+ }
44
+
45
+
46
+ def _from_state(state: dict[str, Any]) -> list[dict[str, Any]]:
47
+ entries: list[dict[str, Any]] = []
48
+ for raw in state.get("memory", []) or []:
49
+ if not isinstance(raw, dict):
50
+ continue
51
+ entry = _coerce_entry(raw)
52
+ if entry is not None:
53
+ entries.append(entry)
54
+ return entries
55
+
56
+
57
+ def _from_sidecar(project_root: Path, run_id: str | None) -> list[dict[str, Any]]:
58
+ path = project_root / MEMORY_SIDECAR
59
+ if not path.exists():
60
+ return []
61
+ entries: list[dict[str, Any]] = []
62
+ try:
63
+ for line in path.read_text(encoding="utf-8").splitlines():
64
+ line = line.strip()
65
+ if not line:
66
+ continue
67
+ try:
68
+ raw = json.loads(line)
69
+ except json.JSONDecodeError:
70
+ continue
71
+ if not isinstance(raw, dict):
72
+ continue
73
+ if run_id and raw.get("run_id") not in (None, run_id):
74
+ continue
75
+ entry = _coerce_entry(raw)
76
+ if entry is not None:
77
+ entries.append(entry)
78
+ except OSError:
79
+ return []
80
+ return entries
81
+
82
+
83
+ def build(
84
+ project_root: Path,
85
+ state: dict[str, Any],
86
+ ) -> list[dict[str, Any]] | None:
87
+ """Return the ``memory`` slot or ``None`` if no hits were captured."""
88
+ run_id = (state.get("input") or {}).get("data", {}).get("id")
89
+ entries = _from_state(state)
90
+ entries.extend(_from_sidecar(project_root, run_id if isinstance(run_id, str) else None))
91
+ return entries or None
92
+
93
+
94
+ __all__ = ["build"]
@@ -0,0 +1,52 @@
1
+ """Builder for the ``trace.provider`` slot.
2
+
3
+ Bounded to video runs (``state.directive_set == "video"``). The
4
+ work_engine does not yet ship a video directive set — this builder is
5
+ forward-compatible: when the engine eventually persists a provider
6
+ selection (``state.video_provider`` or
7
+ ``state.contract.video_provider`` are both accepted shapes), the slot
8
+ populates; otherwise it returns ``None``.
9
+
10
+ The v1 schema requires ``{id, selection_reason}``. Both fields pass
11
+ through :func:`scripts._cli.explain_last.scrubber.scrub_string` so a
12
+ reason explaining "selected because user has $40/m budget on
13
+ provider-x.internal" never leaks billing or hostnames.
14
+ """
15
+ from __future__ import annotations
16
+
17
+ from typing import Any
18
+
19
+ from scripts._cli.explain_last.scrubber import scrub_string
20
+
21
+
22
+ def _extract(state: dict[str, Any]) -> dict[str, Any] | None:
23
+ direct = state.get("video_provider")
24
+ if isinstance(direct, dict):
25
+ return direct
26
+ contract = state.get("contract")
27
+ if isinstance(contract, dict):
28
+ nested = contract.get("video_provider")
29
+ if isinstance(nested, dict):
30
+ return nested
31
+ return None
32
+
33
+
34
+ def build(state: dict[str, Any]) -> dict[str, Any] | None:
35
+ if (state.get("directive_set") or "") != "video":
36
+ return None
37
+ payload = _extract(state)
38
+ if payload is None:
39
+ return None
40
+ pid = payload.get("id")
41
+ reason = payload.get("selection_reason")
42
+ if not isinstance(pid, str) or not pid:
43
+ return None
44
+ if not isinstance(reason, str) or not reason:
45
+ reason = ""
46
+ return {
47
+ "id": scrub_string(pid),
48
+ "selection_reason": scrub_string(reason),
49
+ }
50
+
51
+
52
+ __all__ = ["build"]
@@ -0,0 +1,52 @@
1
+ """Deterministic Markdown projection of an :class:`ExplainTrace`.
2
+
3
+ Pure-function ``render(trace) -> str``. Same input ``ExplainTrace``
4
+ always yields byte-identical Markdown — Phase 4 snapshot tests rely on
5
+ this. Each section lives in its own module under :mod:`sections/`; the
6
+ orchestrator only fixes the order. Phase 3 wired ``halt`` and
7
+ ``provider`` sections; ``halt`` always renders (clean / dirty branch
8
+ both deterministic), ``provider`` emits an empty string on non-video
9
+ runs so the orchestrator drops it silently.
10
+ """
11
+ from __future__ import annotations
12
+
13
+ from typing import Any
14
+
15
+ from scripts._cli.explain_last import sections
16
+
17
+ _SECTION_ORDER = (
18
+ sections.header,
19
+ sections.route,
20
+ sections.inputs,
21
+ sections.memory,
22
+ sections.council,
23
+ sections.halt,
24
+ sections.provider,
25
+ sections.assumptions,
26
+ sections.pack,
27
+ )
28
+
29
+ TIP_FOOTER = (
30
+ "_tip: pass `--json` to emit machine-readable trace; "
31
+ "`--quiet` to drop this footer._\n"
32
+ )
33
+
34
+
35
+ def render(trace: dict[str, Any], *, with_footer: bool = True) -> str:
36
+ """Render ``trace`` to Markdown.
37
+
38
+ ``with_footer=False`` suppresses the trailing tip line (council
39
+ fix: CI scripts parse the output and choke on a stray footer).
40
+ """
41
+ parts: list[str] = []
42
+ for section in _SECTION_ORDER:
43
+ chunk = section.render(trace)
44
+ if chunk:
45
+ parts.append(chunk)
46
+ body = "\n".join(parts).rstrip() + "\n"
47
+ if with_footer:
48
+ body += "\n" + TIP_FOOTER
49
+ return body
50
+
51
+
52
+ __all__ = ["TIP_FOOTER", "render"]