Add Artemis compudynamics implementation plan; add stress campaign fixture

The 30-replicate Artemis surface-stress campaign ran across all three
architectures: 30 reps x 50 trials x 3 arches = 4500 trials, zero failures.
The block_words.c stale-pointer cache-aliasing fix holds at scale.

Adds ART-STRESS-CAMPAIGN (block 4174) plus ART-STRESS-REP rep-tagging in
the CSV header/summary emitters, so a multi-replicate run is distinguishable
in the serial log. Campaign auto-invoke is left enabled in block 4170 for
now; Makefile.starkernel's QEMU boot deadlines stay at 12h to accommodate
long-running experiments.

Adds docs/working/architecture/ARTEMIS-COMPUDYNAMICS-IMPLEMENTATION-PLAN-20260802.md,
which documents the real gap this campaign exposed: block heat and message
heat do not decay at all. ART-TICK has zero call sites anywhere in the tree,
and HERMES-TICK has zero C call sites -- every caller is Hera poking it by
hand. BLK-HEAT@/MSG-HEAT@ read a number nothing ages, so blocks never reap
by cooling and message TTL never expires on its own.

The plan mirrors word-level physics as the reference model: lazy decay at
each access point against vm->heartbeat.tick_count, plus a bounded
background sweep with a resumable cursor (the existing answer to "sweeping
22,998 blocks per tick is too expensive"). Phase 1 Artemis, Phase 2 Hermes,
Phase 3 K participation deferred behind the Logical BAM.

The plan's preamble also records a wrong turn taken while investigating:
chasing VM-fleet heat instead of block heat, and building synthetic
Hera-driven VM-EXEC calls to force a physics reading -- which TRIPOD.md
prohibits outright. That work was reverted; the record is kept so it isn't
repeated.

Status: plan approved in shape, NOT final and NOT started. Six open
questions need answers and further design discussion is pending.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Robert Allan James
2026-08-02 21:49:16 -04:00
co-authored by Claude Opus 5
parent 1cb68502fb
commit 7597a9ccd4
11 changed files with 210228 additions and 5264 deletions
+3 -3
View File
@@ -714,7 +714,7 @@ ifeq ($(ARCH),amd64)
-serial chardev:cserial \
-display none \
-no-reboot & QPID=$$!; \
DEADLINE=$$(( $$(date +%s) + 1800 )); \
DEADLINE=$$(( $$(date +%s) + 43200 )); \
echo " Waiting for ok> / zuse)ok> prompt..."; \
while ! grep -qE '\[Hera\].*(zuse\))?ok>' $$LOG 2>/dev/null; do \
[ $$(date +%s) -ge $$DEADLINE ] && echo " TIMEOUT waiting for ok>" && break; \
@@ -796,7 +796,7 @@ else ifeq ($(ARCH),aarch64)
-m 2048 \
-no-reboot \
-d guest_errors & QPID=$$!; \
DEADLINE=$$(( $$(date +%s) + 1800 )); \
DEADLINE=$$(( $$(date +%s) + 43200 )); \
echo " Waiting for ok> / zuse)ok> prompt..."; \
while ! grep -qE '\[Hera\].*(zuse\))?ok>' $$LOG 2>/dev/null; do \
[ $$(date +%s) -ge $$DEADLINE ] && echo " TIMEOUT waiting for ok>" && break; \
@@ -894,7 +894,7 @@ else ifeq ($(ARCH),riscv64)
-display none \
-no-reboot \
-d guest_errors & QPID=$$!; \
DEADLINE=$$(( $$(date +%s) + 3600 )); \
DEADLINE=$$(( $$(date +%s) + 43200 )); \
echo " Waiting for ok> / zuse)ok> prompt..."; \
while ! grep -qE '\[Hera\].*(zuse\))?ok>' $$LOG 2>/dev/null; do \
[ $$(date +%s) -ge $$DEADLINE ] && echo " TIMEOUT waiting for ok>" && break; \
+222 -216
View File
@@ -1,229 +1,235 @@
# Capsule Block Manifest — Auto-generated
<!-- Generated by mkcapsule --manifest 2026-08-02T18:02:36Z -->
<!-- Generated by mkcapsule --manifest 2026-08-03T00:19:59Z -->
<!-- DO NOT EDIT — re-run mkcapsule --manifest to refresh. -->
<!-- Hand-written justifications and immutability notes live -->
<!-- in MANIFEST.md alongside this auto-generated index. -->
## Capsule Summary
| Capsule | Blocks claimed | xxHash64 |
|--------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------|
| `ACL.4th` | 4000, 4001, 4002, 4003, 4004, 4005, 4006, 4007, 4015 | `0xd781d22148ff171d` |
| `artemis:init.4th` | 4110, 4111, 4112, 4113, 4122, 4123, 4124, 4125, 4126, 4127, 4128, 4129, 4130, 4131, 4132, 4133, 4134, 4135, 4136, 4137, 4138, 4139, 4140, 4141, 4160, 4161, 4162, 4163, 4164, 4165, 4166, 4167, 4168, 4169, 4170, 4171, 4172, 4173, 4851, 4852 | `0x8f1ba626b4fe297b` |
| `common:msg.4th` | 4055 | `0xa99c5bcd3877f80e` |
| `doe-campaign.4th` | 4060, 4061, 4062, 4063, 4064, 4065 | `0x3d4549142d91ec20` |
| `doe.4th` | 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107 | `0xb6ecf5374e8ee77c` |
| `hermes:init.4th` | 4100, 4101, 4102, 4103, 4104, 4105, 4106, 4107, 4108, 4109, 4114, 4115, 4116, 4117, 4118, 4119, 4120, 4121, 4142, 4143, 4144, 4145, 4146, 4147, 4148, 4149, 4150, 4151, 4152, 4153 | `0xbb77f3ac463f507f` |
| `init-0.4th` | 2200, 2201 | `0xd0a9550baf786bb3` |
| `init-1.4th` | 4406, 4415, 4425, 4435 | `0x63e251adb0a03613` |
| `init-2.4th` | 4506, 4515, 4525, 4535, 4545 | `0xf113b3d0bcccae47` |
| `init-3.4th` | 4606, 4615, 4625, 4635, 4645, 4655, 4665 | `0x62b7a71576ad1041` |
| `init-4.4th` | 2130, 2131, 2132 | `0x89e3ef1db5ac0627` |
| `init-5.4th` | *(none — raw code capsule)* | `0xda0c179af10a46a9` |
| `init-6.4th` | 2080, 2081, 2082, 2083, 2084, 2085, 2086, 2087, 2088, 2089, 2090, 2091, 2092, 2093, 2094, 2095 | `0x06fc0ce1e369ef5a` |
| `init-7.4th` | 2150 | `0xb88df2efeb753d64` |
| `init-8.4th` | 2160 | `0x714746312b72f83d` |
| `init-9.4th` | 4706, 4715, 4725, 4735, 4745 | `0x3f2bec73142aa424` |
| `init-l8-diverse.4th` | 4820, 4821, 4822 | `0xaa293201a6c91838` |
| `init-l8-omni.4th` | 2064, 2065, 2066, 2067, 2068, 2069, 2070, 2071, 2072, 2073, 2074, 2075, 2076, 2077, 2078, 2079 | `0x5979e314d6452045` |
| `init-l8-stable.4th` | 4806 | `0xdc3830f189063a9a` |
| `init-l8-temporal.4th` | 4830, 4831 | `0x51abd4c138246651` |
| `init-l8-transition.4th` | 4840, 4841, 4842 | `0xbcc1a81976f0a4c9` |
| `init-l8-volatile.4th` | 4810, 4811, 4812, 4813 | `0x98caabbbd92abac4` |
| `init.4th` | 2049, 2050, 2051, 2052, 2053, 2054, 2055, 2056, 2057, 2058, 2059 | `0x7e54f972ef83ae23` |
| `lib.4th` | 4050 | `0x20625ebf1276c239` |
| `process.4th` | 4300, 4301 | `0x781afc1dbd0294f7` |
| `zuse.4th` | 4016, 4017, 4018 | `0x12f38ec782434a77` |
| Capsule | Blocks claimed | xxHash64 |
|---------|----------------|----------|
| `ACL.4th` | 4000, 4001, 4002, 4003, 4004, 4005, 4006, 4007, 4015 | `0xd781d22148ff171d` |
| `artemis:init.4th` | 4110, 4111, 4112, 4113, 4122, 4123, 4124, 4125, 4126, 4127, 4128, 4129, 4130, 4131, 4132, 4133, 4134, 4135, 4136, 4137, 4138, 4139, 4140, 4141, 4160, 4161, 4162, 4163, 4164, 4165, 4166, 4167, 4168, 4169, 4170, 4171, 4172, 4173, 4174, 4175, 4176, 4851, 4852 | `0x289044d7bc1de308` |
| `common:msg.4th` | 4055 | `0xa99c5bcd3877f80e` |
| `doe-campaign.4th` | 4060, 4061, 4062, 4063, 4064, 4065 | `0x3d4549142d91ec20` |
| `doe.4th` | 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107 | `0xb6ecf5374e8ee77c` |
| `hermes:init.4th` | 4100, 4101, 4102, 4103, 4104, 4105, 4106, 4107, 4108, 4109, 4114, 4115, 4116, 4117, 4118, 4119, 4120, 4121, 4142, 4143, 4144, 4145, 4146, 4147, 4148, 4149, 4150, 4151, 4152, 4153 | `0xbb77f3ac463f507f` |
| `init-0.4th` | 2200, 2201 | `0xd0a9550baf786bb3` |
| `init-1.4th` | 4406, 4415, 4425, 4435 | `0x63e251adb0a03613` |
| `init-2.4th` | 4506, 4515, 4525, 4535, 4545 | `0xf113b3d0bcccae47` |
| `init-3.4th` | 4606, 4615, 4625, 4635, 4645, 4655, 4665 | `0x62b7a71576ad1041` |
| `init-4.4th` | 2130, 2131, 2132 | `0x89e3ef1db5ac0627` |
| `init-5.4th` | *(none — raw code capsule)* | `0xda0c179af10a46a9` |
| `init-6.4th` | 2080, 2081, 2082, 2083, 2084, 2085, 2086, 2087, 2088, 2089, 2090, 2091, 2092, 2093, 2094, 2095 | `0x06fc0ce1e369ef5a` |
| `init-7.4th` | 2150 | `0xb88df2efeb753d64` |
| `init-8.4th` | 2160 | `0x714746312b72f83d` |
| `init-9.4th` | 4706, 4715, 4725, 4735, 4745 | `0x3f2bec73142aa424` |
| `init-l8-diverse.4th` | 4820, 4821, 4822 | `0xaa293201a6c91838` |
| `init-l8-omni.4th` | 2064, 2065, 2066, 2067, 2068, 2069, 2070, 2071, 2072, 2073, 2074, 2075, 2076, 2077, 2078, 2079 | `0x5979e314d6452045` |
| `init-l8-stable.4th` | 4806 | `0xdc3830f189063a9a` |
| `init-l8-temporal.4th` | 4830, 4831 | `0x51abd4c138246651` |
| `init-l8-transition.4th` | 4840, 4841, 4842 | `0xbcc1a81976f0a4c9` |
| `init-l8-volatile.4th` | 4810, 4811, 4812, 4813 | `0x98caabbbd92abac4` |
| `init.4th` | 2049, 2050, 2051, 2052, 2053, 2054, 2055, 2056, 2057, 2058, 2059, 2060, 2061, 2062, 2063 | `0x2f5b3bfa012e52c4` |
| `lib.4th` | 4050 | `0x20625ebf1276c239` |
| `process.4th` | 4300, 4301 | `0x781afc1dbd0294f7` |
| `zuse.4th` | 4016, 4017, 4018 | `0x12f38ec782434a77` |
## Block Map (sorted by LBN)
| LBN | Capsule | xxHash64 | Status |
|------|--------------------------|----------------------|--------|
| 2049 | `init.4th` | `0x7e54f972ef83ae23` | ok |
| 2050 | `init.4th` | `0x7e54f972ef83ae23` | ok |
| 2051 | `init.4th` | `0x7e54f972ef83ae23` | ok |
| 2052 | `init.4th` | `0x7e54f972ef83ae23` | ok |
| 2053 | `init.4th` | `0x7e54f972ef83ae23` | ok |
| 2054 | `init.4th` | `0x7e54f972ef83ae23` | ok |
| 2055 | `init.4th` | `0x7e54f972ef83ae23` | ok |
| 2056 | `init.4th` | `0x7e54f972ef83ae23` | ok |
| 2057 | `init.4th` | `0x7e54f972ef83ae23` | ok |
| 2058 | `init.4th` | `0x7e54f972ef83ae23` | ok |
| 2059 | `init.4th` | `0x7e54f972ef83ae23` | ok |
| 2064 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok |
| 2065 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok |
| 2066 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok |
| 2067 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok |
| 2068 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok |
| 2069 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok |
| 2070 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok |
| 2071 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok |
| 2072 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok |
| 2073 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok |
| 2074 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok |
| 2075 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok |
| 2076 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok |
| 2077 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok |
| 2078 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok |
| 2079 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok |
| 2080 | `init-6.4th` | `0x06fc0ce1e369ef5a` | ok |
| 2081 | `init-6.4th` | `0x06fc0ce1e369ef5a` | ok |
| 2082 | `init-6.4th` | `0x06fc0ce1e369ef5a` | ok |
| 2083 | `init-6.4th` | `0x06fc0ce1e369ef5a` | ok |
| 2084 | `init-6.4th` | `0x06fc0ce1e369ef5a` | ok |
| 2085 | `init-6.4th` | `0x06fc0ce1e369ef5a` | ok |
| 2086 | `init-6.4th` | `0x06fc0ce1e369ef5a` | ok |
| 2087 | `init-6.4th` | `0x06fc0ce1e369ef5a` | ok |
| 2088 | `init-6.4th` | `0x06fc0ce1e369ef5a` | ok |
| 2089 | `init-6.4th` | `0x06fc0ce1e369ef5a` | ok |
| 2090 | `init-6.4th` | `0x06fc0ce1e369ef5a` | ok |
| 2091 | `init-6.4th` | `0x06fc0ce1e369ef5a` | ok |
| 2092 | `init-6.4th` | `0x06fc0ce1e369ef5a` | ok |
| 2093 | `init-6.4th` | `0x06fc0ce1e369ef5a` | ok |
| 2094 | `init-6.4th` | `0x06fc0ce1e369ef5a` | ok |
| 2095 | `init-6.4th` | `0x06fc0ce1e369ef5a` | ok |
| 2100 | `doe.4th` | `0xb6ecf5374e8ee77c` | ok |
| 2101 | `doe.4th` | `0xb6ecf5374e8ee77c` | ok |
| 2102 | `doe.4th` | `0xb6ecf5374e8ee77c` | ok |
| 2103 | `doe.4th` | `0xb6ecf5374e8ee77c` | ok |
| 2104 | `doe.4th` | `0xb6ecf5374e8ee77c` | ok |
| 2105 | `doe.4th` | `0xb6ecf5374e8ee77c` | ok |
| 2106 | `doe.4th` | `0xb6ecf5374e8ee77c` | ok |
| 2107 | `doe.4th` | `0xb6ecf5374e8ee77c` | ok |
| 2130 | `init-4.4th` | `0x89e3ef1db5ac0627` | ok |
| 2131 | `init-4.4th` | `0x89e3ef1db5ac0627` | ok |
| 2132 | `init-4.4th` | `0x89e3ef1db5ac0627` | ok |
| 2150 | `init-7.4th` | `0xb88df2efeb753d64` | ok |
| 2160 | `init-8.4th` | `0x714746312b72f83d` | ok |
| 2200 | `init-0.4th` | `0xd0a9550baf786bb3` | ok |
| 2201 | `init-0.4th` | `0xd0a9550baf786bb3` | ok |
| 4000 | `ACL.4th` | `0xd781d22148ff171d` | ok |
| 4001 | `ACL.4th` | `0xd781d22148ff171d` | ok |
| 4002 | `ACL.4th` | `0xd781d22148ff171d` | ok |
| 4003 | `ACL.4th` | `0xd781d22148ff171d` | ok |
| 4004 | `ACL.4th` | `0xd781d22148ff171d` | ok |
| 4005 | `ACL.4th` | `0xd781d22148ff171d` | ok |
| 4006 | `ACL.4th` | `0xd781d22148ff171d` | ok |
| 4007 | `ACL.4th` | `0xd781d22148ff171d` | ok |
| 4015 | `ACL.4th` | `0xd781d22148ff171d` | ok |
| 4016 | `zuse.4th` | `0x12f38ec782434a77` | ok |
| 4017 | `zuse.4th` | `0x12f38ec782434a77` | ok |
| 4018 | `zuse.4th` | `0x12f38ec782434a77` | ok |
| 4050 | `lib.4th` | `0x20625ebf1276c239` | ok |
| 4055 | `common:msg.4th` | `0xa99c5bcd3877f80e` | ok |
| 4060 | `doe-campaign.4th` | `0x3d4549142d91ec20` | ok |
| 4061 | `doe-campaign.4th` | `0x3d4549142d91ec20` | ok |
| 4062 | `doe-campaign.4th` | `0x3d4549142d91ec20` | ok |
| 4063 | `doe-campaign.4th` | `0x3d4549142d91ec20` | ok |
| 4064 | `doe-campaign.4th` | `0x3d4549142d91ec20` | ok |
| 4065 | `doe-campaign.4th` | `0x3d4549142d91ec20` | ok |
| 4100 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4101 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4102 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4103 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4104 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4105 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4106 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4107 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4108 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4109 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4110 | `artemis:init.4th` | `0x8f1ba626b4fe297b` | ok |
| 4111 | `artemis:init.4th` | `0x8f1ba626b4fe297b` | ok |
| 4112 | `artemis:init.4th` | `0x8f1ba626b4fe297b` | ok |
| 4113 | `artemis:init.4th` | `0x8f1ba626b4fe297b` | ok |
| 4114 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4115 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4116 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4117 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4118 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4119 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4120 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4121 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4122 | `artemis:init.4th` | `0x8f1ba626b4fe297b` | ok |
| 4123 | `artemis:init.4th` | `0x8f1ba626b4fe297b` | ok |
| 4124 | `artemis:init.4th` | `0x8f1ba626b4fe297b` | ok |
| 4125 | `artemis:init.4th` | `0x8f1ba626b4fe297b` | ok |
| 4126 | `artemis:init.4th` | `0x8f1ba626b4fe297b` | ok |
| 4127 | `artemis:init.4th` | `0x8f1ba626b4fe297b` | ok |
| 4128 | `artemis:init.4th` | `0x8f1ba626b4fe297b` | ok |
| 4129 | `artemis:init.4th` | `0x8f1ba626b4fe297b` | ok |
| 4130 | `artemis:init.4th` | `0x8f1ba626b4fe297b` | ok |
| 4131 | `artemis:init.4th` | `0x8f1ba626b4fe297b` | ok |
| 4132 | `artemis:init.4th` | `0x8f1ba626b4fe297b` | ok |
| 4133 | `artemis:init.4th` | `0x8f1ba626b4fe297b` | ok |
| 4134 | `artemis:init.4th` | `0x8f1ba626b4fe297b` | ok |
| 4135 | `artemis:init.4th` | `0x8f1ba626b4fe297b` | ok |
| 4136 | `artemis:init.4th` | `0x8f1ba626b4fe297b` | ok |
| 4137 | `artemis:init.4th` | `0x8f1ba626b4fe297b` | ok |
| 4138 | `artemis:init.4th` | `0x8f1ba626b4fe297b` | ok |
| 4139 | `artemis:init.4th` | `0x8f1ba626b4fe297b` | ok |
| 4140 | `artemis:init.4th` | `0x8f1ba626b4fe297b` | ok |
| 4141 | `artemis:init.4th` | `0x8f1ba626b4fe297b` | ok |
| 4142 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4143 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4144 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4145 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4146 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4147 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4148 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4149 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4150 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4151 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4152 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4153 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4160 | `artemis:init.4th` | `0x8f1ba626b4fe297b` | ok |
| 4161 | `artemis:init.4th` | `0x8f1ba626b4fe297b` | ok |
| 4162 | `artemis:init.4th` | `0x8f1ba626b4fe297b` | ok |
| 4163 | `artemis:init.4th` | `0x8f1ba626b4fe297b` | ok |
| 4164 | `artemis:init.4th` | `0x8f1ba626b4fe297b` | ok |
| 4165 | `artemis:init.4th` | `0x8f1ba626b4fe297b` | ok |
| 4166 | `artemis:init.4th` | `0x8f1ba626b4fe297b` | ok |
| 4167 | `artemis:init.4th` | `0x8f1ba626b4fe297b` | ok |
| 4168 | `artemis:init.4th` | `0x8f1ba626b4fe297b` | ok |
| 4169 | `artemis:init.4th` | `0x8f1ba626b4fe297b` | ok |
| 4170 | `artemis:init.4th` | `0x8f1ba626b4fe297b` | ok |
| 4171 | `artemis:init.4th` | `0x8f1ba626b4fe297b` | ok |
| 4172 | `artemis:init.4th` | `0x8f1ba626b4fe297b` | ok |
| 4173 | `artemis:init.4th` | `0x8f1ba626b4fe297b` | ok |
| 4300 | `process.4th` | `0x781afc1dbd0294f7` | ok |
| 4301 | `process.4th` | `0x781afc1dbd0294f7` | ok |
| 4406 | `init-1.4th` | `0x63e251adb0a03613` | ok |
| 4415 | `init-1.4th` | `0x63e251adb0a03613` | ok |
| 4425 | `init-1.4th` | `0x63e251adb0a03613` | ok |
| 4435 | `init-1.4th` | `0x63e251adb0a03613` | ok |
| 4506 | `init-2.4th` | `0xf113b3d0bcccae47` | ok |
| 4515 | `init-2.4th` | `0xf113b3d0bcccae47` | ok |
| 4525 | `init-2.4th` | `0xf113b3d0bcccae47` | ok |
| 4535 | `init-2.4th` | `0xf113b3d0bcccae47` | ok |
| 4545 | `init-2.4th` | `0xf113b3d0bcccae47` | ok |
| 4606 | `init-3.4th` | `0x62b7a71576ad1041` | ok |
| 4615 | `init-3.4th` | `0x62b7a71576ad1041` | ok |
| 4625 | `init-3.4th` | `0x62b7a71576ad1041` | ok |
| 4635 | `init-3.4th` | `0x62b7a71576ad1041` | ok |
| 4645 | `init-3.4th` | `0x62b7a71576ad1041` | ok |
| 4655 | `init-3.4th` | `0x62b7a71576ad1041` | ok |
| 4665 | `init-3.4th` | `0x62b7a71576ad1041` | ok |
| 4706 | `init-9.4th` | `0x3f2bec73142aa424` | ok |
| 4715 | `init-9.4th` | `0x3f2bec73142aa424` | ok |
| 4725 | `init-9.4th` | `0x3f2bec73142aa424` | ok |
| 4735 | `init-9.4th` | `0x3f2bec73142aa424` | ok |
| 4745 | `init-9.4th` | `0x3f2bec73142aa424` | ok |
| 4806 | `init-l8-stable.4th` | `0xdc3830f189063a9a` | ok |
| 4810 | `init-l8-volatile.4th` | `0x98caabbbd92abac4` | ok |
| 4811 | `init-l8-volatile.4th` | `0x98caabbbd92abac4` | ok |
| 4812 | `init-l8-volatile.4th` | `0x98caabbbd92abac4` | ok |
| 4813 | `init-l8-volatile.4th` | `0x98caabbbd92abac4` | ok |
| 4820 | `init-l8-diverse.4th` | `0xaa293201a6c91838` | ok |
| 4821 | `init-l8-diverse.4th` | `0xaa293201a6c91838` | ok |
| 4822 | `init-l8-diverse.4th` | `0xaa293201a6c91838` | ok |
| 4830 | `init-l8-temporal.4th` | `0x51abd4c138246651` | ok |
| 4831 | `init-l8-temporal.4th` | `0x51abd4c138246651` | ok |
| 4840 | `init-l8-transition.4th` | `0xbcc1a81976f0a4c9` | ok |
| 4841 | `init-l8-transition.4th` | `0xbcc1a81976f0a4c9` | ok |
| 4842 | `init-l8-transition.4th` | `0xbcc1a81976f0a4c9` | ok |
| 4851 | `artemis:init.4th` | `0x8f1ba626b4fe297b` | ok |
| 4852 | `artemis:init.4th` | `0x8f1ba626b4fe297b` | ok |
| LBN | Capsule | xxHash64 | Status |
|-----|---------|----------|--------|
| 2049 | `init.4th` | `0x2f5b3bfa012e52c4` | ok |
| 2050 | `init.4th` | `0x2f5b3bfa012e52c4` | ok |
| 2051 | `init.4th` | `0x2f5b3bfa012e52c4` | ok |
| 2052 | `init.4th` | `0x2f5b3bfa012e52c4` | ok |
| 2053 | `init.4th` | `0x2f5b3bfa012e52c4` | ok |
| 2054 | `init.4th` | `0x2f5b3bfa012e52c4` | ok |
| 2055 | `init.4th` | `0x2f5b3bfa012e52c4` | ok |
| 2056 | `init.4th` | `0x2f5b3bfa012e52c4` | ok |
| 2057 | `init.4th` | `0x2f5b3bfa012e52c4` | ok |
| 2058 | `init.4th` | `0x2f5b3bfa012e52c4` | ok |
| 2059 | `init.4th` | `0x2f5b3bfa012e52c4` | ok |
| 2060 | `init.4th` | `0x2f5b3bfa012e52c4` | ok |
| 2061 | `init.4th` | `0x2f5b3bfa012e52c4` | ok |
| 2062 | `init.4th` | `0x2f5b3bfa012e52c4` | ok |
| 2063 | `init.4th` | `0x2f5b3bfa012e52c4` | ok |
| 2064 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok |
| 2065 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok |
| 2066 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok |
| 2067 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok |
| 2068 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok |
| 2069 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok |
| 2070 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok |
| 2071 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok |
| 2072 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok |
| 2073 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok |
| 2074 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok |
| 2075 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok |
| 2076 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok |
| 2077 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok |
| 2078 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok |
| 2079 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok |
| 2080 | `init-6.4th` | `0x06fc0ce1e369ef5a` | ok |
| 2081 | `init-6.4th` | `0x06fc0ce1e369ef5a` | ok |
| 2082 | `init-6.4th` | `0x06fc0ce1e369ef5a` | ok |
| 2083 | `init-6.4th` | `0x06fc0ce1e369ef5a` | ok |
| 2084 | `init-6.4th` | `0x06fc0ce1e369ef5a` | ok |
| 2085 | `init-6.4th` | `0x06fc0ce1e369ef5a` | ok |
| 2086 | `init-6.4th` | `0x06fc0ce1e369ef5a` | ok |
| 2087 | `init-6.4th` | `0x06fc0ce1e369ef5a` | ok |
| 2088 | `init-6.4th` | `0x06fc0ce1e369ef5a` | ok |
| 2089 | `init-6.4th` | `0x06fc0ce1e369ef5a` | ok |
| 2090 | `init-6.4th` | `0x06fc0ce1e369ef5a` | ok |
| 2091 | `init-6.4th` | `0x06fc0ce1e369ef5a` | ok |
| 2092 | `init-6.4th` | `0x06fc0ce1e369ef5a` | ok |
| 2093 | `init-6.4th` | `0x06fc0ce1e369ef5a` | ok |
| 2094 | `init-6.4th` | `0x06fc0ce1e369ef5a` | ok |
| 2095 | `init-6.4th` | `0x06fc0ce1e369ef5a` | ok |
| 2100 | `doe.4th` | `0xb6ecf5374e8ee77c` | ok |
| 2101 | `doe.4th` | `0xb6ecf5374e8ee77c` | ok |
| 2102 | `doe.4th` | `0xb6ecf5374e8ee77c` | ok |
| 2103 | `doe.4th` | `0xb6ecf5374e8ee77c` | ok |
| 2104 | `doe.4th` | `0xb6ecf5374e8ee77c` | ok |
| 2105 | `doe.4th` | `0xb6ecf5374e8ee77c` | ok |
| 2106 | `doe.4th` | `0xb6ecf5374e8ee77c` | ok |
| 2107 | `doe.4th` | `0xb6ecf5374e8ee77c` | ok |
| 2130 | `init-4.4th` | `0x89e3ef1db5ac0627` | ok |
| 2131 | `init-4.4th` | `0x89e3ef1db5ac0627` | ok |
| 2132 | `init-4.4th` | `0x89e3ef1db5ac0627` | ok |
| 2150 | `init-7.4th` | `0xb88df2efeb753d64` | ok |
| 2160 | `init-8.4th` | `0x714746312b72f83d` | ok |
| 2200 | `init-0.4th` | `0xd0a9550baf786bb3` | ok |
| 2201 | `init-0.4th` | `0xd0a9550baf786bb3` | ok |
| 4000 | `ACL.4th` | `0xd781d22148ff171d` | ok |
| 4001 | `ACL.4th` | `0xd781d22148ff171d` | ok |
| 4002 | `ACL.4th` | `0xd781d22148ff171d` | ok |
| 4003 | `ACL.4th` | `0xd781d22148ff171d` | ok |
| 4004 | `ACL.4th` | `0xd781d22148ff171d` | ok |
| 4005 | `ACL.4th` | `0xd781d22148ff171d` | ok |
| 4006 | `ACL.4th` | `0xd781d22148ff171d` | ok |
| 4007 | `ACL.4th` | `0xd781d22148ff171d` | ok |
| 4015 | `ACL.4th` | `0xd781d22148ff171d` | ok |
| 4016 | `zuse.4th` | `0x12f38ec782434a77` | ok |
| 4017 | `zuse.4th` | `0x12f38ec782434a77` | ok |
| 4018 | `zuse.4th` | `0x12f38ec782434a77` | ok |
| 4050 | `lib.4th` | `0x20625ebf1276c239` | ok |
| 4055 | `common:msg.4th` | `0xa99c5bcd3877f80e` | ok |
| 4060 | `doe-campaign.4th` | `0x3d4549142d91ec20` | ok |
| 4061 | `doe-campaign.4th` | `0x3d4549142d91ec20` | ok |
| 4062 | `doe-campaign.4th` | `0x3d4549142d91ec20` | ok |
| 4063 | `doe-campaign.4th` | `0x3d4549142d91ec20` | ok |
| 4064 | `doe-campaign.4th` | `0x3d4549142d91ec20` | ok |
| 4065 | `doe-campaign.4th` | `0x3d4549142d91ec20` | ok |
| 4100 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4101 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4102 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4103 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4104 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4105 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4106 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4107 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4108 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4109 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4110 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4111 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4112 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4113 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4114 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4115 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4116 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4117 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4118 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4119 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4120 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4121 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4122 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4123 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4124 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4125 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4126 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4127 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4128 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4129 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4130 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4131 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4132 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4133 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4134 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4135 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4136 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4137 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4138 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4139 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4140 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4141 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4142 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4143 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4144 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4145 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4146 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4147 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4148 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4149 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4150 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4151 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4152 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4153 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4160 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4161 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4162 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4163 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4164 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4165 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4166 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4167 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4168 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4169 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4170 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4171 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4172 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4173 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4174 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4175 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4176 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4300 | `process.4th` | `0x781afc1dbd0294f7` | ok |
| 4301 | `process.4th` | `0x781afc1dbd0294f7` | ok |
| 4406 | `init-1.4th` | `0x63e251adb0a03613` | ok |
| 4415 | `init-1.4th` | `0x63e251adb0a03613` | ok |
| 4425 | `init-1.4th` | `0x63e251adb0a03613` | ok |
| 4435 | `init-1.4th` | `0x63e251adb0a03613` | ok |
| 4506 | `init-2.4th` | `0xf113b3d0bcccae47` | ok |
| 4515 | `init-2.4th` | `0xf113b3d0bcccae47` | ok |
| 4525 | `init-2.4th` | `0xf113b3d0bcccae47` | ok |
| 4535 | `init-2.4th` | `0xf113b3d0bcccae47` | ok |
| 4545 | `init-2.4th` | `0xf113b3d0bcccae47` | ok |
| 4606 | `init-3.4th` | `0x62b7a71576ad1041` | ok |
| 4615 | `init-3.4th` | `0x62b7a71576ad1041` | ok |
| 4625 | `init-3.4th` | `0x62b7a71576ad1041` | ok |
| 4635 | `init-3.4th` | `0x62b7a71576ad1041` | ok |
| 4645 | `init-3.4th` | `0x62b7a71576ad1041` | ok |
| 4655 | `init-3.4th` | `0x62b7a71576ad1041` | ok |
| 4665 | `init-3.4th` | `0x62b7a71576ad1041` | ok |
| 4706 | `init-9.4th` | `0x3f2bec73142aa424` | ok |
| 4715 | `init-9.4th` | `0x3f2bec73142aa424` | ok |
| 4725 | `init-9.4th` | `0x3f2bec73142aa424` | ok |
| 4735 | `init-9.4th` | `0x3f2bec73142aa424` | ok |
| 4745 | `init-9.4th` | `0x3f2bec73142aa424` | ok |
| 4806 | `init-l8-stable.4th` | `0xdc3830f189063a9a` | ok |
| 4810 | `init-l8-volatile.4th` | `0x98caabbbd92abac4` | ok |
| 4811 | `init-l8-volatile.4th` | `0x98caabbbd92abac4` | ok |
| 4812 | `init-l8-volatile.4th` | `0x98caabbbd92abac4` | ok |
| 4813 | `init-l8-volatile.4th` | `0x98caabbbd92abac4` | ok |
| 4820 | `init-l8-diverse.4th` | `0xaa293201a6c91838` | ok |
| 4821 | `init-l8-diverse.4th` | `0xaa293201a6c91838` | ok |
| 4822 | `init-l8-diverse.4th` | `0xaa293201a6c91838` | ok |
| 4830 | `init-l8-temporal.4th` | `0x51abd4c138246651` | ok |
| 4831 | `init-l8-temporal.4th` | `0x51abd4c138246651` | ok |
| 4840 | `init-l8-transition.4th` | `0xbcc1a81976f0a4c9` | ok |
| 4841 | `init-l8-transition.4th` | `0xbcc1a81976f0a4c9` | ok |
| 4842 | `init-l8-transition.4th` | `0xbcc1a81976f0a4c9` | ok |
| 4851 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4852 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
## Conflicts
+23 -8
View File
@@ -263,6 +263,7 @@ VARIABLE S-IDX
VARIABLE S-STRIDE
VARIABLE S-CUR
VARIABLE S-ACTUAL
VARIABLE ART-STRESS-REP
Block 4161
( Trial record accessors )
: SLBN@ ( i -- lbn ) CELLS ART-STRESS-LBN + @ ;
@@ -274,7 +275,8 @@ Block 4172
( so it can be grepped like the DoE CSVs. Every )
( trial emits a row, pass or fail -- no silent skips. )
: SCSV-HEADER ( n -- )
." [ARTSTRESS] HEADER,n=" DUP . CR
." [ARTSTRESS] HEADER,rep=" ART-STRESS-REP @ .
." ,n=" DUP . CR
." [ARTSTRESS] trial,lbn,pat,result" CR ;
: SCSV-ROW ( -- )
." [ARTSTRESS] "
@@ -288,8 +290,8 @@ Block 4173
( its absence means the data is incomplete, full )
( stop, not "probably fine." )
: SCSV-SUMMARY ( -- )
." [ARTSTRESS] SUMMARY,"
ART-STRESS-N @ . ." ,"
." [ARTSTRESS] SUMMARY,rep=" ART-STRESS-REP @ .
." ," ART-STRESS-N @ . ." ,"
ART-STRESS-PASS @ . ." ,"
ART-STRESS-FAIL @ . CR ;
Block 4162
@@ -396,12 +398,25 @@ Block 4169
ART-STRESS-RUN ART-STRESS-REPORT
ART-STRESS-CLEANUP ;
: ART-STRESS ( -- ) 424242 50 ART-STRESS-TEST ;
Block 4174
( Campaign driver -- N independent replicate runs, )
( each a distinct seed, for statistical power )
( (Captain Bob: minimum 30 reps). Emits a CAMPAIGN )
( marker so analysis can auto-detect N from the log. )
30 CONSTANT ART-STRESS-NREPS
: ART-STRESS-SEED ( i -- seed ) 1009 * 424242 + ;
: ART-STRESS-CAMPAIGN ( -- )
." [ARTSTRESS] CAMPAIGN,nreps=" ART-STRESS-NREPS . CR
ART-STRESS-NREPS 0 DO
I ART-STRESS-REP !
I ART-STRESS-SEED 50 ART-STRESS-TEST
LOOP
." [ARTSTRESS] CAMPAIGN-DONE" CR ;
Block 4170
( Disabled by default -- uncomment to run the surface )
( stress test automatically at every boot. Normally )
( invoked manually instead: ART-STRESS or )
( <seed> <reps> ART-STRESS-TEST from the console. )
\ ART-STRESS
( TEMP: 30-replicate campaign enabled for the )
( K-invariant/heartbeat verification run. Revert to )
( "\ ART-STRESS" (disabled) once that run is done. )
ART-STRESS-CAMPAIGN
Block 4851
( Cheap touch target for Phase 3 fleet DoE workload -- O(1), )
( unlike ART-TICK/ART-STATUS which scan all ART-DATA-BLKS. )
@@ -0,0 +1,376 @@
# Artemis (and Hermes) Compudynamics — Implementation Plan
**Date:** 2026-08-02
**Branch:** `master`
**Status:** Plan approved in shape, **not final and not started.** Captain Bob
has more to discuss on the design before implementation begins — this document
is expected to change as a result. Do not treat it as settled, and do not
start coding from it as written. The six Open Questions are the known gaps;
the pending discussion may add or reframe others.
**Author:** Captain Bob / Claude Code
**Siblings:** `ARTEMIS-BLOCK-PHYSICS-DESIGN-20260708.md` (the decay-rate design
this implements), `HERMES-MESSAGE-CHANNEL-PHYSICS-DESIGN-20260708.md`,
`ARTEMIS-BAM-ACCEPTANCE-20260703.md` (which tracks the `ART-TICK heartbeat`
gap this closes), `VM-PHYSICS-DYNAMIC-FLEET-DESIGN-20260705.md` (pattern source).
---
## Preamble: how this plan came to be written
This plan exists because of a wasted day, and the failure is worth recording
so it isn't repeated.
On 2026-08-02 a 30-replicate Artemis surface-stress campaign was run across
all three architectures to confirm the `block_words.c` stale-pointer
cache-aliasing fix held at scale. It did: **4500 trials, zero failures,
amd64/aarch64/riscv64**. That result is real and stands.
While reviewing the campaign's heartbeat CSV, the assistant observed the
`hera_heat_q48` / `hermes_heat_q48` / `artemis_heat_q48` columns sitting
perfectly flat (`65536, 0, 0`) across all 51,092 ticks, concluded this was a
defect, and rebuilt the campaign driver to route every stress-test phase
through Hera via `VM-EXEC` so that fleet heat would move.
That was wrong three separate ways:
1. **Wrong metric.** Those columns are *VM-fleet* heat
(`capsule_vm_physics.c`, `vm_physics_heat_of()`). The quantity of interest
for Artemis is *block* heat (`BLK-HEAT` / `ART-K-TOTAL`). Different
mechanisms, no connection between them.
2. **Wrong method.** Manufacturing cross-VM calls to force a physics reading
is explicitly prohibited: `TRIPOD.md` — *"No VM manages another VM's
internal heartbeat"*, *"There is no 'send to the hottest VM.' That model is
wrong and must not be implemented"*; `capsule_vm_physics.h:35-37` — *"a
passive observer of VM activity, never a driver of it."*
3. **Wrong premise.** Block heat cannot move today under any workload,
because nothing ages it (see below). No amount of driving would have
produced a signal.
All three were avoidable by reading `.claude/TRIPOD.md` and `.claude/ARTEMIS.md`
completely before touching Tripod code — which both files instruct in their own
headers, and which `.claude/CLAUDE.md` also instructs. They were skimmed by
keyword instead. Keyword search cannot surface a prohibition, because
prohibitions do not contain the term you are searching for.
The capsule changes from that detour have been reverted. **Standing rule
going forward: read the governing documents in full before starting any major
piece of work in this repo.**
---
## The actual defect
Block heat and message heat do not decay. Not "decay incorrectly" — **do not
decay at all**, unless something manually calls a sweep word.
- `ART-TICK` (`ART-COOL ART-REAP`, `capsules/artemis/init.4th` block 4140) has
**zero call sites** anywhere in the tree — no C, no FORTH, no capsule.
- `HERMES-TICK` (`capsules/hermes/init.4th` block 4116) has **zero C call
sites**. Every caller is Hera poking it manually via `VM-EXEC`
(`capsules/init.4th` lines 31, 47, 66, 83, 130).
`BLK-HEAT@` and `MSG-HEAT@` read a stored number that nothing ages. Heat is
frozen between manual pokes — neither lazy nor scheduled, simply absent.
Consequences:
- Blocks never reap by cooling. `ART-REAP` frees blocks at heat exactly 0;
nothing ever brings a block to 0 except an explicit `BLK-FREE`.
- Message TTL never expires on its own, contradicting `HERMES.md`'s stated
model (*"A message that nobody answers simply cools to death"*).
- `Q-DECAY` (65208) is hardcoded and hand-copied into three separate capsules
(`artemis/init.4th`, `hermes/init.4th`, and the now-deleted
`compudynamics.4th`) with no shared derivation — flagged in the block
physics design doc as the "before" picture.
`ARTEMIS-BAM-ACCEPTANCE-20260703.md` already tracks this as a named deferred
item ("ART-TICK heartbeat — wire into compudynamic tick loop"). This plan
closes it.
---
## The governing model: mirror how words work
Per Captain Bob's direction: **word-level execution physics is the reference
implementation.** Messages decay on **TTL**; blocks decay on **access
frequency**. Two distinct behaviours, one shared mechanism shape.
The word model, verified in source, has four parts:
**1. Storage.** `DictPhysics` (`include/vm.h:257-268`) carries
`last_decay_tick`, commented in-source as *"the only clock Loop #3 decay
reads."* The two `*_ns` fields beside it are explicitly marked **diagnostics
only, never read for decay** — the residue of the wall-clock bug fixed in
`VM-FLEET-ATTRACTOR-DESIGN-20260705.md` rev t.
**2. Lazy decay at every access point.** `physics_pre_execute()`
(`src/physics_execution_hooks.c:85-89`), `physics_on_lookup()` (`:203-215`),
and the kernel's inline duplicates (`src/starkernel/vm/vm_core.c:676, 870,
880`) all do exactly this:
```c
uint64_t elapsed_ticks = vm->heartbeat.tick_count - word->physics.last_decay_tick;
physics_metadata_apply_linear_decay(word, elapsed_ticks, vm);
word->physics.last_decay_tick = vm->heartbeat.tick_count;
/* then accumulate: */
physics_execution_heat_increment(word);
```
**3. Bounded background sweep with a resumable cursor.**
`vm_tick_apply_background_decay()` (`src/starkernel/vm/vm_runtime.c:357-388`)
processes at most `HEARTBEAT_DECAY_BATCH` dictionary entries per tick and
stores `vm->heartbeat_decay_cursor_id` to resume on the next tick.
**This is the answer to "sweeping 22,998 blocks per tick is too expensive."**
An earlier fleet-DoE attempt stalled outright on exactly that cost. The word
engine never sweeps its whole space in one tick — it amortizes. Artemis must
do the same.
**4. Decay math.** `physics_metadata_apply_linear_decay()`
(`src/physics_metadata.c:320-386`): `decay = (elapsed_ticks * slope_q48) >> 16`,
subtractive, clamped at zero. The slope is adaptive (`vm->decay_slope_q48`,
tuned by Loop #6), and the whole path is gated by
`ssm_config->L3_linear_decay` so L8 can switch it off.
### Two model differences to resolve, not assume
| | Words today | Artemis today | Consequence |
|---|---|---|---|
| Decay shape | **linear** subtract | **multiplicative** (`heat * 65208/65536`) | Multiplicative approaches zero asymptotically but may never reach exactly 0 in Q48.16; `ART-REAP` fires only at exactly 0. |
| On access | **increments** heat | `BLK-FETCH` **resets** to `Q.1` | Reset is recency-only; increment is frequency-sensitive. Bob named *frequency* as the block signal. |
Recommendation: match the word model on both counts. Confirm first (O2, O4) —
this changes when blocks reap.
---
## Design decisions
### D1. Block heat becomes C-side state
Today `BLK-HEAT` is a FORTH `CREATE ... ALLOT` array (block 4137, marked
immutable in `MANIFEST.md`). Word heat by contrast lives in C
(`DictEntry.execution_heat` + `DictPhysics`), with FORTH words reading it.
Mirror that. Block heat plus `last_decay_tick` move into
`src/starkernel/capsule/artemis_heat_physics.c`, with FORTH primitives for the
observational surface.
This is the decision that makes everything else fall out: the background sweep
becomes plain C called from `vm_tick()`, and **no C→FORTH bridge is required.**
That matters more than it might appear. **A mechanism for C to invoke a named
FORTH word on a tick does not exist in this codebase** — there is no
`vm_execute_word_by_name`, and `capsule_vm_hooks.c` carries only birth-time
hooks (exec, dict-hash, vm-alloc). Building one would be a substantial new
mechanism with its own risks. This design avoids needing it.
Per the ruling recorded in `VM-FLEET-ATTRACTOR-DESIGN-20260705.md` rev s —
*"TRIPOD.md's/ARTEMIS.md's 'StarForth dialect ONLY' applies to a thin
administrative/observational word surface; the underlying mechanics are meant
to be C99"* — this is in bounds. **Confirm the ruling still holds (O5);** D1
depends entirely on it.
### D2. Each VM's own heartbeat tick is the clock
`HeartbeatState` is embedded per-VM (`include/vm.h:280-298`). `tick_count`
advances only from `vm_tick()`, driven by that VM's own word executions
(`src/physics_execution_hooks.c:172-177`). Artemis's blocks therefore age on
Artemis's own tick. No cross-VM coupling, nothing injected, nothing to drive.
One clock, as the standing rule requires.
**Known consequence:** an idle VM does not tick, so its blocks and messages do
not age. For words this is explicitly intentional and documented as such. For
**messages it is a genuine problem** — a TTL that stops while Hermes is idle
is not a TTL. See O3.
### D3. The insertion point already exists
`vm_tick()` (`src/starkernel/vm/vm_runtime.c:145-149`) carries two
commented-out "future plugin" slots. That is the natural home for
`artemis_heat_tick()` and later `hermes_heat_tick()`.
---
## Phase 1 — Artemis block heat
**Goal:** block heat ages against Artemis's heartbeat, accumulates on access,
and reaps at zero, with an inferred slope replacing the hardcoded constant.
1. **New kernel-only files** (`#ifdef __STARKERNEL__`), following
`capsule_vm_physics.c`'s established shape:
- `include/starkernel/artemis_heat_physics.h`
- `src/starkernel/capsule/artemis_heat_physics.c`
State: per-block `{ heat_q48, last_decay_tick }` across `ART-DATA-BLKS`
(22,998 entries), plus the `ArtemisHeatWindow` the design doc specifies —
`ArtemisHeatSample { uint32_t live_count; uint32_t reaped_since_last; }`,
`ARTEMIS_HEAT_WINDOW_DEPTH` proposed 64.
2. **Lazy decay on access** — resolve heat at `BLK-FETCH` / `BLK-HEAT@` with
the exact `elapsed_ticks` pattern above, then apply the accumulation term.
3. **Bounded sweep**`artemis_heat_tick()`, called from `vm_tick()`, gated
to Artemis's VM, processing a fixed batch per tick with a resumable cursor.
Mirror `vm_tick_apply_background_decay()` directly. This is what allows
reap to happen at all without an O(n) stall.
4. **Adaptive slope**`blk_decay_slope_q48` fit from the window; when the
window is unwarmed, **skip the update rather than substituting a default**
(the discipline both existing engines use, and the specific trap that
froze VM-fleet physics at zero twice — see rev l and rev m of the fleet
doc).
5. **New FORTH primitives**`BLK-DECAY-SLOPE@`, plus a status word
mirroring `VM-PHYSICS-STATUS`. Registration pattern is
`void (*)(VM *vm)` + `register_word(vm, "NAME", fn)`; see
`src/word_source/q48_words.c:76,204` for the minimal example and
`mama_forth_words.c:1091` for the kernel/MAMA variant (note it registers
into both the FORTH and MAMA vocabularies — follow that duplication).
6. **Capsule changes**`ART-COOL` (block 4139) stops being a full sweep;
`ART-TICK` (block 4140) is retained for manual diagnostics. Both blocks are
editable — the hard-locked set is 41104113 plus 4128 and 4137. Any new
blocks belong in **42004299** (genuinely unclaimed; 41754199 is nominally
Hermes extension space).
### Available Q48.16 vocabulary
`Q.+ Q.- Q.* Q./ Q.ABS Q.NEG Q.LOG Q.EXP Q.SQRT Q.FROM-INT Q.TO-INT Q.1 Q.0
Q.SCALE Q.= Q.< Q.> Q.0= Q.MAX Q.MIN Q.PRINT` — all registered from
`src/word_source/q48_words.c:200-223`. There is **no** `Q.MOD` or remainder
word; if decay must be exactly conservative, that arithmetic has to come from
C. (Note `src/word_source/q48_16_words.c` exists but has no register function
and is not referenced by `word_registry.c` — dead code, do not follow it.)
---
## Phase 2 — Hermes message and channel heat
Same mechanism, after Artemis is proven. Per
`HERMES-MESSAGE-CHANNEL-PHYSICS-DESIGN-20260708.md`: `hermes_heat_physics.c`,
primitives `MSG-DECAY-SLOPE@` / `CH-DECAY-SLOPE@`, sampling hooked at
`MSG-COOL-ALL` (block 4108) and `CH-COOL-ALL` (block 4114).
**Behavioural difference from blocks:** messages are pure TTL — born hot,
decay only, never refreshed on access. No accumulation term. That is the whole
distinction Bob drew between the two.
**Correct that design doc before implementing it.** It proposes calling
`hermes_heat_tick()` from *"`HERMES-TICK`'s existing heartbeat path"* and
contrasts this against Artemis as having the harder problem for lacking one.
**That premise is false** — verified 2026-08-02: `HERMES-TICK` has no
heartbeat path either. Both VMs are in identical positions, and the doc's
sizing of the two efforts is wrong as written.
Message nodes are 8 cells (`HERMES.md:305-313`) with heat at cell 5. A
`last_decay_tick` needs either a 9th cell or C-side storage — C-side, per D1.
---
## Phase 3 — K participation (deferred; needs design, not wiring)
`.claude/ARTEMIS.md` requires that blocks participate in K≡1.0: *"Every
logical block's heat contributes to Artemis's K total. Reap must credit K
back. Alloc must charge K correctly."* Today nothing does, and closing it is
not a small job:
- **The current model is not conservative by construction.** `BLK-ALLOC` and
`BLK-FETCH` mint `Q.1` from nothing, `ART-COOL` destroys heat, `BLK-FREE`
zeroes it. 22,998 blocks at `Q.1` sums to 22,998.0, not 1.0.
- **`K-FLEET`, `K-LOCAL@`, and `K-CONSERVED?` no longer exist** — deleted in
commit `9323f776` along with `fleet-k.4th` and `compudynamics.4th`. The BAM
acceptance doc's "wire `ART-K-TOTAL` into `K-FLEET`" item refers to words
that are gone. Fleet conservation today is C-side only
(`vm_physics_conserved()`, 5% tolerance, `capsule_vm_physics.c:456`).
- Proper normalization is the **Logical BAM**, which is `FUTURE MATERIAL` in
`ARTEMIS.md` and gated behind Captain Bob explicitly reopening it.
Contrast with VM-fleet physics, which *is* conservative by construction via a
single balanced primitive `vm_physics_transfer(from, to, amount)` — the sum
invariant holds by induction rather than by enforcement. Blocks have no
equivalent primitive. Designing one is real work.
**Stale text to fix:** `VM-PHYSICS-DYNAMIC-FLEET-DESIGN-20260705.md`'s
"Fold-in question" section states that conservation does *not* generalize to
messages or blocks. The 2026-07-09 corrections on both sibling docs overturn
this, citing `.claude/ARTEMIS.md` and `.claude/HERMES.md` as authoritative.
The corrections win; the stale passage should be amended so it stops
contradicting them.
---
## Open questions — answer before writing code
**O1.** `Q-DECAY` lives in block **4110, marked ★ HARD LOCKED** in
`MANIFEST.md`. The block physics design doc says delete it. The manifest says
don't touch that block. Which wins — delete, or leave it and shadow it?
**O2.** Linear-subtractive or multiplicative decay for blocks? The word model
is linear; Artemis is currently multiplicative. This determines whether reap
ever fires.
**O3.** Idle-VM TTL. If Hermes executes no words it accrues no ticks, so
messages never expire. Accept this (TTL means "ticks of that VM's own
execution"), or does message aging need a different clock source? Note that
any answer involving a second clock conflicts with the one-clock rule.
**O4.** `BLK-FETCH` currently *resets* heat to `Q.1`. Change to increment
(frequency-sensitive, matches words, matches "how frequently" as the stated
signal) or keep reset (recency-only)?
**O5.** Confirm the C99-mechanics / FORTH-surface split still holds. D1 —
and therefore the whole no-bridge-needed argument — depends on it.
**O6.** `ARTEMIS_HEAT_WINDOW_DEPTH` (proposed 64) and the concrete slope-fit
function are both explicitly unresolved in the design docs. Start with the
proposed values and instrument, or settle them up front?
---
## Known risk
`ARTEMIS-BAM-ACCEPTANCE-20260703.md` records an **unfixed riscv64
heartbeat/compile race**: identical binaries alternately pass and fail
`TRIPOD-TEST` with `execute_colon_word: NULL cell in 'K-PUSH' after
'(start)'`, discriminated by boot-time heartbeat tick alignment (DoE row 59
reading `...,107,10,33,...` passing versus `...,107,9,32,...` failing).
This plan adds work inside `vm_tick()`, which shifts tick alignment. **Expect
to encounter this race.** It was reported and never fixed — "awaiting Captain
Bob's direction."
---
## Verification
1. `build/tools/mkcapsule --lint capsules` → 26 files, 0 violations.
2. Hosted build clean, zero warnings under `-Wall -Werror`.
3. Three-arch QEMU acceptance — `make -f Makefile.starkernel ARCH=<arch> clean
qemu` for amd64, aarch64, riscv64, one at a time, foreground. This is the
only acceptance authority for kernel changes.
4. **Behavioural proof that decay is live:** allocate blocks, execute
unrelated Artemis words to advance Artemis's own tick count *without ever
calling `ART-TICK` manually*, then confirm heat has dropped and cold blocks
have reaped. This is impossible today — nothing ages — so it is a genuine
discriminator.
5. **Slope responds to real churn** (the design doc's own test): drive block
churn at two different rates across separate boots and confirm
`blk_decay_slope_q48` converges to different values rather than sitting at
its seed.
6. **`dict_hash` must stay byte-identical across all three architectures.**
Established baseline: Hera `0x83c2c109100e2ed6`, Artemis
`0x5284ea5cd0f9983c`, Hermes `0x4159dcb326d79759`, Mama
`0xc88c3c1db6ef601b`. Any divergence means a wall-clock dependency has
crept in — precisely the bug class rev t of the fleet doc fixed.
## Not in scope
- Logical BAM / Physical BAM split, thermal zones (Phase 3 blocker,
`FUTURE MATERIAL`, requires explicit reopening)
- ACL Phase 8 / PKI — standing instruction is **STOP before starting**
- Any commit without Captain Bob asking for one
---
*Governing documents for this work, to be read completely before starting:*
`.claude/ARTEMIS.md`, `.claude/TRIPOD.md`, `.claude/HERMES.md`,
`.claude/CLAUDE.md`, and the four sibling design docs named in the header.
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff