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,348 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* InnovationPersonaGuide — full-screen guide matching the Williams Persona Guide
|
|
3
|
+
* vibe (grid of archetypes + detail panel + side-by-side comparison), driven by
|
|
4
|
+
* the real Innovation Genome v1+v2 persona tables (25 total).
|
|
5
|
+
*
|
|
6
|
+
* Also exposes a seed roller identical in spirit to StylePersonaPanel: roll a
|
|
7
|
+
* random seed → seedToGenome → classifyPersonaExtended → the resulting persona
|
|
8
|
+
* is selected in the guide and can be pinned.
|
|
9
|
+
*/
|
|
10
|
+
import { useEffect, useMemo, useState } from "react";
|
|
11
|
+
import { createPortal } from "react-dom";
|
|
12
|
+
import { seedToGenome } from "@/lib/innovation-genome-engine";
|
|
13
|
+
import {
|
|
14
|
+
EXTENDED_PERSONAS,
|
|
15
|
+
classifyPersonaExtended,
|
|
16
|
+
newInnovationSeed,
|
|
17
|
+
selectPathExtended,
|
|
18
|
+
} from "@/lib/innovation-genome-engine-v2";
|
|
19
|
+
import { PERSONAS as BASE_PERSONAS } from "@/lib/innovation-genome-engine";
|
|
20
|
+
|
|
21
|
+
interface Props {
|
|
22
|
+
open: boolean;
|
|
23
|
+
onClose: () => void;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
interface GuidePersona {
|
|
27
|
+
name: string;
|
|
28
|
+
tagline: string;
|
|
29
|
+
source: "v1" | "v2-extended";
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function buildGuideRoster(): GuidePersona[] {
|
|
33
|
+
const seen = new Set<string>();
|
|
34
|
+
const out: GuidePersona[] = [];
|
|
35
|
+
|
|
36
|
+
// Extended (v2) first — these are the distinctive "thinking" archetypes.
|
|
37
|
+
for (const p of EXTENDED_PERSONAS) {
|
|
38
|
+
if (seen.has(p.name)) continue;
|
|
39
|
+
seen.add(p.name);
|
|
40
|
+
out.push({ name: p.name, tagline: p.tagline, source: "v2-extended" });
|
|
41
|
+
}
|
|
42
|
+
// Then v1 base personas that aren't already covered.
|
|
43
|
+
for (const p of BASE_PERSONAS) {
|
|
44
|
+
if (seen.has(p.name)) continue;
|
|
45
|
+
seen.add(p.name);
|
|
46
|
+
out.push({ name: p.name, tagline: p.tagline, source: "v1" });
|
|
47
|
+
}
|
|
48
|
+
return out;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const SHARED_IDEA =
|
|
52
|
+
"A city should replace diesel buses with electric buses over five years to cut operating costs, reduce street-level pollution, and improve service reliability.";
|
|
53
|
+
|
|
54
|
+
function transformForPersona(name: string, tagline: string): string {
|
|
55
|
+
// Deterministic, persona-flavoured 50-100 word reframing of SHARED_IDEA.
|
|
56
|
+
// Not an LLM call — a structured template keyed on the persona name so the
|
|
57
|
+
// side-by-side comparison is stable and inspectable.
|
|
58
|
+
const lower = name.toLowerCase();
|
|
59
|
+
if (lower.includes("anomaly")) {
|
|
60
|
+
return `ANOMALY FOCUS: Why do 12% of winter routes experience 40% higher battery degradation than summer routes? RECOMMENDATION: Reframe five-year fleet replacement around battery thermal management on high-idle winter corridors. KEY ANOMALY: Cold-weather battery heating draws unbudgeted peak kilowatts. RISK: Unmonitored degradation cascades into route failures by Year 3.`;
|
|
61
|
+
}
|
|
62
|
+
if (lower.includes("axiom") || lower.includes("diagonal")) {
|
|
63
|
+
return `AXIOM CHALLENGE: We assume the city must BUY buses and CHARGE them at central depots. REFRAMED SOLUTION: Procure "Bus-as-a-Service" with battery swapping at route termini. Eliminates bulk upfront depot charging CAPEX, shifts battery degradation risk to vendor, and reduces 5-year transition timeline to 2.5 years.`;
|
|
64
|
+
}
|
|
65
|
+
if (lower.includes("dormancy") || lower.includes("reduction")) {
|
|
66
|
+
return `IMPORT: Battery-swap networks already operate at scale in heavy industry and mining. Apply the same modular-pack logistics to transit: standardized packs, route-end swap stations, and a circulating inventory. The "new" product is a logistics system, not a vehicle — and most of its components already exist.`;
|
|
67
|
+
}
|
|
68
|
+
if (lower.includes("reality") || lower.includes("failure")) {
|
|
69
|
+
return `WORLD CONTACT: Pilot one high-ridership winter route for 18 months before any fleet commitment. Instrument pack temperature, kWh/km, depot queue draw, and mean-time-between-failure. Only expand if measured TCO beats diesel by ≥12% with 95% service uptime. Dead ends map the live ones.`;
|
|
70
|
+
}
|
|
71
|
+
if (lower.includes("portfolio") || lower.includes("serendipity")) {
|
|
72
|
+
return `EIGHT BETS: (1) depot overnight charge, (2) on-route opportunity charge, (3) battery swap, (4) hydrogen fuel-cell, (5) hybrid diesel-electric bridge, (6) Bus-as-a-Service contract, (7) route redesign reducing fleet size, (8) microtransit substitution on low-density legs. Fund three for 24 months; kill five with pre-registered stop rules.`;
|
|
73
|
+
}
|
|
74
|
+
return `${tagline} Applied to the baseline: treat the five-year diesel-to-electric transition as a discovery problem first. Surface the hidden assumptions (depot capacity, winter range, battery replacement cost), force cheap falsification on the hardest route, and only then commit capital. Protect the heretical options until the data kills them.`;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export function InnovationPersonaGuide({ open, onClose }: Props) {
|
|
78
|
+
const roster = useMemo(buildGuideRoster, []);
|
|
79
|
+
const [selected, setSelected] = useState<string>(roster[0]?.name ?? "");
|
|
80
|
+
const [compareA, setCompareA] = useState<string>(roster[0]?.name ?? "");
|
|
81
|
+
const [compareB, setCompareB] = useState<string>(roster[1]?.name ?? roster[0]?.name ?? "");
|
|
82
|
+
const [seed, setSeed] = useState<number>(() => newInnovationSeed());
|
|
83
|
+
const [pinned, setPinned] = useState(false);
|
|
84
|
+
|
|
85
|
+
// Seed → persona binding (same mechanism as StylePersonaPanel reroll).
|
|
86
|
+
const rolled = useMemo(() => {
|
|
87
|
+
const genome = seedToGenome(seed);
|
|
88
|
+
const persona = classifyPersonaExtended(genome);
|
|
89
|
+
const path = selectPathExtended(genome);
|
|
90
|
+
return { genome, persona, path };
|
|
91
|
+
}, [seed]);
|
|
92
|
+
|
|
93
|
+
// Keep the selected card in sync with the rolled persona when seed changes.
|
|
94
|
+
useEffect(() => {
|
|
95
|
+
if (!open) return;
|
|
96
|
+
setSelected(rolled.persona.name);
|
|
97
|
+
}, [rolled.persona.name, open]);
|
|
98
|
+
|
|
99
|
+
useEffect(() => {
|
|
100
|
+
if (!open) return;
|
|
101
|
+
const onKey = (e: KeyboardEvent) => {
|
|
102
|
+
if (e.key === "Escape") onClose();
|
|
103
|
+
};
|
|
104
|
+
window.addEventListener("keydown", onKey);
|
|
105
|
+
return () => window.removeEventListener("keydown", onKey);
|
|
106
|
+
}, [open, onClose]);
|
|
107
|
+
|
|
108
|
+
if (!open) return null;
|
|
109
|
+
|
|
110
|
+
const current = roster.find((p) => p.name === selected) ?? roster[0];
|
|
111
|
+
const transform = current ? transformForPersona(current.name, current.tagline) : "";
|
|
112
|
+
const transformA = transformForPersona(
|
|
113
|
+
compareA,
|
|
114
|
+
roster.find((p) => p.name === compareA)?.tagline ?? "",
|
|
115
|
+
);
|
|
116
|
+
const transformB = transformForPersona(
|
|
117
|
+
compareB,
|
|
118
|
+
roster.find((p) => p.name === compareB)?.tagline ?? "",
|
|
119
|
+
);
|
|
120
|
+
|
|
121
|
+
const reroll = () => {
|
|
122
|
+
if (pinned) return;
|
|
123
|
+
setSeed(newInnovationSeed());
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
return createPortal(
|
|
127
|
+
<div
|
|
128
|
+
className="fixed inset-0 z-[10002] flex items-start justify-center overflow-y-auto bg-black/60 p-4"
|
|
129
|
+
onClick={onClose}
|
|
130
|
+
>
|
|
131
|
+
<div
|
|
132
|
+
className="my-4 flex w-full max-w-6xl flex-col overflow-hidden rounded-2xl bg-white shadow-2xl"
|
|
133
|
+
onClick={(e) => e.stopPropagation()}
|
|
134
|
+
>
|
|
135
|
+
{/* Header — clones Williams Persona Guide header style */}
|
|
136
|
+
<div className="flex-none border-b border-zinc-200 px-6 py-4">
|
|
137
|
+
<div className="flex items-start justify-between gap-4">
|
|
138
|
+
<div>
|
|
139
|
+
<h2 className="text-2xl font-bold text-zinc-900">
|
|
140
|
+
💡 Innovation Genome Guide — Thinking Personas
|
|
141
|
+
</h2>
|
|
142
|
+
<p className="mt-0.5 text-[12px] text-zinc-500">
|
|
143
|
+
{roster.length} Emergent Archetypes · Controls Thinking Direction & Strategic
|
|
144
|
+
Reframing · Paired with Williams Writing Style
|
|
145
|
+
</p>
|
|
146
|
+
</div>
|
|
147
|
+
<button
|
|
148
|
+
onClick={onClose}
|
|
149
|
+
className="rounded-full border border-zinc-300 px-4 py-1.5 text-sm font-semibold text-zinc-700 hover:bg-zinc-100"
|
|
150
|
+
>
|
|
151
|
+
Close
|
|
152
|
+
</button>
|
|
153
|
+
</div>
|
|
154
|
+
|
|
155
|
+
{/* Banner */}
|
|
156
|
+
<div className="mt-3 rounded-xl border border-amber-200 bg-gradient-to-r from-amber-50 to-orange-50 px-4 py-3">
|
|
157
|
+
<div className="flex flex-wrap items-center justify-between gap-2">
|
|
158
|
+
<div className="text-[12px] font-bold text-amber-900">
|
|
159
|
+
INNOVATION ENGINE V2 · 21-Axis Strategic Reframing & Problem Decomposition
|
|
160
|
+
</div>
|
|
161
|
+
<div className="rounded-full bg-amber-200 px-2 py-0.5 text-[10px] font-bold text-amber-900">
|
|
162
|
+
{roster.length} active archetypes
|
|
163
|
+
</div>
|
|
164
|
+
</div>
|
|
165
|
+
<p className="mt-1 text-[11px] leading-relaxed text-amber-800">
|
|
166
|
+
Innovation Personas dictate <b>how the model thinks, searches, and decomposes</b>{" "}
|
|
167
|
+
problems (e.g. anomaly pursuit, axiom inversion, cross-domain transfer), while
|
|
168
|
+
Williams Personas dictate <b>how the output is written</b> (prose cadence, structure,
|
|
169
|
+
and tone). Both run in parallel.
|
|
170
|
+
</p>
|
|
171
|
+
</div>
|
|
172
|
+
|
|
173
|
+
{/* Seed roller — same controls as StylePersonaPanel */}
|
|
174
|
+
<div className="mt-3 flex flex-wrap items-center gap-2 rounded-xl border border-zinc-200 bg-zinc-50 px-3 py-2">
|
|
175
|
+
<div className="text-[11px] font-bold uppercase tracking-wider text-zinc-500">
|
|
176
|
+
Seed roller
|
|
177
|
+
</div>
|
|
178
|
+
<span className="rounded bg-white px-2 py-1 font-mono text-[11px] text-zinc-700 border border-zinc-200">
|
|
179
|
+
seed {seed}
|
|
180
|
+
</span>
|
|
181
|
+
<span className="text-[11px] font-bold text-fuchsia-700">{rolled.persona.name}</span>
|
|
182
|
+
<span className="text-[10px] text-zinc-500">· {rolled.path.id} {rolled.path.name}</span>
|
|
183
|
+
<button
|
|
184
|
+
onClick={reroll}
|
|
185
|
+
disabled={pinned}
|
|
186
|
+
className="rounded-lg bg-fuchsia-600 px-3 py-1 text-[11px] font-bold text-white hover:bg-fuchsia-700 disabled:opacity-40"
|
|
187
|
+
>
|
|
188
|
+
Reroll persona
|
|
189
|
+
</button>
|
|
190
|
+
<label className="flex items-center gap-1.5 text-[11px] font-semibold text-zinc-600">
|
|
191
|
+
<input
|
|
192
|
+
type="checkbox"
|
|
193
|
+
checked={pinned}
|
|
194
|
+
onChange={(e) => setPinned(e.target.checked)}
|
|
195
|
+
/>
|
|
196
|
+
Pin seed
|
|
197
|
+
</label>
|
|
198
|
+
<label className="flex items-center gap-1.5 text-[11px] text-zinc-500">
|
|
199
|
+
Custom:
|
|
200
|
+
<input
|
|
201
|
+
type="number"
|
|
202
|
+
value={seed}
|
|
203
|
+
onChange={(e) => setSeed(Number(e.target.value) >>> 0)}
|
|
204
|
+
className="w-28 rounded border border-zinc-300 px-2 py-0.5 font-mono text-[11px]"
|
|
205
|
+
/>
|
|
206
|
+
</label>
|
|
207
|
+
<button
|
|
208
|
+
onClick={() => navigator.clipboard.writeText(String(seed))}
|
|
209
|
+
className="rounded-lg border border-zinc-200 bg-white px-2 py-1 text-[11px] font-bold text-zinc-700 hover:bg-zinc-50"
|
|
210
|
+
>
|
|
211
|
+
Export
|
|
212
|
+
</button>
|
|
213
|
+
</div>
|
|
214
|
+
</div>
|
|
215
|
+
|
|
216
|
+
{/* Body — two columns */}
|
|
217
|
+
<div className="flex min-h-0 flex-1 overflow-hidden">
|
|
218
|
+
{/* Left: archetype menu */}
|
|
219
|
+
<div className="w-[48%] flex-none overflow-y-auto border-r border-zinc-200 p-4">
|
|
220
|
+
<div className="mb-2 flex items-center justify-between">
|
|
221
|
+
<div className="text-[10px] font-bold uppercase tracking-[0.2em] text-zinc-400">
|
|
222
|
+
Innovation Archetype Menu
|
|
223
|
+
</div>
|
|
224
|
+
<div className="text-[10px] text-zinc-400">{roster.length} available</div>
|
|
225
|
+
</div>
|
|
226
|
+
<div className="grid grid-cols-2 gap-2">
|
|
227
|
+
{roster.map((p) => {
|
|
228
|
+
const active = p.name === selected;
|
|
229
|
+
return (
|
|
230
|
+
<button
|
|
231
|
+
key={p.name}
|
|
232
|
+
onClick={() => setSelected(p.name)}
|
|
233
|
+
className={`rounded-xl border p-3 text-left transition-colors ${
|
|
234
|
+
active
|
|
235
|
+
? "border-amber-400 bg-amber-50 shadow-sm"
|
|
236
|
+
: "border-zinc-200 bg-white hover:border-amber-200 hover:bg-amber-50/40"
|
|
237
|
+
}`}
|
|
238
|
+
>
|
|
239
|
+
<div className="flex items-center gap-1.5">
|
|
240
|
+
<span className="rounded bg-amber-500 px-1.5 py-0.5 text-[9px] font-bold uppercase tracking-wide text-white">
|
|
241
|
+
Thinking
|
|
242
|
+
</span>
|
|
243
|
+
{p.source === "v2-extended" && (
|
|
244
|
+
<span className="rounded bg-fuchsia-100 px-1 py-0.5 text-[8px] font-bold text-fuchsia-700">
|
|
245
|
+
v2
|
|
246
|
+
</span>
|
|
247
|
+
)}
|
|
248
|
+
</div>
|
|
249
|
+
<div className="mt-1 text-[12px] font-bold text-zinc-900">{p.name}</div>
|
|
250
|
+
<div className="mt-0.5 text-[10px] leading-snug text-zinc-500">{p.tagline}</div>
|
|
251
|
+
</button>
|
|
252
|
+
);
|
|
253
|
+
})}
|
|
254
|
+
</div>
|
|
255
|
+
</div>
|
|
256
|
+
|
|
257
|
+
{/* Right: detail + comparison */}
|
|
258
|
+
<div className="flex-1 overflow-y-auto p-5">
|
|
259
|
+
{current && (
|
|
260
|
+
<>
|
|
261
|
+
<div className="text-[10px] font-bold uppercase tracking-[0.2em] text-zinc-400">
|
|
262
|
+
Innovation Persona Guide
|
|
263
|
+
</div>
|
|
264
|
+
<h3 className="mt-1 text-2xl font-bold text-zinc-900">{current.name}</h3>
|
|
265
|
+
<p className="mt-0.5 text-[13px] italic text-zinc-600">"{current.tagline}"</p>
|
|
266
|
+
|
|
267
|
+
<div className="mt-4 rounded-xl border border-zinc-200 bg-zinc-50 p-4">
|
|
268
|
+
<div className="text-[10px] font-bold uppercase tracking-wider text-zinc-500">
|
|
269
|
+
Standard Baseline Problem
|
|
270
|
+
</div>
|
|
271
|
+
<p className="mt-1 text-[12px] leading-relaxed text-zinc-800">{SHARED_IDEA}</p>
|
|
272
|
+
</div>
|
|
273
|
+
|
|
274
|
+
<div className="mt-3 rounded-xl border border-amber-200 bg-amber-50/50 p-4">
|
|
275
|
+
<div className="flex items-center justify-between">
|
|
276
|
+
<div className="text-[10px] font-bold uppercase tracking-wider text-amber-800">
|
|
277
|
+
50–100 Word Strategic Reframing
|
|
278
|
+
</div>
|
|
279
|
+
<div className="text-[9px] text-amber-700">persona-specific decomposition</div>
|
|
280
|
+
</div>
|
|
281
|
+
<p className="mt-2 text-[12px] leading-relaxed text-zinc-800">{transform}</p>
|
|
282
|
+
</div>
|
|
283
|
+
|
|
284
|
+
{/* Side-by-side */}
|
|
285
|
+
<div className="mt-4 rounded-xl border border-indigo-200 bg-indigo-50/30 p-4">
|
|
286
|
+
<div className="text-[10px] font-bold uppercase tracking-wider text-indigo-800">
|
|
287
|
+
Side-by-Side Comparison
|
|
288
|
+
</div>
|
|
289
|
+
<div className="mt-2 flex flex-wrap items-center gap-2">
|
|
290
|
+
<label className="text-[11px] font-semibold text-zinc-600">
|
|
291
|
+
A
|
|
292
|
+
<select
|
|
293
|
+
value={compareA}
|
|
294
|
+
onChange={(e) => setCompareA(e.target.value)}
|
|
295
|
+
className="ml-1 rounded border border-zinc-300 bg-white px-2 py-1 text-[11px]"
|
|
296
|
+
>
|
|
297
|
+
{roster.map((p) => (
|
|
298
|
+
<option key={p.name} value={p.name}>
|
|
299
|
+
{p.name}
|
|
300
|
+
</option>
|
|
301
|
+
))}
|
|
302
|
+
</select>
|
|
303
|
+
</label>
|
|
304
|
+
<label className="text-[11px] font-semibold text-zinc-600">
|
|
305
|
+
B
|
|
306
|
+
<select
|
|
307
|
+
value={compareB}
|
|
308
|
+
onChange={(e) => setCompareB(e.target.value)}
|
|
309
|
+
className="ml-1 rounded border border-zinc-300 bg-white px-2 py-1 text-[11px]"
|
|
310
|
+
>
|
|
311
|
+
{roster.map((p) => (
|
|
312
|
+
<option key={p.name} value={p.name}>
|
|
313
|
+
{p.name}
|
|
314
|
+
</option>
|
|
315
|
+
))}
|
|
316
|
+
</select>
|
|
317
|
+
</label>
|
|
318
|
+
</div>
|
|
319
|
+
|
|
320
|
+
<div className="mt-3 text-[11px] text-zinc-600">
|
|
321
|
+
<b>Baseline Problem:</b> "{SHARED_IDEA}"
|
|
322
|
+
</div>
|
|
323
|
+
|
|
324
|
+
<div className="mt-3 rounded-lg border border-zinc-200 bg-white p-3">
|
|
325
|
+
<div className="text-[11px] font-bold text-amber-800">## A: {compareA}</div>
|
|
326
|
+
<div className="mt-0.5 text-[10px] italic text-zinc-500">
|
|
327
|
+
"{roster.find((p) => p.name === compareA)?.tagline}"
|
|
328
|
+
</div>
|
|
329
|
+
<p className="mt-2 text-[11px] leading-relaxed text-zinc-800">{transformA}</p>
|
|
330
|
+
</div>
|
|
331
|
+
|
|
332
|
+
<div className="mt-2 rounded-lg border border-zinc-200 bg-white p-3">
|
|
333
|
+
<div className="text-[11px] font-bold text-indigo-800">## B: {compareB}</div>
|
|
334
|
+
<div className="mt-0.5 text-[10px] italic text-zinc-500">
|
|
335
|
+
"{roster.find((p) => p.name === compareB)?.tagline}"
|
|
336
|
+
</div>
|
|
337
|
+
<p className="mt-2 text-[11px] leading-relaxed text-zinc-800">{transformB}</p>
|
|
338
|
+
</div>
|
|
339
|
+
</div>
|
|
340
|
+
</>
|
|
341
|
+
)}
|
|
342
|
+
</div>
|
|
343
|
+
</div>
|
|
344
|
+
</div>
|
|
345
|
+
</div>,
|
|
346
|
+
document.body,
|
|
347
|
+
);
|
|
348
|
+
}
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* InnovationPersonaPanel — design-identical sibling of `StylePersonaPanel`.
|
|
3
|
+
* ============================================================================
|
|
4
|
+
* Same section chrome, same expand affordance, same reroll / pin / custom-seed
|
|
5
|
+
* / export control row, same dimension-card grid with low↔high poles, filled
|
|
6
|
+
* bar, marker and numeric readout, same `<details>` prompt viewer.
|
|
7
|
+
*
|
|
8
|
+
* Where the Williams panel governs HOW THE ANSWER IS WRITTEN, this panel
|
|
9
|
+
* governs HOW THE PROBLEM IS SEARCHED AND REFRAMED. It is driven by the real
|
|
10
|
+
* Innovation Genome v2 engine — no mock data, no placeholder values.
|
|
11
|
+
*
|
|
12
|
+
* Rarity is MEASURED, not asserted: `useMemo` runs the deterministic genome
|
|
13
|
+
* compiler over a fixed lattice of seeds and counts how often each persona
|
|
14
|
+
* wins its first-match trigger. The printed percentage is therefore a real
|
|
15
|
+
* sampled frequency with a stated sample size, reproducible on any machine.
|
|
16
|
+
* ============================================================================ */
|
|
17
|
+
import { useMemo, useState } from "react";
|
|
18
|
+
import { DIMENSIONS, seedToGenome } from "@/lib/innovation-genome-engine";
|
|
19
|
+
import {
|
|
20
|
+
classifyPersonaExtended,
|
|
21
|
+
selectPathExtended,
|
|
22
|
+
compileCompactDirectiveV2,
|
|
23
|
+
newInnovationSeed,
|
|
24
|
+
inferInnovationDomain,
|
|
25
|
+
rollV2,
|
|
26
|
+
DOMAIN_PACKS,
|
|
27
|
+
type InnovationGenomeV2,
|
|
28
|
+
} from "@/lib/innovation-genome-engine-v2";
|
|
29
|
+
|
|
30
|
+
/** Sample size for the rarity estimate. Fixed so the number is reproducible. */
|
|
31
|
+
const RARITY_SAMPLES = 1200;
|
|
32
|
+
|
|
33
|
+
type Tier = "Legendary" | "Epic" | "Rare" | "Uncommon" | "Common";
|
|
34
|
+
|
|
35
|
+
function tierFor(percent: number): Tier {
|
|
36
|
+
if (percent < 2) return "Legendary";
|
|
37
|
+
if (percent < 6) return "Epic";
|
|
38
|
+
if (percent < 12) return "Rare";
|
|
39
|
+
if (percent < 25) return "Uncommon";
|
|
40
|
+
return "Common";
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function tierClass(tier: Tier): string {
|
|
44
|
+
switch (tier) {
|
|
45
|
+
case "Legendary": return "bg-amber-100 text-amber-800";
|
|
46
|
+
case "Epic": return "bg-fuchsia-100 text-fuchsia-800";
|
|
47
|
+
case "Rare": return "bg-sky-100 text-sky-800";
|
|
48
|
+
case "Uncommon": return "bg-emerald-100 text-emerald-800";
|
|
49
|
+
default: return "bg-zinc-100 text-zinc-600";
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** Deterministic frequency table over a fixed seed lattice. */
|
|
54
|
+
function computeRarityTable(): Map<string, number> {
|
|
55
|
+
const counts = new Map<string, number>();
|
|
56
|
+
for (let i = 0; i < RARITY_SAMPLES; i += 1) {
|
|
57
|
+
// Fixed lattice (not RNG) so the table is byte-identical across machines.
|
|
58
|
+
const seed = (i * 2654435761) >>> 0;
|
|
59
|
+
const name = classifyPersonaExtended(seedToGenome(seed)).name;
|
|
60
|
+
counts.set(name, (counts.get(name) ?? 0) + 1);
|
|
61
|
+
}
|
|
62
|
+
return counts;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const DOMAIN_NAMES = Object.keys(DOMAIN_PACKS);
|
|
66
|
+
|
|
67
|
+
export function InnovationPersonaPanel() {
|
|
68
|
+
const [seed, setSeed] = useState<number>(() => newInnovationSeed());
|
|
69
|
+
const [pinned, setPinned] = useState(false);
|
|
70
|
+
const [expanded, setExpanded] = useState(false);
|
|
71
|
+
const [problem, setProblem] = useState("");
|
|
72
|
+
const [domainOverride, setDomainOverride] = useState<string>("");
|
|
73
|
+
|
|
74
|
+
const rarityTable = useMemo(computeRarityTable, []);
|
|
75
|
+
|
|
76
|
+
const genomeValues = useMemo(() => seedToGenome(seed), [seed]);
|
|
77
|
+
const persona = useMemo(() => classifyPersonaExtended(genomeValues), [genomeValues]);
|
|
78
|
+
const path = useMemo(() => selectPathExtended(genomeValues), [genomeValues]);
|
|
79
|
+
|
|
80
|
+
const domain = useMemo(() => domainOverride || inferInnovationDomain(problem || "general problem"), [problem, domainOverride]);
|
|
81
|
+
|
|
82
|
+
const compiled: InnovationGenomeV2 | null = useMemo(() => {
|
|
83
|
+
try {
|
|
84
|
+
return rollV2({
|
|
85
|
+
seed,
|
|
86
|
+
userProblem: problem || "[INSERT PROBLEM HERE]",
|
|
87
|
+
domain,
|
|
88
|
+
});
|
|
89
|
+
} catch {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
}, [seed, problem, domain]);
|
|
93
|
+
|
|
94
|
+
const rarityPercent = useMemo(() => {
|
|
95
|
+
const hits = rarityTable.get(persona.name) ?? 0;
|
|
96
|
+
return Math.round((hits / RARITY_SAMPLES) * 1000) / 10;
|
|
97
|
+
}, [rarityTable, persona.name]);
|
|
98
|
+
|
|
99
|
+
const tier = tierFor(rarityPercent);
|
|
100
|
+
|
|
101
|
+
const directive = useMemo(() => {
|
|
102
|
+
if (!compiled) return "";
|
|
103
|
+
try {
|
|
104
|
+
return compileCompactDirectiveV2(compiled);
|
|
105
|
+
} catch {
|
|
106
|
+
return "";
|
|
107
|
+
}
|
|
108
|
+
}, [compiled]);
|
|
109
|
+
|
|
110
|
+
function reroll() {
|
|
111
|
+
if (pinned) return;
|
|
112
|
+
setSeed(newInnovationSeed());
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function applyManualSeed(next: number) {
|
|
116
|
+
setSeed(next >>> 0);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const pathSeq = (path as unknown as { seq?: string; sequence?: string }).seq
|
|
120
|
+
?? (path as unknown as { sequence?: string }).sequence
|
|
121
|
+
?? "";
|
|
122
|
+
|
|
123
|
+
return (
|
|
124
|
+
<section className="rounded-2xl border border-zinc-200 bg-white shadow-sm">
|
|
125
|
+
<button
|
|
126
|
+
onClick={() => setExpanded(!expanded)}
|
|
127
|
+
className="flex w-full items-center justify-between px-5 py-3 text-left"
|
|
128
|
+
>
|
|
129
|
+
<div className="flex items-center gap-3">
|
|
130
|
+
<div className="grid h-8 w-8 place-items-center rounded-lg bg-gradient-to-br from-fuchsia-100 to-amber-100 text-lg">🧬</div>
|
|
131
|
+
<div>
|
|
132
|
+
<div className="flex items-center gap-2">
|
|
133
|
+
<div className="text-sm font-bold text-zinc-900">
|
|
134
|
+
Innovation Persona: <span className="text-fuchsia-700">{persona.name}</span>
|
|
135
|
+
</div>
|
|
136
|
+
<span className={`rounded px-1.5 py-0.5 text-[10px] font-bold ${tierClass(tier)}`}>
|
|
137
|
+
{tier} ({rarityPercent}%)
|
|
138
|
+
</span>
|
|
139
|
+
</div>
|
|
140
|
+
<div className="text-xs text-zinc-500">{persona.tagline}</div>
|
|
141
|
+
</div>
|
|
142
|
+
</div>
|
|
143
|
+
<div className="flex items-center gap-2">
|
|
144
|
+
<span className="rounded bg-zinc-100 px-2 py-1 font-mono text-[10px] text-zinc-600">seed {seed}</span>
|
|
145
|
+
<span className="text-zinc-400">{expanded ? "−" : "+"}</span>
|
|
146
|
+
</div>
|
|
147
|
+
</button>
|
|
148
|
+
|
|
149
|
+
{expanded && (
|
|
150
|
+
<div className="border-t border-zinc-100 px-5 py-4">
|
|
151
|
+
<div className="mb-4 flex flex-wrap items-center gap-2">
|
|
152
|
+
<button
|
|
153
|
+
onClick={reroll}
|
|
154
|
+
disabled={pinned}
|
|
155
|
+
className="rounded-lg bg-fuchsia-600 px-3 py-1.5 text-xs font-bold text-white hover:bg-fuchsia-700 disabled:opacity-40"
|
|
156
|
+
>
|
|
157
|
+
Reroll persona
|
|
158
|
+
</button>
|
|
159
|
+
<label className="flex items-center gap-2 text-xs font-semibold text-zinc-600">
|
|
160
|
+
<input type="checkbox" checked={pinned} onChange={(e) => setPinned(e.target.checked)} />
|
|
161
|
+
Pin seed
|
|
162
|
+
</label>
|
|
163
|
+
<label className="flex items-center gap-2 text-xs text-zinc-500">
|
|
164
|
+
Custom seed:
|
|
165
|
+
<input
|
|
166
|
+
type="number"
|
|
167
|
+
value={seed}
|
|
168
|
+
onChange={(e) => applyManualSeed(Number(e.target.value) >>> 0)}
|
|
169
|
+
className="w-28 rounded border border-zinc-300 px-2 py-1 font-mono text-xs"
|
|
170
|
+
/>
|
|
171
|
+
</label>
|
|
172
|
+
<button
|
|
173
|
+
onClick={() => navigator.clipboard.writeText(String(seed))}
|
|
174
|
+
className="rounded-lg border border-zinc-200 bg-white px-3 py-1.5 text-xs font-bold text-zinc-700 hover:bg-zinc-50"
|
|
175
|
+
title="Export this genome by copying its seed"
|
|
176
|
+
>
|
|
177
|
+
Export
|
|
178
|
+
</button>
|
|
179
|
+
<label className="flex items-center gap-1 text-xs text-zinc-500">
|
|
180
|
+
Domain:
|
|
181
|
+
<select
|
|
182
|
+
value={domainOverride}
|
|
183
|
+
onChange={(e) => setDomainOverride(e.target.value)}
|
|
184
|
+
className="rounded border border-zinc-300 bg-white px-1 py-1 text-xs"
|
|
185
|
+
>
|
|
186
|
+
<option value="">auto-detect</option>
|
|
187
|
+
{DOMAIN_NAMES.map((d) => (
|
|
188
|
+
<option key={d} value={d}>{d}</option>
|
|
189
|
+
))}
|
|
190
|
+
</select>
|
|
191
|
+
</label>
|
|
192
|
+
<button
|
|
193
|
+
onClick={() => window.dispatchEvent(new CustomEvent("veritas:open-innovation-genome"))}
|
|
194
|
+
className="rounded-lg border border-fuchsia-200 bg-fuchsia-50 px-3 py-1.5 text-xs font-bold text-fuchsia-700 hover:bg-fuchsia-100"
|
|
195
|
+
title="Open the full 25-archetype Innovation Genome Guide"
|
|
196
|
+
>
|
|
197
|
+
Guide
|
|
198
|
+
</button>
|
|
199
|
+
</div>
|
|
200
|
+
|
|
201
|
+
<div className="mb-4 grid gap-2 sm:grid-cols-3">
|
|
202
|
+
<div className="rounded-xl border border-zinc-100 bg-zinc-50 p-3">
|
|
203
|
+
<div className="text-[10px] font-bold uppercase tracking-[0.2em] text-zinc-400">Discovery path</div>
|
|
204
|
+
<div className="mt-1 text-xs font-bold text-zinc-900">{path.id} · {path.name}</div>
|
|
205
|
+
<div className="mt-0.5 font-mono text-[10px] text-zinc-500">{pathSeq}</div>
|
|
206
|
+
</div>
|
|
207
|
+
<div className="rounded-xl border border-zinc-100 bg-zinc-50 p-3">
|
|
208
|
+
<div className="text-[10px] font-bold uppercase tracking-[0.2em] text-zinc-400">Domain pack</div>
|
|
209
|
+
<div className="mt-1 text-xs font-bold text-zinc-900">{compiled?.domainPack.name ?? domain}</div>
|
|
210
|
+
<div className="mt-0.5 text-[10px] text-zinc-500">
|
|
211
|
+
{compiled?.safetyGate.isHighStakes() ? "High-stakes gate ACTIVE" : "Standard risk"}
|
|
212
|
+
</div>
|
|
213
|
+
</div>
|
|
214
|
+
<div className="rounded-xl border border-zinc-100 bg-zinc-50 p-3">
|
|
215
|
+
<div className="text-[10px] font-bold uppercase tracking-[0.2em] text-zinc-400">Rarity basis</div>
|
|
216
|
+
<div className="mt-1 font-mono text-xs text-zinc-900">
|
|
217
|
+
{rarityTable.get(persona.name) ?? 0}/{RARITY_SAMPLES} seeds
|
|
218
|
+
</div>
|
|
219
|
+
<div className="mt-0.5 text-[10px] text-zinc-500">Measured on a fixed seed lattice</div>
|
|
220
|
+
</div>
|
|
221
|
+
</div>
|
|
222
|
+
|
|
223
|
+
<label className="mb-4 block text-xs text-zinc-500">
|
|
224
|
+
Problem context (steers domain pack inference):
|
|
225
|
+
<input
|
|
226
|
+
value={problem}
|
|
227
|
+
onChange={(e) => setProblem(e.target.value)}
|
|
228
|
+
placeholder="e.g. prove a bound, design a catalyst, debug a race condition"
|
|
229
|
+
className="mt-1 w-full rounded border border-zinc-300 px-2 py-1 text-xs"
|
|
230
|
+
/>
|
|
231
|
+
</label>
|
|
232
|
+
|
|
233
|
+
<div className="mb-4">
|
|
234
|
+
<div className="text-[10px] font-bold uppercase tracking-[0.2em] text-zinc-400">
|
|
235
|
+
{DIMENSIONS.length} innovation dimensions
|
|
236
|
+
</div>
|
|
237
|
+
</div>
|
|
238
|
+
|
|
239
|
+
<div className="grid gap-2 sm:grid-cols-2 lg:grid-cols-3">
|
|
240
|
+
{DIMENSIONS.map((dim) => {
|
|
241
|
+
const value = genomeValues[dim.id] ?? 0;
|
|
242
|
+
return (
|
|
243
|
+
<div key={dim.id} className="rounded-xl border border-zinc-100 bg-zinc-50 p-3">
|
|
244
|
+
<div className="flex items-center justify-between">
|
|
245
|
+
<div className="text-xs font-bold text-zinc-900">{dim.name}</div>
|
|
246
|
+
<div className="rounded bg-fuchsia-50 px-1.5 py-0.5 font-mono text-[9px] text-fuchsia-700">{dim.block}</div>
|
|
247
|
+
</div>
|
|
248
|
+
<div className="mt-2 flex items-center gap-2">
|
|
249
|
+
<span className="w-16 text-right text-[9px] leading-tight text-zinc-500">{dim.lowPole}</span>
|
|
250
|
+
<div className="relative h-2 flex-1 overflow-hidden rounded-full bg-zinc-200">
|
|
251
|
+
<div
|
|
252
|
+
className="absolute left-0 top-0 h-full rounded-full bg-gradient-to-r from-amber-500 to-fuchsia-500"
|
|
253
|
+
style={{ width: `${value * 100}%` }}
|
|
254
|
+
/>
|
|
255
|
+
<div
|
|
256
|
+
className="absolute top-[-2px] h-3 w-1 rounded-full bg-zinc-900"
|
|
257
|
+
style={{ left: `calc(${value * 100}% - 2px)` }}
|
|
258
|
+
/>
|
|
259
|
+
</div>
|
|
260
|
+
<span className="w-16 text-[9px] leading-tight text-zinc-500">{dim.highPole}</span>
|
|
261
|
+
</div>
|
|
262
|
+
<div className="mt-1 text-right font-mono text-[10px] text-zinc-400">{value.toFixed(2)}</div>
|
|
263
|
+
</div>
|
|
264
|
+
);
|
|
265
|
+
})}
|
|
266
|
+
</div>
|
|
267
|
+
|
|
268
|
+
<details className="mt-4">
|
|
269
|
+
<summary className="cursor-pointer text-xs font-bold text-zinc-600 hover:text-zinc-900">
|
|
270
|
+
View generated innovation directive
|
|
271
|
+
</summary>
|
|
272
|
+
<pre className="mt-2 max-h-64 overflow-auto whitespace-pre-wrap rounded-xl border border-zinc-200 bg-white p-4 font-mono text-xs leading-relaxed text-zinc-800">
|
|
273
|
+
{directive || "(directive unavailable)"}
|
|
274
|
+
</pre>
|
|
275
|
+
</details>
|
|
276
|
+
|
|
277
|
+
<details className="mt-2">
|
|
278
|
+
<summary className="cursor-pointer text-xs font-bold text-zinc-600 hover:text-zinc-900">
|
|
279
|
+
View full compiled v2 prompt
|
|
280
|
+
</summary>
|
|
281
|
+
<pre className="mt-2 max-h-64 overflow-auto whitespace-pre-wrap rounded-xl border border-zinc-200 bg-white p-4 font-mono text-xs leading-relaxed text-zinc-800">
|
|
282
|
+
{compiled?.prompt ?? "(prompt unavailable)"}
|
|
283
|
+
</pre>
|
|
284
|
+
</details>
|
|
285
|
+
</div>
|
|
286
|
+
)}
|
|
287
|
+
</section>
|
|
288
|
+
);
|
|
289
|
+
}
|