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.
- package/diagnostics.mjs +141 -0
- package/dist/compute.worker-j5ahIpF-.js +1 -0
- package/dist/graph.worker-DG6iGCB9.js +1 -0
- package/dist/index.html +2314 -0
- package/flatten-guide.md +248 -0
- package/index.html +12 -0
- package/package.json +38 -0
- package/src/App.orig.tsx +204 -0
- package/src/App.orig1.tsx +27 -0
- package/src/App.orig2.tsx +25 -0
- package/src/App.tsx +3 -0
- package/src/BaseApp.tsx +18 -0
- package/src/INTEGRATION_LEDGER.md +22 -0
- package/src/PERSIST_CANARY.orig.txt +1 -0
- package/src/PERSIST_CANARY.txt +1 -0
- package/src/REGRESSION_LEDGER.md +651 -0
- package/src/TEMPLATE_PIPELINE_AUDIT.md +208 -0
- package/src/WILLIAMS_PERSONA_GUIDE.md +62 -0
- package/src/chat/VeritasChat.tsx +69 -0
- package/src/chat/synthesis.ts +31 -0
- package/src/chat/tier.ts +45 -0
- package/src/components/AdaptersPage.orig.tsx +99 -0
- package/src/components/AdaptersPage.tsx +3 -0
- package/src/components/AdversarialPanel.tsx +136 -0
- package/src/components/AnchorBaselinePanel.tsx +75 -0
- package/src/components/AnswerPanel.tsx +60 -0
- package/src/components/ArtifactPanel.tsx +43 -0
- package/src/components/ChatApp.orig.tsx +1582 -0
- package/src/components/ChatApp.orig1.tsx +722 -0
- package/src/components/ChatApp.tsx +95 -0
- package/src/components/ChatAugmentPanels.tsx +73 -0
- package/src/components/CitationLedgerPanel.tsx +313 -0
- package/src/components/ComputeSandboxPanel.tsx +130 -0
- package/src/components/ConfigPanel.tsx +110 -0
- package/src/components/ControlPlanePage.tsx +195 -0
- package/src/components/CreativeTreeLifePage.tsx +234 -0
- package/src/components/CreativeTreeOfLifePanel.tsx +149 -0
- package/src/components/DebugTracePanel.tsx +137 -0
- package/src/components/DeepReasoningTrace.tsx +48 -0
- package/src/components/EntitySheetPanel.tsx +51 -0
- package/src/components/FailureModesPanel.tsx +104 -0
- package/src/components/GBSDashboard.tsx +239 -0
- package/src/components/GraphView.tsx +116 -0
- package/src/components/HUD.tsx +125 -0
- package/src/components/HypothesisPanel.tsx +67 -0
- package/src/components/InnovationGenomeEngine.tsx +792 -0
- package/src/components/InnovationPersonaGuide.tsx +348 -0
- package/src/components/InnovationPersonaPanel.tsx +289 -0
- package/src/components/LiveResourceHUD.tsx +109 -0
- package/src/components/LongWriterPanel.tsx +112 -0
- package/src/components/MainPipelineV10Bridge.tsx +72 -0
- package/src/components/MarkdownLite.tsx +63 -0
- package/src/components/MemoryInspector.tsx +38 -0
- package/src/components/MemoryMonitor.tsx +52 -0
- package/src/components/MemoryStressPanel.tsx +176 -0
- package/src/components/ModulesPage.tsx +171 -0
- package/src/components/PipelineDebugConsole.orig.tsx +1856 -0
- package/src/components/PipelineDebugConsole.tsx +3 -0
- package/src/components/PreFlightHUD.tsx +67 -0
- package/src/components/PrismaFetchTracePanel.tsx +87 -0
- package/src/components/ReportOSPanel.tsx +165 -0
- package/src/components/ResourceEstimatorPage.tsx +327 -0
- package/src/components/RichText.tsx +181 -0
- package/src/components/SagaOsPanel.tsx +605 -0
- package/src/components/SagaOsReference.tsx +421 -0
- package/src/components/SagaOsV2Panel.tsx +594 -0
- package/src/components/SagaStyleTab.tsx +382 -0
- package/src/components/SageBlueprintPanel.tsx +416 -0
- package/src/components/SharedChatInput.tsx +77 -0
- package/src/components/StatFinancePanel.tsx +190 -0
- package/src/components/StylePersonaPanel.tsx +128 -0
- package/src/components/TemplatesPage.tsx +300 -0
- package/src/components/TestPanel.tsx +63 -0
- package/src/components/TraceLog.tsx +89 -0
- package/src/components/V15CalibrationAugment.tsx +1134 -0
- package/src/components/V15CalibrationDialog.tsx +1871 -0
- package/src/components/V15Overlay.orig.tsx +120 -0
- package/src/components/V15Overlay.tsx +4 -0
- package/src/components/V15OverlayWrapper.tsx +362 -0
- package/src/components/V15Toggle.tsx +34 -0
- package/src/console/DiagnosticRecoveryPanel.tsx +358 -0
- package/src/console/EngineeringConsole.tsx +103 -0
- package/src/console/FictionSystemPanels.tsx +882 -0
- package/src/console/InspectorPanels.tsx +254 -0
- package/src/console/ManuscriptGraderPanel.tsx +182 -0
- package/src/console/RecursiveReviserPanel.tsx +245 -0
- package/src/console/SeedControlPanel.tsx +135 -0
- package/src/console/StoryControllerPanel.tsx +443 -0
- package/src/console/engineBridge.ts +258 -0
- package/src/console/gemini.ts +106 -0
- package/src/console/grading.ts +250 -0
- package/src/console/util.ts +45 -0
- package/src/fiction/continuity.ts +372 -0
- package/src/fiction/crash-protection.ts +111 -0
- package/src/fiction/diagnostics.ts +208 -0
- package/src/fiction/diff.ts +74 -0
- package/src/fiction/entity-state-machine.ts +214 -0
- package/src/fiction/nive-engine.ts +404 -0
- package/src/fiction/pipeline-selftest.ts +132 -0
- package/src/fiction/seed-control.ts +193 -0
- package/src/fiction/story-engine.ts +326 -0
- package/src/fiction/types.ts +68 -0
- package/src/flatten-guide.md +379 -0
- package/src/index.css +14 -0
- package/src/index.orig.css +13 -0
- package/src/lib/academic-sources.base.ts +188 -0
- package/src/lib/academic-sources.orig.ts +28 -0
- package/src/lib/academic-sources.ts +10 -0
- package/src/lib/advanced-math.ts +119 -0
- package/src/lib/adversarial-engine.base.ts +409 -0
- package/src/lib/adversarial-engine.ts +82 -0
- package/src/lib/ai-revision.ts +623 -0
- package/src/lib/app-state.tsx +426 -0
- package/src/lib/artifact-registry.ts +97 -0
- package/src/lib/artifacts.ts +180 -0
- package/src/lib/atlas-dr.ts +167 -0
- package/src/lib/browser-mtls.ts +127 -0
- package/src/lib/browser-queue.ts +221 -0
- package/src/lib/browser-search-scraper.base.ts +382 -0
- package/src/lib/browser-search-scraper.orig.ts +90 -0
- package/src/lib/browser-search-scraper.ts +10 -0
- package/src/lib/calc-interceptor.ts +82 -0
- package/src/lib/citation-lane-tap.ts +78 -0
- package/src/lib/citation-ledger-store.ts +369 -0
- package/src/lib/citation-ledger.ts +203 -0
- package/src/lib/compute-sandbox.ts +215 -0
- package/src/lib/compute.worker.ts +153 -0
- package/src/lib/connectors/gemini.ts +120 -0
- package/src/lib/connectors/jina.ts +233 -0
- package/src/lib/connectors/marketdata.ts +51 -0
- package/src/lib/connectors/prismafetch.base.ts +175 -0
- package/src/lib/connectors/prismafetch.ts +1 -0
- package/src/lib/connectors/serpapi.ts +65 -0
- package/src/lib/connectors/wikidata.ts +44 -0
- package/src/lib/constraints.ts +331 -0
- package/src/lib/continuation-detector.base.ts +153 -0
- package/src/lib/continuation-detector.ts +48 -0
- package/src/lib/contradraft.ts +168 -0
- package/src/lib/cors-proxy.ts +120 -0
- package/src/lib/coverage.ts +81 -0
- package/src/lib/debug/architecture-prescription.ts +556 -0
- package/src/lib/debug/covea-repair.ts +543 -0
- package/src/lib/debug/helios-ground.ts +319 -0
- package/src/lib/debug/intent-decomposer.ts +281 -0
- package/src/lib/debug/intent-lattice.ts +349 -0
- package/src/lib/debug/pipeline-diagnosis.ts +1149 -0
- package/src/lib/debug/pipeline-trace-bus.ts +424 -0
- package/src/lib/debug/prompt-forge.ts +678 -0
- package/src/lib/debug/repair-sites.ts +513 -0
- package/src/lib/debug/research-phase.ts +266 -0
- package/src/lib/debug/retrieval-context.ts +76 -0
- package/src/lib/debug/retrieval-hardener.ts +142 -0
- package/src/lib/debug/scraper-debug-runner.ts +576 -0
- package/src/lib/debug/scraper-forensics.ts +418 -0
- package/src/lib/debug/scraper-lane-roadmap.ts +136 -0
- package/src/lib/debug/self-test.ts +415 -0
- package/src/lib/debug/step-attribution.ts +211 -0
- package/src/lib/debug/template-rubric.ts +301 -0
- package/src/lib/debug/unified-innovation.ts +126 -0
- package/src/lib/debug/veritas-hybrid-scraper.ts +335 -0
- package/src/lib/defense-registry.ts +104 -0
- package/src/lib/defenses.ts +162 -0
- package/src/lib/deterministic-citation-ledger.ts +174 -0
- package/src/lib/elo-registry.base.ts +117 -0
- package/src/lib/elo-registry.ts +1 -0
- package/src/lib/entity-resolver.ts +291 -0
- package/src/lib/failure-modes.ts +267 -0
- package/src/lib/feature-registry.ts +69 -0
- package/src/lib/flaw-registry.ts +143 -0
- package/src/lib/flaws/_template.ts +52 -0
- package/src/lib/flaws/builtins.ts +63 -0
- package/src/lib/flaws/finance.ts +169 -0
- package/src/lib/flaws/fixers.ts +10 -0
- package/src/lib/flaws/index.ts +32 -0
- package/src/lib/flaws/legal.ts +157 -0
- package/src/lib/flaws/medical.ts +188 -0
- package/src/lib/flaws/original-defenses-pack.ts +81 -0
- package/src/lib/flaws/sample-declarative-pack.json +38 -0
- package/src/lib/flaws/selftest.ts +201 -0
- package/src/lib/flaws/software-extended.ts +125 -0
- package/src/lib/flaws/software-rn-webgl.ts +182 -0
- package/src/lib/flaws/statistics-advanced.ts +46 -0
- package/src/lib/flaws/statistics.ts +61 -0
- package/src/lib/gbse/config.ts +20 -0
- package/src/lib/gbse/engine.ts +226 -0
- package/src/lib/gbse/graph.ts +118 -0
- package/src/lib/gbse/graph.worker.ts +21 -0
- package/src/lib/gbse/tests.ts +117 -0
- package/src/lib/gbse/tiers.ts +65 -0
- package/src/lib/gbse/types.ts +94 -0
- package/src/lib/innovation-genome-engine-v2.orig.ts +1001 -0
- package/src/lib/innovation-genome-engine-v2.ts +3 -0
- package/src/lib/innovation-genome-engine.orig.ts +330 -0
- package/src/lib/innovation-genome-engine.ts +3 -0
- package/src/lib/innovation-genome-v10.orig.ts +314 -0
- package/src/lib/innovation-genome-v10.ts +2 -0
- package/src/lib/innovation-genome-v3.orig.ts +2015 -0
- package/src/lib/innovation-genome-v3.ts +2 -0
- package/src/lib/innovation-genome-v4.orig.ts +1959 -0
- package/src/lib/innovation-genome-v4.ts +2 -0
- package/src/lib/innovation-genome-v5.orig.ts +1210 -0
- package/src/lib/innovation-genome-v5.ts +2 -0
- package/src/lib/innovation-genome-v7.orig.ts +2549 -0
- package/src/lib/innovation-genome-v7.ts +2 -0
- package/src/lib/innovation-genome-v8.orig.ts +1485 -0
- package/src/lib/innovation-genome-v8.ts +2 -0
- package/src/lib/innovation-genome-v9.orig.ts +643 -0
- package/src/lib/innovation-genome-v9.ts +2 -0
- package/src/lib/jina.base.ts +293 -0
- package/src/lib/jina.ts +1 -0
- package/src/lib/live-telemetry.ts +61 -0
- package/src/lib/longwriter.ts +84 -0
- package/src/lib/manuscript-grade-v2.ts +298 -0
- package/src/lib/memory-governor.ts +173 -0
- package/src/lib/memory-stress-tests.ts +248 -0
- package/src/lib/model-intelligence.ts +48 -0
- package/src/lib/model-rotator.ts +75 -0
- package/src/lib/models.orig.ts +513 -0
- package/src/lib/models.ts +151 -0
- package/src/lib/n-deep.base.ts +592 -0
- package/src/lib/n-deep.ts +51 -0
- package/src/lib/nih-simulator.ts +56 -0
- package/src/lib/nih-vulnerability-fixes.ts +460 -0
- package/src/lib/omega-templates.base.ts +294 -0
- package/src/lib/omega-templates.ts +225 -0
- package/src/lib/omni-nexus.ts +64 -0
- package/src/lib/oracle-adapters.ts +67 -0
- package/src/lib/oracle-registry.ts +163 -0
- package/src/lib/orchestrator.ts +357 -0
- package/src/lib/output-boundary.ts +235 -0
- package/src/lib/overrides/vite-native-chaos-harness.ts +154 -0
- package/src/lib/overrides/vite-native-contract-plane.ts +245 -0
- package/src/lib/overrides/vite-native-doctor-plane.ts +208 -0
- package/src/lib/overrides/vite-native-knowledge-store.ts +267 -0
- package/src/lib/overrides/vite-native-policy-plane.ts +190 -0
- package/src/lib/overrides/vite-native-replay-plane.ts +197 -0
- package/src/lib/overrides/vite-native-runtime-plane.ts +106 -0
- package/src/lib/overrides/vite-native-scraper.ts +848 -0
- package/src/lib/overrides/vite-native-selftest-functional.ts +217 -0
- package/src/lib/overrides/vite-native-selftest.ts +183 -0
- package/src/lib/overrides/vite-native-snapshot-plane.ts +123 -0
- package/src/lib/philosophy-toolkit.ts +75 -0
- package/src/lib/pipeline.orig.ts +659 -0
- package/src/lib/pipeline.ts +42 -0
- package/src/lib/precache.ts +128 -0
- package/src/lib/py-sandbox.ts +205 -0
- package/src/lib/quality-score.ts +96 -0
- package/src/lib/quant-engine.ts +231 -0
- package/src/lib/quant-lib.ts +80 -0
- package/src/lib/reportos.ts +175 -0
- package/src/lib/research-os.ts +306 -0
- package/src/lib/resource-estimator.ts +114 -0
- package/src/lib/rpm-governor.ts +93 -0
- package/src/lib/runtime-estimator.ts +135 -0
- package/src/lib/sage/empty-space-v6.ts +560 -0
- package/src/lib/sage/empty-space-v7.ts +222 -0
- package/src/lib/sage/empty-space.ts +733 -0
- package/src/lib/sage/engine.ts +786 -0
- package/src/lib/sage/index.ts +17 -0
- package/src/lib/sage/judge.ts +246 -0
- package/src/lib/sage/prng.ts +53 -0
- package/src/lib/sage/reality-grounding.ts +380 -0
- package/src/lib/sage/repetition.ts +151 -0
- package/src/lib/sage/saga-os-v2-engines.ts +1870 -0
- package/src/lib/sage/saga-os-v2.ts +274 -0
- package/src/lib/sage/saga-os-v3-core.ts +1491 -0
- package/src/lib/sage/saga-os-v3-release.ts +739 -0
- package/src/lib/sage/saga-os-v4-aureate.ts +1161 -0
- package/src/lib/sage/saga-os-v4.ts +212 -0
- package/src/lib/sage/saga-os-v5.ts +205 -0
- package/src/lib/sage/saga-os-v6.ts +346 -0
- package/src/lib/sage/saga-os-v7.ts +314 -0
- package/src/lib/sage/saga-os-v8.ts +505 -0
- package/src/lib/sage/saga-os.ts +329 -0
- package/src/lib/sage/taxonomy.ts +403 -0
- package/src/lib/sage/unified-roll.ts +524 -0
- package/src/lib/sage/worked-sketches.ts +44 -0
- package/src/lib/sage.ts +166 -0
- package/src/lib/scraper-debug-bus.ts +53 -0
- package/src/lib/scraper-enhanced.orig.ts +153 -0
- package/src/lib/scraper-enhanced.ts +10 -0
- package/src/lib/scraper-hardener.base.orig.ts +155 -0
- package/src/lib/scraper-hardener.base.ts +317 -0
- package/src/lib/scraper-hardener.ts +1 -0
- package/src/lib/scraper-palisade/palisade-adjudicator.orig.ts +419 -0
- package/src/lib/scraper-palisade/palisade-adjudicator.ts +13 -0
- package/src/lib/scraper-vnext/arbiter-omega.orig.ts +688 -0
- package/src/lib/scraper-vnext/arbiter-omega.ts +13 -0
- package/src/lib/scraper-vnext/canonical-portfolio-augments.ts +479 -0
- package/src/lib/scraper-vnext/canonical-portfolio-orchestrator.orig.ts +1529 -0
- package/src/lib/scraper-vnext/canonical-portfolio-orchestrator.ts +13 -0
- package/src/lib/scraper-vnext/conclave-omega.ts +1830 -0
- package/src/lib/scraper-vnext/content-extractor-v2.ts +226 -0
- package/src/lib/scraper-vnext/diagnostics-suite.ts +36 -0
- package/src/lib/scraper-vnext/epistemic-packer.ts +97 -0
- package/src/lib/scraper-vnext/fusion-v2.ts +65 -0
- package/src/lib/scraper-vnext/hydra-reader.orig.ts +1216 -0
- package/src/lib/scraper-vnext/hydra-reader.ts +13 -0
- package/src/lib/scraper-vnext/native-scraper-browser-vnext.orig.ts +91 -0
- package/src/lib/scraper-vnext/native-scraper-browser-vnext.ts +13 -0
- package/src/lib/scraper-vnext/nexus-consensus.orig.ts +905 -0
- package/src/lib/scraper-vnext/nexus-consensus.ts +13 -0
- package/src/lib/scraper-vnext/portfolio-consensus-adjudicator.ts +804 -0
- package/src/lib/scraper-vnext/portfolio-consensus-memory.ts +377 -0
- package/src/lib/scraper-vnext/portfolio-terminal-governor.ts +548 -0
- package/src/lib/scraper-vnext/query-strategist.orig.ts +224 -0
- package/src/lib/scraper-vnext/query-strategist.ts +423 -0
- package/src/lib/scraper-vnext/retrieval-accelerator.ts +708 -0
- package/src/lib/scraper-vnext/retrieval-audit-augments.ts +477 -0
- package/src/lib/scraper-vnext/retrieval-control-plane.ts +904 -0
- package/src/lib/scraper-vnext/retrieval-policy-augments.ts +358 -0
- package/src/lib/scraper-vnext/safe-fetch-v2.ts +157 -0
- package/src/lib/scraper-vnext/sentinel-omega.ts +56 -0
- package/src/lib/scraper-vnext/sentinel-orchestrator.ts +69 -0
- package/src/lib/scraper-vnext/sibyl-oracle.orig.ts +413 -0
- package/src/lib/scraper-vnext/sibyl-oracle.ts +13 -0
- package/src/lib/scraper-vnext/smart-read-v2.ts +55 -0
- package/src/lib/scraper-vnext/spa-rescue-bridge.ts +608 -0
- package/src/lib/scraper-vnext/strata-engine.orig.ts +2666 -0
- package/src/lib/scraper-vnext/strata-engine.ts +13 -0
- package/src/lib/scraper-vnext/structured-source-adapter.orig.ts +369 -0
- package/src/lib/scraper-vnext/structured-source-adapter.ts +34 -0
- package/src/lib/scraper-vnext/terminal-complete.ts +224 -0
- package/src/lib/scraper-vnext/terminal-final.ts +277 -0
- package/src/lib/scraper-vnext/terminal-saturation.ts +345 -0
- package/src/lib/scraper-vnext/terminal-wire.ts +425 -0
- package/src/lib/scraper-vnext/vanguard-titanium.orig.ts +467 -0
- package/src/lib/scraper-vnext/vanguard-titanium.ts +17 -0
- package/src/lib/search-cache.ts +138 -0
- package/src/lib/sloop-runner.base.ts +223 -0
- package/src/lib/sloop-runner.ts +104 -0
- package/src/lib/sloop.ts +114 -0
- package/src/lib/small-model-adapters.ts +82 -0
- package/src/lib/sscp.ts +86 -0
- package/src/lib/system-map.ts +54 -0
- package/src/lib/uni-node.ts +86 -0
- package/src/lib/universal-rigor-guard.ts +433 -0
- package/src/lib/v15-gate-testbed.ts +274 -0
- package/src/lib/v15-gemini.base.ts +89 -0
- package/src/lib/v15-gemini.ts +1 -0
- package/src/lib/v15-grounding.orig.ts +241 -0
- package/src/lib/v15-grounding.ts +79 -0
- package/src/lib/v15-pipeline.base.ts +769 -0
- package/src/lib/v15-pipeline.orig.ts +1154 -0
- package/src/lib/v15-pipeline.ts +674 -0
- package/src/lib/v15-questions.ts +64 -0
- package/src/lib/v15-rate-limiter.orig.ts +91 -0
- package/src/lib/v15-rate-limiter.ts +48 -0
- package/src/lib/v15-state.base.ts +87 -0
- package/src/lib/v15-state.ts +28 -0
- package/src/lib/visual-table-generator.tsx +207 -0
- package/src/lib/wasm-runtime.ts +133 -0
- package/src/lib/williams-persona-guide.ts +265 -0
- package/src/lib/williams-style.base.ts +464 -0
- package/src/lib/williams-style.ts +59 -0
- package/src/lib/worker-pool.ts +96 -0
- package/src/lib/writing-tiers.ts +125 -0
- package/src/main.orig.tsx +10 -0
- package/src/main.tsx +10 -0
- package/src/utils/cn.orig.ts +6 -0
- package/src/utils/cn.ts +6 -0
- package/src/vite-env.d.ts +1 -0
- package/tsconfig.json +31 -0
- package/unify.mjs +537 -0
- package/vite.config.ts +18 -0
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SAGA-OS — multi-scale / multi-volume composition system (Turn 8).
|
|
3
|
+
* ---------------------------------------------------------------------------
|
|
4
|
+
* Additive integration of the P8 canonical "SAGA-OS v1" architecture
|
|
5
|
+
* (fable.canon SYSTEM v12): series modes, phase architecture, throughlines,
|
|
6
|
+
* scene grammars, pace vector + stakes rotation, promise/loop scopes, the
|
|
7
|
+
* 54-rule logic-audit families, repair operators, adversarial attacks, stop
|
|
8
|
+
* conditions, and the composition operators.
|
|
9
|
+
*
|
|
10
|
+
* DESIGN CONSTRAINT (per task): additive and optimal, NO new UI/UX unless
|
|
11
|
+
* strictly necessary. This module therefore exposes:
|
|
12
|
+
* 1. static canonical tables (data), and
|
|
13
|
+
* 2. two pure functions the existing SAGE engine already needs:
|
|
14
|
+
* - buildSagaDirectiveBlock(): a compact directive snippet the chapter
|
|
15
|
+
* prompt can append so single- and multi-chapter works inherit
|
|
16
|
+
* throughline/pacing/promise discipline without any UI change;
|
|
17
|
+
* - runSagaLogicAudit(): a local, no-LLM structural audit over an
|
|
18
|
+
* already-generated blueprint + chapter texts, reusing the existing
|
|
19
|
+
* judge/repetition philosophy (computed evidence, not self-declared).
|
|
20
|
+
*
|
|
21
|
+
* HONESTY: canonical tables are transcribed from the provided P8 document.
|
|
22
|
+
* The audit is a real local computation; it is not an LLM claim.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
export type SagaRow = { id: string; name: string; note: string };
|
|
26
|
+
|
|
27
|
+
function parse(raw: string): SagaRow[] {
|
|
28
|
+
return raw
|
|
29
|
+
.trim()
|
|
30
|
+
.split(/\n+/)
|
|
31
|
+
.map((l) => l.trim())
|
|
32
|
+
.filter(Boolean)
|
|
33
|
+
.map((l) => {
|
|
34
|
+
const [id, name, ...rest] = l.split("|").map((p) => p.trim());
|
|
35
|
+
return { id, name, note: rest.join(" | ") };
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// ── §8 Series architecture modes ────────────────────────────────────────────
|
|
40
|
+
export const SAGA_SERIES_MODES: SagaRow[] = parse(`
|
|
41
|
+
SERIES-MODE-001 | FINITE_SAGA | One overarching causal arc divided into locally satisfying volumes
|
|
42
|
+
SERIES-MODE-002 | EPISODIC_META | Each volume has a complete case/adventure; a slower mystery or transformation accumulates
|
|
43
|
+
SERIES-MODE-003 | SCHOOL_YEAR_SPIRAL | Recurring annual structure; cast ages, institutions reveal deeper layers
|
|
44
|
+
SERIES-MODE-004 | MISFORTUNE_LEDGER_SERIAL | A stable episode grammar repeats, but every repetition accumulates evidence, loss, moral debt
|
|
45
|
+
SERIES-MODE-005 | ROTATING_LEAD_MOSAIC | Different volume leads; shared world, institutions, consequences, relational network
|
|
46
|
+
SERIES-MODE-006 | GENERATIONAL_SUCCESSION | Responsibility and unresolved causality transfer between generations
|
|
47
|
+
SERIES-MODE-007 | INSTITUTION_LIFECYCLE | Protagonist is an institution moving through founding, capture, fracture, reform, residual legacy
|
|
48
|
+
SERIES-MODE-008 | GEOGRAPHIC_EXPANSION_RETURN | Each volume expands the map; late volumes revisit transformed early locations
|
|
49
|
+
SERIES-MODE-009 | SHARED_WORLD_ANTHOLOGY | Volumes may be locally independent, but world-state deltas remain canonical
|
|
50
|
+
SERIES-MODE-010 | OPEN_SERIAL | No predetermined final volume; rolling phase horizons; every phase still has closure criteria
|
|
51
|
+
`);
|
|
52
|
+
|
|
53
|
+
// ── §9 Series phase architecture (normalized volume position bands) ─────────
|
|
54
|
+
export const SAGA_PHASES: { range: string; phase: string }[] = [
|
|
55
|
+
{ range: "0.00–0.15", phase: "FOUNDATION" },
|
|
56
|
+
{ range: "0.15–0.35", phase: "EXPANSION" },
|
|
57
|
+
{ range: "0.35–0.50", phase: "REVERSAL" },
|
|
58
|
+
{ range: "0.50–0.65", phase: "DEEPENING" },
|
|
59
|
+
{ range: "0.65–0.80", phase: "FRACTURE" },
|
|
60
|
+
{ range: "0.80–0.93", phase: "CONVERGENCE" },
|
|
61
|
+
{ range: "0.93–1.00", phase: "CLOSURE" },
|
|
62
|
+
];
|
|
63
|
+
|
|
64
|
+
// ── §7 Throughlines (ES-LN-TL) ──────────────────────────────────────────────
|
|
65
|
+
export const SAGA_THROUGHLINES: SagaRow[] = parse(`
|
|
66
|
+
ES-LN-TL001 | Objective-System Throughline | external institutional/systemic pressure involving many characters
|
|
67
|
+
ES-LN-TL002 | Main-Character Throughline | the protagonist's private pressure, fear, wound, or decision boundary
|
|
68
|
+
ES-LN-TL003 | Influence-Character Throughline | a challenger who embodies a viable alternative method of living or acting
|
|
69
|
+
ES-LN-TL004 | Relationship Throughline | the evolving bond between protagonist and influence figure or key counterpart
|
|
70
|
+
ES-LN-TL005 | Grounded-System Throughline | a non-metaphysical institution / ecology / infrastructure that keeps the novel concrete
|
|
71
|
+
ES-LN-TL006 | Residual Throughline | what remains after apparent resolution: ash, debt, route, office, unclaimed prize, successor, maintenance duty
|
|
72
|
+
ES-LN-TL007 | Sub-Character Throughline | bit-player / standby / ambient / family / interstitial figures create recurrence and texture
|
|
73
|
+
ES-LN-TL008 | Setting-Pressure Throughline | recurring settings apply different constraints at different acts
|
|
74
|
+
`);
|
|
75
|
+
|
|
76
|
+
// ── §13 Scene grammars ──────────────────────────────────────────────────────
|
|
77
|
+
export const SAGA_SCENE_GRAMMARS: SagaRow[] = parse(`
|
|
78
|
+
SCENE-GRAMMAR-001 | ACTION | Goal → Opposition → Action → Setback/Cost
|
|
79
|
+
SCENE-GRAMMAR-002 | PROCESSING | Reaction → Interpretation → Dilemma → Decision
|
|
80
|
+
SCENE-GRAMMAR-003 | INVESTIGATION | Question → Search → Evidence → Revised hypothesis
|
|
81
|
+
SCENE-GRAMMAR-004 | INSTITUTIONAL | Rule invoked → Parties argue → Ruling → New obligation
|
|
82
|
+
SCENE-GRAMMAR-005 | MAINTENANCE | Baseline checked → Drift detected → Intervention → Residual risk
|
|
83
|
+
SCENE-GRAMMAR-006 | RITUAL | Preconditions → Performance → Deviation → Social consequence
|
|
84
|
+
SCENE-GRAMMAR-007 | TRAVEL/TRANSITION | Departure state → Boundary friction → Arrival delta
|
|
85
|
+
SCENE-GRAMMAR-008 | RELATIONAL | Bid → Interpretation → Response → Relationship delta
|
|
86
|
+
SCENE-GRAMMAR-009 | ENSEMBLE CONVERGENCE | Multiple strand goals → shared constraint → allocation → distributed consequence
|
|
87
|
+
SCENE-GRAMMAR-010 | AFTERMATH | Cost inventory → grief/relief → responsibility assignment → next contract
|
|
88
|
+
`);
|
|
89
|
+
|
|
90
|
+
// ── §16 Pace vector dimensions + §16.4 stakes rotation ──────────────────────
|
|
91
|
+
export const SAGA_PACE_DIMENSIONS = [
|
|
92
|
+
"danger", "urgency", "uncertainty", "intimacy", "moral_cost",
|
|
93
|
+
"institutional_pressure", "novelty", "grief", "relief", "cognitive_update_load",
|
|
94
|
+
] as const;
|
|
95
|
+
|
|
96
|
+
export const SAGA_STAKES_AXES = [
|
|
97
|
+
"physical", "relational", "epistemic", "institutional",
|
|
98
|
+
"identity", "moral", "ecological", "custodial",
|
|
99
|
+
] as const;
|
|
100
|
+
|
|
101
|
+
// ── §15 Promise scopes/states + §18.2 composition operators ─────────────────
|
|
102
|
+
export const SAGA_PROMISE_SCOPES = ["LOCAL", "PHASE", "SAGA", "RESIDUAL"] as const;
|
|
103
|
+
export const SAGA_PROMISE_STATES = [
|
|
104
|
+
"SEEDED", "REINFORCED", "COMPLICATED", "REPRICED", "PARTIALLY_PAID",
|
|
105
|
+
"PAID", "TRANSFERRED", "EXPIRED", "REPUDIATED", "RESIDUALIZED",
|
|
106
|
+
] as const;
|
|
107
|
+
|
|
108
|
+
export const SAGA_COMPOSITION_OPERATORS: SagaRow[] = parse(`
|
|
109
|
+
OP-001 | BIND | Assign catalog primitive to a typed slot
|
|
110
|
+
OP-002 | SEED | Introduce future-use element before activation
|
|
111
|
+
OP-003 | ECHO | Repeat an element with altered context
|
|
112
|
+
OP-004 | REPRICE | Change understood cost or meaning without deleting prior facts
|
|
113
|
+
OP-005 | PAY | Resolve a promise proportionally to its setup
|
|
114
|
+
OP-006 | TRANSFER | Move responsibility, debt, office, object, or loop
|
|
115
|
+
OP-007 | PROMOTE | Elevate a satellite into a lead after seeded agency
|
|
116
|
+
OP-008 | DEMOTE | Return lead to satellite after closure or handoff
|
|
117
|
+
OP-009 | DORMANT | Park a strand with a return trigger
|
|
118
|
+
OP-010 | REACTIVATE | Return a dormant strand through a reader re-entry packet
|
|
119
|
+
OP-011 | FORK | Split a relation, institution, or strand into distinct successors
|
|
120
|
+
OP-012 | CONVERGE | Join strands through shared cause, resource, verdict, or cost
|
|
121
|
+
OP-013 | RESIDUALIZE | Name what remains after nominal resolution
|
|
122
|
+
OP-014 | RETIRE | Deliberately end a system while it still functions
|
|
123
|
+
OP-015 | TRANSFORM_SETTING | Alter a recurring place and later revisit it
|
|
124
|
+
OP-016 | SHIFT_STAKES | Change dominant pressure dimension across volumes
|
|
125
|
+
OP-017 | REVEAL | Change knowledge, not world history
|
|
126
|
+
OP-018 | MUTATE_RULE | Change a world rule through a logged causal event
|
|
127
|
+
OP-019 | REFRAME | Change interpretation while preserving facts
|
|
128
|
+
OP-020 | CLOSE | Pay, expire, transfer, repudiate, or residualize a loop
|
|
129
|
+
`);
|
|
130
|
+
|
|
131
|
+
// ── §19 Logic audit families (54-rule suite, id/name index) ─────────────────
|
|
132
|
+
export const SAGA_AUDIT_RULES: SagaRow[] = parse(`
|
|
133
|
+
AUDIT-001 | ID uniqueness | canon & identity
|
|
134
|
+
AUDIT-002 | locked-attribute consistency | canon & identity
|
|
135
|
+
AUDIT-003 | age/calendar consistency | canon & identity
|
|
136
|
+
AUDIT-004 | identity alias and disguise consistency | canon & identity
|
|
137
|
+
AUDIT-005 | death, absence, and return validity | canon & identity
|
|
138
|
+
AUDIT-006 | event preconditions | causality & intentionality
|
|
139
|
+
AUDIT-007 | event effects | causality & intentionality
|
|
140
|
+
AUDIT-008 | intentional-agent goal | causality & intentionality
|
|
141
|
+
AUDIT-009 | available alternatives | causality & intentionality
|
|
142
|
+
AUDIT-010 | why-this-action-now | causality & intentionality
|
|
143
|
+
AUDIT-011 | declared causal-cycle fixed-point | causality & intentionality
|
|
144
|
+
AUDIT-012 | character knowledge boundary | knowledge & revelation
|
|
145
|
+
AUDIT-013 | reader-safe reveal boundary | knowledge & revelation
|
|
146
|
+
AUDIT-014 | event-time vs reveal-time | knowledge & revelation
|
|
147
|
+
AUDIT-015 | rumor/belief/source lineage | knowledge & revelation
|
|
148
|
+
AUDIT-016 | dramatic-irony integrity | knowledge & revelation
|
|
149
|
+
AUDIT-017 | world-rule persistence | world & geography
|
|
150
|
+
AUDIT-018 | limitation/exception integrity | world & geography
|
|
151
|
+
AUDIT-019 | institution lifecycle | world & geography
|
|
152
|
+
AUDIT-020 | geography and travel time | world & geography
|
|
153
|
+
AUDIT-021 | jurisdiction continuity | world & geography
|
|
154
|
+
AUDIT-022 | resource-flow conservation | world & geography
|
|
155
|
+
AUDIT-023 | ecology and infrastructure aftermath | world & geography
|
|
156
|
+
AUDIT-024 | object location and custody | world & geography
|
|
157
|
+
AUDIT-025 | agency floor | character & relationship
|
|
158
|
+
AUDIT-026 | competence and capacity | character & relationship
|
|
159
|
+
AUDIT-027 | relationship delta | character & relationship
|
|
160
|
+
AUDIT-028 | relationship-memory continuity | character & relationship
|
|
161
|
+
AUDIT-029 | promotion/demotion/exit validity | character & relationship
|
|
162
|
+
AUDIT-030 | recurring sub-character function | character & relationship
|
|
163
|
+
AUDIT-031 | adversary intentionality | character & relationship
|
|
164
|
+
AUDIT-032 | strand necessity | plot & promise
|
|
165
|
+
AUDIT-033 | promise lifecycle | plot & promise
|
|
166
|
+
AUDIT-034 | clue fair-play | plot & promise
|
|
167
|
+
AUDIT-035 | loop debt | plot & promise
|
|
168
|
+
AUDIT-036 | convergence contract | plot & promise
|
|
169
|
+
AUDIT-037 | cost routing | plot & promise
|
|
170
|
+
AUDIT-038 | residual selection | plot & promise
|
|
171
|
+
AUDIT-039 | active cast budget | reader load & pacing
|
|
172
|
+
AUDIT-040 | high update-cost anchoring | reader load & pacing
|
|
173
|
+
AUDIT-041 | dormant strand re-entry | reader load & pacing
|
|
174
|
+
AUDIT-042 | pacing-vector profile | reader load & pacing
|
|
175
|
+
AUDIT-043 | stakes rotation | reader load & pacing
|
|
176
|
+
AUDIT-044 | relationship change points | reader load & pacing
|
|
177
|
+
AUDIT-045 | event-boundary overload | reader load & pacing
|
|
178
|
+
AUDIT-046 | local volume closure | volume & series
|
|
179
|
+
AUDIT-047 | irreversible series delta | volume & series
|
|
180
|
+
AUDIT-048 | middle-volume necessity | volume & series
|
|
181
|
+
AUDIT-049 | final-volume congestion | volume & series
|
|
182
|
+
AUDIT-050 | book identity differentiation | volume & series
|
|
183
|
+
AUDIT-051 | series theme lock | volume & series
|
|
184
|
+
AUDIT-052 | final mandatory-loop closure | volume & series
|
|
185
|
+
AUDIT-053 | residue and succession | volume & series
|
|
186
|
+
AUDIT-054 | stop condition | volume & series
|
|
187
|
+
`);
|
|
188
|
+
|
|
189
|
+
// ── §21 repair operators + §22 adversarial attacks (index) ──────────────────
|
|
190
|
+
export const SAGA_REPAIR_OPERATORS: string[] = [
|
|
191
|
+
"seed earlier", "add bridge scene", "change POV",
|
|
192
|
+
"reassign action to a motivated character", "merge characters",
|
|
193
|
+
"demote passenger POV", "split overloaded volume",
|
|
194
|
+
"collapse redundant institutions", "localize a world rule",
|
|
195
|
+
"convert retcon into misinformation or reveal", "pay or transfer a promise",
|
|
196
|
+
"alter dominant stakes dimension", "add re-entry packet",
|
|
197
|
+
"retire a redundant setting", "move climax earlier/later", "change ending family",
|
|
198
|
+
];
|
|
199
|
+
|
|
200
|
+
export const SAGA_ATTACKS: SagaRow[] = parse(`
|
|
201
|
+
ATTACK-001 | REMOVE-CHARACTER | Remove each recurring character; if nothing breaks, merge or delete
|
|
202
|
+
ATTACK-002 | SKIP-VOLUME | Remove a middle volume; if endgame unchanged, volume fails
|
|
203
|
+
ATTACK-003 | SWAP-VOLUMES | Swap adjacent volumes; if order still works identically, phase roles meaningless
|
|
204
|
+
ATTACK-004 | FIRST-TIME-READER | Read only reader-safe packets; detect future leakage and unexplained returns
|
|
205
|
+
ATTACK-005 | PUBLICATION-GAP | Assume two years passed; test re-entry sufficiency
|
|
206
|
+
ATTACK-006 | BINGE | Read continuously; detect repetitive recaps and formula fatigue
|
|
207
|
+
ATTACK-010 | VILLAIN-REMOVAL | Remove antagonist; if plot survives unchanged, reclassify conflict honestly
|
|
208
|
+
ATTACK-012 | PROMISE-SATURATION | Count unresolved loops at each book ending; detect series-loop inflation
|
|
209
|
+
ATTACK-015 | ENDGAME-CONGESTION | Count first-time reactivations in final 15%
|
|
210
|
+
`);
|
|
211
|
+
|
|
212
|
+
// ── §26 stop conditions (finite series) ─────────────────────────────────────
|
|
213
|
+
export const SAGA_STOP_CONDITIONS: SagaRow[] = parse(`
|
|
214
|
+
STOP-001 | dominant saga question answered/rejected/certified-incomparable | finite
|
|
215
|
+
STOP-002 | all mandatory saga promises paid/transferred/expired/repudiated/residualized | finite
|
|
216
|
+
STOP-003 | every S0–S2 character closed/handed-off/named-stable | finite
|
|
217
|
+
STOP-004 | every hard world-rule mutation has aftermath | finite
|
|
218
|
+
STOP-005 | final institutional state named | finite
|
|
219
|
+
STOP-006 | residual cost and custodianship assigned | finite
|
|
220
|
+
STOP-007 | no mandatory thread first reactivated in final volume | finite
|
|
221
|
+
STOP-008 | final ending family matches governing mechanism | finite
|
|
222
|
+
`);
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Compact SAGA-OS directive block. Appended (optionally) to the SAGE chapter
|
|
226
|
+
* prompt so single-work and long-form output inherit throughline balance,
|
|
227
|
+
* vector pacing, promise discipline, and residual-closure logic — with zero
|
|
228
|
+
* new UI. Kept short to avoid re-inflating the context-poisoning surface the
|
|
229
|
+
* compact-prompt fix already addressed.
|
|
230
|
+
*/
|
|
231
|
+
export function buildSagaDirectiveBlock(totalChapters: number): string {
|
|
232
|
+
const scale = totalChapters >= 12 ? "long-form (treat as a volume; enforce phase movement)"
|
|
233
|
+
: totalChapters >= 4 ? "novella (partial phase movement)"
|
|
234
|
+
: "single-sitting (compress phases; still close locally)";
|
|
235
|
+
return [
|
|
236
|
+
"SAGA-OS COMPOSITION DISCIPLINE (apply silently; do not name these rules in prose):",
|
|
237
|
+
`- Scale: ${scale}.`,
|
|
238
|
+
"- Run at least four pressures across the whole work: an external system, the protagonist's private wound, a challenger's alternative method, and the central relationship. Each must change state, not merely recur.",
|
|
239
|
+
"- Change the governing problem at least twice across the arc (what is wrong → what fixing it costs → why old tools fail). Do not merely escalate danger.",
|
|
240
|
+
"- Pacing is a vector, not one 'tension' number: rotate danger / uncertainty / intimacy / moral-cost / institutional-pressure / grief / relief. Do not let one axis dominate every chapter.",
|
|
241
|
+
"- Alternate pressure scenes with processing/aftermath; never run 3 high-action chapters with no reaction beat.",
|
|
242
|
+
"- Promise discipline: every setup (vow, clue, debt, planted object) must be PAID, TRANSFERRED, EXPIRED, or explicitly RESIDUALIZED. No orphan setups, no unset payoffs.",
|
|
243
|
+
"- Every apparent success routes its cost to a visible person, institution, or future (cost-routing).",
|
|
244
|
+
"- The midpoint must REPRICE the premise (a prior win becomes newly costly), not just intensify it.",
|
|
245
|
+
"- Ending: name what remains (residue / successor / maintenance duty) rather than a clean total victory unless the tone demands it.",
|
|
246
|
+
"- Settings must constrain action; if a scene could move to any room with no change, the setting is decorative — make it load-bearing.",
|
|
247
|
+
].join("\n");
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// ── Local structural audit (real computation, no LLM) ───────────────────────
|
|
251
|
+
|
|
252
|
+
export type SagaAuditFinding = {
|
|
253
|
+
ruleId: string;
|
|
254
|
+
ruleName: string;
|
|
255
|
+
severity: "pass" | "warn" | "fail";
|
|
256
|
+
detail: string;
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
export type SagaAuditReport = {
|
|
260
|
+
findings: SagaAuditFinding[];
|
|
261
|
+
passCount: number;
|
|
262
|
+
warnCount: number;
|
|
263
|
+
failCount: number;
|
|
264
|
+
};
|
|
265
|
+
|
|
266
|
+
type ChapterSlice = { title: string; text: string; targetWords: number };
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Runs the locally-checkable subset of the 54-rule audit over a finished work.
|
|
270
|
+
* These are the rules verifiable without an author-annotated knowledge graph;
|
|
271
|
+
* the remainder are surfaced as informational (skipped-with-reason) so the
|
|
272
|
+
* report is honest about what was and was not machine-checked.
|
|
273
|
+
*/
|
|
274
|
+
export function runSagaLogicAudit(chapters: ChapterSlice[], totalStakesAxes: number): SagaAuditReport {
|
|
275
|
+
const findings: SagaAuditFinding[] = [];
|
|
276
|
+
const wc = (t: string) => (t.trim().match(/\S+/g) || []).length;
|
|
277
|
+
const words = chapters.map((c) => wc(c.text));
|
|
278
|
+
const total = words.reduce((a, b) => a + b, 0);
|
|
279
|
+
|
|
280
|
+
// AUDIT-042 pacing-vector profile — chapter length variance (ebb/flow present?)
|
|
281
|
+
const mean = words.length ? total / words.length : 0;
|
|
282
|
+
const variance = words.length ? words.reduce((a, w) => a + (w - mean) ** 2, 0) / words.length : 0;
|
|
283
|
+
const cv = mean > 0 ? Math.sqrt(variance) / mean : 0;
|
|
284
|
+
findings.push({
|
|
285
|
+
ruleId: "AUDIT-042", ruleName: "pacing-vector profile",
|
|
286
|
+
severity: cv >= 0.08 ? "pass" : "warn",
|
|
287
|
+
detail: `chapter-length coefficient of variation ${(cv * 100).toFixed(1)}% (${cv >= 0.08 ? "natural ebb/flow present" : "chapters too uniform — enable prose-cadence variance"})`,
|
|
288
|
+
});
|
|
289
|
+
|
|
290
|
+
// AUDIT-046 local closure — final chapter should contain a closing signal
|
|
291
|
+
const last = chapters[chapters.length - 1]?.text ?? "";
|
|
292
|
+
const closingSignal = /\b(end|last|final|remain|remained|after|years later|schedule|inherit|hand(ed)? (it|the)|carried forward)\b/i.test(last);
|
|
293
|
+
findings.push({
|
|
294
|
+
ruleId: "AUDIT-046", ruleName: "local volume closure",
|
|
295
|
+
severity: chapters.length === 0 ? "warn" : closingSignal ? "pass" : "warn",
|
|
296
|
+
detail: closingSignal ? "closing/residual language detected in final chapter" : "no explicit closure/residual signal detected in final chapter",
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
// AUDIT-050 book identity differentiation — chapters shouldn't be near-identical openers
|
|
300
|
+
const openers = chapters.map((c) => c.text.trim().slice(0, 60).toLowerCase().replace(/\s+/g, " "));
|
|
301
|
+
const uniqueOpeners = new Set(openers).size;
|
|
302
|
+
findings.push({
|
|
303
|
+
ruleId: "AUDIT-050", ruleName: "book identity differentiation",
|
|
304
|
+
severity: chapters.length <= 1 || uniqueOpeners === openers.length ? "pass" : "warn",
|
|
305
|
+
detail: `${uniqueOpeners}/${openers.length} distinct chapter openings`,
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
// AUDIT-043 stakes rotation — informational (needs blueprint stakes axes)
|
|
309
|
+
findings.push({
|
|
310
|
+
ruleId: "AUDIT-043", ruleName: "stakes rotation",
|
|
311
|
+
severity: totalStakesAxes >= 2 ? "pass" : "warn",
|
|
312
|
+
detail: `${totalStakesAxes} stakes axis/axes engaged across the arc`,
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
// AUDIT-045 event-boundary overload — very long single chapters with no breaks
|
|
316
|
+
const denseChapters = chapters.filter((c) => wc(c.text) > 0 && (c.text.match(/\n{2,}/g) || []).length < 2 && wc(c.text) > 400).length;
|
|
317
|
+
findings.push({
|
|
318
|
+
ruleId: "AUDIT-045", ruleName: "event-boundary overload",
|
|
319
|
+
severity: denseChapters === 0 ? "pass" : "warn",
|
|
320
|
+
detail: denseChapters === 0 ? "no unbroken dense chapters" : `${denseChapters} chapter(s) exceed 400 words with <2 paragraph breaks`,
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
const passCount = findings.filter((f) => f.severity === "pass").length;
|
|
324
|
+
const warnCount = findings.filter((f) => f.severity === "warn").length;
|
|
325
|
+
const failCount = findings.filter((f) => f.severity === "fail").length;
|
|
326
|
+
return { findings, passCount, warnCount, failCount };
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
export const SAGA_OS_VERSION = "SAGA-OS v1 (fable.canon SYSTEM v12)";
|