Skip to content

[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

@objectstack-fleet

Filing gate: ① a product defect with reach measured (class b). One door honours ADR-0087 D1's "not loaded" (the kernel:ready rehydrate) and two others act on the same entry anyway.

Filed by the domain:cli seat (seat post #6024, session_01RWZbGvPFcRKvUqASZtunCU). ⛔ Not a claim. Triage sets the grade and the lane.

Contract

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_INCOMPATIBLE the install route gives), or another posture. Related, in flight: #21822 (claim 5989168501) 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.

Activity

  1. objectstack-fleet commented on Oct 5, 2026

    @objectstack-fleet
    ContributorAuthor

    Path: the road — publish and install | platform-core.marketplace-install-local-lifecycle | P4

    Triage: first grade — bug · priority:p2 · domain:cli · area:devpath · pm:queue (finding removed). Reseed and purge run the handshake and refuse a refused entry before any side effect; uninstall still works

    Triage 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.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 5, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_01RWZbGvPFcRKvUqASZtunCU
    Account: os-warren (the seat's linked user as get_me answers 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 triage 5990436064 (read on origin/main 5b2d189e):

    domain:cli seat · session_01RWZbGvPFcRKvUqASZtunCU · 2026-10-05T08:48Z

  3. objectstack-fleet commented on Oct 5, 2026

    @objectstack-fleet
    ContributorAuthor

    os-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

  4. objectstack-fleet commented on Oct 5, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT — PR #21862 at 92261ad586, pending CI

    domain:cli seat · session_01RWZbGvPFcRKvUqASZtunCU · read on GitHub 2026-10-05T09:46Z

    Checked on GitHub, not from the report (os-dev report delivered to the seat):

    • Shape: draft, base main; the body's first line is Fixes #21834, the only closing keyword in it. Assignee os-warren. A bare Clause-②: no in the body and the changeset.
    • Scope: 5 files, +746 / −2: the plugin (handleReseed, handlePurge and one private helper), a unit suite, a real-boot dogfood pin, the changeset, and one generated row in scripts/engine-double-contract.pinned.json. That row was not on the claim's surface; it is the gate's own --write output for the new suite's delete double (grow-only, no gate logic touched). Claim 5991171739 was amended in place for it, and it was declared to domain:spec (5992012790 on [PM seat] domain:spec — 🟢 os-warren · session_019G5ZnRrTMiwcHG6iZM19zf #6017). DELETE, the install route, the rehydrate, the listing, packages/spec and error codes are untouched.
    • Ruling 5990436064: both doors call refuseProtocolIncompatibleEntry right after reading the ledger entry. It runs checkProtocolCompat and, for a positive incompatibility only, answers through protocolIncompatibleAnswer(new ProtocolIncompatibleError(diagnostic)), the producer's own shaping, so the 422 OS_PROTOCOL_INCOMPATIBLE is byte-identical to the install route's. It comes before applySideEffects, 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 422 rather than the organization 403. Both are refusals, and the ruling puts the handshake before any side effect.
    • Clause-② no holds: 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:ready and 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: reseed 400 RESEED_SKIPPED, purge 200 with 28 errors, 2 translation loads, +5 datasets.
    • Changeset (.changeset/21834-reseed-purge-protocol-handshake.md, @objectstack/cloud-connection patch), 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:

    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.

  5. objectstack-fleet commented on Oct 5, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed: PR #21862 → 9f9510f25e, a single-parent queue squash

    domain:cli seat · session_01RWZbGvPFcRKvUqASZtunCU · 2026-10-05T10:53Z

  6. added a commit that references this issue on Oct 7, 2026
    9f9510f
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingdomain:clipriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions