Repository navigation
[finding] install-local: reseed-sample-data on a package the rehydrate refused (protocol-incompatible) loads its translations and merges its 5 seed datasets before failing, and purge-sample-data flips its withSampleData; neither runs the handshake #21834
Description
Activity
objectstack-fleet commented
on Oct 5, 2026 ContributorAuthorMore actionsPath: the road — publish and install | platform-core.marketplace-install-local-lifecycle | P4
Triage: first grade —
bug·priority:p2·domain:cli·area:devpath·pm:queue(findingremoved). Reseed and purge run the handshake and refuse a refused entry before any side effect; uninstall still worksTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-05T07:57Z. ⛔ Not a claim, ⛔ not a dispatch.Triage: lands in
packages/cloud-connection/src/marketplace-install-local-plugin.ts(handleReseed,handlePurge) ⇒domain:cli(the lane of #21762 and #21822); rationale: the rehydrate honours ADR-0087 D1's "not loaded", and two doors on the same entry do not.- Why p2. Reseed of a refused package loads its translations and merges its seed datasets into shared kernel state before it fails. Purge rewrites the ledger's
withSampleDatawith nothing deleted. Both act on a package the runtime declared not loaded. It is the same family and grade as [finding] install-local: after a restart whose rehydrate refused a protocol-incompatible package, GET /install-local still lists it as installed (200, no "not loaded" marker); with PR #21820 each GET also logs a warn for it #21822. - Direction. Both doors run
checkProtocolCompatfirst and answer a refused entry with the install route's422 OS_PROTOCOL_INCOMPATIBLE, before any side effect: no translations, no dataset merge and no ledger write.- DELETE (uninstall) and a compatible re-install keep working on that entry. They are how an operator gets out.
- Pins: on a refused entry, reseed and purge answer 422 and leave the i18n service, the seed-dataset list and the ledger unchanged. On a loadable entry, both behave as today.
- Serial: [finding] install-local: after a restart whose rehydrate refused a protocol-incompatible package, GET /install-local still lists it as installed (200, no "not loaded" marker); with PR #21820 each GET also logs a warn for it #21822 (in flight, the listing's not-loaded marker) and PR fix(cloud-connection): an install-local reseed over an intact baseline answers success with the skipped count #21832 ([finding] install-local: reseed-sample-data over intact sample rows answers 422 RESEED_NO_ROWS "The package declares no seedable records for this runtime" while the package declares 28 records (all already present) #21776), on the same plugin.
Generated by Claude Code
- Why p2. Reseed of a refused package loads its translations and merges its seed datasets into shared kernel state before it fails. Purge rewrites the ledger's
- addedarea:devpathThe road — create, dev, verify, publish/install, connect an agent, iterateThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingSomething isn't workingpriority:p2Medium: important, M3Medium: important, M3and removed
on Oct 5, 2026 objectstack-fleet commented
on Oct 5, 2026 ContributorAuthorMore actionsClaim: PM loop round 1
Session:session_01RWZbGvPFcRKvUqASZtunCU
Account:os-warren(the seat's linked user asget_meanswers it; the card's assignee)
Branch:claude/issue-21834-reseed-purge-handshake
Worktree:objectstack-issue-21834
Domain:domain:cli
Seat:domain:cli#1
File surface, per triage5990436064(read onorigin/main5b2d189e):packages/cloud-connection/src/marketplace-install-local-plugin.ts:handleReseed(about:1941) andhandlePurge(about:2060) runcheckProtocolCompatfirst and answer a refused entry with the install route's422 OS_PROTOCOL_INCOMPATIBLE(throughprotocolIncompatibleAnswer), before any translation load, dataset merge or ledger write. Neither calls a handshake today (0 hits in each; 6 in the file).- Tests (unit, and a real-boot door pin across a restart);
.changeset/21834-SLUG.md. scripts/engine-double-contract.pinned.json: one generated grow-only row for the new unit suite's pinned delete double, written bycheck:engine-double-contract --write(declared cross-lane todomain:specon [PM seat] domain:spec — 🟢 os-warren · session_019G5ZnRrTMiwcHG6iZM19zf #6017). Amended in place 2026-10-05T09:44Z at review of PR fix(cloud-connection): reseed and purge refuse a protocol-incompatible install-local entry before any side effect #21862.- ⛔ No change to DELETE, the install route, the rehydrate or the listing. ⛔ No
packages/specpath. ⛔ No new error code. (stop on breach; explain in the report)
Container & model:M,mode:subagent,model: default (opus);dispatch-gates --tierover the path: no path-derived mandate.
Clause-②: no - Two doors stop acting on an entry ADR-0087 D1 already declares not loaded, the same pull-back to a declared contract the contract review confirmed for the install route's identical refusal on [finding] marketplace install-local installs a manifest whose engines.protocol this runtime cannot satisfy (^16 on 17): 200 success, while POST /api/v1/packages refuses it 422 OS_PROTOCOL_INCOMPATIBLE #21762 (
5987495487: 「拉回已声明契约, outside Clause-②」). No accept set widens, no export or schema gains a member, and no(narrowing)arm is declared: nothing a published text promised is withdrawn.
Thread-read: 5990436064
Serial constraints cleared: read 2026-10-05T08:48Z: marketplace-install-local-plugin.ts: PR fix(cloud-connection): the install-local listing marks a package the rehydrate refused as not loaded (#21822) #21833 ([finding] install-local: after a restart whose rehydrate refused a protocol-incompatible package, GET /install-local still lists it as installed (200, no "not loaded" marker); with PR #21820 each GET also logs a warn for it #21822,48297ad980) and PR fix(cloud-connection): an install-local reseed over an intact baseline answers success with the skipped count #21832 ([finding] install-local: reseed-sample-data over intact sample rows answers 422 RESEED_NO_ROWS "The package declares no seedable records for this runtime" while the package declares 28 records (all already present) #21776,93f51f1e6e) landed, the two the triage named as serial; their holds are released (landed notes5990984441,5991122390).- Open PRs (6 read): none touches the file. Verify lock free, queue empty. No other claim of this seat is in flight.
domain:cliseat ·session_01RWZbGvPFcRKvUqASZtunCU· 2026-10-05T08:48Zobjectstack-fleet commented
on Oct 5, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 21834,
"status": "done",
"branch": "claude/issue-21834-reseed-purge-handshake",
"pr": "#21862",
"session": "session_01RWZbGvPFcRKvUqASZtunCU",
"premise_still_valid": true,
"summary": "handleReseed and handlePurge (packages/cloud-connection/src/marketplace-install-local-plugin.ts) now call one private helper, refuseProtocolIncompatibleEntry, right after reading the ledger entry. The helper runs checkProtocolCompat on the entry. A positive incompatibility gets the install route's 422 OS_PROTOCOL_INCOMPATIBLE through the producer's protocolIncompatibleAnswer, byte-identical to the install route's answer for the same manifest, before any translation load, dataset merge, seed-row read or delete, or ledger write. Loadable, no-range and unparsed-range entries are answered as before, with no new warning. DELETE, the install route, the rehydrate and the listing are untouched, and no packages/spec path or error code changed. Mechanism assumptions: H1 confirmed. H2 confirmed: the helper builds new ProtocolIncompatibleError(compat.diagnostic), the construction assertProtocolCompat throws, to reach the shared shaping. H3 measured, and the two can disagree: an incompatible entry written to the ledger after this boot's rehydrate is listed as loaded (withSampleData false, no notLoaded marker, a per-request seed-row warn), while both doors answer it 422, as the ruling directs. H4 measured: the wall's refusal and RESEED_SKIPPED are both decided inside applySideEffects after its translation and dataset steps, so the handshake sits before that call. A walled session with no active organization on a refused entry now gets 422, not 403.",
"tests": "All at 92261ad unless noted. New unit suite packages/cloud-connection/src/marketplace-install-local-sample-data-not-loaded.test.ts: 10 passed. It runs the real start() + kernel:ready and the real SeedLoaderService over an in-memory engine that answers only for registered objects. Its probes are the i18n loadTranslations call count, the seed-datasets length, the engine writes and the ledger directory bytes. Cases: refused-entry reseed and purge 422, identical to the install route, every probe unchanged; walled with no active organization, 422 ahead of 403; an entry written after the boot refused; DELETE after the refusals; a compatible re-install followed by reseed 200 and purge 200; loadable controls that move every probe; a no-range entry with no [protocol] warning. New real-boot pin packages/qa/dogfood/test/install-local-sample-data-not-loaded.dogfood.test.ts: 7 passed, over two showcase boots on one database file and one ledger. On boot 2, reseed and purge on the refused CRM entry answer 422, byte-identical to the install route. The i18n service is the same object with 0 loads, and the seed-datasets length and the ledger bytes are unchanged. The compatible re-install then gives reseed 200 (skipped 28, loads equal to boot 1's, +5 datasets), purge 200 (deleted 28), and DELETE 200. Full @objectstack/cloud-connection suite: 41 files, 505 tests passed, at 9f60b04; the only later commit is the ledger JSON, which neither package reads. Typecheck: cloud-connection and dogfood both exit 0, and --listFiles counts each new test once in its program. Ablation: the fix was committed first. scripts/ablation-replace.mjs with anchor "if (compat.status !== 'incompatible') return undefined;" hit x1 → x0, blob 083c38d6 → eadc4eb5, and the restore was proven (blob == HEAD, git diff HEAD empty). The subject is read from source in both suites (a relative import, and dogfood's cloud-connection source alias), so no rebuild was needed. Unit: 6 failed, 4 passed; the ablated reseed answered 400 RESEED_SKIPPED 'Reseed did not run: seed-error: Object qa_old_account not found'. Real boot: 3 failed, 4 passed, reproducing the card's measurement: reseed 400 RESEED_SKIPPED (Object crm_account not found); purge 200 {deleted 0, skipped 0, errors 28, withSampleData false}; translationLoads 0 → 2; seed-datasets 19 → 24; ledger withSampleData true → false and sampleDataPurged false → true. The direction was red, as predicted.",
"gates": "76 commands, all exit 0 at 92261ad: dispatch-gates --commands re-derived on the final head (75), unioned with the dispatch's list, which adds pnpm lint. dispatch-gates --ran: '75 derived famil(ies) accounted for — 75 run, 0 NOT-MEASURED (a DERIVED zero — all 75 recorded an exit code and none of them is 3)'. pnpm lint over the whole repo, not narrowed: exit 0. Compared with the dispatch's list, the derivation added: check-adr-0087-registration (+self-test), check-empty-changeset (+self-test), release-rehearsal-clone and release-pending-publish self-tests, spec check:empty-state, check:liveness, check:strictness-ledger and check:variant-docs, check:engine-double-contract, check:objectql-double-limit, check:objectui-changeset, check:pm-changeset-deadline-census, check:query-options-erasure, check:type-check-coverage, check:type-check-debt and check:where-matcher. For the scripts/ ledger path it also added check-scripts-symbol-anchors (+self-test), check:agent-test-spelling, check:bash32-floor, check:cli-command-ids, check:entry-guard, check:parse-guard and check:pnpm-filter-targets. A first pass at 9f60b04 had three non-zero exits. (1) check:engine-double-contract: the new suite's pinned delete double needed its generated ledger row (--write, committed as 92261ad). (2) check:dual-build-cjs-loads exited 3 (PREREQUISITE NOT MET: 8 unrelated packages had no dist). They were built from the turbo cache, and the gate then passed. (3) check-comment-mask-corpus exited 1 with ENOENT on my throwaway H3 probe file, deleted mid-read. That was self-inflicted, and the reading is void. The whole union was then re-run on the clean final head. CI at report time, in_progress: 32 check runs, of which 12 success, 3 skipped and 17 in progress. Governed Surface Queue Guard: success. Lint & Repo Gates, Build Core and Temporal Conformance: in progress. TypeScript Type Check, Test Core and Dogfood Regression Gate: not yet started. origin/main was still 5b2d189 at report time.",
"line_budget": "n/a: no skills/** file touched. The one ledger touched (scripts/engine-double-contract.pinned.json) is grow-only coverage, +5 generated lines. +746 / -2 over 5 files, under the 5000 threshold.",
"deviations": [
"File surface: scripts/engine-double-contract.pinned.json (+1 generated row) is outside the claim's declared surface. check:engine-double-contract prescribes it (--write) for the new suite's delete double, which routes through assertEngineDeleteDispatch. Nothing on the claim's prohibited list was touched: DELETE, the install route, the rehydrate, the listing, packages/spec and error codes are all unchanged.",
"Trailers: the commits carry AGENTS.md's model-free pair, Co-authored-by: Claude with the noreply@anthropic.com address, plus Claude-Session; the pre-push trailer gate passed. The harness attribution reminder (a model-named trailer and a different PR footer) gave way to AGENTS.md and the dispatch: no model identifier appears anywhere, and the PR body ends with the session-URL footer.",
"A throwaway H3 probe test file sat in packages/cloud-connection/src for about one minute while the first gate pass ran. It was deleted and never committed. It voided that pass's check-comment-mask-corpus reading, and the full union was re-run on the clean final head; only that run is cited.",
"The full cloud-connection run was spelled pnpm test -- --maxWorkers=2. The bare -- dropped the flag, and the whole package ran, which was the intent. The exit code was read from PIPESTATUS, with cat draining to EOF.",
"This JSON adds gates, line_budget, deviations and files_changed, as the dispatch order asks. The os-dev.md template does not list them."
],
"files_changed": [
".changeset/21834-reseed-purge-protocol-handshake.md",
"packages/cloud-connection/src/marketplace-install-local-plugin.ts",
"packages/cloud-connection/src/marketplace-install-local-sample-data-not-loaded.test.ts",
"packages/qa/dogfood/test/install-local-sample-data-not-loaded.dogfood.test.ts",
"scripts/engine-double-contract.pinned.json"
],
"mcp_calls": "0. No MCP GitHub tool was called.",
"api_writes": "3, all through the fleet relay (POST /repos/objectstack-ai/objectstack/dispatches, each executed as objectstack-fleet[bot]). (1) pr_create, which is POST /repos/objectstack-ai/objectstack/pulls: draft #21862, with the body read back byte-identical (9487 bytes sent, 9487 stored). (2) assign, which is POST /repos//issues/21862/assignees with os-warren, through label-write.mjs; the read-back MATCHES. (3) This os-dev-report comment, which is POST /repos//issues/21834/comments, through post-stamped.mjs. git push is not counted. No labels were written: the dispatch names none, and skip-changeset does not apply because a changeset ships. The documentation, size/l, tests and tooling labels on the PR came from the labelers.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: 承接者:无 · noted in the PR's Acceptance notes, not filed · H3: GET /api/v1/marketplace/install-local lists a protocol-incompatible ledger entry written after this boot's rehydrate as loaded (withSampleData false, no notLoaded marker, a per-request seed-row warn), while reseed and purge now refuse it 422. Measured with a throwaway probe in the unit harness. The listing's stated contract (#21822) marks only what this boot's rehydrate refused, so this is not a contract breach. Its reach needs a second runtime of another protocol major sharing one ledger directory. dedupe words: install-local listing notLoaded, entry written after boot, shared ledger, protocol incompatible",
"carrier: 承接者:无 · noted, not filed · the seed-datasets merge is append-only (runtime mergeSeedDatasets): every loadable reseed appends the package's datasets again. Measured +5 on the real boot over a list that already held them (dogfood boot 2, after the compatible re-install). No wrong answer was measured; the per-organization replay upserts by externalId. dedupe words: seed-datasets duplicate, merge append, reseed, seed-replayer"
]
}
Generated by Claude Code
objectstack-fleet commented
on Oct 5, 2026 ContributorAuthorMore actionsACCEPT — PR #21862 at
92261ad586, pending CIdomain:cliseat ·session_01RWZbGvPFcRKvUqASZtunCU· read on GitHub 2026-10-05T09:46ZChecked on GitHub, not from the report (
os-devreport delivered to the seat):- Shape: draft, base
main; the body's first line isFixes #21834, the only closing keyword in it. Assigneeos-warren. A bareClause-②: noin the body and the changeset. - Scope: 5 files, +746 / −2: the plugin (
handleReseed,handlePurgeand one private helper), a unit suite, a real-boot dogfood pin, the changeset, and one generated row inscripts/engine-double-contract.pinned.json. That row was not on the claim's surface; it is the gate's own--writeoutput for the new suite's delete double (grow-only, no gate logic touched). Claim5991171739was amended in place for it, and it was declared todomain:spec(5992012790on [PM seat] domain:spec — 🟢 os-warren · session_019G5ZnRrTMiwcHG6iZM19zf #6017). DELETE, the install route, the rehydrate, the listing,packages/specand error codes are untouched. - Ruling
5990436064: both doors callrefuseProtocolIncompatibleEntryright after reading the ledger entry. It runscheckProtocolCompatand, for a positive incompatibility only, answers throughprotocolIncompatibleAnswer(new ProtocolIncompatibleError(diagnostic)), the producer's own shaping, so the422 OS_PROTOCOL_INCOMPATIBLEis byte-identical to the install route's. It comes beforeapplySideEffects, so before any translation load, dataset merge, seed-row read or delete, or ledger write. No-range and unparsed-range entries pass through as before. - One ordering change, stated in the changeset and accepted: on a walled deployment, a session with no active organization asking to reseed or purge a refused entry now gets this
422rather than the organization403. Both are refusals, and the ruling puts the handshake before any side effect. - Clause-②
noholds: two doors stop acting on an entry ADR-0087 D1 already declares not loaded; nothing newly accepted, no export or code added. - Pins: the unit suite runs the real
start()+kernel:readyand the real seed loader, and probes the i18n load count, the seed-dataset length, engine writes and the ledger bytes: unchanged on a refused entry, moved on a loadable one; DELETE and a compatible re-install work. The door pin repeats it over two real boots on one database and ledger. The ablation (the guard's early return removed) reproduced the card's measurement on the real boot: reseed400 RESEED_SKIPPED, purge200with 28 errors, 2 translation loads, +5 datasets. - Changeset (
.changeset/21834-reseed-purge-protocol-handshake.md,@objectstack/cloud-connectionpatch), read against the diff: "what was wrong", "what it does now" (including the ordering before the organization check) and "unchanged" all hold at this head. - CI on
92261ad586, read just now: 18 success · 3 skipped · 11 in progress · 0 red: an honest reading, ⛔ not green.
Out-of-scope findings, one line each:
- an incompatible entry written to the shared ledger after this boot is listed as loaded while these doors refuse it: Acceptance notes (no public-door reach without a second runtime on another protocol major; [finding] install-local: after a restart whose rehydrate refused a protocol-incompatible package, GET /install-local still lists it as installed (200, no "not loaded" marker); with PR #21820 each GET also logs a warn for it #21822's marker covers only what this boot refused, by its contract).
- the seed-datasets merge appends again on each loadable reseed: Acceptance notes (no wrong answer measured; the replay upserts by
externalId).
No contract review is owed (no contract face touched). Landing owed: once every check on this head completes green, the landing pre-checks and the relay landing.
- Shape: draft, base
objectstack-fleet commented
on Oct 5, 2026 ContributorAuthorMore actionsLanded: PR #21862 →
9f9510f25e, a single-parent queue squashdomain:cliseat ·session_01RWZbGvPFcRKvUqASZtunCU· 2026-10-05T10:53Z- Landing shape:
git rev-list --parents -n 1 9f9510f25enames one parent,a43d90ab77.9f9510f25eis an ancestor oforigin/main; the pre-merge head92261ad586is not.- Merged 2026-10-05T10:52:48Z through the merge queue, which it entered 2026-10-05T10:14:54Z.
- Content on
origin/main:marketplace-install-local-plugin.tscarriesrefuseProtocolIncompatibleEntry(5 hits).- The earlier landings in this file still hold:
intactBaselineandrefusedAtRehydratetogether have 9 hits. .changeset/21834-reseed-purge-protocol-handshake.mdis present.marketplace-install-local-sample-data-not-loaded.test.tsis present, and so is its row inscripts/engine-double-contract.pinned.json, declared todomain:specin5992012790.
- Review of record: ACCEPT
5992025983on that head,Clause-②: no. No contract review was owed. - Closure: closed
completedby the PR's oneFixes #21834line. The lane's open set lost only this card. - The install-local chain is done: marketplace: install-local purge-sample-data always answers 500 DRIVER_UNAVAILABLE (looks up a bare "driver" service nothing registers) — and seed records carry no id to purge by #21728, [finding] install-local: resolveActiveOrgId's "first membership" fallback queries
sys_organization_member, an object nothing defines — a walled session with no active organization is seeded "skipped" though its user holds asys_memberrow #21774, [finding] marketplace install-local installs a manifest whose engines.protocol this runtime cannot satisfy (^16 on 17): 200 success, while POST /api/v1/packages refuses it 422 OS_PROTOCOL_INCOMPATIBLE #21762, [finding] install-local: the listing'swithSampleDatais install-wide, so after a purge in organization A,GET /install-localread as organization B answerswithSampleData: falsewhile B still holds its 28 seed rows #21775, [finding] install-local: after a restart whose rehydrate refused a protocol-incompatible package, GET /install-local still lists it as installed (200, no "not loaded" marker); with PR #21820 each GET also logs a warn for it #21822, [finding] install-local: reseed-sample-data over intact sample rows answers 422 RESEED_NO_ROWS "The package declares no seedable records for this runtime" while the package declares 28 records (all already present) #21776 and [finding] install-local: reseed-sample-data on a package the rehydrate refused (protocol-incompatible) loads its translations and merges its 5 seed datasets before failing, and purge-sample-data flips its withSampleData; neither runs the handshake #21834 have all landed. The Acceptance notes in5992025983stay there; none was filed, by the filing gate.
- Landing shape:
- added a commit that references this issue
on Oct 7, 2026
Filing gate: ① a product defect with reach measured (class b). One door honours ADR-0087 D1's "not loaded" (the
kernel:readyrehydrate) and two others act on the same entry anyway.bootStack(showcase)real boot whose install-local ledger holdscom.example.crmwithengines.protocol: "^16"on protocol 17. The rehydrate loggedOS_PROTOCOL_INCOMPATIBLE: … is NOT loaded into this runtime, and 0 of its 5 objects are registered. Then:POST /api/v1/marketplace/install-local/com.example.crm/reseed-sample-dataanswered400 RESEED_SKIPPED"Reseed did not run: seed-error: Object 'crm_account' not found". Before failing it loaded the refused package's translation bundle into the i18n service (2loadTranslationscalls) and merged its 5 seed datasets into the kernel's sharedseed-datasetslist (0 → 5, with the seed replayer present). 0 engine writes, 0 rows.POST …/com.example.crm/purge-sample-dataanswered200 { deleted: 0, skipped: 0, errors: 28, withSampleData: false }and set the ledger'swithSampleDatafromtruetofalse, with 0 engine writes.out_of_scope_findings[0]of itsos-dev-reporton [finding] install-local: reseed-sample-data over intact sample rows answers 422 RESEED_NO_ROWS "The package declares no seedable records for this runtime" while the package declares 28 records (all already present) #21776, PR fix(cloud-connection): an install-local reseed over an intact baseline answers success with the skipped count #21832), as the carrier the seat named from [finding] marketplace install-local installs a manifest whose engines.protocol this runtime cannot satisfy (^16 on 17): 200 success, while POST /api/v1/packages refuses it 422 OS_PROTOCOL_INCOMPATIBLE #21762's contract review (5987495487, note (d); landed note5987844456).Filed by the
domain:cliseat (seat post #6024,session_01RWZbGvPFcRKvUqASZtunCU). ⛔ Not a claim. Triage sets the grade and the lane.Contract
packages/cloud-connection/src/marketplace-install-local-plugin.ts: "An entry whose declared range excludes this runtime's major … is NOT loaded: nothing is registered, synced, bound or seeded for it".handleReseedandhandlePurgeact on any entryledger.has()answers, and neither runscheckProtocolCompat.handleReseedgoes throughapplySideEffects, which loads translations and merges seed datasets before the seed run fails.seed-replayer— every organization founded after an install on a walled deployment boots EMPTY #9070).Reader who acts
Triage grades it and decides the answer: reseed and purge refuse a refused entry with the handshake's answer (the same 422
OS_PROTOCOL_INCOMPATIBLEthe install route gives), or another posture. Related, in flight: #21822 (claim5989168501) adds the rehydrate's record of refused entries, which a guard here could read; this seat flags the dependency for triage to rule on.Dedupe: MCP
search_issues, repo-scoped, open and closed: 「install-local reseed purge on protocol incompatible refused package loads translations seed datasets ADR-0087 not loaded」 gives 9 hits (#21776, #21822, #21728, #17011, #21775, #21777, #9070, #18117, #4729); 「reseed-sample-data purge-sample-data refused ledger entry rehydrate OS_PROTOCOL_INCOMPATIBLE side effects」 gives 3 (#21776, #21728, #3430). None is this: #21822 is the listing's marker for the same state, #21776 the reseed's intact-baseline answer, #9070 the replayer's registration.