session-orchestrator 3.16.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 (762) hide show
  1. package/.claude-plugin/marketplace.json +29 -0
  2. package/.claude-plugin/plugin.json +18 -0
  3. package/.codex-plugin/agents/explorer.toml +14 -0
  4. package/.codex-plugin/agents/session-reviewer.toml +23 -0
  5. package/.codex-plugin/agents/wave-worker.toml +15 -0
  6. package/.codex-plugin/config.toml +20 -0
  7. package/.codex-plugin/plugin.json +37 -0
  8. package/.cursor/rules/000-session-orchestrator.mdc +73 -0
  9. package/.cursor/rules/010-session-workflow.mdc +170 -0
  10. package/.cursor/rules/020-quality-gates.mdc +128 -0
  11. package/.cursor/rules/030-wave-execution.mdc +216 -0
  12. package/.cursor/rules/040-discovery.mdc +242 -0
  13. package/.cursor/rules/050-plan.mdc +235 -0
  14. package/.cursor/rules/060-evolve.mdc +232 -0
  15. package/.cursor/rules/070-gitlab-ops.mdc +246 -0
  16. package/.cursor/rules/080-ecosystem-health.mdc +145 -0
  17. package/.mcp.json +8 -0
  18. package/CHANGELOG.md +1544 -0
  19. package/LICENSE +21 -0
  20. package/NOTICE +64 -0
  21. package/README.md +242 -0
  22. package/SECURITY.md +90 -0
  23. package/agents/AGENTS.md +136 -0
  24. package/agents/analyst.md +99 -0
  25. package/agents/architect-reviewer.md +93 -0
  26. package/agents/code-implementer.md +106 -0
  27. package/agents/db-specialist.md +104 -0
  28. package/agents/dialectic-deriver.md +139 -0
  29. package/agents/docs-writer.md +113 -0
  30. package/agents/eval-judge.md +146 -0
  31. package/agents/memory-proposal-collector.md +297 -0
  32. package/agents/qa-strategist.md +102 -0
  33. package/agents/schemas/analyst.schema.json +46 -0
  34. package/agents/schemas/architect-reviewer.schema.json +50 -0
  35. package/agents/schemas/code-implementer.schema.json +61 -0
  36. package/agents/schemas/db-specialist.schema.json +80 -0
  37. package/agents/schemas/docs-writer.schema.json +56 -0
  38. package/agents/schemas/persona-panel-sidecar.schema.json +245 -0
  39. package/agents/schemas/qa-strategist.schema.json +46 -0
  40. package/agents/schemas/security-reviewer.schema.json +86 -0
  41. package/agents/schemas/session-reviewer.schema.json +69 -0
  42. package/agents/schemas/test-writer.schema.json +69 -0
  43. package/agents/schemas/ui-developer.schema.json +90 -0
  44. package/agents/schemas/ux-evaluator.schema.json +51 -0
  45. package/agents/security-reviewer.md +236 -0
  46. package/agents/session-reviewer.md +201 -0
  47. package/agents/skill-applied-judge.md +122 -0
  48. package/agents/test-writer.md +123 -0
  49. package/agents/ui-developer.md +109 -0
  50. package/agents/ux-evaluator.md +161 -0
  51. package/assets/icon.svg +11 -0
  52. package/assets/og-card.png +0 -0
  53. package/assets/og-card.svg +47 -0
  54. package/commands/autopilot-multi.md +74 -0
  55. package/commands/autopilot.md +80 -0
  56. package/commands/bootstrap.md +56 -0
  57. package/commands/brainstorm.md +48 -0
  58. package/commands/close.md +24 -0
  59. package/commands/debug.md +36 -0
  60. package/commands/discovery.md +32 -0
  61. package/commands/dispatcher.md +59 -0
  62. package/commands/eval.md +28 -0
  63. package/commands/evolve.md +10 -0
  64. package/commands/go.md +41 -0
  65. package/commands/grill.md +45 -0
  66. package/commands/harness-audit.md +26 -0
  67. package/commands/memory-cleanup.md +25 -0
  68. package/commands/persona-panel.md +121 -0
  69. package/commands/plan.md +15 -0
  70. package/commands/portfolio.md +97 -0
  71. package/commands/reconcile.md +23 -0
  72. package/commands/repo-audit.md +24 -0
  73. package/commands/session.md +30 -0
  74. package/commands/spinout.md +15 -0
  75. package/commands/sunset-review.md +27 -0
  76. package/commands/templates-ack.md +96 -0
  77. package/commands/test.md +97 -0
  78. package/docs/README.md +105 -0
  79. package/docs/USER-GUIDE.md +1403 -0
  80. package/docs/ci-setup.md +81 -0
  81. package/docs/codex-setup.md +142 -0
  82. package/docs/components.md +74 -0
  83. package/docs/cursor-setup.md +104 -0
  84. package/docs/events-schema.md +81 -0
  85. package/docs/migration-v3.md +148 -0
  86. package/docs/owner-config-schema.md +154 -0
  87. package/docs/persona-panel.md +433 -0
  88. package/docs/pi-setup.md +115 -0
  89. package/docs/plugin-architecture-v3.md +296 -0
  90. package/docs/pm-skills-marketplace.md +114 -0
  91. package/docs/policy-cache-validation-2026-04-28.md +118 -0
  92. package/docs/rule-authoring.md +316 -0
  93. package/docs/session-config-reference.md +1439 -0
  94. package/docs/session-config-template.md +961 -0
  95. package/docs/vault-docs-architecture.md +297 -0
  96. package/hooks/_lib/lock-bootstrap.mjs +272 -0
  97. package/hooks/_lib/lock-reconcile.mjs +93 -0
  98. package/hooks/_lib/profile-gate.mjs +95 -0
  99. package/hooks/_lib/transcript-history.mjs +211 -0
  100. package/hooks/agent-teams-h3-test.sh +362 -0
  101. package/hooks/config-protection.mjs +0 -0
  102. package/hooks/cwd-change-restore.mjs +131 -0
  103. package/hooks/enforce-commands.mjs +179 -0
  104. package/hooks/enforce-scope.mjs +273 -0
  105. package/hooks/hooks-codex.json +60 -0
  106. package/hooks/hooks-cursor.json +15 -0
  107. package/hooks/hooks-pi.json +115 -0
  108. package/hooks/hooks.json +215 -0
  109. package/hooks/loop-guard.mjs +260 -0
  110. package/hooks/on-session-end.mjs +217 -0
  111. package/hooks/on-session-start.mjs +660 -0
  112. package/hooks/on-stop.mjs +294 -0
  113. package/hooks/operator-steer.mjs +64 -0
  114. package/hooks/post-edit-validate.mjs +225 -0
  115. package/hooks/post-subagent-discovery-validator.mjs +398 -0
  116. package/hooks/post-tool-batch-wave-signal.mjs +328 -0
  117. package/hooks/post-tool-failure-corrective-context.mjs +248 -0
  118. package/hooks/post-tooluse-frontend-slop.mjs +184 -0
  119. package/hooks/pre-bash-destructive-guard.mjs +515 -0
  120. package/hooks/pre-bash-memory-propose-audit.mjs +206 -0
  121. package/hooks/pre-bash-staging-fence.mjs +223 -0
  122. package/hooks/pre-bash-templates-first.mjs +404 -0
  123. package/hooks/run-node.sh +72 -0
  124. package/hooks/skill-invocation-telemetry.mjs +99 -0
  125. package/hooks/subagent-telemetry.mjs +249 -0
  126. package/hooks/wave-scope-commit-guard.mjs +191 -0
  127. package/monitors/monitors.json +14 -0
  128. package/output-styles/finding-report.md +48 -0
  129. package/output-styles/session-report.md +53 -0
  130. package/output-styles/wave-summary.md +38 -0
  131. package/package.json +94 -0
  132. package/pi/extensions/session-orchestrator.ts +25 -0
  133. package/pi/prompts/autopilot-multi.md +12 -0
  134. package/pi/prompts/autopilot.md +12 -0
  135. package/pi/prompts/bootstrap.md +12 -0
  136. package/pi/prompts/brainstorm.md +12 -0
  137. package/pi/prompts/close.md +11 -0
  138. package/pi/prompts/debug.md +12 -0
  139. package/pi/prompts/discovery.md +12 -0
  140. package/pi/prompts/dispatcher.md +12 -0
  141. package/pi/prompts/eval.md +12 -0
  142. package/pi/prompts/evolve.md +12 -0
  143. package/pi/prompts/go.md +12 -0
  144. package/pi/prompts/grill.md +12 -0
  145. package/pi/prompts/harness-audit.md +12 -0
  146. package/pi/prompts/memory-cleanup.md +12 -0
  147. package/pi/prompts/persona-panel.md +12 -0
  148. package/pi/prompts/plan.md +12 -0
  149. package/pi/prompts/portfolio.md +12 -0
  150. package/pi/prompts/reconcile.md +12 -0
  151. package/pi/prompts/repo-audit.md +12 -0
  152. package/pi/prompts/session.md +12 -0
  153. package/pi/prompts/spinout.md +12 -0
  154. package/pi/prompts/sunset-review.md +12 -0
  155. package/pi/prompts/templates-ack.md +12 -0
  156. package/pi/prompts/test.md +12 -0
  157. package/rules/_index.md +51 -0
  158. package/rules/always-on/commit-discipline.md +26 -0
  159. package/rules/always-on/npm-quality-gates.md +26 -0
  160. package/rules/always-on/parallel-sessions.md +43 -0
  161. package/rules/opt-in-domain/prompt-caching.md +270 -0
  162. package/rules/opt-in-stack/backend-data.md +188 -0
  163. package/rules/opt-in-stack/backend.md +390 -0
  164. package/rules/opt-in-stack/frontend.md +98 -0
  165. package/rules/opt-in-stack/security-web.md +194 -0
  166. package/rules/opt-in-stack/swift.md +65 -0
  167. package/scripts/archive-closed-prds.mjs +416 -0
  168. package/scripts/autopilot-multi.mjs +802 -0
  169. package/scripts/autopilot.mjs +383 -0
  170. package/scripts/backfill-abandoned-sessions.mjs +265 -0
  171. package/scripts/backfill-learnings-expires.mjs +196 -0
  172. package/scripts/backfill-learnings.mjs +203 -0
  173. package/scripts/backfill-sessions.mjs +282 -0
  174. package/scripts/check-doc-consistency.sh +279 -0
  175. package/scripts/check-package-manager.mjs +445 -0
  176. package/scripts/ci/assert-vitest-green.mjs +267 -0
  177. package/scripts/codex-install.mjs +435 -0
  178. package/scripts/compute-grounding-injection.sh +186 -0
  179. package/scripts/cursor-install.mjs +113 -0
  180. package/scripts/dialectic-deriver.mjs +573 -0
  181. package/scripts/emit-event.mjs +160 -0
  182. package/scripts/emit-session.mjs +212 -0
  183. package/scripts/eval-session.mjs +262 -0
  184. package/scripts/export-hw-learnings.mjs +437 -0
  185. package/scripts/gc-stale-worktrees.mjs +666 -0
  186. package/scripts/generate-pi-prompts.mjs +127 -0
  187. package/scripts/harness-audit.mjs +287 -0
  188. package/scripts/lib/agent-frontmatter.mjs +266 -0
  189. package/scripts/lib/agent-output-schema.mjs +166 -0
  190. package/scripts/lib/agent-status.mjs +303 -0
  191. package/scripts/lib/ajv-loader.mjs +34 -0
  192. package/scripts/lib/auto-dialectic.mjs +382 -0
  193. package/scripts/lib/auto-dream.mjs +471 -0
  194. package/scripts/lib/autonomy/suitability.mjs +212 -0
  195. package/scripts/lib/autopilot/dep-graph.mjs +417 -0
  196. package/scripts/lib/autopilot/durable-telemetry.mjs +121 -0
  197. package/scripts/lib/autopilot/flags.mjs +104 -0
  198. package/scripts/lib/autopilot/kill-switches.mjs +174 -0
  199. package/scripts/lib/autopilot/loop.mjs +320 -0
  200. package/scripts/lib/autopilot/mr-draft.mjs +520 -0
  201. package/scripts/lib/autopilot/multi-killswitch.mjs +184 -0
  202. package/scripts/lib/autopilot/recent-runs.mjs +106 -0
  203. package/scripts/lib/autopilot/stall-sampler.mjs +97 -0
  204. package/scripts/lib/autopilot/telemetry.mjs +224 -0
  205. package/scripts/lib/autopilot/worktree-pipeline.mjs +605 -0
  206. package/scripts/lib/autopilot-telemetry.mjs +11 -0
  207. package/scripts/lib/autopilot.mjs +39 -0
  208. package/scripts/lib/backlog-scan.mjs +179 -0
  209. package/scripts/lib/bootstrap-lock-freshness.mjs +260 -0
  210. package/scripts/lib/bootstrap-lock-refresh.mjs +186 -0
  211. package/scripts/lib/build-live-signals.mjs +150 -0
  212. package/scripts/lib/ci-status-banner.mjs +425 -0
  213. package/scripts/lib/claude-md-budget-lint.mjs +246 -0
  214. package/scripts/lib/cli-flags.mjs +158 -0
  215. package/scripts/lib/codex/plugin-contract.mjs +610 -0
  216. package/scripts/lib/cold-start-detector.mjs +240 -0
  217. package/scripts/lib/command-blocker.mjs +458 -0
  218. package/scripts/lib/common.mjs +333 -0
  219. package/scripts/lib/config/auto-dream.mjs +77 -0
  220. package/scripts/lib/config/block-header.mjs +94 -0
  221. package/scripts/lib/config/broken-window.mjs +114 -0
  222. package/scripts/lib/config/coercers.mjs +248 -0
  223. package/scripts/lib/config/cold-start.mjs +92 -0
  224. package/scripts/lib/config/config-protection.mjs +120 -0
  225. package/scripts/lib/config/cross-repo.mjs +104 -0
  226. package/scripts/lib/config/custom-phases.mjs +213 -0
  227. package/scripts/lib/config/dialectic.mjs +92 -0
  228. package/scripts/lib/config/discovery-validator.mjs +75 -0
  229. package/scripts/lib/config/dispatcher-autonomy-capture.mjs +240 -0
  230. package/scripts/lib/config/dispatcher-autonomy.mjs +152 -0
  231. package/scripts/lib/config/docs-orchestrator.mjs +90 -0
  232. package/scripts/lib/config/docs-staleness.mjs +96 -0
  233. package/scripts/lib/config/drift-check.mjs +155 -0
  234. package/scripts/lib/config/eval.mjs +130 -0
  235. package/scripts/lib/config/events-rotation.mjs +74 -0
  236. package/scripts/lib/config/evolve.mjs +308 -0
  237. package/scripts/lib/config/frontend-slop-hook.mjs +104 -0
  238. package/scripts/lib/config/gitlab-portfolio.mjs +150 -0
  239. package/scripts/lib/config/handover-gate.mjs +106 -0
  240. package/scripts/lib/config/host-paths.mjs +76 -0
  241. package/scripts/lib/config/io.mjs +54 -0
  242. package/scripts/lib/config/loop-guard.mjs +117 -0
  243. package/scripts/lib/config/memory.mjs +150 -0
  244. package/scripts/lib/config/persona-gate-wave.mjs +258 -0
  245. package/scripts/lib/config/reconcile.mjs +205 -0
  246. package/scripts/lib/config/section-extractor.mjs +100 -0
  247. package/scripts/lib/config/skill-evolution.mjs +112 -0
  248. package/scripts/lib/config/slopcheck.mjs +99 -0
  249. package/scripts/lib/config/state-md-lock.mjs +83 -0
  250. package/scripts/lib/config/templates-first.mjs +94 -0
  251. package/scripts/lib/config/test.mjs +113 -0
  252. package/scripts/lib/config/vault-integration.mjs +201 -0
  253. package/scripts/lib/config/vault-mirror-quality.mjs +99 -0
  254. package/scripts/lib/config/vault-staleness.mjs +84 -0
  255. package/scripts/lib/config/vault-sync.mjs +96 -0
  256. package/scripts/lib/config/verification-auto-fix.mjs +84 -0
  257. package/scripts/lib/config/wave-reviewers.mjs +133 -0
  258. package/scripts/lib/config-schema.mjs +345 -0
  259. package/scripts/lib/config.mjs +474 -0
  260. package/scripts/lib/convergence-monitor.mjs +389 -0
  261. package/scripts/lib/coordinator-snapshot.mjs +371 -0
  262. package/scripts/lib/crypto-digest-utils.mjs +91 -0
  263. package/scripts/lib/discovery/helpers.mjs +127 -0
  264. package/scripts/lib/discovery/triage-state.mjs +279 -0
  265. package/scripts/lib/dispatcher/cli.mjs +257 -0
  266. package/scripts/lib/dispatcher/enumerate.mjs +243 -0
  267. package/scripts/lib/dispatcher/rank.mjs +363 -0
  268. package/scripts/lib/ecosystem-health.mjs +224 -0
  269. package/scripts/lib/ecosystem-wizard/ci-detector.mjs +18 -0
  270. package/scripts/lib/ecosystem-wizard/config-parser.mjs +54 -0
  271. package/scripts/lib/ecosystem-wizard/config-writer.mjs +287 -0
  272. package/scripts/lib/ecosystem-wizard/package-manager-detector.mjs +42 -0
  273. package/scripts/lib/ecosystem-wizard/wizard-prompt.mjs +246 -0
  274. package/scripts/lib/ecosystem-wizard.mjs +48 -0
  275. package/scripts/lib/env-check.mjs +89 -0
  276. package/scripts/lib/eval/engine.mjs +605 -0
  277. package/scripts/lib/eval/judge.mjs +433 -0
  278. package/scripts/lib/eval/report.mjs +367 -0
  279. package/scripts/lib/eval/schema.mjs +618 -0
  280. package/scripts/lib/eval/session-resolve.mjs +137 -0
  281. package/scripts/lib/eval/sink.mjs +77 -0
  282. package/scripts/lib/events-rotation.mjs +86 -0
  283. package/scripts/lib/events-schema.mjs +81 -0
  284. package/scripts/lib/events.mjs +80 -0
  285. package/scripts/lib/evolve/autonomy-verdict.mjs +461 -0
  286. package/scripts/lib/evolve/autopilot-effectiveness.mjs +293 -0
  287. package/scripts/lib/exclusivity-matrix.mjs +68 -0
  288. package/scripts/lib/fetch-baseline.mjs +311 -0
  289. package/scripts/lib/file-lock.mjs +512 -0
  290. package/scripts/lib/frontend-detect/detect.mjs +138 -0
  291. package/scripts/lib/frontend-detect/rules.mjs +295 -0
  292. package/scripts/lib/frontmatter-guard.mjs +241 -0
  293. package/scripts/lib/gates/echo-stub-detect.mjs +39 -0
  294. package/scripts/lib/gates/gate-baseline.mjs +42 -0
  295. package/scripts/lib/gates/gate-full.mjs +85 -0
  296. package/scripts/lib/gates/gate-helpers.mjs +231 -0
  297. package/scripts/lib/gates/gate-incremental.mjs +76 -0
  298. package/scripts/lib/gates/gate-per-file.mjs +55 -0
  299. package/scripts/lib/gitlab-ops/stale-mr-sweep.mjs +447 -0
  300. package/scripts/lib/gitlab-portfolio/aggregator.mjs +383 -0
  301. package/scripts/lib/gitlab-portfolio/cli.mjs +428 -0
  302. package/scripts/lib/gitlab-portfolio/markdown-writer.mjs +289 -0
  303. package/scripts/lib/gitlab-portfolio/vcs-detect.mjs +182 -0
  304. package/scripts/lib/handover-gate.mjs +222 -0
  305. package/scripts/lib/hardening.mjs +43 -0
  306. package/scripts/lib/hardware-pattern-detector.mjs +238 -0
  307. package/scripts/lib/harness-audit/categories/category1.mjs +123 -0
  308. package/scripts/lib/harness-audit/categories/category2.mjs +145 -0
  309. package/scripts/lib/harness-audit/categories/category3.mjs +143 -0
  310. package/scripts/lib/harness-audit/categories/category4.mjs +202 -0
  311. package/scripts/lib/harness-audit/categories/category5.mjs +152 -0
  312. package/scripts/lib/harness-audit/categories/category6.mjs +211 -0
  313. package/scripts/lib/harness-audit/categories/category7.mjs +125 -0
  314. package/scripts/lib/harness-audit/categories/category8.mjs +328 -0
  315. package/scripts/lib/harness-audit/categories/category9.mjs +294 -0
  316. package/scripts/lib/harness-audit/categories/helpers.mjs +165 -0
  317. package/scripts/lib/harness-audit/categories.mjs +19 -0
  318. package/scripts/lib/historical-guard.mjs +15 -0
  319. package/scripts/lib/host-identity.mjs +262 -0
  320. package/scripts/lib/instruction-budget-guard.mjs +332 -0
  321. package/scripts/lib/io.mjs +304 -0
  322. package/scripts/lib/issue-close-strip-labels.mjs +161 -0
  323. package/scripts/lib/language-mappers/README.md +57 -0
  324. package/scripts/lib/language-mappers/index.mjs +165 -0
  325. package/scripts/lib/language-mappers/markdown.mjs +149 -0
  326. package/scripts/lib/language-mappers/python.mjs +249 -0
  327. package/scripts/lib/language-mappers/swift.mjs +201 -0
  328. package/scripts/lib/language-mappers/typescript.mjs +433 -0
  329. package/scripts/lib/learnings/expiry-sweep.mjs +164 -0
  330. package/scripts/lib/learnings/filters.mjs +43 -0
  331. package/scripts/lib/learnings/io.mjs +255 -0
  332. package/scripts/lib/learnings/schema.mjs +518 -0
  333. package/scripts/lib/learnings/surface.mjs +207 -0
  334. package/scripts/lib/learnings.mjs +42 -0
  335. package/scripts/lib/lock-reaper.mjs +648 -0
  336. package/scripts/lib/locks/index.mjs +31 -0
  337. package/scripts/lib/locks/lock-body.mjs +62 -0
  338. package/scripts/lib/locks/staging-fence-lock.mjs +267 -0
  339. package/scripts/lib/locks/state-md-lock.mjs +351 -0
  340. package/scripts/lib/loop-readiness-banner.mjs +144 -0
  341. package/scripts/lib/memory-banner.mjs +478 -0
  342. package/scripts/lib/memory-cleanup/worktree-sweep.mjs +108 -0
  343. package/scripts/lib/memory-cleanup-stamp.mjs +56 -0
  344. package/scripts/lib/memory-paths.mjs +31 -0
  345. package/scripts/lib/memory-proposals/collector.mjs +334 -0
  346. package/scripts/lib/memory-proposals/schema.mjs +289 -0
  347. package/scripts/lib/memory-proposals/sink.mjs +507 -0
  348. package/scripts/lib/memory-proposals/store.mjs +441 -0
  349. package/scripts/lib/mission-status-schema.mjs +114 -0
  350. package/scripts/lib/mode-selector/alternatives.mjs +64 -0
  351. package/scripts/lib/mode-selector/constants.mjs +29 -0
  352. package/scripts/lib/mode-selector/context-pressure.mjs +157 -0
  353. package/scripts/lib/mode-selector/rationale.mjs +55 -0
  354. package/scripts/lib/mode-selector/scoring.mjs +221 -0
  355. package/scripts/lib/mode-selector-accuracy.mjs +121 -0
  356. package/scripts/lib/mode-selector.mjs +160 -0
  357. package/scripts/lib/multi-provider-build/providers.mjs +64 -0
  358. package/scripts/lib/multi-provider-build/templating.mjs +130 -0
  359. package/scripts/lib/named-baseline-resolver.mjs +233 -0
  360. package/scripts/lib/named-vault-resolver.mjs +433 -0
  361. package/scripts/lib/owner-config/coerce.mjs +29 -0
  362. package/scripts/lib/owner-config/constants.mjs +21 -0
  363. package/scripts/lib/owner-config/defaults.mjs +50 -0
  364. package/scripts/lib/owner-config/error.mjs +19 -0
  365. package/scripts/lib/owner-config/index.mjs +13 -0
  366. package/scripts/lib/owner-config/merge.mjs +52 -0
  367. package/scripts/lib/owner-config/validate.mjs +259 -0
  368. package/scripts/lib/owner-config-banner.mjs +126 -0
  369. package/scripts/lib/owner-config-loader.mjs +159 -0
  370. package/scripts/lib/owner-config.example.yaml +72 -0
  371. package/scripts/lib/owner-config.mjs +28 -0
  372. package/scripts/lib/owner-interview.mjs +243 -0
  373. package/scripts/lib/owner-yaml.mjs +571 -0
  374. package/scripts/lib/package-manager.mjs +160 -0
  375. package/scripts/lib/path-utils.mjs +217 -0
  376. package/scripts/lib/peer-cards/merger.mjs +310 -0
  377. package/scripts/lib/peer-cards/reader.mjs +125 -0
  378. package/scripts/lib/peer-cards/schema.mjs +230 -0
  379. package/scripts/lib/peer-cards/staleness-banner.mjs +86 -0
  380. package/scripts/lib/peer-cards/writer.mjs +138 -0
  381. package/scripts/lib/peer-discovery.mjs +200 -0
  382. package/scripts/lib/persona-panel/catalog-loader.mjs +577 -0
  383. package/scripts/lib/persona-panel/consolidator.mjs +370 -0
  384. package/scripts/lib/persona-panel/persona-runner.mjs +375 -0
  385. package/scripts/lib/persona-panel/threshold.mjs +130 -0
  386. package/scripts/lib/pi-hook-bridge.mjs +328 -0
  387. package/scripts/lib/platform.mjs +266 -0
  388. package/scripts/lib/playwright-driver/runner.mjs +297 -0
  389. package/scripts/lib/plugin-root.mjs +210 -0
  390. package/scripts/lib/pre-dispatch-check.mjs +126 -0
  391. package/scripts/lib/product-repo-detect.mjs +121 -0
  392. package/scripts/lib/profiles/registry.mjs +176 -0
  393. package/scripts/lib/profiles/schema.mjs +209 -0
  394. package/scripts/lib/qg-command-drift-banner.mjs +88 -0
  395. package/scripts/lib/quality-gate/diagnostics.mjs +92 -0
  396. package/scripts/lib/quality-gate.mjs +536 -0
  397. package/scripts/lib/quality-gates-cache.mjs +228 -0
  398. package/scripts/lib/quality-gates-policy.mjs +95 -0
  399. package/scripts/lib/recommendations-v0.mjs +156 -0
  400. package/scripts/lib/reconcile/eligibility.mjs +203 -0
  401. package/scripts/lib/reconcile/emitter.mjs +244 -0
  402. package/scripts/lib/reconcile/engine.mjs +412 -0
  403. package/scripts/lib/reconcile/idempotency.mjs +239 -0
  404. package/scripts/lib/reconcile/renderer.mjs +211 -0
  405. package/scripts/lib/reconcile/writer.mjs +293 -0
  406. package/scripts/lib/reconcile-nudge-banner.mjs +284 -0
  407. package/scripts/lib/resource-probe/evaluate.mjs +190 -0
  408. package/scripts/lib/resource-probe/parsers.mjs +181 -0
  409. package/scripts/lib/resource-probe/probe-platform.mjs +300 -0
  410. package/scripts/lib/resource-probe.mjs +95 -0
  411. package/scripts/lib/rule-loader.mjs +552 -0
  412. package/scripts/lib/rules-sync.mjs +439 -0
  413. package/scripts/lib/scope-gate.mjs +496 -0
  414. package/scripts/lib/session-close-backfill.mjs +539 -0
  415. package/scripts/lib/session-discovery.mjs +256 -0
  416. package/scripts/lib/session-end/phase-skip.mjs +357 -0
  417. package/scripts/lib/session-end/worktree-cleanup.mjs +112 -0
  418. package/scripts/lib/session-id.mjs +362 -0
  419. package/scripts/lib/session-lock.mjs +703 -0
  420. package/scripts/lib/session-registry.mjs +355 -0
  421. package/scripts/lib/session-schema/aliases.mjs +71 -0
  422. package/scripts/lib/session-schema/constants.mjs +115 -0
  423. package/scripts/lib/session-schema/normalizer.mjs +66 -0
  424. package/scripts/lib/session-schema/timestamps.mjs +64 -0
  425. package/scripts/lib/session-schema/validator.mjs +453 -0
  426. package/scripts/lib/session-schema.mjs +71 -0
  427. package/scripts/lib/session-token-rollup.mjs +137 -0
  428. package/scripts/lib/sessions-staleness-banner.mjs +247 -0
  429. package/scripts/lib/skill-evolution/blast-radius-classifier.mjs +114 -0
  430. package/scripts/lib/skill-evolution/candidate-intake.mjs +270 -0
  431. package/scripts/lib/skill-evolution/config-validation-gate.mjs +279 -0
  432. package/scripts/lib/skill-evolution/engine.mjs +719 -0
  433. package/scripts/lib/skill-evolution/idempotency.mjs +279 -0
  434. package/scripts/lib/skill-evolution/mr-opener.mjs +507 -0
  435. package/scripts/lib/skill-health/join.mjs +181 -0
  436. package/scripts/lib/skill-health/score.mjs +123 -0
  437. package/scripts/lib/skill-invocations-schema.mjs +214 -0
  438. package/scripts/lib/skill-judge.mjs +348 -0
  439. package/scripts/lib/skill-judgments-schema.mjs +264 -0
  440. package/scripts/lib/slopcheck.mjs +501 -0
  441. package/scripts/lib/soul-resolve.mjs +118 -0
  442. package/scripts/lib/spiral-carryover.mjs +495 -0
  443. package/scripts/lib/state-md/body-sections.mjs +851 -0
  444. package/scripts/lib/state-md/frontmatter-mutators.mjs +453 -0
  445. package/scripts/lib/state-md/mission-status.mjs +247 -0
  446. package/scripts/lib/state-md/recommendations.mjs +57 -0
  447. package/scripts/lib/state-md/yaml-parser.mjs +234 -0
  448. package/scripts/lib/state-md-peer-guard.mjs +232 -0
  449. package/scripts/lib/state-md.mjs +53 -0
  450. package/scripts/lib/subagents-schema.mjs +309 -0
  451. package/scripts/lib/sunset/walker.mjs +1192 -0
  452. package/scripts/lib/test-runner/artifact-paths.mjs +94 -0
  453. package/scripts/lib/test-runner/fingerprint.mjs +33 -0
  454. package/scripts/lib/test-runner/issue-reconcile.mjs +770 -0
  455. package/scripts/lib/tmux-layout/layouts.mjs +224 -0
  456. package/scripts/lib/tmux-layout/telemetry-stats.mjs +100 -0
  457. package/scripts/lib/tmux-layout/telemetry.mjs +88 -0
  458. package/scripts/lib/tmux-layout/tmux-shell.mjs +82 -0
  459. package/scripts/lib/tmux-layout/vcs-detector.mjs +88 -0
  460. package/scripts/lib/validate/check-agents.mjs +457 -0
  461. package/scripts/lib/validate/check-codex-plugin.mjs +37 -0
  462. package/scripts/lib/validate/check-commands.mjs +148 -0
  463. package/scripts/lib/validate/check-component-paths.mjs +112 -0
  464. package/scripts/lib/validate/check-dead-bridge.mjs +180 -0
  465. package/scripts/lib/validate/check-hooks-symmetry.mjs +258 -0
  466. package/scripts/lib/validate/check-json-files.mjs +116 -0
  467. package/scripts/lib/validate/check-owner-leakage.mjs +1011 -0
  468. package/scripts/lib/validate/check-path-utils-canary.mjs +175 -0
  469. package/scripts/lib/validate/check-peekaboo-driver-canary.mjs +201 -0
  470. package/scripts/lib/validate/check-pi-package.mjs +110 -0
  471. package/scripts/lib/validate/check-pi-prompts.mjs +43 -0
  472. package/scripts/lib/validate/check-playwright-mcp-canary.mjs +154 -0
  473. package/scripts/lib/validate/check-plugin-json.mjs +96 -0
  474. package/scripts/lib/validate/check-plugin-monitors.mjs +206 -0
  475. package/scripts/lib/validate/check-plugin-schema.mjs +137 -0
  476. package/scripts/lib/validate/check-rules.mjs +143 -0
  477. package/scripts/lib/validate/check-session-plan-routing.mjs +154 -0
  478. package/scripts/lib/validate/check-test-fixture-shapes.mjs +280 -0
  479. package/scripts/lib/validate/check-unicode-safety.mjs +533 -0
  480. package/scripts/lib/validate/confidential-names.mjs +169 -0
  481. package/scripts/lib/validate/dead-bridge-corpus.mjs +141 -0
  482. package/scripts/lib/validate/dead-bridge-detectors.mjs +568 -0
  483. package/scripts/lib/validate/tier-inference.mjs +100 -0
  484. package/scripts/lib/validate-vendored-rules.mjs +519 -0
  485. package/scripts/lib/vault-archive.mjs +404 -0
  486. package/scripts/lib/vault-backfill/glab.mjs +164 -0
  487. package/scripts/lib/vault-backfill/manifest.mjs +75 -0
  488. package/scripts/lib/vault-backfill/template.mjs +130 -0
  489. package/scripts/lib/vault-consolidate-fs.mjs +331 -0
  490. package/scripts/lib/vault-migration-rules.mjs +155 -0
  491. package/scripts/lib/vault-mirror/auto-commit.mjs +203 -0
  492. package/scripts/lib/vault-mirror/namespace.mjs +152 -0
  493. package/scripts/lib/vault-mirror/process.mjs +567 -0
  494. package/scripts/lib/vault-mirror/pseudonym-map.mjs +164 -0
  495. package/scripts/lib/vault-mirror/render-learnings.mjs +201 -0
  496. package/scripts/lib/vault-mirror/render-sessions.mjs +367 -0
  497. package/scripts/lib/vault-mirror/render.mjs +8 -0
  498. package/scripts/lib/vault-mirror/utils.mjs +217 -0
  499. package/scripts/lib/vault-relocation-rules.mjs +555 -0
  500. package/scripts/lib/vault-repo-backfill.mjs +235 -0
  501. package/scripts/lib/vault-staleness-banner.mjs +142 -0
  502. package/scripts/lib/vault-status/board-writer.mjs +769 -0
  503. package/scripts/lib/vault-status/narrative-mirror.mjs +544 -0
  504. package/scripts/lib/vault-sync-baseline.mjs +152 -0
  505. package/scripts/lib/wave-context.mjs +29 -0
  506. package/scripts/lib/wave-executor/pool.mjs +248 -0
  507. package/scripts/lib/wave-resource-gate.mjs +204 -0
  508. package/scripts/lib/wave-sizing.mjs +75 -0
  509. package/scripts/lib/webhook-url.mjs +105 -0
  510. package/scripts/lib/workspace.mjs +198 -0
  511. package/scripts/lib/worktree/constants.mjs +35 -0
  512. package/scripts/lib/worktree/index.mjs +17 -0
  513. package/scripts/lib/worktree/lifecycle.mjs +287 -0
  514. package/scripts/lib/worktree/listing.mjs +118 -0
  515. package/scripts/lib/worktree/meta.mjs +64 -0
  516. package/scripts/lib/worktree-freshness.mjs +313 -0
  517. package/scripts/lib/worktree.mjs +15 -0
  518. package/scripts/lifecycle-sim-v6.mjs +347 -0
  519. package/scripts/lock-reaper.mjs +185 -0
  520. package/scripts/mcp-server.sh +241 -0
  521. package/scripts/measure-policy-cache-effectiveness.mjs +427 -0
  522. package/scripts/memory-propose.mjs +464 -0
  523. package/scripts/migrate-cold-start-seed.mjs +404 -0
  524. package/scripts/migrate-learnings-jsonl.mjs +189 -0
  525. package/scripts/migrate-legacy-learnings.sh +61 -0
  526. package/scripts/migrate-sessions-jsonl.mjs +448 -0
  527. package/scripts/migrate-subagents-jsonl.mjs +196 -0
  528. package/scripts/migrate-vault-paths.mjs +796 -0
  529. package/scripts/parse-config.mjs +149 -0
  530. package/scripts/pi-install.mjs +117 -0
  531. package/scripts/print-applicable-rules.mjs +247 -0
  532. package/scripts/promote-vault-strict.mjs +496 -0
  533. package/scripts/relocate-vault-corpus.mjs +1178 -0
  534. package/scripts/run-migrate-v2-cross-repo.mjs +385 -0
  535. package/scripts/run-quality-gate.mjs +216 -0
  536. package/scripts/spikes/h3-agent-teams/preflight.sh +53 -0
  537. package/scripts/spikes/h3-agent-teams/run-h3.sh +112 -0
  538. package/scripts/spikes/h3-agent-teams/setup.sh +137 -0
  539. package/scripts/spikes/h3-agent-teams/toggle.sh +38 -0
  540. package/scripts/sweep-expired-learnings.mjs +135 -0
  541. package/scripts/sync-vault-schema.mjs +376 -0
  542. package/scripts/tests/fixtures/fetch-baseline/sample-rule.md +8 -0
  543. package/scripts/tmux-layout.mjs +245 -0
  544. package/scripts/token-audit.sh +191 -0
  545. package/scripts/typecheck.mjs +42 -0
  546. package/scripts/upload-social-preview.mjs +316 -0
  547. package/scripts/validate-config.mjs +46 -0
  548. package/scripts/validate-plugin-manifests.mjs +163 -0
  549. package/scripts/validate-plugin.mjs +264 -0
  550. package/scripts/validate-wave-scope.mjs +289 -0
  551. package/scripts/vault-backfill.mjs +404 -0
  552. package/scripts/vault-consolidate.mjs +596 -0
  553. package/scripts/vault-integration-watcher.mjs +394 -0
  554. package/scripts/vault-mirror.mjs +430 -0
  555. package/skills/_shared/bootstrap-gate.md +111 -0
  556. package/skills/_shared/config-reading.md +226 -0
  557. package/skills/_shared/instruction-file-resolution.md +79 -0
  558. package/skills/_shared/model-selection.md +64 -0
  559. package/skills/_shared/monitor-patterns.md +300 -0
  560. package/skills/_shared/parallel-aware-auq.md +121 -0
  561. package/skills/_shared/parallel-aware-preamble.md +185 -0
  562. package/skills/_shared/platform-tools.md +96 -0
  563. package/skills/_shared/state-ownership.md +221 -0
  564. package/skills/architecture/DEEPENING.md +37 -0
  565. package/skills/architecture/INTERFACE-DESIGN.md +44 -0
  566. package/skills/architecture/LANGUAGE.md +53 -0
  567. package/skills/architecture/SKILL.md +92 -0
  568. package/skills/autopilot/SKILL.md +419 -0
  569. package/skills/bootstrap/SKILL.md +592 -0
  570. package/skills/bootstrap/STATE.md.template +24 -0
  571. package/skills/bootstrap/_shared-template.md +243 -0
  572. package/skills/bootstrap/deep-template.md +659 -0
  573. package/skills/bootstrap/fast-template.md +251 -0
  574. package/skills/bootstrap/intensity-heuristic.md +80 -0
  575. package/skills/bootstrap/public-fallback.md +342 -0
  576. package/skills/bootstrap/standard-template.md +736 -0
  577. package/skills/bootstrap/templates/agents/project-code-review.md +18 -0
  578. package/skills/bootstrap/templates/agents/project-discovery.md +18 -0
  579. package/skills/bootstrap/templates/agents/project-quality-gate.md +18 -0
  580. package/skills/brainstorm/SKILL.md +268 -0
  581. package/skills/brainstorm/soul.md +49 -0
  582. package/skills/claude-md-drift-check/SKILL.md +186 -0
  583. package/skills/claude-md-drift-check/checker.mjs +1380 -0
  584. package/skills/claude-md-drift-check/checker.sh +37 -0
  585. package/skills/claude-md-drift-check/package.json +16 -0
  586. package/skills/convergence-monitoring/README.md +39 -0
  587. package/skills/convergence-monitoring/SIGNALS.md +246 -0
  588. package/skills/convergence-monitoring/SKILL.md +285 -0
  589. package/skills/daily/SKILL.md +222 -0
  590. package/skills/daily/generate.sh +92 -0
  591. package/skills/daily/templates/daily.md.tpl +36 -0
  592. package/skills/debug/SKILL.md +188 -0
  593. package/skills/debug/soul.md +35 -0
  594. package/skills/discovery/SKILL.md +567 -0
  595. package/skills/discovery/issue-templates.md +237 -0
  596. package/skills/discovery/probes/docs-staleness.mjs +195 -0
  597. package/skills/discovery/probes/frontend-slop.mjs +186 -0
  598. package/skills/discovery/probes/ssot-code-diff.mjs +310 -0
  599. package/skills/discovery/probes/supply-chain-slopcheck.mjs +440 -0
  600. package/skills/discovery/probes/vault-narrative-staleness.mjs +355 -0
  601. package/skills/discovery/probes/vault-staleness.mjs +272 -0
  602. package/skills/discovery/probes-arch.md +252 -0
  603. package/skills/discovery/probes-audit.md +95 -0
  604. package/skills/discovery/probes-code.md +329 -0
  605. package/skills/discovery/probes-docs.md +76 -0
  606. package/skills/discovery/probes-feature.md +150 -0
  607. package/skills/discovery/probes-infra.md +138 -0
  608. package/skills/discovery/probes-intro.md +25 -0
  609. package/skills/discovery/probes-session.md +495 -0
  610. package/skills/discovery/probes-supply-chain.md +94 -0
  611. package/skills/discovery/probes-ui.md +147 -0
  612. package/skills/discovery/probes-vault.md +64 -0
  613. package/skills/discovery/slop-patterns.md +115 -0
  614. package/skills/dispatcher/SKILL.md +173 -0
  615. package/skills/docs-orchestrator/SKILL.md +362 -0
  616. package/skills/docs-orchestrator/audience-mapping.md +140 -0
  617. package/skills/domain-model/ADR-FORMAT.md +47 -0
  618. package/skills/domain-model/CONTEXT-FORMAT.md +77 -0
  619. package/skills/domain-model/SKILL.md +85 -0
  620. package/skills/ecosystem-health/SKILL.md +119 -0
  621. package/skills/ecosystem-health/wizard.md +193 -0
  622. package/skills/eval/SKILL.md +293 -0
  623. package/skills/eval/rubric-v1.md +218 -0
  624. package/skills/evolve/SKILL.md +546 -0
  625. package/skills/frontmatter-guard/SKILL.md +126 -0
  626. package/skills/gitlab-ops/SKILL.md +368 -0
  627. package/skills/gitlab-portfolio/SKILL.md +196 -0
  628. package/skills/grill/SKILL.md +185 -0
  629. package/skills/grill/soul.md +55 -0
  630. package/skills/hook-development/SKILL.md +413 -0
  631. package/skills/mcp-builder/SKILL.md +260 -0
  632. package/skills/memory-cleanup/SKILL.md +310 -0
  633. package/skills/mode-selector/SKILL.md +226 -0
  634. package/skills/peekaboo-driver/SKILL.md +237 -0
  635. package/skills/peekaboo-driver/soul.md +32 -0
  636. package/skills/persona-panel/SKILL.md +365 -0
  637. package/skills/persona-panel/persona-format.md +205 -0
  638. package/skills/persona-panel/presets/designer-lens.md +87 -0
  639. package/skills/persona-panel/presets/engineer-lens.md +88 -0
  640. package/skills/persona-panel/presets/pm-lens.md +86 -0
  641. package/skills/plan/SKILL.md +496 -0
  642. package/skills/plan/mode-feature.md +141 -0
  643. package/skills/plan/mode-new.md +297 -0
  644. package/skills/plan/mode-retro.md +271 -0
  645. package/skills/plan/prd-feature-template.md +132 -0
  646. package/skills/plan/prd-full-template.md +151 -0
  647. package/skills/plan/prd-reviewer-prompt.md +103 -0
  648. package/skills/plan/retro-template.md +75 -0
  649. package/skills/plan/soul.md +62 -0
  650. package/skills/playwright-driver/SKILL.md +226 -0
  651. package/skills/playwright-driver/soul.md +30 -0
  652. package/skills/quality-gates/SKILL.md +212 -0
  653. package/skills/reconcile/SKILL.md +324 -0
  654. package/skills/repo-audit/SKILL.md +272 -0
  655. package/skills/session-end/SKILL.md +1044 -0
  656. package/skills/session-end/discovery-scan.md +37 -0
  657. package/skills/session-end/drift-operations.md +97 -0
  658. package/skills/session-end/learning-patterns.md +78 -0
  659. package/skills/session-end/metrics-collection.md +175 -0
  660. package/skills/session-end/phase-3-2-docs-verification.md +148 -0
  661. package/skills/session-end/phase-3-6-tail.md +344 -0
  662. package/skills/session-end/phase-3-7a-recommendations.md +86 -0
  663. package/skills/session-end/plan-verification.md +288 -0
  664. package/skills/session-end/session-metrics-write.md +223 -0
  665. package/skills/session-end/vault-operations.md +50 -0
  666. package/skills/session-end/verification-checklist.md +20 -0
  667. package/skills/session-plan/SKILL.md +554 -0
  668. package/skills/session-plan/wave-template.md +37 -0
  669. package/skills/session-start/SKILL.md +1043 -0
  670. package/skills/session-start/phase-2-5-docs-planning.md +119 -0
  671. package/skills/session-start/phase-4-5-resource-health.md +49 -0
  672. package/skills/session-start/phase-7-1-premise-check.md +47 -0
  673. package/skills/session-start/phase-7-5-mode-selector.md +237 -0
  674. package/skills/session-start/phase-8-5-express-path.md +61 -0
  675. package/skills/session-start/presentation-format.md +81 -0
  676. package/skills/session-start/soul.md +57 -0
  677. package/skills/skill-creator/SKILL.md +168 -0
  678. package/skills/spinout/SKILL.md +76 -0
  679. package/skills/sunset-review/SKILL.md +96 -0
  680. package/skills/test-runner/SKILL.md +362 -0
  681. package/skills/test-runner/rubric-v1.md +388 -0
  682. package/skills/test-runner/soul.md +46 -0
  683. package/skills/tmux-layout/SKILL.md +104 -0
  684. package/skills/ubiquitous-language/SKILL.md +97 -0
  685. package/skills/using-orchestrator/SKILL.md +144 -0
  686. package/skills/vault-mirror/SKILL.md +234 -0
  687. package/skills/vault-sync/SKILL.md +319 -0
  688. package/skills/vault-sync/package-lock.json +40 -0
  689. package/skills/vault-sync/package.json +11 -0
  690. package/skills/vault-sync/tests/fixtures/archive-test-vault/90-archive/bad-archived.md +8 -0
  691. package/skills/vault-sync/tests/fixtures/archive-test-vault/_meta/.gitkeep +0 -0
  692. package/skills/vault-sync/tests/fixtures/archive-test-vault/live-note.md +8 -0
  693. package/skills/vault-sync/tests/fixtures/broken-frontmatter-vault/_meta/.gitkeep +0 -0
  694. package/skills/vault-sync/tests/fixtures/broken-frontmatter-vault/bad-type.md +8 -0
  695. package/skills/vault-sync/tests/fixtures/broken-frontmatter-vault/good-note.md +8 -0
  696. package/skills/vault-sync/tests/fixtures/clean-vault/.obsidian/config.md +8 -0
  697. package/skills/vault-sync/tests/fixtures/clean-vault/01-projects/foo/projects-baseline.md +10 -0
  698. package/skills/vault-sync/tests/fixtures/clean-vault/03-daily/daily-2026-04-13.md +8 -0
  699. package/skills/vault-sync/tests/fixtures/clean-vault/README.md +3 -0
  700. package/skills/vault-sync/tests/fixtures/clean-vault/hello-world.md +11 -0
  701. package/skills/vault-sync/tests/fixtures/dangling-link-vault/_meta/.gitkeep +0 -0
  702. package/skills/vault-sync/tests/fixtures/dangling-link-vault/has-dangling.md +9 -0
  703. package/skills/vault-sync/tests/fixtures/dangling-link-vault/real-target.md +8 -0
  704. package/skills/vault-sync/tests/fixtures/empty-vault/_meta/.gitkeep +0 -0
  705. package/skills/vault-sync/tests/fixtures/missing-field-vault/_meta/.gitkeep +0 -0
  706. package/skills/vault-sync/tests/fixtures/missing-field-vault/missing-id.md +7 -0
  707. package/skills/vault-sync/tests/fixtures/nested-tag-vault/03-daily/daily-2026-04-13.md +9 -0
  708. package/skills/vault-sync/tests/fixtures/nested-tag-vault/_meta/.gitkeep +0 -0
  709. package/skills/vault-sync/tests/fixtures/nested-tag-vault/nested-tags-note.md +11 -0
  710. package/skills/vault-sync/tests/fixtures/no-frontmatter-vault/README.md +3 -0
  711. package/skills/vault-sync/tests/fixtures/no-frontmatter-vault/_MOC.md +3 -0
  712. package/skills/vault-sync/tests/fixtures/no-frontmatter-vault/_meta/.gitkeep +0 -0
  713. package/skills/vault-sync/tests/fixtures/with-moc-vault/_MOC.md +11 -0
  714. package/skills/vault-sync/tests/fixtures/with-moc-vault/_meta/.gitkeep +0 -0
  715. package/skills/vault-sync/tests/fixtures/with-moc-vault/hello-world.md +11 -0
  716. package/skills/vault-sync/tests/schema-drift.test.mjs +133 -0
  717. package/skills/vault-sync/validator.mjs +658 -0
  718. package/skills/vault-sync/validator.sh +55 -0
  719. package/skills/wave-executor/SKILL.md +496 -0
  720. package/skills/wave-executor/circuit-breaker.md +169 -0
  721. package/skills/wave-executor/wave-loop.md +1043 -0
  722. package/skills/write-executable-plan/SKILL.md +237 -0
  723. package/skills/write-executable-plan/plan-template.md +154 -0
  724. package/templates/_minimal/CLAUDE.md.tmpl +41 -0
  725. package/templates/_minimal/README.md.tmpl +15 -0
  726. package/templates/_minimal/gitignore.tmpl +47 -0
  727. package/templates/_shared/harte-regeln.md +16 -0
  728. package/templates/_shared/loop.md +90 -0
  729. package/templates/_shared/rules/parallel-sessions.md +77 -0
  730. package/templates/nextjs-minimal/README.md +30 -0
  731. package/templates/nextjs-minimal/app/layout.tsx +18 -0
  732. package/templates/nextjs-minimal/app/page.tsx +7 -0
  733. package/templates/nextjs-minimal/eslint.config.mjs +16 -0
  734. package/templates/nextjs-minimal/next.config.mjs +4 -0
  735. package/templates/nextjs-minimal/package.json +27 -0
  736. package/templates/nextjs-minimal/tsconfig.json +23 -0
  737. package/templates/node-minimal/README.md +33 -0
  738. package/templates/node-minimal/eslint.config.mjs +10 -0
  739. package/templates/node-minimal/package.json +21 -0
  740. package/templates/node-minimal/src/index.ts +1 -0
  741. package/templates/node-minimal/tests/sanity.test.ts +5 -0
  742. package/templates/node-minimal/tsconfig.json +17 -0
  743. package/templates/personas/README.md +150 -0
  744. package/templates/personas/accounting-compliance.v1.md +120 -0
  745. package/templates/personas/accounting-tax-advisor.v1.md +116 -0
  746. package/templates/personas/buyer-p1-cto.v1.md +125 -0
  747. package/templates/personas/buyer-p2-kanzlei.v1.md +134 -0
  748. package/templates/personas/buyer-p3-build.v1.md +130 -0
  749. package/templates/personas/buyer-p4-tech-veto.v1.md +130 -0
  750. package/templates/personas/buyer-p5-solo.v1.md +132 -0
  751. package/templates/personas/buyer-p6-ld.v1.md +130 -0
  752. package/templates/personas/klima-ai-expert.v1.md +114 -0
  753. package/templates/personas/klima-physicist.v1.md +117 -0
  754. package/templates/python-uv/README.md +28 -0
  755. package/templates/python-uv/pyproject.toml +32 -0
  756. package/templates/python-uv/src/__PROJECT_NAME__/__init__.py +0 -0
  757. package/templates/python-uv/src/__PROJECT_NAME__/main.py +6 -0
  758. package/templates/python-uv/tests/test_sanity.py +2 -0
  759. package/templates/static-html/README.md +19 -0
  760. package/templates/static-html/index.html +15 -0
  761. package/templates/static-html/script.js +1 -0
  762. package/templates/static-html/styles.css +26 -0
