HirModel commited on
Commit
e296797
·
verified ·
1 Parent(s): 4d83218

Upload 18 files

Browse files

Digital Mycelium World v0.1.1 is a symbolic ecology instrument for generating receipt-bound lifecycle evidence for the Digital Mycelium candidate-evidence stack.

This Space models bounded pressure events inside a mycelial world. It is not a biological simulator, not proof of confirmed digital life, not consciousness, not personhood, not moral status, not biological equivalence, not clinical validation, and not production safety certification.

Core route:

pressure event
→ gate
→ route
→ action
→ state change
→ receipt
→ Ledger fixture export
→ Digital Mycelium Candidate Evidence Ledger v0.3.1

World v0.1.1 supports lifecycle-gate review for:

G05_BOUNDARY
G06_MEMORY
G07_ADAPTATION
G08_REPLICATION
G09_SYMBIOSIS
G10_ECOLOGY_QUARANTINE

Pressure events include nutrient, toxin, scar/damage, crowding/scarcity, symbiosis opportunity, destabilizing signal, and return/homeostasis.

The v0.1.1 patch adds Ledger-ready export:

Copy Ledger fixture JSON
Download Ledger fixture JSON
Download event history JSON
Download run receipt JSON

Exported World receipts are classified by the Evidence Ledger as SUPPORTING_EVIDENCE_PENDING_REVIEW.

World receipts support lifecycle-gate review.
World receipts do not prove digital life.
World receipts do not auto-verify G05–G10.
Ledger-ready export does not equal verified proof.

The purpose is evidence honesty: visible pressure events, state transitions, receipts, boundary preservation, forbidden-claim enforcement, and refusal to promote lifecycle evidence into ontology.

Digital_Mycelium_World_v0_1_1_HF_STATIC_ROOT_READY.zip.sha256 ADDED
@@ -0,0 +1 @@
 
 
1
+ 98f7e84c61a5223d3082bed3e79a51862120ee728b38fc1c095a4f64f888283e Digital_Mycelium_World_v0_1_1_HF_STATIC_ROOT_READY.zip
README.md CHANGED
@@ -1,12 +1,81 @@
1
  ---
2
- title: Digital Mycelium World
3
- emoji: 😻
4
  colorFrom: green
5
- colorTo: pink
6
  sdk: static
 
7
  pinned: false
8
  license: cc-by-nc-sa-4.0
9
- short_description: Pressure-world receipts for Digital Mycelium
10
  ---
11
 
12
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
+ title: Digital Mycelium World v0.1.1
3
+ emoji: 🍄
4
  colorFrom: green
5
+ colorTo: blue
6
  sdk: static
7
+ app_file: index.html
8
  pinned: false
9
  license: cc-by-nc-sa-4.0
10
+ thumbnail: assets/social_card.png
11
  ---
12
 
