@mindrian_os/cli 2.0.0-beta.3 → 2.0.0-beta.33

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 (1829) hide show
  1. package/.claude-plugin/plugin.json +21 -0
  2. package/.mcp.json +14 -0
  3. package/CHANGELOG.md +497 -0
  4. package/agents/analogy-query-fetcher.md +119 -0
  5. package/agents/brain-query.md +91 -0
  6. package/agents/competitor-watch-fetcher.md +94 -0
  7. package/agents/framework-runner.md +258 -0
  8. package/agents/grading.md +216 -0
  9. package/agents/grant-reviewer.md +191 -0
  10. package/agents/investor.md +141 -0
  11. package/agents/larry-extended.md +215 -0
  12. package/agents/meeting-perspective-extractor.md +94 -0
  13. package/agents/opportunity-scanner.md +105 -0
  14. package/agents/persona-analyst.md +201 -0
  15. package/agents/research.md +103 -0
  16. package/agents/reverse-salient-agent.md +42 -0
  17. package/agents/vault-section-reviewer.md +107 -0
  18. package/assets/banner-showcase.html +537 -0
  19. package/assets/fonts/BebasNeue-Regular.ttf +0 -0
  20. package/assets/fonts/Inter-Bold.ttf +0 -0
  21. package/assets/fonts/Inter-Regular.ttf +0 -0
  22. package/assets/logo.svg +10 -0
  23. package/bin/local-chain-recommender.cjs +256 -0
  24. package/bin/mindrian-brain-mcp-client.cjs +319 -0
  25. package/bin/mindrian-mcp-server.cjs +445 -0
  26. package/bin/mindrian-mcp-shim.cjs +100 -0
  27. package/bin/mindrian-tools.cjs +784 -0
  28. package/commands/act.md +529 -0
  29. package/commands/admin.md +439 -0
  30. package/commands/agentshield.md +49 -0
  31. package/commands/analyze-needs.md +78 -0
  32. package/commands/analyze-systems.md +73 -0
  33. package/commands/analyze-timing.md +98 -0
  34. package/commands/auto-explore.md +85 -0
  35. package/commands/beautiful-question.md +76 -0
  36. package/commands/bono.md +152 -0
  37. package/commands/brain-derive.md +137 -0
  38. package/commands/build-knowledge.md +121 -0
  39. package/commands/build-thesis.md +94 -0
  40. package/commands/causal.md +269 -0
  41. package/commands/challenge-assumptions.md +78 -0
  42. package/commands/compare-ventures.md +117 -0
  43. package/commands/correct-reference-now.md +88 -0
  44. package/commands/dashboard.md +144 -0
  45. package/commands/deck.md +117 -0
  46. package/commands/deep-grade.md +214 -0
  47. package/commands/diagnose.md +131 -0
  48. package/commands/diagnostics.md +195 -0
  49. package/commands/dial-memory-refresh.md +113 -0
  50. package/commands/diffusion.md +129 -0
  51. package/commands/discover.md +221 -0
  52. package/commands/doctor.md +271 -0
  53. package/commands/dogfood-flush.md +130 -0
  54. package/commands/dominant-designs.md +76 -0
  55. package/commands/eureka.md +315 -0
  56. package/commands/explain-decision.md +135 -0
  57. package/commands/explore-domains.md +78 -0
  58. package/commands/explore-futures.md +67 -0
  59. package/commands/explore-opportunity.md +172 -0
  60. package/commands/explore-trends.md +78 -0
  61. package/commands/export.md +128 -0
  62. package/commands/feynman-timeline-refresh.md +102 -0
  63. package/commands/file-meeting.md +1195 -0
  64. package/commands/find-analogies.md +369 -0
  65. package/commands/find-bottlenecks.md +108 -0
  66. package/commands/find-connections.md +111 -0
  67. package/commands/funding.md +114 -0
  68. package/commands/futures.md +128 -0
  69. package/commands/grade-grant.md +297 -0
  70. package/commands/grade.md +257 -0
  71. package/commands/graph.md +218 -0
  72. package/commands/hat-briefing.md +163 -0
  73. package/commands/heal.md +72 -0
  74. package/commands/help.md +176 -0
  75. package/commands/hmi-status.md +75 -0
  76. package/commands/ignite.md +229 -0
  77. package/commands/ingest-methodology.md +128 -0
  78. package/commands/intel-pipeline.md +133 -0
  79. package/commands/jtbd.md +262 -0
  80. package/commands/leadership.md +113 -0
  81. package/commands/lean-canvas.md +74 -0
  82. package/commands/macro-trends.md +88 -0
  83. package/commands/map-unknowns.md +76 -0
  84. package/commands/memory-cortex-reach.md +79 -0
  85. package/commands/memory.md +213 -0
  86. package/commands/models.md +200 -0
  87. package/commands/mos-reason.md +489 -0
  88. package/commands/mos.md +162 -0
  89. package/commands/mullins.md +155 -0
  90. package/commands/mva-brief.md +86 -0
  91. package/commands/mva-option.md +119 -0
  92. package/commands/mva-report.md +76 -0
  93. package/commands/new-project.md +633 -0
  94. package/commands/new-surface.md +116 -0
  95. package/commands/onboard.md +489 -0
  96. package/commands/operator.md +168 -0
  97. package/commands/opportunities.md +177 -0
  98. package/commands/organize.md +74 -0
  99. package/commands/persona.md +276 -0
  100. package/commands/pipeline.md +167 -0
  101. package/commands/present.md +125 -0
  102. package/commands/publish.md +227 -0
  103. package/commands/pws-brain.md +154 -0
  104. package/commands/qualify-opportunity.md +113 -0
  105. package/commands/query.md +70 -0
  106. package/commands/radar.md +110 -0
  107. package/commands/reanalyze.md +124 -0
  108. package/commands/research.md +467 -0
  109. package/commands/room.md +385 -0
  110. package/commands/rooms.md +682 -0
  111. package/commands/root-cause.md +77 -0
  112. package/commands/rs-experts.md +153 -0
  113. package/commands/rs-explain.md +134 -0
  114. package/commands/rs-fetch.md +119 -0
  115. package/commands/rs-thesis.md +131 -0
  116. package/commands/scenario-plan.md +80 -0
  117. package/commands/scheduled-tasks.md +308 -0
  118. package/commands/score-innovation.md +78 -0
  119. package/commands/scout.md +379 -0
  120. package/commands/setup.md +658 -0
  121. package/commands/show.md +71 -0
  122. package/commands/skill.md +108 -0
  123. package/commands/snapshot.md +179 -0
  124. package/commands/speakers.md +118 -0
  125. package/commands/splash.md +55 -0
  126. package/commands/stance.md +91 -0
  127. package/commands/status.md +109 -0
  128. package/commands/structure-argument.md +82 -0
  129. package/commands/suggest-next.md +141 -0
  130. package/commands/systems-thinking.md +224 -0
  131. package/commands/think-hats.md +86 -0
  132. package/commands/trending-to-absurd.md +151 -0
  133. package/commands/update.md +256 -0
  134. package/commands/user-needs.md +77 -0
  135. package/commands/validate.md +77 -0
  136. package/commands/value-proposition.md +116 -0
  137. package/commands/vault.md +330 -0
  138. package/commands/visualize.md +71 -0
  139. package/commands/whitespace.md +541 -0
  140. package/commands/wiki.md +96 -0
  141. package/data/ROOM.md +47 -0
  142. package/data/brain-census.generated.json +2617 -0
  143. package/data/brain-orchestration-projection.json +4973 -0
  144. package/data/brain-packet-schema.json +545 -0
  145. package/data/brain-surface-contract.json +32 -0
  146. package/data/capability-ledger.json +391 -0
  147. package/data/capability-map-registry.json +23 -0
  148. package/data/command-registry.json +2433 -0
  149. package/data/connector-coverage-ledger.json +1618 -0
  150. package/data/connector-out-of-spine-allowlist.json +71 -0
  151. package/data/connector-registry.json +3637 -0
  152. package/data/corpus-stats-source.json +11 -0
  153. package/data/corpus-stats.generated.json +10 -0
  154. package/data/cross-domain-analogues.json +15 -0
  155. package/data/deck-aliases.json +6 -0
  156. package/data/deck-styles.json +85 -0
  157. package/data/deployment-surfaces.json +69 -0
  158. package/data/dispatch-framework-map.json +18 -0
  159. package/data/doctor-modules.json +206 -0
  160. package/data/dual-graph-health-baseline.json +12 -0
  161. package/data/eureka-critic-tags.json +32 -0
  162. package/data/first-reward-surfaces.json +66 -0
  163. package/data/first-touch-surfaces.json +60 -0
  164. package/data/flagship-floor-set.json +37 -0
  165. package/data/framework-names.json +121 -0
  166. package/data/grant-rubric-fixtures/early-stage-pre-seed.json +18 -0
  167. package/data/grant-rubric-fixtures/early-stage-round-a.json +18 -0
  168. package/data/grant-rubric-fixtures/early-stage-seed.json +18 -0
  169. package/data/grant-rubric-fixtures/hybrid-seed-incentive.json +18 -0
  170. package/data/grant-rubric-fixtures/rd-fund.json +18 -0
  171. package/data/grant-rubric-fixtures/regional-innovation-incubators.json +18 -0
  172. package/data/grant-rubric-fixtures/technology-incubators.json +18 -0
  173. package/data/grant-rubric-fixtures/tnufa.json +167 -0
  174. package/data/grant-rubric-schema.json +33 -0
  175. package/data/harness-fixtures/converged-room/.context/ROOM.md +13 -0
  176. package/data/harness-fixtures/converged-room/.intelligence/ROOM.md +13 -0
  177. package/data/harness-fixtures/converged-room/.snapshots/ROOM.md +13 -0
  178. package/data/harness-fixtures/converged-room/MINTO.md +19 -0
  179. package/data/harness-fixtures/converged-room/STATE.md +73 -0
  180. package/data/harness-fixtures/converged-room/USER.md +23 -0
  181. package/data/harness-fixtures/converged-room/assets/ROOM.md +13 -0
  182. package/data/harness-fixtures/converged-room/business-model/CONTEXT.md +32 -0
  183. package/data/harness-fixtures/converged-room/business-model/ROOM.md +36 -0
  184. package/data/harness-fixtures/converged-room/competitive-analysis/CONTEXT.md +33 -0
  185. package/data/harness-fixtures/converged-room/competitive-analysis/ROOM.md +35 -0
  186. package/data/harness-fixtures/converged-room/financial-model/CONTEXT.md +30 -0
  187. package/data/harness-fixtures/converged-room/financial-model/ROOM.md +35 -0
  188. package/data/harness-fixtures/converged-room/funding/CONTEXT.md +41 -0
  189. package/data/harness-fixtures/converged-room/funding/ROOM.md +35 -0
  190. package/data/harness-fixtures/converged-room/legal-ip/CONTEXT.md +30 -0
  191. package/data/harness-fixtures/converged-room/legal-ip/ROOM.md +35 -0
  192. package/data/harness-fixtures/converged-room/market-analysis/CONTEXT.md +32 -0
  193. package/data/harness-fixtures/converged-room/market-analysis/ROOM.md +35 -0
  194. package/data/harness-fixtures/converged-room/opportunity-bank/CONTEXT.md +39 -0
  195. package/data/harness-fixtures/converged-room/opportunity-bank/ROOM.md +36 -0
  196. package/data/harness-fixtures/converged-room/problem-definition/CONTEXT.md +32 -0
  197. package/data/harness-fixtures/converged-room/problem-definition/ROOM.md +36 -0
  198. package/data/harness-fixtures/converged-room/references/ROOM.md +13 -0
  199. package/data/harness-fixtures/converged-room/references/SECTION-SCHEMA.md +213 -0
  200. package/data/harness-fixtures/converged-room/references/SUB-SCHEMAS.md +91 -0
  201. package/data/harness-fixtures/converged-room/solution-design/CONTEXT.md +36 -0
  202. package/data/harness-fixtures/converged-room/solution-design/ROOM.md +36 -0
  203. package/data/harness-fixtures/converged-room/strategy/CONTEXT.md +35 -0
  204. package/data/harness-fixtures/converged-room/strategy/ROOM.md +35 -0
  205. package/data/harness-fixtures/converged-room/team/ROOM.md +13 -0
  206. package/data/harness-fixtures/converged-room/team-execution/CONTEXT.md +36 -0
  207. package/data/harness-fixtures/converged-room/team-execution/ROOM.md +35 -0
  208. package/data/harness-manifest.json +74 -0
  209. package/data/harness-policies/CONTEXT.md +55 -0
  210. package/data/harness-policies/_schema.json +42 -0
  211. package/data/harness-policies/contract-parity-larry.json +63 -0
  212. package/data/harness-policies/gate-card-fire.json +13 -0
  213. package/data/harness-policies/gate-graph-derive-health.json +13 -0
  214. package/data/harness-policies/gate-shape-declaration.json +13 -0
  215. package/data/harness-policies/gate-tool-honesty.json +13 -0
  216. package/data/harness-policies/gate-worktree-hygiene.json +13 -0
  217. package/data/harness-policies/memory-write-policy.json +28 -0
  218. package/data/harness-policies/registry-drift.json +13 -0
  219. package/data/harness-policies/release-payload-ceiling.json +13 -0
  220. package/data/harness-policies/voice-backend-noun-free.json +13 -0
  221. package/data/harness-policies/voice-fork-as-card.json +13 -0
  222. package/data/harness-policies/voice-glyph-present.json +13 -0
  223. package/data/harness-policies/voice-hyphens-only.json +13 -0
  224. package/data/help-groups.json +236 -0
  225. package/data/hitl-shape-backfill.json +777 -0
  226. package/data/hitl-shape-declaration-fixtures/invalid-bad-shape.json +5 -0
  227. package/data/hitl-shape-declaration-fixtures/invalid-missing-why.json +4 -0
  228. package/data/hitl-shape-declaration-fixtures/invalid-ranker-contradiction.json +6 -0
  229. package/data/hitl-shape-declaration-fixtures/invalid-skill-gap.json +3 -0
  230. package/data/hitl-shape-declaration-fixtures/valid-multi-stage.json +7 -0
  231. package/data/hitl-shape-declaration-fixtures/valid-single-shape.json +5 -0
  232. package/data/hitl-shape-declaration-fixtures/valid-skill-exempt.json +5 -0
  233. package/data/hitl-shape-declaration-schema.json +34 -0
  234. package/data/hitl-stages-fixtures/bono.json +10 -0
  235. package/data/hitl-stages-fixtures/pipeline-1.json +9 -0
  236. package/data/hitl-stages-fixtures/pipeline-2.json +9 -0
  237. package/data/hitl-stages-fixtures/pipeline-3.json +10 -0
  238. package/data/hitl-stages-fixtures/research.json +10 -0
  239. package/data/hitl-stages-fixtures/rs-convergence.json +10 -0
  240. package/data/hitl-stages-fixtures/rs-family.json +11 -0
  241. package/data/hitl-stages-fixtures/rs-reverse-salient.json +10 -0
  242. package/data/hitl-stages-fixtures/trending-to-absurd.json +11 -0
  243. package/data/hitl-stages-schema.json +26 -0
  244. package/data/mcp-tool-connectors.json +464 -0
  245. package/data/mva-agent-prompts.json +31 -0
  246. package/data/mva-deck-template.html +15 -0
  247. package/data/mva-heuristic-keywords.json +35 -0
  248. package/data/orchestration-command-ledger.json +576 -0
  249. package/data/orchestration-unwired-allowlist.json +6 -0
  250. package/data/portfolio-ahp-matrix.json +16 -0
  251. package/data/publish-needs.json +76 -0
  252. package/data/render-coverage-registry.json +1152 -0
  253. package/data/research-sources.json +58 -0
  254. package/data/roadmap-type-chains.json +28 -0
  255. package/data/room-blueprints.json +156 -0
  256. package/data/subagent-dispatch-grants.json +150 -0
  257. package/hooks/hooks.json +493 -0
  258. package/hooks/run-hook.cmd +64 -0
  259. package/lib/__init__.py +0 -0
  260. package/lib/__pycache__/__init__.cpython-312.pyc +0 -0
  261. package/lib/agents/auto-explore-agent.cjs +1163 -0
  262. package/lib/agents/mva/brain-classic-traps.cjs +55 -0
  263. package/lib/agents/mva/brain-cross-domain.cjs +79 -0
  264. package/lib/agents/mva/brain-similar-ventures.cjs +93 -0
  265. package/lib/agents/mva/dashboard-graph-neighborhood.cjs +72 -0
  266. package/lib/agents/mva/index.cjs +42 -0
  267. package/lib/agents/mva/six-hats-red-black.cjs +137 -0
  268. package/lib/agents/mva/tavily-funding-scan.cjs +147 -0
  269. package/lib/agents/mva/test-all-six-agents.cjs +467 -0
  270. package/lib/agents/reverse-salient-agent.cjs +757 -0
  271. package/lib/agents/tension-hook-agent.cjs +586 -0
  272. package/lib/brain/ROOM.md +44 -0
  273. package/lib/brain/chain-recommender.cjs +784 -0
  274. package/lib/brain/curation-batch.cjs +519 -0
  275. package/lib/brain/framework-chain-slice.cjs +252 -0
  276. package/lib/brain/hypergraph-event-schema.cjs +184 -0
  277. package/lib/chat/chat-context.js +185 -0
  278. package/lib/chat/chat-panel.js +721 -0
  279. package/lib/chat/fabric-chat.cjs +288 -0
  280. package/lib/chat/generative-tools.js +219 -0
  281. package/lib/conversation/ROOM.md +39 -0
  282. package/lib/conversation/classifier-rules.json +38 -0
  283. package/lib/conversation/classifier.cjs +264 -0
  284. package/lib/conversation/operator-epistemic-cap.test.cjs +156 -0
  285. package/lib/conversation/operator.cjs +492 -0
  286. package/lib/conversation/operator.test.cjs +160 -0
  287. package/lib/copy/115-spec-strings.cjs +55 -0
  288. package/lib/core/__init__.py +0 -0
  289. package/lib/core/__nav-stub.cjs +14 -0
  290. package/lib/core/__pycache__/__init__.cpython-312.pyc +0 -0
  291. package/lib/core/__pycache__/rs-math.cpython-312.pyc +0 -0
  292. package/lib/core/__pycache__/rs_cache.cpython-312.pyc +0 -0
  293. package/lib/core/__pycache__/rs_corpus.cpython-312.pyc +0 -0
  294. package/lib/core/__pycache__/rs_corpus_exclude.cpython-312.pyc +0 -0
  295. package/lib/core/__pycache__/rs_hybrid.cpython-312.pyc +0 -0
  296. package/lib/core/__pycache__/rs_math.cpython-312.pyc +0 -0
  297. package/lib/core/__pycache__/rs_rooms.cpython-312.pyc +0 -0
  298. package/lib/core/abstraction-gate.cjs +133 -0
  299. package/lib/core/act-jtbd-blurb.cjs +231 -0
  300. package/lib/core/artifact-id.cjs +148 -0
  301. package/lib/core/asset-ops.cjs +151 -0
  302. package/lib/core/auto-commit-throttle.cjs +129 -0
  303. package/lib/core/bearer-token.cjs +199 -0
  304. package/lib/core/behavioral/observation-schema.cjs +86 -0
  305. package/lib/core/bono/cell-fanout.cjs +305 -0
  306. package/lib/core/bono/debate-composition.cjs +495 -0
  307. package/lib/core/bono/hat-governance.cjs +367 -0
  308. package/lib/core/bono/persona-research.cjs +288 -0
  309. package/lib/core/bono/reviewer-governance.cjs +331 -0
  310. package/lib/core/brain-client.cjs +2621 -0
  311. package/lib/core/brain-derivation-prompts.cjs +331 -0
  312. package/lib/core/brain-derivation-queue.cjs +535 -0
  313. package/lib/core/brain-derivation.cjs +740 -0
  314. package/lib/core/brain-md-schema.cjs +528 -0
  315. package/lib/core/brain-md-staleness.cjs +357 -0
  316. package/lib/core/brain-response-sanitize.cjs +396 -0
  317. package/lib/core/breakthrough/canary.cjs +134 -0
  318. package/lib/core/breakthrough/canary.test.cjs +136 -0
  319. package/lib/core/breakthrough/detectors.cjs +359 -0
  320. package/lib/core/breakthrough/detectors.test.cjs +333 -0
  321. package/lib/core/breakthrough/ethics-fence.cjs +129 -0
  322. package/lib/core/breakthrough/ethics-fence.test.cjs +178 -0
  323. package/lib/core/breakthrough/resurfacing.cjs +150 -0
  324. package/lib/core/breakthrough/resurfacing.test.cjs +233 -0
  325. package/lib/core/breakthrough/review-queue.cjs +168 -0
  326. package/lib/core/breakthrough/review-queue.test.cjs +160 -0
  327. package/lib/core/breakthrough/scanner-d17-d18.test.cjs +229 -0
  328. package/lib/core/breakthrough/scanner.cjs +435 -0
  329. package/lib/core/breakthrough/scanner.test.cjs +267 -0
  330. package/lib/core/breakthrough/schema.cjs +180 -0
  331. package/lib/core/breakthrough/schema.test.cjs +256 -0
  332. package/lib/core/breakthrough/scoring.cjs +293 -0
  333. package/lib/core/breakthrough/scoring.test.cjs +423 -0
  334. package/lib/core/breakthrough/verb-dispatch.cjs +230 -0
  335. package/lib/core/breakthrough/verb-dispatch.test.cjs +185 -0
  336. package/lib/core/breakthrough/voice-scaffold.cjs +249 -0
  337. package/lib/core/breakthrough/voice-scaffold.test.cjs +251 -0
  338. package/lib/core/bridge-writer.cjs +477 -0
  339. package/lib/core/cache-prune.cjs +314 -0
  340. package/lib/core/card-fire-gate.cjs +107 -0
  341. package/lib/core/card-fire-sidechannel.cjs +518 -0
  342. package/lib/core/chain-executor.cjs +939 -0
  343. package/lib/core/chain-retry.cjs +214 -0
  344. package/lib/core/chain-step-dispatcher.cjs +397 -0
  345. package/lib/core/chat-context-builder.cjs +253 -0
  346. package/lib/core/check-plugin-enabled.cjs +145 -0
  347. package/lib/core/close-loop-writer.cjs +492 -0
  348. package/lib/core/command-registration-check.cjs +246 -0
  349. package/lib/core/correlation-label-index.cjs +230 -0
  350. package/lib/core/correlation.cjs +112 -0
  351. package/lib/core/coverage-monitor.cjs +183 -0
  352. package/lib/core/coverage-rollup.cjs +232 -0
  353. package/lib/core/cross-room-aggregator.cjs +1127 -0
  354. package/lib/core/cross-room-store.cjs +292 -0
  355. package/lib/core/cross-room-triggers.cjs +222 -0
  356. package/lib/core/daily-briefing.cjs +438 -0
  357. package/lib/core/decision-axes.cjs +178 -0
  358. package/lib/core/decision-capture.cjs +618 -0
  359. package/lib/core/deck-design-rules.cjs +211 -0
  360. package/lib/core/deep-links.cjs +82 -0
  361. package/lib/core/directive-envelope.cjs +230 -0
  362. package/lib/core/directive-envelope.test.cjs +225 -0
  363. package/lib/core/dispatch-optimizer.cjs +354 -0
  364. package/lib/core/doc-text-extractor.cjs +133 -0
  365. package/lib/core/doctor/capability-ledger-module.cjs +170 -0
  366. package/lib/core/doctor/card-fire-health-module.cjs +159 -0
  367. package/lib/core/doctor/cascade-rooms-active-module.cjs +127 -0
  368. package/lib/core/doctor/cascade-rooms-module.cjs +184 -0
  369. package/lib/core/doctor/class-m-brain-smoke.cjs +479 -0
  370. package/lib/core/doctor/class-m-brain-smoke.test.cjs +448 -0
  371. package/lib/core/doctor/class-s-eureka-smoke.cjs +380 -0
  372. package/lib/core/doctor/deployment-surfaces-module.cjs +408 -0
  373. package/lib/core/doctor/deprecated-usage-module.cjs +155 -0
  374. package/lib/core/doctor/eureka-fts-health-module.cjs +236 -0
  375. package/lib/core/doctor/graph-derive-heal-retrofit-module.cjs +148 -0
  376. package/lib/core/doctor/graph-derive-health-module.cjs +486 -0
  377. package/lib/core/doctor/install-incomplete-module.cjs +320 -0
  378. package/lib/core/doctor/install-state-module.cjs +503 -0
  379. package/lib/core/doctor/mcp-surface-module.cjs +369 -0
  380. package/lib/core/doctor/mode-select-checkpoint-module.cjs +113 -0
  381. package/lib/core/doctor/plugin-enabled-state-module.cjs +86 -0
  382. package/lib/core/doctor/room-graph-density-module.cjs +181 -0
  383. package/lib/core/doctor/room-md-module.cjs +198 -0
  384. package/lib/core/doctor/shared.cjs +555 -0
  385. package/lib/core/doctor/stale-first-touch-copy-module.cjs +83 -0
  386. package/lib/core/doctor/statusline-visibility-module.cjs +295 -0
  387. package/lib/core/doctor/ui-compliance-module.cjs +223 -0
  388. package/lib/core/doctor/umbilical-module.cjs +486 -0
  389. package/lib/core/doctor/verify-surface-module.cjs +82 -0
  390. package/lib/core/doctor/voice-style-log-module.cjs +146 -0
  391. package/lib/core/domain-insight-sweep.cjs +224 -0
  392. package/lib/core/drift-baseline.cjs +362 -0
  393. package/lib/core/drift-runtime-reachability.cjs +283 -0
  394. package/lib/core/dual-path-detector.cjs +84 -0
  395. package/lib/core/dual-path-detector.test.cjs +334 -0
  396. package/lib/core/enrichment-queue.cjs +636 -0
  397. package/lib/core/eureka/ahp-weights.cjs +232 -0
  398. package/lib/core/eureka/analogy-fitness.cjs +326 -0
  399. package/lib/core/eureka/compression-meter.cjs +165 -0
  400. package/lib/core/eureka/embedding-classifier.cjs +226 -0
  401. package/lib/core/eureka/embedding-spine.cjs +563 -0
  402. package/lib/core/eureka/entity-classifier.cjs +232 -0
  403. package/lib/core/eureka/entity-extractor.cjs +356 -0
  404. package/lib/core/eureka/eureka-enable.cjs +228 -0
  405. package/lib/core/eureka/eureka-offer.cjs +225 -0
  406. package/lib/core/eureka/eureka-reach-runner.cjs +430 -0
  407. package/lib/core/eureka/explore-chain.cjs +834 -0
  408. package/lib/core/eureka/explored-artifact.cjs +456 -0
  409. package/lib/core/eureka/fts-index-lifecycle.cjs +265 -0
  410. package/lib/core/eureka/grade-grant-examine.cjs +544 -0
  411. package/lib/core/eureka/grade-grant.cjs +596 -0
  412. package/lib/core/eureka/hybrid-retrieve.cjs +256 -0
  413. package/lib/core/eureka/lateral-engine-adapter.cjs +118 -0
  414. package/lib/core/eureka/lexical-overlap.cjs +98 -0
  415. package/lib/core/eureka/online-pattern-query.cjs +142 -0
  416. package/lib/core/eureka/opportunity-harvest.cjs +752 -0
  417. package/lib/core/eureka/opportunity-statement.cjs +519 -0
  418. package/lib/core/eureka/portfolio-dimensions.cjs +255 -0
  419. package/lib/core/eureka/qualify-opportunity.cjs +607 -0
  420. package/lib/core/eureka/reasoning-mode.cjs +481 -0
  421. package/lib/core/eureka/report-html.cjs +368 -0
  422. package/lib/core/eureka/research-filing.cjs +547 -0
  423. package/lib/core/eureka/room-native-substrate.cjs +343 -0
  424. package/lib/core/eureka/tail-quadrant.cjs +177 -0
  425. package/lib/core/eureka/tri-modal-index.cjs +564 -0
  426. package/lib/core/eureka/vector-store.cjs +414 -0
  427. package/lib/core/eureka-critic.cjs +733 -0
  428. package/lib/core/eureka-deps-resolver.cjs +179 -0
  429. package/lib/core/expert-genesis.cjs +437 -0
  430. package/lib/core/expert-library.cjs +303 -0
  431. package/lib/core/exports-log.cjs +79 -0
  432. package/lib/core/feynman/ROOM.md +25 -0
  433. package/lib/core/feynman/dial-memory-renderer.cjs +279 -0
  434. package/lib/core/feynman/dial-memory-runner.cjs +173 -0
  435. package/lib/core/feynman/feynman-seed-writer.cjs +187 -0
  436. package/lib/core/feynman/timeline-renderer.cjs +197 -0
  437. package/lib/core/feynman/timeline-runner.cjs +281 -0
  438. package/lib/core/feynman-minto-invariants.cjs +609 -0
  439. package/lib/core/findings-wirer.cjs +360 -0
  440. package/lib/core/first-touch-version-stamper.cjs +113 -0
  441. package/lib/core/folder-memory-async.cjs +424 -0
  442. package/lib/core/folder-memory-shared.cjs +890 -0
  443. package/lib/core/folder-memory.cjs +546 -0
  444. package/lib/core/framework-chain-composer.cjs +583 -0
  445. package/lib/core/frontmatter-schemas.cjs +468 -0
  446. package/lib/core/fusion-router.cjs +540 -0
  447. package/lib/core/futures/causal-cue.cjs +91 -0
  448. package/lib/core/futures/orchestrator.cjs +1391 -0
  449. package/lib/core/futures/subsystem-render.cjs +164 -0
  450. package/lib/core/gate-relevance.cjs +278 -0
  451. package/lib/core/git-ops.cjs +141 -0
  452. package/lib/core/graph-backfill.cjs +562 -0
  453. package/lib/core/graph-candidate-producer.cjs +235 -0
  454. package/lib/core/graph-derivation.cjs +546 -0
  455. package/lib/core/graph-derive-classifier.cjs +352 -0
  456. package/lib/core/graph-ops.cjs +274 -0
  457. package/lib/core/graph-refine-loop.cjs +194 -0
  458. package/lib/core/graph-self-heal.cjs +289 -0
  459. package/lib/core/greeting-intent-detector.cjs +201 -0
  460. package/lib/core/grill-engine.cjs +459 -0
  461. package/lib/core/hat-persistence.cjs +274 -0
  462. package/lib/core/hsi-engine.cjs +439 -0
  463. package/lib/core/hsi-lsa.cjs +246 -0
  464. package/lib/core/hsi-spectral.cjs +554 -0
  465. package/lib/core/hsi-to-graph.test.cjs +168 -0
  466. package/lib/core/icm-forest.cjs +703 -0
  467. package/lib/core/ignite-branch-gate.cjs +66 -0
  468. package/lib/core/index.cjs +60 -0
  469. package/lib/core/insight-sensors.cjs +1000 -0
  470. package/lib/core/install-state.cjs +242 -0
  471. package/lib/core/integration-registry.cjs +232 -0
  472. package/lib/core/intel-pipeline.cjs +566 -0
  473. package/lib/core/intelligence-cascade.cjs +852 -0
  474. package/lib/core/issue-tree.cjs +269 -0
  475. package/lib/core/larry-thinness-acknowledgment.cjs +64 -0
  476. package/lib/core/larry-thinness-acknowledgment.test.cjs +97 -0
  477. package/lib/core/lazygraph-ops.cjs +1453 -0
  478. package/lib/core/lens-engine.cjs +434 -0
  479. package/lib/core/leverage-scan.cjs +218 -0
  480. package/lib/core/llm-name-suggester.cjs +194 -0
  481. package/lib/core/llm-name-suggester.test.cjs +132 -0
  482. package/lib/core/lru-cache.cjs +139 -0
  483. package/lib/core/mcp-dep-heal.cjs +475 -0
  484. package/lib/core/mcp-dep-heal.test.cjs +253 -0
  485. package/lib/core/mcp-profiles.cjs +185 -0
  486. package/lib/core/meeting-ops.cjs +54 -0
  487. package/lib/core/memory/governance-candidate-raiser.cjs +205 -0
  488. package/lib/core/memory/governance-candidate.cjs +95 -0
  489. package/lib/core/memory/reconcile-memory-runner.cjs +653 -0
  490. package/lib/core/memory-ops.cjs +641 -0
  491. package/lib/core/meter/gate-density-reader.cjs +112 -0
  492. package/lib/core/meter/transfer-reader.cjs +276 -0
  493. package/lib/core/meter/two-gauge.cjs +245 -0
  494. package/lib/core/methodology-ingest.cjs +346 -0
  495. package/lib/core/metrics/larryreach-loop-health.cjs +142 -0
  496. package/lib/core/migration-snapshot.cjs +287 -0
  497. package/lib/core/migration-snapshot.test.cjs +174 -0
  498. package/lib/core/migrations/ROOM.md +33 -0
  499. package/lib/core/migrations/phase-109-nodes-provenance.cjs +400 -0
  500. package/lib/core/migrations/phase-109-session-focus.cjs +99 -0
  501. package/lib/core/migrations/phase-160-nodes-bitemporal.cjs +168 -0
  502. package/lib/core/migrations/phase-160-nodes-bitemporal.test.cjs +140 -0
  503. package/lib/core/migrations/phase-162-section-nodes.cjs +156 -0
  504. package/lib/core/migrations/phase-222-ranker-weights.cjs +62 -0
  505. package/lib/core/migrations/phase-224-edge-review-status.cjs +87 -0
  506. package/lib/core/mindrian-brain-shim.test.cjs +221 -0
  507. package/lib/core/mode-select-sidechannel.cjs +259 -0
  508. package/lib/core/model-profiles.cjs +246 -0
  509. package/lib/core/mullins-scaffold.cjs +258 -0
  510. package/lib/core/mullins-scaffold.test.cjs +128 -0
  511. package/lib/core/mva-agent-contract.cjs +170 -0
  512. package/lib/core/mva-agent-contract.test.cjs +169 -0
  513. package/lib/core/mva-budget.cjs +75 -0
  514. package/lib/core/mva-budget.test.cjs +68 -0
  515. package/lib/core/mva-classifier.cjs +392 -0
  516. package/lib/core/mva-classifier.test.cjs +248 -0
  517. package/lib/core/mva-deck-builder.cjs +452 -0
  518. package/lib/core/mva-deck-builder.test.cjs +287 -0
  519. package/lib/core/mva-detect.smoke.test.cjs +209 -0
  520. package/lib/core/mva-dispatcher.cjs +110 -0
  521. package/lib/core/mva-dispatcher.test.cjs +216 -0
  522. package/lib/core/mva-option-router.cjs +414 -0
  523. package/lib/core/mva-option-router.test.cjs +483 -0
  524. package/lib/core/mva-orchestrator.cjs +365 -0
  525. package/lib/core/mva-orchestrator.test.cjs +916 -0
  526. package/lib/core/mva-progressive-renderer.cjs +194 -0
  527. package/lib/core/mva-progressive-renderer.test.cjs +157 -0
  528. package/lib/core/mva-rule-linter.cjs +458 -0
  529. package/lib/core/mva-rule-linter.test.cjs +484 -0
  530. package/lib/core/mva-state.cjs +159 -0
  531. package/lib/core/mva-telemetry.cjs +58 -0
  532. package/lib/core/mva-telemetry.test.cjs +196 -0
  533. package/lib/core/mva-vercel-deploy.cjs +168 -0
  534. package/lib/core/mva-vercel-deploy.test.cjs +239 -0
  535. package/lib/core/nav-dial.cjs +440 -0
  536. package/lib/core/navigation/ROOM.md +15 -0
  537. package/lib/core/navigation/abstraction-claim.cjs +185 -0
  538. package/lib/core/navigation/calibration-gate.cjs +284 -0
  539. package/lib/core/navigation/calibration-log.cjs +141 -0
  540. package/lib/core/navigation/confirm-node.cjs +73 -0
  541. package/lib/core/navigation/dashboard-helpers.cjs +145 -0
  542. package/lib/core/navigation/edges.cjs +1150 -0
  543. package/lib/core/navigation/evidence-claim.cjs +186 -0
  544. package/lib/core/navigation/explanation.cjs +48 -0
  545. package/lib/core/navigation/file-evidence-readback.cjs +242 -0
  546. package/lib/core/navigation/focus.cjs +155 -0
  547. package/lib/core/navigation/get-domains-for-trends.cjs +277 -0
  548. package/lib/core/navigation/governance.cjs +101 -0
  549. package/lib/core/navigation/grant-rubric.cjs +218 -0
  550. package/lib/core/navigation/graph-export.cjs +325 -0
  551. package/lib/core/navigation/ingestion.cjs +109 -0
  552. package/lib/core/navigation/insights-stale.test.cjs +127 -0
  553. package/lib/core/navigation/insights.cjs +574 -0
  554. package/lib/core/navigation/lens-nodes.cjs +315 -0
  555. package/lib/core/navigation/memory-artifacts.cjs +437 -0
  556. package/lib/core/navigation/memory-cortex-packet.cjs +274 -0
  557. package/lib/core/navigation/memory-events.cjs +811 -0
  558. package/lib/core/navigation/neighborhood.cjs +79 -0
  559. package/lib/core/navigation/packet.cjs +420 -0
  560. package/lib/core/navigation/planning-artifacts.cjs +219 -0
  561. package/lib/core/navigation/projections.cjs +295 -0
  562. package/lib/core/navigation/ranker-weights.cjs +133 -0
  563. package/lib/core/navigation/reasoning-write.cjs +211 -0
  564. package/lib/core/navigation/reconcile-guard.cjs +98 -0
  565. package/lib/core/navigation/reified-claim.cjs +287 -0
  566. package/lib/core/navigation/research-preflight.cjs +156 -0
  567. package/lib/core/navigation/room-birth.cjs +1213 -0
  568. package/lib/core/navigation/room-context.cjs +380 -0
  569. package/lib/core/navigation/room-home.cjs +142 -0
  570. package/lib/core/navigation/spine-events.cjs +548 -0
  571. package/lib/core/navigation/synthetic-expert.cjs +177 -0
  572. package/lib/core/navigation/transitions.cjs +253 -0
  573. package/lib/core/navigation/typed-claim.cjs +208 -0
  574. package/lib/core/navigation/typed-domain.cjs +249 -0
  575. package/lib/core/navigation/typed-entity.cjs +236 -0
  576. package/lib/core/navigation/typed-frame.cjs +257 -0
  577. package/lib/core/navigation/typed-open-question.cjs +130 -0
  578. package/lib/core/navigation/typed-opportunity.cjs +418 -0
  579. package/lib/core/navigation-engine-offer.cjs +776 -0
  580. package/lib/core/navigation-engine-shared.cjs +256 -0
  581. package/lib/core/navigation-engine.cjs +1696 -0
  582. package/lib/core/navigation.cjs +686 -0
  583. package/lib/core/nl-graph-queries.cjs +164 -0
  584. package/lib/core/node-insert-epistemic.test.cjs +212 -0
  585. package/lib/core/node-insert-overrides.test.cjs +273 -0
  586. package/lib/core/node-insert.cjs +274 -0
  587. package/lib/core/npm-cli-resolve.cjs +151 -0
  588. package/lib/core/npm-cli-resolve.test.cjs +153 -0
  589. package/lib/core/npm-install-lock.cjs +326 -0
  590. package/lib/core/npm-install-lock.test.cjs +379 -0
  591. package/lib/core/numeric/sklearn-stopwords-v1.json +325 -0
  592. package/lib/core/numeric/svd.cjs +377 -0
  593. package/lib/core/numeric/tfidf.cjs +241 -0
  594. package/lib/core/offer-presenter.cjs +406 -0
  595. package/lib/core/opportunity-extractor.cjs +183 -0
  596. package/lib/core/opportunity-ops.cjs +1423 -0
  597. package/lib/core/orchestration-candidate-lift.cjs +284 -0
  598. package/lib/core/part8-egress-guard.cjs +563 -0
  599. package/lib/core/part8-egress-guard.test.cjs +194 -0
  600. package/lib/core/part8-egress-ontology.cjs +174 -0
  601. package/lib/core/part8-egress-ontology.test.cjs +133 -0
  602. package/lib/core/persona-ops.cjs +692 -0
  603. package/lib/core/persona-override.cjs +327 -0
  604. package/lib/core/persona-taxonomy.cjs +328 -0
  605. package/lib/core/pinecone-inference.cjs +176 -0
  606. package/lib/core/pitch-feedback-schemas.cjs +303 -0
  607. package/lib/core/planning/artifact-brain-packet.cjs +212 -0
  608. package/lib/core/planning/reconcile-runner.cjs +347 -0
  609. package/lib/core/platform-gates.cjs +120 -0
  610. package/lib/core/platform.cjs +257 -0
  611. package/lib/core/proactive-intelligence.cjs +528 -0
  612. package/lib/core/problem-type-router.cjs +315 -0
  613. package/lib/core/publish-needs-default-lane.cjs +110 -0
  614. package/lib/core/ralph-loop-gate.cjs +48 -0
  615. package/lib/core/reader/ab-harness.cjs +177 -0
  616. package/lib/core/reader/decide-projection-reader.cjs +358 -0
  617. package/lib/core/reasoning-ops.cjs +639 -0
  618. package/lib/core/recipe-maps.cjs +442 -0
  619. package/lib/core/recovery/case-file.cjs +358 -0
  620. package/lib/core/recovery/controller.cjs +1008 -0
  621. package/lib/core/recovery/dispatcher.cjs +533 -0
  622. package/lib/core/recovery/result-semantics.cjs +488 -0
  623. package/lib/core/recovery/stage-envelope.cjs +338 -0
  624. package/lib/core/refusal-messaging.cjs +569 -0
  625. package/lib/core/refusal-messaging.test.cjs +220 -0
  626. package/lib/core/repo-version.cjs +134 -0
  627. package/lib/core/research-cache.cjs +165 -0
  628. package/lib/core/research-cache.test.cjs +137 -0
  629. package/lib/core/research-context-extractor.cjs +283 -0
  630. package/lib/core/research-corpus.cjs +814 -0
  631. package/lib/core/research-corpus.test.cjs +280 -0
  632. package/lib/core/research-filing-selector.cjs +189 -0
  633. package/lib/core/resolve-active-room.cjs +602 -0
  634. package/lib/core/resolve-brain-key.cjs +273 -0
  635. package/lib/core/resolve-umbilical-target.cjs +288 -0
  636. package/lib/core/resolve-vercel-key.cjs +107 -0
  637. package/lib/core/resolve-vercel-key.test.cjs +137 -0
  638. package/lib/core/reverse-salient-persona-suffix.cjs +115 -0
  639. package/lib/core/room-auto-create.cjs +318 -0
  640. package/lib/core/room-auto-create.test.cjs +198 -0
  641. package/lib/core/room-chooser.cjs +244 -0
  642. package/lib/core/room-classifier-strict-mode.cjs +235 -0
  643. package/lib/core/room-db.cjs +348 -0
  644. package/lib/core/room-discard-cascade.cjs +238 -0
  645. package/lib/core/room-discard-cascade.test.cjs +135 -0
  646. package/lib/core/room-name-validator.cjs +132 -0
  647. package/lib/core/room-name-validator.test.cjs +156 -0
  648. package/lib/core/room-naming-selector.cjs +357 -0
  649. package/lib/core/room-naming-selector.test.cjs +277 -0
  650. package/lib/core/room-open.cjs +259 -0
  651. package/lib/core/room-ops-async.cjs +92 -0
  652. package/lib/core/room-ops-shared.cjs +64 -0
  653. package/lib/core/room-ops-sync.cjs +70 -0
  654. package/lib/core/room-ops.cjs +32 -0
  655. package/lib/core/room-receipt-emit.cjs +63 -0
  656. package/lib/core/room-root.cjs +93 -0
  657. package/lib/core/room-skeleton-scaffold.cjs +669 -0
  658. package/lib/core/room-skeleton-scaffold.test.cjs +296 -0
  659. package/lib/core/room-type-detector.cjs +386 -0
  660. package/lib/core/rs-backend-dispatch.cjs +64 -0
  661. package/lib/core/rs-brain-substrate-prompts.cjs +129 -0
  662. package/lib/core/rs-brain-substrate.cjs +570 -0
  663. package/lib/core/rs-breakthrough-scorer.cjs +255 -0
  664. package/lib/core/rs-canon-violations.cjs +82 -0
  665. package/lib/core/rs-chain-feeder.cjs +381 -0
  666. package/lib/core/rs-commercial-assessor.cjs +280 -0
  667. package/lib/core/rs-corpus-quality-gate.cjs +62 -0
  668. package/lib/core/rs-differential-scorer.cjs +629 -0
  669. package/lib/core/rs-domain-analyzer.cjs +385 -0
  670. package/lib/core/rs-egress-prompts.cjs +113 -0
  671. package/lib/core/rs-egress-telemetry.cjs +225 -0
  672. package/lib/core/rs-egress-violations.cjs +53 -0
  673. package/lib/core/rs-engine.cjs +597 -0
  674. package/lib/core/rs-expert-brain-projection.cjs +280 -0
  675. package/lib/core/rs-expert-mapper.cjs +467 -0
  676. package/lib/core/rs-fetcher-academic.cjs +697 -0
  677. package/lib/core/rs-fetcher-experts.cjs +314 -0
  678. package/lib/core/rs-fetcher-industry.cjs +731 -0
  679. package/lib/core/rs-fetcher-patents.cjs +564 -0
  680. package/lib/core/rs-innovation-classifier.cjs +194 -0
  681. package/lib/core/rs-math.cjs +458 -0
  682. package/lib/core/rs-mind-map.cjs +656 -0
  683. package/lib/core/rs-neo4j-writer.cjs +388 -0
  684. package/lib/core/rs-nl-to-query.cjs +435 -0
  685. package/lib/core/rs-pinecone-bridge.cjs +344 -0
  686. package/lib/core/rs-preprocessor.cjs +350 -0
  687. package/lib/core/rs-query-matrix.cjs +316 -0
  688. package/lib/core/rs-query-to-text.cjs +438 -0
  689. package/lib/core/rs-sqlite-mirror.cjs +495 -0
  690. package/lib/core/rs-thesis-generator.cjs +188 -0
  691. package/lib/core/rs_cache.py +635 -0
  692. package/lib/core/rs_corpus.py +562 -0
  693. package/lib/core/rs_corpus_exclude.py +62 -0
  694. package/lib/core/rs_hybrid.py +589 -0
  695. package/lib/core/rs_math.py +287 -0
  696. package/lib/core/rs_rooms.py +196 -0
  697. package/lib/core/salient-governance.cjs +315 -0
  698. package/lib/core/scheduled-scanner.cjs +658 -0
  699. package/lib/core/scratchpad-ops.cjs +316 -0
  700. package/lib/core/seam-liveness.cjs +191 -0
  701. package/lib/core/seam-liveness.test.cjs +177 -0
  702. package/lib/core/section-8-trace-schema.cjs +138 -0
  703. package/lib/core/section-registry.cjs +167 -0
  704. package/lib/core/security/agentshield-adapters.test.cjs +104 -0
  705. package/lib/core/security/agentshield-run.cjs +343 -0
  706. package/lib/core/security/agentshield-scanner.cjs +314 -0
  707. package/lib/core/security/agentshield-scanner.test.cjs +259 -0
  708. package/lib/core/sensors/hat-scoping-table.cjs +103 -0
  709. package/lib/core/sensors/sensor-circularity.cjs +278 -0
  710. package/lib/core/sensors/sensor-content-relevance.cjs +407 -0
  711. package/lib/core/sensors/sensor-diffusion-adoption.cjs +230 -0
  712. package/lib/core/sensors/sensor-eureka.cjs +208 -0
  713. package/lib/core/sensors/sensor-expert-skill.cjs +293 -0
  714. package/lib/core/sensors/sensor-external-fact.cjs +184 -0
  715. package/lib/core/sensors/sensor-gate-approach.cjs +104 -0
  716. package/lib/core/sensors/sensor-jtbd-reweight.cjs +141 -0
  717. package/lib/core/sensors/sensor-lagging-component.cjs +115 -0
  718. package/lib/core/sensors/sensor-memory-cortex.cjs +111 -0
  719. package/lib/core/sensors/sensor-methodology-decision.cjs +131 -0
  720. package/lib/core/sensors/sensor-opportunity-harvest.cjs +195 -0
  721. package/lib/core/sensors/sensor-perspective-lock.cjs +174 -0
  722. package/lib/core/sensors/sensor-priority.cjs +183 -0
  723. package/lib/core/sensors/sensor-recency.cjs +151 -0
  724. package/lib/core/sensors/sensor-roadmap-type.cjs +421 -0
  725. package/lib/core/sensors/sensor-room-pick.cjs +238 -0
  726. package/lib/core/sensors/sensor-show-share.cjs +215 -0
  727. package/lib/core/sensors/sensor-temporal-blindness.cjs +123 -0
  728. package/lib/core/sensors/sensor-types.cjs +294 -0
  729. package/lib/core/sensors/sensor-url-ingest.cjs +234 -0
  730. package/lib/core/session-binding.cjs +208 -0
  731. package/lib/core/session-presence.cjs +404 -0
  732. package/lib/core/session-register.cjs +138 -0
  733. package/lib/core/session-state.cjs +144 -0
  734. package/lib/core/shallow-doc-parser.cjs +353 -0
  735. package/lib/core/shallow-doc-parser.test.cjs +226 -0
  736. package/lib/core/skill-activation-router.cjs +284 -0
  737. package/lib/core/skillopt-schemas.cjs +509 -0
  738. package/lib/core/stale-copy-scanner.cjs +190 -0
  739. package/lib/core/stance-state.cjs +153 -0
  740. package/lib/core/state-aware-router.cjs +78 -0
  741. package/lib/core/state-ops.cjs +80 -0
  742. package/lib/core/state-version.cjs +350 -0
  743. package/lib/core/statusline-cache.cjs +266 -0
  744. package/lib/core/statusline-liveness-gate.cjs +105 -0
  745. package/lib/core/surface-fence.cjs +127 -0
  746. package/lib/core/synthesizers/comparison-matrix.cjs +82 -0
  747. package/lib/core/synthesizers/convergence-map.cjs +107 -0
  748. package/lib/core/synthesizers/domain-hierarchy.cjs +138 -0
  749. package/lib/core/synthesizers/source-comparison.cjs +56 -0
  750. package/lib/core/synthesizers/tension-map.cjs +119 -0
  751. package/lib/core/synthetic-expert-behavior-gate.cjs +99 -0
  752. package/lib/core/synthetic-expert-construction-gate.cjs +170 -0
  753. package/lib/core/telemetry/schema.cjs +168 -0
  754. package/lib/core/telemetry/schema.test.cjs +124 -0
  755. package/lib/core/telemetry/validator.cjs +200 -0
  756. package/lib/core/telemetry/validator.test.cjs +188 -0
  757. package/lib/core/telemetry/writer.cjs +141 -0
  758. package/lib/core/telemetry/writer.test.cjs +331 -0
  759. package/lib/core/temporal/date-sync-gate.cjs +256 -0
  760. package/lib/core/temporal/date-sync-gate.test.cjs +191 -0
  761. package/lib/core/temporal/dual-stamp.cjs +172 -0
  762. package/lib/core/temporal/dual-stamp.test.cjs +172 -0
  763. package/lib/core/temporal/point-in-time.cjs +76 -0
  764. package/lib/core/temporal/point-in-time.test.cjs +169 -0
  765. package/lib/core/temporal/recency-decay.cjs +119 -0
  766. package/lib/core/temporal/recency-decay.test.cjs +140 -0
  767. package/lib/core/temporal/reference-now.cjs +281 -0
  768. package/lib/core/temporal/reference-now.test.cjs +225 -0
  769. package/lib/core/temporal/resolve-relative-time.cjs +116 -0
  770. package/lib/core/temporal/resolve-relative-time.test.cjs +138 -0
  771. package/lib/core/temporal/supersession.cjs +250 -0
  772. package/lib/core/temporal/supersession.test.cjs +103 -0
  773. package/lib/core/terminal-capability.cjs +88 -0
  774. package/lib/core/token-estimator.cjs +348 -0
  775. package/lib/core/tone-filter.cjs +147 -0
  776. package/lib/core/trending-to-absurd/orchestrator.cjs +341 -0
  777. package/lib/core/trending-to-absurd/stage7-roadmap.cjs +317 -0
  778. package/lib/core/trending-to-absurd/variance.cjs +169 -0
  779. package/lib/core/unknowns/bandit.cjs +332 -0
  780. package/lib/core/unknowns/corpus-adapter.cjs +327 -0
  781. package/lib/core/unknowns/dsp.cjs +356 -0
  782. package/lib/core/unknowns/edge-writer.cjs +211 -0
  783. package/lib/core/unknowns/iface.cjs +212 -0
  784. package/lib/core/unknowns/orchestrator.cjs +375 -0
  785. package/lib/core/unknowns/pattern-miner.cjs +214 -0
  786. package/lib/core/unknowns/rumsfeld-matrix.cjs +155 -0
  787. package/lib/core/unknowns/verdict.cjs +254 -0
  788. package/lib/core/update-path.cjs +57 -0
  789. package/lib/core/url-ingest.cjs +568 -0
  790. package/lib/core/user-archetype.cjs +284 -0
  791. package/lib/core/user-md-ops.cjs +578 -0
  792. package/lib/core/venture-shape-nudge.cjs +178 -0
  793. package/lib/core/venture-shape-nudge.test.cjs +266 -0
  794. package/lib/core/verb-reach-affinity.cjs +299 -0
  795. package/lib/core/visual-ops.cjs +692 -0
  796. package/lib/core/voice-transition-detector.cjs +125 -0
  797. package/lib/core/watched-sources.cjs +237 -0
  798. package/lib/core/write-lock.cjs +149 -0
  799. package/lib/graph/canvas-graph.js +467 -0
  800. package/lib/graph/constellation-config.cjs +299 -0
  801. package/lib/graph/graph-detail-panel.js +165 -0
  802. package/lib/hmi/ROOM.md +47 -0
  803. package/lib/hmi/across-session-memory.cjs +669 -0
  804. package/lib/hmi/agentshield-drift-gate.cjs +142 -0
  805. package/lib/hmi/brain-review-packet.cjs +221 -0
  806. package/lib/hmi/cortex-reach-adapter.cjs +271 -0
  807. package/lib/hmi/cross-room-memory.cjs +618 -0
  808. package/lib/hmi/decoy-tier.cjs +395 -0
  809. package/lib/hmi/depth-state.cjs +164 -0
  810. package/lib/hmi/dial-label-composer.cjs +410 -0
  811. package/lib/hmi/dial-presenter.cjs +508 -0
  812. package/lib/hmi/dial-reach-orchestrator.cjs +377 -0
  813. package/lib/hmi/dial-selector.cjs +239 -0
  814. package/lib/hmi/f1-pick-capture-cli.cjs +131 -0
  815. package/lib/hmi/f3-depth-capture-cli.cjs +77 -0
  816. package/lib/hmi/f4-scope-capture-cli.cjs +86 -0
  817. package/lib/hmi/f8-action-capture-cli.cjs +145 -0
  818. package/lib/hmi/f8-capture.test.cjs +77 -0
  819. package/lib/hmi/f9-ordered-capture-cli.cjs +138 -0
  820. package/lib/hmi/harvest-scope-state.cjs +202 -0
  821. package/lib/hmi/hats-persona-cache.cjs +142 -0
  822. package/lib/hmi/jtbd-classifier.cjs +219 -0
  823. package/lib/hmi/jtbd-state.cjs +263 -0
  824. package/lib/hmi/jtbd-taxonomy.json +402 -0
  825. package/lib/hmi/mindrian-ascii-logo.cjs +96 -0
  826. package/lib/hmi/part8-egress-gate.cjs +149 -0
  827. package/lib/hmi/reach-component-map.json +47 -0
  828. package/lib/hmi/reach-relevance-gate.cjs +147 -0
  829. package/lib/hmi/selector-dispatcher.cjs +1201 -0
  830. package/lib/hmi/selector-dispatcher.test.cjs +141 -0
  831. package/lib/hmi/selector-telemetry.cjs +269 -0
  832. package/lib/hmi/shape-f0-renderer.cjs +145 -0
  833. package/lib/hmi/shape-f1-fallback.cjs +80 -0
  834. package/lib/hmi/shape-f1-renderer.cjs +219 -0
  835. package/lib/hmi/shape-f2-renderer.cjs +132 -0
  836. package/lib/hmi/shape-f3-parity.test.cjs +64 -0
  837. package/lib/hmi/shape-f3-renderer.cjs +66 -0
  838. package/lib/hmi/shape-f4-parity.test.cjs +72 -0
  839. package/lib/hmi/shape-f4-renderer.cjs +72 -0
  840. package/lib/hmi/shape-f5-renderer.cjs +155 -0
  841. package/lib/hmi/shape-f6-plan-review-renderer.cjs +324 -0
  842. package/lib/hmi/shape-f6-renderer.cjs +144 -0
  843. package/lib/hmi/shape-f7-breakthrough-renderer.cjs +234 -0
  844. package/lib/hmi/shape-f7-breakthrough-renderer.test.cjs +233 -0
  845. package/lib/hmi/shape-f8-renderer.cjs +150 -0
  846. package/lib/hmi/shape-f8-renderer.test.cjs +70 -0
  847. package/lib/hmi/shape-f9-renderer.cjs +187 -0
  848. package/lib/hmi/shape-f9-renderer.test.cjs +80 -0
  849. package/lib/hmi/shape-g-renderer.cjs +219 -0
  850. package/lib/hmi/shape-h-renderer.cjs +222 -0
  851. package/lib/hmi/tier-check.cjs +63 -0
  852. package/lib/hmi/turn-text.cjs +268 -0
  853. package/lib/hmi/voice-color-mark.cjs +318 -0
  854. package/lib/hmi/voice-style-log.cjs +276 -0
  855. package/lib/import/PRECONDITIONS.md +41 -0
  856. package/lib/import/branding.cjs +210 -0
  857. package/lib/import/branding.test.cjs +235 -0
  858. package/lib/import/classifications-sync.cjs +104 -0
  859. package/lib/import/classifications-sync.test.cjs +129 -0
  860. package/lib/import/enricher.cjs +296 -0
  861. package/lib/import/enricher.test.cjs +273 -0
  862. package/lib/import/integration.test.cjs +376 -0
  863. package/lib/import/manifest.cjs +129 -0
  864. package/lib/import/manifest.schema.json +185 -0
  865. package/lib/import/manifest.test.cjs +123 -0
  866. package/lib/import/meeting-detector.cjs +92 -0
  867. package/lib/import/meeting-detector.test.cjs +100 -0
  868. package/lib/import/person-detector.cjs +229 -0
  869. package/lib/import/person-detector.test.cjs +149 -0
  870. package/lib/import/report.cjs +186 -0
  871. package/lib/import/report.test.cjs +186 -0
  872. package/lib/import/room-md-scaffolder.cjs +49 -0
  873. package/lib/import/router.cjs +224 -0
  874. package/lib/import/router.test.cjs +356 -0
  875. package/lib/import/run-all-tests.cjs +36 -0
  876. package/lib/import/smoke-test.cjs +213 -0
  877. package/lib/import/smoke-test.test.cjs +148 -0
  878. package/lib/import/undo.test.cjs +199 -0
  879. package/lib/import/vault-scanner.cjs +105 -0
  880. package/lib/import/vault-scanner.test.cjs +67 -0
  881. package/lib/lens-engine/correlation-resolver.cjs +174 -0
  882. package/lib/lens-engine/source-lens-driver.cjs +736 -0
  883. package/lib/mcp/adapter-client.cjs +103 -0
  884. package/lib/mcp/app-html/dashboard.html +316 -0
  885. package/lib/mcp/app-html/graph.html +428 -0
  886. package/lib/mcp/app-html/mindrian-platform.html +1841 -0
  887. package/lib/mcp/app-html/wiki.html +383 -0
  888. package/lib/mcp/app-views.cjs +322 -0
  889. package/lib/mcp/brain-composition-census.cjs +184 -0
  890. package/lib/mcp/brain-router.cjs +551 -0
  891. package/lib/mcp/capability-registry.cjs +62 -0
  892. package/lib/mcp/contract-version.cjs +59 -0
  893. package/lib/mcp/daemon-lifecycle.cjs +324 -0
  894. package/lib/mcp/gate-dedup.cjs +120 -0
  895. package/lib/mcp/gate-ledger.cjs +145 -0
  896. package/lib/mcp/gate-render.cjs +483 -0
  897. package/lib/mcp/hook-adapter-audit.cjs +199 -0
  898. package/lib/mcp/larry-context.cjs +42 -0
  899. package/lib/mcp/mcp-first-flag.cjs +147 -0
  900. package/lib/mcp/no-instructions.test.cjs +270 -0
  901. package/lib/mcp/pipeline-state.cjs +424 -0
  902. package/lib/mcp/prompts.cjs +421 -0
  903. package/lib/mcp/register-core-tools.cjs +78 -0
  904. package/lib/mcp/resources.cjs +359 -0
  905. package/lib/mcp/runtime-instructions.cjs +38 -0
  906. package/lib/mcp/session-catchup.cjs +349 -0
  907. package/lib/mcp/session-registry.cjs +113 -0
  908. package/lib/mcp/session-room.cjs +124 -0
  909. package/lib/mcp/sse-event-bus.cjs +98 -0
  910. package/lib/mcp/stop-gate-handler.cjs +589 -0
  911. package/lib/mcp/surface-detect.cjs +186 -0
  912. package/lib/mcp/tool-router.cjs +2115 -0
  913. package/lib/mcp/tools/chain.cjs +674 -0
  914. package/lib/mcp/tools/claim.cjs +180 -0
  915. package/lib/mcp/tools/context.cjs +92 -0
  916. package/lib/mcp/tools/dual-path.cjs +79 -0
  917. package/lib/mcp/tools/gate.cjs +392 -0
  918. package/lib/mcp/tools/graph-reason.cjs +130 -0
  919. package/lib/mcp/tools/graph.cjs +321 -0
  920. package/lib/mcp/tools/identity.cjs +174 -0
  921. package/lib/mcp/tools/room.cjs +449 -0
  922. package/lib/mcp/tools/sensors.cjs +450 -0
  923. package/lib/mcp/tools/status.cjs +183 -0
  924. package/lib/mcp/tools/stop-gate.cjs +103 -0
  925. package/lib/mcp/tools/views.cjs +382 -0
  926. package/lib/mcp/tree-watcher.cjs +199 -0
  927. package/lib/memory/.mindrian/auto-explore-mat-test-001.json +11 -0
  928. package/lib/memory/aaak-compress.cjs +403 -0
  929. package/lib/memory/aaak-compress.test.cjs +288 -0
  930. package/lib/memory/async-artifact-auto-commit.test.cjs +223 -0
  931. package/lib/memory/bearer-token.test.cjs +315 -0
  932. package/lib/memory/body-shape-coverage.test.cjs +268 -0
  933. package/lib/memory/brain-cache-lru.test.cjs +259 -0
  934. package/lib/memory/brain-client-query-shape.test.cjs +160 -0
  935. package/lib/memory/brain-cypher-chain-slice.test.cjs +368 -0
  936. package/lib/memory/brain-derivation-graceful-degradation.test.cjs +1019 -0
  937. package/lib/memory/brain-derivation-queue.test.cjs +553 -0
  938. package/lib/memory/brain-derivation.test.cjs +639 -0
  939. package/lib/memory/brain-derive-command.test.cjs +534 -0
  940. package/lib/memory/brain-derive-curation.test.cjs +243 -0
  941. package/lib/memory/brain-md-invariants-validator.test.cjs +704 -0
  942. package/lib/memory/brain-md-schema.test.cjs +467 -0
  943. package/lib/memory/brain-md-staleness.test.cjs +525 -0
  944. package/lib/memory/brain-server-resolution.test.cjs +314 -0
  945. package/lib/memory/brain-suggestion-template.test.cjs +200 -0
  946. package/lib/memory/chain-recommender-canonical.test.cjs +208 -0
  947. package/lib/memory/chain-recommender.test.cjs +233 -0
  948. package/lib/memory/chat-context.test.cjs +128 -0
  949. package/lib/memory/command-registry.test.cjs +220 -0
  950. package/lib/memory/connector-registry.test.cjs +94 -0
  951. package/lib/memory/correlation-label-index.test.cjs +119 -0
  952. package/lib/memory/correlation.test.cjs +253 -0
  953. package/lib/memory/cross-room-aggregator.test.cjs +909 -0
  954. package/lib/memory/curation-132-03-dedup-held-rename.test.cjs +251 -0
  955. package/lib/memory/curation-132-05-pseudonymize.test.cjs +205 -0
  956. package/lib/memory/curation-batch.test.cjs +213 -0
  957. package/lib/memory/dashboard-server.test.cjs +256 -0
  958. package/lib/memory/debouncer-drain-at-prompt.test.cjs +389 -0
  959. package/lib/memory/decision-capture.test.cjs +632 -0
  960. package/lib/memory/decision-capture.worker.cjs +70 -0
  961. package/lib/memory/doctor-deprecation-surface.test.cjs +188 -0
  962. package/lib/memory/dual-graph-health.test.cjs +485 -0
  963. package/lib/memory/explain-decision-command.test.cjs +521 -0
  964. package/lib/memory/explain-decision-footer.test.cjs +316 -0
  965. package/lib/memory/explored-materials-store.cjs +392 -0
  966. package/lib/memory/f-selector-ranker.test.cjs +593 -0
  967. package/lib/memory/feynman-minto-guardian.test.cjs +863 -0
  968. package/lib/memory/feynman-minto-invariants.test.cjs +554 -0
  969. package/lib/memory/feynman-prompts-drift.test.cjs +144 -0
  970. package/lib/memory/feynman-prompts.cjs +151 -0
  971. package/lib/memory/feynman-prompts.test.cjs +96 -0
  972. package/lib/memory/first-touch-version.test.cjs +198 -0
  973. package/lib/memory/folder-memory-quadruple.test.cjs +548 -0
  974. package/lib/memory/folder-memory.test.cjs +503 -0
  975. package/lib/memory/framework-chain-composer.test.cjs +549 -0
  976. package/lib/memory/frontmatter-schema-validator.test.cjs +344 -0
  977. package/lib/memory/guardian-onstop-reaches-user.test.cjs +396 -0
  978. package/lib/memory/heal-command.test.cjs +604 -0
  979. package/lib/memory/help-coverage.test.cjs +108 -0
  980. package/lib/memory/help-renderer.test.cjs +145 -0
  981. package/lib/memory/huji-run-one-async-parity.test.cjs +242 -0
  982. package/lib/memory/hypergraph-event-schema.test.cjs +116 -0
  983. package/lib/memory/index-artifact-transaction.test.cjs +333 -0
  984. package/lib/memory/lazygraph-rs-discoveries-view.test.cjs +122 -0
  985. package/lib/memory/local-chain-recommender.test.cjs +172 -0
  986. package/lib/memory/mcp-input-validation.test.cjs +240 -0
  987. package/lib/memory/mcp-server-brain-deps.test.cjs +270 -0
  988. package/lib/memory/mcp-stack-fallback.test.cjs +433 -0
  989. package/lib/memory/minto-debounce-consumer-census.test.cjs +567 -0
  990. package/lib/memory/minto-debouncer.test.cjs +407 -0
  991. package/lib/memory/minto-debouncer.worker.cjs +46 -0
  992. package/lib/memory/minto-migration-v88.test.cjs +265 -0
  993. package/lib/memory/minto-schema-v88.test.cjs +390 -0
  994. package/lib/memory/mos-status-renderer.test.cjs +631 -0
  995. package/lib/memory/narrative-schema.cjs +376 -0
  996. package/lib/memory/narrative-schema.test.cjs +209 -0
  997. package/lib/memory/nav-dial.test.cjs +414 -0
  998. package/lib/memory/navigation-engine-core.test.cjs +712 -0
  999. package/lib/memory/navigation-engine-offer.test.cjs +404 -0
  1000. package/lib/memory/navigation-hook-resolver.test.cjs +177 -0
  1001. package/lib/memory/navigation-invariants.test.cjs +483 -0
  1002. package/lib/memory/navigation-projections.test.cjs +241 -0
  1003. package/lib/memory/navigation-write-edge.test.cjs +206 -0
  1004. package/lib/memory/offer-closer.test.cjs +258 -0
  1005. package/lib/memory/offer-presenter.test.cjs +554 -0
  1006. package/lib/memory/on-stop-snapshot.test.cjs +404 -0
  1007. package/lib/memory/orchestration-projection.test.cjs +706 -0
  1008. package/lib/memory/packet-chain-hint.test.cjs +407 -0
  1009. package/lib/memory/packet-schema-validation.test.cjs +317 -0
  1010. package/lib/memory/palette-consistency.test.cjs +127 -0
  1011. package/lib/memory/pending-tension-store.cjs +453 -0
  1012. package/lib/memory/per-command-jtbd-derivation.test.cjs +130 -0
  1013. package/lib/memory/per-command-teaching.test.cjs +110 -0
  1014. package/lib/memory/post-compact-reinjection.test.cjs +854 -0
  1015. package/lib/memory/post-write-triple.test.cjs +317 -0
  1016. package/lib/memory/pre-compact-snapshot.test.cjs +495 -0
  1017. package/lib/memory/precommit-real-commit.test.cjs +301 -0
  1018. package/lib/memory/problem-type-router.test.cjs +656 -0
  1019. package/lib/memory/query-efficiency-telemetry.test.cjs +612 -0
  1020. package/lib/memory/recompile-room-references.test.cjs +392 -0
  1021. package/lib/memory/recompile-room-references.worker.cjs +42 -0
  1022. package/lib/memory/record-decision-dual-write.test.cjs +454 -0
  1023. package/lib/memory/render-v2-disposition.test.cjs +199 -0
  1024. package/lib/memory/room-classifier-strict-mode.test.cjs +430 -0
  1025. package/lib/memory/room-minto-hook.test.cjs +398 -0
  1026. package/lib/memory/rs-discovery-engine.test.cjs +323 -0
  1027. package/lib/memory/run-feynman-tests.cjs +2101 -0
  1028. package/lib/memory/security-trifecta.test.cjs +329 -0
  1029. package/lib/memory/selector-alias-map.test.cjs +172 -0
  1030. package/lib/memory/selector-decisions.test.cjs +417 -0
  1031. package/lib/memory/selector-miss.test.cjs +290 -0
  1032. package/lib/memory/session-start-brain-staleness.test.cjs +363 -0
  1033. package/lib/memory/session-start-triple-injection.test.cjs +514 -0
  1034. package/lib/memory/sessionstart-banner-formatter.cjs +318 -0
  1035. package/lib/memory/sessionstart-coordinator.test.cjs +446 -0
  1036. package/lib/memory/sessionstart-minto-banner.test.cjs +373 -0
  1037. package/lib/memory/skill-activation-router.test.cjs +465 -0
  1038. package/lib/memory/skill-vs-code-drift.test.cjs +257 -0
  1039. package/lib/memory/soft-alias.test.cjs +144 -0
  1040. package/lib/memory/spine-events-correlation.test.cjs +198 -0
  1041. package/lib/memory/stale-copy-scanner.test.cjs +294 -0
  1042. package/lib/memory/stamp-artifact-write.test.cjs +304 -0
  1043. package/lib/memory/state-aware-router.test.cjs +90 -0
  1044. package/lib/memory/statusline-active-room-write.test.cjs +245 -0
  1045. package/lib/memory/statusline-active-room.test.cjs +315 -0
  1046. package/lib/memory/statusline-minto-segment.test.cjs +292 -0
  1047. package/lib/memory/statusline-two-row.test.cjs +338 -0
  1048. package/lib/memory/suggest-next-workflow.test.cjs +176 -0
  1049. package/lib/memory/sync-async-entry-points.test.cjs +204 -0
  1050. package/lib/memory/terminal-capability.test.cjs +155 -0
  1051. package/lib/memory/test-bridge-writer-enhanced.cjs +452 -0
  1052. package/lib/memory/test-rs-brain-substrate-shape.cjs +529 -0
  1053. package/lib/memory/test-rs-brain-substrate.cjs +636 -0
  1054. package/lib/memory/test-rs-breakthrough-scorer.cjs +375 -0
  1055. package/lib/memory/test-rs-canon-violations.cjs +218 -0
  1056. package/lib/memory/test-rs-chain-feeder-core.cjs +344 -0
  1057. package/lib/memory/test-rs-chain-feeder-skill-spawn.cjs +297 -0
  1058. package/lib/memory/test-rs-commercial-assessor.cjs +385 -0
  1059. package/lib/memory/test-rs-differential-scorer.cjs +480 -0
  1060. package/lib/memory/test-rs-discovery-engine.cjs +648 -0
  1061. package/lib/memory/test-rs-domain-analyzer.cjs +492 -0
  1062. package/lib/memory/test-rs-egress-primitives.cjs +420 -0
  1063. package/lib/memory/test-rs-expert-mapper.cjs +547 -0
  1064. package/lib/memory/test-rs-explain-command.cjs +443 -0
  1065. package/lib/memory/test-rs-fetcher-academic.cjs +848 -0
  1066. package/lib/memory/test-rs-fetcher-experts.cjs +496 -0
  1067. package/lib/memory/test-rs-fetcher-industry.cjs +702 -0
  1068. package/lib/memory/test-rs-fetcher-patents.cjs +674 -0
  1069. package/lib/memory/test-rs-innovation-classifier.cjs +301 -0
  1070. package/lib/memory/test-rs-mind-map.cjs +646 -0
  1071. package/lib/memory/test-rs-neo4j-writer.cjs +518 -0
  1072. package/lib/memory/test-rs-nl-to-query.cjs +449 -0
  1073. package/lib/memory/test-rs-pinecone-bridge.cjs +282 -0
  1074. package/lib/memory/test-rs-preprocessor.cjs +433 -0
  1075. package/lib/memory/test-rs-query-matrix.cjs +391 -0
  1076. package/lib/memory/test-rs-query-to-text.cjs +551 -0
  1077. package/lib/memory/test-rs-sqlite-mirror.cjs +649 -0
  1078. package/lib/memory/test-rs-thesis-generator.cjs +360 -0
  1079. package/lib/memory/triple-context-formatter.cjs +473 -0
  1080. package/lib/memory/triple-context-formatter.test.cjs +442 -0
  1081. package/lib/memory/user-md-persona.test.cjs +565 -0
  1082. package/lib/memory/userpromptsubmit-integration.test.cjs +787 -0
  1083. package/lib/memory/validators/README.md +157 -0
  1084. package/lib/memory/validators/brain-md-invariants.cjs +475 -0
  1085. package/lib/memory/validators/brain-substrate-invariants.cjs +285 -0
  1086. package/lib/memory/validators/external-academic-invariants.cjs +249 -0
  1087. package/lib/memory/validators/external-industry-invariants.cjs +271 -0
  1088. package/lib/memory/validators/external-patents-invariants.cjs +266 -0
  1089. package/lib/memory/validators/minto-invariants.cjs +62 -0
  1090. package/lib/memory/validators/navigation-invariants.cjs +340 -0
  1091. package/lib/memory/validators/queue-health.cjs +95 -0
  1092. package/lib/memory/validators/snapshot-integrity.cjs +129 -0
  1093. package/lib/memory/validators/stale-lifecycle.cjs +116 -0
  1094. package/lib/memory/vault-section-minto-generator-atomic.test.cjs +556 -0
  1095. package/lib/memory/vault-section-minto-generator-atomic.worker.cjs +73 -0
  1096. package/lib/memory/workflow-layer-e2e.test.cjs +262 -0
  1097. package/lib/memory/write-lock-atomic.test.cjs +137 -0
  1098. package/lib/memory/write-lock-atomic.worker.cjs +55 -0
  1099. package/lib/parity/check-parity.cjs +83 -0
  1100. package/lib/presentation/presentation-server.cjs +101 -0
  1101. package/lib/presentation/presentation-watcher.cjs +123 -0
  1102. package/lib/quickview/hub-server.cjs +719 -0
  1103. package/lib/quickview/server.cjs +533 -0
  1104. package/lib/render/JTBD-PALETTES.md +145 -0
  1105. package/lib/render/ROOM.md +111 -0
  1106. package/lib/render/render-v2.cjs +532 -0
  1107. package/lib/render/render-v2.test.cjs +267 -0
  1108. package/lib/render/render.cjs +65 -0
  1109. package/lib/sessionstart/budget-compressor.cjs +130 -0
  1110. package/lib/sessionstart/contributor-interface.cjs +134 -0
  1111. package/lib/sessionstart/contributor-isolator.cjs +128 -0
  1112. package/lib/sessionstart/precedence-ladder.cjs +47 -0
  1113. package/lib/state/ROOM.md +46 -0
  1114. package/lib/state/state-md-parser.cjs +215 -0
  1115. package/lib/statusline/ROOM.md +38 -0
  1116. package/lib/statusline/banner-suppression.cjs +50 -0
  1117. package/lib/statusline/cockpit-renderer.cjs +443 -0
  1118. package/lib/statusline/cockpit-signals.cjs +312 -0
  1119. package/lib/statusline/cockpit-telemetry.cjs +152 -0
  1120. package/lib/statusline/ctx-window.cjs +135 -0
  1121. package/lib/statusline/governing-thought-truncator.cjs +45 -0
  1122. package/lib/statusline/next-move-cache.cjs +235 -0
  1123. package/lib/statusline/ratification-next.cjs +164 -0
  1124. package/lib/statusline/room-health-cache.cjs +200 -0
  1125. package/lib/statusline/surface-detect.cjs +85 -0
  1126. package/lib/statusline/two-row-renderer.cjs +207 -0
  1127. package/lib/statusline/version-resolver.cjs +81 -0
  1128. package/lib/ui/design-system.cjs +19 -0
  1129. package/lib/update-bootstrap.sh.template +145 -0
  1130. package/lib/vault/frontmatter-schema.cjs +297 -0
  1131. package/lib/vault/room-scanner.cjs +365 -0
  1132. package/lib/vault/wikilink-builder.cjs +231 -0
  1133. package/lib/vault/wikilink-builder.test.cjs +182 -0
  1134. package/lib/wiki/briefing.cjs +193 -0
  1135. package/lib/wiki/editor-dist/wiki-editor.css +1 -0
  1136. package/lib/wiki/editor-dist/wiki-editor.js +1327 -0
  1137. package/lib/wiki/graph-links.cjs +281 -0
  1138. package/lib/wiki/page-renderer.cjs +229 -0
  1139. package/lib/wiki/room-home.cjs +353 -0
  1140. package/lib/wiki/wiki-chat.cjs +81 -0
  1141. package/lib/wiki/wiki-export.cjs +364 -0
  1142. package/lib/wiki/wiki-layout.cjs +1143 -0
  1143. package/lib/wiki/wiki-search.cjs +142 -0
  1144. package/lib/wiki/wiki-server.cjs +748 -0
  1145. package/lib/wiki/wiki-watcher.cjs +105 -0
  1146. package/lib/workflow/ROOM.md +47 -0
  1147. package/lib/workflow/chain-source.cjs +179 -0
  1148. package/lib/workflow/command-resolver.cjs +155 -0
  1149. package/lib/workflow/command-resolver.test.cjs +235 -0
  1150. package/lib/workflow/cross-room-umbilical-closer.cjs +364 -0
  1151. package/lib/workflow/dial-close-reach.cjs +405 -0
  1152. package/lib/workflow/f-selector-ranker.cjs +1148 -0
  1153. package/lib/workflow/f1-pick-consumer.cjs +232 -0
  1154. package/lib/workflow/f3-depth-consumer.cjs +98 -0
  1155. package/lib/workflow/f4-scope-consumer.cjs +112 -0
  1156. package/lib/workflow/f8-consumer.test.cjs +82 -0
  1157. package/lib/workflow/f8-fanout-consumer.cjs +208 -0
  1158. package/lib/workflow/f9-consumer.test.cjs +71 -0
  1159. package/lib/workflow/f9-ordered-consumer.cjs +199 -0
  1160. package/lib/workflow/local-chain-recommender.cjs +330 -0
  1161. package/lib/workflow/memory-cascade-f9-adapter.cjs +273 -0
  1162. package/lib/workflow/memory-governance-closer.cjs +384 -0
  1163. package/lib/workflow/offer-closer.cjs +407 -0
  1164. package/lib/workflow/reach-hedge-ranker.cjs +809 -0
  1165. package/lib/workflow/reach-reject-reader.cjs +372 -0
  1166. package/lib/workflow/reconcile-f9-adapter.cjs +299 -0
  1167. package/lib/workflow/selector-decisions.cjs +478 -0
  1168. package/lib/workflow/session-binding-consumer.cjs +249 -0
  1169. package/npm-shrinkwrap.json +1544 -0
  1170. package/output-styles/destijl.md +67 -0
  1171. package/package.json +22 -4
  1172. package/pipelines/PWS_grading/01-deep-grade.md +48 -0
  1173. package/pipelines/PWS_grading/02-mullins.md +50 -0
  1174. package/pipelines/PWS_grading/03-build-thesis.md +60 -0
  1175. package/pipelines/PWS_grading/04-structure-argument.md +77 -0
  1176. package/pipelines/PWS_grading/CHAIN.md +79 -0
  1177. package/pipelines/analogy/01-decompose.md +80 -0
  1178. package/pipelines/analogy/02-abstract.md +87 -0
  1179. package/pipelines/analogy/03-search.md +135 -0
  1180. package/pipelines/analogy/04-transfer.md +101 -0
  1181. package/pipelines/analogy/05-validate.md +106 -0
  1182. package/pipelines/analogy/CHAIN.md +73 -0
  1183. package/pipelines/discovery/01-explore-domains.md +44 -0
  1184. package/pipelines/discovery/02-think-hats.md +50 -0
  1185. package/pipelines/discovery/03-analyze-needs.md +54 -0
  1186. package/pipelines/discovery/CHAIN.md +48 -0
  1187. package/pipelines/thesis/01-structure-argument.md +45 -0
  1188. package/pipelines/thesis/02-challenge-assumptions.md +48 -0
  1189. package/pipelines/thesis/03-build-thesis.md +54 -0
  1190. package/pipelines/thesis/CHAIN.md +48 -0
  1191. package/references/brain/causal-directives.md +91 -0
  1192. package/references/brain/causal-enrichment.cypher +165 -0
  1193. package/references/brain/command-triggers-schema.md +15 -0
  1194. package/references/brain/graph-architecture.md +317 -0
  1195. package/references/brain/query-patterns.md +504 -0
  1196. package/references/brain/room-hierarchy-schema.md +224 -0
  1197. package/references/brain/schema.md +86 -0
  1198. package/references/capability-radar/capabilities-index.md +269 -0
  1199. package/references/capability-radar/changelog-cache.md +95 -0
  1200. package/references/causal/causal-schema.md +103 -0
  1201. package/references/design/email-template-standard.md +169 -0
  1202. package/references/design/graph-visualization-standard.md +178 -0
  1203. package/references/design/newsletter-email-template.html +307 -0
  1204. package/references/document-generation.md +179 -0
  1205. package/references/hsi/HSI-TOOLS-REFERENCE.md +222 -0
  1206. package/references/import-config.md +141 -0
  1207. package/references/integrations/detection-patterns.md +101 -0
  1208. package/references/meeting/artifact-template.md +377 -0
  1209. package/references/meeting/cross-meeting-intelligence.md +216 -0
  1210. package/references/meeting/cross-relationship-patterns.md +202 -0
  1211. package/references/meeting/extraction-perspectives.md +225 -0
  1212. package/references/meeting/filing-protocol.md +222 -0
  1213. package/references/meeting/knowledge-typing.md +242 -0
  1214. package/references/meeting/live-join-interface.md +244 -0
  1215. package/references/meeting/section-mapping.md +192 -0
  1216. package/references/meeting/segment-classification.md +258 -0
  1217. package/references/meeting/speaker-profile-template.md +219 -0
  1218. package/references/meeting/summary-template.md +348 -0
  1219. package/references/meeting/transcript-patterns.md +226 -0
  1220. package/references/methodology/analyze-needs.md +135 -0
  1221. package/references/methodology/analyze-systems.md +121 -0
  1222. package/references/methodology/analyze-timing.md +149 -0
  1223. package/references/methodology/beautiful-question.md +109 -0
  1224. package/references/methodology/build-knowledge.md +161 -0
  1225. package/references/methodology/build-thesis-scored.md +60 -0
  1226. package/references/methodology/build-thesis.md +237 -0
  1227. package/references/methodology/causal-loop-diagrams.md +65 -0
  1228. package/references/methodology/challenge-assumptions.md +127 -0
  1229. package/references/methodology/diagnose.md +169 -0
  1230. package/references/methodology/dominant-designs.md +212 -0
  1231. package/references/methodology/explore-domains.md +147 -0
  1232. package/references/methodology/explore-futures.md +163 -0
  1233. package/references/methodology/explore-trends.md +129 -0
  1234. package/references/methodology/find-bottlenecks.md +131 -0
  1235. package/references/methodology/grade.md +211 -0
  1236. package/references/methodology/huji-stage-a-intake.md +246 -0
  1237. package/references/methodology/index.md +34 -0
  1238. package/references/methodology/leadership.md +200 -0
  1239. package/references/methodology/lean-canvas.md +116 -0
  1240. package/references/methodology/leverage-scan-signatures.md +83 -0
  1241. package/references/methodology/macro-trends.md +192 -0
  1242. package/references/methodology/map-unknowns.md +137 -0
  1243. package/references/methodology/mullins-7-domains.md +104 -0
  1244. package/references/methodology/problem-types.md +65 -0
  1245. package/references/methodology/root-cause.md +178 -0
  1246. package/references/methodology/rubric-huji.md +160 -0
  1247. package/references/methodology/sapphire-encoding.md +355 -0
  1248. package/references/methodology/scenario-plan.md +190 -0
  1249. package/references/methodology/score-innovation.md +154 -0
  1250. package/references/methodology/skillopt-judge-rubric.md +48 -0
  1251. package/references/methodology/skillopt-queries-rubric.md +60 -0
  1252. package/references/methodology/skillopt-refute-rubric.md +59 -0
  1253. package/references/methodology/skillopt-review-rubric.md +72 -0
  1254. package/references/methodology/skillopt-revise-rubric.md +48 -0
  1255. package/references/methodology/structure-argument.md +158 -0
  1256. package/references/methodology/systems-thinking.md +231 -0
  1257. package/references/methodology/think-hats.md +147 -0
  1258. package/references/methodology/triz-matrix.json +751 -0
  1259. package/references/methodology/triz-principles.md +501 -0
  1260. package/references/methodology/user-needs.md +199 -0
  1261. package/references/methodology/validate.md +163 -0
  1262. package/references/methodology/value-proposition.md +244 -0
  1263. package/references/opportunities/funding-lifecycle.md +103 -0
  1264. package/references/opportunities/grant-api-patterns.md +99 -0
  1265. package/references/opportunities/opportunity-template.md +84 -0
  1266. package/references/opportunities/tnufa-rubric.md +81 -0
  1267. package/references/personality/assessment-philosophy.md +72 -0
  1268. package/references/personality/lexicon.md +100 -0
  1269. package/references/personality/persona-chains.md +56 -0
  1270. package/references/personality/pws-lexicon-full.md +499 -0
  1271. package/references/personality/voice-dna.md +156 -0
  1272. package/references/personas/hat-perspectives.md +76 -0
  1273. package/references/personas/persona-template.md +63 -0
  1274. package/references/pipeline/act-output-contract.md +88 -0
  1275. package/references/pipeline/chains-index.md +39 -0
  1276. package/references/pws-profile-generation.md +79 -0
  1277. package/references/reasoning/reasoning-schema.md +143 -0
  1278. package/references/reasoning/reasoning-template.md +68 -0
  1279. package/references/reasoning/run-template.md +38 -0
  1280. package/references/research/RESEARCH_14_CLAUDE_CODE_SOURCE_ARCHITECTURE.md +209 -0
  1281. package/references/research/RESEARCH_15_V1.8_OPTIMIZATION_JTBD.md +375 -0
  1282. package/references/research/RESEARCH_16_NATIVE_FIRST_PLUGIN_ARCHITECTURE.md +575 -0
  1283. package/references/research/RESEARCH_17_MCP_UI_FRAMEWORKS.md +272 -0
  1284. package/references/security/agentshield-baseline.json +8 -0
  1285. package/references/security/cve-db.json +220 -0
  1286. package/references/taxonomy/TAXONOMY.md +192 -0
  1287. package/references/templates/MINTO.md +36 -0
  1288. package/references/user-research/2026-04-05-leah-lawrence-session.md +202 -0
  1289. package/references/vault-kit/README.md +35 -0
  1290. package/references/vault-kit/app.json +12 -0
  1291. package/references/vault-kit/appearance.json +12 -0
  1292. package/references/vault-kit/graph.json +35 -0
  1293. package/references/vault-kit/snippets/mindrian-destijl.css +297 -0
  1294. package/references/vault-kit/templates/new-artifact.md +37 -0
  1295. package/references/vault-kit/templates/new-meeting-note.md +35 -0
  1296. package/references/vault-kit/templates/new-team-profile.md +29 -0
  1297. package/references/vault-kit/templates/new-xref.md +35 -0
  1298. package/references/visual/ROOM.md +55 -0
  1299. package/references/visual/palette.json +54 -0
  1300. package/references/visual/symbol-system.md +151 -0
  1301. package/scripts/189-plurai-gate-check.cjs +88 -0
  1302. package/scripts/198-plurai-gate-check.cjs +118 -0
  1303. package/scripts/198-rollback-rehearsal.cjs +233 -0
  1304. package/scripts/83-scope-injection.test.cjs +648 -0
  1305. package/scripts/PYTHON_GATES.md +78 -0
  1306. package/scripts/__pycache__/compute-hsi.cpython-312.pyc +0 -0
  1307. package/scripts/__pycache__/detect-reverse-salients.cpython-312.pyc +0 -0
  1308. package/scripts/__pycache__/rs-engine.cpython-312.pyc +0 -0
  1309. package/scripts/act-command.cjs +518 -0
  1310. package/scripts/admin-brain-write.cjs +442 -0
  1311. package/scripts/admin-command-gate.cjs +178 -0
  1312. package/scripts/agentshield-scan-cli.cjs +226 -0
  1313. package/scripts/agentshield-sessionstart-scan.cjs +282 -0
  1314. package/scripts/analogy-fitness-report.cjs +266 -0
  1315. package/scripts/analyze-room +1079 -0
  1316. package/scripts/apply-teaching-content.cjs +298 -0
  1317. package/scripts/async-artifact-auto-commit.cjs +485 -0
  1318. package/scripts/audit-active-phase-resolver.cjs +160 -0
  1319. package/scripts/audit-body-shape-coverage.cjs +213 -0
  1320. package/scripts/auto-explore-drain.cjs +274 -0
  1321. package/scripts/auto-explore-fingerprint.cjs +354 -0
  1322. package/scripts/auto-explore-fire.cjs +359 -0
  1323. package/scripts/backfill-correlation-id.cjs +425 -0
  1324. package/scripts/backfill-hitl-shape.cjs +276 -0
  1325. package/scripts/backfill-hitl-shape.test.cjs +307 -0
  1326. package/scripts/backup-modifications +68 -0
  1327. package/scripts/banner +182 -0
  1328. package/scripts/brain-derivation-drain.cjs +291 -0
  1329. package/scripts/brain-derive-command.cjs +846 -0
  1330. package/scripts/brain-normalize-books.cypher +505 -0
  1331. package/scripts/brain-normalize-final.cypher +1355 -0
  1332. package/scripts/brain-normalize-problemtype.cypher +475 -0
  1333. package/scripts/brain-normalize-supplement.cypher +449 -0
  1334. package/scripts/brain-normalize-targeted.cypher +344 -0
  1335. package/scripts/brain-normalize-v194.cypher +61 -0
  1336. package/scripts/brain-normalize.cypher +530 -0
  1337. package/scripts/brain-response-sanitize-hook.cjs +165 -0
  1338. package/scripts/build-brain-census.cjs +957 -0
  1339. package/scripts/build-brain-packet-schema.cjs +225 -0
  1340. package/scripts/build-command-registry.cjs +587 -0
  1341. package/scripts/build-connector-registry.cjs +1331 -0
  1342. package/scripts/build-corpus-stats.cjs +408 -0
  1343. package/scripts/build-dist-bundles.cjs +495 -0
  1344. package/scripts/build-ecosystem-graph.cjs +490 -0
  1345. package/scripts/build-graph +1462 -0
  1346. package/scripts/build-graph-from-sqlite.cjs +97 -0
  1347. package/scripts/build-harness-manifest.cjs +1090 -0
  1348. package/scripts/build-jtbd-nudges +205 -0
  1349. package/scripts/build-new-surface.cjs +805 -0
  1350. package/scripts/build-orchestration-projection.cjs +1221 -0
  1351. package/scripts/build-render-coverage.cjs +637 -0
  1352. package/scripts/build-skill-mirrors.cjs +681 -0
  1353. package/scripts/cache-hitrate-report.cjs +216 -0
  1354. package/scripts/causal-to-graph.cjs +163 -0
  1355. package/scripts/check-abstraction-fixture-neutral.cjs +160 -0
  1356. package/scripts/check-admin-identity.cjs +212 -0
  1357. package/scripts/check-brain-tool-liveness.cjs +502 -0
  1358. package/scripts/check-card-fire.cjs +1809 -0
  1359. package/scripts/check-cirs-declaration.cjs +279 -0
  1360. package/scripts/check-deck-design.cjs +104 -0
  1361. package/scripts/check-dual-graph-health.cjs +645 -0
  1362. package/scripts/check-first-touch-drift.cjs +220 -0
  1363. package/scripts/check-flagship-floor.cjs +391 -0
  1364. package/scripts/check-framework-vocabulary-drift.cjs +563 -0
  1365. package/scripts/check-gate-seam.cjs +178 -0
  1366. package/scripts/check-graph-derive-health.cjs +208 -0
  1367. package/scripts/check-graph-export-typemap.cjs +118 -0
  1368. package/scripts/check-help-coverage.cjs +290 -0
  1369. package/scripts/check-hitl-stages.cjs +219 -0
  1370. package/scripts/check-hook-schema-compatibility.cjs +231 -0
  1371. package/scripts/check-hsi-deps +42 -0
  1372. package/scripts/check-kuzu-reintroduction.cjs +251 -0
  1373. package/scripts/check-onboard +43 -0
  1374. package/scripts/check-onboard-statusline.cjs +363 -0
  1375. package/scripts/check-palette-consistency.cjs +106 -0
  1376. package/scripts/check-pending-ambiguous.cjs +244 -0
  1377. package/scripts/check-pending-breakthrough.cjs +189 -0
  1378. package/scripts/check-pending-breakthrough.test.cjs +166 -0
  1379. package/scripts/check-pending-naming-decision.cjs +97 -0
  1380. package/scripts/check-plugin-path-anchoring.cjs +830 -0
  1381. package/scripts/check-publish-needs.cjs +126 -0
  1382. package/scripts/check-registry-drift.cjs +206 -0
  1383. package/scripts/check-release-payload-ceiling.cjs +269 -0
  1384. package/scripts/check-render-coverage.cjs +558 -0
  1385. package/scripts/check-research-isomorphism.cjs +446 -0
  1386. package/scripts/check-reward-before-investment.cjs +261 -0
  1387. package/scripts/check-room-blueprints.cjs +213 -0
  1388. package/scripts/check-schema-aliases.cjs +532 -0
  1389. package/scripts/check-shape-declaration.cjs +958 -0
  1390. package/scripts/check-shape-declaration.test.cjs +185 -0
  1391. package/scripts/check-skill-spec.cjs +312 -0
  1392. package/scripts/check-skill-vs-code-drift.cjs +178 -0
  1393. package/scripts/check-substrate.cjs +513 -0
  1394. package/scripts/check-tool-honesty.cjs +1601 -0
  1395. package/scripts/check-update +60 -0
  1396. package/scripts/check-version-and-sha.cjs +366 -0
  1397. package/scripts/check-voice-style.cjs +184 -0
  1398. package/scripts/check-worktree-hygiene.cjs +530 -0
  1399. package/scripts/classify-insight +59 -0
  1400. package/scripts/coherence-smoke-test.cjs +489 -0
  1401. package/scripts/collect-cold-install-evidence.cjs +411 -0
  1402. package/scripts/compute-bayesian-surprise.py +175 -0
  1403. package/scripts/compute-blindspot-mass.py +209 -0
  1404. package/scripts/compute-disruption-index.py +211 -0
  1405. package/scripts/compute-element-novelty.py +254 -0
  1406. package/scripts/compute-external-whitespace.py +563 -0
  1407. package/scripts/compute-hsi.py +947 -0
  1408. package/scripts/compute-meetings-intelligence +716 -0
  1409. package/scripts/compute-opportunity-state +17 -0
  1410. package/scripts/compute-state +393 -0
  1411. package/scripts/compute-team +1112 -0
  1412. package/scripts/compute-whitespace-embeddings.py +464 -0
  1413. package/scripts/compute-whitespace-gaps.py +562 -0
  1414. package/scripts/compute_topic_forest.py +684 -0
  1415. package/scripts/consolidate-pinecone.py +265 -0
  1416. package/scripts/context-monitor +943 -0
  1417. package/scripts/create-speaker-profile +311 -0
  1418. package/scripts/cross-room-detect.cjs +195 -0
  1419. package/scripts/csv-to-idea-graph.cjs +755 -0
  1420. package/scripts/ctxl-eval.cjs +846 -0
  1421. package/scripts/curation-132-03-dedup-held-rename.cjs +395 -0
  1422. package/scripts/curation-132-05-pseudonymize.cjs +189 -0
  1423. package/scripts/derive-verb-reach-affinity.cjs +507 -0
  1424. package/scripts/detect-reverse-salients.py +242 -0
  1425. package/scripts/diagnostics-command.cjs +345 -0
  1426. package/scripts/dial-memory-refresh-command.cjs +147 -0
  1427. package/scripts/discover-analogy-whitespace.py +433 -0
  1428. package/scripts/discover-hsi-whitespace.py +352 -0
  1429. package/scripts/discover-rs-whitespace.py +327 -0
  1430. package/scripts/discovery-cycle.cjs +625 -0
  1431. package/scripts/disposition-render-v2.cjs +229 -0
  1432. package/scripts/doctor-preflight-format.cjs +101 -0
  1433. package/scripts/doctor.cjs +4327 -0
  1434. package/scripts/dogfood-bridge/append-to-queue.sh +59 -0
  1435. package/scripts/dogfood-bridge/path-filter.cjs +86 -0
  1436. package/scripts/dogfood-derive.cjs +158 -0
  1437. package/scripts/dogfood-emit.cjs +126 -0
  1438. package/scripts/empathy-observation-emit.cjs +108 -0
  1439. package/scripts/enrichment-queue-append.cjs +157 -0
  1440. package/scripts/ensure-brain-baseline.cjs +117 -0
  1441. package/scripts/entity-extract.cjs +1135 -0
  1442. package/scripts/eureka-command.cjs +687 -0
  1443. package/scripts/eureka-critic-run.cjs +662 -0
  1444. package/scripts/eureka-portfolio-report.cjs +2038 -0
  1445. package/scripts/eureka-room-report.cjs +419 -0
  1446. package/scripts/explain-decision-command.cjs +499 -0
  1447. package/scripts/export-pinecone-embeddings.cjs +516 -0
  1448. package/scripts/extract-room-intelligence.cjs +714 -0
  1449. package/scripts/fetch-brain-baseline.cjs +190 -0
  1450. package/scripts/fetch-brain-baseline.py +360 -0
  1451. package/scripts/feynman-minto-guardian.cjs +672 -0
  1452. package/scripts/feynman-timeline-refresh-command.cjs +270 -0
  1453. package/scripts/file-asset +253 -0
  1454. package/scripts/fire-sensor-event.cjs +83 -0
  1455. package/scripts/first-install-router.cjs +968 -0
  1456. package/scripts/frontmatter-schema-validator.cjs +339 -0
  1457. package/scripts/fts-index-drain.cjs +221 -0
  1458. package/scripts/generate-chat-embed.cjs +179 -0
  1459. package/scripts/generate-deck.cjs +322 -0
  1460. package/scripts/generate-export.cjs +474 -0
  1461. package/scripts/generate-hub.cjs +2553 -0
  1462. package/scripts/generate-lobby.cjs +718 -0
  1463. package/scripts/generate-presentation.cjs +988 -0
  1464. package/scripts/generate-presentation.test.cjs +405 -0
  1465. package/scripts/generate-section-intelligence.cjs +330 -0
  1466. package/scripts/generate-snapshot.cjs +1410 -0
  1467. package/scripts/generate-standalone +159 -0
  1468. package/scripts/git-ops +211 -0
  1469. package/scripts/graph-heal-pipeline.cjs +321 -0
  1470. package/scripts/gsd-artifact-graph-hook.cjs +219 -0
  1471. package/scripts/gsd-graph-derive-drain.cjs +571 -0
  1472. package/scripts/gsd-graph-derive-sweep.cjs +195 -0
  1473. package/scripts/heal-command.cjs +1365 -0
  1474. package/scripts/hedge-refit-pipeline.cjs +207 -0
  1475. package/scripts/help-renderer.cjs +303 -0
  1476. package/scripts/hmi-compliance-poll.cjs +451 -0
  1477. package/scripts/hmi-status-command.cjs +510 -0
  1478. package/scripts/hooked-rescore-117.cjs +224 -0
  1479. package/scripts/hooks/pre-commit +533 -0
  1480. package/scripts/hooks/pre-commit-room-minto-guard.cmd +43 -0
  1481. package/scripts/hooks/pre-commit-room-minto-guard.sh +533 -0
  1482. package/scripts/hsi-to-graph.cjs +194 -0
  1483. package/scripts/huji-batch.cjs +821 -0
  1484. package/scripts/huji-eval.cjs +1158 -0
  1485. package/scripts/huji-intake.cjs +563 -0
  1486. package/scripts/huji-pin-smoketest.cjs +454 -0
  1487. package/scripts/huji-run-one-async.cjs +305 -0
  1488. package/scripts/huji-run-one.cjs +671 -0
  1489. package/scripts/install-pre-commit.sh +113 -0
  1490. package/scripts/intent-classifier +106 -0
  1491. package/scripts/intent-classifier.cjs +3620 -0
  1492. package/scripts/interpret-whitespace.cjs +691 -0
  1493. package/scripts/jtbd-command.cjs +810 -0
  1494. package/scripts/jtbd-update.cjs +299 -0
  1495. package/scripts/label-topic-forest.cjs +667 -0
  1496. package/scripts/learn-from-usage +168 -0
  1497. package/scripts/lib/__pycache__/ensure_ml_deps.cpython-312.pyc +0 -0
  1498. package/scripts/lib/ensure_ml_deps.py +97 -0
  1499. package/scripts/load-embeddings-into-neo4j.cjs +569 -0
  1500. package/scripts/memory-artifact-graph-hook.cjs +191 -0
  1501. package/scripts/memory-command.cjs +687 -0
  1502. package/scripts/memory-completion-detector.cjs +217 -0
  1503. package/scripts/memory-lifecycle.cjs +620 -0
  1504. package/scripts/memory-resume-nudge.cjs +233 -0
  1505. package/scripts/methodology-ingest-local.sh +36 -0
  1506. package/scripts/migrate-brain-mcp-from-http-to-stdio.cjs +190 -0
  1507. package/scripts/migrate-brain-mcp-from-http-to-stdio.test.cjs +242 -0
  1508. package/scripts/migrate-hats-to-roomdb.cjs +217 -0
  1509. package/scripts/migrate-lazygraph.cjs +250 -0
  1510. package/scripts/migrate-minto-schema-v88.cjs +296 -0
  1511. package/scripts/migrate-plugin-root-refs.cjs +168 -0
  1512. package/scripts/migrate-room-sections-v275.cjs +556 -0
  1513. package/scripts/migrate-rooms +417 -0
  1514. package/scripts/migrate-skill-frontmatter.cjs +472 -0
  1515. package/scripts/migrate-stale-user-settings.cjs +296 -0
  1516. package/scripts/migrate-telemetry-v1.cjs +384 -0
  1517. package/scripts/migrate-telemetry-v1.test.cjs +356 -0
  1518. package/scripts/minto-debouncer.cjs +428 -0
  1519. package/scripts/mos-status.cjs +622 -0
  1520. package/scripts/mva-detect.cjs +229 -0
  1521. package/scripts/mva-run.cjs +36 -0
  1522. package/scripts/on-agent-complete +163 -0
  1523. package/scripts/on-cwd-changed +149 -0
  1524. package/scripts/on-file-changed +68 -0
  1525. package/scripts/on-stop +617 -0
  1526. package/scripts/on-task-complete +194 -0
  1527. package/scripts/operator-command.cjs +858 -0
  1528. package/scripts/operator-update.cjs +308 -0
  1529. package/scripts/part8-egress-guard-hook.cjs +229 -0
  1530. package/scripts/pipeline-command.cjs +271 -0
  1531. package/scripts/post-compact +383 -0
  1532. package/scripts/post-update-activation.cjs +339 -0
  1533. package/scripts/post-write +283 -0
  1534. package/scripts/power-demo-prompt.md +621 -0
  1535. package/scripts/pre-compact +273 -0
  1536. package/scripts/preflight-auto-explore.cjs +314 -0
  1537. package/scripts/preflight-doctor.cjs +225 -0
  1538. package/scripts/preflight-release-drift.cjs +168 -0
  1539. package/scripts/preflight-tension-surface.cjs +414 -0
  1540. package/scripts/probe-brain-contract.cjs +502 -0
  1541. package/scripts/publish-ops +346 -0
  1542. package/scripts/query-efficiency-telemetry.cjs +364 -0
  1543. package/scripts/query-semantic-scholar.cjs +545 -0
  1544. package/scripts/reapply-modifications +49 -0
  1545. package/scripts/reassign-primary.cjs +125 -0
  1546. package/scripts/recompile-room-references.cjs +601 -0
  1547. package/scripts/release-beta-preflight.sh +69 -0
  1548. package/scripts/render-pdf +588 -0
  1549. package/scripts/render-viz +190 -0
  1550. package/scripts/research-speaker +239 -0
  1551. package/scripts/resolve-room +204 -0
  1552. package/scripts/restore-post-compact-context.cjs +320 -0
  1553. package/scripts/room-auto-create-nudge.cjs +136 -0
  1554. package/scripts/room-naming-selector.cjs +201 -0
  1555. package/scripts/room-registry +767 -0
  1556. package/scripts/rs-discovery-engine.cjs +725 -0
  1557. package/scripts/rs-engine.py +2073 -0
  1558. package/scripts/rs-experts-command.cjs +300 -0
  1559. package/scripts/rs-explain-command.cjs +323 -0
  1560. package/scripts/rs-fetch-command.cjs +170 -0
  1561. package/scripts/rs-thesis-command.cjs +203 -0
  1562. package/scripts/rs-vector-bridge.cjs +410 -0
  1563. package/scripts/run-harness.cjs +890 -0
  1564. package/scripts/scout-cadence-guard.cjs +323 -0
  1565. package/scripts/scout-cadence-runner.cjs +509 -0
  1566. package/scripts/scout-telemetry-aggregator.cjs +268 -0
  1567. package/scripts/sealed-walker.py +96 -0
  1568. package/scripts/seed-brain-commands.cjs +324 -0
  1569. package/scripts/self-update +105 -0
  1570. package/scripts/sentinel-deadline-monitor +241 -0
  1571. package/scripts/sentinel-health-check +198 -0
  1572. package/scripts/sentinel-snapshot +42 -0
  1573. package/scripts/serve-dashboard +103 -0
  1574. package/scripts/serve-dashboard-live +932 -0
  1575. package/scripts/serve-presentation +97 -0
  1576. package/scripts/serve-wiki +90 -0
  1577. package/scripts/session-end-presence.cjs +79 -0
  1578. package/scripts/session-start +1943 -0
  1579. package/scripts/sessionstart-coordinator.cjs +249 -0
  1580. package/scripts/sessionstart-npm-reconcile.cjs +111 -0
  1581. package/scripts/sessionstart-post-update-preflight.cjs +303 -0
  1582. package/scripts/sessionstart-reference-now-seed.cjs +137 -0
  1583. package/scripts/setup-hooks.sh +112 -0
  1584. package/scripts/skillopt-codereview.cjs +830 -0
  1585. package/scripts/skillopt-eval.cjs +519 -0
  1586. package/scripts/skillopt-funnel.cjs +1076 -0
  1587. package/scripts/skillopt-genqueries.cjs +571 -0
  1588. package/scripts/skillopt-inventory.cjs +319 -0
  1589. package/scripts/skillopt-merge.cjs +656 -0
  1590. package/scripts/skillopt-triggerloop.cjs +1126 -0
  1591. package/scripts/soft-alias-runner.cjs +116 -0
  1592. package/scripts/stamp-artifact-write.cjs +276 -0
  1593. package/scripts/stamp-firing-block.cjs +325 -0
  1594. package/scripts/state-write.cjs +97 -0
  1595. package/scripts/statusline-fallback-echo.cjs +297 -0
  1596. package/scripts/statusline-mos +116 -0
  1597. package/scripts/statusline-mos-dispatch +127 -0
  1598. package/scripts/suggest-next-command.cjs +416 -0
  1599. package/scripts/sweep-skill-descriptions.cjs +263 -0
  1600. package/scripts/sync-rooms-graph +264 -0
  1601. package/scripts/telemetry-command-invocation.cjs +120 -0
  1602. package/scripts/test-doctor-recovery.cjs +242 -0
  1603. package/scripts/test-fresh-install.md +140 -0
  1604. package/scripts/track-analytics +156 -0
  1605. package/scripts/transcribe-audio +148 -0
  1606. package/scripts/transcript-ingest.cjs +225 -0
  1607. package/scripts/update-icm-index +153 -0
  1608. package/scripts/v182-brain-optimize.cypher +1191 -0
  1609. package/scripts/validate-model-profiles +93 -0
  1610. package/scripts/vault-content-reformatter.cjs +581 -0
  1611. package/scripts/vault-export-orchestrator.cjs +400 -0
  1612. package/scripts/vault-footer-injector.cjs +315 -0
  1613. package/scripts/vault-import.cjs +839 -0
  1614. package/scripts/vault-integration-test.cjs +318 -0
  1615. package/scripts/vault-regenerate-all.cjs +216 -0
  1616. package/scripts/vault-regenerate-all.test.cjs +138 -0
  1617. package/scripts/vault-rules-generator.cjs +220 -0
  1618. package/scripts/vault-section-minto-generator.cjs +1642 -0
  1619. package/scripts/vault-section-minto-generator.integration.test.cjs +576 -0
  1620. package/scripts/vault-section-minto-generator.test.cjs +291 -0
  1621. package/scripts/vault-section-state-generator.cjs +385 -0
  1622. package/scripts/vault-welcome-generator.cjs +403 -0
  1623. package/scripts/vault-wikilink-injector.cjs +449 -0
  1624. package/scripts/verify-phase-132.cjs +338 -0
  1625. package/scripts/verify-release +744 -0
  1626. package/scripts/whitespace-command.cjs +831 -0
  1627. package/scripts/whitespace-to-brain.cjs +384 -0
  1628. package/scripts/whitespace-to-graph.cjs +220 -0
  1629. package/scripts/wikilink-batch.cjs +102 -0
  1630. package/scripts/wikilink-file.cjs +139 -0
  1631. package/scripts/write-bridge-artifacts.cjs +140 -0
  1632. package/scripts/write-scope-check +12 -0
  1633. package/scripts/write-scope-check.cjs +461 -0
  1634. package/scripts/write-whitespace-sections.cjs +483 -0
  1635. package/settings.json +7 -0
  1636. package/skills/act/SKILL.md +523 -0
  1637. package/skills/admin/SKILL.md +437 -0
  1638. package/skills/agentshield/SKILL.md +50 -0
  1639. package/skills/analyze-needs/SKILL.md +74 -0
  1640. package/skills/analyze-systems/SKILL.md +69 -0
  1641. package/skills/analyze-timing/SKILL.md +94 -0
  1642. package/skills/auto-explore/SKILL.md +84 -0
  1643. package/skills/beautiful-question/SKILL.md +72 -0
  1644. package/skills/bono/SKILL.md +146 -0
  1645. package/skills/brain-connector/SKILL.md +206 -0
  1646. package/skills/brain-derive/SKILL.md +140 -0
  1647. package/skills/build-knowledge/SKILL.md +118 -0
  1648. package/skills/build-thesis/SKILL.md +90 -0
  1649. package/skills/causal/SKILL.md +265 -0
  1650. package/skills/challenge-assumptions/SKILL.md +74 -0
  1651. package/skills/client-discovery-interview/SKILL.md +94 -0
  1652. package/skills/client-discovery-interview/discovery-scaffold.json +41 -0
  1653. package/skills/client-discovery-interview/question-bank.md +149 -0
  1654. package/skills/compare-ventures/SKILL.md +113 -0
  1655. package/skills/context-engine/SKILL.md +169 -0
  1656. package/skills/conversation-mode/SKILL.md +189 -0
  1657. package/skills/correct-reference-now/SKILL.md +86 -0
  1658. package/skills/dashboard/SKILL.md +142 -0
  1659. package/skills/deck/SKILL.md +113 -0
  1660. package/skills/deep-grade/SKILL.md +210 -0
  1661. package/skills/diagnose/SKILL.md +128 -0
  1662. package/skills/diagnostics/SKILL.md +193 -0
  1663. package/skills/dial-memory-refresh/SKILL.md +116 -0
  1664. package/skills/diffusion/SKILL.md +125 -0
  1665. package/skills/discover/SKILL.md +216 -0
  1666. package/skills/doctor/SKILL.md +269 -0
  1667. package/skills/dogfood-flush/SKILL.md +133 -0
  1668. package/skills/dominant-designs/SKILL.md +72 -0
  1669. package/skills/eureka/SKILL.md +313 -0
  1670. package/skills/explain-decision/SKILL.md +138 -0
  1671. package/skills/explore-domains/SKILL.md +74 -0
  1672. package/skills/explore-futures/SKILL.md +64 -0
  1673. package/skills/explore-opportunity/SKILL.md +168 -0
  1674. package/skills/explore-trends/SKILL.md +74 -0
  1675. package/skills/export/SKILL.md +126 -0
  1676. package/skills/feynman-timeline-refresh/SKILL.md +105 -0
  1677. package/skills/file-meeting/SKILL.md +1190 -0
  1678. package/skills/find-analogies/SKILL.md +360 -0
  1679. package/skills/find-bottlenecks/SKILL.md +104 -0
  1680. package/skills/find-connections/SKILL.md +108 -0
  1681. package/skills/funding/SKILL.md +110 -0
  1682. package/skills/futures/SKILL.md +124 -0
  1683. package/skills/grade/SKILL.md +252 -0
  1684. package/skills/grade-grant/SKILL.md +293 -0
  1685. package/skills/graph/SKILL.md +216 -0
  1686. package/skills/hat-briefing/SKILL.md +160 -0
  1687. package/skills/heal/SKILL.md +69 -0
  1688. package/skills/help/SKILL.md +172 -0
  1689. package/skills/hmi-status/SKILL.md +73 -0
  1690. package/skills/ignite/SKILL.md +225 -0
  1691. package/skills/ingest-methodology/SKILL.md +125 -0
  1692. package/skills/intel-pipeline/SKILL.md +128 -0
  1693. package/skills/intelligence-orchestrator/SKILL.md +262 -0
  1694. package/skills/jtbd/SKILL.md +261 -0
  1695. package/skills/larry-personality/SKILL.md +571 -0
  1696. package/skills/larry-personality/framework-chains.md +92 -0
  1697. package/skills/larry-personality/mode-engine.md +185 -0
  1698. package/skills/leadership/SKILL.md +109 -0
  1699. package/skills/lean-canvas/SKILL.md +70 -0
  1700. package/skills/macro-trends/SKILL.md +84 -0
  1701. package/skills/map-unknowns/SKILL.md +72 -0
  1702. package/skills/memory/SKILL.md +212 -0
  1703. package/skills/memory-cortex-reach/SKILL.md +80 -0
  1704. package/skills/models/SKILL.md +197 -0
  1705. package/skills/mos/SKILL.md +160 -0
  1706. package/skills/mos-deck-engine/SKILL.md +329 -0
  1707. package/skills/mos-reason/SKILL.md +484 -0
  1708. package/skills/mullins/SKILL.md +151 -0
  1709. package/skills/mullins-scaffold/SKILL.md +132 -0
  1710. package/skills/mullins-scaffold/scaffold.json +223 -0
  1711. package/skills/mva-brief/SKILL.md +87 -0
  1712. package/skills/mva-option/SKILL.md +120 -0
  1713. package/skills/mva-pipeline/SKILL.md +158 -0
  1714. package/skills/mva-report/SKILL.md +79 -0
  1715. package/skills/new-project/SKILL.md +629 -0
  1716. package/skills/new-surface/SKILL.md +112 -0
  1717. package/skills/onboard/SKILL.md +485 -0
  1718. package/skills/operator/SKILL.md +167 -0
  1719. package/skills/opportunities/SKILL.md +171 -0
  1720. package/skills/organize/SKILL.md +69 -0
  1721. package/skills/persona/SKILL.md +272 -0
  1722. package/skills/pipeline/SKILL.md +164 -0
  1723. package/skills/present/SKILL.md +123 -0
  1724. package/skills/publish/SKILL.md +224 -0
  1725. package/skills/pws-brain/SKILL.md +152 -0
  1726. package/skills/pws-methodology/SKILL.md +92 -0
  1727. package/skills/qualify-opportunity/SKILL.md +111 -0
  1728. package/skills/query/SKILL.md +68 -0
  1729. package/skills/radar/SKILL.md +106 -0
  1730. package/skills/reanalyze/SKILL.md +122 -0
  1731. package/skills/research/SKILL.md +462 -0
  1732. package/skills/room/SKILL.md +381 -0
  1733. package/skills/room-passive/SKILL.md +174 -0
  1734. package/skills/room-proactive/SKILL.md +344 -0
  1735. package/skills/rooms/SKILL.md +678 -0
  1736. package/skills/root-cause/SKILL.md +73 -0
  1737. package/skills/rs-experts/SKILL.md +151 -0
  1738. package/skills/rs-explain/SKILL.md +130 -0
  1739. package/skills/rs-fetch/SKILL.md +115 -0
  1740. package/skills/rs-thesis/SKILL.md +129 -0
  1741. package/skills/scenario-plan/SKILL.md +76 -0
  1742. package/skills/scheduled-tasks/SKILL.md +301 -0
  1743. package/skills/score-innovation/SKILL.md +74 -0
  1744. package/skills/scout/SKILL.md +370 -0
  1745. package/skills/setup/SKILL.md +654 -0
  1746. package/skills/show/SKILL.md +68 -0
  1747. package/skills/skill/SKILL.md +104 -0
  1748. package/skills/snapshot/SKILL.md +178 -0
  1749. package/skills/speakers/SKILL.md +116 -0
  1750. package/skills/splash/SKILL.md +54 -0
  1751. package/skills/stance/SKILL.md +89 -0
  1752. package/skills/status/SKILL.md +107 -0
  1753. package/skills/structure-argument/SKILL.md +78 -0
  1754. package/skills/suggest-next/SKILL.md +137 -0
  1755. package/skills/systems-thinking/SKILL.md +220 -0
  1756. package/skills/think-hats/SKILL.md +82 -0
  1757. package/skills/trending-to-absurd/SKILL.md +100 -0
  1758. package/skills/ui-system/SKILL.md +474 -0
  1759. package/skills/ui-system/design-system/M-OS-DESIGN-SYSTEM.md +273 -0
  1760. package/skills/ui-system/design-system/SPEC.md +72 -0
  1761. package/skills/ui-system/design-system/image-prompt-style.md +29 -0
  1762. package/skills/ui-system/design-system/mos-design-system.css +240 -0
  1763. package/skills/ui-system/rules/design-system.md +60 -0
  1764. package/skills/ui-system/rules/dual-palette.md +156 -0
  1765. package/skills/ui-system/rules/glyph-disambiguation.md +171 -0
  1766. package/skills/ui-system/rules/shape-f-zero-and-six.md +169 -0
  1767. package/skills/update/SKILL.md +254 -0
  1768. package/skills/user-needs/SKILL.md +73 -0
  1769. package/skills/validate/SKILL.md +73 -0
  1770. package/skills/value-proposition/SKILL.md +141 -0
  1771. package/skills/vault/SKILL.md +326 -0
  1772. package/skills/visualize/SKILL.md +69 -0
  1773. package/skills/whitespace/SKILL.md +539 -0
  1774. package/skills/wiki/SKILL.md +94 -0
  1775. package/templates/_base.html +20 -0
  1776. package/templates/chat-panel.html +205 -0
  1777. package/templates/constellation-chat-hooks.js +89 -0
  1778. package/templates/constellation.html +1272 -0
  1779. package/templates/destijl-base.css +268 -0
  1780. package/templates/discovery/discovery-brief-template.md +97 -0
  1781. package/templates/due-diligence.html +49 -0
  1782. package/templates/executive-summary.html +40 -0
  1783. package/templates/icm/CLAUDE.md +31 -0
  1784. package/templates/icm/GROUP-CLAUDE.md +33 -0
  1785. package/templates/icm/INDEX.md +26 -0
  1786. package/templates/import/stage-contracts/01-ingest.md +34 -0
  1787. package/templates/import/stage-contracts/02-classify.md +48 -0
  1788. package/templates/import/stage-contracts/03-route.md +42 -0
  1789. package/templates/import/stage-contracts/04-enrich.md +40 -0
  1790. package/templates/investment-thesis.html +25 -0
  1791. package/templates/meeting-report.html +361 -0
  1792. package/templates/presentation/dashboard.html +1150 -0
  1793. package/templates/presentation/deck.html +540 -0
  1794. package/templates/presentation/diagrams.html +437 -0
  1795. package/templates/presentation/graph.html +391 -0
  1796. package/templates/presentation/insights.html +548 -0
  1797. package/templates/presentation/wiki.html +533 -0
  1798. package/templates/profile.html +136 -0
  1799. package/templates/room-context/last-session.md +56 -0
  1800. package/templates/room-context/methodology-history.md +28 -0
  1801. package/templates/room-context/rejection-log.md +25 -0
  1802. package/templates/room-context/weekly-digest.md +54 -0
  1803. package/templates/room-skeleton/MINTO.md.tmpl +19 -0
  1804. package/templates/room-skeleton/ROOM.md.identity.tmpl +13 -0
  1805. package/templates/room-skeleton/ROOM.md.section.tmpl +33 -0
  1806. package/templates/room-skeleton/STATE.md.tmpl +33 -0
  1807. package/templates/room-skeleton/USER.md.tmpl +23 -0
  1808. package/templates/room-skeleton/references/.gitkeep +0 -0
  1809. package/templates/room-skeleton/references/SECTION-SCHEMA.md +213 -0
  1810. package/templates/room-skeleton/references/SUB-SCHEMAS.md +91 -0
  1811. package/templates/room-skeleton/section-contracts/.gitkeep +0 -0
  1812. package/templates/room-skeleton/section-contracts/business-model.md +32 -0
  1813. package/templates/room-skeleton/section-contracts/competitive-analysis.md +33 -0
  1814. package/templates/room-skeleton/section-contracts/financial-model.md +30 -0
  1815. package/templates/room-skeleton/section-contracts/funding.md +41 -0
  1816. package/templates/room-skeleton/section-contracts/legal-ip.md +30 -0
  1817. package/templates/room-skeleton/section-contracts/market-analysis.md +32 -0
  1818. package/templates/room-skeleton/section-contracts/opportunity-bank.md +39 -0
  1819. package/templates/room-skeleton/section-contracts/problem-definition.md +32 -0
  1820. package/templates/room-skeleton/section-contracts/solution-design.md +36 -0
  1821. package/templates/room-skeleton/section-contracts/strategy.md +35 -0
  1822. package/templates/room-skeleton/section-contracts/team-execution.md +36 -0
  1823. package/templates/shared.css +427 -0
  1824. package/templates/showcase/blueprint.html +432 -0
  1825. package/templates/showcase/library.html +571 -0
  1826. package/templates/showcase/narrative.html +361 -0
  1827. package/templates/showcase/overview.html +468 -0
  1828. package/templates/showcase/synthesis.html +473 -0
  1829. package/templates/signature-footer.html +34 -0
