2sagaco48 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (365) hide show
  1. package/diagnostics.mjs +141 -0
  2. package/dist/compute.worker-j5ahIpF-.js +1 -0
  3. package/dist/graph.worker-DG6iGCB9.js +1 -0
  4. package/dist/index.html +2314 -0
  5. package/flatten-guide.md +248 -0
  6. package/index.html +12 -0
  7. package/package.json +38 -0
  8. package/src/App.orig.tsx +204 -0
  9. package/src/App.orig1.tsx +27 -0
  10. package/src/App.orig2.tsx +25 -0
  11. package/src/App.tsx +3 -0
  12. package/src/BaseApp.tsx +18 -0
  13. package/src/INTEGRATION_LEDGER.md +22 -0
  14. package/src/PERSIST_CANARY.orig.txt +1 -0
  15. package/src/PERSIST_CANARY.txt +1 -0
  16. package/src/REGRESSION_LEDGER.md +651 -0
  17. package/src/TEMPLATE_PIPELINE_AUDIT.md +208 -0
  18. package/src/WILLIAMS_PERSONA_GUIDE.md +62 -0
  19. package/src/chat/VeritasChat.tsx +69 -0
  20. package/src/chat/synthesis.ts +31 -0
  21. package/src/chat/tier.ts +45 -0
  22. package/src/components/AdaptersPage.orig.tsx +99 -0
  23. package/src/components/AdaptersPage.tsx +3 -0
  24. package/src/components/AdversarialPanel.tsx +136 -0
  25. package/src/components/AnchorBaselinePanel.tsx +75 -0
  26. package/src/components/AnswerPanel.tsx +60 -0
  27. package/src/components/ArtifactPanel.tsx +43 -0
  28. package/src/components/ChatApp.orig.tsx +1582 -0
  29. package/src/components/ChatApp.orig1.tsx +722 -0
  30. package/src/components/ChatApp.tsx +95 -0
  31. package/src/components/ChatAugmentPanels.tsx +73 -0
  32. package/src/components/CitationLedgerPanel.tsx +313 -0
  33. package/src/components/ComputeSandboxPanel.tsx +130 -0
  34. package/src/components/ConfigPanel.tsx +110 -0
  35. package/src/components/ControlPlanePage.tsx +195 -0
  36. package/src/components/CreativeTreeLifePage.tsx +234 -0
  37. package/src/components/CreativeTreeOfLifePanel.tsx +149 -0
  38. package/src/components/DebugTracePanel.tsx +137 -0
  39. package/src/components/DeepReasoningTrace.tsx +48 -0
  40. package/src/components/EntitySheetPanel.tsx +51 -0
  41. package/src/components/FailureModesPanel.tsx +104 -0
  42. package/src/components/GBSDashboard.tsx +239 -0
  43. package/src/components/GraphView.tsx +116 -0
  44. package/src/components/HUD.tsx +125 -0
  45. package/src/components/HypothesisPanel.tsx +67 -0
  46. package/src/components/InnovationGenomeEngine.tsx +792 -0
  47. package/src/components/InnovationPersonaGuide.tsx +348 -0
  48. package/src/components/InnovationPersonaPanel.tsx +289 -0
  49. package/src/components/LiveResourceHUD.tsx +109 -0
  50. package/src/components/LongWriterPanel.tsx +112 -0
  51. package/src/components/MainPipelineV10Bridge.tsx +72 -0
  52. package/src/components/MarkdownLite.tsx +63 -0
  53. package/src/components/MemoryInspector.tsx +38 -0
  54. package/src/components/MemoryMonitor.tsx +52 -0
  55. package/src/components/MemoryStressPanel.tsx +176 -0
  56. package/src/components/ModulesPage.tsx +171 -0
  57. package/src/components/PipelineDebugConsole.orig.tsx +1856 -0
  58. package/src/components/PipelineDebugConsole.tsx +3 -0
  59. package/src/components/PreFlightHUD.tsx +67 -0
  60. package/src/components/PrismaFetchTracePanel.tsx +87 -0
  61. package/src/components/ReportOSPanel.tsx +165 -0
  62. package/src/components/ResourceEstimatorPage.tsx +327 -0
  63. package/src/components/RichText.tsx +181 -0
  64. package/src/components/SagaOsPanel.tsx +605 -0
  65. package/src/components/SagaOsReference.tsx +421 -0
  66. package/src/components/SagaOsV2Panel.tsx +594 -0
  67. package/src/components/SagaStyleTab.tsx +382 -0
  68. package/src/components/SageBlueprintPanel.tsx +416 -0
  69. package/src/components/SharedChatInput.tsx +77 -0
  70. package/src/components/StatFinancePanel.tsx +190 -0
  71. package/src/components/StylePersonaPanel.tsx +128 -0
  72. package/src/components/TemplatesPage.tsx +300 -0
  73. package/src/components/TestPanel.tsx +63 -0
  74. package/src/components/TraceLog.tsx +89 -0
  75. package/src/components/V15CalibrationAugment.tsx +1134 -0
  76. package/src/components/V15CalibrationDialog.tsx +1871 -0
  77. package/src/components/V15Overlay.orig.tsx +120 -0
  78. package/src/components/V15Overlay.tsx +4 -0
  79. package/src/components/V15OverlayWrapper.tsx +362 -0
  80. package/src/components/V15Toggle.tsx +34 -0
  81. package/src/console/DiagnosticRecoveryPanel.tsx +358 -0
  82. package/src/console/EngineeringConsole.tsx +103 -0
  83. package/src/console/FictionSystemPanels.tsx +882 -0
  84. package/src/console/InspectorPanels.tsx +254 -0
  85. package/src/console/ManuscriptGraderPanel.tsx +182 -0
  86. package/src/console/RecursiveReviserPanel.tsx +245 -0
  87. package/src/console/SeedControlPanel.tsx +135 -0
  88. package/src/console/StoryControllerPanel.tsx +443 -0
  89. package/src/console/engineBridge.ts +258 -0
  90. package/src/console/gemini.ts +106 -0
  91. package/src/console/grading.ts +250 -0
  92. package/src/console/util.ts +45 -0
  93. package/src/fiction/continuity.ts +372 -0
  94. package/src/fiction/crash-protection.ts +111 -0
  95. package/src/fiction/diagnostics.ts +208 -0
  96. package/src/fiction/diff.ts +74 -0
  97. package/src/fiction/entity-state-machine.ts +214 -0
  98. package/src/fiction/nive-engine.ts +404 -0
  99. package/src/fiction/pipeline-selftest.ts +132 -0
  100. package/src/fiction/seed-control.ts +193 -0
  101. package/src/fiction/story-engine.ts +326 -0
  102. package/src/fiction/types.ts +68 -0
  103. package/src/flatten-guide.md +379 -0
  104. package/src/index.css +14 -0
  105. package/src/index.orig.css +13 -0
  106. package/src/lib/academic-sources.base.ts +188 -0
  107. package/src/lib/academic-sources.orig.ts +28 -0
  108. package/src/lib/academic-sources.ts +10 -0
  109. package/src/lib/advanced-math.ts +119 -0
  110. package/src/lib/adversarial-engine.base.ts +409 -0
  111. package/src/lib/adversarial-engine.ts +82 -0
  112. package/src/lib/ai-revision.ts +623 -0
  113. package/src/lib/app-state.tsx +426 -0
  114. package/src/lib/artifact-registry.ts +97 -0
  115. package/src/lib/artifacts.ts +180 -0
  116. package/src/lib/atlas-dr.ts +167 -0
  117. package/src/lib/browser-mtls.ts +127 -0
  118. package/src/lib/browser-queue.ts +221 -0
  119. package/src/lib/browser-search-scraper.base.ts +382 -0
  120. package/src/lib/browser-search-scraper.orig.ts +90 -0
  121. package/src/lib/browser-search-scraper.ts +10 -0
  122. package/src/lib/calc-interceptor.ts +82 -0
  123. package/src/lib/citation-lane-tap.ts +78 -0
  124. package/src/lib/citation-ledger-store.ts +369 -0
  125. package/src/lib/citation-ledger.ts +203 -0
  126. package/src/lib/compute-sandbox.ts +215 -0
  127. package/src/lib/compute.worker.ts +153 -0
  128. package/src/lib/connectors/gemini.ts +120 -0
  129. package/src/lib/connectors/jina.ts +233 -0
  130. package/src/lib/connectors/marketdata.ts +51 -0
  131. package/src/lib/connectors/prismafetch.base.ts +175 -0
  132. package/src/lib/connectors/prismafetch.ts +1 -0
  133. package/src/lib/connectors/serpapi.ts +65 -0
  134. package/src/lib/connectors/wikidata.ts +44 -0
  135. package/src/lib/constraints.ts +331 -0
  136. package/src/lib/continuation-detector.base.ts +153 -0
  137. package/src/lib/continuation-detector.ts +48 -0
  138. package/src/lib/contradraft.ts +168 -0
  139. package/src/lib/cors-proxy.ts +120 -0
  140. package/src/lib/coverage.ts +81 -0
  141. package/src/lib/debug/architecture-prescription.ts +556 -0
  142. package/src/lib/debug/covea-repair.ts +543 -0
  143. package/src/lib/debug/helios-ground.ts +319 -0
  144. package/src/lib/debug/intent-decomposer.ts +281 -0
  145. package/src/lib/debug/intent-lattice.ts +349 -0
  146. package/src/lib/debug/pipeline-diagnosis.ts +1149 -0
  147. package/src/lib/debug/pipeline-trace-bus.ts +424 -0
  148. package/src/lib/debug/prompt-forge.ts +678 -0
  149. package/src/lib/debug/repair-sites.ts +513 -0
  150. package/src/lib/debug/research-phase.ts +266 -0
  151. package/src/lib/debug/retrieval-context.ts +76 -0
  152. package/src/lib/debug/retrieval-hardener.ts +142 -0
  153. package/src/lib/debug/scraper-debug-runner.ts +576 -0
  154. package/src/lib/debug/scraper-forensics.ts +418 -0
  155. package/src/lib/debug/scraper-lane-roadmap.ts +136 -0
  156. package/src/lib/debug/self-test.ts +415 -0
  157. package/src/lib/debug/step-attribution.ts +211 -0
  158. package/src/lib/debug/template-rubric.ts +301 -0
  159. package/src/lib/debug/unified-innovation.ts +126 -0
  160. package/src/lib/debug/veritas-hybrid-scraper.ts +335 -0
  161. package/src/lib/defense-registry.ts +104 -0
  162. package/src/lib/defenses.ts +162 -0
  163. package/src/lib/deterministic-citation-ledger.ts +174 -0
  164. package/src/lib/elo-registry.base.ts +117 -0
  165. package/src/lib/elo-registry.ts +1 -0
  166. package/src/lib/entity-resolver.ts +291 -0
  167. package/src/lib/failure-modes.ts +267 -0
  168. package/src/lib/feature-registry.ts +69 -0
  169. package/src/lib/flaw-registry.ts +143 -0
  170. package/src/lib/flaws/_template.ts +52 -0
  171. package/src/lib/flaws/builtins.ts +63 -0
  172. package/src/lib/flaws/finance.ts +169 -0
  173. package/src/lib/flaws/fixers.ts +10 -0
  174. package/src/lib/flaws/index.ts +32 -0
  175. package/src/lib/flaws/legal.ts +157 -0
  176. package/src/lib/flaws/medical.ts +188 -0
  177. package/src/lib/flaws/original-defenses-pack.ts +81 -0
  178. package/src/lib/flaws/sample-declarative-pack.json +38 -0
  179. package/src/lib/flaws/selftest.ts +201 -0
  180. package/src/lib/flaws/software-extended.ts +125 -0
  181. package/src/lib/flaws/software-rn-webgl.ts +182 -0
  182. package/src/lib/flaws/statistics-advanced.ts +46 -0
  183. package/src/lib/flaws/statistics.ts +61 -0
  184. package/src/lib/gbse/config.ts +20 -0
  185. package/src/lib/gbse/engine.ts +226 -0
  186. package/src/lib/gbse/graph.ts +118 -0
  187. package/src/lib/gbse/graph.worker.ts +21 -0
  188. package/src/lib/gbse/tests.ts +117 -0
  189. package/src/lib/gbse/tiers.ts +65 -0
  190. package/src/lib/gbse/types.ts +94 -0
  191. package/src/lib/innovation-genome-engine-v2.orig.ts +1001 -0
  192. package/src/lib/innovation-genome-engine-v2.ts +3 -0
  193. package/src/lib/innovation-genome-engine.orig.ts +330 -0
  194. package/src/lib/innovation-genome-engine.ts +3 -0
  195. package/src/lib/innovation-genome-v10.orig.ts +314 -0
  196. package/src/lib/innovation-genome-v10.ts +2 -0
  197. package/src/lib/innovation-genome-v3.orig.ts +2015 -0
  198. package/src/lib/innovation-genome-v3.ts +2 -0
  199. package/src/lib/innovation-genome-v4.orig.ts +1959 -0
  200. package/src/lib/innovation-genome-v4.ts +2 -0
  201. package/src/lib/innovation-genome-v5.orig.ts +1210 -0
  202. package/src/lib/innovation-genome-v5.ts +2 -0
  203. package/src/lib/innovation-genome-v7.orig.ts +2549 -0
  204. package/src/lib/innovation-genome-v7.ts +2 -0
  205. package/src/lib/innovation-genome-v8.orig.ts +1485 -0
  206. package/src/lib/innovation-genome-v8.ts +2 -0
  207. package/src/lib/innovation-genome-v9.orig.ts +643 -0
  208. package/src/lib/innovation-genome-v9.ts +2 -0
  209. package/src/lib/jina.base.ts +293 -0
  210. package/src/lib/jina.ts +1 -0
  211. package/src/lib/live-telemetry.ts +61 -0
  212. package/src/lib/longwriter.ts +84 -0
  213. package/src/lib/manuscript-grade-v2.ts +298 -0
  214. package/src/lib/memory-governor.ts +173 -0
  215. package/src/lib/memory-stress-tests.ts +248 -0
  216. package/src/lib/model-intelligence.ts +48 -0
  217. package/src/lib/model-rotator.ts +75 -0
  218. package/src/lib/models.orig.ts +513 -0
  219. package/src/lib/models.ts +151 -0
  220. package/src/lib/n-deep.base.ts +592 -0
  221. package/src/lib/n-deep.ts +51 -0
  222. package/src/lib/nih-simulator.ts +56 -0
  223. package/src/lib/nih-vulnerability-fixes.ts +460 -0
  224. package/src/lib/omega-templates.base.ts +294 -0
  225. package/src/lib/omega-templates.ts +225 -0
  226. package/src/lib/omni-nexus.ts +64 -0
  227. package/src/lib/oracle-adapters.ts +67 -0
  228. package/src/lib/oracle-registry.ts +163 -0
  229. package/src/lib/orchestrator.ts +357 -0
  230. package/src/lib/output-boundary.ts +235 -0
  231. package/src/lib/overrides/vite-native-chaos-harness.ts +154 -0
  232. package/src/lib/overrides/vite-native-contract-plane.ts +245 -0
  233. package/src/lib/overrides/vite-native-doctor-plane.ts +208 -0
  234. package/src/lib/overrides/vite-native-knowledge-store.ts +267 -0
  235. package/src/lib/overrides/vite-native-policy-plane.ts +190 -0
  236. package/src/lib/overrides/vite-native-replay-plane.ts +197 -0
  237. package/src/lib/overrides/vite-native-runtime-plane.ts +106 -0
  238. package/src/lib/overrides/vite-native-scraper.ts +848 -0
  239. package/src/lib/overrides/vite-native-selftest-functional.ts +217 -0
  240. package/src/lib/overrides/vite-native-selftest.ts +183 -0
  241. package/src/lib/overrides/vite-native-snapshot-plane.ts +123 -0
  242. package/src/lib/philosophy-toolkit.ts +75 -0
  243. package/src/lib/pipeline.orig.ts +659 -0
  244. package/src/lib/pipeline.ts +42 -0
  245. package/src/lib/precache.ts +128 -0
  246. package/src/lib/py-sandbox.ts +205 -0
  247. package/src/lib/quality-score.ts +96 -0
  248. package/src/lib/quant-engine.ts +231 -0
  249. package/src/lib/quant-lib.ts +80 -0
  250. package/src/lib/reportos.ts +175 -0
  251. package/src/lib/research-os.ts +306 -0
  252. package/src/lib/resource-estimator.ts +114 -0
  253. package/src/lib/rpm-governor.ts +93 -0
  254. package/src/lib/runtime-estimator.ts +135 -0
  255. package/src/lib/sage/empty-space-v6.ts +560 -0
  256. package/src/lib/sage/empty-space-v7.ts +222 -0
  257. package/src/lib/sage/empty-space.ts +733 -0
  258. package/src/lib/sage/engine.ts +786 -0
  259. package/src/lib/sage/index.ts +17 -0
  260. package/src/lib/sage/judge.ts +246 -0
  261. package/src/lib/sage/prng.ts +53 -0
  262. package/src/lib/sage/reality-grounding.ts +380 -0
  263. package/src/lib/sage/repetition.ts +151 -0
  264. package/src/lib/sage/saga-os-v2-engines.ts +1870 -0
  265. package/src/lib/sage/saga-os-v2.ts +274 -0
  266. package/src/lib/sage/saga-os-v3-core.ts +1491 -0
  267. package/src/lib/sage/saga-os-v3-release.ts +739 -0
  268. package/src/lib/sage/saga-os-v4-aureate.ts +1161 -0
  269. package/src/lib/sage/saga-os-v4.ts +212 -0
  270. package/src/lib/sage/saga-os-v5.ts +205 -0
  271. package/src/lib/sage/saga-os-v6.ts +346 -0
  272. package/src/lib/sage/saga-os-v7.ts +314 -0
  273. package/src/lib/sage/saga-os-v8.ts +505 -0
  274. package/src/lib/sage/saga-os.ts +329 -0
  275. package/src/lib/sage/taxonomy.ts +403 -0
  276. package/src/lib/sage/unified-roll.ts +524 -0
  277. package/src/lib/sage/worked-sketches.ts +44 -0
  278. package/src/lib/sage.ts +166 -0
  279. package/src/lib/scraper-debug-bus.ts +53 -0
  280. package/src/lib/scraper-enhanced.orig.ts +153 -0
  281. package/src/lib/scraper-enhanced.ts +10 -0
  282. package/src/lib/scraper-hardener.base.orig.ts +155 -0
  283. package/src/lib/scraper-hardener.base.ts +317 -0
  284. package/src/lib/scraper-hardener.ts +1 -0
  285. package/src/lib/scraper-palisade/palisade-adjudicator.orig.ts +419 -0
  286. package/src/lib/scraper-palisade/palisade-adjudicator.ts +13 -0
  287. package/src/lib/scraper-vnext/arbiter-omega.orig.ts +688 -0
  288. package/src/lib/scraper-vnext/arbiter-omega.ts +13 -0
  289. package/src/lib/scraper-vnext/canonical-portfolio-augments.ts +479 -0
  290. package/src/lib/scraper-vnext/canonical-portfolio-orchestrator.orig.ts +1529 -0
  291. package/src/lib/scraper-vnext/canonical-portfolio-orchestrator.ts +13 -0
  292. package/src/lib/scraper-vnext/conclave-omega.ts +1830 -0
  293. package/src/lib/scraper-vnext/content-extractor-v2.ts +226 -0
  294. package/src/lib/scraper-vnext/diagnostics-suite.ts +36 -0
  295. package/src/lib/scraper-vnext/epistemic-packer.ts +97 -0
  296. package/src/lib/scraper-vnext/fusion-v2.ts +65 -0
  297. package/src/lib/scraper-vnext/hydra-reader.orig.ts +1216 -0
  298. package/src/lib/scraper-vnext/hydra-reader.ts +13 -0
  299. package/src/lib/scraper-vnext/native-scraper-browser-vnext.orig.ts +91 -0
  300. package/src/lib/scraper-vnext/native-scraper-browser-vnext.ts +13 -0
  301. package/src/lib/scraper-vnext/nexus-consensus.orig.ts +905 -0
  302. package/src/lib/scraper-vnext/nexus-consensus.ts +13 -0
  303. package/src/lib/scraper-vnext/portfolio-consensus-adjudicator.ts +804 -0
  304. package/src/lib/scraper-vnext/portfolio-consensus-memory.ts +377 -0
  305. package/src/lib/scraper-vnext/portfolio-terminal-governor.ts +548 -0
  306. package/src/lib/scraper-vnext/query-strategist.orig.ts +224 -0
  307. package/src/lib/scraper-vnext/query-strategist.ts +423 -0
  308. package/src/lib/scraper-vnext/retrieval-accelerator.ts +708 -0
  309. package/src/lib/scraper-vnext/retrieval-audit-augments.ts +477 -0
  310. package/src/lib/scraper-vnext/retrieval-control-plane.ts +904 -0
  311. package/src/lib/scraper-vnext/retrieval-policy-augments.ts +358 -0
  312. package/src/lib/scraper-vnext/safe-fetch-v2.ts +157 -0
  313. package/src/lib/scraper-vnext/sentinel-omega.ts +56 -0
  314. package/src/lib/scraper-vnext/sentinel-orchestrator.ts +69 -0
  315. package/src/lib/scraper-vnext/sibyl-oracle.orig.ts +413 -0
  316. package/src/lib/scraper-vnext/sibyl-oracle.ts +13 -0
  317. package/src/lib/scraper-vnext/smart-read-v2.ts +55 -0
  318. package/src/lib/scraper-vnext/spa-rescue-bridge.ts +608 -0
  319. package/src/lib/scraper-vnext/strata-engine.orig.ts +2666 -0
  320. package/src/lib/scraper-vnext/strata-engine.ts +13 -0
  321. package/src/lib/scraper-vnext/structured-source-adapter.orig.ts +369 -0
  322. package/src/lib/scraper-vnext/structured-source-adapter.ts +34 -0
  323. package/src/lib/scraper-vnext/terminal-complete.ts +224 -0
  324. package/src/lib/scraper-vnext/terminal-final.ts +277 -0
  325. package/src/lib/scraper-vnext/terminal-saturation.ts +345 -0
  326. package/src/lib/scraper-vnext/terminal-wire.ts +425 -0
  327. package/src/lib/scraper-vnext/vanguard-titanium.orig.ts +467 -0
  328. package/src/lib/scraper-vnext/vanguard-titanium.ts +17 -0
  329. package/src/lib/search-cache.ts +138 -0
  330. package/src/lib/sloop-runner.base.ts +223 -0
  331. package/src/lib/sloop-runner.ts +104 -0
  332. package/src/lib/sloop.ts +114 -0
  333. package/src/lib/small-model-adapters.ts +82 -0
  334. package/src/lib/sscp.ts +86 -0
  335. package/src/lib/system-map.ts +54 -0
  336. package/src/lib/uni-node.ts +86 -0
  337. package/src/lib/universal-rigor-guard.ts +433 -0
  338. package/src/lib/v15-gate-testbed.ts +274 -0
  339. package/src/lib/v15-gemini.base.ts +89 -0
  340. package/src/lib/v15-gemini.ts +1 -0
  341. package/src/lib/v15-grounding.orig.ts +241 -0
  342. package/src/lib/v15-grounding.ts +79 -0
  343. package/src/lib/v15-pipeline.base.ts +769 -0
  344. package/src/lib/v15-pipeline.orig.ts +1154 -0
  345. package/src/lib/v15-pipeline.ts +674 -0
  346. package/src/lib/v15-questions.ts +64 -0
  347. package/src/lib/v15-rate-limiter.orig.ts +91 -0
  348. package/src/lib/v15-rate-limiter.ts +48 -0
  349. package/src/lib/v15-state.base.ts +87 -0
  350. package/src/lib/v15-state.ts +28 -0
  351. package/src/lib/visual-table-generator.tsx +207 -0
  352. package/src/lib/wasm-runtime.ts +133 -0
  353. package/src/lib/williams-persona-guide.ts +265 -0
  354. package/src/lib/williams-style.base.ts +464 -0
  355. package/src/lib/williams-style.ts +59 -0
  356. package/src/lib/worker-pool.ts +96 -0
  357. package/src/lib/writing-tiers.ts +125 -0
  358. package/src/main.orig.tsx +10 -0
  359. package/src/main.tsx +10 -0
  360. package/src/utils/cn.orig.ts +6 -0
  361. package/src/utils/cn.ts +6 -0
  362. package/src/vite-env.d.ts +1 -0
  363. package/tsconfig.json +31 -0
  364. package/unify.mjs +537 -0
  365. package/vite.config.ts +18 -0
@@ -0,0 +1,548 @@
1
+ /**
2
+ * portfolio-terminal-governor.ts
3
+ * ============================================================================
4
+ * Corrective, context-scoped memory governor over portfolio-consensus-memory.ts.
5
+ * Additive only. Default behavior preserves canonical evidence and records
6
+ * advisory telemetry after the run.
7
+ */
8
+
9
+ import {
10
+ ENGINE_FAMILY,
11
+ familyOf,
12
+ groundWithAdaptivePortfolioConsensus as canonicalMemoryGround,
13
+ groundWithPortfolioConsensus,
14
+ } from "./portfolio-consensus-memory";
15
+ import {
16
+ extractClaimTexts,
17
+ tokenJaccard,
18
+ type PortfolioConsensusOptions,
19
+ type PortfolioConsensusResult,
20
+ } from "./portfolio-consensus-adjudicator";
21
+ import type { AgreementCell, CanonicalLaneId, LaneExecution } from "./canonical-portfolio-orchestrator";
22
+
23
+ const MEMORY_EPOCH = "portfolio-terminal-governor-v1";
24
+ const DB_NAME = "portfolio-terminal-governor";
25
+ const DB_VERSION = 1;
26
+ const STORE_LANE = "lane-health";
27
+ const STORE_PAIR = "family-pairs";
28
+
29
+ const CANONICAL_PRIORITY: CanonicalLaneId[] = [
30
+ "terminal-wire",
31
+ "sentinel-orchestrator",
32
+ "vanguard-packer",
33
+ "sentinel-omega",
34
+ "omni-nexus",
35
+ "structured-search",
36
+ ];
37
+
38
+ const WINNER_ELIGIBLE = new Set<CanonicalLaneId>([
39
+ "terminal-wire",
40
+ "sentinel-orchestrator",
41
+ "vanguard-packer",
42
+ "sentinel-omega",
43
+ "omni-nexus",
44
+ ]);
45
+
46
+ export interface TerminalGovernorOptions extends PortfolioConsensusOptions {
47
+ memoryProfile?: string;
48
+ adaptiveQuarantine?: boolean;
49
+ quarantineMinSamples?: number;
50
+ quarantineCooldownMs?: number;
51
+ minimumEnabledLanes?: number;
52
+ minimumIndependentFamilies?: number;
53
+ claimEchoThreshold?: number;
54
+ blockEchoThreshold?: number;
55
+ topClaims?: number;
56
+ recordMemory?: boolean;
57
+ requestPersistentStorage?: boolean;
58
+ memoryEpoch?: string;
59
+ }
60
+
61
+ export interface LaneHealth {
62
+ laneId: CanonicalLaneId;
63
+ profile: string;
64
+ fulfilled: number;
65
+ acceptable: number;
66
+ wins: number;
67
+ rejected: number;
68
+ timedOut: number;
69
+ aborted: number;
70
+ completedSamples: number;
71
+ hardFailureCount: number;
72
+ claimComparableRuns: number;
73
+ strictClaimEchoRuns: number;
74
+ availabilityPosterior: number;
75
+ acceptabilityPosterior: number;
76
+ strictEchoPosterior: number;
77
+ rawWinRate: number;
78
+ meanFulfilledMs: number;
79
+ recencyWeight: number;
80
+ advisoryUtility: number;
81
+ lastSeenAt: number;
82
+ }
83
+
84
+ export interface FamilyPairPrior {
85
+ familyA: string;
86
+ familyB: string;
87
+ profile: string;
88
+ claimObservations: number;
89
+ claimEchoes: number;
90
+ claimEchoRate: number;
91
+ blockObservations: number;
92
+ blockEchoes: number;
93
+ blockEchoRate: number;
94
+ lastSeenAt: number;
95
+ }
96
+
97
+ export interface SafeLanePlan {
98
+ enableLanes: Partial<Record<CanonicalLaneId, boolean>>;
99
+ requestedLanes: CanonicalLaneId[];
100
+ enabledLanes: CanonicalLaneId[];
101
+ temporarilyQuarantined: Array<{ laneId: CanonicalLaneId; until: number; reason: string }>;
102
+ protectedLanes: CanonicalLaneId[];
103
+ enabledWinnerFamilies: string[];
104
+ }
105
+
106
+ export interface TerminalMemorySnapshot {
107
+ epoch: string;
108
+ profile: string;
109
+ laneHealth: LaneHealth[];
110
+ familyPriors: FamilyPairPrior[];
111
+ }
112
+
113
+ export interface TerminalGovernorMetadata {
114
+ plan: SafeLanePlan;
115
+ snapshot: TerminalMemorySnapshot;
116
+ persistence: "not-requested" | "granted" | "denied" | "unavailable";
117
+ strictCorroboratingFamilies: Record<string, string[]>;
118
+ caveat: string;
119
+ }
120
+
121
+ type CanonicalMemoryResult = Awaited<ReturnType<typeof canonicalMemoryGround>>;
122
+ export type TerminalGovernorResult = CanonicalMemoryResult & { terminalGovernor: TerminalGovernorMetadata };
123
+
124
+ interface LaneHealthRecord {
125
+ key: string;
126
+ epoch: string;
127
+ profile: string;
128
+ laneId: CanonicalLaneId;
129
+ fulfilled: number;
130
+ acceptable: number;
131
+ wins: number;
132
+ rejected: number;
133
+ timedOut: number;
134
+ aborted: number;
135
+ claimComparableRuns: number;
136
+ strictClaimEchoRuns: number;
137
+ totalFulfilledMs: number;
138
+ lastSeenAt: number;
139
+ }
140
+
141
+ interface FamilyPairRecord {
142
+ key: string;
143
+ epoch: string;
144
+ profile: string;
145
+ familyA: string;
146
+ familyB: string;
147
+ claimObservations: number;
148
+ claimEchoes: number;
149
+ blockObservations: number;
150
+ blockEchoes: number;
151
+ lastSeenAt: number;
152
+ }
153
+
154
+ type StoreName = typeof STORE_LANE | typeof STORE_PAIR;
155
+ const MEMORY_LANE = new Map<string, LaneHealthRecord>();
156
+ const MEMORY_PAIR = new Map<string, FamilyPairRecord>();
157
+
158
+ function mirrorFor(store: StoreName): Map<string, any> {
159
+ return store === STORE_LANE ? MEMORY_LANE : MEMORY_PAIR;
160
+ }
161
+
162
+ let dbPromise: Promise<IDBDatabase | null> | null = null;
163
+ function openDb(): Promise<IDBDatabase | null> {
164
+ if (dbPromise) return dbPromise;
165
+ dbPromise = new Promise((resolve) => {
166
+ if (typeof indexedDB === "undefined") {
167
+ resolve(null);
168
+ return;
169
+ }
170
+ try {
171
+ const request = indexedDB.open(DB_NAME, DB_VERSION);
172
+ request.onupgradeneeded = () => {
173
+ const db = request.result;
174
+ if (!db.objectStoreNames.contains(STORE_LANE)) db.createObjectStore(STORE_LANE, { keyPath: "key" });
175
+ if (!db.objectStoreNames.contains(STORE_PAIR)) db.createObjectStore(STORE_PAIR, { keyPath: "key" });
176
+ };
177
+ request.onsuccess = () => resolve(request.result);
178
+ request.onerror = () => resolve(null);
179
+ request.onblocked = () => resolve(null);
180
+ } catch {
181
+ resolve(null);
182
+ }
183
+ });
184
+ return dbPromise;
185
+ }
186
+
187
+ async function readRecord<T extends { key: string }>(store: StoreName, key: string): Promise<T | null> {
188
+ const mirror = mirrorFor(store);
189
+ const fallback = (mirror.get(key) as T | undefined) ?? null;
190
+ const db = await openDb();
191
+ if (!db) return fallback;
192
+ return new Promise((resolve) => {
193
+ try {
194
+ const request = db.transaction(store, "readonly").objectStore(store).get(key);
195
+ request.onsuccess = () => {
196
+ const result = (request.result as T | undefined) ?? fallback;
197
+ if (result) mirror.set(key, result);
198
+ resolve(result);
199
+ };
200
+ request.onerror = () => resolve(fallback);
201
+ } catch {
202
+ resolve(fallback);
203
+ }
204
+ });
205
+ }
206
+
207
+ async function readAllRecords<T extends { key: string }>(store: StoreName): Promise<T[]> {
208
+ const mirror = mirrorFor(store);
209
+ const db = await openDb();
210
+ if (!db) return Array.from(mirror.values()) as T[];
211
+ return new Promise((resolve) => {
212
+ try {
213
+ const request = db.transaction(store, "readonly").objectStore(store).getAll();
214
+ request.onsuccess = () => {
215
+ const merged = new Map<string, T>();
216
+ for (const record of request.result as T[]) {
217
+ merged.set(record.key, record);
218
+ mirror.set(record.key, record);
219
+ }
220
+ for (const record of mirror.values()) merged.set(record.key, record as T);
221
+ resolve(Array.from(merged.values()));
222
+ };
223
+ request.onerror = () => resolve(Array.from(mirror.values()) as T[]);
224
+ } catch {
225
+ resolve(Array.from(mirror.values()) as T[]);
226
+ }
227
+ });
228
+ }
229
+
230
+ async function updateRecord<T extends { key: string }>(store: StoreName, key: string, create: () => T, mutate: (record: T) => void): Promise<void> {
231
+ const mirror = mirrorFor(store);
232
+ const db = await openDb();
233
+ if (!db) {
234
+ const record = (mirror.get(key) as T | undefined) ?? create();
235
+ mutate(record);
236
+ mirror.set(key, record);
237
+ return;
238
+ }
239
+ await new Promise<void>((resolve) => {
240
+ let completed = false;
241
+ const finish = () => {
242
+ if (!completed) {
243
+ completed = true;
244
+ resolve();
245
+ }
246
+ };
247
+ const updateMirror = () => {
248
+ const record = (mirror.get(key) as T | undefined) ?? create();
249
+ mutate(record);
250
+ mirror.set(key, record);
251
+ };
252
+ try {
253
+ const tx = db.transaction(store, "readwrite");
254
+ const objectStore = tx.objectStore(store);
255
+ const request = objectStore.get(key);
256
+ request.onsuccess = () => {
257
+ const record = (request.result as T | undefined) ?? (mirror.get(key) as T | undefined) ?? create();
258
+ mutate(record);
259
+ mirror.set(key, record);
260
+ objectStore.put(record);
261
+ };
262
+ request.onerror = updateMirror;
263
+ tx.oncomplete = finish;
264
+ tx.onerror = () => { updateMirror(); finish(); };
265
+ tx.onabort = () => { updateMirror(); finish(); };
266
+ } catch {
267
+ updateMirror();
268
+ finish();
269
+ }
270
+ });
271
+ }
272
+
273
+ function normalizeProfile(profile: string | undefined): string {
274
+ const normalized = (profile ?? "global").trim().replace(/[^a-z0-9.-]/gi, "").slice(0, 64);
275
+ return normalized || "global";
276
+ }
277
+
278
+ function normalizeEpoch(epoch: string | undefined): string {
279
+ const normalized = (epoch ?? MEMORY_EPOCH).trim().replace(/[^a-z0-9.-]/gi, "").slice(0, 96);
280
+ return normalized || MEMORY_EPOCH;
281
+ }
282
+
283
+ function laneKey(epoch: string, profile: string, laneId: CanonicalLaneId): string {
284
+ return [epoch, profile, laneId].join("\u0000");
285
+ }
286
+
287
+ function sortedFamilyPair(left: string, right: string): [string, string] {
288
+ return left <= right ? [left, right] : [right, left];
289
+ }
290
+
291
+ function pairKey(epoch: string, profile: string, familyA: string, familyB: string): string {
292
+ const [left, right] = sortedFamilyPair(familyA, familyB);
293
+ return [epoch, profile, left, right].join("\u0000");
294
+ }
295
+
296
+ function recencyWeight(lastSeenAt: number, halfLifeDays = 14): number {
297
+ if (lastSeenAt <= 0) return 0;
298
+ const ageDays = Math.max(0, (Date.now() - lastSeenAt) / 86_400_000);
299
+ return Math.exp((-Math.LN2 / halfLifeDays) * ageDays);
300
+ }
301
+
302
+ function boundedInteger(value: number | undefined, fallback: number, minimum: number, maximum: number): number {
303
+ if (value === undefined || !Number.isFinite(value)) return fallback;
304
+ return Math.max(minimum, Math.min(maximum, Math.floor(value)));
305
+ }
306
+
307
+ function boundedUnit(value: number | undefined, fallback: number): number {
308
+ if (value === undefined || !Number.isFinite(value)) return fallback;
309
+ return Math.max(0, Math.min(1, value));
310
+ }
311
+
312
+ function agreementValue(agreement: AgreementCell[], left: CanonicalLaneId, right: CanonicalLaneId): number | undefined {
313
+ for (const cell of agreement) {
314
+ if ((cell.left === left && cell.right === right) || (cell.left === right && cell.right === left)) return cell.tokenJaccard;
315
+ }
316
+ return undefined;
317
+ }
318
+
319
+ function strictClaimEcho(leftClaims: string[], rightClaims: string[], threshold: number): boolean {
320
+ return leftClaims.some((left) => rightClaims.some((right) => tokenJaccard(left, right) >= threshold));
321
+ }
322
+
323
+ async function rawLaneRecord(laneId: CanonicalLaneId, profile: string, epoch: string): Promise<LaneHealthRecord> {
324
+ const key = laneKey(epoch, profile, laneId);
325
+ return (await readRecord<LaneHealthRecord>(STORE_LANE, key)) ?? {
326
+ key, epoch, profile, laneId,
327
+ fulfilled: 0, acceptable: 0, wins: 0, rejected: 0, timedOut: 0, aborted: 0,
328
+ claimComparableRuns: 0, strictClaimEchoRuns: 0, totalFulfilledMs: 0, lastSeenAt: 0,
329
+ };
330
+ }
331
+
332
+ export async function getTerminalLaneHealth(laneId: CanonicalLaneId, options?: { memoryProfile?: string; memoryEpoch?: string }): Promise<LaneHealth> {
333
+ const profile = normalizeProfile(options?.memoryProfile);
334
+ const epoch = normalizeEpoch(options?.memoryEpoch);
335
+ const record = await rawLaneRecord(laneId, profile, epoch);
336
+ const completedSamples = record.fulfilled + record.rejected + record.timedOut;
337
+ const hardFailureCount = record.rejected + record.timedOut;
338
+ const availabilityPosterior = (record.fulfilled + 1) / (completedSamples + 2);
339
+ const acceptabilityPosterior = (record.acceptable + 1) / (record.fulfilled + 2);
340
+ const strictEchoPosterior = (record.strictClaimEchoRuns + 1) / (record.claimComparableRuns + 2);
341
+ const rawWinRate = record.fulfilled > 0 ? record.wins / record.fulfilled : 0;
342
+ const meanFulfilledMs = record.fulfilled > 0 ? record.totalFulfilledMs / record.fulfilled : 0;
343
+ const recency = recencyWeight(record.lastSeenAt);
344
+ const advisoryUtility = availabilityPosterior * acceptabilityPosterior * (0.5 + 0.5 * strictEchoPosterior) * (record.lastSeenAt > 0 ? recency : 1);
345
+ return { laneId, profile, fulfilled: record.fulfilled, acceptable: record.acceptable, wins: record.wins, rejected: record.rejected, timedOut: record.timedOut, aborted: record.aborted, completedSamples, hardFailureCount, claimComparableRuns: record.claimComparableRuns, strictClaimEchoRuns: record.strictClaimEchoRuns, availabilityPosterior, acceptabilityPosterior, strictEchoPosterior, rawWinRate, meanFulfilledMs, recencyWeight: recency, advisoryUtility, lastSeenAt: record.lastSeenAt };
346
+ }
347
+
348
+ export async function getTerminalFamilyPrior(familyA: string, familyB: string, options?: { memoryProfile?: string; memoryEpoch?: string }): Promise<FamilyPairPrior> {
349
+ const profile = normalizeProfile(options?.memoryProfile);
350
+ const epoch = normalizeEpoch(options?.memoryEpoch);
351
+ const [left, right] = sortedFamilyPair(familyA, familyB);
352
+ const key = pairKey(epoch, profile, left, right);
353
+ const record = (await readRecord<FamilyPairRecord>(STORE_PAIR, key)) ?? { key, epoch, profile, familyA: left, familyB: right, claimObservations: 0, claimEchoes: 0, blockObservations: 0, blockEchoes: 0, lastSeenAt: 0 };
354
+ return { familyA: left, familyB: right, profile, claimObservations: record.claimObservations, claimEchoes: record.claimEchoes, claimEchoRate: record.claimObservations > 0 ? record.claimEchoes / record.claimObservations : 0, blockObservations: record.blockObservations, blockEchoes: record.blockEchoes, blockEchoRate: record.blockObservations > 0 ? record.blockEchoes / record.blockObservations : 0, lastSeenAt: record.lastSeenAt };
355
+ }
356
+
357
+ export async function getTerminalMemorySnapshot(options?: { memoryProfile?: string; memoryEpoch?: string; laneIds?: CanonicalLaneId[] }): Promise<TerminalMemorySnapshot> {
358
+ const profile = normalizeProfile(options?.memoryProfile);
359
+ const epoch = normalizeEpoch(options?.memoryEpoch);
360
+ const laneIds = options?.laneIds ?? (Object.keys(ENGINE_FAMILY) as CanonicalLaneId[]);
361
+ const laneHealth = await Promise.all(laneIds.map((laneId) => getTerminalLaneHealth(laneId, { memoryProfile: profile, memoryEpoch: epoch })));
362
+ const pairRecords = await readAllRecords<FamilyPairRecord>(STORE_PAIR);
363
+ const familyPriors = pairRecords.filter((record) => record.epoch === epoch && record.profile === profile).map((record) => ({ familyA: record.familyA, familyB: record.familyB, profile, claimObservations: record.claimObservations, claimEchoes: record.claimEchoes, claimEchoRate: record.claimObservations > 0 ? record.claimEchoes / record.claimObservations : 0, blockObservations: record.blockObservations, blockEchoes: record.blockEchoes, blockEchoRate: record.blockObservations > 0 ? record.blockEchoes / record.blockObservations : 0, lastSeenAt: record.lastSeenAt }));
364
+ return { epoch, profile, laneHealth, familyPriors };
365
+ }
366
+
367
+ interface PairRunAggregate { familyA: string; familyB: string; claimComparable: boolean; claimEcho: boolean; blockComparable: boolean; blockEcho: boolean; }
368
+
369
+ async function recordCompletedRun(result: PortfolioConsensusResult, options: { profile: string; epoch: string; claimEchoThreshold: number; blockEchoThreshold: number; topClaims: number }): Promise<Record<string, string[]>> {
370
+ const fulfilled = result.laneResults.filter((lane): lane is LaneExecution & { status: "fulfilled" } => lane.status === "fulfilled");
371
+ const claimsByLane = new Map<CanonicalLaneId, string[]>();
372
+ for (const lane of fulfilled) claimsByLane.set(lane.id, extractClaimTexts(lane.raw).slice(0, options.topClaims));
373
+ const pairAggregates = new Map<string, PairRunAggregate>();
374
+
375
+ for (let left = 0; left < fulfilled.length; left += 1) {
376
+ for (let right = left + 1; right < fulfilled.length; right += 1) {
377
+ const a = fulfilled[left];
378
+ const b = fulfilled[right];
379
+ const familyA = familyOf(a.id);
380
+ const familyB = familyOf(b.id);
381
+ if (familyA === familyB) continue;
382
+ const [first, second] = sortedFamilyPair(familyA, familyB);
383
+ const key = pairKey(options.epoch, options.profile, first, second);
384
+ const aggregate = pairAggregates.get(key) ?? { familyA: first, familyB: second, claimComparable: false, claimEcho: false, blockComparable: false, blockEcho: false };
385
+ const leftClaims = claimsByLane.get(a.id) ?? [];
386
+ const rightClaims = claimsByLane.get(b.id) ?? [];
387
+ if (leftClaims.length > 0 && rightClaims.length > 0) {
388
+ aggregate.claimComparable = true;
389
+ if (strictClaimEcho(leftClaims, rightClaims, options.claimEchoThreshold)) aggregate.claimEcho = true;
390
+ }
391
+ const blockAgreement = agreementValue(result.agreement, a.id, b.id);
392
+ if (blockAgreement !== undefined) {
393
+ aggregate.blockComparable = true;
394
+ if (blockAgreement >= options.blockEchoThreshold) aggregate.blockEcho = true;
395
+ }
396
+ pairAggregates.set(key, aggregate);
397
+ }
398
+ }
399
+
400
+ const strictFamiliesByLane = new Map<CanonicalLaneId, Set<string>>();
401
+ const comparableFamilies = new Set<string>();
402
+ for (const aggregate of pairAggregates.values()) {
403
+ if (aggregate.claimComparable) {
404
+ comparableFamilies.add(aggregate.familyA);
405
+ comparableFamilies.add(aggregate.familyB);
406
+ }
407
+ if (aggregate.claimEcho) {
408
+ for (const lane of fulfilled) {
409
+ const family = familyOf(lane.id);
410
+ const other = family === aggregate.familyA ? aggregate.familyB : family === aggregate.familyB ? aggregate.familyA : null;
411
+ if (other) {
412
+ const set = strictFamiliesByLane.get(lane.id) ?? new Set<string>();
413
+ set.add(other);
414
+ strictFamiliesByLane.set(lane.id, set);
415
+ }
416
+ }
417
+ }
418
+ const key = pairKey(options.epoch, options.profile, aggregate.familyA, aggregate.familyB);
419
+ await updateRecord<FamilyPairRecord>(STORE_PAIR, key, () => ({ key, epoch: options.epoch, profile: options.profile, familyA: aggregate.familyA, familyB: aggregate.familyB, claimObservations: 0, claimEchoes: 0, blockObservations: 0, blockEchoes: 0, lastSeenAt: 0 }), (record) => {
420
+ if (aggregate.claimComparable) record.claimObservations += 1;
421
+ if (aggregate.claimEcho) record.claimEchoes += 1;
422
+ if (aggregate.blockComparable) record.blockObservations += 1;
423
+ if (aggregate.blockEcho) record.blockEchoes += 1;
424
+ record.lastSeenAt = Date.now();
425
+ });
426
+ }
427
+
428
+ for (const lane of result.laneResults) {
429
+ const key = laneKey(options.epoch, options.profile, lane.id);
430
+ await updateRecord<LaneHealthRecord>(STORE_LANE, key, () => ({ key, epoch: options.epoch, profile: options.profile, laneId: lane.id, fulfilled: 0, acceptable: 0, wins: 0, rejected: 0, timedOut: 0, aborted: 0, claimComparableRuns: 0, strictClaimEchoRuns: 0, totalFulfilledMs: 0, lastSeenAt: 0 }), (record) => {
431
+ if (lane.status === "fulfilled") {
432
+ record.fulfilled += 1;
433
+ record.totalFulfilledMs += Math.max(0, lane.elapsedMs);
434
+ if (lane.normalized?.acceptable === true) record.acceptable += 1;
435
+ if (lane.id === result.winnerLane) record.wins += 1;
436
+ if (comparableFamilies.has(familyOf(lane.id))) record.claimComparableRuns += 1;
437
+ if ((strictFamiliesByLane.get(lane.id)?.size ?? 0) > 0) record.strictClaimEchoRuns += 1;
438
+ } else if (lane.status === "rejected") record.rejected += 1;
439
+ else if (lane.status === "timed-out") record.timedOut += 1;
440
+ else if (lane.status === "aborted") record.aborted += 1;
441
+ record.lastSeenAt = Date.now();
442
+ });
443
+ }
444
+
445
+ const strictCorroboratingFamilies: Record<string, string[]> = {};
446
+ for (const lane of result.laneResults) strictCorroboratingFamilies[lane.id] = Array.from(strictFamiliesByLane.get(lane.id) ?? []).sort();
447
+ return strictCorroboratingFamilies;
448
+ }
449
+
450
+ export async function buildSafeLanePlan(portfolioOptions: PortfolioConsensusOptions, memoryOptions?: { memoryProfile?: string; memoryEpoch?: string; quarantineMinSamples?: number; quarantineCooldownMs?: number; minimumEnabledLanes?: number; minimumIndependentFamilies?: number }): Promise<SafeLanePlan> {
451
+ const profile = normalizeProfile(memoryOptions?.memoryProfile);
452
+ const epoch = normalizeEpoch(memoryOptions?.memoryEpoch);
453
+ const minSamples = boundedInteger(memoryOptions?.quarantineMinSamples, 5, 1, 1_000);
454
+ const cooldownMs = boundedInteger(memoryOptions?.quarantineCooldownMs, 60 * 60_000, 1_000, 7 * 24 * 60 * 60_000);
455
+ const minimumEnabled = boundedInteger(memoryOptions?.minimumEnabledLanes, 2, 2, CANONICAL_PRIORITY.length);
456
+ const requested = CANONICAL_PRIORITY.filter((laneId) => portfolioOptions.enableLanes?.[laneId] !== false);
457
+ const requestedWinnerLanes = requested.filter((laneId) => WINNER_ELIGIBLE.has(laneId));
458
+ const requestedFamilies = new Set(requestedWinnerLanes.map(familyOf));
459
+ const minimumFamilies = Math.min(Math.max(1, boundedInteger(memoryOptions?.minimumIndependentFamilies, 2, 1, CANONICAL_PRIORITY.length)), Math.max(1, requestedFamilies.size));
460
+ const health = await Promise.all(requested.map((laneId) => getTerminalLaneHealth(laneId, { memoryProfile: profile, memoryEpoch: epoch })));
461
+ const anchor = requestedWinnerLanes[0];
462
+ const protectedLanes = requested.filter((laneId) => laneId === anchor || laneId === "structured-search");
463
+ const protectedSet = new Set(protectedLanes);
464
+ const now = Date.now();
465
+ const candidates = health.filter((lane) => !protectedSet.has(lane.laneId) && lane.fulfilled === 0 && lane.hardFailureCount >= minSamples && lane.lastSeenAt > 0 && lane.lastSeenAt + cooldownMs > now).sort((left, right) => right.hardFailureCount - left.hardFailureCount || left.lastSeenAt - right.lastSeenAt);
466
+ const enabled = new Set<CanonicalLaneId>(requested);
467
+ const enableLanes: Partial<Record<CanonicalLaneId, boolean>> = { ...(portfolioOptions.enableLanes ?? {}) };
468
+ const temporarilyQuarantined: SafeLanePlan["temporarilyQuarantined"] = [];
469
+ const enabledFamilyCount = (lanes: Set<CanonicalLaneId>) => new Set(Array.from(lanes).filter((laneId) => WINNER_ELIGIBLE.has(laneId)).map(familyOf)).size;
470
+
471
+ for (const candidate of candidates) {
472
+ if (enabled.size - 1 < minimumEnabled) break;
473
+ const trial = new Set(enabled);
474
+ trial.delete(candidate.laneId);
475
+ if (enabledFamilyCount(trial) < minimumFamilies) continue;
476
+ enabled.delete(candidate.laneId);
477
+ enableLanes[candidate.laneId] = false;
478
+ temporarilyQuarantined.push({ laneId: candidate.laneId, until: candidate.lastSeenAt + cooldownMs, reason: `zero fulfilled results across ${candidate.hardFailureCount} completed failures` });
479
+ }
480
+
481
+ return { enableLanes, requestedLanes: requested, enabledLanes: Array.from(enabled), temporarilyQuarantined, protectedLanes, enabledWinnerFamilies: Array.from(new Set(Array.from(enabled).filter((laneId) => WINNER_ELIGIBLE.has(laneId)).map(familyOf))).sort() };
482
+ }
483
+
484
+ export async function requestTerminalMemoryPersistence(): Promise<"granted" | "denied" | "unavailable"> {
485
+ try {
486
+ if (typeof navigator === "undefined" || typeof navigator.storage?.persist !== "function") return "unavailable";
487
+ return (await navigator.storage.persist()) ? "granted" : "denied";
488
+ } catch {
489
+ return "unavailable";
490
+ }
491
+ }
492
+
493
+ export async function groundWithTerminalPortfolioGovernor(question: string, options: TerminalGovernorOptions = {}): Promise<TerminalGovernorResult> {
494
+ const { memoryProfile, memoryEpoch, adaptiveQuarantine = false, quarantineMinSamples, quarantineCooldownMs, minimumEnabledLanes, minimumIndependentFamilies, claimEchoThreshold, blockEchoThreshold, topClaims, recordMemory = true, requestPersistentStorage = false, ...portfolioOptions } = options;
495
+ const profile = normalizeProfile(memoryProfile);
496
+ const epoch = normalizeEpoch(memoryEpoch);
497
+ const claimThreshold = boundedUnit(claimEchoThreshold, 0.60);
498
+ const blockThreshold = boundedUnit(blockEchoThreshold, 0.30);
499
+ const claimLimit = boundedInteger(topClaims, 8, 1, 64);
500
+ const persistence = requestPersistentStorage ? await requestTerminalMemoryPersistence() : "not-requested";
501
+ const plan = adaptiveQuarantine ? await buildSafeLanePlan(portfolioOptions, { memoryProfile: profile, memoryEpoch: epoch, quarantineMinSamples, quarantineCooldownMs, minimumEnabledLanes, minimumIndependentFamilies }) : { enableLanes: { ...(portfolioOptions.enableLanes ?? {}) }, requestedLanes: CANONICAL_PRIORITY.filter((laneId) => portfolioOptions.enableLanes?.[laneId] !== false), enabledLanes: CANONICAL_PRIORITY.filter((laneId) => portfolioOptions.enableLanes?.[laneId] !== false), temporarilyQuarantined: [], protectedLanes: [], enabledWinnerFamilies: Array.from(new Set(CANONICAL_PRIORITY.filter((laneId) => portfolioOptions.enableLanes?.[laneId] !== false && WINNER_ELIGIBLE.has(laneId)).map(familyOf))).sort() };
502
+ const canonicalResult = await canonicalMemoryGround(question, { ...portfolioOptions, enableLanes: plan.enableLanes, adaptivePruning: false, recordOutcome: false });
503
+ let strictCorroboratingFamilies: Record<string, string[]> = {};
504
+ if (recordMemory) strictCorroboratingFamilies = await recordCompletedRun(canonicalResult, { profile, epoch, claimEchoThreshold: claimThreshold, blockEchoThreshold: blockThreshold, topClaims: claimLimit });
505
+ const snapshot = await getTerminalMemorySnapshot({ memoryProfile: profile, memoryEpoch: epoch, laneIds: Object.keys(ENGINE_FAMILY) as CanonicalLaneId[] });
506
+ return { ...canonicalResult, terminalGovernor: { plan, snapshot, persistence, strictCorroboratingFamilies, caveat: "Portfolio memory is advisory routing telemetry, not evidence. Aborted lanes are censored, claim echo is stored separately from boilerplate-sensitive block Jaccard, and temporary quarantine uses zero fulfillment rather than zero wins." } };
507
+ }
508
+
509
+ export async function runPortfolioTerminalGovernorDiagnostics(): Promise<{ ok: boolean; checks: Array<{ id: string; passed: boolean; detail: string }> }> {
510
+ const checks: Array<{ id: string; passed: boolean; detail: string }> = [];
511
+ const add = (id: string, passed: boolean, detail: string) => checks.push({ id, passed, detail });
512
+ const profile = `diagnostic_${Date.now()}_${Math.random().toString(36).slice(2)}`;
513
+ const epoch = `${MEMORY_EPOCH}_diagnostic`;
514
+ const commonText = "The widget market grew twelve percent during the third quarter.";
515
+ const normalized = { ok: true, eligibleForWinner: true, acceptable: true, provider: "diagnostic", evidenceBlock: "A sufficiently long diagnostic evidence block. ".repeat(10), sources: [], sourceCount: 1, claimCount: 1, structuredItemCount: 0, attestedCount: 1, supportedCount: 0, conflictedCount: 0, proof: "verified", qualityVector: [1, 4, 1, 0, 1, 1, 500] as const };
516
+ const fakeResult = { ok: true, provider: "diagnostic", selection: "canonical", canonicalWinnerLane: "terminal-wire", consensusWinnerLane: "terminal-wire", winnerLane: "terminal-wire", count: 1, sources: [], evidenceBlock: normalized.evidenceBlock, consensusConfidence: "moderate", consensusCaveat: "", laneConsensus: [], claimCorroboration: [], decisionLedger: [], agreement: [{ left: "terminal-wire", right: "omni-nexus", tokenJaccard: 0.7 }, { left: "sentinel-orchestrator", right: "omni-nexus", tokenJaccard: 0.7 }], laneResults: [{ id: "terminal-wire", priority: 100, status: "fulfilled", elapsedMs: 100, normalized, raw: { claims: [{ text: commonText }] } }, { id: "sentinel-orchestrator", priority: 95, status: "fulfilled", elapsedMs: 120, normalized, raw: { claims: [{ representativeText: commonText }] } }, { id: "omni-nexus", priority: 60, status: "fulfilled", elapsedMs: 140, normalized, raw: { claims: [{ canonicalText: commonText }] } }, { id: "sentinel-omega", priority: 75, status: "aborted", elapsedMs: 25 }] } as unknown as PortfolioConsensusResult;
517
+ const strict = await recordCompletedRun(fakeResult, { profile, epoch, claimEchoThreshold: 0.6, blockEchoThreshold: 0.3, topClaims: 8 });
518
+ const nonWinner = await getTerminalLaneHealth("sentinel-orchestrator", { memoryProfile: profile, memoryEpoch: epoch });
519
+ add("fulfilled-nonwinner-not-failure", nonWinner.fulfilled === 1 && nonWinner.wins === 0 && nonWinner.hardFailureCount === 0, `fulfilled=${nonWinner.fulfilled} wins=${nonWinner.wins} failures=${nonWinner.hardFailureCount}`);
520
+ const aborted = await getTerminalLaneHealth("sentinel-omega", { memoryProfile: profile, memoryEpoch: epoch });
521
+ add("abort-is-censored", aborted.aborted === 1 && aborted.hardFailureCount === 0, `aborted=${aborted.aborted} failures=${aborted.hardFailureCount}`);
522
+ const prior = await getTerminalFamilyPrior("conclave-core", "omni-standalone", { memoryProfile: profile, memoryEpoch: epoch });
523
+ add("family-pair-deduplicated-per-run", prior.claimObservations === 1 && prior.blockObservations === 1, `claimObs=${prior.claimObservations} blockObs=${prior.blockObservations}`);
524
+ add("strict-claim-echo-recorded", prior.claimEchoes === 1 && strict["omni-nexus"]?.includes("conclave-core"), `claimEchoes=${prior.claimEchoes}`);
525
+ const healthyPlan = await buildSafeLanePlan({}, { memoryProfile: profile, memoryEpoch: epoch, quarantineMinSamples: 1 });
526
+ add("zero-win-fulfilled-lane-kept", healthyPlan.enableLanes["sentinel-orchestrator"] !== false, `enabled=${healthyPlan.enableLanes["sentinel-orchestrator"] !== false}`);
527
+ const failedLane = "vanguard-packer" as CanonicalLaneId;
528
+ const failedKey = laneKey(epoch, profile, failedLane);
529
+ for (let index = 0; index < 3; index += 1) await updateRecord<LaneHealthRecord>(STORE_LANE, failedKey, () => ({ key: failedKey, epoch, profile, laneId: failedLane, fulfilled: 0, acceptable: 0, wins: 0, rejected: 0, timedOut: 0, aborted: 0, claimComparableRuns: 0, strictClaimEchoRuns: 0, totalFulfilledMs: 0, lastSeenAt: 0 }), (record) => { record.rejected += 1; record.lastSeenAt = Date.now(); });
530
+ const quarantinePlan = await buildSafeLanePlan({}, { memoryProfile: profile, memoryEpoch: epoch, quarantineMinSamples: 3, quarantineCooldownMs: 60 * 60_000 });
531
+ add("proven-unavailable-lane-temporarily-quarantined", quarantinePlan.enableLanes[failedLane] === false, `quarantined=${quarantinePlan.enableLanes[failedLane] === false}`);
532
+ await updateRecord<LaneHealthRecord>(STORE_LANE, failedKey, () => { throw new Error("record must exist"); }, (record) => { record.lastSeenAt = Date.now() - 2 * 60 * 60_000; });
533
+ const reprobePlan = await buildSafeLanePlan({}, { memoryProfile: profile, memoryEpoch: epoch, quarantineMinSamples: 3, quarantineCooldownMs: 60 * 60_000 });
534
+ add("cooldown-expiry-reenables-probe", reprobePlan.enableLanes[failedLane] !== false, `enabled=${reprobePlan.enableLanes[failedLane] !== false}`);
535
+ const snapshot = await getTerminalMemorySnapshot({ memoryProfile: profile, memoryEpoch: epoch });
536
+ const current = snapshot.laneHealth.find((lane) => lane.laneId === "terminal-wire");
537
+ add("snapshot-includes-current-run", (current?.fulfilled ?? 0) >= 1, `fulfilled=${current?.fulfilled ?? 0}`);
538
+ add("claim-and-block-memory-separated", prior.claimObservations === 1 && prior.blockObservations === 1 && Number.isFinite(prior.claimEchoRate) && Number.isFinite(prior.blockEchoRate), `claimRate=${prior.claimEchoRate} blockRate=${prior.blockEchoRate}`);
539
+ const health = await getTerminalLaneHealth("terminal-wire", {});
540
+ add("memory-profile-does-not-contain-query", health.profile === "global", `profile=${health.profile}`);
541
+ return { ok: checks.every((check) => check.passed), checks };
542
+ }
543
+
544
+ export {
545
+ groundWithPortfolioConsensus,
546
+ familyOf,
547
+ ENGINE_FAMILY,
548
+ };