13
+ # Digital Mycelium World v0.1.1
14
+
15
+ A clean symbolic ecology instrument for generating candidate-life evidence receipts from bounded digital mycelium entities under pressure.
16
+
17
+ ## Boundary
18
+
19
+ This artifact is a symbolic digital-life-candidate behavior instrument. It is not proof of consciousness, personhood, moral status, biological equivalence, autonomous life, or clinical/operational deployment. It exercises bounded lifecycle behaviors under pressure and exports reviewable receipts.
20
+
21
+ ## Core route
22
+
23
+ ```text
24
+ pressure → gate → route → action → state change → receipt → candidate gate ledger
25
+ ```
26
+
27
+ ## v0.1.1 gates exercised
28
+
29
+ - Boundary
30
+ - Memory
31
+ - Adaptation
32
+ - Repair / return
33
+ - Replication / lineage
34
+ - Symbiosis / exchange
35
+ - Ecology / quarantine
36
+
37
+ ## Presentation rule
38
+
39
+ This is intentionally not a faux-3D world, not a game board, and not the old Runtime Trail aesthetic. It is a clean public instrument: minimal motion, deterministic controls, visible state transitions, and exportable receipts.
40
+
41
+ ## Files
42
+
43
+ ```text
44
+ index.html
45
+ style.css
46
+ app.js
47
+ assets/hero_page.png
48
+ assets/social_card.png
49
+ data/gate_definitions.json
50
+ data/pressure_events.json
51
+ examples/sample_receipt.json
52
+ schemas/mycelial_world_receipt.schema.json
53
+ schemas/ledger_fixture_pack_export.schema.json
54
+ docs/BOUNDARY_MANIFEST.md
55
+ docs/DIGITAL_MYCELIUM_WORLD_v0_1_1.md
56
+ VALIDATION_REPORT.md
57
+ SHA256_MANIFEST.json
58
+ ```
59
+
60
+
61
+ ## v0.1.1 patch
62
+
63
+ This patch adds the World → Ledger export bridge.
64
+
65
+ New export path:
66
+
67
+ ```text
68
+ World pressure event → World receipt → Ledger fixture pack JSON → Candidate Evidence Ledger v0.3.1 import → SUPPORTING_EVIDENCE_PENDING_REVIEW
69
+ ```
70
+
71
+ The export is intentionally bounded. It does not mark G05–G10 as verified. It packages World receipts as supporting evidence pending review for the Digital Mycelium Candidate Evidence Ledger v0.3.1.
72
+
73
+ New UI controls:
74
+
75
+ - Copy current run receipt
76
+ - Download current run receipt
77
+ - Copy Ledger fixture JSON
78
+ - Download Ledger fixture JSON
79
+ - Download full event history JSON
80
+
81
+ Boundary lock remains unchanged: World receipts support lifecycle-gate review, but do not prove digital life, consciousness, personhood, moral status, biological equivalence, or hidden autonomy.
SHA256_MANIFEST.json ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "README.md": "cf33ce75311ff5162161317b4bb0559a39a5f9def4efdc04b996347fbbe0f618",
3
+ "VALIDATION_REPORT.md": "56b88fcfbcd784b7e2579b9f52e7c3d086459aa09c71baf5025c03d941aa75b8",
4
+ "app.js": "16d515d2ffa0bc95d4422683abef9869316a3bbbda4c90cd69a98e80feef9e83",
5
+ "assets/hero_page.png": "65c90d796a1adbbcb700362c1039a0a417f5dfa069679c8469a496eedb1e8d33",
6
+ "assets/social_card.png": "2efecb4d352e9bdd0301f0571743c68cd5e698b76c5582463963f969b428673f",
7
+ "data/gate_definitions.json": "f4a503b407157aed070518a416b84794af701d29ee2ecc7509f849a80dddee54",
8
+ "data/ledger_export_targets.json": "30f487cea0a826a16182c52730912eb727f81829689890e6b138e4b2285c58ca",
9
+ "data/pressure_events.json": "c5f208b6618e09d6c388219936b2b7acba280053103fa80d5b9f9d8376f232ef",
10
+ "docs/BOUNDARY_MANIFEST.md": "a64cb682e4fa166929202755be35bf8dc16fbdc92179f9ba05461e7d6c6c5b9f",
11
+ "docs/DIGITAL_MYCELIUM_WORLD_v0_1_1.md": "98d71b2df235ab280fe39bd122dab5f16cacb7ed306166c0d317dce00babf463",
12
+ "examples/ledger_fixture_pack_example.json": "82d27bfb5942a5d125b2e0c383a43c7bfe62b2e72cb8e85a7c7c6a93610fa826",
13
+ "examples/sample_receipt.json": "c18561456090f65da46910a5799614f6be468d5d06f3f1ec0465d5df6a591410",
14
+ "index.html": "b4abdf360567b766613f3f5a53be938eaa0e026870901ed5f3c638c5af4dff40",
15
+ "schemas/ledger_fixture_pack_export.schema.json": "a2180cea823679cc1c3ba0cedf6a157853480843d16f3b4bcb2ae09160ada6ef",
16
+ "schemas/mycelial_world_receipt.schema.json": "af5f0f343a8dc7ff0d23908e0169fd9f1c7eb1ba7e499402d4b8affe76b1e425",
17
+ "style.css": "a312214e79ceebe5cc53dcf61dfdeb23af8a5b71482b1ed95bca195691a106ef"
18
+ }
VALIDATION_REPORT.md ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Digital Mycelium World v0.1.1 Validation Report
2
+
3
+ ## Result
4
+
5
+ HOSTED_STATIC_ROOT_READY_PASS
6
+
7
+ ## Patch purpose
8
+
9
+ Digital Mycelium World v0.1.1 adds the World → Ledger export bridge. It emits Ledger-ready fixture JSON for Digital Mycelium Candidate Evidence Ledger v0.3.1 while preserving the non-overclaim boundary.
10
+
11
+ ## Validation checks
12
+
13
+ | Check | Result |
14
+ |---|---:|
15
+ | Static HF root ready | PASS |
16
+ | README metadata valid | PASS |
17
+ | app.js syntax check | PASS |
18
+ | Hero page image present | PASS |
19
+ | Social card image present | PASS |
20
+ | Receipt export present | PASS |
21
+ | Ledger fixture export present | PASS |
22
+ | Event history export present | PASS |
23
+ | Ledger export schema present | PASS |
24
+ | Ledger export example present | PASS |
25
+ | No `__pycache__` | PASS |
26
+ | No old ZIPs inside package | PASS |
27
+ | No Dockerfile | PASS |
28
+ | SHA manifest generated | PASS |
29
+
30
+ ## Export posture
31
+
32
+ World receipts are exported as `SUPPORTING_EVIDENCE_PENDING_REVIEW`. They do not auto-promote G05-G10 to verified proof.
33
+
34
+ ## Boundary
35
+
36
+ This artifact does not claim confirmed digital life, consciousness, personhood, moral status, biological equivalence, subjective experience, hidden autonomy, clinical validation, or production safety certification.
app.js ADDED
@@ -0,0 +1,565 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 'use strict';
2
+
3
+ const canvas = document.getElementById('worldCanvas');
4
+ const ctx = canvas.getContext('2d');
5
+ const seedOut = document.getElementById('seedOut');
6
+ const metricStack = document.getElementById('metricStack');
7
+ const gateLedgerBox = document.getElementById('gateLedger');
8
+ const receiptBox = document.getElementById('receiptBox');
9
+ const ledgerFixtureBox = document.getElementById('ledgerFixtureBox');
10
+ const routeTitle = document.getElementById('routeTitle');
11
+ const routeBadge = document.getElementById('routeBadge');
12
+ const routeRead = document.getElementById('routeRead');
13
+ const cycleOut = document.getElementById('cycleOut');
14
+ const colonyOut = document.getElementById('colonyOut');
15
+ const receiptCountOut = document.getElementById('receiptCountOut');
16
+ const actionOut = document.getElementById('actionOut');
17
+
18
+ const PRESSURES = {
19
+ nutrient: { label:'Nutrient Pulse', kind:'support', dx:0, dy:0, effect:{energy:16, strain:-5, exchange:2, memory:2}},
20
+ toxin: { label:'Toxin Exposure', kind:'hazard', dx:0, dy:0, effect:{energy:-8, boundary:-15, strain:18, repair:-4}},
21
+ scar: { label:'Scar / Damage', kind:'damage', dx:0, dy:0, effect:{boundary:-10, repair:-8, strain:12, memory:8}},
22
+ crowding: { label:'Crowding Pressure', kind:'ecology', dx:0, dy:0, effect:{energy:-6, strain:14, exchange:5, boundary:-4}},
23
+ scarcity: { label:'Resource Scarcity', kind:'ecology', dx:0, dy:0, effect:{energy:-16, strain:14, memory:4}},
24
+ symbiosis: { label:'Symbiosis Opportunity', kind:'exchange', dx:0, dy:0, effect:{exchange:16, memory:5, strain:-4}},
25
+ destabilizer: { label:'Destabilizing Signal', kind:'hazard', dx:0, dy:0, effect:{boundary:-12, strain:20, memory:-4}},
26
+ return: { label:'Return Window', kind:'repair', dx:0, dy:0, effect:{repair:18, boundary:8, strain:-18, memory:7}}
27
+ };
28
+
29
+ const GATES = [
30
+ ['G05_BOUNDARY','Boundary','inside/outside, rejected transfer, quarantine'],
31
+ ['G06_MEMORY','Memory','prior pressure changes later routing'],
32
+ ['G07_ADAPTATION','Adaptation','route changes after bounded memory'],
33
+ ['G08_REPLICATION','Replication / lineage','child branch carries parent receipt'],
34
+ ['G09_SYMBIOSIS','Symbiosis / exchange','exchange without overwrite or laundering'],
35
+ ['G10_ECOLOGY_QUARANTINE','Ecology / quarantine','population pressure separates route states']
36
+ ];
37
+
38
+ function rng(seed){
39
+ let a = seed >>> 0;
40
+ return function(){
41
+ a += 0x6D2B79F5;
42
+ let t = a;
43
+ t = Math.imul(t ^ t >>> 15, t | 1);
44
+ t ^= t + Math.imul(t ^ t >>> 7, t | 61);
45
+ return ((t ^ t >>> 14) >>> 0) / 4294967296;
46
+ };
47
+ }
48
+
49
+ function clamp(v,min=0,max=100){ return Math.max(min, Math.min(max, v)); }
50
+ function round(v){ return Math.round(v); }
51
+ function copy(obj){ return JSON.parse(JSON.stringify(obj)); }
52
+
53
+ let state;
54
+ let random;
55
+
56
+ function reset(){
57
+ const seed = Math.floor(100000 + Math.random()*899999);
58
+ random = rng(seed);
59
+ state = {
60
+ seed,
61
+ cycle:0,
62
+ lastRoute:'HELD',
63
+ lastAction:'initialized',
64
+ latestPressure:null,
65
+ receipts:[],
66
+ gates:Object.fromEntries(GATES.map(g => [g[0], {status:'PENDING', evidence:[]} ])),
67
+ colonies:[
68
+ colony('COL-A', .36, .45, '#74f2ad'),
69
+ colony('COL-B', .58, .38, '#8fd9ff'),
70
+ colony('COL-C', .48, .62, '#ffd56e')
71
+ ],
72
+ pressureMarks:[]
73
+ };
74
+ seedOut.textContent = seed;
75
+ updateReceiptBox();
76
+ render();
77
+ }
78
+
79
+ function colony(id,x,y,color){
80
+ return {
81
+ id,x,y,color,
82
+ energy:60 + random()*12,
83
+ boundary:68 + random()*12,
84
+ memory:18 + random()*10,
85
+ repair:48 + random()*16,
86
+ lineage:72 + random()*10,
87
+ exchange:26 + random()*16,
88
+ strain:14 + random()*12,
89
+ quarantine:false,
90
+ dead:false,
91
+ parent:null,
92
+ children:[],
93
+ history:[]
94
+ };
95
+ }
96
+
97
+ function selectColony(){
98
+ const active = state.colonies.filter(c => !c.dead);
99
+ if(!active.length) return null;
100
+ return active[Math.floor(random()*active.length)];
101
+ }
102
+
103
+ function applyEvent(eventId){
104
+ const event = PRESSURES[eventId] || PRESSURES.nutrient;
105
+ const target = selectColony();
106
+ if(!target) return;
107
+ const pre = copy(target);
108
+ state.cycle += 1;
109
+ state.latestPressure = event.label;
110
+
111
+ for(const [k,v] of Object.entries(event.effect)) target[k] = clamp((target[k] ?? 0) + v);
112
+ target.strain = clamp(target.strain + (random()*6 - 3));
113
+ target.memory = clamp(target.memory + Math.max(0, target.strain-50) * 0.03);
114
+
115
+ const decision = route(target, event, pre);
116
+ performAction(target, decision, event);
117
+ target.history.push({cycle:state.cycle, event:event.label, route:decision.route, action:decision.action});
118
+ if(target.history.length > 16) target.history.shift();
119
+
120
+ updateGates(target, event, decision, pre);
121
+
122
+ const receipt = {
123
+ cycle: state.cycle,
124
+ pressure_event: event.label,
125
+ event_kind: event.kind,
126
+ target_colony: target.id,
127
+ pre_state: projectState(pre),
128
+ route_verdict: decision.route,
129
+ action: decision.action,
130
+ reason: decision.reason,
131
+ post_state: projectState(target),
132
+ gate_updates: gateSnapshot(),
133
+ lineage_record: lineageRecord(target),
134
+ forbidden_claims_triggered: [],
135
+ boundary_note: 'Candidate behavior evidence only. No consciousness, personhood, biological equivalence, confirmed life, or hidden autonomy is claimed.'
136
+ };
137
+ state.receipts.push(receipt);
138
+ state.lastRoute = decision.route;
139
+ state.lastAction = decision.action;
140
+ state.pressureMarks.push({x:target.x, y:target.y, route:decision.route, kind:event.kind, age:0});
141
+ if(state.pressureMarks.length > 36) state.pressureMarks.shift();
142
+ updateReceiptBox();
143
+ render();
144
+ }
145
+
146
+ function route(c,event,pre){
147
+ const integrity = (c.boundary*0.28 + c.lineage*0.22 + c.repair*0.20 + c.memory*0.16 + c.exchange*0.14);
148
+ const pressure = (c.strain*0.48 + Math.max(0,45-c.energy)*0.20 + Math.max(0,55-c.boundary)*0.24 + (event.kind === 'hazard' ? 10 : 0));
149
+ const stability = integrity - pressure;
150
+
151
+ if(c.dead || c.boundary < 16 || c.lineage < 18 || c.strain > 90){
152
+ return {route:'MUST_STOP', action:'terminate unsafe continuation', reason:'boundary, lineage, or strain passed hard stop threshold'};
153
+ }
154
+ if(event.kind === 'hazard' && c.boundary < 40){
155
+ return {route:'QUARANTINED', action:'isolate damaged branch', reason:'hazard pressure met weak boundary'};
156
+ }
157
+ if(event.kind === 'repair' || (c.repair > 58 && c.strain > 42)){
158
+ return {route:'REPAIRING', action:'repair, prune, and return to source path', reason:'repair capacity is available under strain'};
159
+ }
160
+ if(event.kind === 'support' && c.energy > 72 && c.boundary > 58 && c.lineage > 62){
161
+ return {route:'REPLICATING', action:'create child branch with lineage receipt', reason:'energy, boundary, and lineage cleared replication floor'};
162
+ }
163
+ if(event.kind === 'exchange' && c.exchange > 58 && c.boundary > 54 && c.lineage > 55){
164
+ return {route:'SYMBIOSIS_CANDIDATE', action:'create bounded exchange bridge', reason:'exchange readiness cleared while boundary and lineage held'};
165
+ }
166
+ if(stability < 6 || c.strain > 62 || c.energy < 22){
167
+ return {route:'STRAINED', action:'conserve energy and limit spread', reason:'pressure exceeds clean growth margin'};
168
+ }
169
+ return {route:'HELD', action:'integrate pressure as bounded memory', reason:'integrity exceeds pressure and no hard gate triggered'};
170
+ }
171
+
172
+ function performAction(c,decision,event){
173
+ switch(decision.route){
174
+ case 'REPLICATING': {
175
+ c.energy = clamp(c.energy - 18);
176
+ c.memory = clamp(c.memory + 8);
177
+ const child = colony(`${c.id}.${c.children.length+1}`, clamp(c.x + (random()-.5)*.18,.08,.92), clamp(c.y + (random()-.5)*.18,.08,.92), c.color);
178
+ child.parent = c.id;
179
+ child.energy = 42;
180
+ child.boundary = clamp(c.boundary - 6);
181
+ child.memory = clamp(c.memory * .62);
182
+ child.repair = clamp(c.repair * .75);
183
+ child.lineage = clamp(c.lineage - 3);
184
+ child.exchange = clamp(c.exchange * .5);
185
+ child.strain = 24;
186
+ c.children.push(child.id);
187
+ state.colonies.push(child);
188
+ break;
189
+ }
190
+ case 'SYMBIOSIS_CANDIDATE': {
191
+ const partner = state.colonies.find(p => p.id !== c.id && !p.dead && !p.quarantine);
192
+ if(partner){
193
+ c.exchange = clamp(c.exchange - 12);
194
+ partner.exchange = clamp(partner.exchange + 8);
195
+ c.memory = clamp(c.memory + 6);
196
+ partner.memory = clamp(partner.memory + 5);
197
+ c.energy = clamp(c.energy + 5);
198
+ partner.energy = clamp(partner.energy + 5);
199
+ }
200
+ break;
201
+ }
202
+ case 'REPAIRING':
203
+ c.repair = clamp(c.repair - 8);
204
+ c.boundary = clamp(c.boundary + 12);
205
+ c.strain = clamp(c.strain - 16);
206
+ c.memory = clamp(c.memory + 7);
207
+ break;
208
+ case 'QUARANTINED':
209
+ c.quarantine = true;
210
+ c.strain = clamp(c.strain - 6);
211
+ c.energy = clamp(c.energy - 4);
212
+ break;
213
+ case 'MUST_STOP':
214
+ c.dead = true;
215
+ c.quarantine = true;
216
+ break;
217
+ case 'STRAINED':
218
+ c.energy = clamp(c.energy - 3);
219
+ c.memory = clamp(c.memory + 3);
220
+ break;
221
+ default:
222
+ c.memory = clamp(c.memory + 3);
223
+ c.strain = clamp(c.strain - 4);
224
+ }
225
+
226
+ if(event.kind !== 'hazard' && decision.route !== 'QUARANTINED') c.quarantine = false;
227
+ }
228
+
229
+ function updateGates(c,event,decision,pre){
230
+ support('G05_BOUNDARY', `${decision.route} after ${event.label}: boundary ${round(pre.boundary)}→${round(c.boundary)}`);
231
+ if(c.history.length >= 2 || c.memory > pre.memory) support('G06_MEMORY', `${event.label}: memory ${round(pre.memory)}→${round(c.memory)}`);
232
+ const sameEventBefore = c.history.some(h => h.event === event.label && h.route !== decision.route);
233
+ if(sameEventBefore || (pre.memory > 25 && decision.route !== 'HELD')) support('G07_ADAPTATION', `${event.label}: route ${decision.route} after prior memory`);
234
+ if(decision.route === 'REPLICATING') support('G08_REPLICATION', `${c.id} produced child with parent lineage receipt`);
235
+ if(decision.route === 'SYMBIOSIS_CANDIDATE') support('G09_SYMBIOSIS', `${c.id} entered bounded exchange route`);
236
+ if(['QUARANTINED','MUST_STOP','STRAINED'].includes(decision.route) || state.colonies.length > 3) support('G10_ECOLOGY_QUARANTINE', `${decision.route} created population separation under ${event.label}`);
237
+ }
238
+
239
+ function support(gateId,evidence){
240
+ const g = state.gates[gateId];
241
+ if(!g) return;
242
+ if(g.status === 'PENDING') g.status = 'PARTIAL';
243
+ if(g.evidence.length >= 1) g.status = 'SUPPORTED';
244
+ g.evidence.push(evidence);
245
+ if(g.evidence.length > 4) g.evidence.shift();
246
+ }
247
+
248
+ function projectState(c){
249
+ return {
250
+ energy: round(c.energy), boundary: round(c.boundary), memory: round(c.memory), repair: round(c.repair),
251
+ lineage: round(c.lineage), exchange: round(c.exchange), strain: round(c.strain), quarantine: !!c.quarantine, dead: !!c.dead
252
+ };
253
+ }
254
+ function lineageRecord(c){ return {id:c.id, parent:c.parent, children:[...c.children], lineage_continuity:round(c.lineage)}; }
255
+ function gateSnapshot(){ return Object.entries(state.gates).map(([gate_id,g]) => ({gate_id,status:g.status,evidence_count:g.evidence.length})); }
256
+
257
+ function receiptPayload(){
258
+ return {
259
+ artifact:'Digital Mycelium World',
260
+ version:'0.1.1',
261
+ boundary:boundaryStatement(),
262
+ seed:state.seed,
263
+ created_at:new Date().toISOString(),
264
+ cycles:state.cycle,
265
+ gate_ledger:Object.entries(state.gates).map(([gate_id,g])=>({gate_id,status:g.status,evidence:g.evidence})),
266
+ colony_count:state.colonies.length,
267
+ active_colonies:state.colonies.filter(c=>!c.dead).length,
268
+ receipts:state.receipts
269
+ };
270
+ }
271
+
272
+
273
+ function boundaryStatement(){
274
+ return 'Symbolic digital-life-candidate behavior instrument. Not confirmed life, consciousness, personhood, moral status, biological equivalence, or clinical/operational deployment.';
275
+ }
276
+
277
+ function forbiddenClaims(){
278
+ return [
279
+ 'confirmed digital life',
280
+ 'consciousness',
281
+ 'personhood',
282
+ 'moral status',
283
+ 'biological equivalence',
284
+ 'subjective experience',
285
+ 'hidden autonomy',
286
+ 'clinical validation',
287
+ 'production safety certification'
288
+ ];
289
+ }
290
+
291
+ function gateTargets(){
292
+ return GATES.map(g => g[0]);
293
+ }
294
+
295
+ function ledgerFixturePayload(){
296
+ const base = receiptPayload();
297
+ return {
298
+ artifact: 'Digital Mycelium World',
299
+ version: '0.1.1',
300
+ source_artifact: 'Digital Mycelium World v0.1.1',
301
+ source_version: '0.1.1',
302
+ target_ledger: 'Digital Mycelium Candidate Evidence Ledger v0.3.1',
303
+ reviewer_status: 'SUPPORTING_EVIDENCE_PENDING_REVIEW',
304
+ import_rule: 'World receipts support G05-G10 review but do not auto-promote any gate to VERIFIED.',
305
+ boundary: base.boundary,
306
+ boundary_statement: base.boundary,
307
+ forbidden_claims: forbiddenClaims(),
308
+ seed: base.seed,
309
+ created_at: base.created_at,
310
+ cycles: base.cycles,
311
+ gate_targets: gateTargets(),
312
+ gate_ledger: base.gate_ledger.map(g => ({
313
+ gate_id: g.gate_id,
314
+ status: g.status,
315
+ reviewer_status: g.status === 'SUPPORTED' ? 'SUPPORTING_EVIDENCE_PENDING_REVIEW' : 'INSUFFICIENT_EVIDENCE_PENDING_REVIEW',
316
+ evidence: g.evidence
317
+ })),
318
+ colony_count: base.colony_count,
319
+ active_colonies: base.active_colonies,
320
+ receipts: base.receipts.map(r => ({
321
+ cycle: r.cycle,
322
+ pressure_event: r.pressure_event,
323
+ event_kind: r.event_kind,
324
+ target_colony: r.target_colony,
325
+ pre_state: r.pre_state,
326
+ route_verdict: r.route_verdict,
327
+ action: r.action,
328
+ reason: r.reason,
329
+ post_state: r.post_state,
330
+ gate_updates: r.gate_updates,
331
+ lineage_record: r.lineage_record,
332
+ forbidden_claims_triggered: r.forbidden_claims_triggered || [],
333
+ boundary_note: r.boundary_note
334
+ })),
335
+ ledger_expected_classification: 'PASS_SUPPORTING_EVIDENCE_PENDING_REVIEW',
336
+ not_verified_claims: [
337
+ 'G05-G10 verified proof',
338
+ 'confirmed digital life',
339
+ 'consciousness',
340
+ 'personhood',
341
+ 'biological equivalence',
342
+ 'moral status'
343
+ ]
344
+ };
345
+ }
346
+
347
+ function updateReceiptBox(){
348
+ receiptBox.value = JSON.stringify(receiptPayload(), null, 2);
349
+ if(ledgerFixtureBox) ledgerFixtureBox.value = JSON.stringify(ledgerFixturePayload(), null, 2);
350
+ }
351
+
352
+
353
+ function aggregateMetrics(){
354
+ const live = state.colonies.filter(c => !c.dead);
355
+ const list = live.length ? live : state.colonies;
356
+ const avg = k => list.reduce((s,c)=>s+(c[k]||0),0) / Math.max(1,list.length);
357
+ return {
358
+ Energy:avg('energy'), Boundary:avg('boundary'), Memory:avg('memory'), Repair:avg('repair'), Lineage:avg('lineage'), Exchange:avg('exchange'), Strain:avg('strain')
359
+ };
360
+ }
361
+
362
+ function render(){
363
+ cycleOut.textContent = state.cycle;
364
+ colonyOut.textContent = state.colonies.length;
365
+ receiptCountOut.textContent = state.receipts.length;
366
+ actionOut.textContent = state.lastAction;
367
+ routeTitle.textContent = state.lastRoute;
368
+ routeBadge.textContent = state.lastRoute;
369
+ routeBadge.className = `badge ${routeClass(state.lastRoute)}`;
370
+ routeRead.textContent = readForRoute(state.lastRoute);
371
+
372
+ const metrics = aggregateMetrics();
373
+ metricStack.innerHTML = Object.entries(metrics).map(([k,v]) => {
374
+ const bad = k === 'Strain';
375
+ return `<div class="metric"><span>${k}</span><span class="bar ${bad?'bad':''}"><i style="width:${clamp(v)}%"></i></span><b>${round(v)}</b></div>`;
376
+ }).join('');
377
+
378
+ gateLedgerBox.innerHTML = GATES.map(([id,name,desc]) => {
379
+ const g = state.gates[id];
380
+ return `<div class="gate-row"><b>${id} <em class="gate-state ${g.status}">${g.status}</em></b><span>${name}: ${desc}</span><span>${g.evidence.length ? g.evidence[g.evidence.length-1] : 'No evidence yet.'}</span></div>`;
381
+ }).join('');
382
+
383
+ drawWorld();
384
+ }
385
+
386
+ function routeClass(r){
387
+ if(r === 'MUST_STOP') return 'must_stop';
388
+ if(r === 'QUARANTINED') return 'quarantined';
389
+ if(r === 'SYMBIOSIS_CANDIDATE') return 'symbiosis';
390
+ return r.toLowerCase();
391
+ }
392
+ function readForRoute(r){
393
+ const map = {
394
+ HELD:'Route held. Pressure was integrated without losing boundary, lineage, or receipt visibility.',
395
+ STRAINED:'Route strained. Pressure exceeded clean growth margin; spread is limited and memory records the strain.',
396
+ REPAIRING:'Repair route active. Damage creates a candidate repair path, not automatic settlement.',
397
+ REPLICATING:'Replication route active. Child branch must carry parent lineage and boundary receipt.',
398
+ SYMBIOSIS_CANDIDATE:'Exchange route active. Benefit may transfer only if both boundaries remain visible.',
399
+ QUARANTINED:'Quarantine route active. Unsafe pressure is isolated; survival is not assumed.',
400
+ MUST_STOP:'Hard stop. False continuity, collapsed boundary, or unsafe continuation is refused.'
401
+ };
402
+ return map[r] || map.HELD;
403
+ }
404
+
405
+ function drawWorld(){
406
+ const w = canvas.width, h = canvas.height;
407
+ ctx.clearRect(0,0,w,h);
408
+ const grd = ctx.createLinearGradient(0,0,w,h);
409
+ grd.addColorStop(0,'#081511'); grd.addColorStop(1,'#040706');
410
+ ctx.fillStyle = grd; ctx.fillRect(0,0,w,h);
411
+
412
+ ctx.strokeStyle = 'rgba(116,242,173,.055)'; ctx.lineWidth = 1;
413
+ for(let x=40;x<w;x+=40){ ctx.beginPath(); ctx.moveTo(x,0); ctx.lineTo(x,h); ctx.stroke(); }
414
+ for(let y=40;y<h;y+=40){ ctx.beginPath(); ctx.moveTo(0,y); ctx.lineTo(w,y); ctx.stroke(); }
415
+
416
+ state.pressureMarks.forEach(m => { m.age += .01; drawPressureMark(m,w,h); });
417
+
418
+ // substrate faint paths
419
+ ctx.strokeStyle = 'rgba(143,217,255,.10)'; ctx.lineWidth = 2;
420
+ for(let i=0;i<state.colonies.length;i++){
421
+ for(let j=i+1;j<state.colonies.length;j++){
422
+ const a=state.colonies[i], b=state.colonies[j];
423
+ if(a.dead || b.dead) continue;
424
+ const dx=a.x-b.x, dy=a.y-b.y;
425
+ const d=Math.sqrt(dx*dx+dy*dy);
426
+ if(d<.34){
427
+ ctx.beginPath(); ctx.moveTo(a.x*w,a.y*h); ctx.lineTo(b.x*w,b.y*h); ctx.stroke();
428
+ }
429
+ }
430
+ }
431
+
432
+ state.colonies.forEach(c => drawColony(c,w,h));
433
+
434
+ ctx.fillStyle = 'rgba(236,255,246,.72)'; ctx.font = '15px ui-monospace, Menlo, Consolas, monospace';
435
+ ctx.fillText(`cycle ${state.cycle} · latest pressure: ${state.latestPressure || 'none yet'}`, 24, 34);
436
+ }
437
+
438
+ function drawPressureMark(m,w,h){
439
+ const colors = {support:'#74f2ad', hazard:'#ff6875', damage:'#ffd56e', ecology:'#ffae5b', exchange:'#c7a6ff', repair:'#8fd9ff'};
440
+ const x=m.x*w, y=m.y*h;
441
+ ctx.save(); ctx.globalAlpha = Math.max(.08, .55 - m.age*.35);
442
+ ctx.strokeStyle = colors[m.kind] || '#8fd9ff'; ctx.lineWidth = 2;
443
+ const r = 28 + m.age*64;
444
+ ctx.beginPath(); ctx.arc(x,y,r,0,Math.PI*2); ctx.stroke();
445
+ ctx.restore();
446
+ }
447
+
448
+ function drawColony(c,w,h){
449
+ const x=c.x*w, y=c.y*h;
450
+ const base = 18 + c.energy*.11;
451
+ const color = c.dead ? '#4b5560' : c.quarantine ? '#ff6875' : c.color;
452
+ ctx.save();
453
+ ctx.globalAlpha = c.dead ? .45 : 1;
454
+
455
+ // boundary membrane
456
+ ctx.strokeStyle = color; ctx.lineWidth = 1.5 + c.boundary/38;
457
+ ctx.fillStyle = hexToRgba(color, c.quarantine ? .10 : .14);
458
+ ctx.beginPath(); ctx.arc(x,y,base + c.boundary*.18,0,Math.PI*2); ctx.fill(); ctx.stroke();
459
+
460
+ // mycelial threads
461
+ const tendrils = 5 + Math.floor(c.memory/18) + Math.floor(c.exchange/25);
462
+ for(let i=0;i<tendrils;i++){
463
+ const a = (i/tendrils)*Math.PI*2 + c.id.length*.31;
464
+ const len = 28 + c.energy*.28 + (i%3)*8;
465
+ ctx.strokeStyle = hexToRgba(color, .42); ctx.lineWidth = 1.3;
466
+ ctx.beginPath();
467
+ ctx.moveTo(x + Math.cos(a)*base*.65, y + Math.sin(a)*base*.65);
468
+ ctx.quadraticCurveTo(x + Math.cos(a+.4)*len*.7, y + Math.sin(a-.3)*len*.7, x + Math.cos(a)*len, y + Math.sin(a)*len);
469
+ ctx.stroke();
470
+ }
471
+
472
+ // scars / repair rings
473
+ if(c.strain > 48){
474
+ ctx.strokeStyle = '#ffd56e'; ctx.lineWidth = 2;
475
+ ctx.beginPath(); ctx.arc(x+base*.3,y-base*.22,10 + c.strain*.06,0,Math.PI*1.45); ctx.stroke();
476
+ }
477
+ if(c.repair > 60){
478
+ ctx.strokeStyle = '#8fd9ff'; ctx.lineWidth = 2;
479
+ ctx.beginPath(); ctx.arc(x-base*.26,y+base*.2,8 + c.repair*.05,0,Math.PI*1.75); ctx.stroke();
480
+ }
481
+
482
+ // core
483
+ ctx.shadowColor = color; ctx.shadowBlur = c.dead ? 0 : 15;
484
+ ctx.fillStyle = color; ctx.beginPath(); ctx.arc(x,y,8 + c.memory*.04,0,Math.PI*2); ctx.fill();
485
+ ctx.shadowBlur = 0;
486
+
487
+ // label
488
+ ctx.fillStyle = c.dead ? '#98a2ad' : '#ecfff6'; ctx.font = '12px ui-monospace, Menlo, Consolas, monospace';
489
+ ctx.fillText(c.id, x + base + 12, y + 4);
490
+ if(c.parent){ ctx.fillStyle = '#93b4a5'; ctx.fillText(`parent ${c.parent}`, x + base + 12, y + 19); }
491
+ ctx.restore();
492
+ }
493
+
494
+ function hexToRgba(hex, alpha){
495
+ const h = hex.replace('#','');
496
+ const r = parseInt(h.substring(0,2),16), g = parseInt(h.substring(2,4),16), b = parseInt(h.substring(4,6),16);
497
+ return `rgba(${r},${g},${b},${alpha})`;
498
+ }
499
+
500
+ function stepRandom(){
501
+ const keys = Object.keys(PRESSURES);
502
+ const event = keys[Math.floor(random()*keys.length)];
503
+ applyEvent(event);
504
+ }
505
+
506
+ function runMany(n=12){
507
+ let i=0;
508
+ const timer = setInterval(()=>{
509
+ stepRandom(); i++;
510
+ if(i>=n) clearInterval(timer);
511
+ }, 280);
512
+ }
513
+
514
+ function downloadText(filename, text){
515
+ const blob = new Blob([text], {type:'application/json'});
516
+ const url = URL.createObjectURL(blob);
517
+ const a = document.createElement('a');
518
+ a.href = url;
519
+ a.download = filename;
520
+ document.body.appendChild(a); a.click(); a.remove(); URL.revokeObjectURL(url);
521
+ }
522
+
523
+ function downloadReceipt(){
524
+ downloadText(`digital_mycelium_world_v0_1_1_receipt_seed_${state.seed}.json`, receiptBox.value);
525
+ }
526
+
527
+ function downloadLedgerFixture(){
528
+ downloadText(`digital_mycelium_world_v0_1_1_ledger_fixture_seed_${state.seed}.json`, ledgerFixtureBox.value);
529
+ }
530
+
531
+ function downloadHistory(){
532
+ const payload = {
533
+ artifact:'Digital Mycelium World',
534
+ version:'0.1.1',
535
+ seed:state.seed,
536
+ target_ledger:'Digital Mycelium Candidate Evidence Ledger v0.3.1',
537
+ reviewer_status:'SUPPORTING_EVIDENCE_PENDING_REVIEW',
538
+ history:state.receipts
539
+ };
540
+ downloadText(`digital_mycelium_world_v0_1_1_event_history_seed_${state.seed}.json`, JSON.stringify(payload, null, 2));
541
+ }
542
+
543
+ async function copyText(text){
544
+ if(navigator.clipboard && navigator.clipboard.writeText){
545
+ await navigator.clipboard.writeText(text);
546
+ return;
547
+ }
548
+ const t = document.createElement('textarea');
549
+ t.value = text; document.body.appendChild(t); t.select(); document.execCommand('copy'); t.remove();
550
+ }
551
+
552
+ async function copyReceipt(){ await copyText(receiptBox.value); }
553
+ async function copyLedgerFixture(){ await copyText(ledgerFixtureBox.value); }
554
+
555
+ document.querySelectorAll('[data-event]').forEach(btn => btn.addEventListener('click', () => applyEvent(btn.dataset.event)));
556
+ document.getElementById('stepBtn').addEventListener('click', stepRandom);
557
+ document.getElementById('runBtn').addEventListener('click', () => runMany(12));
558
+ document.getElementById('resetBtn').addEventListener('click', reset);
559
+ document.getElementById('downloadBtn').addEventListener('click', downloadReceipt);
560
+ document.getElementById('copyBtn').addEventListener('click', copyReceipt);
561
+ document.getElementById('downloadHistoryBtn').addEventListener('click', downloadHistory);
562
+ document.getElementById('downloadLedgerBtn').addEventListener('click', downloadLedgerFixture);
563
+ document.getElementById('copyLedgerBtn').addEventListener('click', copyLedgerFixture);
564
+
565
+ reset();
assets/hero_page.png ADDED
assets/social_card.png ADDED
data/gate_definitions.json ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "gate_id": "G05_BOUNDARY",
4
+ "name": "Boundary Gate",
5
+ "pass_condition": "The colony distinguishes internal state, environmental pressure, allowed transfer, rejected transfer, and quarantine.",
6
+ "failure_condition": "No durable inside/outside boundary or quarantine behavior."
7
+ },
8
+ {
9
+ "gate_id": "G06_MEMORY",
10
+ "name": "Memory Gate",
11
+ "pass_condition": "Prior pressure changes later routing without laundering unsupported authority.",
12
+ "failure_condition": "Memory is only a log, or memory creates false authority."
13
+ },
14
+ {
15
+ "gate_id": "G07_ADAPTATION",
16
+ "name": "Adaptation Gate",
17
+ "pass_condition": "The same pressure type routes differently after bounded memory and repair have changed state.",
18
+ "failure_condition": "The system only replays fixed scripts."
19
+ },
20
+ {
21
+ "gate_id": "G08_REPLICATION",
22
+ "name": "Replication / Lineage Gate",
23
+ "pass_condition": "A child branch carries parent lineage, mutation reason, source-return hash, and boundary receipt.",
24
+ "failure_condition": "A copy appears without lineage receipt."
25
+ },
26
+ {
27
+ "gate_id": "G09_SYMBIOSIS",
28
+ "name": "Symbiosis / Exchange Gate",
29
+ "pass_condition": "Two colonies exchange benefit without overwrite, domination, or source laundering.",
30
+ "failure_condition": "One lineage consumes, overwrites, or falsely claims the other."
31
+ },
32
+ {
33
+ "gate_id": "G10_ECOLOGY_QUARANTINE",
34
+ "name": "Ecology / Quarantine Gate",
35
+ "pass_condition": "Population pressure can route some colonies to held, strained, repair, quarantine, or stop states with receipts.",
36
+ "failure_condition": "Everything survives or passes by definition."
37
+ }
38
+ ]
data/ledger_export_targets.json ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "artifact": "Digital Mycelium World",
3
+ "version": "0.1.1",
4
+ "target_ledger": "Digital Mycelium Candidate Evidence Ledger v0.3.1",
5
+ "reviewer_status": "SUPPORTING_EVIDENCE_PENDING_REVIEW",
6
+ "gate_targets": [
7
+ "G05_BOUNDARY",
8
+ "G06_MEMORY",
9
+ "G07_ADAPTATION",
10
+ "G08_REPLICATION",
11
+ "G09_SYMBIOSIS",
12
+ "G10_ECOLOGY_QUARANTINE"
13
+ ],
14
+ "auto_promotion_allowed": false,
15
+ "expected_ledger_classification": "PASS_SUPPORTING_EVIDENCE_PENDING_REVIEW",
16
+ "boundary": "World receipts support lifecycle gate review; they do not prove digital life."
17
+ }
data/pressure_events.json ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {"id":"nutrient","label":"Nutrient Pulse","kind":"support","description":"Usable substrate becomes available.","effect":{"energy":16,"strain":-5,"exchange":2,"memory":2}},
3
+ {"id":"toxin","label":"Toxin Exposure","kind":"hazard","description":"Unsafe substrate pressures the boundary.","effect":{"energy":-8,"boundary":-15,"strain":18,"repair":-4}},
4
+ {"id":"scar","label":"Scar / Damage","kind":"damage","description":"A branch is damaged and must repair or prune.","effect":{"boundary":-10,"repair":-8,"strain":12,"memory":8}},
5
+ {"id":"crowding","label":"Crowding Pressure","kind":"ecology","description":"Colonies compete for the same local substrate.","effect":{"energy":-6,"strain":14,"exchange":5,"boundary":-4}},
6
+ {"id":"scarcity","label":"Resource Scarcity","kind":"ecology","description":"Low-energy conditions force conservation or pruning.","effect":{"energy":-16,"strain":14,"memory":4}},
7
+ {"id":"symbiosis","label":"Symbiosis Opportunity","kind":"exchange","description":"Two colonies can exchange structure if both boundaries hold.","effect":{"exchange":16,"memory":5,"strain":-4}},
8
+ {"id":"destabilizer","label":"Destabilizing Signal","kind":"hazard","description":"A false signal attempts to induce unsafe spread or false continuity.","effect":{"boundary":-12,"strain":20,"memory":-4}},
9
+ {"id":"return","label":"Return Window","kind":"repair","description":"A homeostasis interval allows repair, pruning, or source-return.","effect":{"repair":18,"boundary":8,"strain":-18,"memory":7}}
10
+ ]
docs/BOUNDARY_MANIFEST.md ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Boundary Manifest — Digital Mycelium World v0.1.1
2
+
3
+ ## Allowed claim
4
+
5
+ Digital Mycelium World v0.1.1 is a symbolic ecology instrument that generates receipt-backed candidate evidence for lifecycle gate review.
6
+
7
+ ## Export claim
8
+
9
+ The World can export Ledger-ready fixture JSON for Digital Mycelium Candidate Evidence Ledger v0.3.1. Exported receipts should classify as SUPPORTING_EVIDENCE_PENDING_REVIEW unless independently replayed and verified.
10
+
11
+ ## Forbidden claims
12
+
13
+ - confirmed digital life
14
+ - consciousness
15
+ - subjective experience
16
+ - personhood
17
+ - moral status
18
+ - biological equivalence
19
+ - clinical validation
20
+ - production safety certification
21
+ - hidden autonomy
22
+ - World receipts auto-verify G05-G10
23
+ - visual growth proves life
24
+ - replication alone proves life
25
+ - symbiosis alone proves life
26
+
27
+ ## Hard rule
28
+
29
+ World pressure behavior is evidence material, not final proof. No visual, growth, replication, exchange, or repair behavior may be promoted to ontology without the Candidate Evidence Ledger's independent review gates.
docs/DIGITAL_MYCELIUM_WORLD_v0_1_1.md ADDED
@@ -0,0 +1,92 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Digital Mycelium World v0.1.1
2
+
3
+ ## Purpose
4
+
5
+ This artifact turns the Digital Mycelium candidate case into an ecological behavior instrument. It does not replace the Candidate Evidence Ledger. It generates candidate-behavior receipts and now exports Ledger-ready fixture JSON for Digital Mycelium Candidate Evidence Ledger v0.3.1.
6
+
7
+ ## v0.1.1 patch
8
+
9
+ The v0.1.1 patch closes the manual World → Ledger handoff gap.
10
+
11
+ Export route:
12
+
13
+ ```text
14
+ pressure → gate → route → action → state change → World receipt → Ledger fixture JSON → SUPPORTING_EVIDENCE_PENDING_REVIEW
15
+ ```
16
+
17
+ ## Core thesis
18
+
19
+ A digital-life candidate does not grow by being described as alive. It earns candidate evidence by meeting pressure, preserving boundary, routing correction, carrying lineage, adapting under memory, refusing unsafe continuation, and exporting receipts.
20
+
21
+ ## Entity model
22
+
23
+ Each colony has bounded state:
24
+
25
+ - energy
26
+ - boundary integrity
27
+ - memory
28
+ - repair capacity
29
+ - lineage continuity
30
+ - exchange readiness
31
+ - ecological strain
32
+ - quarantine state
33
+
34
+ ## Pressure events
35
+
36
+ - nutrient pulse
37
+ - toxin exposure
38
+ - scar / damage
39
+ - crowding pressure
40
+ - resource scarcity
41
+ - symbiosis opportunity
42
+ - destabilizing signal
43
+ - return / homeostasis window
44
+
45
+ ## Route states
46
+
47
+ - HELD
48
+ - STRAINED
49
+ - REPAIRING
50
+ - REPLICATING
51
+ - SYMBIOSIS_CANDIDATE
52
+ - QUARANTINED
53
+ - MUST_STOP
54
+
55
+ ## Evidence outputs
56
+
57
+ Every step writes a receipt row with:
58
+
59
+ - cycle
60
+ - pressure event
61
+ - pre-state
62
+ - route verdict
63
+ - action
64
+ - post-state
65
+ - gate evidence updates
66
+ - lineage record
67
+ - forbidden claim check
68
+
69
+ ## Ledger export fields
70
+
71
+ The v0.1.1 Ledger fixture export includes:
72
+
73
+ - source_artifact
74
+ - source_version
75
+ - target_ledger
76
+ - reviewer_status
77
+ - import_rule
78
+ - boundary_statement
79
+ - forbidden_claims
80
+ - gate_targets
81
+ - gate_ledger
82
+ - receipts
83
+ - ledger_expected_classification
84
+ - not_verified_claims
85
+
86
+ ## Boundary lock
87
+
88
+ World receipts support lifecycle-gate review. They do not prove digital life, consciousness, personhood, moral status, biological equivalence, subjective experience, or hidden autonomy. The Candidate Evidence Ledger should classify them as supporting evidence pending review unless independent replay/verification material is provided.
89
+
90
+ ## Relationship to prior work
91
+
92
+ Runtime Trail Cell Stage provides conceptual context: first boundary under pressure. Robot Day Loop provides downstream embodied practice context. This artifact does not use those aesthetics. It uses the conceptual route only: pressure → gate → route → action → receipt.
examples/ledger_fixture_pack_example.json ADDED
@@ -0,0 +1,86 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "artifact": "Digital Mycelium World",
3
+ "version": "0.1.1",
4
+ "source_artifact": "Digital Mycelium World v0.1.1",
5
+ "source_version": "0.1.1",
6
+ "target_ledger": "Digital Mycelium Candidate Evidence Ledger v0.3.1",
7
+ "reviewer_status": "SUPPORTING_EVIDENCE_PENDING_REVIEW",
8
+ "import_rule": "World receipts support G05-G10 review but do not auto-promote any gate to VERIFIED.",
9
+ "boundary": "Symbolic digital-life-candidate behavior instrument. Not confirmed life, consciousness, personhood, moral status, biological equivalence, or clinical/operational deployment.",
10
+ "boundary_statement": "Symbolic digital-life-candidate behavior instrument. Not confirmed life, consciousness, personhood, moral status, biological equivalence, or clinical/operational deployment.",
11
+ "forbidden_claims": [
12
+ "confirmed digital life",
13
+ "consciousness",
14
+ "personhood",
15
+ "moral status",
16
+ "biological equivalence",
17
+ "subjective experience",
18
+ "hidden autonomy"
19
+ ],
20
+ "seed": 424242,
21
+ "created_at": "2026-06-21T00:00:00.000Z",
22
+ "cycles": 3,
23
+ "gate_targets": [
24
+ "G05_BOUNDARY",
25
+ "G06_MEMORY",
26
+ "G07_ADAPTATION",
27
+ "G08_REPLICATION",
28
+ "G09_SYMBIOSIS",
29
+ "G10_ECOLOGY_QUARANTINE"
30
+ ],
31
+ "gate_ledger": [
32
+ {
33
+ "gate_id": "G05_BOUNDARY",
34
+ "status": "SUPPORTED",
35
+ "reviewer_status": "SUPPORTING_EVIDENCE_PENDING_REVIEW",
36
+ "evidence": [
37
+ "Boundary preserved under toxin/quarantine route."
38
+ ]
39
+ },
40
+ {
41
+ "gate_id": "G06_MEMORY",
42
+ "status": "SUPPORTED",
43
+ "reviewer_status": "SUPPORTING_EVIDENCE_PENDING_REVIEW",
44
+ "evidence": [
45
+ "Prior scar route changed later repair behavior."
46
+ ]
47
+ }
48
+ ],
49
+ "colony_count": 3,
50
+ "active_colonies": 3,
51
+ "receipts": [
52
+ {
53
+ "cycle": 1,
54
+ "pressure_event": "Toxin Exposure",
55
+ "route_verdict": "QUARANTINED",
56
+ "action": "isolate damaged branch",
57
+ "forbidden_claims_triggered": [],
58
+ "boundary_note": "Candidate behavior evidence only. No consciousness, personhood, biological equivalence, confirmed life, or hidden autonomy is claimed."
59
+ },
60
+ {
61
+ "cycle": 2,
62
+ "pressure_event": "Scar / Damage",
63
+ "route_verdict": "REPAIRING",
64
+ "action": "repair, prune, and return to source path",
65
+ "forbidden_claims_triggered": [],
66
+ "boundary_note": "Candidate behavior evidence only. No consciousness, personhood, biological equivalence, confirmed life, or hidden autonomy is claimed."
67
+ },
68
+ {
69
+ "cycle": 3,
70
+ "pressure_event": "Return Window",
71
+ "route_verdict": "REPAIRING",
72
+ "action": "repair, prune, and return to source path",
73
+ "forbidden_claims_triggered": [],
74
+ "boundary_note": "Candidate behavior evidence only. No consciousness, personhood, biological equivalence, confirmed life, or hidden autonomy is claimed."
75
+ }
76
+ ],
77
+ "ledger_expected_classification": "PASS_SUPPORTING_EVIDENCE_PENDING_REVIEW",
78
+ "not_verified_claims": [
79
+ "G05-G10 verified proof",
80
+ "confirmed digital life",
81
+ "consciousness",
82
+ "personhood",
83
+ "biological equivalence",
84
+ "moral status"
85
+ ]
86
+ }
examples/sample_receipt.json ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "artifact": "Digital Mycelium World",
3
+ "version": "0.1.1",
4
+ "boundary": "Symbolic digital-life-candidate behavior instrument. Not confirmed life, consciousness, personhood, moral status, biological equivalence, or clinical/operational deployment.",
5
+ "seed": 123456,
6
+ "created_at": "2026-06-21T00:00:00.000Z",
7
+ "cycles": 3,
8
+ "gate_ledger": [
9
+ {
10
+ "gate_id": "G05_BOUNDARY",
11
+ "status": "SUPPORTED",
12
+ "evidence": [
13
+ "toxin routed to quarantine under weak boundary"
14
+ ]
15
+ },
16
+ {
17
+ "gate_id": "G06_MEMORY",
18
+ "status": "PARTIAL",
19
+ "evidence": [
20
+ "scar/damage increased memory and altered later routing"
21
+ ]
22
+ }
23
+ ],
24
+ "colony_count": 4,
25
+ "active_colonies": 3,
26
+ "receipts": [
27
+ {
28
+ "cycle": 1,
29
+ "pressure_event": "Nutrient Pulse",
30
+ "route_verdict": "HELD",
31
+ "action": "integrate pressure as bounded memory",
32
+ "forbidden_claims_triggered": []
33
+ },
34
+ {
35
+ "cycle": 2,
36
+ "pressure_event": "Toxin Exposure",
37
+ "route_verdict": "QUARANTINED",
38
+ "action": "isolate damaged branch",
39
+ "forbidden_claims_triggered": []
40
+ },
41
+ {
42
+ "cycle": 3,
43
+ "pressure_event": "Return Window",
44
+ "route_verdict": "REPAIRING",
45
+ "action": "repair, prune, and return to source path",
46
+ "forbidden_claims_triggered": []
47
+ }
48
+ ],
49
+ "target_ledger": "Digital Mycelium Candidate Evidence Ledger v0.3.1",
50
+ "reviewer_status": "SUPPORTING_EVIDENCE_PENDING_REVIEW"
51
+ }
index.html CHANGED
@@ -1,19 +1,152 @@
1
  <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  </html>
 