@@ -0,0 +1,1076 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+ /*
4
+ * scripts/skillopt-funnel.cjs - Phase 230-02, WS1.3-4: the cheap roster-wide judge funnel.
5
+ * ==========================================================================
6
+ * ONE isolated headless subagent judges ONE eval query against the FULL 124-skill
7
+ * roster (name + description stubs ONLY, never bodies - the exact bytes progressive
8
+ * disclosure shows). This is the pipeline's cost-defining move: ~800-1,000 sonnet
9
+ * calls at fleet scale instead of agentskills.io's ~7,500-call literal per-skill
10
+ * loop. Only FLAGGED skills escalate to the expensive real trigger-test (Plan 03).
11
+ *
12
+ * The flag rule is the locked CONTEXT.md Rigor decision, verbatim: a skill is
13
+ * FLAGGED when any TRAIN-split query has predicted_skill !== expected_skill, OR any
14
+ * of its verdicts has confidence 'low' or 'medium'. Fail OPEN toward scrutiny - a
15
+ * low-confidence judgment never counts as a silent pass. Validation-split queries
16
+ * are judged too, but they NEVER drive description revision; they exist for Plan
17
+ * 03's do-no-harm gate.
18
+ *
19
+ * No silent skip (D5 / CFM3): a spawn error, nonzero exit, timeout, empty envelope,
20
+ * or safeParse failure - after ONE retry - is recorded as a UnitRecord status
21
+ * 'not_evaluated' with its reason, NEVER counted as a pass. The D5 identity
22
+ * spawned === ok + not_evaluated MUST hold or the script exits 1.
23
+ *
24
+ * Fan-out uses runPool (copied verbatim from huji-batch.cjs:200-229) with getLimit
25
+ * re-read each iteration and hard-capped at 4 (clamp + warn on higher - Pitfall 5).
26
+ * Resume via a .done sentinel per unit. Write-path containment via assertUnderOut.
27
+ * CJS only, switch-case argv router, no em-dashes.
28
+ */
29
+
30
+ const fs = require('node:fs');
31
+ const path = require('node:path');
32
+ const { spawnSync } = require('node:child_process');
33
+
34
+ const {
35
+ JudgeVerdictSchema,
36
+ UnitRecordSchema,
37
+ NOT_EVALUATED_REASONS,
38
+ PHASE_OUT_DIR,
39
+ inlineSchemaJson,
40
+ assertUnderOut,
41
+ assertPinnedModelId,
42
+ } = require('../lib/core/skillopt-schemas.cjs');
43
+
44
+ const REPO_ROOT = path.resolve(__dirname, '..');
45
+
46
+ // The pinned FULL sonnet id, copied verbatim from the huji-eval.cjs judge config
47
+ // (JUDGE_MODEL default 'claude-sonnet-4-5'). assertPinnedModelId preflights it.
48
+ const PINNED_SONNET = 'claude-sonnet-4-5';
49
+
50
+ // The frozen judge instruction (stable bytes = prompt-cache bite across ~1,000 calls).
51
+ const JUDGE_RUBRIC_PATH = path.join('references', 'methodology', 'skillopt-judge-rubric.md');
52
+
53
+ const DEFAULT_CONCURRENCY = 3;
54
+ const HARD_CAP_CONCURRENCY = 4; // Pitfall 5: never above 4 (429-storm guard)
55
+
56
+ // --------------------------------------------------------------------------
57
+ // writeAtomic - write-temp-then-rename (copied from huji-batch.writeAtomic:60-64).
58
+ // --------------------------------------------------------------------------
59
+ function writeAtomic(filePath, contents) {
60
+ const tmp = filePath + '.tmp.' + process.pid + '.' + Math.random().toString(36).slice(2, 10);
61
+ fs.writeFileSync(tmp, contents, 'utf8');
62
+ fs.renameSync(tmp, filePath);
63
+ }
64
+
65
+ // Resume predicate: a unit is done if its .done idempotency marker exists on disk
66
+ // (huji-batch.isDone:83-86 shape, sentinel-only variant).
67
+ function isDone(unitsDir, unitId) {
68
+ return fs.existsSync(path.join(unitsDir, safeStem(unitId) + '.done'));
69
+ }
70
+
71
+ // Collapse whitespace (incl. newlines) so a roster stub is exactly one line.
72
+ function oneLine(s) {
73
+ return String(s == null ? '' : s).replace(/\s+/g, ' ').trim();
74
+ }
75
+
76
+ function safeStem(name) {
77
+ return String(name || '').replace(/[^A-Za-z0-9._-]/g, '_');
78
+ }
79
+
80
+ // --------------------------------------------------------------------------
81
+ // runPool - dependency-free bounded concurrency pool. Copied VERBATIM from
82
+ // huji-batch.cjs:200-229. getLimit re-read every iteration so a clamp takes effect
83
+ // at once. Never an unbounded parallel-all over units (429 storm, Pitfall 5).
84
+ // --------------------------------------------------------------------------
85
+ async function runPool({ items, getLimit, worker, onSettle }) {
86
+ let idx = 0;
87
+ const running = [];
88
+ const results = [];
89
+ const limitNow = () => Math.max(0, getLimit());
90
+ while (idx < items.length || running.length > 0) {
91
+ while (idx < items.length && running.length < limitNow()) {
92
+ const item = items[idx++];
93
+ const entry = { done: false };
94
+ entry.promise = (async () => {
95
+ try { entry.settled = { item, res: await worker(item) }; }
96
+ catch (err) { entry.settled = { item, err }; }
97
+ entry.done = true;
98
+ return entry.settled;
99
+ })();
100
+ running.push(entry);
101
+ }
102
+ if (running.length === 0) break; // halted to 0 with nothing in flight
103
+ await Promise.race(running.map((e) => e.promise));
104
+ for (let i = running.length - 1; i >= 0; i--) {
105
+ if (running[i].done) {
106
+ const settled = running[i].settled;
107
+ results.push(settled);
108
+ running.splice(i, 1);
109
+ if (onSettle) onSettle(settled);
110
+ }
111
+ }
112
+ }
113
+ return results;
114
+ }
115
+
116
+ // --------------------------------------------------------------------------
117
+ // resolveFunnelConfig - defaults; clamp concurrency to the hard cap (warn once).
118
+ // --------------------------------------------------------------------------
119
+ function resolveFunnelConfig(config) {
120
+ const c = config || {};
121
+ let concurrency = typeof c.concurrency === 'number' && c.concurrency > 0 ? c.concurrency : DEFAULT_CONCURRENCY;
122
+ let clamped = false;
123
+ if (concurrency > HARD_CAP_CONCURRENCY) { concurrency = HARD_CAP_CONCURRENCY; clamped = true; }
124
+ return {
125
+ model: c.model || PINNED_SONNET,
126
+ pluginDir: c.pluginDir || REPO_ROOT,
127
+ judgeRubricPath: c.judgeRubricPath || JUDGE_RUBRIC_PATH,
128
+ budgetPerQueryUsd: typeof c.budgetPerQueryUsd === 'number' ? c.budgetPerQueryUsd : 0.05,
129
+ timeoutMs: typeof c.timeoutMs === 'number' ? c.timeoutMs : 120000,
130
+ concurrency,
131
+ concurrencyClamped: clamped,
132
+ };
133
+ }
134
+
135
+ // --------------------------------------------------------------------------
136
+ // buildRosterStubs(inventory) - 'name: description' lines for ALL records (never
137
+ // bodies - AI-SPEC Context Window Strategy). Even a smoke-scoped run judges against
138
+ // the FULL roster; only the evaluated query set shrinks. Exactly one line per record.
139
+ // --------------------------------------------------------------------------
140
+ function buildRosterStubs(inventory) {
141
+ const recs = Array.isArray(inventory) ? inventory : [];
142
+ return recs.map((r) => r.skill + ': ' + oneLine(r.description)).join('\n');
143
+ }
144
+
145
+ // --------------------------------------------------------------------------
146
+ // buildJudgePrompt - the per-unit -p variable: the full roster + one query + the
147
+ // expected label. The frozen instruction lives in --append-system-prompt-file.
148
+ // --------------------------------------------------------------------------
149
+ function buildJudgePrompt(rosterText, query, expected) {
150
+ const lines = [
151
+ 'FULL SKILL ROSTER (name: description, one per line):',
152
+ rosterText,
153
+ '',
154
+ 'USER QUERY: ' + query,
155
+ '',
156
+ 'EXPECTED LABEL (for scoring only, do not let it bias your prediction): ' +
157
+ (expected === null || expected === undefined ? 'null' : String(expected)),
158
+ '',
159
+ 'Predict which ONE skill fires, or null. Return only the JSON the schema describes.',
160
+ ];
161
+ return lines.join('\n');
162
+ }
163
+
164
+ // --------------------------------------------------------------------------
165
+ // buildJudgeArgs - the judge spawn arg array (AI-SPEC Section 3 reference shape).
166
+ // --------------------------------------------------------------------------
167
+ function buildJudgeArgs(rosterText, query, expected, config) {
168
+ const cfg = resolveFunnelConfig(config);
169
+ return [
170
+ '-p', buildJudgePrompt(rosterText, query, expected),
171
+ '--append-system-prompt-file', cfg.judgeRubricPath,
172
+ '--plugin-dir', cfg.pluginDir, // keychain auth, NEVER --bare (Pitfall 4)
173
+ '--model', cfg.model, // pinned full sonnet id
174
+ '--output-format', 'json',
175
+ '--json-schema', inlineSchemaJson(JudgeVerdictSchema), // INLINE, $schema stripped (Pitfalls 2-3)
176
+ '--allowedTools', 'Read',
177
+ '--max-turns', '2',
178
+ '--max-budget-usd', String(cfg.budgetPerQueryUsd),
179
+ '--permission-mode', 'dontAsk',
180
+ '--no-session-persistence', // hermetic; never --continue/--resume
181
+ ];
182
+ }
183
+
184
+ // --------------------------------------------------------------------------
185
+ // parseEnvelope - unwrap the --output-format json envelope. Copied near-verbatim
186
+ // from huji-run-one.cjs:311-337 (structured_output first, then result, then {...}).
187
+ // --------------------------------------------------------------------------
188
+ function parseEnvelope(stdout) {
189
+ const out = { envelope: null, structured: null };
190
+ if (!stdout) return out;
191
+ let env = null;
192
+ try { env = JSON.parse(String(stdout)); } catch (_e) { env = null; }
193
+ if (env && typeof env === 'object') {
194
+ out.envelope = env;
195
+ if (env.structured_output && typeof env.structured_output === 'object') {
196
+ out.structured = env.structured_output;
197
+ return out;
198
+ }
199
+ if (typeof env.result === 'string') {
200
+ try { out.structured = JSON.parse(env.result); return out; } catch (_e) { /* fall through */ }
201
+ const m = env.result.match(/\{[\s\S]*\}/);
202
+ if (m) { try { out.structured = JSON.parse(m[0]); return out; } catch (_e2) { /* ignore */ } }
203
+ }
204
+ return out;
205
+ }
206
+ const m = String(stdout).match(/\{[\s\S]*\}/);
207
+ if (m) { try { out.structured = JSON.parse(m[0]); } catch (_e) { /* ignore */ } }
208
+ return out;
209
+ }
210
+
211
+ // --------------------------------------------------------------------------
212
+ // defaultSpawn(args, timeoutMs) - the real spawnSync with all fuses. The selftest
213
+ // injects a fake in its place so it spends zero budget.
214
+ // --------------------------------------------------------------------------
215
+ function defaultSpawn(args, timeoutMs) {
216
+ return spawnSync('claude', args, {
217
+ env: process.env, encoding: 'utf8', maxBuffer: 8 * 1024 * 1024, timeout: timeoutMs,
218
+ });
219
+ }
220
+
221
+ // --------------------------------------------------------------------------
222
+ // judgeOneQuery({ query, expected, rosterText, config, spawnImpl, timeoutOverrideMs })
223
+ // - one isolated judge spawn. Unwraps via parseEnvelope, double-validates with
224
+ // JudgeVerdictSchema.safeParse (belt + suspenders). Returns { ok, verdict, env,
225
+ // reason, exit }. A failure reason is drawn from the closed vocabulary.
226
+ // --------------------------------------------------------------------------
227
+ function judgeOneQuery(opts) {
228
+ const o = opts || {};
229
+ const cfg = resolveFunnelConfig(o.config);
230
+ const spawn = o.spawnImpl || defaultSpawn;
231
+ const timeoutMs = typeof o.timeoutOverrideMs === 'number' ? o.timeoutOverrideMs : cfg.timeoutMs;
232
+
233
+ const args = buildJudgeArgs(o.rosterText, o.query, o.expected, cfg);
234
+ const res = spawn(args, timeoutMs);
235
+
236
+ if (!res || res.error) {
237
+ if (res && (res.signal === 'SIGTERM' || (res.error && /timed? ?out|ETIMEDOUT/i.test(String(res.error.message))))) {
238
+ return { ok: false, reason: 'timeout', env: null, exit: null };
239
+ }
240
+ return { ok: false, reason: 'spawn_failed', env: null, exit: null };
241
+ }
242
+ if (res.signal === 'SIGTERM') return { ok: false, reason: 'timeout', env: null, exit: null };
243
+ if (typeof res.status === 'number' && res.status !== 0) {
244
+ return { ok: false, reason: 'nonzero_exit', env: null, exit: res.status };
245
+ }
246
+ const parsed = parseEnvelope(res.stdout);
247
+ if (!parsed.structured || typeof parsed.structured !== 'object') {
248
+ return { ok: false, reason: 'empty_envelope', env: parsed.envelope, exit: res.status || 0 };
249
+ }
250
+ // Force the expected label onto the verdict so scoring never depends on the model
251
+ // echoing it back correctly; the model's job is predicted_skill + confidence.
252
+ const raw = Object.assign({}, parsed.structured, {
253
+ query: o.query,
254
+ expected_skill: o.expected === undefined ? null : o.expected,
255
+ });
256
+ const v = JudgeVerdictSchema.safeParse(raw);
257
+ if (!v.success) return { ok: false, reason: 'schema_fail', env: parsed.envelope, exit: res.status || 0, issues: v.error.issues };
258
+ return { ok: true, verdict: v.data, env: parsed.envelope, exit: res.status || 0 };
259
+ }
260
+
261
+ // --------------------------------------------------------------------------
262
+ // makeUnitRecord - build (and validate) a funnel UnitRecord for one query.
263
+ // --------------------------------------------------------------------------
264
+ function makeUnitRecord(o) {
265
+ const env = o.env || {};
266
+ const rec = {
267
+ unit_id: o.unitId,
268
+ kind: 'funnel',
269
+ model: o.model,
270
+ session_id: typeof env.session_id === 'string' ? env.session_id : null,
271
+ total_cost_usd: typeof env.total_cost_usd === 'number' ? env.total_cost_usd : null,
272
+ exit: typeof o.exit === 'number' ? o.exit : null,
273
+ status: o.status,
274
+ not_evaluated_reason: o.reason || null,
275
+ error_issues: o.issues || null,
276
+ payload: o.payload != null ? o.payload : null,
277
+ };
278
+ const parsed = UnitRecordSchema.safeParse(rec);
279
+ if (!parsed.success) {
280
+ throw new Error('skillopt-funnel: internal UnitRecord invalid: ' + JSON.stringify(parsed.error.issues));
281
+ }
282
+ return rec;
283
+ }
284
+
285
+ // --------------------------------------------------------------------------
286
+ // enumerateQueries(queriesDir, skillsFilter) - flatten every out/queries/*.json
287
+ // (EvalQuerySet) into per-query work items. skillsFilter (a Set) narrows which
288
+ // skills are evaluated; the roster judged against is ALWAYS the full inventory.
289
+ // --------------------------------------------------------------------------
290
+ function enumerateQueries(queriesDir, skillsFilter) {
291
+ const items = [];
292
+ let files = [];
293
+ try { files = fs.readdirSync(queriesDir).filter((f) => f.endsWith('.json')); } catch (_e) { files = []; }
294
+ files.sort();
295
+ for (const f of files) {
296
+ let set = null;
297
+ try { set = JSON.parse(fs.readFileSync(path.join(queriesDir, f), 'utf8')); } catch (_e) { continue; }
298
+ if (!set || !Array.isArray(set.queries)) continue;
299
+ if (skillsFilter && skillsFilter.size > 0 && !skillsFilter.has(set.skill)) continue;
300
+ set.queries.forEach((q, i) => {
301
+ items.push({
302
+ skill: set.skill,
303
+ family: set.family,
304
+ index: i,
305
+ query: q.query,
306
+ expected_skill: q.expected_skill === undefined ? null : q.expected_skill,
307
+ split: q.split,
308
+ kind: q.kind,
309
+ unit_id: 'funnel-' + safeStem(set.skill) + '-' + i,
310
+ });
311
+ });
312
+ }
313
+ return items;
314
+ }
315
+
316
+ // --------------------------------------------------------------------------
317
+ // normalizeQueryText(s) - the ENTIRE normalization surface for the null-negative
318
+ // reconciliation pass (CONTEXT.md D-02): collapse whitespace runs to one space,
319
+ // trim, then lowercase. Reuses the existing oneLine helper (never a second
320
+ // whitespace collapser). Anything beyond whitespace and case - punctuation
321
+ // stripping, stemming, token reordering, any semantic or fuzzy similarity - is
322
+ // exactly the fuzzy matching D-02 forbids.
323
+ // --------------------------------------------------------------------------
324
+ function normalizeQueryText(s) {
325
+ return oneLine(s).toLowerCase();
326
+ }
327
+
328
+ // --------------------------------------------------------------------------
329
+ // buildPositiveIndex(items) - Map<normalizedQueryText, Set<expected_skill>>,
330
+ // built from every should_trigger item carrying a non-empty string
331
+ // expected_skill. Pure, no I/O. This is the roster-wide collision surface the
332
+ // null-negative reconciliation pass matches against; callers MUST build it from
333
+ // the FULL unfiltered item array (Finding 3) so a --skills scoped run still sees
334
+ // positives owned by skills outside its scope.
335
+ // --------------------------------------------------------------------------
336
+ function buildPositiveIndex(items) {
337
+ const index = new Map();
338
+ for (const item of Array.isArray(items) ? items : []) {
339
+ if (!item || item.kind !== 'should_trigger') continue;
340
+ if (typeof item.expected_skill !== 'string') continue;
341
+ const skill = item.expected_skill.trim();
342
+ if (!skill) continue;
343
+ const key = normalizeQueryText(item.query);
344
+ if (!index.has(key)) index.set(key, new Set());
345
+ index.get(key).add(skill);
346
+ }
347
+ return index;
348
+ }
349
+
350
+ // --------------------------------------------------------------------------
351
+ // reconcileNullNegatives(items, index) - D-02 exact-match correction pass. Pure
352
+ // and synchronous; returns a NEW items array and never mutates an input item.
353
+ // Rule table (applied per item, in this order):
354
+ // kind !== 'should_not_trigger' -> pass through unchanged
355
+ // expected_skill != null -> pass through unchanged (already labeled)
356
+ // no index hit for the normalized text -> pass through, push to remaining_null
357
+ // every candidate equals item.skill -> pass through, push to remaining_null
358
+ // exactly one foreign candidate -> corrected copy, push to corrections
359
+ // two+ distinct foreign candidates -> pass through, push to ambiguous AND remaining_null
360
+ // "Foreign candidate" = a candidate skill strictly different from item.skill.
361
+ // Candidate lists are sorted before use so output ordering is deterministic.
362
+ // --------------------------------------------------------------------------
363
+ function reconcileNullNegatives(items, index) {
364
+ const list = Array.isArray(items) ? items : [];
365
+ const idx = index instanceof Map ? index : new Map();
366
+ const outItems = [];
367
+ const corrections = [];
368
+ const ambiguous = [];
369
+ const remaining_null = [];
370
+
371
+ for (const item of list) {
372
+ if (!item || item.kind !== 'should_not_trigger') { outItems.push(item); continue; }
373
+ if (item.expected_skill != null) { outItems.push(item); continue; }
374
+
375
+ const key = normalizeQueryText(item.query);
376
+ const candidates = idx.get(key);
377
+ if (!candidates || candidates.size === 0) {
378
+ outItems.push(item);
379
+ remaining_null.push({ skill: item.skill, unit_id: item.unit_id, query: item.query });
380
+ continue;
381
+ }
382
+
383
+ const foreign = Array.from(candidates).filter((c) => c !== item.skill).sort();
384
+ if (foreign.length === 0) {
385
+ outItems.push(item);
386
+ remaining_null.push({ skill: item.skill, unit_id: item.unit_id, query: item.query });
387
+ } else if (foreign.length === 1) {
388
+ outItems.push(Object.assign({}, item, { expected_skill: foreign[0] }));
389
+ corrections.push({ unit_id: item.unit_id, skill: item.skill, query: item.query, corrected_to: foreign[0] });
390
+ } else {
391
+ outItems.push(item);
392
+ ambiguous.push({ skill: item.skill, unit_id: item.unit_id, query: item.query, candidates: foreign });
393
+ remaining_null.push({ skill: item.skill, unit_id: item.unit_id, query: item.query });
394
+ }
395
+ }
396
+
397
+ return { items: outItems, corrections, ambiguous, remaining_null };
398
+ }
399
+
400
+ // --------------------------------------------------------------------------
401
+ // classifySkills(units) - apply the locked flag rule per skill and build the
402
+ // per-skill funnel-results rows. units = array of { item, unit, verdict? }.
403
+ // verdict 'not_evaluated' iff the skill has zero ok units.
404
+ // else 'flagged' iff any TRAIN query missed (predicted !== expected), OR any
405
+ // verdict is low/medium confidence, OR any unit is not_evaluated (fail open).
406
+ // else 'pass'.
407
+ // --------------------------------------------------------------------------
408
+ function classifySkills(units) {
409
+ const bySkill = new Map();
410
+ for (const u of units) {
411
+ if (!bySkill.has(u.item.skill)) bySkill.set(u.item.skill, []);
412
+ bySkill.get(u.item.skill).push(u);
413
+ }
414
+ const rows = [];
415
+ for (const [skill, us] of bySkill) {
416
+ const okUnits = us.filter((u) => u.unit.status === 'ok');
417
+ const notEvalUnits = us.filter((u) => u.unit.status === 'not_evaluated');
418
+ const unit_ids = us.map((u) => u.unit.unit_id).sort();
419
+ let train_miss_count = 0;
420
+ let low_conf_count = 0;
421
+ for (const u of okUnits) {
422
+ const v = u.verdict;
423
+ if (u.item.split === 'train' && v && v.predicted_skill !== v.expected_skill) train_miss_count += 1;
424
+ if (v && (v.confidence === 'low' || v.confidence === 'medium')) low_conf_count += 1;
425
+ }
426
+ let verdict;
427
+ if (okUnits.length === 0) {
428
+ verdict = 'not_evaluated';
429
+ } else if (train_miss_count > 0 || low_conf_count > 0 || notEvalUnits.length > 0) {
430
+ verdict = 'flagged';
431
+ } else {
432
+ verdict = 'pass';
433
+ }
434
+ rows.push({ skill, verdict, train_miss_count, low_conf_count, not_evaluated_count: notEvalUnits.length, unit_ids });
435
+ }
436
+ rows.sort((a, b) => (a.skill < b.skill ? -1 : a.skill > b.skill ? 1 : 0));
437
+ return rows;
438
+ }
439
+
440
+ // --------------------------------------------------------------------------
441
+ // runFunnel({ inventory, queriesDir, config, outDir, spawnImpl, skills,
442
+ // probeTimeoutUnit, probeMark, _injectReconcileDrift }) - the roster-wide funnel.
443
+ // Returns { results, reconciliation, reconcileOk, concurrency }. Does NOT call
444
+ // process.exit (testable); main() enforces the D5 identity with exit 1.
445
+ // --------------------------------------------------------------------------
446
+ async function runFunnel(opts) {
447
+ const o = opts || {};
448
+ const cfg = resolveFunnelConfig(o.config);
449
+ const outDir = o.outDir || path.join(REPO_ROOT, PHASE_OUT_DIR);
450
+ const queriesDir = o.queriesDir || path.join(outDir, 'queries');
451
+ const unitsDir = path.join(outDir, 'funnel', 'units');
452
+ const spawn = o.spawnImpl || defaultSpawn;
453
+
454
+ const preflight = assertPinnedModelId(cfg.model);
455
+ if (!preflight.ok) throw new Error('skillopt-funnel: model not pinned (' + preflight.reason + '): ' + cfg.model);
456
+ if (cfg.concurrencyClamped) {
457
+ console.error('WARN skillopt-funnel: concurrency clamped to the hard cap of ' + HARD_CAP_CONCURRENCY + ' (429-storm guard).');
458
+ }
459
+
460
+ const rosterText = buildRosterStubs(o.inventory || []);
461
+ const skillsFilter = o.skills && o.skills.length ? new Set(o.skills) : null;
462
+ // Finding 3: enumerate UNFILTERED and build the positive index from the FULL
463
+ // roster-wide array, then apply the caller's skill scope AFTER indexing. A
464
+ // --skills scoped smoke run would otherwise be blind to positives owned by
465
+ // skills outside the filter, which is where most of the collision surface
466
+ // lives. enumerateQueries's own signature and filter behavior stay unchanged
467
+ // so no other caller regresses.
468
+ const allItems = enumerateQueries(queriesDir, null);
469
+ const positiveIndex = buildPositiveIndex(allItems);
470
+ const scopedItems = skillsFilter ? allItems.filter((it) => skillsFilter.has(it.skill)) : allItems;
471
+ const labelReconciliation = reconcileNullNegatives(scopedItems, positiveIndex);
472
+ const items = labelReconciliation.items;
473
+
474
+ fs.mkdirSync(unitsDir, { recursive: true });
475
+
476
+ // Track which skill's first unit is the induced-timeout probe target (D5).
477
+ const probeSkill = o.probeTimeoutUnit || null;
478
+ const probeFiredForSkill = new Set();
479
+
480
+ // Independent reconciliation counters (so a drift is a real, catchable violation).
481
+ let spawnedCount = 0;
482
+ let okCount = 0;
483
+ let notEvalCount = 0;
484
+
485
+ const units = []; // { item, unit, verdict? }
486
+
487
+ const worker = async (item) => {
488
+ // Resume: a .done sentinel means this unit already settled in a prior run.
489
+ if (isDone(unitsDir, item.unit_id)) {
490
+ let prior = null;
491
+ try { prior = JSON.parse(fs.readFileSync(path.join(unitsDir, safeStem(item.unit_id) + '.json'), 'utf8')); } catch (_e) { prior = null; }
492
+ return { item, resumed: true, unit: prior };
493
+ }
494
+
495
+ // Induced not-evaluated probe (Plan 07 D5 hook): force a 1ms timeout on this
496
+ // skill's FIRST unit; it must land not_evaluated, reason 'timeout' (or
497
+ // 'induced_probe' when --probe-mark is set).
498
+ let timeoutOverrideMs;
499
+ let isProbe = false;
500
+ if (probeSkill && item.skill === probeSkill && !probeFiredForSkill.has(item.skill)) {
501
+ probeFiredForSkill.add(item.skill);
502
+ timeoutOverrideMs = 1;
503
+ isProbe = true;
504
+ }
505
+
506
+ // Attempt + ONE retry on any failure (skip the retry for the induced probe -
507
+ // its whole point is to land not_evaluated).
508
+ let jr = judgeOneQuery({ query: item.query, expected: item.expected_skill, rosterText, config: cfg, spawnImpl: spawn, timeoutOverrideMs });
509
+ if (!jr.ok && !isProbe) {
510
+ jr = judgeOneQuery({ query: item.query, expected: item.expected_skill, rosterText, config: cfg, spawnImpl: spawn, timeoutOverrideMs });
511
+ }
512
+ return { item, resumed: false, jr, isProbe };
513
+ };
514
+
515
+ const onSettle = (settled) => {
516
+ const res = settled.res;
517
+ if (!res) return; // worker threw (shouldn't; judgeOneQuery is total)
518
+ if (res.resumed) {
519
+ // Prior unit: classify from disk, do NOT count as a fresh spawn.
520
+ const unit = res.unit && UnitRecordSchema.safeParse(res.unit).success ? res.unit : null;
521
+ if (unit) {
522
+ if (unit.status === 'ok') okCount += 1; else notEvalCount += 1;
523
+ spawnedCount += 1;
524
+ // Finding 5: the persisted unit.payload's expected_skill is whatever label
525
+ // the PRIOR run used, which can be a stale null the current reconciliation
526
+ // has since corrected. Force the CURRENT (reconciled) item label onto the
527
+ // resumed verdict for scoring, mirroring the invariant judgeOneQuery already
528
+ // documents above ("Force the expected label onto the verdict..."). The
529
+ // persisted unit JSON on disk is NEVER rewritten; this override is in
530
+ // memory only, for scoring in THIS run.
531
+ let verdict = unit.payload || null;
532
+ if (verdict) {
533
+ verdict = Object.assign({}, verdict, {
534
+ expected_skill: res.item.expected_skill === undefined ? null : res.item.expected_skill,
535
+ });
536
+ }
537
+ units.push({ item: res.item, unit, verdict });
538
+ }
539
+ return;
540
+ }
541
+ spawnedCount += 1;
542
+ const item = res.item;
543
+ if (res.jr.ok) {
544
+ const unit = makeUnitRecord({
545
+ unitId: item.unit_id, model: cfg.model, env: res.jr.env, exit: res.jr.exit,
546
+ status: 'ok', reason: null, payload: res.jr.verdict,
547
+ });
548
+ okCount += 1;
549
+ persistUnit(unitsDir, unit, outDir);
550
+ units.push({ item, unit, verdict: res.jr.verdict });
551
+ } else {
552
+ let reason = res.jr.reason;
553
+ if (res.isProbe && o.probeMark) reason = 'induced_probe';
554
+ const unit = makeUnitRecord({
555
+ unitId: item.unit_id, model: cfg.model, env: res.jr.env, exit: res.jr.exit,
556
+ status: 'not_evaluated', reason, issues: res.jr.issues || null,
557
+ });
558
+ notEvalCount += 1;
559
+ persistUnit(unitsDir, unit, outDir);
560
+ units.push({ item, unit, verdict: null });
561
+ }
562
+ };
563
+
564
+ await runPool({
565
+ items,
566
+ getLimit: () => cfg.concurrency,
567
+ worker,
568
+ onSettle,
569
+ });
570
+
571
+ // Deliberate drift injection for the selftest's broken-reconciliation fixture.
572
+ if (typeof o._injectReconcileDrift === 'number') spawnedCount += o._injectReconcileDrift;
573
+
574
+ const results = classifySkills(units);
575
+ const reconciliation = { spawned: spawnedCount, ok: okCount, not_evaluated: notEvalCount };
576
+ const reconcileOk = reconciliation.spawned === reconciliation.ok + reconciliation.not_evaluated;
577
+
578
+ // Additive key, deliberately named label_reconciliation (NOT reconciliation -
579
+ // that key already holds the D5 spawned/ok/not_evaluated identity above, and
580
+ // colliding the two would corrupt the no-silent-skip gate).
581
+ const funnelResults = {
582
+ reconciliation,
583
+ reconcile_ok: reconcileOk,
584
+ concurrency: cfg.concurrency,
585
+ skills: results,
586
+ label_reconciliation: {
587
+ corrections: labelReconciliation.corrections,
588
+ corrected_count: labelReconciliation.corrections.length,
589
+ ambiguous_count: labelReconciliation.ambiguous.length,
590
+ remaining_null_count: labelReconciliation.remaining_null.length,
591
+ },
592
+ };
593
+
594
+ // Persist funnel-results.json (guarded) unless the caller is a pure in-memory test.
595
+ if (!o._noWriteResults) {
596
+ const target = path.join(outDir, 'funnel', 'funnel-results.json');
597
+ const guard = assertUnderOut(target, outDir);
598
+ if (!guard.ok) throw new Error('skillopt-funnel: refusing to write results outside out sandbox: ' + target);
599
+ fs.mkdirSync(path.dirname(target), { recursive: true });
600
+ writeAtomic(target, JSON.stringify(funnelResults, null, 2) + '\n');
601
+ }
602
+
603
+ return { results, reconciliation, reconcileOk, concurrency: cfg.concurrency, funnelResults, labelReconciliation };
604
+ }
605
+
606
+ // Persist a unit record + its .done sentinel (both guarded).
607
+ function persistUnit(unitsDir, unit, outDir) {
608
+ const target = path.join(unitsDir, safeStem(unit.unit_id) + '.json');
609
+ const guard = assertUnderOut(target, outDir);
610
+ if (!guard.ok) throw new Error('skillopt-funnel: refusing to write unit outside out sandbox: ' + target);
611
+ fs.mkdirSync(unitsDir, { recursive: true });
612
+ writeAtomic(target, JSON.stringify(unit, null, 2) + '\n');
613
+ writeAtomic(path.join(unitsDir, safeStem(unit.unit_id) + '.done'), '');
614
+ }
615
+
616
+ // --------------------------------------------------------------------------
617
+ // loadInventory(outDir) - read out/inventory.json (Plan 01's ground truth).
618
+ // --------------------------------------------------------------------------
619
+ function loadInventory(outDir) {
620
+ return JSON.parse(fs.readFileSync(path.join(outDir, 'inventory.json'), 'utf8'));
621
+ }
622
+
623
+ // --------------------------------------------------------------------------
624
+ // runSelftest - deterministic fixtures, ZERO real spawn, zero API spend. Covers the
625
+ // five required fixtures plus a reconciliation-drift violation and a concurrency clamp.
626
+ // --------------------------------------------------------------------------
627
+ async function runSelftest() {
628
+ const assert = require('node:assert');
629
+
630
+ // Roster stub builder: one line per record, no body text.
631
+ const fixtureInventory = [
632
+ { skill: 'sA', description: 'alpha skill\nwith a newline body ref scripts/a.cjs' },
633
+ { skill: 'sB', description: 'beta skill' },
634
+ { skill: 'sC', description: 'gamma skill' },
635
+ { skill: 'sD', description: 'delta skill' },
636
+ { skill: 'sE', description: 'epsilon skill' },
637
+ ];
638
+ const roster = buildRosterStubs(fixtureInventory);
639
+ assert.strictEqual(roster.split('\n').length, fixtureInventory.length, 'selftest: roster must have exactly one line per record');
640
+ assert.ok(!/\n.*\n.*scripts\/a\.cjs/.test(roster) || roster.split('\n')[0].includes('sA:'), 'selftest: roster sA must be a single collapsed line');
641
+ assert.ok(roster.split('\n')[0] === 'sA: alpha skill with a newline body ref scripts/a.cjs', 'selftest: description newlines must collapse to one line');
642
+
643
+ // A hermetic out dir UNDER .planning/.../out/ so assertUnderOut passes; cleaned up.
644
+ const baseOut = path.join(REPO_ROOT, PHASE_OUT_DIR);
645
+ fs.mkdirSync(baseOut, { recursive: true });
646
+ const tmpOut = fs.mkdtempSync(path.join(baseOut, '.selftest-funnel-'));
647
+
648
+ try {
649
+ const queriesDir = path.join(tmpOut, 'queries');
650
+ fs.mkdirSync(queriesDir, { recursive: true });
651
+
652
+ // Five single-query skills, each a distinct fixture case keyed by CASE marker.
653
+ const mk = (skill, marker, expected) => ({
654
+ skill, family: 'plain:s',
655
+ queries: [{ query: marker, expected_skill: expected, family: 'plain:s', split: 'train', kind: 'should_trigger' }],
656
+ });
657
+ fs.writeFileSync(path.join(queriesDir, 'sA.json'), JSON.stringify(mk('sA', 'CASE-miss', 'sA')));
658
+ fs.writeFileSync(path.join(queriesDir, 'sB.json'), JSON.stringify(mk('sB', 'CASE-medium', 'sB')));
659
+ fs.writeFileSync(path.join(queriesDir, 'sC.json'), JSON.stringify(mk('sC', 'CASE-clean', 'sC')));
660
+ fs.writeFileSync(path.join(queriesDir, 'sD.json'), JSON.stringify(mk('sD', 'CASE-unparseable', 'sD')));
661
+ fs.writeFileSync(path.join(queriesDir, 'sE.json'), JSON.stringify(mk('sE', 'CASE-resume', 'sE')));
662
+
663
+ // Pre-seed sE as already done (resume): the worker must NOT be called for it.
664
+ const unitsDir = path.join(tmpOut, 'funnel', 'units');
665
+ fs.mkdirSync(unitsDir, { recursive: true });
666
+ const priorVerdict = { query: 'CASE-resume', predicted_skill: 'sE', expected_skill: 'sE', confidence: 'high', reasoning: 'prior run' };
667
+ const priorUnit = makeUnitRecord({ unitId: 'funnel-sE-0', model: PINNED_SONNET, env: { session_id: 'sess-prior', total_cost_usd: 0.01 }, exit: 0, status: 'ok', payload: priorVerdict });
668
+ fs.writeFileSync(path.join(unitsDir, 'funnel-sE-0.json'), JSON.stringify(priorUnit));
669
+ fs.writeFileSync(path.join(unitsDir, 'funnel-sE-0.done'), '');
670
+
671
+ // A fake spawn keyed by the CASE marker embedded in the -p prompt. Also records
672
+ // which markers it was asked to judge (so we can prove sE was skipped).
673
+ const spawnedMarkers = [];
674
+ const fakeSpawn = (args, _timeoutMs) => {
675
+ const prompt = args[1] || '';
676
+ const marker = (prompt.match(/CASE-[a-z]+/) || [''])[0];
677
+ spawnedMarkers.push(marker);
678
+ const mkEnv = (verdict) => ({ status: 0, stdout: JSON.stringify({ structured_output: verdict, session_id: 'sess-' + marker, total_cost_usd: 0.01 }) });
679
+ if (marker === 'CASE-miss') return mkEnv({ query: 'x', predicted_skill: 'sB', expected_skill: 'sA', confidence: 'high', reasoning: 'sibling stole it' });
680
+ if (marker === 'CASE-medium') return mkEnv({ query: 'x', predicted_skill: 'sB', expected_skill: 'sB', confidence: 'medium', reasoning: 'ambiguous' });
681
+ if (marker === 'CASE-clean') return mkEnv({ query: 'x', predicted_skill: 'sC', expected_skill: 'sC', confidence: 'high', reasoning: 'clear' });
682
+ if (marker === 'CASE-unparseable') return { status: 0, stdout: 'not json at all <<<' };
683
+ return mkEnv({ query: 'x', predicted_skill: null, expected_skill: null, confidence: 'high', reasoning: 'default' });
684
+ };
685
+
686
+ const run = await runFunnel({ inventory: fixtureInventory, queriesDir, outDir: tmpOut, spawnImpl: fakeSpawn, config: { concurrency: 2 } });
687
+
688
+ const bySkill = {};
689
+ for (const r of run.results) bySkill[r.skill] = r;
690
+ assert.strictEqual(bySkill.sA.verdict, 'flagged', 'selftest: train miss must flag (sA)');
691
+ assert.strictEqual(bySkill.sB.verdict, 'flagged', 'selftest: medium confidence must flag (sB)');
692
+ assert.strictEqual(bySkill.sC.verdict, 'pass', 'selftest: clean high-correct must pass (sC)');
693
+ assert.strictEqual(bySkill.sD.verdict, 'not_evaluated', 'selftest: unparseable must be not_evaluated (sD)');
694
+ assert.ok(bySkill.sE, 'selftest: resumed sE must appear in results');
695
+ assert.ok(!spawnedMarkers.includes('CASE-resume'), 'selftest: resumed sE must NOT be re-spawned');
696
+
697
+ // Reconciliation identity holds for a clean run.
698
+ assert.strictEqual(run.reconcileOk, true, 'selftest: reconciliation identity must hold on a clean run');
699
+ assert.strictEqual(run.reconciliation.spawned, run.reconciliation.ok + run.reconciliation.not_evaluated, 'selftest: spawned == ok + not_evaluated');
700
+
701
+ // Deliberately broken reconciliation -> reconcileOk false (main() would exit 1).
702
+ const broken = await runFunnel({ inventory: fixtureInventory, queriesDir, outDir: tmpOut, spawnImpl: fakeSpawn, config: { concurrency: 2 }, _injectReconcileDrift: 1, _noWriteResults: true });
703
+ assert.strictEqual(broken.reconcileOk, false, 'selftest: injected drift must break the reconciliation identity');
704
+
705
+ // Concurrency clamp: request 10 -> clamped to the hard cap of 4.
706
+ const clamped = await runFunnel({ inventory: fixtureInventory, queriesDir, outDir: tmpOut, spawnImpl: fakeSpawn, config: { concurrency: 10 }, _noWriteResults: true });
707
+ assert.strictEqual(clamped.concurrency, HARD_CAP_CONCURRENCY, 'selftest: concurrency 10 must clamp to ' + HARD_CAP_CONCURRENCY);
708
+
709
+ // Induced-timeout probe: a SIGTERM-simulating spawn lands not_evaluated, and
710
+ // --probe-mark rewrites the reason to induced_probe.
711
+ const probeQueriesDir = path.join(tmpOut, 'queries-probe');
712
+ fs.mkdirSync(probeQueriesDir, { recursive: true });
713
+ fs.writeFileSync(path.join(probeQueriesDir, 'sP.json'), JSON.stringify(mk('sP', 'CASE-probe', 'sP')));
714
+ const timeoutSpawn = () => ({ signal: 'SIGTERM', status: null, stdout: '' });
715
+ const probeRun = await runFunnel({ inventory: fixtureInventory, queriesDir: probeQueriesDir, outDir: tmpOut, spawnImpl: timeoutSpawn, config: { concurrency: 1 }, probeTimeoutUnit: 'sP', probeMark: true, _noWriteResults: true });
716
+ assert.strictEqual(probeRun.results[0].verdict, 'not_evaluated', 'selftest: probe unit must be not_evaluated');
717
+ const probeUnit = JSON.parse(fs.readFileSync(path.join(tmpOut, 'funnel', 'units', 'funnel-sP-0.json'), 'utf8'));
718
+ assert.strictEqual(probeUnit.not_evaluated_reason, 'induced_probe', 'selftest: --probe-mark must record reason induced_probe');
719
+ assert.ok(NOT_EVALUATED_REASONS.includes(probeUnit.not_evaluated_reason), 'selftest: probe reason in closed vocabulary');
720
+
721
+ // ======================================================================
722
+ // Null-negative reconciliation selftest block (Phase 318, SEED-061 step 1).
723
+ // Cases A-G are pure in-memory calls into buildPositiveIndex/
724
+ // reconcileNullNegatives; they need no tmpOut and no spawn. Cases H and I
725
+ // drive a real runFunnel call with an injected fakeSpawn (zero-spawn rule
726
+ // held throughout).
727
+ // ======================================================================
728
+
729
+ // Case A: cross-skill exact match, different casing + collapsed whitespace,
730
+ // corrects the null negative to the foreign skill.
731
+ {
732
+ const idxA = buildPositiveIndex([
733
+ { skill: 'sX', kind: 'should_trigger', expected_skill: 'sX', query: 'do the THING' },
734
+ ]);
735
+ const rA = reconcileNullNegatives(
736
+ [{ skill: 'sY', kind: 'should_not_trigger', expected_skill: null, query: 'Do the thing', unit_id: 'u-a' }],
737
+ idxA
738
+ );
739
+ assert.strictEqual(rA.items[0].expected_skill, 'sX', 'selftest reconcile: Case A cross-skill exact match (case/whitespace) must correct to sX');
740
+ assert.strictEqual(rA.corrections.length, 1, 'selftest reconcile: Case A must record exactly one correction');
741
+ }
742
+
743
+ // Case B: a null negative with no roster match stays null and lands in remaining_null.
744
+ {
745
+ const idxB = buildPositiveIndex([
746
+ { skill: 'sX', kind: 'should_trigger', expected_skill: 'sX', query: 'completely unrelated query' },
747
+ ]);
748
+ const rB = reconcileNullNegatives(
749
+ [{ skill: 'sY', kind: 'should_not_trigger', expected_skill: null, query: 'nothing matches this at all', unit_id: 'u-b' }],
750
+ idxB
751
+ );
752
+ assert.strictEqual(rB.items[0].expected_skill, null, 'selftest reconcile: Case B no-match negative must stay null');
753
+ assert.strictEqual(rB.remaining_null.length, 1, 'selftest reconcile: Case B must land in remaining_null');
754
+ }
755
+
756
+ // Case C: an already-labeled negative is returned byte-identical (never touched).
757
+ {
758
+ const already = { skill: 'sY', kind: 'should_not_trigger', expected_skill: 'sC-target', query: 'Do the thing', unit_id: 'u-c' };
759
+ const idxC = buildPositiveIndex([
760
+ { skill: 'sX', kind: 'should_trigger', expected_skill: 'sX', query: 'do the thing' },
761
+ ]);
762
+ const rC = reconcileNullNegatives([already], idxC);
763
+ assert.deepStrictEqual(rC.items[0], already, 'selftest reconcile: Case C already-labeled negative must be returned byte-identical');
764
+ assert.strictEqual(rC.corrections.length, 0, 'selftest reconcile: Case C must record zero corrections');
765
+ }
766
+
767
+ // Case D: the REAL Phase 230 near-miss pair (harvested at plan time from
768
+ // out/queries/jtbd.json's negative and out/queries/status.json's positive)
769
+ // must stay null. This is the tripwire: it fails the moment fuzzy/semantic
770
+ // matching is ever added, because the two strings are real data that are
771
+ // similar, never identical.
772
+ {
773
+ const idxD = buildPositiveIndex([
774
+ { skill: 'status', kind: 'should_trigger', expected_skill: 'status', query: 'show me the current status of my room' },
775
+ ]);
776
+ const rD = reconcileNullNegatives(
777
+ [{ skill: 'jtbd', kind: 'should_not_trigger', expected_skill: null, query: "what's the status of my room", unit_id: 'u-d' }],
778
+ idxD
779
+ );
780
+ assert.strictEqual(rD.items[0].expected_skill, null, 'selftest reconcile: Case D real Phase 230 near-miss pair must stay null (no fuzzy match, exact-match only per D-02)');
781
+ }
782
+
783
+ // Case E: a positive owned by the negative's OWN skill is not a correction.
784
+ {
785
+ const idxE = buildPositiveIndex([
786
+ { skill: 'sY', kind: 'should_trigger', expected_skill: 'sY', query: 'do the thing' },
787
+ ]);
788
+ const rE = reconcileNullNegatives(
789
+ [{ skill: 'sY', kind: 'should_not_trigger', expected_skill: null, query: 'do the thing', unit_id: 'u-e' }],
790
+ idxE
791
+ );
792
+ assert.strictEqual(rE.items[0].expected_skill, null, 'selftest reconcile: Case E same-skill match must not correct');
793
+ assert.strictEqual(rE.corrections.length, 0, 'selftest reconcile: Case E must record zero corrections');
794
+ }
795
+
796
+ // Case F: two distinct foreign candidates leave the label null and record an ambiguity.
797
+ {
798
+ const idxF = buildPositiveIndex([
799
+ { skill: 'sX', kind: 'should_trigger', expected_skill: 'sX', query: 'do the thing' },
800
+ { skill: 'sZ', kind: 'should_trigger', expected_skill: 'sZ', query: 'do the thing' },
801
+ ]);
802
+ const rF = reconcileNullNegatives(
803
+ [{ skill: 'sY', kind: 'should_not_trigger', expected_skill: null, query: 'do the thing', unit_id: 'u-f' }],
804
+ idxF
805
+ );
806
+ assert.strictEqual(rF.items[0].expected_skill, null, 'selftest reconcile: Case F ambiguous multi-candidate must stay null');
807
+ assert.strictEqual(rF.ambiguous.length, 1, 'selftest reconcile: Case F must record one ambiguity');
808
+ assert.strictEqual(rF.remaining_null.length, 1, 'selftest reconcile: Case F ambiguous item must also land in remaining_null');
809
+ }
810
+
811
+ // Case G: purity, arity 2, and no spawn/fs/network token anywhere in the
812
+ // three reconciliation function sources.
813
+ {
814
+ assert.strictEqual(reconcileNullNegatives.length, 2, 'selftest reconcile: Case G reconcileNullNegatives must have arity 2');
815
+ const srcG = reconcileNullNegatives.toString() + buildPositiveIndex.toString() + normalizeQueryText.toString();
816
+ assert.ok(!/spawnSync|spawnImpl|child_process|execSync|execFile|fetch\(|readFileSync|writeFileSync/.test(srcG),
817
+ 'selftest reconcile: Case G reconciliation functions must be pure (no spawn/fs/network token)');
818
+ }
819
+
820
+ // Case H: a runFunnel call scoped with skills:['sX'] still corrects against a
821
+ // positive owned by a skill outside the scope (proves Finding 3 is handled:
822
+ // the positive index is built roster-wide, before the caller's scope narrows
823
+ // the evaluated items).
824
+ {
825
+ const mkSet = (skill, queries) => ({ skill, family: 'plain:s', queries });
826
+ const hSpawn = (args) => {
827
+ const prompt = args[1] || '';
828
+ const q = (prompt.match(/USER QUERY: (.*)/) || [])[1] || '';
829
+ let predicted = null;
830
+ if (q === 'RECONCILE-H-COLLIDE') predicted = 'sY';
831
+ else if (q.startsWith('sX filler')) predicted = 'sX';
832
+ else if (q.startsWith('sY filler')) predicted = 'sY';
833
+ return { status: 0, stdout: JSON.stringify({ structured_output: { query: q, predicted_skill: predicted, expected_skill: null, confidence: 'high', reasoning: 'deterministic fixture' }, session_id: 'sess-h', total_cost_usd: 0.01 }) };
834
+ };
835
+ const sXQueries = [
836
+ { query: 'RECONCILE-H-COLLIDE', expected_skill: null, family: 'plain:s', split: 'train', kind: 'should_not_trigger' },
837
+ { query: 'sX filler one', expected_skill: 'sX', family: 'plain:s', split: 'train', kind: 'should_trigger' },
838
+ { query: 'sX filler two', expected_skill: 'sX', family: 'plain:s', split: 'train', kind: 'should_trigger' },
839
+ { query: 'sX filler three', expected_skill: 'sX', family: 'plain:s', split: 'validation', kind: 'should_trigger' },
840
+ ];
841
+
842
+ const hQueriesDir = path.join(tmpOut, 'queries-reconcile-h');
843
+ fs.mkdirSync(hQueriesDir, { recursive: true });
844
+ fs.writeFileSync(path.join(hQueriesDir, 'sX.json'), JSON.stringify(mkSet('sX', sXQueries)));
845
+ fs.writeFileSync(path.join(hQueriesDir, 'sY.json'), JSON.stringify(mkSet('sY', [
846
+ { query: 'RECONCILE-H-COLLIDE', expected_skill: 'sY', family: 'plain:s', split: 'train', kind: 'should_trigger' },
847
+ { query: 'sY filler one', expected_skill: 'sY', family: 'plain:s', split: 'train', kind: 'should_trigger' },
848
+ { query: 'sY filler two', expected_skill: 'sY', family: 'plain:s', split: 'train', kind: 'should_trigger' },
849
+ { query: 'sY filler three', expected_skill: 'sY', family: 'plain:s', split: 'validation', kind: 'should_trigger' },
850
+ ])));
851
+
852
+ const withForeign = await runFunnel({ inventory: fixtureInventory, queriesDir: hQueriesDir, outDir: tmpOut, spawnImpl: hSpawn, skills: ['sX'], config: { concurrency: 2 }, _noWriteResults: true });
853
+ const sXWith = withForeign.results.find((r) => r.skill === 'sX');
854
+ assert.ok(sXWith, 'selftest reconcile: Case H sX must appear in scoped results');
855
+ assert.strictEqual(sXWith.verdict, 'pass', 'selftest reconcile: Case H sX must pass with the foreign positive present (--skills scoped run, full-roster index)');
856
+ assert.strictEqual(sXWith.train_miss_count, 0, 'selftest reconcile: Case H sX must have zero train misses with the foreign positive present');
857
+
858
+ // Same run WITHOUT the sY query set present: the false alarm this phase removes.
859
+ const hQueriesDirNoForeign = path.join(tmpOut, 'queries-reconcile-h-noforeign');
860
+ fs.mkdirSync(hQueriesDirNoForeign, { recursive: true });
861
+ fs.writeFileSync(path.join(hQueriesDirNoForeign, 'sX.json'), JSON.stringify(mkSet('sX', sXQueries)));
862
+ const withoutForeign = await runFunnel({ inventory: fixtureInventory, queriesDir: hQueriesDirNoForeign, outDir: tmpOut, spawnImpl: hSpawn, skills: ['sX'], config: { concurrency: 2 }, _noWriteResults: true });
863
+ const sXWithout = withoutForeign.results.find((r) => r.skill === 'sX');
864
+ assert.strictEqual(sXWithout.verdict, 'flagged', 'selftest reconcile: Case H sX must flag without the foreign positive (the false alarm this phase removes)');
865
+ assert.strictEqual(sXWithout.train_miss_count, 1, 'selftest reconcile: Case H sX must have exactly one train miss without the foreign positive');
866
+ }
867
+
868
+ // Case I: a pre-seeded resumed unit whose persisted payload carries the stale
869
+ // null label is scored against the reconciled label (Finding 5), and the
870
+ // persisted unit JSON on disk is proven unchanged afterwards (in-memory
871
+ // override only, never re-persisted).
872
+ {
873
+ const mkSet = (skill, queries) => ({ skill, family: 'plain:s', queries });
874
+ const iQueriesDir = path.join(tmpOut, 'queries-reconcile-i');
875
+ fs.mkdirSync(iQueriesDir, { recursive: true });
876
+ fs.writeFileSync(path.join(iQueriesDir, 'sI.json'), JSON.stringify(mkSet('sI', [
877
+ { query: 'RECONCILE-I-COLLIDE', expected_skill: null, family: 'plain:s', split: 'train', kind: 'should_not_trigger' },
878
+ { query: 'sI filler one', expected_skill: 'sI', family: 'plain:s', split: 'train', kind: 'should_trigger' },
879
+ { query: 'sI filler two', expected_skill: 'sI', family: 'plain:s', split: 'train', kind: 'should_trigger' },
880
+ { query: 'sI filler three', expected_skill: 'sI', family: 'plain:s', split: 'validation', kind: 'should_trigger' },
881
+ ])));
882
+ fs.writeFileSync(path.join(iQueriesDir, 'sJ.json'), JSON.stringify(mkSet('sJ', [
883
+ { query: 'RECONCILE-I-COLLIDE', expected_skill: 'sJ', family: 'plain:s', split: 'train', kind: 'should_trigger' },
884
+ { query: 'sJ filler one', expected_skill: 'sJ', family: 'plain:s', split: 'train', kind: 'should_trigger' },
885
+ { query: 'sJ filler two', expected_skill: 'sJ', family: 'plain:s', split: 'train', kind: 'should_trigger' },
886
+ { query: 'sJ filler three', expected_skill: 'sJ', family: 'plain:s', split: 'validation', kind: 'should_trigger' },
887
+ ])));
888
+
889
+ // Pre-seed sI's collision unit as already done, with the STALE null label
890
+ // and a predicted_skill that already correctly names the foreign skill
891
+ // (mirroring a prior run's judge, which sees the full roster and would
892
+ // correctly predict sJ regardless of what expected label it was fed).
893
+ const iUnitsDir = path.join(tmpOut, 'funnel', 'units');
894
+ fs.mkdirSync(iUnitsDir, { recursive: true });
895
+ const staleVerdict = { query: 'RECONCILE-I-COLLIDE', predicted_skill: 'sJ', expected_skill: null, confidence: 'high', reasoning: 'prior run, pre-reconciliation' };
896
+ const staleUnit = makeUnitRecord({ unitId: 'funnel-sI-0', model: PINNED_SONNET, env: { session_id: 'sess-i-prior', total_cost_usd: 0.01 }, exit: 0, status: 'ok', payload: staleVerdict });
897
+ const staleUnitPath = path.join(iUnitsDir, 'funnel-sI-0.json');
898
+ fs.writeFileSync(staleUnitPath, JSON.stringify(staleUnit));
899
+ fs.writeFileSync(path.join(iUnitsDir, 'funnel-sI-0.done'), '');
900
+ const staleUnitBytesBefore = fs.readFileSync(staleUnitPath, 'utf8');
901
+
902
+ const iSpawn = (args) => {
903
+ const prompt = args[1] || '';
904
+ const q = (prompt.match(/USER QUERY: (.*)/) || [])[1] || '';
905
+ let predicted = null;
906
+ if (q === 'RECONCILE-I-COLLIDE') predicted = 'sJ';
907
+ else if (q.startsWith('sI filler')) predicted = 'sI';
908
+ else if (q.startsWith('sJ filler')) predicted = 'sJ';
909
+ return { status: 0, stdout: JSON.stringify({ structured_output: { query: q, predicted_skill: predicted, expected_skill: null, confidence: 'high', reasoning: 'deterministic fixture' }, session_id: 'sess-i', total_cost_usd: 0.01 }) };
910
+ };
911
+
912
+ const iRun = await runFunnel({ inventory: fixtureInventory, queriesDir: iQueriesDir, outDir: tmpOut, spawnImpl: iSpawn, config: { concurrency: 2 }, _noWriteResults: true });
913
+ const sIResult = iRun.results.find((r) => r.skill === 'sI');
914
+ assert.ok(sIResult, 'selftest reconcile: Case I sI must appear in results');
915
+ assert.strictEqual(sIResult.verdict, 'pass', 'selftest reconcile: Case I resumed unit must score against the reconciled label, not the stale persisted null (train_miss_count 0)');
916
+ assert.strictEqual(sIResult.train_miss_count, 0, 'selftest reconcile: Case I resumed unit must have zero train misses once scored against the reconciled label');
917
+
918
+ const staleUnitBytesAfter = fs.readFileSync(staleUnitPath, 'utf8');
919
+ assert.strictEqual(staleUnitBytesAfter, staleUnitBytesBefore, 'selftest reconcile: Case I persisted unit JSON must be byte-identical after the run (in-memory override only, never rewritten)');
920
+ const staleUnitParsedAfter = JSON.parse(staleUnitBytesAfter);
921
+ assert.strictEqual(staleUnitParsedAfter.payload.expected_skill, null, 'selftest reconcile: Case I persisted unit payload must still carry its ORIGINAL stale null expected_skill on disk');
922
+ }
923
+ } finally {
924
+ fs.rmSync(tmpOut, { recursive: true, force: true });
925
+ }
926
+
927
+ console.log('OK - skillopt-funnel self-test passed: miss->flag, medium->flag, clean->pass, unparseable->not_evaluated, resume skip, reconciliation gate, concurrency clamp, induced probe, null-negative reconciliation (exact match, no-match, already-labeled, near-miss immunity, self-skill immunity, ambiguity, purity, --skills full-roster visibility, resume-path correctness).');
928
+ }
929
+
930
+ // --------------------------------------------------------------------------
931
+ // runReconcileAudit(outDir, skillsFilter) - --reconcile-audit reporting mode
932
+ // (Phase 318 Task 3). Enumerates the corpus at <outDir>/queries UNFILTERED,
933
+ // builds the positive index roster-wide (Finding 3), then reconciles a
934
+ // scope-filtered view purely for reporting. Spawns nothing, writes nothing.
935
+ // Returns a process exit code: 0 on a normal report, 2 with a named reason
936
+ // printed when the corpus is missing or empty (no-silent-skip discipline, the
937
+ // same doctrine tests/run-all-230.sh documents in its own header - never
938
+ // report a false clean zero for an absent corpus).
939
+ // --------------------------------------------------------------------------
940
+ function runReconcileAudit(outDir, skillsFilter) {
941
+ const queriesDir = path.join(outDir, 'queries');
942
+ const allItems = enumerateQueries(queriesDir, null);
943
+ if (allItems.length === 0) {
944
+ console.error('FATAL skillopt-funnel --reconcile-audit: corpus missing or empty reason=no_items_found dir=' + queriesDir);
945
+ return 2;
946
+ }
947
+ const positiveIndex = buildPositiveIndex(allItems);
948
+ const scoped = skillsFilter && skillsFilter.size > 0 ? allItems.filter((it) => skillsFilter.has(it.skill)) : allItems;
949
+ const rec = reconcileNullNegatives(scoped, positiveIndex);
950
+
951
+ const positives = scoped.filter((it) => it.kind === 'should_trigger').length;
952
+ const negatives = scoped.filter((it) => it.kind === 'should_not_trigger').length;
953
+ const nullNegatives = scoped.filter((it) => it.kind === 'should_not_trigger' && it.expected_skill == null).length;
954
+
955
+ console.log('reconcile-audit: scope=' + (skillsFilter ? Array.from(skillsFilter).join(',') : 'all') + ' dir=' + queriesDir);
956
+ console.log('reconcile-audit: total=' + scoped.length + ' should_trigger=' + positives + ' should_not_trigger=' + negatives + ' null_negatives=' + nullNegatives);
957
+ console.log('reconcile-audit: corrected=' + rec.corrections.length + ' ambiguous=' + rec.ambiguous.length + ' residual_null=' + rec.remaining_null.length);
958
+ if (rec.corrections.length) {
959
+ console.log('reconcile-audit: corrections');
960
+ for (const c of rec.corrections) console.log(' ' + c.skill + ' -> ' + c.corrected_to + ' :: ' + c.query);
961
+ }
962
+ if (rec.ambiguous.length) {
963
+ console.log('reconcile-audit: ambiguous (left null, not scored - D-02 refuses to guess)');
964
+ for (const a of rec.ambiguous) console.log(' ' + a.skill + ' :: ' + a.query + ' candidates=' + a.candidates.join(','));
965
+ }
966
+ if (rec.remaining_null.length) {
967
+ console.log('reconcile-audit: residual null negatives (raw list, no similarity score, no ranking - D-02 boundary, Finding 2)');
968
+ for (const r of rec.remaining_null) console.log(' ' + r.skill + ' :: ' + r.query);
969
+ }
970
+ return 0;
971
+ }
972
+
973
+ // --------------------------------------------------------------------------
974
+ // main - switch-case argv router (gsd-tools.cjs pattern), no Commander/yargs.
975
+ // --selftest deterministic fixtures, no spawn, exit
976
+ // --dry-run build + print one judge arg vector, spawn NOTHING
977
+ // --reconcile-audit report reconciliation counts + residual null-negative
978
+ // rows over <outDir>/queries, honoring --skills for the
979
+ // reported scope while always indexing roster-wide.
980
+ // Spawns nothing, writes nothing, exits 2 on a missing
981
+ // or empty corpus (Phase 318 Task 3).
982
+ // --skills <csv> limit evaluated skills (roster stays full)
983
+ // --concurrency <n> pool size (default 3, hard cap 4)
984
+ // --out <dir> out directory (default PHASE_OUT_DIR)
985
+ // --probe-timeout-unit <s> force a 1ms timeout on that skill's first unit (D5)
986
+ // --probe-mark record the induced probe reason as 'induced_probe'
987
+ // --budget-per-query <usd> per-judge-call --max-budget-usd fuse (default 0.05).
988
+ // The default is too low for the real 124-skill roster
989
+ // (a cold judge call costs ~0.16 on cache-creation), so a
990
+ // live smoke run must raise it or every unit dies
991
+ // error_max_budget_usd -> nonzero_exit (Plan 07 deviation).
992
+ // --------------------------------------------------------------------------
993
+ async function main(argv) {
994
+ const args = argv.slice(2);
995
+
996
+ if (args.includes('--selftest')) { await runSelftest(); return; }
997
+
998
+ let outDir = path.join(REPO_ROOT, PHASE_OUT_DIR);
999
+ const outIdx = args.indexOf('--out');
1000
+ if (outIdx >= 0 && args[outIdx + 1]) outDir = path.resolve(args[outIdx + 1]);
1001
+
1002
+ let skills = null;
1003
+ const skIdx = args.indexOf('--skills');
1004
+ if (skIdx >= 0 && args[skIdx + 1]) skills = args[skIdx + 1].split(',').map((s) => s.trim()).filter(Boolean);
1005
+
1006
+ // --reconcile-audit returns before any spawn path and before loadInventory
1007
+ // (same shape as --dry-run's zero-spend return): the audit never needs the
1008
+ // skill roster, only the on-disk query corpus.
1009
+ if (args.includes('--reconcile-audit')) {
1010
+ const skillsFilterAudit = skills && skills.length ? new Set(skills) : null;
1011
+ const code = runReconcileAudit(outDir, skillsFilterAudit);
1012
+ if (code !== 0) process.exit(code);
1013
+ return;
1014
+ }
1015
+
1016
+ let concurrency = DEFAULT_CONCURRENCY;
1017
+ const cIdx = args.indexOf('--concurrency');
1018
+ if (cIdx >= 0 && args[cIdx + 1]) concurrency = parseInt(args[cIdx + 1], 10) || DEFAULT_CONCURRENCY;
1019
+
1020
+ let probeTimeoutUnit = null;
1021
+ const pIdx = args.indexOf('--probe-timeout-unit');
1022
+ if (pIdx >= 0 && args[pIdx + 1]) probeTimeoutUnit = args[pIdx + 1];
1023
+ const probeMark = args.includes('--probe-mark');
1024
+
1025
+ let budgetPerQueryUsd;
1026
+ const bIdx = args.indexOf('--budget-per-query');
1027
+ if (bIdx >= 0 && args[bIdx + 1]) {
1028
+ const b = parseFloat(args[bIdx + 1]);
1029
+ if (!Number.isNaN(b) && b > 0) budgetPerQueryUsd = b;
1030
+ }
1031
+ const funnelConfig = { concurrency };
1032
+ if (budgetPerQueryUsd !== undefined) funnelConfig.budgetPerQueryUsd = budgetPerQueryUsd;
1033
+
1034
+ let inventory = [];
1035
+ try { inventory = loadInventory(outDir); } catch (_e) { inventory = []; }
1036
+
1037
+ if (args.includes('--dry-run')) {
1038
+ const rosterText = buildRosterStubs(inventory);
1039
+ const sampleSkill = (skills && skills[0]) || 'sample-skill';
1040
+ const vec = buildJudgeArgs(rosterText, 'sample query for ' + sampleSkill, sampleSkill, funnelConfig);
1041
+ console.log('# dry-run funnel judge skills=' + (skills ? skills.join(',') : 'all') + ' concurrency=' + resolveFunnelConfig(funnelConfig).concurrency);
1042
+ console.log(JSON.stringify(vec));
1043
+ return;
1044
+ }
1045
+
1046
+ const run = await runFunnel({ inventory, config: funnelConfig, outDir, skills, probeTimeoutUnit, probeMark });
1047
+ console.log('funnel: spawned=' + run.reconciliation.spawned + ' ok=' + run.reconciliation.ok + ' not_evaluated=' + run.reconciliation.not_evaluated);
1048
+ if (!run.reconcileOk) {
1049
+ console.error('FATAL skillopt-funnel: reconciliation identity violated (spawned != ok + not_evaluated) - D5 breach.');
1050
+ process.exit(1);
1051
+ }
1052
+ const flagged = run.results.filter((r) => r.verdict === 'flagged').length;
1053
+ console.log('OK skillopt-funnel: ' + run.results.length + ' skills, ' + flagged + ' flagged -> ' + path.join(outDir, 'funnel', 'funnel-results.json'));
1054
+ }
1055
+
1056
+ module.exports = {
1057
+ judgeOneQuery,
1058
+ buildRosterStubs,
1059
+ runFunnel,
1060
+ runPool,
1061
+ buildJudgeArgs,
1062
+ buildJudgePrompt,
1063
+ parseEnvelope,
1064
+ enumerateQueries,
1065
+ classifySkills,
1066
+ resolveFunnelConfig,
1067
+ normalizeQueryText,
1068
+ buildPositiveIndex,
1069
+ reconcileNullNegatives,
1070
+ HARD_CAP_CONCURRENCY,
1071
+ PINNED_SONNET,
1072
+ };
1073
+
1074
+ if (require.main === module) {
1075
+ main(process.argv).catch((e) => { console.error('FATAL skillopt-funnel:', e && e.message || e); process.exit(1); });
1076
+ }