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,226 @@
1
+ // BeliefSearch — TypeScript port of the Python orchestrator.
2
+ // Log-odds evidence accumulation + Wald SPRT stopping + bounded coupling.
3
+
4
+ import {
5
+ Verdict,
6
+ SPRTDecision,
7
+ type Evidence,
8
+ type Hypothesis,
9
+ type BeliefState,
10
+ type EngineConfig,
11
+ type EvidenceConfig,
12
+ type SPRTConfig,
13
+ } from "./types";
14
+ import { sprtUpper, sprtLower } from "./config";
15
+
16
+ // --- pure helpers -----------------------------------------------------------
17
+
18
+ function clamp(x: number, lo: number, hi: number): number {
19
+ return Math.max(lo, Math.min(hi, x));
20
+ }
21
+
22
+ function hashStr(s: string): string {
23
+ let h = 2166136261 >>> 0;
24
+ for (let i = 0; i < s.length; i++) {
25
+ h ^= s.charCodeAt(i);
26
+ h = Math.imul(h, 16777619) >>> 0;
27
+ }
28
+ return h.toString(16).padStart(8, "0");
29
+ }
30
+
31
+ export function llr(ev: Evidence, cfg: EvidenceConfig): number {
32
+ const mag = cfg.llrCap * ev.reliability * ev.strength;
33
+ if (ev.verdict === Verdict.SUPPORT) return +mag;
34
+ if (ev.verdict === Verdict.REFUTE) return -mag;
35
+ return 0;
36
+ }
37
+
38
+ export function sprtDecision(leaderLogw: number, runnerUpLogw: number, cfg: SPRTConfig): SPRTDecision {
39
+ const v = leaderLogw - runnerUpLogw;
40
+ if (v >= sprtUpper(cfg)) return SPRTDecision.ACCEPT;
41
+ if (v <= sprtLower(cfg)) return SPRTDecision.REJECT;
42
+ return SPRTDecision.CONTINUE;
43
+ }
44
+
45
+ export function posterior(st: BeliefState): Record<string, number> {
46
+ const live = Object.values(st.hyps).filter((h) => h.alive);
47
+ if (live.length === 0) return {};
48
+ const m = Math.max(...live.map((h) => h.logw));
49
+ const exps: Record<string, number> = {};
50
+ let z = 0;
51
+ for (const h of live) {
52
+ const e = Math.exp(h.logw - m);
53
+ exps[h.hid] = e;
54
+ z += e;
55
+ }
56
+ if (z === 0) return {};
57
+ const out: Record<string, number> = {};
58
+ for (const [k, v] of Object.entries(exps)) out[k] = v / z;
59
+ return out;
60
+ }
61
+
62
+ export function entropy(st: BeliefState): number {
63
+ const p = posterior(st);
64
+ const vals = Object.values(p);
65
+ if (vals.length <= 1) return 0;
66
+ let h = 0;
67
+ for (const v of vals) if (v > 0) h += -v * Math.log2(v);
68
+ return h / Math.log2(vals.length);
69
+ }
70
+
71
+ export function ranked(st: BeliefState): Array<[string, number]> {
72
+ return Object.entries(posterior(st)).sort((a, b) => b[1] - a[1]);
73
+ }
74
+
75
+ export function countSupportingSources(h: Hypothesis): number {
76
+ const s = new Set<string>();
77
+ for (const e of h.evidence) if (e.verdict === Verdict.SUPPORT) s.add(e.sourceId);
78
+ return s.size;
79
+ }
80
+
81
+ // --- state construction -----------------------------------------------------
82
+
83
+ export function newState(texts: string[], priors: number[] | null, cfg: EngineConfig): BeliefState {
84
+ if (texts.length === 0) throw new Error("need at least one hypothesis");
85
+ const ps = priors ?? texts.map(() => 0.5);
86
+ if (ps.length !== texts.length) throw new Error("priors length must match texts length");
87
+ const cap = cfg.evidence.maxPriorLogOdds;
88
+ const sid = hashStr(texts.join("|")).slice(0, 16);
89
+ const hyps: Record<string, Hypothesis> = {};
90
+ texts.forEach((t, i) => {
91
+ const pr = clamp(ps[i], 1e-3, 1 - 1e-3);
92
+ const logw = clamp(Math.log(pr / (1 - pr)), -cap, cap);
93
+ const hid = `H${String(i).padStart(2, "0")}_${hashStr(t).slice(0, 6)}`;
94
+ hyps[hid] = {
95
+ hid,
96
+ text: t,
97
+ logw,
98
+ alive: true,
99
+ evidence: [],
100
+ coupled: {},
101
+ anchorVerdict: Verdict.SILENT,
102
+ anchorConfidence: 0,
103
+ spentTokens: 0,
104
+ };
105
+ });
106
+ return {
107
+ sid,
108
+ hyps,
109
+ committed: null,
110
+ commitReason: "",
111
+ spentTokens: 0,
112
+ createdAt: Date.now() / 1000,
113
+ };
114
+ }
115
+
116
+ export function couple(st: BeliefState, a: string, b: string, strength: number, cfg: EngineConfig): void {
117
+ if (!(a in st.hyps) || !(b in st.hyps)) throw new Error("both hypotheses must exist");
118
+ const s = clamp(strength, 0, cfg.evidence.couplingCap);
119
+ st.hyps[a].coupled[b] = s;
120
+ st.hyps[b].coupled[a] = s;
121
+ }
122
+
123
+ // --- evidence application ---------------------------------------------------
124
+
125
+ export function applyEvidence(st: BeliefState, hid: string, ev: Evidence, cfg: EngineConfig): BeliefState {
126
+ if (st.committed) return st;
127
+ const h = st.hyps[hid];
128
+ if (!h || !h.alive) return st;
129
+
130
+ const delta = llr(ev, cfg.evidence);
131
+ h.logw += delta;
132
+ h.evidence.push(ev);
133
+ h.spentTokens += ev.tokenCost;
134
+ st.spentTokens += ev.tokenCost;
135
+
136
+ for (const [otherId, c] of Object.entries(h.coupled)) {
137
+ const o = st.hyps[otherId];
138
+ if (o && o.alive) o.logw += c * delta;
139
+ }
140
+
141
+ prune(st, cfg);
142
+ maybeCommit(st, cfg);
143
+ enforceBudget(st, cfg);
144
+ return st;
145
+ }
146
+
147
+ export function setAnchor(st: BeliefState, hid: string, verdict: Verdict, confidence: number, cfg: EngineConfig): void {
148
+ const h = st.hyps[hid];
149
+ if (!h) return;
150
+ h.anchorVerdict = verdict;
151
+ h.anchorConfidence = confidence;
152
+ if (verdict === Verdict.SUPPORT || verdict === Verdict.REFUTE) {
153
+ applyEvidence(
154
+ st,
155
+ hid,
156
+ {
157
+ sourceId: "anchor",
158
+ text: "verified-knowledge anchor",
159
+ verdict,
160
+ reliability: confidence,
161
+ strength: 0.6,
162
+ tokenCost: 0,
163
+ ts: Date.now(),
164
+ },
165
+ cfg,
166
+ );
167
+ }
168
+ }
169
+
170
+ function prune(st: BeliefState, cfg: EngineConfig): void {
171
+ const post = posterior(st);
172
+ const liveCount = () => Object.values(st.hyps).filter((h) => h.alive).length;
173
+ for (const [hid, p] of Object.entries(post)) {
174
+ if (p < cfg.pruneFloor && liveCount() > 1) {
175
+ st.hyps[hid].alive = false;
176
+ }
177
+ }
178
+ }
179
+
180
+ function maybeCommit(st: BeliefState, cfg: EngineConfig): void {
181
+ if (st.committed) return;
182
+ const r = ranked(st);
183
+ if (r.length < 1) return;
184
+ const [leaderHid] = r[0];
185
+ const leader = st.hyps[leaderHid];
186
+ const runnerLogw = r.length > 1 ? st.hyps[r[1][0]].logw : leader.logw - 1e9;
187
+ const decision = sprtDecision(leader.logw, runnerLogw, cfg.sprt);
188
+ const marginOk = (r[0][1] - (r[1]?.[1] ?? 0)) >= cfg.collapseMargin;
189
+ const sourcesOk = countSupportingSources(leader) >= cfg.sprt.minSupportingSources;
190
+
191
+ if (decision === SPRTDecision.ACCEPT && marginOk && sourcesOk) {
192
+ commit(st, leaderHid, "sprt_accept");
193
+ } else if (decision === SPRTDecision.REJECT) {
194
+ leader.alive = false;
195
+ }
196
+ }
197
+
198
+ function enforceBudget(st: BeliefState, cfg: EngineConfig): void {
199
+ if (st.committed) return;
200
+ if (st.spentTokens >= cfg.maxTokens) {
201
+ const r = ranked(st);
202
+ if (r.length > 0) commit(st, r[0][0], "budget_exhausted");
203
+ } else if (Date.now() / 1000 - st.createdAt >= cfg.maxSeconds) {
204
+ const r = ranked(st);
205
+ if (r.length > 0) commit(st, r[0][0], "time_exhausted");
206
+ }
207
+ }
208
+
209
+ function commit(st: BeliefState, hid: string, reason: string): void {
210
+ st.committed = hid;
211
+ st.commitReason = reason;
212
+ for (const k of Object.keys(st.hyps)) if (k !== hid) st.hyps[k].alive = false;
213
+ }
214
+
215
+ export function forceCommit(st: BeliefState): string | null {
216
+ if (!st.committed) {
217
+ const r = ranked(st);
218
+ if (r.length === 0) return null;
219
+ commit(st, r[0][0], "forced");
220
+ }
221
+ return st.committed;
222
+ }
223
+
224
+ export function isContested(st: BeliefState): boolean {
225
+ return ["budget_exhausted", "time_exhausted", "forced"].includes(st.commitReason);
226
+ }
@@ -0,0 +1,118 @@
1
+ // Signed Personalized PageRank relevance pre-ranker.
2
+ // O(N^2) per iteration; converges for restart_prob > 0.
3
+ import type { GraphConfig } from "./types";
4
+
5
+ export interface GraphNode {
6
+ nid: string;
7
+ label: string;
8
+ confidence: number;
9
+ }
10
+ export interface GraphEdge {
11
+ src: string;
12
+ dst: string;
13
+ signedWeight: number;
14
+ }
15
+
16
+ export class RelevanceGraph {
17
+ cfg: GraphConfig;
18
+ nodes: Map<string, GraphNode> = new Map();
19
+ edges: GraphEdge[] = [];
20
+ private idx: Map<string, number> = new Map();
21
+ private dirty = true;
22
+
23
+ constructor(cfg: GraphConfig) {
24
+ this.cfg = cfg;
25
+ }
26
+
27
+ addNode(nid: string, label: string, confidence = 0.5): void {
28
+ if (!this.nodes.has(nid)) {
29
+ if (this.nodes.size >= this.cfg.maxNodes) throw new Error("node budget exceeded");
30
+ this.nodes.set(nid, { nid, label, confidence });
31
+ this.dirty = true;
32
+ } else {
33
+ const n = this.nodes.get(nid)!;
34
+ n.confidence = Math.max(n.confidence, confidence);
35
+ }
36
+ }
37
+
38
+ addEdge(src: string, dst: string, signedWeight: number): void {
39
+ if (this.nodes.has(src) && this.nodes.has(dst) && src !== dst) {
40
+ this.edges.push({ src, dst, signedWeight });
41
+ this.dirty = true;
42
+ }
43
+ }
44
+
45
+ clear(): void {
46
+ this.nodes.clear();
47
+ this.edges = [];
48
+ this.idx.clear();
49
+ this.dirty = true;
50
+ }
51
+
52
+ private reindex(): void {
53
+ if (!this.dirty) return;
54
+ this.idx = new Map();
55
+ let i = 0;
56
+ for (const nid of this.nodes.keys()) this.idx.set(nid, i++);
57
+ this.dirty = false;
58
+ }
59
+
60
+ /** Returns flat NxN matrix in row-major order: m[j*N + i] = mass src(i) -> dst(j). */
61
+ private transitionMatrix(): { m: Float64Array; n: number } {
62
+ this.reindex();
63
+ const n = this.nodes.size;
64
+ const m = new Float64Array(n * n);
65
+ for (const e of this.edges) {
66
+ const i = this.idx.get(e.src)!;
67
+ const j = this.idx.get(e.dst)!;
68
+ m[j * n + i] += e.signedWeight;
69
+ }
70
+ // Column-normalize by absolute sum to keep operator bounded.
71
+ const colAbs = new Float64Array(n);
72
+ for (let j = 0; j < n; j++) {
73
+ for (let i = 0; i < n; i++) colAbs[i] += Math.abs(m[j * n + i]);
74
+ }
75
+ for (let i = 0; i < n; i++) if (colAbs[i] === 0) colAbs[i] = 1;
76
+ for (let j = 0; j < n; j++) {
77
+ for (let i = 0; i < n; i++) m[j * n + i] /= colAbs[i];
78
+ }
79
+ return { m, n };
80
+ }
81
+
82
+ /** Returns [{nid,label,score}] sorted desc. Score is a relevance ranking in [0,1] */
83
+ personalizedPageRank(queryNid: string): Array<{ nid: string; label: string; score: number }> {
84
+ this.reindex();
85
+ if (!this.idx.has(queryNid) || this.nodes.size === 0) return [];
86
+ const { m, n } = this.transitionMatrix();
87
+ const restart = new Float64Array(n);
88
+ restart[this.idx.get(queryNid)!] = 1.0;
89
+ let r = new Float64Array(restart);
90
+ const a = this.cfg.restartProb;
91
+ for (let it = 0; it < this.cfg.maxIters; it++) {
92
+ const next = new Float64Array(n);
93
+ // next = (1-a) * (m @ r) + a * restart
94
+ for (let j = 0; j < n; j++) {
95
+ let s = 0;
96
+ for (let i = 0; i < n; i++) s += m[j * n + i] * r[i];
97
+ next[j] = (1 - a) * s + a * restart[j];
98
+ }
99
+ // L1 diff
100
+ let d = 0;
101
+ for (let i = 0; i < n; i++) d += Math.abs(next[i] - r[i]);
102
+ r = next;
103
+ if (d < this.cfg.tolerance) break;
104
+ }
105
+ let maxAbs = 0;
106
+ for (let i = 0; i < n; i++) if (Math.abs(r[i]) > maxAbs) maxAbs = Math.abs(r[i]);
107
+ if (maxAbs === 0) maxAbs = 1;
108
+ const inv: string[] = new Array(n);
109
+ for (const [nid, i] of this.idx.entries()) inv[i] = nid;
110
+ const out = inv.map((nid, i) => ({
111
+ nid,
112
+ label: this.nodes.get(nid)!.label,
113
+ score: Math.abs(r[i]) / maxAbs,
114
+ }));
115
+ out.sort((a, b) => b.score - a.score);
116
+ return out;
117
+ }
118
+ }
@@ -0,0 +1,21 @@
1
+ import * as Comlink from "comlink";
2
+ import { RelevanceGraph } from "./graph";
3
+ import { type GraphConfig } from "./types";
4
+
5
+ // Worker-side implementation of the Graph relevance calculation.
6
+ // Keeps the UI thread responsive during O(N^2) PageRank iterations.
7
+ const workerApi = {
8
+ calculateRelevance(
9
+ nodes: Array<{ nid: string; label: string; confidence: number }>,
10
+ edges: Array<{ src: string; dst: string; signedWeight: number }>,
11
+ cfg: GraphConfig,
12
+ queryNid: string
13
+ ) {
14
+ const g = new RelevanceGraph(cfg);
15
+ for (const n of nodes) g.addNode(n.nid, n.label, n.confidence);
16
+ for (const e of edges) g.addEdge(e.src, e.dst, e.signedWeight);
17
+ return g.personalizedPageRank(queryNid);
18
+ },
19
+ };
20
+
21
+ Comlink.expose(workerApi);
@@ -0,0 +1,117 @@
1
+ // Lightweight in-browser correctness suite. Returns pass/fail per test so the UI
2
+ // can render a green/red panel proving the math properties live.
3
+
4
+ import { Verdict, type EngineConfig, type Evidence } from "./types";
5
+ import { defaultConfig } from "./config";
6
+ import {
7
+ applyEvidence,
8
+ countSupportingSources,
9
+ newState,
10
+ posterior,
11
+ sprtDecision,
12
+ } from "./engine";
13
+ import { RelevanceGraph } from "./graph";
14
+
15
+ export interface TestResult { name: string; pass: boolean; detail?: string; }
16
+
17
+ function ev(src: string, v: Verdict, rel = 0.8, strength = 0.7, cost = 100): Evidence {
18
+ return { sourceId: src, text: "e", verdict: v, reliability: rel, strength, tokenCost: cost, ts: Date.now() };
19
+ }
20
+
21
+ export function runTests(): TestResult[] {
22
+ const results: TestResult[] = [];
23
+ const cfg: EngineConfig = defaultConfig();
24
+
25
+ // 1) log-odds additivity is order-independent
26
+ try {
27
+ const a = newState(["X", "Y"], null, cfg);
28
+ const b = newState(["X", "Y"], null, cfg);
29
+ const ha = Object.keys(a.hyps)[0], hb = Object.keys(b.hyps)[0];
30
+ const e1 = ev("s1", Verdict.SUPPORT);
31
+ const e2 = ev("s2", Verdict.SUPPORT, 0.6);
32
+ applyEvidence(a, ha, e1, cfg); applyEvidence(a, ha, e2, cfg);
33
+ applyEvidence(b, hb, e2, cfg); applyEvidence(b, hb, e1, cfg);
34
+ const ok = Math.abs(a.hyps[ha].logw - b.hyps[hb].logw) < 1e-12;
35
+ results.push({ name: "log-odds additivity is order-independent", pass: ok, detail: `Δlogw=${(a.hyps[ha].logw - b.hyps[hb].logw).toExponential(2)}` });
36
+ } catch (e) { results.push({ name: "log-odds additivity", pass: false, detail: String(e) }); }
37
+
38
+ // 2) silent evidence moves nothing
39
+ try {
40
+ const st = newState(["X", "Y"], null, cfg);
41
+ const h = Object.keys(st.hyps)[0];
42
+ const before = st.hyps[h].logw;
43
+ applyEvidence(st, h, ev("s", Verdict.SILENT), cfg);
44
+ results.push({ name: "SILENT evidence does not move logw", pass: st.hyps[h].logw === before });
45
+ } catch (e) { results.push({ name: "SILENT evidence", pass: false, detail: String(e) }); }
46
+
47
+ // 3) posterior normalized
48
+ try {
49
+ const st = newState(["A", "B", "C"], null, cfg);
50
+ const s = Object.values(posterior(st)).reduce((a, b) => a + b, 0);
51
+ results.push({ name: "posterior sums to 1", pass: Math.abs(s - 1) < 1e-12, detail: `sum=${s}` });
52
+ } catch (e) { results.push({ name: "posterior sum", pass: false, detail: String(e) }); }
53
+
54
+ // 4) SPRT requires min sources
55
+ try {
56
+ const cfg2 = defaultConfig({ sprt: { alpha: 0.05, beta: 0.1, minSupportingSources: 2 } });
57
+ const st = newState(["A", "B"], null, cfg2);
58
+ const h = Object.keys(st.hyps)[0];
59
+ for (let i = 0; i < 10; i++) applyEvidence(st, h, ev("only_one", Verdict.SUPPORT, 1.0, 1.0), cfg2);
60
+ results.push({ name: "single source cannot commit (min_sources guard)", pass: st.committed === null });
61
+ } catch (e) { results.push({ name: "min sources", pass: false, detail: String(e) }); }
62
+
63
+ // 5) SPRT commits with enough independent support
64
+ try {
65
+ const st = newState(["A", "B", "C"], null, cfg);
66
+ const h = Object.keys(st.hyps)[0];
67
+ applyEvidence(st, h, ev("s1", Verdict.SUPPORT, 0.9, 0.9), cfg);
68
+ applyEvidence(st, h, ev("s2", Verdict.SUPPORT, 0.9, 0.9), cfg);
69
+ applyEvidence(st, h, ev("s3", Verdict.SUPPORT, 0.9, 0.9), cfg);
70
+ results.push({
71
+ name: "SPRT commits with ≥min independent support",
72
+ pass: st.committed === h && st.commitReason === "sprt_accept",
73
+ detail: `committed=${st.committed} reason=${st.commitReason}`,
74
+ });
75
+ } catch (e) { results.push({ name: "SPRT accept", pass: false, detail: String(e) }); }
76
+
77
+ // 6) signed PPR: contradiction cancels
78
+ try {
79
+ const g = new RelevanceGraph(cfg.graph);
80
+ for (const n of ["q", "support_only", "contested", "neg"]) g.addNode(n, n);
81
+ g.addEdge("q", "support_only", +1);
82
+ g.addEdge("q", "contested", +1);
83
+ g.addEdge("neg", "contested", -1);
84
+ g.addEdge("q", "neg", +1);
85
+ const ranked = g.personalizedPageRank("q");
86
+ const s = (id: string) => ranked.find((r) => r.nid === id)?.score ?? 0;
87
+ results.push({
88
+ name: "signed PPR: support-only ranks ≥ contested",
89
+ pass: s("support_only") >= s("contested"),
90
+ detail: `support=${s("support_only").toFixed(3)} contested=${s("contested").toFixed(3)}`,
91
+ });
92
+ } catch (e) { results.push({ name: "PPR contradiction", pass: false, detail: String(e) }); }
93
+
94
+ // 7) SPRT boundary semantics
95
+ try {
96
+ const d1 = sprtDecision(5, 0, cfg.sprt);
97
+ const d2 = sprtDecision(0, 5, cfg.sprt);
98
+ const d3 = sprtDecision(0.1, 0, cfg.sprt);
99
+ results.push({
100
+ name: "SPRT boundaries: ACCEPT/REJECT/CONTINUE",
101
+ pass: d1 === "accept" && d2 === "reject" && d3 === "continue",
102
+ detail: `${d1}/${d2}/${d3}`,
103
+ });
104
+ } catch (e) { results.push({ name: "SPRT boundaries", pass: false, detail: String(e) }); }
105
+
106
+ // 8) supporting source counting
107
+ try {
108
+ const st = newState(["A"], null, cfg);
109
+ const h = Object.keys(st.hyps)[0];
110
+ applyEvidence(st, h, ev("s1", Verdict.SUPPORT), cfg);
111
+ applyEvidence(st, h, ev("s1", Verdict.SUPPORT), cfg); // duplicate source
112
+ applyEvidence(st, h, ev("s2", Verdict.SUPPORT), cfg);
113
+ results.push({ name: "supporting-source counter dedups", pass: countSupportingSources(st.hyps[h]) === 2 });
114
+ } catch (e) { results.push({ name: "source dedup", pass: false, detail: String(e) }); }
115
+
116
+ return results;
117
+ }
@@ -0,0 +1,65 @@
1
+ import type { TierSpec } from "./types";
2
+
3
+ export const TIERS: Record<number, TierSpec> = {
4
+ 0: { tier: 0, name: "T0 REFLEX", hypothesisCount: 0, evidenceProbes: 0, maxTokens: 2_000, maxSeconds: 15, forecastCoverage: 0.30 },
5
+ 1: { tier: 1, name: "T1 SCOUT", hypothesisCount: 4, evidenceProbes: 3, maxTokens: 20_000, maxSeconds: 180, forecastCoverage: 0.55 },
6
+ 2: { tier: 2, name: "T2 SURVEY", hypothesisCount: 6, evidenceProbes: 8, maxTokens: 80_000, maxSeconds: 480, forecastCoverage: 0.70 },
7
+ 3: { tier: 3, name: "T3 DEEP_DIVE", hypothesisCount: 8, evidenceProbes: 14, maxTokens: 300_000, maxSeconds: 1200, forecastCoverage: 0.82 },
8
+ 4: { tier: 4, name: "T4 EXHAUSTIVE", hypothesisCount: 10, evidenceProbes: 24, maxTokens: 1_200_000, maxSeconds: 2700, forecastCoverage: 0.91 },
9
+ 5: { tier: 5, name: "T5 SATURATION", hypothesisCount: 12, evidenceProbes: 40, maxTokens: 3_000_000, maxSeconds: 5400, forecastCoverage: 0.96 },
10
+ };
11
+
12
+ const HIGH_STAKES = new Set(["medical", "clinical", "legal", "financial", "safety", "security", "dosage", "diagnosis"]);
13
+ const VOLATILE = new Set(["current", "today", "price", "ceo", "president", "latest", "recent", "now", "2025", "2026"]);
14
+
15
+ export function pickTier(query: string, anchorCoverage = 0.0): { tier: number; reason: string } {
16
+ const ql = query.toLowerCase();
17
+ const stakes = [...HIGH_STAKES].some((k) => ql.includes(k));
18
+ const volatile = [...VOLATILE].some((k) => ql.includes(k));
19
+ const entities = query.split(/\s+/).filter((w) => /^[A-Z]/.test(w)).length;
20
+ const complexity = Math.min(1.0, query.split(/\s+/).length / 40 + 0.05 * entities);
21
+ const score = complexity + (volatile ? 0.3 : 0) + (stakes ? 0.3 : 0);
22
+
23
+ if (anchorCoverage >= 0.75 && !stakes && !volatile) {
24
+ return { tier: 0, reason: "anchor covers query; low stakes" };
25
+ }
26
+ let tier: number;
27
+ if (score < 0.25) tier = 1;
28
+ else if (score < 0.45) tier = 2;
29
+ else if (score < 0.70) tier = 3;
30
+ else if (score < 0.90) tier = 4;
31
+ else tier = 5;
32
+ if (stakes) tier = Math.max(tier, 3);
33
+ return {
34
+ tier,
35
+ reason: `complexity=${score.toFixed(2)} stakes=${stakes} volatile=${volatile}`,
36
+ };
37
+ }
38
+
39
+ export interface TokenReport {
40
+ measuredSpent: number;
41
+ counterfactualBaseline: number;
42
+ estimatedSaved: number;
43
+ baselineAssumption: string;
44
+ nHypotheses: number;
45
+ nPruned: number;
46
+ }
47
+
48
+ export function tokenReport(
49
+ spentTokens: number,
50
+ nHypotheses: number,
51
+ nPruned: number,
52
+ synthesisCostPerHyp: number,
53
+ ): TokenReport {
54
+ const baseline = spentTokens + (nHypotheses - 1) * synthesisCostPerHyp;
55
+ const saved = Math.max(0, baseline - (spentTokens + synthesisCostPerHyp));
56
+ return {
57
+ measuredSpent: spentTokens,
58
+ counterfactualBaseline: baseline,
59
+ estimatedSaved: saved,
60
+ baselineAssumption:
61
+ "Baseline ASSUMES every hypothesis would be fully synthesized. Real savings depend on the host pipeline and are not measured here.",
62
+ nHypotheses,
63
+ nPruned,
64
+ };
65
+ }
@@ -0,0 +1,94 @@
1
+ // GBSE — shared types
2
+ // Classical Bayesian belief search; no quantum metaphors.
3
+
4
+ export enum Verdict {
5
+ SUPPORT = "support",
6
+ REFUTE = "refute",
7
+ SILENT = "silent",
8
+ CONTESTED = "contested",
9
+ }
10
+
11
+ export interface Evidence {
12
+ sourceId: string;
13
+ text: string;
14
+ verdict: Verdict;
15
+ reliability: number; // [0,1]
16
+ strength: number; // [0,1]
17
+ tokenCost: number;
18
+ url?: string;
19
+ ts: number;
20
+ }
21
+
22
+ export interface Hypothesis {
23
+ hid: string;
24
+ text: string;
25
+ logw: number;
26
+ alive: boolean;
27
+ evidence: Evidence[];
28
+ coupled: Record<string, number>;
29
+ anchorVerdict: Verdict;
30
+ anchorConfidence: number;
31
+ spentTokens: number;
32
+ }
33
+
34
+ export interface BeliefState {
35
+ sid: string;
36
+ hyps: Record<string, Hypothesis>;
37
+ committed: string | null;
38
+ commitReason: string;
39
+ spentTokens: number;
40
+ createdAt: number;
41
+ }
42
+
43
+ export interface SPRTConfig {
44
+ alpha: number;
45
+ beta: number;
46
+ minSupportingSources: number;
47
+ }
48
+
49
+ export interface EvidenceConfig {
50
+ llrCap: number;
51
+ maxPriorLogOdds: number;
52
+ couplingCap: number;
53
+ }
54
+
55
+ export interface GraphConfig {
56
+ restartProb: number;
57
+ maxIters: number;
58
+ tolerance: number;
59
+ maxNodes: number;
60
+ }
61
+
62
+ export interface EngineConfig {
63
+ sprt: SPRTConfig;
64
+ evidence: EvidenceConfig;
65
+ graph: GraphConfig;
66
+ collapseMargin: number;
67
+ pruneFloor: number;
68
+ maxTokens: number;
69
+ maxSeconds: number;
70
+ seed: number;
71
+ }
72
+
73
+ export enum SPRTDecision {
74
+ ACCEPT = "accept",
75
+ CONTINUE = "continue",
76
+ REJECT = "reject",
77
+ }
78
+
79
+ export interface TierSpec {
80
+ tier: number;
81
+ name: string;
82
+ hypothesisCount: number;
83
+ evidenceProbes: number;
84
+ maxTokens: number;
85
+ maxSeconds: number;
86
+ forecastCoverage: number;
87
+ }
88
+
89
+ export interface TraceEvent {
90
+ ts: number;
91
+ phase: string;
92
+ message: string;
93
+ data?: unknown;
94
+ }