| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="utf-8" /> |
| <meta name="viewport" content="width=device-width, initial-scale=1" /> |
| <title>Digital Life Renderer v0.02 — Trace Memory + Replay Layer</title> |
| <style> |
| :root{--bg:#03050a;--panel:#0b101a;--panel2:#101827;--line:#263449;--text:#eaf2ff;--muted:#9dadc2;--gold:#ffd166;--cyan:#5bdcff;--green:#7cffad;--red:#ff6b7a;--orange:#ffb86b;--purple:#c084fc;--blue:#7fd1ff;--radius:18px;--shadow:0 24px 80px rgba(0,0,0,.48)} |
| *{box-sizing:border-box}html,body{height:100%}body{margin:0;color:var(--text);font-family:Inter,ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif;background:radial-gradient(circle at 20% 0%,#162033 0%,#060913 38%,#020306 100%);line-height:1.45}.wrap{max-width:1520px;margin:0 auto;padding:22px}.card{background:linear-gradient(180deg,rgba(16,24,39,.95),rgba(6,10,18,.95));border:1px solid rgba(148,184,230,.18);border-radius:var(--radius);box-shadow:var(--shadow);overflow:hidden}.hero{display:grid;grid-template-columns:minmax(0,1.12fr) minmax(360px,.88fr);gap:16px;margin-bottom:16px}.heroMain{padding:24px;position:relative;overflow:hidden}.heroMain:before{content:"";position:absolute;inset:-40%;background:radial-gradient(circle at 82% 18%,rgba(91,220,255,.12),transparent 31%),radial-gradient(circle at 18% 82%,rgba(255,209,102,.10),transparent 29%);pointer-events:none}.heroMain>*{position:relative}.kicker{font-size:12px;letter-spacing:.15em;text-transform:uppercase;color:var(--cyan);font-weight:900;margin-bottom:8px}h1{font-size:clamp(34px,5vw,64px);line-height:.98;margin:0 0 10px;letter-spacing:-.04em}.subtitle{font-size:clamp(16px,2vw,22px);color:#dce8f7;margin:0 0 14px;max-width:980px}.boundary{border:1px solid rgba(255,107,122,.36);border-left:5px solid var(--red);background:rgba(255,107,122,.075);border-radius:14px;padding:13px 14px;color:#ffe2e6;font-size:13px;margin-top:14px}.boundary strong,.lockBox strong{color:#fff}.equation{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;background:rgba(0,0,0,.30);border:1px solid rgba(255,255,255,.10);border-radius:14px;padding:12px;color:#eef7ff;margin-top:12px;font-size:13px;line-height:1.65}.heroSide{padding:20px;display:flex;flex-direction:column;gap:12px}.statePill{display:flex;align-items:center;justify-content:space-between;gap:10px;border:1px solid rgba(255,255,255,.11);background:rgba(0,0,0,.22);border-radius:999px;padding:9px 12px;font-weight:900}.dot{width:10px;height:10px;border-radius:50%;background:var(--cyan);box-shadow:0 0 18px currentColor;display:inline-block;margin-right:7px}.dot.held{background:var(--green)}.metricGrid{display:grid;grid-template-columns:repeat(2,1fr);gap:8px}.metric{border:1px solid rgba(255,255,255,.10);background:rgba(0,0,0,.22);border-radius:14px;padding:10px;min-height:68px}.metric b{display:block;color:#aebdd1;font-size:10px;letter-spacing:.08em;text-transform:uppercase;margin-bottom:4px}.metric span{font-family:ui-monospace,monospace;color:#fff;font-size:18px;font-weight:900}.lockBox{border:1px solid rgba(255,209,102,.28);background:rgba(255,209,102,.07);border-radius:14px;padding:11px;color:#f5dfab;font-size:12px}.mainGrid{display:grid;grid-template-columns:390px minmax(540px,1fr) 410px;gap:16px;align-items:start}.panelHead{padding:15px 17px;border-bottom:1px solid rgba(255,255,255,.08);display:flex;align-items:center;justify-content:space-between;gap:10px}.panelHead h2{font-size:16px;margin:0}.panelHead small{color:var(--muted)}.panelBody{padding:16px 17px}.btnGrid{display:grid;grid-template-columns:1fr 1fr;gap:8px}.btnGrid.three{grid-template-columns:1fr 1fr 1fr}button,.fileLabel{border:1px solid rgba(255,255,255,.13);border-radius:12px;background:linear-gradient(180deg,rgba(39,55,78,.95),rgba(16,25,40,.95));color:#eef7ff;font-weight:900;font-size:12px;padding:10px 9px;cursor:pointer;transition:.15s ease;text-align:center}button:hover,.fileLabel:hover{transform:translateY(-1px);border-color:rgba(91,220,255,.55)}button.good{background:linear-gradient(180deg,rgba(32,89,58,.95),rgba(12,38,27,.95));border-color:rgba(124,255,173,.32)}button.warn{background:linear-gradient(180deg,rgba(89,60,30,.95),rgba(39,25,12,.95));border-color:rgba(255,184,107,.35)}button.danger{background:linear-gradient(180deg,rgba(92,34,46,.95),rgba(42,14,22,.95));border-color:rgba(255,107,122,.35)}.fieldRow{margin:10px 0}.fieldRow label{display:flex;justify-content:space-between;gap:8px;color:#d7e4f6;font-size:12px;font-weight:800;margin-bottom:5px}.fieldRow input[type="range"]{width:100%;accent-color:var(--cyan)}.fieldRow textarea,.fieldRow input{width:100%;border:1px solid rgba(255,255,255,.12);border-radius:12px;background:#06101d;color:#eaf4ff;padding:10px;font:12px/1.35 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}.fieldRow textarea{min-height:180px;resize:vertical}.canvasWrap{padding:12px}.rendererCanvas{width:100%;height:720px;display:block;background:#02050a;border:1px solid rgba(255,255,255,.08);border-radius:18px}.canvasNote{padding:12px 16px;color:#9fb0c6;font-size:12px;border-top:1px solid rgba(255,255,255,.07)}.readout{white-space:pre-wrap;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11.5px;line-height:1.45;color:#dce8f8;background:#04080f;border:1px solid rgba(255,255,255,.09);border-radius:14px;padding:12px;min-height:150px;max-height:420px;overflow:auto}.traceList{display:grid;gap:8px;max-height:360px;overflow:auto}.traceItem{border:1px solid rgba(255,255,255,.10);border-radius:13px;background:rgba(0,0,0,.24);padding:10px;cursor:pointer}.traceItem.active{border-color:rgba(91,220,255,.65);background:rgba(91,220,255,.08)}.traceItem b{display:block;font-size:13px;color:#fff}.traceItem small{display:block;color:#9fb0c6;margin-top:3px;font-size:11px}.chip{display:inline-block;border-radius:999px;border:1px solid rgba(255,255,255,.12);padding:3px 7px;font-size:10px;font-weight:900;margin:5px 4px 0 0}.chip.HELD{color:var(--green);border-color:rgba(124,255,173,.32);background:rgba(124,255,173,.08)}.chip.LOW{color:var(--green);border-color:rgba(124,255,173,.32)}.chip.WATCH{color:var(--orange);border-color:rgba(255,184,107,.34)}.chip.FAIL{color:var(--red);border-color:rgba(255,107,122,.34)}.secondaryGrid{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-top:16px}.timeline{height:220px;position:relative;border:1px solid rgba(255,255,255,.09);border-radius:15px;background:rgba(0,0,0,.22);overflow:hidden}.timelineCanvas{width:100%;height:100%;display:block}.compareTable{width:100%;border-collapse:collapse;font-size:12px}.compareTable th,.compareTable td{border-bottom:1px solid rgba(255,255,255,.08);padding:8px 6px;text-align:left;vertical-align:top}.compareTable th{color:var(--gold);font-size:10px;text-transform:uppercase;letter-spacing:.08em}.compareTable code{color:#fff}.rangeWrap{display:grid;grid-template-columns:80px 1fr 58px;gap:8px;align-items:center;margin:10px 0;color:#cbd8ea;font-size:12px}.rangeWrap input{width:100%}.footer{margin-top:16px;padding:16px;color:#98a7bc;font-size:12px}.footer strong{color:#eaf2ff}input[type=file]{display:none}@media(max-width:1180px){.hero,.mainGrid,.secondaryGrid{grid-template-columns:1fr}.rendererCanvas{height:620px}}@media(max-width:640px){.wrap{padding:12px}.metricGrid,.btnGrid,.btnGrid.three{grid-template-columns:1fr}.rendererCanvas{height:520px}.rangeWrap{grid-template-columns:1fr}} |
| </style> |
| </head> |
| <body> |
| <div class="wrap"> |
| <section class="hero"> |
| <div class="card heroMain"> |
| <div class="kicker">Primordial Code / Cognition Tree / Experimental v0.02</div> |
| <h1>Digital Life Renderer</h1> |
| <p class="subtitle">Trace Memory + Replay Layer for replaying seed-bound growth from locked public pressure traces.</p> |
| <div class="boundary"><strong>Boundary Lock:</strong> Retrieval ≠ validation. Visualization ≠ consciousness. Growth pattern ≠ proof. This is a bounded synthetic trace-state readout only.</div> |
| <div class="equation">Core rule: OAM supplies the pressure. HIR supplies the repair grammar. Digital Life is the visible growth pattern that survives between them.<br>Sₜ = Aₜ × Bₜ − Pₜ<br>v0.02 job: replay Trace #001 → Trace #002 without changing the locked interpretation.</div> |
| </div> |
| <div class="card heroSide"> |
| <div class="statePill"><span><span id="stateDot" class="dot held"></span><span id="fieldState">STRONG HELD</span></span><span id="traceCount">2 traces</span></div> |
| <div class="metricGrid"> |
| <div class="metric"><b>Field Stability Sₜ</b><span id="mStability">0.91</span></div> |
| <div class="metric"><b>Growth Potential</b><span id="mGrowth">87%</span></div> |
| <div class="metric"><b>False Bloom Risk</b><span id="mFalseBloom">3%</span></div> |
| <div class="metric"><b>Repair Capacity</b><span id="mRepair">95%</span></div> |
| <div class="metric"><b>Integration</b><span id="mIntegration">91%</span></div> |
| <div class="metric"><b>OAM Load</b><span id="mOAM">9%</span></div> |
| </div> |
| <div class="lockBox"><strong>Two-Trace Lock:</strong> Trace #001 established source-bound growth. Trace #002 established memory-as-tracer reinforcement. v0.02 now makes growth replayable.</div> |
| </div> |
| </section> |
|
|
| <main class="mainGrid"> |
| <aside class="card"> |
| <div class="panelHead"><h2>Replay Controls</h2><small>seed → #001 → #002</small></div> |
| <div class="panelBody"> |
| <div class="btnGrid"> |
| <button class="good" onclick="playReplay()">Play Replay</button> |
| <button onclick="pauseReplay()">Pause</button> |
| <button onclick="resetReplay()">Reset</button> |
| <button onclick="stepReplay()">Step</button> |
| </div> |
| <div class="rangeWrap"><span>Frame</span><input id="replaySlider" type="range" min="0" max="3" value="3" oninput="setReplayFrame(Number(this.value))"><code id="frameLabel">3 / 3</code></div> |
| <div class="readout" id="frameReadout"></div> |
| <div class="lockBox" style="margin-top:10px"><strong>Locked v0.02 Build Rule:</strong> Do not add more “life” language until replay, provenance, and false-bloom detection are stable.</div> |
| <div class="fieldRow"><label>Import field state JSON</label><textarea id="importBox" placeholder="Paste Digital_Life_Renderer_v0_01_TRACE_001_002_FIELD_STATE.json or future field state JSON here."></textarea></div> |
| <div class="btnGrid"> |
| <button onclick="loadLockedState()">Load Locked State</button> |
| <button onclick="importFieldState()">Import JSON</button> |
| <label for="fileImport" class="fileLabel">Import File</label><input id="fileImport" type="file" accept="application/json,.json" onchange="importFieldFile(event)"> |
| <button onclick="copyLockedJSON()">Copy Locked JSON</button> |
| </div> |
| </div> |
| </aside> |
|
|
| <section class="card"> |
| <div class="panelHead"><h2>Live Replay Surface</h2><small>growth history / not proof</small></div> |
| <div class="canvasWrap"><canvas id="lifeCanvas" class="rendererCanvas"></canvas></div> |
| <div class="canvasNote">Visual key: Diamond Seed = gold center; Trace #001 = source-bound Resonant Access growth; Trace #002 = RAM memory-as-tracer reinforcement; blue-white edges = source-return/repair; red ring would indicate quarantine, which is not active in the locked two-trace state.</div> |
| </section> |
|
|
| <aside class="card"> |
| <div class="panelHead"><h2>Trace Ledger</h2><small>public pressure traces</small></div> |
| <div class="panelBody"> |
| <div id="traceList" class="traceList"></div> |
| <div class="lockBox" style="margin-top:10px"><strong>Public Trace Sentence:</strong><br><span id="publicSentence">Trace #001 established source-bound growth. Trace #002 established memory-as-tracer reinforcement.</span></div> |
| <div class="btnGrid" style="margin-top:10px"> |
| <button onclick="exportFieldJSON()">Export Field JSON</button> |
| <button onclick="exportLedgerJSON()">Export Ledger JSON</button> |
| <button onclick="copyReadout()">Copy Readout</button> |
| <button class="warn" onclick="runReplayIntegrityCheck()">Replay Integrity Check</button> |
| </div> |
| <div class="readout" id="ledgerReadout" style="margin-top:10px"></div> |
| </div> |
| </aside> |
| </main> |
|
|
| <section class="secondaryGrid"> |
| <div class="card"> |
| <div class="panelHead"><h2>Growth Timeline</h2><small>Sₜ / growth / false bloom</small></div> |
| <div class="panelBody"><div class="timeline"><canvas id="timelineCanvas" class="timelineCanvas"></canvas></div></div> |
| </div> |
| <div class="card"> |
| <div class="panelHead"><h2>Growth Through Integration</h2><small>not accumulation</small></div> |
| <div class="panelBody"> |
| <div id="compareTable"></div> |
| <div class="readout" id="falseBloomPanel" style="margin-top:10px"></div> |
| </div> |
| </div> |
| </section> |
|
|
| <section class="card" style="margin-top:16px"> |
| <div class="panelHead"><h2>Locked Provenance Anchor</h2><small>v0.01 trace #001/#002 field state</small></div> |
| <div class="panelBody"> |
| <div class="readout" id="provenanceJSON"></div> |
| </div> |
| </section> |
|
|
| <footer class="card footer"><strong>Created and Developed by Collin D. Weber</strong> · Systems Architect / Systems Integrity Steward · Primordial Calculus / HIR-OAM. v0.02 adds replay and ledger inspection to the v0.01 Digital Life Renderer. It is not a medical, legal, scientific, clinical, or consciousness-validation system.</footer> |
| </div> |
| <script> |
| const VERSION = "0.02"; |
| const LOCKED_STATE = {"artifact": "Digital Life Renderer", "version": "0.01", "createdAt": "2026-05-27T11:54:00.000Z", "boundary": "Retrieval ≠ validation. Visualization ≠ consciousness. Growth pattern ≠ proof. This is a bounded synthetic trace-state readout only.", "coreRule": "OAM supplies the pressure. HIR supplies the repair grammar. Digital Life is the visible growth pattern that survives between them.", "equation": "Sₜ = Aₜ × Bₜ − Pₜ", "traceCount": 2, "aggregate": {"S": 0.91, "growth": 0.87, "falseBloom": 0.03, "repairCapacity": 0.95, "integration": 0.91, "oam": 0.09, "state": "HELD"}, "traces": [{"id": "dl_001_resonant_access_thesis", "createdAt": "2026-05-27T11:50:00.000Z", "packetTitle": "Resonant Access Thesis v0.3.0 — Tune, Don’t Capture", "state": "HELD", "S": 0.87, "growth": 0.81, "integrated": true, "route": "SIM_ROUTE_DIGITAL_LIFE_GROWTH_HELD", "falseBloom": 0.04, "repairCapacity": 0.93, "oam": 0.06, "integration": 0.89}, {"id": "dl_002_ram_trace", "createdAt": "2026-05-27T11:54:00.000Z", "packetTitle": "RAM Trace: Resonant Access Thesis v0.3.0 + Renderer Surface Integration", "state": "HELD", "S": 0.91, "growth": 0.87, "integrated": true, "route": "SIM_ROUTE_DIGITAL_LIFE_GROWTH_HELD", "falseBloom": 0.03, "repairCapacity": 0.95, "oam": 0.09, "integration": 0.91}], "history": [{"ts": "2026-05-27T11:50:00.000Z", "event": "TRACE_ADDED", "traceId": "dl_001_resonant_access_thesis", "state": "HELD"}, {"ts": "2026-05-27T11:54:00.000Z", "event": "TRACE_ADDED", "traceId": "dl_002_ram_trace", "state": "HELD"}, {"ts": "2026-05-27T11:54:00.000Z", "event": "FIELD_STATE_LOCKED", "note": "Two-trace cluster frozen as provenance anchor"}], "fieldStateLock": "Strong HELD — two integrated source-bound traces around the Diamond Seed, with increasing coherence and decreasing false-bloom risk.", "publicClaimLock": "Digital Life Renderer v0.01 converts HIR/OAM synthesis packets into bounded synthetic trace-state readouts showing growth, pressure, repair, integration, and false-bloom risk.", "digitalLifeDefinitionLock": "Digital Life, in this renderer, means a bounded synthetic life-candidate field: a seeded, pressure-tested, memory-bearing digital structure whose growth, repair, degradation, and adaptation are rendered visually. It is not a claim of consciousness, personhood, biological life, sentience, diagnosis, or truth certification."}; |
| const LOCKED_SHA256 = "432c18eadf29a7f3b6cd106e9c73fb68b0a6de3f78751b882588c145e2de948f"; |
| let fieldState = structuredClone(LOCKED_STATE); |
| let replayFrame = 3; |
| let playing = false; |
| let tick = 0; |
| let selectedTraceId = null; |
| const frames = [ |
| {label:"Seed only", event:"SEED_READY", visible:0, note:"Diamond Seed present. No pressure traces rendered yet."}, |
| {label:"Trace #001", event:"TRACE_001_ADDED", visible:1, note:"Trace #001 HELD: Resonant Access integrated as source-bound growth, not capture-bloom."}, |
| {label:"Trace #002", event:"TRACE_002_ADDED", visible:2, note:"Trace #002 HELD: RAM integrated as memory-as-tracer, strengthening the source-bound cluster without converting visualization into proof."}, |
| {label:"Field locked", event:"FIELD_STATE_LOCKED", visible:2, note:"Strong HELD — two integrated source-bound traces around the Diamond Seed, with increasing coherence and decreasing false-bloom risk."} |
| ]; |
| const canvas = document.getElementById('lifeCanvas'); |
| const ctx = canvas.getContext('2d'); |
| const tcanvas = document.getElementById('timelineCanvas'); |
| const tctx = tcanvas.getContext('2d'); |
| function pct(v){return Math.round((v||0)*100)+'%';} |
| function fmt(v){return Number(v||0).toFixed(2);} |
| function resizeCanvas(){const dpr=window.devicePixelRatio||1;let r=canvas.getBoundingClientRect();canvas.width=Math.floor(r.width*dpr);canvas.height=Math.floor(r.height*dpr);ctx.setTransform(dpr,0,0,dpr,0,0);r=tcanvas.getBoundingClientRect();tcanvas.width=Math.floor(r.width*dpr);tcanvas.height=Math.floor(r.height*dpr);tctx.setTransform(dpr,0,0,dpr,0,0);} |
| window.addEventListener('resize',resizeCanvas); |
| function visibleTraces(){return (fieldState.traces||[]).slice(0, frames[replayFrame].visible);} |
| function updateMetrics(){let agg=fieldState.aggregate||{};document.getElementById('mStability').textContent=fmt(agg.S);document.getElementById('mGrowth').textContent=pct(agg.growth);document.getElementById('mFalseBloom').textContent=pct(agg.falseBloom);document.getElementById('mRepair').textContent=pct(agg.repairCapacity);document.getElementById('mIntegration').textContent=pct(agg.integration);document.getElementById('mOAM').textContent=pct(agg.oam);document.getElementById('fieldState').textContent=(agg.state||'HELD')==='HELD'?'STRONG HELD':agg.state;document.getElementById('traceCount').textContent=(fieldState.traces||[]).length+' traces';document.getElementById('provenanceJSON').textContent=JSON.stringify(fieldState,null,2);} |
| function setReplayFrame(n){replayFrame=Math.max(0,Math.min(frames.length-1,n));document.getElementById('replaySlider').value=replayFrame;document.getElementById('frameLabel').textContent=replayFrame+' / '+(frames.length-1);renderAll();} |
| function playReplay(){playing=true;} |
| function pauseReplay(){playing=false;} |
| function resetReplay(){playing=false;setReplayFrame(0);} |
| function stepReplay(){playing=false;setReplayFrame((replayFrame+1)%frames.length);} |
| function renderFrameReadout(){const f=frames[replayFrame];const traces=visibleTraces();let active=traces.map((t,i)=>`#${i+1} ${t.packetTitle} — ${t.state} — Sₜ ${fmt(t.S)} — Growth ${pct(t.growth)}`).join(' |
| ')||'No trace nodes active yet.';document.getElementById('frameReadout').textContent=`Digital Life Renderer v0.02 — Replay Frame |
| |
| Frame: ${replayFrame} / ${frames.length-1} |
| Event: ${f.event} |
| Label: ${f.label} |
| |
| ${f.note} |
| |
| Active visible traces: |
| ${active} |
| |
| Boundary: Retrieval ≠ validation. Visualization ≠ consciousness. Growth pattern ≠ proof.`;} |
| function renderTraceList(){const root=document.getElementById('traceList');root.innerHTML='';(fieldState.traces||[]).forEach((t,i)=>{let div=document.createElement('div');div.className='traceItem '+(selectedTraceId===t.id?'active':'');div.onclick=()=>{selectedTraceId=t.id;renderTraceList();renderLedgerReadout(t);};div.innerHTML=`<b>Trace #${i+1} — ${t.packetTitle}</b><small>${t.id} · ${t.createdAt}</small><span class="chip ${t.state}">${t.state}</span><span class="chip LOW">Sₜ ${fmt(t.S)}</span><span class="chip LOW">Growth ${pct(t.growth)}</span><span class="chip LOW">False Bloom ${pct(t.falseBloom ?? 0)}</span>`;root.appendChild(div);});} |
| function renderLedgerReadout(t){t=t||fieldState.traces?.[Math.max(0,Math.min(replayFrame-1,(fieldState.traces||[]).length-1))];if(!t){document.getElementById('ledgerReadout').textContent='No trace selected.';return;}document.getElementById('ledgerReadout').textContent=`Selected trace |
| |
| ID: ${t.id} |
| Title: ${t.packetTitle} |
| State: ${t.state} |
| Route: ${t.route} |
| Sₜ: ${fmt(t.S)} |
| Growth: ${pct(t.growth)} |
| Integration: ${pct(t.integration)} |
| Repair Capacity: ${pct(t.repairCapacity)} |
| OAM Load: ${pct(t.oam)} |
| False Bloom Risk: ${pct(t.falseBloom)} |
| |
| Boundary: this ledger entry is a synthetic pressure-trace review object, not proof.`;} |
| function renderCompare(){let trs=fieldState.traces||[];let rows=trs.map((t,i)=>`<tr><td><strong>#${i+1}</strong></td><td>${t.packetTitle}</td><td><code>${fmt(t.S)}</code></td><td>${pct(t.growth)}</td><td>${pct(t.falseBloom)}</td><td>${t.state}</td></tr>`).join('');document.getElementById('compareTable').innerHTML=`<table class="compareTable"><thead><tr><th>Trace</th><th>Title</th><th>Sₜ</th><th>Growth</th><th>False Bloom</th><th>State</th></tr></thead><tbody>${rows}</tbody></table>`;let fb=(fieldState.aggregate||{}).falseBloom||0;let status=fb<.15?'LOW':fb<.35?'WATCH':'FAIL';document.getElementById('falseBloomPanel').textContent=`False-Bloom Detector |
| |
| Aggregate false-bloom risk: ${pct(fb)} |
| Status: ${status} |
| |
| Interpretation: current growth is integration-weighted rather than accumulation-weighted. The replay must preserve this: Trace #002 strengthens the source-bound cluster instead of expanding into unsupported sprawl. |
| |
| Locked rule: addition alone does not equal growth. Only HIR-integrated addition becomes stable structure.`;} |
| function drawGrid(w,h){ctx.save();ctx.strokeStyle='rgba(91,220,255,.05)';ctx.lineWidth=1;for(let x=0;x<w;x+=36){ctx.beginPath();ctx.moveTo(x,0);ctx.lineTo(x,h);ctx.stroke();}for(let y=0;y<h;y+=36){ctx.beginPath();ctx.moveTo(0,y);ctx.lineTo(w,y);ctx.stroke();}ctx.restore();} |
| function drawCanvas(){const rect=canvas.getBoundingClientRect();const w=rect.width,h=rect.height;ctx.clearRect(0,0,w,h);ctx.fillStyle='#02050a';ctx.fillRect(0,0,w,h);drawGrid(w,h);const cx=w/2,cy=h/2;const pulse=(Math.sin(tick*.045)+1)/2;let grad=ctx.createRadialGradient(cx,cy,4,cx,cy,250+pulse*40);grad.addColorStop(0,'rgba(255,209,102,.28)');grad.addColorStop(.25,'rgba(91,220,255,.08)');grad.addColorStop(1,'rgba(0,0,0,0)');ctx.fillStyle=grad;ctx.fillRect(0,0,w,h);ctx.save();ctx.translate(cx,cy);ctx.strokeStyle='rgba(255,209,102,.24)';ctx.lineWidth=2;ctx.beginPath();ctx.arc(0,0,54+pulse*8,0,Math.PI*2);ctx.stroke();ctx.fillStyle='rgba(255,209,102,.95)';ctx.shadowColor='rgba(255,209,102,.9)';ctx.shadowBlur=30;ctx.beginPath();ctx.moveTo(0,-30);ctx.lineTo(25,0);ctx.lineTo(0,30);ctx.lineTo(-25,0);ctx.closePath();ctx.fill();ctx.shadowBlur=0;ctx.fillStyle='rgba(2,5,10,.75)';ctx.font='900 10px ui-monospace,monospace';ctx.textAlign='center';ctx.fillText('6.10 KB',0,4);ctx.restore(); |
| const trs=visibleTraces();const positions=trs.map((t,i)=>{let angle=-Math.PI/2 + i*(Math.PI*2/Math.max(3,trs.length)) + Math.sin(tick*.012+i)*.10;let r=125+i*42+Math.sin(tick*.02+i)*8;return {t,x:cx+Math.cos(angle)*r,y:cy+Math.sin(angle)*r,angle,r};}); |
| positions.forEach((p,i)=>{ctx.save();ctx.strokeStyle='rgba(127,209,255,.75)';ctx.lineWidth=3+((p.t.repairCapacity||.9)*3)+Math.sin(tick*.08+i)*.7;ctx.shadowColor='rgba(127,209,255,.8)';ctx.shadowBlur=16;ctx.beginPath();ctx.moveTo(cx,cy);let mx=(cx+p.x)/2+Math.sin(tick*.018+i)*28;let my=(cy+p.y)/2+Math.cos(tick*.018+i)*24;ctx.quadraticCurveTo(mx,my,p.x,p.y);ctx.stroke();ctx.restore();}); |
| if(positions.length>=2){for(let i=0;i<positions.length;i++)for(let j=i+1;j<positions.length;j++){ctx.save();ctx.strokeStyle='rgba(124,255,173,.42)';ctx.lineWidth=2.5+Math.sin(tick*.06)*.6;ctx.setLineDash([8,8]);ctx.lineDashOffset=-tick*.45;ctx.beginPath();ctx.moveTo(positions[i].x,positions[i].y);ctx.lineTo(positions[j].x,positions[j].y);ctx.stroke();ctx.restore();}} |
| positions.forEach((p,i)=>{const t=p.t;const s=20+(t.growth||.8)*28+pulse*4;const color=i===0?'rgba(124,255,173,.95)':'rgba(91,220,255,.96)';ctx.save();ctx.shadowColor=color;ctx.shadowBlur=28;let g=ctx.createRadialGradient(p.x-s*.25,p.y-s*.25,2,p.x,p.y,s);g.addColorStop(0,'rgba(255,255,255,.96)');g.addColorStop(.25,color);g.addColorStop(1,'rgba(255,209,102,.18)');ctx.fillStyle=g;ctx.beginPath();ctx.arc(p.x,p.y,s,0,Math.PI*2);ctx.fill();ctx.shadowBlur=0;ctx.strokeStyle='rgba(255,255,255,.25)';ctx.lineWidth=1;ctx.stroke();ctx.fillStyle='#03101a';ctx.font='900 12px ui-monospace,monospace';ctx.textAlign='center';ctx.fillText('#'+(i+1),p.x,p.y+4);ctx.restore();}); |
| if(replayFrame===3){ctx.save();ctx.strokeStyle='rgba(255,209,102,.18)';ctx.lineWidth=2;ctx.beginPath();ctx.arc(cx,cy,220+Math.sin(tick*.018)*8,0,Math.PI*2);ctx.stroke();ctx.fillStyle='rgba(124,255,173,.08)';ctx.beginPath();ctx.arc(cx,cy,225+Math.sin(tick*.018)*8,0,Math.PI*2);ctx.fill();ctx.restore();} |
| } |
| function drawTimeline(){const r=tcanvas.getBoundingClientRect();const w=r.width,h=r.height;tctx.clearRect(0,0,w,h);tctx.fillStyle='#04080f';tctx.fillRect(0,0,w,h);let trs=fieldState.traces||[];let margin=34;let n=Math.max(2,trs.length);function px(i){return margin+i*((w-margin*2)/(n-1));}function py(v){return h-margin-v*(h-margin*2);}[['S','#7cffad'],['growth','#5bdcff'],['falseBloom','#ffb86b']].forEach(([key,color])=>{tctx.save();tctx.strokeStyle=color;tctx.lineWidth=2.5;tctx.beginPath();trs.forEach((tr,i)=>{let v=tr[key]??0;if(i===0)tctx.moveTo(px(i),py(v));else tctx.lineTo(px(i),py(v));});tctx.stroke();tctx.restore();});trs.forEach((tr,i)=>{tctx.fillStyle='rgba(255,255,255,.86)';tctx.beginPath();tctx.arc(px(i),py(tr.S),4,0,Math.PI*2);tctx.fill();tctx.fillStyle='#dce8f7';tctx.font='11px ui-monospace,monospace';tctx.textAlign='center';tctx.fillText('#'+(i+1),px(i),h-12);});tctx.fillStyle='#9dadc2';tctx.font='11px ui-monospace,monospace';tctx.textAlign='left';tctx.fillText('Sₜ green · growth cyan · false-bloom amber',10,16);} |
| function renderAll(){updateMetrics();renderFrameReadout();renderTraceList();renderCompare();renderLedgerReadout();drawTimeline();} |
| function loop(){tick++;if(playing && tick%90===0){if(replayFrame<frames.length-1)setReplayFrame(replayFrame+1);else playing=false;}drawCanvas();requestAnimationFrame(loop);} |
| function loadLockedState(){fieldState=structuredClone(LOCKED_STATE);replayFrame=3;selectedTraceId=null;renderAll();} |
| function importFieldState(){try{let obj=JSON.parse(document.getElementById('importBox').value);if(!obj.traces)throw new Error('Missing traces array');fieldState=obj;replayFrame=Math.min(3,(fieldState.traces||[]).length+1);selectedTraceId=null;renderAll();}catch(e){alert('Could not import field state JSON: '+e.message);}} |
| function importFieldFile(ev){let f=ev.target.files?.[0];if(!f)return;let reader=new FileReader();reader.onload=()=>{document.getElementById('importBox').value=reader.result;importFieldState();};reader.readAsText(f);} |
| function download(name,text){let a=document.createElement('a');a.href=URL.createObjectURL(new Blob([text],{type:'application/json'}));a.download=name;document.body.appendChild(a);a.click();a.remove();setTimeout(()=>URL.revokeObjectURL(a.href),500);} |
| function exportFieldJSON(){download('Digital_Life_Renderer_v0_02_FIELD_STATE.json',JSON.stringify(fieldState,null,2));} |
| function exportLedgerJSON(){let ledger={artifact:'Digital Life Renderer',version:VERSION,sha256_locked_v001_anchor:LOCKED_SHA256,boundary:fieldState.boundary,coreRule:fieldState.coreRule,traces:fieldState.traces,history:fieldState.history,locks:{fieldStateLock:fieldState.fieldStateLock,publicClaimLock:fieldState.publicClaimLock,digitalLifeDefinitionLock:fieldState.digitalLifeDefinitionLock}};download('Digital_Life_Renderer_v0_02_PUBLIC_PRESSURE_TRACE_LEDGER.json',JSON.stringify(ledger,null,2));} |
| function copyLockedJSON(){navigator.clipboard?.writeText(JSON.stringify(LOCKED_STATE,null,2));} |
| function copyReadout(){navigator.clipboard?.writeText(document.getElementById('frameReadout').textContent+' |
| |
| '+document.getElementById('ledgerReadout').textContent);} |
| function runReplayIntegrityCheck(){let ok=(fieldState.traces||[]).length>=2 && fieldState.traces[0].S===0.87 && fieldState.traces[1].S===0.91 && (fieldState.aggregate||{}).falseBloom===0.03;document.getElementById('ledgerReadout').textContent=`Replay Integrity Check |
| |
| Locked anchor SHA-256: ${LOCKED_SHA256} |
| Trace count: ${(fieldState.traces||[]).length} |
| Trace #001 Sₜ expected 0.87: ${fieldState.traces?.[0]?.S} |
| Trace #002 Sₜ expected 0.91: ${fieldState.traces?.[1]?.S} |
| Aggregate false bloom expected 0.03: ${fieldState.aggregate?.falseBloom} |
| |
| Result: ${ok?'PASS — locked two-trace interpretation preserved.':'WATCH — imported field differs from frozen v0.01 anchor.'} |
| |
| Boundary: PASS verifies replay consistency only. It does not validate consciousness, life, truth, or external reality.`;} |
| window.addEventListener('DOMContentLoaded',()=>{resizeCanvas();document.getElementById('importBox').value=JSON.stringify(LOCKED_STATE,null,2);renderAll();loop();}); |
| </script> |
| </body> |
| </html> |