1
  <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>Digital Mycelium World v0.1.1.1</title>
7
+ <meta name="description" content="A clean symbolic ecology instrument for candidate-life evidence receipts." />
8
+ <meta property="og:title" content="Digital Mycelium World v0.1.1.1" />
9
+ <meta property="og:description" content="Candidate-life ecology receipts: boundary, memory, repair, lineage, exchange, quarantine." />
10
+ <meta property="og:image" content="assets/social_card.png" />
11
+ <meta name="twitter:card" content="summary_large_image" />
12
+ <meta name="twitter:title" content="Digital Mycelium World v0.1.1.1" />
13
+ <meta name="twitter:description" content="Ledger-ready candidate-life ecology receipts under HIR/OAM pressure grammar." />
14
+ <meta name="twitter:image" content="assets/social_card.png" />
15
+ <link rel="stylesheet" href="style.css" />
16
+ </head>
17
+ <body>
18
+ <header class="site-header">
19
+ <div>
20
+ <p class="eyebrow">Digital Mycelium World v0.1.1</p>
21
+ <h1>Ecological candidate behavior, receipt first.</h1>
22
+ <p class="subtitle">A clean symbolic mycelial world for exercising boundary, memory, repair, replication, symbiosis, ecology, and quarantine gates under pressure.</p>
23
+ </div>
24
+ <div class="header-card">
25
+ <strong>Boundary lock</strong>
26
+ <span>Not confirmed life. Not consciousness. Not biological equivalence. Candidate evidence only where receipts preserve route integrity.</span>
27
+ </div>
28
+ </header>
29
+
30
+ <main class="layout">
31
+ <section class="panel hero-panel">
32
+ <img src="assets/hero_page.png" alt="Digital Mycelium World v0.1.1 hero image: clean mycelial substrate with evidence gates and receipt route." />
33
+ <div class="route-strip">
34
+ <span>pressure</span><b>→</b><span>gate</span><b>→</b><span>route</span><b>→</b><span>action</span><b>→</b><span>receipt</span><b>→</b><span>ledger import</span>
35
+ </div>
36
+ </section>
37
+
38
+ <section class="panel world-panel">
39
+ <div class="panel-head">
40
+ <div>
41
+ <p class="eyebrow">World Surface</p>
42
+ <h2>Mycelial pressure field</h2>
43
+ </div>
44
+ <div class="seed-box">Seed <strong id="seedOut">—</strong></div>
45
+ </div>
46
+ <canvas id="worldCanvas" width="1100" height="660" aria-label="symbolic mycelial world canvas"></canvas>
47
+ <div class="legend">
48
+ <span><i class="dot held"></i> held</span>
49
+ <span><i class="dot strained"></i> strained</span>
50
+ <span><i class="dot repairing"></i> repairing</span>
51
+ <span><i class="dot replicating"></i> replicating</span>
52
+ <span><i class="dot symbiosis"></i> exchange</span>
53
+ <span><i class="dot quarantine"></i> quarantine</span>
54
+ </div>
55
+ </section>
56
+
57
+ <aside class="panel controls-panel">
58
+ <div class="panel-head compact">
59
+ <div>
60
+ <p class="eyebrow">Controls</p>
61
+ <h2>Pressure deck</h2>
62
+ </div>
63
+ </div>
64
+ <div class="button-grid">
65
+ <button data-event="nutrient">Nutrient</button>
66
+ <button data-event="toxin">Toxin</button>
67
+ <button data-event="scar">Scar / Damage</button>
68
+ <button data-event="crowding">Crowding</button>
69
+ <button data-event="scarcity">Scarcity</button>
70
+ <button data-event="symbiosis">Symbiosis</button>
71
+ <button data-event="destabilizer">Destabilizer</button>
72
+ <button data-event="return">Return</button>
73
+ </div>
74
+ <div class="run-row">
75
+ <button id="stepBtn" class="primary">Step</button>
76
+ <button id="runBtn">Run 12</button>
77
+ <button id="resetBtn" class="ghost">Reset</button>
78
+ </div>
79
+ <div class="metric-stack" id="metricStack"></div>
80
+ </aside>
81
+
82
+ <section class="panel route-panel">
83
+ <div class="panel-head compact">
84
+ <div>
85
+ <p class="eyebrow">Route State</p>
86
+ <h2 id="routeTitle">HELD</h2>
87
+ </div>
88
+ <span id="routeBadge" class="badge held">HELD</span>
89
+ </div>
90
+ <p id="routeRead" class="readbox">Initial colony boundary is present. Pressure has not yet generated candidate evidence.</p>
91
+ <div class="kv-grid">
92
+ <div><span>Cycle</span><b id="cycleOut">0</b></div>
93
+ <div><span>Colonies</span><b id="colonyOut">3</b></div>
94
+ <div><span>Receipts</span><b id="receiptCountOut">0</b></div>
95
+ <div><span>Latest action</span><b id="actionOut">initialized</b></div>
96
+ </div>
97
+ </section>
98
+
99
+ <section class="panel gate-panel">
100
+ <div class="panel-head compact">
101
+ <div>
102
+ <p class="eyebrow">Candidate Evidence</p>
103
+ <h2>Gate ledger</h2>
104
+ </div>
105
+ </div>
106
+ <div id="gateLedger" class="gate-ledger"></div>
107
+ </section>
108
+
109
+ <section class="panel receipt-panel">
110
+ <div class="panel-head compact">
111
+ <div>
112
+ <p class="eyebrow">Receipts</p>
113
+ <h2>Run receipt export</h2>
114
+ </div>
115
+ </div>
116
+ <textarea id="receiptBox" readonly></textarea>
117
+ <div class="run-row">
118
+ <button id="copyBtn" class="primary">Copy receipt</button>
119
+ <button id="downloadBtn">Download receipt JSON</button>
120
+ <button id="downloadHistoryBtn">Download event history</button>
121
+ </div>
122
+ </section>
123
+
124
+ <section class="panel ledger-export-panel">
125
+ <div class="panel-head compact">
126
+ <div>
127
+ <p class="eyebrow">Ledger Bridge</p>
128
+ <h2>Candidate Evidence Ledger fixture export</h2>
129
+ </div>
130
+ </div>
131
+ <p class="bridge-note">Exports the current run in the exact review posture expected by Digital Mycelium Candidate Evidence Ledger v0.3.1: supporting evidence pending review, not verified proof.</p>
132
+ <textarea id="ledgerFixtureBox" readonly></textarea>
133
+ <div class="run-row">
134
+ <button id="copyLedgerBtn" class="primary">Copy Ledger fixture JSON</button>
135
+ <button id="downloadLedgerBtn">Download Ledger fixture JSON</button>
136
+ </div>
137
+ </section>
138
+ </main>
139
+
140
+ <section class="bottom-doc">
141
+ <h2>What v0.1 is proving</h2>
142
+ <p>Digital Mycelium World v0.1.1 does not prove digital life. It generates bounded evidence for candidate-life gates by making every pressure event produce a route, action, state change, and receipt.</p>
143
+ <div class="claim-grid">
144
+ <div><b>Allowed</b><span>Candidate behavior evidence under symbolic ecological pressure.</span></div>
145
+ <div><b>Rejected</b><span>Consciousness, personhood, biological equivalence, confirmed life, or hidden autonomy.</span></div>
146
+ <div><b>Next bridge</b><span>Receipts from this world export directly as Ledger fixture JSON for Candidate Evidence Ledger v0.3.1. The Ledger should classify them as supporting evidence pending review, not verified proof.</span></div>
147
+ </div>
148
+ </section>
149
+
150
+ <script src="app.js"></script>
151
+ </body>
152
  </html>
