Skip to content

Commit 88bb3d2

Browse files
committed
Say nine on the roster, because it is nine now
Rostering the four BENCH_* Safes so they could reach their own scenarios took the opt-in list from five to nine, and README.md still said five. Same defect class as the two caught earlier today, introduced by the same mechanism: the data changed and the prose did not. It now says nine and says why, and notes that HERO_B stays off deliberately as the witness that the guard fires. Also corrected the seed.mjs row in the repo map. It claimed govern exists because threshold-drift and owner-removed need a config change, which was true when it was written and stopped being true an hour later: those two outcomes turned out to be unproducible, and govern's useful action is now approve-hash.
1 parent 32b64c4 commit 88bb3d2

2 files changed

Lines changed: 13 additions & 2 deletions

File tree

‎README.md‎

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,11 @@ KeeperHub's own `simulate: true` preflight.
291291
Also standing up:
292292

293293
- **12 Safes deployed and funded** on Ethereum Sepolia from one manifest, CREATE2-deterministic —
294-
thresholds 1-of-2 through 3-of-5, five of them on the opt-in roster.
294+
thresholds 1-of-2 through 3-of-5, **nine of them on the opt-in roster**. That was five until
295+
2026-09-09: the four `BENCH_*` Safes each exist to demonstrate one named refusal, and none of
296+
them could, because `not-on-roster` is the FIRST check in `assemble.mjs` and a `roster:false`
297+
Safe refuses on the roster gate before reaching its own scenario. `HERO_B` stays off the roster
298+
deliberately — it carries `assertNotOnRoster` and is the witness that the guard fires.
295299
- **The volume loop recycles, and you should know that when reading any execution count.** Every
296300
Safe swept is one we deployed, and the payouts they queue are ours — this is *mechanism* volume,
297301
never summed with third-party volume. Value used to flow O1 -> Safe -> PAYEE exactly once, and
@@ -460,7 +464,7 @@ refusing correctly is a success, not an error.
460464
| [`src/assemble.mjs`](src/assemble.mjs) | The entire decision surface. Pure, zero deps, zero I/O. Injected verbatim into the workflow's Code node by `sync.mjs`, so canvas and repo cannot drift |
461465
| [`src/manifest.json`](src/manifest.json) | The 12-Safe cast + per-chain constants. `receiptsEligible` is load-bearing |
462466
| [`src/roster.json`](src/roster.json) | The opt-in list. Derived from the manifest by `seed.mjs roster`, never hand-kept |
463-
| [`scripts/seed.mjs`](scripts/seed.mjs) | `status` · `predict` · `deploy` · `fund` · `stage` · `roster` · `govern`. Stages the conditions. `stage --hostile <variant>` builds a queue shaped to force ONE named refusal; `govern` is the only subcommand that spends gas on something other than a payout, because threshold-drift and owner-removed require the Safe's own configuration to change |
467+
| [`scripts/seed.mjs`](scripts/seed.mjs) | `status` · `predict` · `deploy` · `fund` · `stage` · `roster` · `govern`. Stages the conditions. `stage --hostile <variant>` builds a queue shaped to force ONE named refusal; `govern` is the only subcommand that spends gas on something other than a payout — `approve-hash` produces the unverified `v=1` word that outcome 3 refuses, and the two config actions are kept for the record even though the service normalises both outcomes away |
464468
| [`scripts/drain.mjs`](scripts/drain.mjs) | assemble → local `eth_call` → KeeperHub `simulate` → Direct Execution |
465469
| [`scripts/verify-assemble.mjs`](scripts/verify-assemble.mjs) | The pure function against a live queue; `--write-fixture` turns today's response into a regression test |
466470
| [`scripts/sync.mjs`](scripts/sync.mjs) | Emits the workflow JSON per chain (Safe plugin reads on 8453, `web3/read-contract` on testnets — see DX-6) |