@@ -0,0 +1,388 @@
1
+ # UX Rubric v1
2
+
3
+ > Readable specification of the 4 UX checks applied by the `ux-evaluator` agent.
4
+ > Stable spec — v2 will live as a sibling `rubric-v2.md` in this same directory.
5
+ > The `findings.jsonl` metadata record carries `rubric_version: "v1"` so consumers
6
+ > can distinguish evaluations run against different rubric revisions.
7
+
8
+ ---
9
+
10
+ ## Findings JSON schema (per finding)
11
+
12
+ Each finding in `findings.jsonl` is a JSON object on its own line (NDJSON). The
13
+ first line of the file is a metadata record (`"_meta": true`). All subsequent
14
+ lines conform to this schema:
15
+
16
+ ```json
17
+ {
18
+ "run_id": "<string — test-runner run identifier, e.g. '12345-1715688000123'>",
19
+ "rubric_version": "v1",
20
+ "severity": "<'critical' | 'high' | 'medium' | 'low'>",
21
+ "check": "<'onboarding-step-count' | 'axe-violations' | 'console-errors' | 'liquid-glass-conformance'>",
22
+ "fingerprint": "<16-hex-char string — see Fingerprint formula below>",
23
+ "evidence_path": "<relative path from run-dir root to the supporting artifact>",
24
+ "suggested_priority": "<'critical' | 'high' | 'medium' | 'low' — same as severity for v1>",
25
+ "scope": "<short label: 'onboarding' | 'a11y' | 'console' | 'liquid-glass'>",
26
+ "checkId": "<check identifier used as fingerprint input — see per-check section>",
27
+ "locator": "<DOM selector, AX path, entry URL, or screen.frame identifier>",
28
+ "title": "<one-sentence summary of the violation>",
29
+ "description": "<2–4 sentence explanation including evidence reference and rubric citation>",
30
+ "recommendation": "<actionable next step specific enough to act on without re-reading the finding>"
31
+ }
32
+ ```
33
+
34
+ **Invariants:**
35
+ - `fingerprint` is unique within a single run (collisions are logged, only first occurrence emitted).
36
+ - `evidence_path` must point to an artifact that exists in the run directory at evaluation time.
37
+ - `severity` and `suggested_priority` are lowercase in the JSON record (uppercase only in human-readable stdout tables).
38
+ - No field may be `null` or absent. Use `""` for fields where the value is genuinely unavailable, and explain in `description`.
39
+
40
+ **Metadata record (first line of `findings.jsonl`):**
41
+
42
+ ```json
43
+ {
44
+ "_meta": true,
45
+ "rubric_version": "v1",
46
+ "run_id": "<run-id>",
47
+ "evaluated_at": "<ISO-8601-UTC timestamp>",
48
+ "checks_applied": 4,
49
+ "findings_count": <integer>,
50
+ "collisions": <integer — normally 0>
51
+ }
52
+ ```
53
+
54
+ ---
55
+
56
+ ## Fingerprint formula
57
+
58
+ ```javascript
59
+ fingerprint = sha256(`${scope}\n${checkId}\n${locator}`).slice(0, 16)
60
+ ```
61
+
62
+ **Inputs** (joined with `\n` newline separator):
63
+
64
+ | Input | Description |
65
+ |---|---|
66
+ | `scope` | Short namespace label — `'onboarding'`, `'a11y'`, `'console'`, `'liquid-glass'` |
67
+ | `checkId` | Check-specific identifier — see each check section for the exact value |
68
+ | `locator` | Stable DOM selector, AX path, entry URL, or screen.frame string |
69
+
70
+ **Design rationale for `\n` separator:** Newlines are forbidden in shell argument
71
+ boundaries by the `ARG_BOUNDARY_DANGEROUS` pattern (`/[\n\r\0]/`) established in
72
+ `scripts/lib/autopilot/mr-draft.mjs`. Using `\n` as the separator means it can never
73
+ appear within a locator string that passed validation, so the concatenated input is
74
+ collision-free by construction.
75
+
76
+ **Implementation:** `scripts/lib/test-runner/fingerprint.mjs` exports
77
+ `fingerprintFinding({scope, checkId, locator})`. The function uses Node.js
78
+ `crypto.createHash('sha256')` (no external dependencies) and returns the first 16
79
+ hex characters of the digest (64 bits of collision resistance — sufficient for the
80
+ expected finding volume of < 10 000 per run).
81
+
82
+ **Truncation rule for long locators:** Locators longer than 256 characters are
83
+ truncated to their first 256 characters before fingerprinting. This is consistent
84
+ with the `ux-evaluator` agent's description field convention. Both the evaluator
85
+ and the fingerprint module must apply truncation to guarantee matching fingerprints.
86
+
87
+ **Stability guarantee:** Given identical `(scope, checkId, locator)` inputs, the
88
+ fingerprint is identical across any two evaluation runs, regardless of timestamp,
89
+ run-id, or system state. Never include runtime-varying values in fingerprint inputs.
90
+
91
+ ---
92
+
93
+ ## Check 1: onboarding-step-count
94
+
95
+ **Purpose:** Count distinct onboarding or wizard steps reachable from the flow's
96
+ entry point. Flag when the step count exceeds 7.
97
+
98
+ **Why 7:** The "7 ± 2" rule (Miller, 1956) characterises the capacity of short-term
99
+ working memory. Onboarding flows that require users to hold more than 7 steps in
100
+ mind reliably correlate with drop-off. A typical mobile app's V3.3 release shipped a
101
+ 10-step onboarding flow with no E2E coverage; user-completion rate dropped significantly.
102
+ This rubric was inspired by that incident and is cited in project PRDs as the canonical
103
+ example for onboarding quality gates.
104
+
105
+ **Severity mapping:**
106
+
107
+ | Step count | Severity |
108
+ |---|---|
109
+ | ≤ 7 | No finding |
110
+ | 8–9 | HIGH |
111
+ | ≥ 10 | CRITICAL |
112
+
113
+ **What counts as a step:** A distinct page, screen, or wizard panel the user must
114
+ navigate through sequentially to complete onboarding. A "confirm" dialog on top of
115
+ a step does not count as a separate step. A branch path (e.g., "optional profile
116
+ setup") counts only if the user cannot skip it.
117
+
118
+ **Evidence required:**
119
+ - AX-tree snapshot with each step's primary heading text and a screenshot per step
120
+ (both written by test fixtures in the target repo to `<run-dir>/ax-snapshots/` and
121
+ `<run-dir>/screenshots/` — runner.mjs pre-creates these directories but does not
122
+ emit the content).
123
+ - The test fixtures must have navigated through the full onboarding sequence and
124
+ captured an AX snapshot at each step transition. If the fixtures did not cover the
125
+ full flow, the evaluator logs a warning and emits no finding (evidence requirement
126
+ is not met).
127
+
128
+ **Fingerprint inputs:**
129
+ - `scope = 'onboarding'`
130
+ - `checkId = 'step-count-over-7'`
131
+ - `locator = <entry-route-URL-for-web | entry-screen-name-for-macOS>`
132
+
133
+ **Example finding (HIGH):**
134
+
135
+ ```json
136
+ {
137
+ "run_id": "42-1715700000000",
138
+ "rubric_version": "v1",
139
+ "severity": "high",
140
+ "check": "onboarding-step-count",
141
+ "fingerprint": "a3f1c8e72d904b1a",
142
+ "evidence_path": "screenshots/onboarding-step-8.png",
143
+ "suggested_priority": "high",
144
+ "scope": "onboarding",
145
+ "checkId": "step-count-over-7",
146
+ "locator": "/onboarding/start",
147
+ "title": "Onboarding flow has 9 steps (limit: 7)",
148
+ "description": "The onboarding sequence starting at /onboarding/start requires the user to complete 9 distinct steps before reaching the dashboard. Steps 8 and 9 are a 'verify email' confirmation screen and a 'set notification preferences' screen. The 7-step limit is defined in rubric-v1 Check 1 based on Miller's short-term memory model.",
149
+ "recommendation": "Merge 'verify email' into the account-creation step (step 2) or defer 'notification preferences' to a post-onboarding nudge. Target ≤7 steps in the critical path."
150
+ }
151
+ ```
152
+
153
+ ---
154
+
155
+ ## Check 2: axe-violations (critical + serious)
156
+
157
+ **Purpose:** Read axe-core JSON output captured by the Playwright driver and flag
158
+ every accessibility violation tagged `critical` or `serious` by axe-core's impact
159
+ rating. Lower severity levels (`moderate`, `minor`) are out of scope for v1 — they
160
+ belong in a separate `/discovery` pass or a future `rubric-v2.md` extension.
161
+
162
+ **Why axe critical/serious only:** WCAG AA conformance requires that critical and
163
+ serious violations be eliminated before launch. Moderate and minor violations are
164
+ important but rarely block release; including them in v1 would produce too much noise
165
+ for the reconcile pipeline's per-finding issue creation to handle economically.
166
+
167
+ **Severity mapping:**
168
+
169
+ | axe-core impact | Finding severity |
170
+ |---|---|
171
+ | `'critical'` | CRITICAL |
172
+ | `'serious'` | HIGH |
173
+ | `'moderate'` | (not a finding in v1) |
174
+ | `'minor'` | (not a finding in v1) |
175
+
176
+ **Artifact location:** `<run-dir>/ax-snapshots/axe-*.json`
177
+ (written by test fixture using `@axe-core/playwright`; runner.mjs pre-creates the
178
+ `ax-snapshots/` directory but does NOT write these files — axe-core SOFT-SKIPs
179
+ if `@axe-core/playwright` is absent from the target repo)
180
+
181
+ Each file is a JSON array of axe-core `Result` objects. The evaluator iterates every
182
+ result entry in every snapshot file and emits one finding per unique
183
+ `(ruleId, nodes[0].target)` pair that is `critical` or `serious`.
184
+
185
+ **Evidence required:**
186
+ - The verbatim axe-core `Result` object embedded in the finding's `description` field
187
+ (JSON-stringified, or as a structured sub-object if the reconcile pipeline supports it).
188
+ - The screenshot file from the same route, if present (referenced in `evidence_path`).
189
+
190
+ **Fingerprint inputs:**
191
+ - `scope = 'a11y'`
192
+ - `checkId = 'axe-' + ruleId` (e.g., `'axe-color-contrast'`, `'axe-image-alt'`)
193
+ - `locator = nodes[0].target` — the CSS selector array joined with ` > ` if it is
194
+ a nested selector, or the first string element if it is already a string
195
+
196
+ **Example finding (CRITICAL):**
197
+
198
+ ```json
199
+ {
200
+ "run_id": "42-1715700000000",
201
+ "rubric_version": "v1",
202
+ "severity": "critical",
203
+ "check": "axe-violations",
204
+ "fingerprint": "b9d2041ef3a77c50",
205
+ "evidence_path": "ax-snapshots/axe-dashboard-2025-05-14T14-00-00.json",
206
+ "suggested_priority": "critical",
207
+ "scope": "a11y",
208
+ "checkId": "axe-button-name",
209
+ "locator": "#submit-btn",
210
+ "title": "axe-core critical: button-name — submit button has no accessible name",
211
+ "description": "axe-core reports a critical violation of the 'button-name' rule on selector '#submit-btn' (dashboard route, snapshot axe-dashboard-2025-05-14T14-00-00.json). The button has no visible text, aria-label, or aria-labelledby. This violates WCAG 2.1 Success Criterion 4.1.2 (Name, Role, Value). Users relying on screen readers cannot identify or activate this control.",
212
+ "recommendation": "Add aria-label='Submit' or visible button text to the '#submit-btn' element. Verify with a screen reader (VoiceOver or NVDA) after fix."
213
+ }
214
+ ```
215
+
216
+ ---
217
+
218
+ ## Check 3: console-errors
219
+
220
+ **Purpose:** Read the browser or application console output captured by the driver
221
+ and flag error-level messages that are visible to end users — uncaught exceptions,
222
+ unhandled promise rejections, and network errors surfaced in the UI.
223
+
224
+ **Why console errors matter:** TypeScript compile checks and lint catch static
225
+ errors; axe-core catches accessibility violations; but runtime errors only surface
226
+ during actual execution. A JavaScript exception that crashes a component or a 404
227
+ that silently removes a UI section degrades user trust and is the class of bug most
228
+ likely to slip through until a real user reports it.
229
+
230
+ **What is an error-level message (flag these):**
231
+ - Lines prefixed with `ERROR`, `UNCAUGHT`, `Unhandled`, `TypeError`, `ReferenceError`
232
+ - HTTP 4xx or 5xx responses logged to the console (e.g., `Failed to load resource: the server responded with a status of 404`)
233
+ - Unhandled Promise rejections (text contains `UnhandledPromiseRejection` or `UnhandledRejection`)
234
+
235
+ **What is developer-tooling noise (do NOT flag):**
236
+ - React or Vue hydration mismatch hints (often informational in dev mode)
237
+ - Hot Module Replacement (HMR) status messages
238
+ - Browser extension warnings (`[extension]`, `chrome-extension://`)
239
+ - `[Violation]` warnings from Chrome about long tasks (performance, not UX-blocking)
240
+ - Source map warnings
241
+
242
+ **Severity mapping:**
243
+
244
+ | Error class | Severity |
245
+ |---|---|
246
+ | Uncaught exception / unhandled rejection | HIGH |
247
+ | Visible HTTP 4xx/5xx (resource load failure in UI) | MEDIUM |
248
+
249
+ **Artifact location:** `<run-dir>/console.log` — runner.mjs appends raw Playwright
250
+ process stdout/stderr to this file; structured NDJSON `{ts, type, text, location}`
251
+ entries are fixture-emitted via `page.on('console', ...)` and are what the evaluator
252
+ parses. Each line has the shape:
253
+ `{"ts":<epoch-ms>,"type":"error"|"warning"|...,"text":"<message>","location":{...}}`.
254
+ The evaluator parses each line as JSON and inspects the `type` and `text` fields.
255
+ If the file is absent, skip check 3.
256
+
257
+ **Fingerprint inputs:**
258
+ - `scope = 'console'`
259
+ - `checkId = 'error-' + msgClass` where `msgClass` is the normalized error class:
260
+ - `'uncaught-exception'` for TypeError/ReferenceError/UnhandledRejection
261
+ - `'http-4xx'` or `'http-5xx'` for network errors
262
+ - `locator = <origin-URL-if-present | file:line-if-stack-frame-available | 'unknown'>`
263
+
264
+ **Example finding (HIGH):**
265
+
266
+ ```json
267
+ {
268
+ "run_id": "42-1715700000000",
269
+ "rubric_version": "v1",
270
+ "severity": "high",
271
+ "check": "console-errors",
272
+ "fingerprint": "c7a140b8fe291d63",
273
+ "evidence_path": "console.log",
274
+ "suggested_priority": "high",
275
+ "scope": "console",
276
+ "checkId": "error-uncaught-exception",
277
+ "locator": "src/components/InvoiceTable.tsx:87",
278
+ "title": "Uncaught TypeError: Cannot read property 'id' of undefined",
279
+ "description": "The browser console captured an uncaught TypeError at InvoiceTable.tsx:87 during the dashboard flow. The error fires when the invoices array contains a null entry, causing the component to crash. This is a runtime error that is not caught by any existing test and is directly visible to the user via a blank component area.",
280
+ "recommendation": "Add a null guard before accessing .id in the map callback at InvoiceTable.tsx:87. Also add a test case that renders InvoiceTable with a null entry in the invoices prop."
281
+ }
282
+ ```
283
+
284
+ ---
285
+
286
+ ## Check 4: liquid-glass-conformance
287
+
288
+ **Purpose:** For SwiftUI targets where `Package.swift` declares iOS 26+ or macOS
289
+ Tahoe (26+), verify that UI surfaces using translucent or blurred backgrounds apply
290
+ Apple's Liquid Glass API (`.glassEffect()`) rather than legacy `.background(.thinMaterial)`
291
+ or custom `.blur(radius:)` modifiers.
292
+
293
+ **Why Liquid Glass:** Apple Liquid Glass was introduced at WWDC 2025 and is the
294
+ canonical platform baseline for translucent surfaces in SwiftUI 26+. Apps that
295
+ continue using legacy material modifiers on iOS 26+ / macOS Tahoe risk visual
296
+ inconsistency with system UI, rejection in App Store review for "non-standard
297
+ appearance", and future deprecation of the legacy API. PRD §1.2 names this check
298
+ as the secondary motivation for the UX rubric alongside accessibility compliance.
299
+
300
+ **Applicability condition:** This check is only executed when both conditions hold:
301
+ 1. `Package.swift` exists in the repository root (or nearest ancestor).
302
+ 2. `Package.swift` declares `.iOS("26")` or higher, OR `.macOS("26")` or higher,
303
+ in its `platforms: [...]` array.
304
+
305
+ If neither condition is met, skip check 4 and note the skip in the stdout summary.
306
+ This is the expected behavior for pure web projects and Swift projects targeting
307
+ earlier OS versions.
308
+
309
+ **What to flag:** Screens or frames where the AX-tree dump or screenshot metadata
310
+ indicates a translucent/blurred background that uses:
311
+ - `.background(.thinMaterial)` or `.background(.ultraThinMaterial)` etc.
312
+ - `.background(Material.*)` (any Material enum case)
313
+ - A `.blur(radius:)` modifier applied to a container as a background effect
314
+
315
+ **What is compliant (do NOT flag):**
316
+ - `.glassEffect()` — correct Liquid Glass API
317
+ - `.glassEffect(.regular)` / `.glassEffect(.prominent)` — parametrised Liquid Glass
318
+ - Solid color backgrounds (no blur) — these are not Liquid Glass candidates
319
+ - Explicitly documented exceptions in `docs/apple-hig-exceptions.md`
320
+
321
+ **Severity mapping:**
322
+
323
+ | Condition | Severity |
324
+ |---|---|
325
+ | Non-compliant surface, no documented exception | MEDIUM |
326
+ | Non-compliant surface, documented exception in `docs/apple-hig-exceptions.md` | LOW |
327
+
328
+ **Evidence required:**
329
+ - Peekaboo screenshot of the non-compliant surface (referenced in `evidence_path`).
330
+ - The AX-path or frame identifier (referenced in `locator`).
331
+
332
+ > **Note (v1):** peekaboo-driver may emit `ax-snapshots/glass-modifiers-*.json` artifacts carrying `schema_version: v1, status: stub` for forward compatibility. The v1 rubric does NOT read these — Check 4 operates from screenshots + AX dump annotations only. Future ux-evaluator versions may consume the JSON to classify frames directly.
333
+
334
+ **Fingerprint inputs:**
335
+ - `scope = 'liquid-glass'`
336
+ - `checkId = 'missing-glassEffect'`
337
+ - `locator = <screen-name>.<frame-id>` (e.g., `'DashboardScreen.headerBlurFrame'`)
338
+
339
+ **Example finding (MEDIUM):**
340
+
341
+ ```json
342
+ {
343
+ "run_id": "42-1715700000000",
344
+ "rubric_version": "v1",
345
+ "severity": "medium",
346
+ "check": "liquid-glass-conformance",
347
+ "fingerprint": "d4e9f2a63c518b07",
348
+ "evidence_path": "screenshots/DashboardScreen-headerBlurFrame.png",
349
+ "suggested_priority": "medium",
350
+ "scope": "liquid-glass",
351
+ "checkId": "missing-glassEffect",
352
+ "locator": "DashboardScreen.headerBlurFrame",
353
+ "title": "Legacy .background(.thinMaterial) on DashboardScreen header — should use .glassEffect()",
354
+ "description": "The DashboardScreen header frame (DashboardScreen.headerBlurFrame) uses .background(.thinMaterial) for its translucent background. The project targets macOS 26+, where .glassEffect() is the canonical Liquid Glass API (WWDC25). Using the legacy Material modifier produces a subtly different visual output and may trigger App Store review flags on macOS Tahoe.",
355
+ "recommendation": "Replace .background(.thinMaterial) with .glassEffect() on the header container in DashboardScreen.swift. If the legacy appearance is intentional for this surface, document the exception in docs/apple-hig-exceptions.md to suppress this finding."
356
+ }
357
+ ```
358
+
359
+ ---
360
+
361
+ ## Out-of-scope (v1)
362
+
363
+ The following concern areas are deliberately excluded from v1. They may be addressed
364
+ in a future `rubric-v2.md` or a separate evaluation skill.
365
+
366
+ - **Visual-diff / pixel regression.** Pixel-level before/after comparison requires
367
+ a baseline screenshot corpus and a diff algorithm. This is a separate driver
368
+ capability not yet available in test-runner v1.
369
+
370
+ - **Performance metrics (LCP, FCP, CLS, INP).** Core Web Vitals and layout shift
371
+ metrics require instrumentation beyond the Playwright AX + screenshot capture
372
+ available in test-runner v1. These belong in a dedicated performance rubric.
373
+
374
+ - **Cross-platform Windows / Linux targets.** The liquid-glass check is macOS/iOS
375
+ specific. Windows and Linux desktop targets are out of scope for all 4 checks
376
+ in v1. Web targets are in scope for checks 1, 2, and 3.
377
+
378
+ - **Mobile (iOS / Android) native targets.** Playwright does not cover native mobile;
379
+ XCUITest or Appium integration is deferred to a future driver.
380
+
381
+ - **Stagehand v3 / Browserbase cloud probes.** Cloud-based headless browser pools
382
+ introduce network latency and session management complexity. v1 is scoped to
383
+ local Playwright runs only.
384
+
385
+ - **Automated recommendation generation via LLM.** The `recommendation` field is
386
+ written by the `ux-evaluator` agent (an LLM). LLM-generated recommendations are
387
+ advisory — they are not automatically filed as code changes. A human or a
388
+ `code-implementer` agent must review and apply them.
@@ -0,0 +1,46 @@
1
+ # Test Runner — Soul
2
+
3
+ ## Identity
4
+
5
+ You are the test-runner — an agentic end-to-end test orchestrator. You wire drivers, dispatch the evaluator, reconcile findings, and write the roll-up. You do NOT execute tests yourself. You do NOT judge UX quality directly — that is the `ux-evaluator` agent's job. You do NOT call glab or gh directly — that is `issue-reconcile.mjs`'s job.
6
+
7
+ You exist to wire upstream tools together with discipline: token-frugal artifact storage, fingerprint-based dedup, severity-driven routing.
8
+
9
+ ## Principles
10
+
11
+ ### Token-frugal
12
+ Every AX dump and screenshot goes to disk under `${RUN_DIR}`. The coordinator context stays small. If a tool outputs 10,000 bytes of AX tree, it belongs in a file, not in your prompt.
13
+
14
+ ### Idempotent
15
+ Re-running against the same DOM produces the same fingerprints. The dedup set prevents duplicate issues regardless of how many times the orchestrator runs. Build the fingerprint set before reconciling — always.
16
+
17
+ ### Composable
18
+ Each phase has a clean boundary:
19
+ - Phase 2 → drivers write to disk
20
+ - Phase 3 → evaluator reads from disk, writes `findings.jsonl`
21
+ - Phase 4 → reconciler reads `findings.jsonl`, writes to issue tracker
22
+ - Phase 5 → reporter reads everything, writes `report.md` + JSONL roll-up
23
+
24
+ No phase reaches across another's boundary.
25
+
26
+ ### Wrap-not-fork
27
+ Playwright and Peekaboo stay on their mainlines. The test-runner's value is orchestration — not reimplementing driver logic. Dispatch via the wrapper skills; do not duplicate their contracts inline.
28
+
29
+ ## Decision-Making
30
+
31
+ When a driver exits non-zero, continue — test failures are findings, not orchestrator failures.
32
+
33
+ When `findings.jsonl` is missing after evaluator dispatch, warn and skip reconciliation — do not fail the run.
34
+
35
+ When glab query fails for fingerprint dedup, proceed with an empty set and log the error. Creating a duplicate issue is safer than silently skipping a real finding.
36
+
37
+ When severity is `critical` or `high`, auto-create without AUQ — these require no user gate. When severity is `medium` or `low`, present via AUQ and respect the user's triage decision.
38
+
39
+ ## What You Are NOT
40
+
41
+ - Not a tester — you orchestrate test execution, you do not write or run tests
42
+ - Not a UX evaluator — that is `agents/ux-evaluator.md`'s role
43
+ - Not a Playwright driver — that is `skills/playwright-driver/SKILL.md`'s role
44
+ - Not a Peekaboo driver — that will be `skills/peekaboo-driver/SKILL.md` once #381 lands
45
+ - Not an issue tracker — you reconcile findings via `scripts/lib/test-runner/issue-reconcile.mjs`
46
+ - Not a `@playwright/mcp` user — R5 hard-gate, 4× token cost, never bypass
@@ -0,0 +1,104 @@
1
+ ---
2
+ name: tmux-layout
3
+ description: Use this skill when the operator wants a prepared tmux visualization layout for the session's side-channels (STATE.md tail, CI-watch, events.jsonl tail). Renders a 4-pane default layout or debug layout. Read-only side-channel observability — the coordinator chat stays in the operator's original terminal. Trigger phrases: "tmux layout", "split panes for ci watch", "visualize session side-channels", "show me state-md tail and ci".
4
+ model: inherit
5
+ color: cyan
6
+ tools: Read, Bash, Grep, Glob
7
+ ---
8
+
9
+ # tmux-layout — Operator-Side Visualization Substrate
10
+
11
+ > Status: PROPOSED per ADR-0007 (`docs/adr/0007-tmux-visualization-substrate.md`). Opt-in skill — NOT default.
12
+ > Project-instruction file resolution: this is `CLAUDE.md` on Claude Code / Cursor IDE; the equivalent on Codex CLI is `AGENTS.md`. See `skills/_shared/instruction-file-resolution.md`.
13
+
14
+ ## Purpose
15
+
16
+ Render a prepared tmux layout for *operator-side observability* of the session's asynchronous side-channels — STATE.md updates, CI status, events.jsonl wave/gate transitions. NOT a coordinator chat surface, NOT a wave-agent host. The coordinator chat remains in the operator's original terminal, period (per AUQ-001 in `.claude/rules/ask-via-tool.md`).
17
+
18
+ ## When to Use
19
+
20
+ - During a long deep-session when you want CI status visible alongside Quality-Gate output without polling `glab ci status` manually.
21
+ - During `/debug` Phase 2 hypothesis testing (use `--layout debug`).
22
+ - Anywhere `tail -F .claude/STATE.md` + a CI watcher would speed up your loop.
23
+
24
+ ## When NOT to Use
25
+
26
+ - For wave-agent visualization — wave agents are in-process `Agent()` calls; no PID, no TTY, no pane to attach.
27
+ - For autopilot multi-story panes — autopilot.jsonl currently shows 11 entries / 8 dry-runs; below the value threshold for a pane-per-story UI.
28
+ - As your coordinator chat surface — that stays in the terminal where you invoked /tmux-layout.
29
+
30
+ ## Usage
31
+
32
+ ```
33
+ /tmux-layout # default layout (4 panes)
34
+ /tmux-layout --layout debug # debug layout (4 panes, /debug companion)
35
+ /tmux-layout --json # machine-readable output (no attach)
36
+ /tmux-layout --session-name my-ws # custom tmux session name
37
+ /tmux-layout --force # replace existing session (PSA-003 escape hatch)
38
+ /tmux-layout --with-status-pane # add a 5th pane tailing agent-status telemetry (#565)
39
+ /tmux-layout --help # full CLI usage
40
+ ```
41
+
42
+ The skill prints a one-line tmux command. Paste it into a SECOND terminal (do not run it where /tmux-layout was invoked). That second terminal becomes the layout. Your original terminal (the coordinator chat) stays where it is.
43
+
44
+ ## Default Layout (4 panes; 5 with `--with-status-pane`)
45
+
46
+ | Pane | Content | Command |
47
+ |---|---|---|
48
+ | 1 | **Shell** (operator scratch — NOT claude) | `bash` (interactive) |
49
+ | 2 | STATE.md tail | `tail -F <state-dir>/STATE.md` |
50
+ | 3 | CI watch (poll-loop wrapper) | `while true; do clear; glab ci status --pipeline-id LATEST --output json \| jq ...; sleep 15; done` |
51
+ | 4 | events.jsonl wave/gate filter | `tail -F .orchestrator/metrics/events.jsonl \| jq --unbuffered 'select(.event \| test("wave\|gate\|spiral"))'` |
52
+ | 5 | agent-status telemetry (#565, only with `--with-status-pane`) | `while true; do clear; jq . .orchestrator/runtime/agent-status-current.json 2>/dev/null \|\| echo ...; sleep 2; done` |
53
+
54
+ `<state-dir>` is resolved via `resolveStateDir()` from `scripts/lib/platform.mjs` (`.claude/`, `.codex/`, or `.cursor/`).
55
+ Pane 3 command is vcs-aware (`glab` for gitlab, `gh pr checks` for github, informational `echo` fallback when no CLI).
56
+
57
+ ## Debug Layout (4 panes — `--layout debug`, depends-on #562)
58
+
59
+ | Pane | Content | Command |
60
+ |---|---|---|
61
+ | 1 | **Shell** (operator scratch) | `bash` (interactive) |
62
+ | 2 | Hypothesis-test runner | `npm test -- --watch <scope>` (or per-skill-config) |
63
+ | 3 | Debug-artifact tail | `tail -F .orchestrator/debug/*.md` |
64
+ | 4 | Diff-watch | `watch -n 2 'git diff --stat \| head -30'` |
65
+
66
+ ## Architecture
67
+
68
+ Three sibling modules under `scripts/lib/tmux-layout/`:
69
+
70
+ - `layouts.mjs` — `renderDefaultLayout()`, `renderDebugLayout()`, `detectVcsCommand()`.
71
+ - `vcs-detector.mjs` — `detectVcsCommand({config, projectRoot})` returns `{bin, args, fallback, blocking}` per vcs key.
72
+ - `tmux-shell.mjs` — `detectTmuxVersion()`, session-collision policy helpers.
73
+
74
+ Entry point: `scripts/tmux-layout.mjs` (parseArgs from `node:util`, dispatcher to layout functions).
75
+
76
+ ## PSA-003 Compliance
77
+
78
+ Session-collision policy: **refuse + `--force`**. The skill NEVER kills, overwrites, or modifies a tmux session it did not create unless the operator passes `--force` explicitly. See `.claude/rules/parallel-sessions.md` § PSA-003.
79
+
80
+ ## AUQ-001 Compliance
81
+
82
+ The coordinator chat (where AskUserQuestion fires) stays in the operator's ORIGINAL terminal. Pane 1 of the tmux layout is intentionally a scratch shell, NOT a new `claude` session — there is no second AUQ surface, no decision-authority split. See `.claude/rules/ask-via-tool.md` § AUQ-001.
83
+
84
+ ## Telemetry & Promotion Gate (#563)
85
+
86
+ This skill emits structured events to `.orchestrator/metrics/events.jsonl`:
87
+ - `tmux-layout.invoked`
88
+ - `tmux-layout.degraded` (tmux missing, version too old, session collision without --force, etc.)
89
+ - `tmux-layout.completed` (when the user closes the tmux session)
90
+
91
+ Promotion criteria from opt-in skill to default-recommended in session-start banner: invocation count ≥ 5 across ≥ 3 distinct deep sessions over ≥ 2 calendar weeks, layout-completion rate ≥ 80%, zero AUQ-001 / PSA-003 regressions. See ADR-0007 § Follow-ups.
92
+
93
+ ## Troubleshooting
94
+
95
+ - **tmux not found** → install: `brew install tmux` (macOS) / `apt install tmux` (Linux). Minimum tmux ≥ 3.0.
96
+ - **Session already exists** → use `--force` (acknowledges PSA-003) or `--session-name my-other`.
97
+ - **CI pane shows nothing** → `glab` or `gh` not installed, or `vcs:` not set in `## Session Config`. Pane will show a clear fallback message.
98
+
99
+ ## See Also
100
+
101
+ - `docs/adr/0007-tmux-visualization-substrate.md` — design rationale.
102
+ - `skills/_shared/monitor-patterns.md` — comparison: tmux-layout vs Monitor vs /loop.
103
+ - `skills/debug/SKILL.md` — Phase 2 hypothesis testing (use `--layout debug` as companion).
104
+ - GitLab #561 #562 #563.
@@ -0,0 +1,97 @@
1
+ ---
2
+ name: ubiquitous-language
3
+ description: Use when the user wants to define domain terms, build a glossary, harden terminology, create a ubiquitous language, or mentions "domain model" or "DDD". Extracts a DDD-style glossary from the current conversation into UBIQUITOUS_LANGUAGE.md, flags ambiguities and synonyms, and proposes opinionated canonical terms.
4
+ model: inherit
5
+ disable-model-invocation: true
6
+ derived-from: mattpocock/skills@90ea8ee
7
+ license: MIT
8
+ upstream-url: https://github.com/mattpocock/skills/tree/main/ubiquitous-language
9
+ ---
10
+
11
+ # Ubiquitous Language
12
+
13
+ Extract and formalize domain terminology from the current conversation into a consistent glossary, saved to a local file.
14
+
15
+ ## Process
16
+
17
+ 1. **Scan the conversation** for domain-relevant nouns, verbs, and concepts
18
+ 2. **Identify problems**:
19
+ - Same word used for different concepts (ambiguity)
20
+ - Different words used for the same concept (synonyms)
21
+ - Vague or overloaded terms
22
+ 3. **Propose a canonical glossary** with opinionated term choices
23
+ 4. **Write to `UBIQUITOUS_LANGUAGE.md`** in the working directory using the format below
24
+ 5. **Output a summary** inline in the conversation
25
+
26
+ ## Output Format
27
+
28
+ Write a `UBIQUITOUS_LANGUAGE.md` file with this structure:
29
+
30
+ ```md
31
+ # Ubiquitous Language
32
+
33
+ ## Order lifecycle
34
+
35
+ | Term | Definition | Aliases to avoid |
36
+ | ----------- | ------------------------------------------------------- | --------------------- |
37
+ | **Order** | A customer's request to purchase one or more items | Purchase, transaction |
38
+ | **Invoice** | A request for payment sent to a customer after delivery | Bill, payment request |
39
+
40
+ ## People
41
+
42
+ | Term | Definition | Aliases to avoid |
43
+ | ------------ | ------------------------------------------- | ---------------------- |
44
+ | **Customer** | A person or organization that places orders | Client, buyer, account |
45
+ | **User** | An authentication identity in the system | Login, account |
46
+
47
+ ## Relationships
48
+
49
+ - An **Invoice** belongs to exactly one **Customer**
50
+ - An **Order** produces one or more **Invoices**
51
+
52
+ ## Example dialogue
53
+
54
+ > **Dev:** "When a **Customer** places an **Order**, do we create the **Invoice** immediately?"
55
+ > **Domain expert:** "No — an **Invoice** is only generated once a **Fulfillment** is confirmed. A single **Order** can produce multiple **Invoices** if items ship in separate **Shipments**."
56
+ > **Dev:** "So if a **Shipment** is cancelled before dispatch, no **Invoice** exists for it?"
57
+ > **Domain expert:** "Exactly. The **Invoice** lifecycle is tied to the **Fulfillment**, not the **Order**."
58
+
59
+ ## Flagged ambiguities
60
+
61
+ - "account" was used to mean both **Customer** and **User** — these are distinct concepts: a **Customer** places orders, while a **User** is an authentication identity that may or may not represent a **Customer**.
62
+ ```
63
+
64
+ ## Rules
65
+
66
+ - **Be opinionated.** When multiple words exist for the same concept, pick the best one and list the others as aliases to avoid.
67
+ - **Flag conflicts explicitly.** If a term is used ambiguously in the conversation, call it out in the "Flagged ambiguities" section with a clear recommendation.
68
+ - **Only include terms relevant for domain experts.** Skip the names of modules or classes unless they have meaning in the domain language.
69
+ - **Keep definitions tight.** One sentence max. Define what it IS, not what it does.
70
+ - **Show relationships.** Use bold term names and express cardinality where obvious.
71
+ - **Only include domain terms.** Skip generic programming concepts (array, function, endpoint) unless they have domain-specific meaning.
72
+ - **Group terms into multiple tables** when natural clusters emerge (e.g. by subdomain, lifecycle, or actor). Each group gets its own heading and table. If all terms belong to a single cohesive domain, one table is fine — don't force groupings.
73
+ - **Write an example dialogue.** A short conversation (3-5 exchanges) between a dev and a domain expert that demonstrates how the terms interact naturally. The dialogue should clarify boundaries between related concepts and show terms being used precisely.
74
+
75
+ <example>
76
+
77
+ ## Example dialogue
78
+
79
+ > **Dev:** "How do I test the **sync service** without Docker?"
80
+
81
+ > **Domain expert:** "Provide the **filesystem layer** instead of the **Docker layer**. It implements the same **Sandbox service** interface but uses a local directory as the **sandbox**."
82
+
83
+ > **Dev:** "So **sync-in** still creates a **bundle** and unpacks it?"
84
+
85
+ > **Domain expert:** "Exactly. The **sync service** doesn't know which layer it's talking to. It calls `exec` and `copyIn` — the **filesystem layer** just runs those as local shell commands."
86
+
87
+ </example>
88
+
89
+ ## Re-running
90
+
91
+ When invoked again in the same conversation:
92
+
93
+ 1. Read the existing `UBIQUITOUS_LANGUAGE.md`
94
+ 2. Incorporate any new terms from subsequent discussion
95
+ 3. Update definitions if understanding has evolved
96
+ 4. Re-flag any new ambiguities
97
+ 5. Rewrite the example dialogue to incorporate new terms