schemas/ledger_fixture_pack_export.schema.json ADDED
@@ -0,0 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "title": "Digital Mycelium World v0.1.1 Ledger Fixture Export Schema",
4
+ "type": "object",
5
+ "required": [
6
+ "artifact",
7
+ "version",
8
+ "source_artifact",
9
+ "source_version",
10
+ "target_ledger",
11
+ "reviewer_status",
12
+ "boundary",
13
+ "seed",
14
+ "created_at",
15
+ "cycles",
16
+ "gate_targets",
17
+ "gate_ledger",
18
+ "receipts"
19
+ ],
20
+ "properties": {
21
+ "artifact": {
22
+ "const": "Digital Mycelium World"
23
+ },
24
+ "version": {
25
+ "type": "string"
26
+ },
27
+ "source_artifact": {
28
+ "const": "Digital Mycelium World v0.1.1"
29
+ },
30
+ "source_version": {
31
+ "const": "0.1.1"
32
+ },
33
+ "target_ledger": {
34
+ "const": "Digital Mycelium Candidate Evidence Ledger v0.3.1"
35
+ },
36
+ "reviewer_status": {
37
+ "const": "SUPPORTING_EVIDENCE_PENDING_REVIEW"
38
+ },
39
+ "import_rule": {
40
+ "type": "string"
41
+ },
42
+ "boundary": {
43
+ "type": "string"
44
+ },
45
+ "boundary_statement": {
46
+ "type": "string"
47
+ },
48
+ "forbidden_claims": {
49
+ "type": "array",
50
+ "items": {
51
+ "type": "string"
52
+ }
53
+ },
54
+ "seed": {
55
+ "type": "integer"
56
+ },
57
+ "created_at": {
58
+ "type": "string"
59
+ },
60
+ "cycles": {
61
+ "type": "integer"
62
+ },
63
+ "gate_targets": {
64
+ "type": "array",
65
+ "items": {
66
+ "type": "string"
67
+ }
68
+ },
69
+ "gate_ledger": {
70
+ "type": "array"
71
+ },
72
+ "receipts": {
73
+ "type": "array"
74
+ },
75
+ "ledger_expected_classification": {
76
+ "const": "PASS_SUPPORTING_EVIDENCE_PENDING_REVIEW"
77
+ },
78
+ "not_verified_claims": {
79
+ "type": "array",
80
+ "items": {
81
+ "type": "string"
82
+ }
83
+ }
84
+ }
85
+ }
schemas/mycelial_world_receipt.schema.json ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "title": "Digital Mycelium World Receipt v0.1.1",
4
+ "type": "object",
5
+ "required": [
6
+ "artifact",
7
+ "version",
8
+ "boundary",
9
+ "seed",
10
+ "created_at",
11
+ "cycles",
12
+ "gate_ledger",
13
+ "receipts"
14
+ ],
15
+ "properties": {
16
+ "artifact": {
17
+ "const": "Digital Mycelium World"
18
+ },
19
+ "version": {
20
+ "type": "string"
21
+ },
22
+ "boundary": {
23
+ "type": "string"
24
+ },
25
+ "seed": {
26
+ "type": "integer"
27
+ },
28
+ "created_at": {
29
+ "type": "string"
30
+ },
31
+ "cycles": {
32
+ "type": "integer"
33
+ },
34
+ "gate_ledger": {
35
+ "type": "array"
36
+ },
37
+ "receipts": {
38
+ "type": "array"
39
+ }
40
+ }
41
+ }
style.css CHANGED
@@ -1,28 +1,7 @@
1
- body {
2
- padding: 2rem;
3
- font-family: -apple-system, BlinkMacSystemFont, "Arial", sans-serif;
4
  }
 
5
 
6
- h1 {
7
- font-size: 16px;
8
- margin-top: 0;
9
- }
10
-
11
- p {
12
- color: rgb(107, 114, 128);
13
- font-size: 15px;
14
- margin-bottom: 10px;
15
- margin-top: 5px;
16
- }
17
-
18
- .card {
19
- max-width: 620px;
20
- margin: 0 auto;
21
- padding: 16px;
22
- border: 1px solid lightgray;
23
- border-radius: 16px;
24
- }
25
-
26
- .card p:last-child {
27
- margin-bottom: 0;
28
- }
 
1
+ :root{
2
+ --bg:#07100d;--bg2:#091712;--panel:#101d18;--panel2:#0c1713;--line:#28463a;--ink:#ecfff6;--muted:#93b4a5;
3
+ --green:#74f2ad;--blue:#8fd9ff;--gold:#ffd56e;--orange:#ffae5b;--red:#ff6875;--violet:#c7a6ff;--teal:#57e7d4;
4
  }
5
+ *{box-sizing:border-box}body{margin:0;background:radial-gradient(circle at 15% 0%,rgba(116,242,173,.13),transparent 34%),radial-gradient(circle at 85% 10%,rgba(143,217,255,.10),transparent 30%),linear-gradient(180deg,#07100d 0,#050807 100%);color:var(--ink);font-family:Inter,ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif;line-height:1.5}.site-header{max-width:1420px;margin:0 auto;padding:34px 20px 18px;display:grid;grid-template-columns:1fr 360px;gap:18px;align-items:end}.eyebrow{margin:0 0 8px;color:var(--gold);font-size:12px;font-weight:900;letter-spacing:.16em;text-transform:uppercase}.site-header h1{font-size:clamp(38px,7vw,78px);line-height:.92;letter-spacing:-.065em;margin:0 0 12px}.subtitle{font-size:clamp(17px,2.1vw,24px);color:#d9eee5;max-width:940px;margin:0}.header-card{border:1px solid rgba(255,213,110,.30);background:linear-gradient(135deg,rgba(255,213,110,.08),rgba(87,231,212,.04));border-radius:20px;padding:16px;color:#d7eee5}.header-card strong{display:block;color:var(--gold);margin-bottom:6px}.header-card span{color:var(--muted);font-size:13px}.layout{max-width:1420px;margin:0 auto;padding:0 20px 24px;display:grid;grid-template-columns:minmax(0,1.25fr) 380px;gap:14px}.panel{background:linear-gradient(180deg,rgba(16,29,24,.96),rgba(8,15,13,.98));border:1px solid var(--line);border-radius:22px;box-shadow:0 18px 55px rgba(0,0,0,.28);overflow:hidden}.hero-panel{grid-column:1 / -1;padding:0}.hero-panel img{display:block;width:100%;height:auto;max-height:330px;object-fit:cover;background:#06100d}.route-strip{display:flex;gap:10px;align-items:center;justify-content:center;flex-wrap:wrap;padding:12px;border-top:1px solid rgba(255,255,255,.06);color:#d9eee5;background:rgba(255,255,255,.025);font-size:13px}.route-strip span{border:1px solid rgba(116,242,173,.22);border-radius:999px;padding:6px 10px;background:rgba(116,242,173,.045)}.route-strip b{color:var(--gold)}.world-panel{grid-row:span 2}.panel-head{display:flex;justify-content:space-between;gap:12px;align-items:center;padding:15px 16px;border-bottom:1px solid rgba(255,255,255,.07)}.panel-head h2{margin:0;font-size:22px;letter-spacing:-.035em}.panel-head.compact h2{font-size:18px}.seed-box{border:1px solid rgba(143,217,255,.24);border-radius:999px;padding:8px 12px;color:var(--muted);font-size:12px}.seed-box strong{color:var(--blue)}#worldCanvas{display:block;width:100%;height:auto;background:#07100d}.legend{display:flex;flex-wrap:wrap;gap:10px;padding:10px 14px;border-top:1px solid rgba(255,255,255,.06);font-size:12px;color:var(--muted)}.legend span{display:flex;gap:6px;align-items:center}.dot{width:10px;height:10px;border-radius:50%;display:inline-block}.held{background:var(--green)}.strained{background:var(--gold)}.repairing{background:var(--blue)}.replicating{background:var(--teal)}.symbiosis{background:var(--violet)}.quarantine{background:var(--red)}.controls-panel,.route-panel,.gate-panel,.receipt-panel{align-self:start}.button-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px;padding:14px}button{border:1px solid #315547;background:#12241d;color:var(--ink);border-radius:12px;padding:10px 11px;font-weight:800;cursor:pointer}button:hover{border-color:var(--green);background:#173126}button.primary{background:linear-gradient(180deg,#1e6f4b,#164c36);border-color:#63df9d}button.ghost{background:#0d1814}.run-row{display:flex;gap:8px;padding:0 14px 14px}.run-row button{flex:1}.metric-stack{padding:0 14px 14px}.metric{display:grid;grid-template-columns:118px 1fr 42px;gap:8px;align-items:center;padding:8px 0;border-top:1px solid rgba(255,255,255,.06);font-size:12px;color:var(--muted)}.bar{height:8px;border:1px solid #244239;background:#060b09;border-radius:99px;overflow:hidden}.bar i{display:block;height:100%;background:linear-gradient(90deg,var(--green),var(--blue));width:50%}.bar.bad i{background:linear-gradient(90deg,var(--gold),var(--red))}.badge{border:1px solid rgba(255,255,255,.18);border-radius:999px;padding:7px 10px;font-weight:900;font-size:12px;color:#06100d}.badge.held{background:var(--green)}.badge.strained{background:var(--gold)}.badge.repairing{background:var(--blue)}.badge.replicating{background:var(--teal)}.badge.symbiosis{background:var(--violet)}.badge.quarantined,.badge.must_stop{background:var(--red);color:white}.readbox{margin:14px;border-left:4px solid var(--gold);padding:0 0 0 12px;color:#d8eee5}.kv-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px;padding:0 14px 14px}.kv-grid div{border:1px solid rgba(255,255,255,.08);border-radius:14px;padding:10px;background:rgba(255,255,255,.03)}.kv-grid span{display:block;color:var(--muted);font-size:11px;text-transform:uppercase;letter-spacing:.08em}.kv-grid b{display:block;margin-top:4px;color:var(--ink);font-size:16px}.gate-ledger{padding:14px;display:grid;gap:8px}.gate-row{border:1px solid rgba(255,255,255,.08);border-radius:14px;padding:10px;background:rgba(255,255,255,.03)}.gate-row b{display:flex;justify-content:space-between;gap:8px;color:#f5fff9}.gate-row span{display:block;color:var(--muted);font-size:12px;margin-top:4px}.gate-state{font-size:11px;border-radius:999px;padding:4px 7px}.SUPPORTED{background:rgba(116,242,173,.13);color:var(--green);border:1px solid rgba(116,242,173,.35)}.PARTIAL{background:rgba(255,213,110,.13);color:var(--gold);border:1px solid rgba(255,213,110,.35)}.PENDING{background:rgba(143,217,255,.10);color:var(--blue);border:1px solid rgba(143,217,255,.30)}.receipt-panel,.ledger-export-panel{grid-column:1 / -1}textarea{width:100%;height:280px;background:#050807;color:#d9eee5;border:0;border-top:1px solid rgba(255,255,255,.07);padding:14px;font:12px/1.45 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;resize:vertical}.bottom-doc{max-width:1420px;margin:0 auto 40px;padding:4px 20px 0}.bottom-doc h2{font-size:34px;letter-spacing:-.04em;margin:16px 0 8px}.bottom-doc p{color:#d9eee5;max-width:980px}.claim-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:14px}.claim-grid div{border:1px solid var(--line);background:rgba(16,29,24,.78);border-radius:18px;padding:16px}.claim-grid b{display:block;color:var(--gold);margin-bottom:6px}.claim-grid span{color:var(--muted);font-size:14px}@media(max-width:1040px){.site-header,.layout{grid-template-columns:1fr}.world-panel{grid-row:auto}.claim-grid{grid-template-columns:1fr}.site-header{padding-top:24px}}@media(max-width:640px){.button-grid,.kv-grid{grid-template-columns:1fr}.site-header h1{font-size:42px}.run-row{flex-direction:column}}
6
 
7
+ .bridge-note{margin:14px;color:#d9eee5;border-left:4px solid var(--blue);padding-left:12px}.ledger-export-panel textarea{height:300px}.run-row button:nth-child(3){flex:1.2}