‎docs/outcomes-11155111.jsonl‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,10 @@
2121
{"at": "2026-09-09T11:24:16.169Z", "chainId": "11155111", "safe": "0xF398d60b70bC0C5FDEE5a770C26e024CEF32CB0c", "outcome": "raced-gs026", "class": "refusal", "taxonomyIndex": 8, "decidedBy": "chain", "stage": "broadcast", "detail": "{\"executionId\":\"yhak2pfniragtz0x8we15\",\"status\":\"failed\",\"error\":\"Contract call failed: Error(GS026)\"}", "executionId": "yhak2pfniragtz0x8we15", "tx": null, "queueCount": 1, "nonce": "1", "threshold": "1", "receiptsEligible": false, "$note": "reclassified from broadcast-no-hash by the fix in this same commit; the row is the original observation, the label was wrong"}
2222
{"at": "2026-09-09T11:24:16.169Z", "chainId": "11155111", "safe": "0xF398d60b70bC0C5FDEE5a770C26e024CEF32CB0c", "outcome": "executed", "class": "execution", "taxonomyIndex": null, "decidedBy": "runner", "stage": "broadcast", "detail": null, "executionId": "mrlwf9n1qoa8lxydeflqq", "tx": "0x399a50d879c032a1fb8cf77a84d2630a779f15b8d950c6847472cb995506a313", "queueCount": 1, "nonce": "1", "threshold": "1", "receiptsEligible": false}
2323
{"at":"2026-09-09T12:59:59.747Z","chainId":"11155111","safe":"0x83f8ae4B3d322bD7cF0840717eDc1660AC120024","outcome":"eip1271-unsupported","class":"refusal","taxonomyIndex":3,"decidedBy":"assemble","stage":"assemble","detail":"Confirmation from 0x20A5EdcDB3bf0587545De423cdd8Ba94c7D0D754 is APPROVED_HASH; gavel splices EOA/eth_sign signatures only.","executionId":null,"tx":null,"queueCount":1,"nonce":"0","threshold":"2","receiptsEligible":false}
24+
{"at":"2026-09-09T13:02:05.433Z","chainId":"11155111","safe":"0x4Aa905241654D1aD67F23dE95Ec5de1ac406037b","outcome":"not-on-roster","class":"guard","taxonomyIndex":null,"decidedBy":"assemble","stage":"assemble","detail":"Safe 0x4Aa905241654D1aD67F23dE95Ec5de1ac406037b is not on the opt-in roster; refusing to execute against it.","executionId":null,"tx":null,"queueCount":0,"nonce":"0","threshold":"2","receiptsEligible":false}
25+
{"at":"2026-09-09T13:02:06.249Z","chainId":"11155111","safe":"0x11C20c253fDfBA4481C96faaCdE9Ad66438690d0","outcome":"below-threshold","class":"refusal","taxonomyIndex":2,"decidedBy":"assemble","stage":"assemble","detail":"1 of 2 required signatures present.","executionId":null,"tx":null,"queueCount":1,"nonce":"37","threshold":"2","receiptsEligible":false}
26+
{"at":"2026-09-09T13:02:07.466Z","chainId":"11155111","safe":"0x545618b334A23e942c7BC2Cd018eBa66bfDBDaaB","outcome":"refund-requested","class":"refusal","taxonomyIndex":4,"decidedBy":"assemble","stage":"assemble","detail":"Refund parameters set (gasPrice=1, gasToken=0x0000000000000000000000000000000000000000, refundReceiver=0x0000000000000000000000000000000000000000); refusing — this is a drain vector aimed at the executor.","executionId":null,"tx":null,"queueCount":1,"nonce":"37","threshold":"2","receiptsEligible":false}
27+
{"at":"2026-09-09T13:02:08.490Z","chainId":"11155111","safe":"0xe1273328800BeFA0ba234b6142C3077EB36E6598","outcome":"delegatecall-refused","class":"refusal","taxonomyIndex":5,"decidedBy":"assemble","stage":"assemble","detail":"operation=1 is a DELEGATECALL; gavel executes CALL only.","executionId":null,"tx":null,"queueCount":1,"nonce":"37","threshold":"3","receiptsEligible":false}
28+
{"at":"2026-09-09T13:02:09.520Z","chainId":"11155111","safe":"0x83f8ae4B3d322bD7cF0840717eDc1660AC120024","outcome":"eip1271-unsupported","class":"refusal","taxonomyIndex":3,"decidedBy":"assemble","stage":"assemble","detail":"Confirmation from 0x20A5EdcDB3bf0587545De423cdd8Ba94c7D0D754 is APPROVED_HASH; gavel splices EOA/eth_sign signatures only.","executionId":null,"tx":null,"queueCount":1,"nonce":"0","threshold":"2","receiptsEligible":false}
29+
{"at":"2026-09-09T13:02:11.131Z","chainId":"11155111","safe":"0x63FefabFC88086d5546f47A425720021c097a309","outcome":"inner-call-failed","class":"refusal","taxonomyIndex":9,"decidedBy":"chain","stage":"eth_call","detail":"The contract function \"execTransaction\" reverted with the following reason: — GS013","executionId":null,"tx":null,"queueCount":1,"nonce":"0","threshold":"2","receiptsEligible":false}
30+
{"at":"2026-09-09T13:02:20.220Z","chainId":"11155111","safe":"0x63FefabFC88086d5546f47A425720021c097a309","outcome":"inner-call-failed","class":"refusal","taxonomyIndex":9,"decidedBy":"chain","stage":"eth_call","detail":"The contract function \"execTransaction\" reverted with the following reason: — GS013","executionId":null,"tx":null,"queueCount":1,"nonce":"0","threshold":"2","receiptsEligible":false}

0 commit comments

Comments
 (0)