Spaces:
Running
Upload 18 files
Browse filesDigital 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 +1 -0
- README.md +74 -5
- SHA256_MANIFEST.json +18 -0
- VALIDATION_REPORT.md +36 -0
- app.js +565 -0
- assets/hero_page.png +0 -0
- assets/social_card.png +0 -0
- data/gate_definitions.json +38 -0
- data/ledger_export_targets.json +17 -0
- data/pressure_events.json +10 -0
- docs/BOUNDARY_MANIFEST.md +29 -0
- docs/DIGITAL_MYCELIUM_WORLD_v0_1_1.md +92 -0
- examples/ledger_fixture_pack_example.json +86 -0
- examples/sample_receipt.json +51 -0
- index.html +150 -17
- schemas/ledger_fixture_pack_export.schema.json +85 -0
- schemas/mycelial_world_receipt.schema.json +41 -0
- style.css +5 -26
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
98f7e84c61a5223d3082bed3e79a51862120ee728b38fc1c095a4f64f888283e Digital_Mycelium_World_v0_1_1_HF_STATIC_ROOT_READY.zip
|
|
@@ -1,12 +1,81 @@
|
|
| 1 |
---
|
| 2 |
-
title: Digital Mycelium World
|
| 3 |
-
emoji:
|
| 4 |
colorFrom: green
|
| 5 |
-
colorTo:
|
| 6 |
sdk: static
|
|
|
|
| 7 |
pinned: false
|
| 8 |
license: cc-by-nc-sa-4.0
|
| 9 |
-
|
| 10 |
---
|
| 11 |
|
| 12 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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.
|
|
@@ -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 |
+
}
|
|
@@ -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.
|
|
@@ -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();
|
|
|
|
@@ -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 |
+
]
|
|
@@ -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 |
+
}
|
|
@@ -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 |
+
]
|
|
@@ -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.
|
|
@@ -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.
|
|
@@ -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 |
+
}
|
|
@@ -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 |
+
}
|
|
@@ -1,19 +1,152 @@
|
|
| 1 |
<!doctype html>
|
| 2 |
-
<html>
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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>
|
|
@@ -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 |
+
}
|
|
@@ -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 |
+
}
|
|
@@ -1,28 +1,7 @@
|
|
| 1 |
-
|
| 2 |
-
|
| 3 |
-
|
| 4 |
}
|
|
|
|
| 5 |
|
| 6 |
-
|
| 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}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|