item 4.6: fix Stadium quota-grant ordering; fix aarch64 PSCI SYSTEM_RESET function ID

Artemis's 30-rep surface stress campaign was failing 100% of trials on all
three architectures: stadium_grant_quota() ran after IDENTITY exec in
capsule_birth.c, but Artemis's init.4th auto-runs the stress campaign as
part of that same IDENTITY exec, so every STADIUM-ADMIT call during it hit
a nonexistent quota slot and refused unconditionally. Moved the grant call
before IDENTITY exec. Verified 30/30 reps PASS on amd64, aarch64, and
riscv64 post-fix (was 30/30 FAIL on all three pre-fix).

Also fixed an independent, real bug found during the same acceptance pass:
aarch64's arch_cold_reset() issued PSCI SYSTEM_RESET using the SMC64
calling convention (0xC4000009), which is not a valid PSCI function ID --
SYSTEM_RESET has no SMC64 variant. Corrected to the SMC32 encoding
(0x84000009). This did not resolve the separate aarch64 BYE cold-restart
exception also found in this pass (root cause not yet found, tested and
refuted an interrupt-race hypothesis, documented in FABRIC-2.md Section I
for follow-up) but is a genuine spec fix worth keeping regardless.

Full writeup, evidence, and the still-open aarch64 crash investigation in
FABRIC-2.md Sections H and I.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Robert Allan James
2026-08-18 14:53:18 -04:00
co-authored by Claude Sonnet 5
parent 48ab9945de
commit 8d90538801
29 changed files with 1507970 additions and 164 deletions
+49 -43
View File
@@ -1,5 +1,5 @@
# Capsule Block Manifest — Auto-generated
<!-- Generated by mkcapsule --manifest 2026-08-15T13:36:13Z -->
<!-- Generated by mkcapsule --manifest 2026-08-18T18:07:32Z -->
<!-- DO NOT EDIT — re-run mkcapsule --manifest to refresh. -->
<!-- Hand-written justifications and immutability notes live -->
<!-- in MANIFEST.md alongside this auto-generated index. -->
@@ -9,7 +9,7 @@
| 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, 4851, 4852 | `0xc9e92cd18f4c7b49` |
| `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, 4177, 4178, 4179, 4180, 4181, 4182, 4851, 4852 | `0x2d2c57ec0cb5ec18` |
| `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` |
@@ -122,10 +122,10 @@
| 4107 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
| 4108 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
| 4109 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
| 4110 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4111 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4112 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4113 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4110 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4111 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4112 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4113 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4114 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
| 4115 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
| 4116 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
@@ -134,26 +134,26 @@
| 4119 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
| 4120 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
| 4121 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
| 4122 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4123 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4124 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4125 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4126 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4127 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4128 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4129 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4130 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4131 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4132 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4133 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4134 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4135 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4136 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4137 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4138 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4139 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4140 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4141 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4122 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4123 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4124 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4125 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4126 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4127 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4128 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4129 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4130 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4131 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4132 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4133 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4134 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4135 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4136 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4137 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4138 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4139 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4140 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4141 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4142 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
| 4143 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
| 4144 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
@@ -172,23 +172,29 @@
| 4157 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
| 4158 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
| 4159 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
| 4160 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4161 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4162 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4163 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4164 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4165 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4166 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4167 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4168 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4169 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4170 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4171 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4172 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4173 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4174 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4160 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4161 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4162 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4163 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4164 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4165 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4166 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4167 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4168 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4169 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4170 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4171 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4172 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4173 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4174 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4175 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
| 4176 | `hermes:init.4th` | `0x85c7b311d1e5bf97` | ok |
| 4177 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4178 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4179 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4180 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4181 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4182 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4200 | `user-font-demo.4th` | `0xce1fd7d1b581a56d` | ok |
| 4201 | `user-font-demo.4th` | `0xce1fd7d1b581a56d` | ok |
| 4202 | `user-font-demo.4th` | `0xce1fd7d1b581a56d` | ok |
@@ -228,8 +234,8 @@
| 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` | `0xc9e92cd18f4c7b49` | ok |
| 4852 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4851 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4852 | `artemis:init.4th` | `0x2d2c57ec0cb5ec18` | ok |
| 4900 | `fabric.4th` | `0x9b1d061339cea98d` | ok |
| 4901 | `fabric.4th` | `0x9b1d061339cea98d` | ok |
| 4902 | `fabric.4th` | `0x9b1d061339cea98d` | ok |
+83 -23
View File
@@ -9,6 +9,13 @@ Block 4110
3076 CONSTANT ART-DATA-LBN
22998 CONSTANT ART-DATA-BLKS
65208 CONSTANT Q-DECAY
Block 4178
( item 4.6 -- StadiumBehaviour tags, match stadium.h. )
0 CONSTANT SB-MIGRATE
1 CONSTANT SB-DELIVER
2 CONSTANT SB-EXPIRE
3 CONSTANT SB-COOL
-1 CONSTANT STADIUM-NONE
Block 4111
( Arch-neutral little-endian byte I/O -- 32-bit )
: LE32! ( u addr -- )
@@ -55,13 +62,38 @@ Block 4113
: FM-CLR ( n -- )
FM-ADDR-BIT DUP C@ ROT BIT-CLR SWAP C! UPDATE ;
Block 4137
( Block heat arena -- Q48.16 heat per data block slot )
CREATE BLK-HEAT ART-DATA-BLKS CELLS ALLOT
( item 4.6 -- Stadium cell-index arena, not a heat arena. One )
( slot per possible LBN, holding STADIUM-NONE or a live cell )
( index -- residency exists only while a block is allocated )
( (admission-on-allocate, FABRIC-2.md item 4.6's ruling). )
CREATE BLK-CELL ART-DATA-BLKS CELLS ALLOT
Block 4138
( Block heat accessors and LBN conversion )
: BLK-HEAT@ ( n -- q48 ) CELLS BLK-HEAT + @ ;
: BLK-HEAT! ( q48 n -- ) CELLS BLK-HEAT + ! ;
( Cell-index accessors and LBN conversion. Heat itself now )
( lives on the Stadium -- see BLK-ADMIT/STADIUM-HEAT@/! below. )
: BLK-CELL@ ( n -- cell ) CELLS BLK-CELL + @ ;
: BLK-CELL! ( cell n -- ) CELLS BLK-CELL + ! ;
: LBN>IDX ( lbn -- n ) ART-DATA-LBN - ;
Block 4177
( item 4.6 -- Stadium admission for index n; see 4179. )
VARIABLE BLK-ADMIT-IDX
: BLK-ADMIT ( n -- flag )
BLK-ADMIT-IDX !
Q.1 STADIUM-RES-PULL
BLK-ADMIT-IDX @ SWAP DUP >R
SB-COOL STADIUM-ADMIT
DUP STADIUM-NONE = IF
DROP R> STADIUM-RES-PUSH FALSE EXIT
THEN
R> DROP
BLK-ADMIT-IDX @ BLK-CELL!
BLK-ADMIT-IDX @ FM-SET
TRUE ;
Block 4179
( item 4.6 -- init BLK-CELL[] all-free (STADIUM-NONE). )
: BLK-CELL-INIT-FREE ( -- )
ART-DATA-BLKS 0 DO
STADIUM-NONE I BLK-CELL!
LOOP ;
Block 4122
( Block allocator -- first-free linear scan )
( NOTE: Hermes owns 4100-9,4114-21,4142+. Artemis resumes 4122 )
@@ -71,13 +103,18 @@ Block 4122
LOOP -1 ;
: BLK-ALLOC ( -- lbn|-1 )
FM-FIND-FREE DUP -1 = IF EXIT THEN
DUP FM-SET Q.1 OVER BLK-HEAT! ART-DATA-LBN + ;
DUP BLK-ADMIT 0= IF DROP -1 EXIT THEN
ART-DATA-LBN + ;
Block 4180
( item 4.6 -- BLK-FREE evicts the Stadium cell too. )
: BLK-FREE ( lbn -- )
ART-DATA-LBN -
DUP 0 < IF DROP EXIT THEN
DUP ART-DATA-BLKS >= IF DROP EXIT THEN
DUP FM-TEST 0= IF DROP EXIT THEN
DUP FM-CLR 0 SWAP BLK-HEAT! ;
DUP FM-CLR
DUP BLK-CELL@ STADIUM-EVICT DROP
STADIUM-NONE SWAP BLK-CELL! ;
Block 4123
( Artemis magic and blank detection )
( Magic = "ARTEMIS\0" = 41 52 54 45 4D 49 53 00 )
@@ -122,7 +159,7 @@ Block 4124
DROP ART-UNRECOG-DISK ;
: BLK-FETCH ( lbn -- addr )
DUP ART-DATA-LBN >= IF
DUP LBN>IDX Q.1 SWAP BLK-HEAT! THEN
DUP LBN>IDX BLK-CELL@ Q.1 SWAP STADIUM-HEAT! THEN
BLOCK ;
: BLK-PERSIST ( lbn -- ) BLOCK DROP UPDATE ;
: ART-FLUSH ( -- ) FLUSH ;
@@ -159,7 +196,7 @@ Block 4131
( ART-INIT -- boot state machine )
VARIABLE ART-BOOT-MODE
: ART-INIT ( -- )
BLK-HEAT ART-DATA-BLKS CELLS 0 FILL
BLK-CELL-INIT-FREE
ART-BOOT-DETECT DUP ART-BOOT-MODE !
CASE
ART-BLANK-DISK OF ART-FORMAT ENDOF
@@ -167,21 +204,31 @@ VARIABLE ART-BOOT-MODE
ART-UNRECOG-DISK OF ART-HALT-UNRECOG ENDOF
ENDCASE ;
Block 4139
( Fleet K total and block cooling )
( item 4.6 -- K total, skips non-resident (STADIUM-NONE). )
: ART-K-TOTAL ( -- q48 )
0 ART-DATA-BLKS 0 DO I BLK-HEAT@ + LOOP ;
0 ART-DATA-BLKS 0 DO
I BLK-CELL@ DUP STADIUM-NONE <> IF
STADIUM-HEAT@ +
ELSE
DROP
THEN
LOOP ;
Block 4181
( item 4.6 -- cooling, routed via Stadium residency. )
: ART-COOL ( -- )
ART-DATA-BLKS 0 DO
I BLK-HEAT@ DUP 0 > IF
Q-DECAY Q.* I BLK-HEAT!
ELSE DROP THEN
I BLK-CELL@ DUP STADIUM-NONE <> IF
DUP STADIUM-HEAT@ Q-DECAY Q.* SWAP STADIUM-HEAT!
ELSE
DROP
THEN
LOOP ;
Block 4140
( Block reap and compudynamic tick )
: ART-REAP ( -- )
ART-DATA-BLKS 0 DO
I FM-TEST IF
I BLK-HEAT@ 0 = IF
I BLK-CELL@ STADIUM-HEAT@ 0 = IF
I ART-DATA-LBN + BLK-FREE
THEN
THEN
@@ -189,10 +236,14 @@ Block 4140
: ART-TICK ( -- )
ART-COOL ART-REAP ;
Block 4127
( Status )
( Status. item 4.6: ARTEMIS-K mirrors HERMES-K -- block )
( heat + reservoir + word-execution residents. )
: ARTEMIS-K ( -- q48 )
ART-K-TOTAL STADIUM-RES@ + STADIUM-WORD-HEAT + ;
: ART-STATUS ( -- )
." Artemis: " ART-DATA-BLKS . ." data blocks" CR
." K-total=" ART-K-TOTAL Q.PRINT CR ;
." K-total=" ART-K-TOTAL Q.PRINT CR
." ARTEMIS-K=" ARTEMIS-K Q.PRINT CR ;
: WELCOME ( -- ) ." Artemis ready" CR ART-STATUS ;
Block 4132
( Self-test: alloc/fetch/persist/free round-trip )
@@ -242,7 +293,7 @@ Block 4136
Block 4141
( Artemis CD-INIT -- Hera calls this at fleet boot )
: CD-INIT ( -- )
BLK-HEAT ART-DATA-BLKS CELLS 0 FILL
BLK-CELL-INIT-FREE
LOG-INFO" Artemis: ready" ;
Block 4133
( Artemis entry -- runs at capsule load )
@@ -319,23 +370,32 @@ Block 4171
UNTIL
S-CUR @ ;
Block 4163
( Write one trial: alloc a fresh random free block, )
( tag it with a trial-derived pattern, and persist )
( it through the real BLK-ALLOC-style path. )
( Write one trial. item 4.6: admission can now be refused )
( -- sentinel LBN=-1 on refusal, no unreserved write. )
: SWRITE1 ( -- )
SPICK S-IDX !
S-IDX @ FM-SET
Q.1 S-IDX @ BLK-HEAT!
S-IDX @ BLK-ADMIT 0= IF
-1 S-I @ SLBN! 0 S-I @ SPAT! EXIT
THEN
S-IDX @ ART-DATA-LBN + S-I @ SLBN!
S-I @ 255 AND S-I @ SPAT!
S-I @ SLBN@ BLK-FETCH
1024 S-I @ SPAT@ FILL
S-I @ SLBN@ BLK-PERSIST ;
Block 4182
( item 4.6 -- admit-refused trial: count + log + emit row. )
: SV-REFUSED ( -- )
1 ART-STRESS-FAIL +!
-1 S-ACTUAL !
." STRESS ADMIT-REFUSED trial=" S-I @ . CR
SCSV-ROW ;
Block 4164
( Verify one trial: by now the 8-slot devblock cache )
( has likely evicted and reloaded this block many )
( times over -- a real round trip, not a cache hit. )
( item 4.6: LBN=-1 means admission was refused; see 4182. )
: SVERIFY1 ( -- )
S-I @ SLBN@ -1 = IF SV-REFUSED EXIT THEN
S-I @ SLBN@ BLK-FETCH C@ S-ACTUAL !
S-ACTUAL @ S-I @ SPAT@ = IF
1 ART-STRESS-PASS +!