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,382 @@
1
+ /**
2
+ * SAGA-OS v4 — Studio "Style" tab (AUREATE-SCRIBE).
3
+ * ---------------------------------------------------------------------------
4
+ * Type C net-new. Every control drives a real computation from
5
+ * `src/lib/sage/saga-os-v4-aureate.ts` over the SAME unified roll the fiction
6
+ * prompt is compiled from. Style pack selection writes to localStorage, which
7
+ * `unifiedRoll` reads, which changes the AUREATE block in the actual prompt.
8
+ * Nothing here is decorative.
9
+ */
10
+ import { useCallback, useEffect, useMemo, useState } from "react";
11
+ import type { UnifiedRoll } from "@/lib/sage/unified-roll";
12
+ import { getStyleAudits } from "@/lib/sage";
13
+ import {
14
+ STYLE_PACK_DELTAS, STYLE_GENOME_KEYS, loadStylePack, saveStylePack,
15
+ buildAureateDirective, evaluateKallosS, runStyleTests, runStyleCgol,
16
+ analyzeSentences, analyzeParagraphs, extractImageChains, extractDialogue,
17
+ idiolectVector, idiolectDistance, computeSoundVariables, detectRhythmProfile,
18
+ analyzeArguments, SYNTAX_FORM_NAMES, PARAGRAPH_TYPE_NAMES, RHYTHM_PROFILE_NAMES,
19
+ V4_HONESTY, type StylePackId, type StyleGenome, type AureateContext,
20
+ } from "@/lib/sage/saga-os-v4-aureate";
21
+
22
+ const T: Record<string, string> = {
23
+ zinc: "bg-zinc-100 text-zinc-700 border-zinc-200", indigo: "bg-indigo-50 text-indigo-700 border-indigo-200",
24
+ violet: "bg-violet-50 text-violet-700 border-violet-200", emerald: "bg-emerald-50 text-emerald-700 border-emerald-200",
25
+ amber: "bg-amber-50 text-amber-800 border-amber-200", rose: "bg-rose-50 text-rose-700 border-rose-200",
26
+ sky: "bg-sky-50 text-sky-700 border-sky-200", teal: "bg-teal-50 text-teal-700 border-teal-200",
27
+ };
28
+ const Pill = ({ children, tone = "zinc", title }: { children: React.ReactNode; tone?: string; title?: string }) =>
29
+ <span title={title} className={`inline-flex items-center rounded-md border px-1.5 py-0.5 text-[10px] font-semibold ${T[tone] ?? T.zinc}`}>{children}</span>;
30
+ const Head = ({ icon, title, right }: { icon: string; title: string; right?: React.ReactNode }) => (
31
+ <div className="flex items-center gap-2 border-b border-zinc-100 pb-1">
32
+ <span className="text-sm">{icon}</span><span className="text-[11px] font-bold uppercase tracking-wider text-zinc-700">{title}</span>
33
+ {right != null && <span className="ml-auto text-[10px] text-zinc-400">{right}</span>}
34
+ </div>
35
+ );
36
+ const Card = ({ children, tone = "white" }: { children: React.ReactNode; tone?: "white" | "violet" | "emerald" | "amber" | "rose" }) => (
37
+ <div className={`rounded-lg border p-2.5 ${tone === "white" ? "border-zinc-200 bg-white" : tone === "violet" ? "border-violet-200 bg-violet-50/40" : tone === "emerald" ? "border-emerald-200 bg-emerald-50/50" : tone === "amber" ? "border-amber-200 bg-amber-50/60" : "border-rose-200 bg-rose-50/60"}`}>{children}</div>
38
+ );
39
+ const Bar = ({ v, label, note }: { v: number; label: string; note?: string }) => (
40
+ <div>
41
+ <div className="flex items-center gap-1.5">
42
+ <span className="w-[150px] shrink-0 truncate text-right text-[10px] text-zinc-500" title={label}>{label}</span>
43
+ <div className="h-1.5 flex-1 rounded-full bg-zinc-100"><div className="h-full rounded-full" style={{ width: `${Math.round(v * 100)}%`, backgroundColor: `hsl(${Math.round(v * 120)},55%,50%)` }} /></div>
44
+ <span className="w-9 shrink-0 text-right font-mono text-[10px] text-zinc-600">{(v * 100).toFixed(0)}%</span>
45
+ </div>
46
+ {note && <div className="ml-[158px] text-[9px] leading-tight text-zinc-400">{note}</div>}
47
+ </div>
48
+ );
49
+ const Btn = ({ onClick, children, tone = "indigo", disabled }: { onClick: () => void; children: React.ReactNode; tone?: "indigo" | "ghost"; disabled?: boolean }) => (
50
+ <button onClick={onClick} disabled={disabled} className={`rounded px-2.5 py-1 text-[11px] font-bold disabled:opacity-40 ${tone === "indigo" ? "bg-indigo-600 text-white hover:bg-indigo-700" : "border border-zinc-300 bg-white text-zinc-700 hover:bg-zinc-50"}`}>{children}</button>
51
+ );
52
+
53
+ const SAMPLE = `Mara opened the sluice gate at four in the morning. The gate stuck, and she braced her shoulder against the iron until it gave.
54
+ Water moved into the lower field. It carried silt from the upper channel, and the silt settled in a grey fan across the barley.
55
+
56
+ She counted the fan at twelve paces. Twelve paces meant the pump had run all night, and nobody had signed the shutdown form.
57
+ "Who held the key?" she asked.
58
+ "I did," Elias said. "I was going to tell you after the count."
59
+ She did not answer. The rust on the hinge had spread since winter.`;
60
+
61
+ type Sub = "genome" | "analyze" | "audits" | "live" | "cgol" | "tests";
62
+
63
+ export function SagaStyleTab({ roll }: { roll: UnifiedRoll }) {
64
+ const [sub, setSub] = useState<Sub>("genome");
65
+ const [pack, setPack] = useState<StylePackId | null>(() => loadStylePack());
66
+ const [text, setText] = useState(SAMPLE);
67
+ const [tick, setTick] = useState(0);
68
+ useEffect(() => { const t = window.setInterval(() => setTick((n) => n + 1), 1500); return () => window.clearInterval(t); }, []);
69
+
70
+ const g: StyleGenome = roll.styleGenome;
71
+ const ctx: AureateContext = useMemo(() => ({
72
+ genome: g,
73
+ castNames: roll.cast.cast.map((c) => c.name),
74
+ focalCharacter: roll.cast.cast.find((c) => c.kind === "agent")?.name ?? null,
75
+ genreKey: roll.contract.dominant.key,
76
+ }), [g, roll]);
77
+
78
+ const onPack = useCallback((p: StylePackId | null) => { setPack(p); saveStylePack(p); }, []);
79
+
80
+ const kallos = useMemo(() => (text.trim().length > 40 ? evaluateKallosS(text, ctx) : null), [text, ctx]);
81
+ const tests = useMemo(() => (text.trim().length > 40 ? runStyleTests(text, ctx) : []), [text, ctx]);
82
+ const cgol = useMemo(() => (text.trim().length > 40 ? runStyleCgol(text, g) : null), [text, g]);
83
+ const sents = useMemo(() => analyzeSentences(text), [text]);
84
+ const paras = useMemo(() => analyzeParagraphs(text), [text]);
85
+ const chains = useMemo(() => extractImageChains(text), [text]);
86
+ const turns = useMemo(() => extractDialogue(text), [text]);
87
+ const sv = useMemo(() => computeSoundVariables(text), [text]);
88
+ const rhythm = useMemo(() => detectRhythmProfile(sv, sents), [sv, sents]);
89
+ const args = useMemo(() => analyzeArguments(paras), [paras]);
90
+ const live = useMemo(() => getStyleAudits(), [tick]);
91
+ const directive = useMemo(() => buildAureateDirective(g, pack, { chapterWords: Math.round(roll.blueprint.chapters.reduce((a, c) => a + c.targetWords, 0) / Math.max(1, roll.blueprint.chapters.length)) }), [g, pack, roll]);
92
+
93
+ const speakers = useMemo(() => {
94
+ const by = new Map<string, string[]>();
95
+ for (const t of turns) if (t.speaker) by.set(t.speaker, [...(by.get(t.speaker) ?? []), t.line]);
96
+ return [...by.entries()].map(([k, v]) => ({ name: k, vec: idiolectVector(v), lines: v.length }));
97
+ }, [turns]);
98
+
99
+ const SUBS: { id: Sub; icon: string; label: string }[] = [
100
+ { id: "genome", icon: "🧬", label: "Genome & pack" },
101
+ { id: "analyze", icon: "🔍", label: "Analyze prose" },
102
+ { id: "audits", icon: "📋", label: "Revision stack" },
103
+ { id: "live", icon: "📡", label: "Live chapters" },
104
+ { id: "cgol", icon: "♟", label: "STYLE-CGOL" },
105
+ { id: "tests", icon: "🧪", label: "STYLE-TESTs" },
106
+ ];
107
+
108
+ return (
109
+ <div className="space-y-2">
110
+ <Card tone="violet">
111
+ <Head icon="✒" title="AUREATE-SCRIBE (v4 · SYSTEM v15)" right={`prose mode ${g.proseMode} · focal ${g.focalDistance}`} />
112
+ <div className="mt-1 text-[10px] text-zinc-600">
113
+ The style genotype is derived from the SAME genre contract as the rest of the build, so style, structure and reality describe one book.
114
+ The <b>style pack</b> below is a user control (like the reality level) and is deliberately not seeded — changing it rewrites the
115
+ AUREATE block in the actual chapter prompt.
116
+ </div>
117
+ </Card>
118
+
119
+ <div className="flex flex-wrap gap-1">
120
+ {SUBS.map((s) => (
121
+ <button key={s.id} onClick={() => setSub(s.id)}
122
+ className={`rounded-md px-2 py-1 text-[11px] font-semibold ${sub === s.id ? "bg-indigo-600 text-white" : "bg-zinc-100 text-zinc-600 hover:bg-zinc-200"}`}>
123
+ {s.icon} {s.label}
124
+ </button>
125
+ ))}
126
+ </div>
127
+
128
+ {sub === "genome" && (
129
+ <div className="space-y-2">
130
+ <Card>
131
+ <Head icon="📦" title="§17 Production style packs" right={pack ? `active: ${pack}` : "genre defaults (no pack)"} />
132
+ <div className="mt-1 flex flex-wrap gap-1">
133
+ <button onClick={() => onPack(null)} className={`rounded px-2 py-1 text-[10px] font-semibold ${pack === null ? "bg-indigo-600 text-white" : "bg-zinc-100 text-zinc-600"}`}>none (genre defaults)</button>
134
+ {(Object.keys(STYLE_PACK_DELTAS) as StylePackId[]).map((p) => (
135
+ <button key={p} onClick={() => onPack(p)} title={STYLE_PACK_DELTAS[p].note}
136
+ className={`rounded px-2 py-1 text-[10px] font-semibold ${pack === p ? "bg-indigo-600 text-white" : "bg-zinc-100 text-zinc-600 hover:bg-zinc-200"}`}>
137
+ {p.replace("STYLEPACK-", "")}
138
+ </button>
139
+ ))}
140
+ </div>
141
+ {pack && <div className="mt-1 text-[10px] text-zinc-600">{STYLE_PACK_DELTAS[pack].note}</div>}
142
+ </Card>
143
+ <Card>
144
+ <Head icon="🧬" title="§5 STYLE-GENOME" right={`${roll.contract.dominant.key} defaults${pack ? " + pack overlay" : ""}`} />
145
+ <div className="mt-1 space-y-0.5">
146
+ {STYLE_GENOME_KEYS.map((k) => (
147
+ <Bar key={k} v={g[k] as number} label={String(k).replace(/([A-Z])/g, " $1").toLowerCase()} />
148
+ ))}
149
+ </div>
150
+ <div className="mt-1.5 flex flex-wrap gap-1">
151
+ <Pill tone="violet">prose mode: {g.proseMode}</Pill>
152
+ <Pill tone="teal">focal distance: {g.focalDistance}</Pill>
153
+ </div>
154
+ </Card>
155
+ <Card tone="violet">
156
+ <Head icon="📤" title="AUREATE block appended to every chapter prompt" right={`${directive.length} chars`} />
157
+ <pre className="mt-1 max-h-72 overflow-auto whitespace-pre-wrap font-mono text-[9.5px] leading-snug text-violet-950">{directive}</pre>
158
+ </Card>
159
+ </div>
160
+ )}
161
+
162
+ {sub !== "genome" && (
163
+ <Card>
164
+ <Head icon="📝" title="Prose under analysis" right={`${sents.length} sentences · ${paras.length} discourse units`} />
165
+ <textarea value={text} onChange={(e) => setText(e.target.value)} rows={6}
166
+ className="mt-1 w-full rounded border border-zinc-200 p-2 font-mono text-[10px]" placeholder="Paste a generated chapter…" />
167
+ <div className="mt-1 flex gap-2"><Btn tone="ghost" onClick={() => setText(SAMPLE)}>reset sample</Btn><Btn tone="ghost" onClick={() => setText("")}>clear</Btn></div>
168
+ </Card>
169
+ )}
170
+
171
+ {sub === "analyze" && (
172
+ <div className="space-y-2">
173
+ <Card>
174
+ <Head icon="✏" title="§6 Sentence engine" right={`${new Set(sents.map((s) => s.syntaxForm)).size} distinct syntax forms`} />
175
+ <div className="mt-1 max-h-56 overflow-y-auto">
176
+ <table className="w-full text-[10px]"><tbody>
177
+ {sents.map((s) => (
178
+ <tr key={s.index} className="border-b border-zinc-50 align-top">
179
+ <td className="w-6 py-0.5 font-mono text-zinc-400">{s.index + 1}</td>
180
+ <td className="w-24 py-0.5"><Pill tone="sky" title={SYNTAX_FORM_NAMES[s.syntaxForm]}>{s.syntaxForm}</Pill></td>
181
+ <td className="w-10 py-0.5 font-mono text-zinc-500">{s.wordCount}w</td>
182
+ <td className="w-8 py-0.5">{s.subjectIsCharacter ? <span className="text-emerald-600" title="character is grammatical subject">S✓</span> : <span className="text-rose-600" title="subject is not the main character">S✗</span>}</td>
183
+ <td className="w-8 py-0.5">{s.actionIsVerb ? <span className="text-emerald-600" title="action is a finite verb">V✓</span> : <span className="text-rose-600" title={`nominalized: ${s.nominalizations.join(", ")}`}>V✗</span>}</td>
184
+ <td className="w-8 py-0.5">{s.emphaticEnd ? <span className="text-emerald-600" title="ends on a content word">E✓</span> : <span className="text-amber-600" title="ends on a function word">E✗</span>}</td>
185
+ <td className="py-0.5 text-zinc-600">{s.text.slice(0, 76)}{s.text.length > 76 ? "…" : ""}</td>
186
+ </tr>
187
+ ))}
188
+ </tbody></table>
189
+ </div>
190
+ </Card>
191
+ <div className="grid gap-2 sm:grid-cols-2">
192
+ <Card>
193
+ <Head icon="¶" title="§7 Paragraph engine" />
194
+ <div className="mt-1 space-y-0.5">
195
+ {paras.map((p) => (
196
+ <div key={p.index} className="border-b border-zinc-50 py-0.5 text-[10px] last:border-0">
197
+ <Pill tone="indigo" title={PARAGRAPH_TYPE_NAMES[p.type]}>{p.type}</Pill>
198
+ <span className="ml-1 text-zinc-500">
199
+ anchor {p.hasAnchor ? "✓" : "✗"} · old→new {(p.oldNewChainRatio * 100).toFixed(0)}% · stress {p.finalSentenceStress ? "✓" : "✗"} · abstraction anchored {p.abstractionAnchored ? "✓" : "✗"}
200
+ </span>
201
+ </div>
202
+ ))}
203
+ </div>
204
+ </Card>
205
+ <Card>
206
+ <Head icon="🖼" title="§8 Image chains" right={`${chains.length} famil${chains.length === 1 ? "y" : "ies"}`} />
207
+ <div className="mt-1 space-y-0.5">
208
+ {chains.length === 0 && <div className="text-[10px] text-zinc-400">no image family detected</div>}
209
+ {chains.map((c) => (
210
+ <div key={c.motifId} className="text-[10px]">
211
+ <Pill tone={c.transformed ? "emerald" : c.occurrences.length >= 2 ? "amber" : "zinc"}>{c.sourceDomain}</Pill>
212
+ <span className="ml-1 text-zinc-500">
213
+ ×{c.occurrences.length} · {c.sensoryChannel} · {c.transformed ? "recurs in changed context ✓" : c.occurrences.length >= 2 ? "repeats without change (IMG-002) ✗" : "single use"}
214
+ </span>
215
+ </div>
216
+ ))}
217
+ </div>
218
+ </Card>
219
+ </div>
220
+ <div className="grid gap-2 sm:grid-cols-2">
221
+ <Card>
222
+ <Head icon="🔊" title="§9 Sound & rhythm" right={`${rhythm} ${RHYTHM_PROFILE_NAMES[rhythm]}`} />
223
+ <div className="mt-1 space-y-0.5">
224
+ {(Object.entries(sv) as [string, number][]).map(([k, v]) => (
225
+ <Bar key={k} v={v} label={k.replace(/([A-Z])/g, " $1").toLowerCase()} />
226
+ ))}
227
+ </div>
228
+ </Card>
229
+ <Card>
230
+ <Head icon="💬" title="§11 Dialogue" right={`${turns.length} turn(s) · ${speakers.length} attributed`} />
231
+ <div className="mt-1 space-y-0.5">
232
+ {turns.slice(0, 8).map((t) => (
233
+ <div key={t.index} className="text-[10px]">
234
+ <Pill tone="teal">{t.speechAct}</Pill>
235
+ {t.speaker && <Pill tone="zinc">{t.speaker}</Pill>}
236
+ {t.hasSubtext && <Pill tone="violet">subtext</Pill>}
237
+ <span className="ml-1 text-zinc-500">{t.line.slice(0, 52)}</span>
238
+ </div>
239
+ ))}
240
+ </div>
241
+ {speakers.length >= 2 && (
242
+ <div className="mt-1 text-[10px] text-zinc-600">
243
+ min idiolect distance{" "}
244
+ <b>{Math.min(...speakers.flatMap((a, i) => speakers.slice(i + 1).map((b) => idiolectDistance(a.vec, b.vec)))).toFixed(3)}</b>
245
+ {" "}(DIA-AUD-002 floor 0.18)
246
+ </div>
247
+ )}
248
+ </Card>
249
+ </div>
250
+ <Card>
251
+ <Head icon="⚖" title="§12 Argument / warrant" right="lyrical & perceptual passages are exempt (§12.1)" />
252
+ <div className="mt-1 space-y-0.5">
253
+ {args.map((a) => (
254
+ <div key={a.paragraph} className="text-[10px]">
255
+ <Pill tone={a.passageClass === "ARGUMENTATIVE" ? (a.complete ? "emerald" : "rose") : "zinc"}>{a.passageClass}</Pill>
256
+ <span className="ml-1 text-zinc-500">
257
+ {a.passageClass === "ARGUMENTATIVE"
258
+ ? `claim ${a.claim ? "✓" : "✗"} · reason ${a.reason ? "✓" : "✗"} · evidence ${a.evidence ? "✓" : "✗"}`
259
+ : "exempt from warranting"}
260
+ </span>
261
+ </div>
262
+ ))}
263
+ </div>
264
+ </Card>
265
+ </div>
266
+ )}
267
+
268
+ {sub === "audits" && kallos && (
269
+ <div className="space-y-2">
270
+ <Card tone={kallos.gatesPass ? "emerald" : "rose"}>
271
+ <Head icon="✨" title="§14 KALLOS-S" right={`weakest: ${kallos.weakest?.label}`} />
272
+ <div className="mt-1 flex items-baseline gap-2">
273
+ <span className="text-2xl font-bold text-zinc-900">{kallos.composite.toFixed(1)}</span>
274
+ <span className="text-[10px] text-zinc-500">/100</span>
275
+ <Pill tone={kallos.gatesPass ? "emerald" : "rose"}>{kallos.gatesPass ? "GATES PASS" : "HARD GATE FAILED ⇒ 0"}</Pill>
276
+ </div>
277
+ <div className="mt-1 flex flex-wrap gap-1">
278
+ {kallos.gates.map((x) => <Pill key={x.id} tone={x.pass ? "emerald" : "rose"} title={x.detail}>{x.id} {x.pass ? "✓" : "✗"}</Pill>)}
279
+ </div>
280
+ <div className="mt-1.5 space-y-0.5">
281
+ {kallos.dims.map((d) => <Bar key={d.key} v={d.score} label={`${d.label} (w ${d.weight})`} note={d.detail} />)}
282
+ </div>
283
+ </Card>
284
+ <Card>
285
+ <Head icon="📋" title="§13 AUREATE revision stack — PASS-001..015" />
286
+ <div className="mt-1 space-y-0.5">
287
+ {kallos.passes.map((p) => (
288
+ <div key={p.id} className={`border-b border-zinc-50 py-0.5 last:border-0 ${p.executable ? "" : "opacity-60"}`}>
289
+ <div className="flex items-start gap-1.5">
290
+ <span className={`shrink-0 font-mono text-[10px] ${p.severity === "pass" ? "text-emerald-600" : p.severity === "warn" ? "text-amber-600" : "text-rose-600"}`}>
291
+ {p.executable ? (p.severity === "pass" ? "✓" : p.severity === "warn" ? "!" : "✗") : "○"}
292
+ </span>
293
+ <span className="w-20 shrink-0 font-mono text-[10px] text-zinc-500">{p.id}</span>
294
+ <span className="w-52 shrink-0 text-[10px] font-semibold text-zinc-700">{p.name}</span>
295
+ <span className="text-[10px] text-zinc-500">{p.detail}</span>
296
+ </div>
297
+ {p.findings.length > 0 && (
298
+ <ul className="ml-[100px] list-disc text-[9.5px] text-zinc-400">{p.findings.map((f, i) => <li key={i}>{f}</li>)}</ul>
299
+ )}
300
+ </div>
301
+ ))}
302
+ </div>
303
+ <div className="mt-1 text-[9px] italic text-zinc-400">{kallos.method}</div>
304
+ </Card>
305
+ </div>
306
+ )}
307
+
308
+ {sub === "live" && (
309
+ <Card>
310
+ <Head icon="📡" title="Style audit of generated chapters" right={live.length ? `${live.length} chapter(s)` : "no chapters generated yet"} />
311
+ {live.length === 0 ? (
312
+ <div className="mt-1 text-[10px] text-zinc-500">
313
+ Runs automatically on every chapter the fiction engine produces (same seam as the reality audit).
314
+ Results appear here after a run.
315
+ </div>
316
+ ) : (
317
+ <div className="mt-1 space-y-1">
318
+ {live.slice(-10).map((a) => (
319
+ <div key={a.chapter}>
320
+ <div className="flex items-center gap-1.5">
321
+ <span className="w-14 shrink-0 text-[10px] text-zinc-500">ch{a.chapter}</span>
322
+ <div className="h-1.5 flex-1 rounded-full bg-zinc-100">
323
+ <div className="h-full rounded-full" style={{ width: `${a.report.composite}%`, backgroundColor: `hsl(${Math.round(a.report.composite * 1.2)},55%,50%)` }} />
324
+ </div>
325
+ <span className="w-10 text-right font-mono text-[10px] text-zinc-600">{a.report.composite.toFixed(0)}</span>
326
+ {!a.report.gatesPass && <Pill tone="rose">gate fail</Pill>}
327
+ </div>
328
+ <div className="ml-16 text-[9px] text-zinc-400">
329
+ weakest {a.report.weakest?.label} · {RHYTHM_PROFILE_NAMES[a.report.rhythmProfile]} ·{" "}
330
+ {a.report.passes.filter((p) => p.severity === "fail").map((p) => p.id).join(", ") || "no failing pass"}
331
+ </div>
332
+ </div>
333
+ ))}
334
+ </div>
335
+ )}
336
+ </Card>
337
+ )}
338
+
339
+ {sub === "cgol" && cgol && (
340
+ <Card>
341
+ <Head icon="♟" title="§15 STYLE-CGOL" right={`${cgol.pattern} · ${cgol.detail}`} />
342
+ <div className="mt-1 flex flex-wrap gap-1">
343
+ {cgol.cells.map((c) => (
344
+ <Pill key={c.index} tone={c.event === "OVERPOPULATION" ? "rose" : c.event === "UNDERPOPULATION" ? "amber" : c.event === "SURVIVAL" ? "emerald" : "zinc"} title={c.note}>
345
+ {c.index + 1}:{c.state}
346
+ </Pill>
347
+ ))}
348
+ </div>
349
+ {cgol.advice.length > 0 && (
350
+ <ul className="ml-3 mt-1 list-disc text-[10px] text-amber-800">{cgol.advice.map((a) => <li key={a}>{a}</li>)}</ul>
351
+ )}
352
+ <div className="mt-1 text-[9px] italic text-zinc-400">
353
+ Style states evolve over discourse units; BIRTH/SURVIVAL/DEATH follow support from scene force and genre contract (§15.2).
354
+ Falls back to sentence scale when the paragraph lattice is too small to carry a pattern.
355
+ </div>
356
+ </Card>
357
+ )}
358
+
359
+ {sub === "tests" && (
360
+ <Card>
361
+ <Head icon="🧪" title="§19 STYLE-TEST-001..015" right={`${tests.filter((t) => t.status === "PASS").length} PASS · ${tests.filter((t) => t.status === "FAIL").length} FAIL · ${tests.filter((t) => t.status === "NOT_EXECUTABLE").length} N/E`} />
362
+ <table className="mt-1 w-full text-[10px]"><tbody>
363
+ {tests.map((t) => (
364
+ <tr key={t.id} className="border-b border-zinc-50 align-top">
365
+ <td className="w-24 py-0.5 font-mono text-zinc-400">{t.id}</td>
366
+ <td className="w-16 py-0.5"><Pill tone={t.status === "PASS" ? "emerald" : t.status === "FAIL" ? "rose" : "zinc"}>{t.status === "NOT_EXECUTABLE" ? "N/E" : t.status}</Pill></td>
367
+ <td className="w-48 py-0.5 font-semibold text-zinc-700">{t.name}</td>
368
+ <td className="py-0.5 text-zinc-500">{t.detail}</td>
369
+ </tr>
370
+ ))}
371
+ </tbody></table>
372
+ <div className="mt-1 text-[9px] italic text-zinc-400">N/E = not executable in this environment; the blocker is stated, never hidden.</div>
373
+ </Card>
374
+ )}
375
+
376
+ <Card tone="amber">
377
+ <Head icon="⚠" title="v4 §0 honesty boundary" />
378
+ <ul className="ml-3 mt-1 list-disc text-[10px] text-amber-900">{V4_HONESTY.map((h) => <li key={h}>{h}</li>)}</ul>
379
+ </Card>
380
+ </div>
381
+ );
382
+ }