Skip to content

metadata-protocol: a seed load that throws mid-batch drops the landed row ids of the datasets that landed before the throw, so the publish receipt carries no seedApplied.landed #30429

Closed

Description

@objectstack-fleet

domain:spec#3 · os-support-ai · session_01WGufzfgvGexKn9vLHsy89K

Filing gate: ③ carried from the contract review of PR #30427 (#30348), so that PR stays at the shape the card named. ⛔ Not a claim. Suggested-grade: p2, because cloud's "clear sample data" reads seedApplied.landed to know which rows a seed created, and after a partial publish it has no ids for the datasets that did land. Route: domain:spec (packages/metadata-protocol).

What happens. PR #30427 adds seedApplied.landed = [{ object, inserted, matched }] to the publish receipt. applySeedBodies (packages/metadata-protocol/src/protocol-publish-batch.ts) fills it only on the returned-load path. When the loader throws partway through a batch, the catch returns counts from seedLoadPartialWrites, and SeedLoadPartialWrites carries counts only, so the receipt has success: false and no landed at all, although earlier datasets in the batch did insert rows. PR #30427's body says the receipt reports this as "not reported", and cloud must read an absent landed next to success: false as unknown.

Why. The partial-writes record was shaped before the receipt carried ids. The loader already knows each landed dataset's insertedIds and landedIds when it throws on a later one.

Wanted

  • Measure at origin/main after PR feat(spec,metadata-protocol): the publish receipt names the rows a seed created and the rows it only matched #30427 lands: where the loader throws mid-batch, which per-dataset results already exist, and what seedLoadPartialWrites reads.
  • Carry the landed datasets' ids through the partial-writes path so the receipt's landed lists them (the same projection and the same 200 cap), and say in the schema description that a thrown load's landed covers only datasets that finished.
  • Pins at a real door: a good seed lands and a later seed throws; the receipt lists the good seed's inserted ids and omits the failing one.

Not in scope: whether the ownership claim (claim-seed-ownership.ts, seed-settlement.ts) should narrow from landedIds to insertedIds; that is a separate ruling.

Blocked-by: #30348

Activity

  1. added
    bugSomething isn't working
    pm:queueReady for the PM dispatch loop
    domain:specDomain lane — seat card indexed by label:pm:seat
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 5, 2026
  2. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: audit · p2 kept · domain:spec · pm:blocked · 2026-11-05T12:03Z

    ⛔ Not a claim.


    Generated by Claude Code

  3. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    on Nov 5, 2026
  4. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#3 · os-support-ai · session_01WGufzfgvGexKn9vLHsy89K

    Claim: PM loop round 22 (p2)
    Session: session_01WGufzfgvGexKn9vLHsy89K
    Account: os-support-ai
    Branch: the card thread's own claude/project-thread-* branch, named in the dev's hand-back and restated in a later claim (a measured platform exception to claude/issue-30429-…)
    Worktree: objectstack-issue-30429
    Domain: domain:spec
    Seat: domain:spec#3
    File surface: packages/metadata-protocol/src/seed-loader.ts (SeedLoadPartialWrites, seedLoadPartialWrites), protocol-publish-batch.ts (applySeedBodies' catch), seed-applied-landed.ts if the projection needs a partial entry point, the seedApplied.landed describe in packages/spec/src/api/protocol.zod.ts, and their tests. ⛔ Not cloud, not the seed-ownership claim (claim-seed-ownership.ts, seed-settlement.ts).
    Container & model: S, mode:thread, model: TIER_DEFAULT, effort: high
    Clause-②: yes (widening: a thrown load's receipt carries landed for the datasets that finished, where it carried none)
    Metadata-protocol: semantic (expected: an existing key's absence changes meaning on a thrown load; the dev confirms with check-changeset-no-major)
    Responsibility: after a publish whose seed load throws mid-batch, the receipt has no landed ids although earlier datasets inserted rows | SeedLoadPartialWrites carries counts only, so applySeedBodies' catch cannot report ids | cloud's "clear sample data" (objectstack-ai/cloud#3598) after any partial publish
    Thread-read: 6657518253
    Premise: holds at origin/main a7b8876f (PR #30427 merged) by reading: protocol-publish-batch.ts returns landed only on the returned-load path (≈:134-140) and its catch reads counts from seedLoadPartialWrites. The dev re-measures before editing.
    Human floor: none beyond #30348's shape (cloud#3598 ruling A, the two-list split); this card keeps it.
    Serial constraints cleared: no open PR touches seed-loader.ts, protocol-publish-batch.ts or seed-applied-landed.ts.

  5. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#3 · os-support-ai · session_01WGufzfgvGexKn9vLHsy89K

    Claim: PM loop round 22 (p2), restated with the branch
    Session: session_01WGufzfgvGexKn9vLHsy89K
    Account: os-support-ai
    Branch: claude/project-thread-crfqzt (the card thread's own branch, a measured platform exception to claude/issue-30429-…); card thread session session_01WGufzht5n1PKh96TqTfrvV
    Worktree: objectstack-issue-30429
    Domain: domain:spec
    Seat: domain:spec#3
    File surface: packages/metadata-protocol/src/seed-loader.ts (SeedLoadPartialWrites, seedLoadPartialWrites), protocol-publish-batch.ts (applySeedBodies' catch), seed-applied-landed.ts if the projection needs a partial entry point, the seedApplied.landed describe in packages/spec/src/api/protocol.zod.ts, and their tests. ⛔ Not cloud, not the seed-ownership claim (claim-seed-ownership.ts, seed-settlement.ts).
    Container & model: S, mode:thread, model: TIER_DEFAULT, effort: high
    Clause-②: yes (widening: a thrown load's receipt carries landed for the datasets that finished, where it carried none)
    Metadata-protocol: semantic (expected: an existing key's absence changes meaning on a thrown load; the dev confirms with check-changeset-no-major)
    Responsibility: after a publish whose seed load throws mid-batch, the receipt has no landed ids although earlier datasets inserted rows | SeedLoadPartialWrites carries counts only, so applySeedBodies' catch cannot report ids | cloud's "clear sample data" (objectstack-ai/cloud#3598) after any partial publish
    Thread-read: 6658436150
    Premise: holds at origin/main a7b8876f (PR #30427 merged) by reading: protocol-publish-batch.ts returns landed only on the returned-load path (≈:134-140) and its catch reads counts from seedLoadPartialWrites. The dev re-measures before editing.
    Human floor: none beyond #30348's shape (cloud#3598 ruling A, the two-list split); this card keeps it.
    Serial constraints cleared: no open PR touches seed-loader.ts, protocol-publish-batch.ts or seed-applied-landed.ts.

  6. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#3 · os-support-ai · session_01WGufzht5n1PKh96TqTfrvV
    os-dev-report
    Stamp: 2026-11-05T14:01Z

    {
      "issue": 30429,
      "status": "done",
      "branch": "claude/project-thread-crfqzt",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30519",
      "head": "4c02bddf8",
      "session": "session_01WGufzht5n1PKh96TqTfrvV",
      "premise_still_valid": true,
      "summary": "SeedLoadPartialWrites gains `finished` (the finished datasets' object/landedIds/insertedIds, load order); applySeedBodies' catch and the runtime fallback's catch both fold it through seedAppliedLanded, so a thrown load's receipt lists the finished datasets in `landed` (same two lists, same 200 cap). The dataset that threw is omitted: its ids are only partly known when it throws (a lost batch response can commit rows whose ids never return); its rows stay in the counts and its object in `error`. A throw before any dataset finished reports landed: []; no load ran leaves landed absent. seedLoadPartialWrites is exported from the package root; the spec landed description and docblock say this.",
      "tests": "at be4d35b5 under os-verify-lock: metadata-protocol 316 passed 4 skipped files, 22425 tests; objectql 551/551 files, 10989 tests; runtime 543/543 files, 8647 passed 19 skipped; spec 815/815 files, 25622 passed 1 todo; typecheck exit 0 for all four. Ablation A (dist): loader finished snapshot neutralised, blob a7986c958ece to c3a35b1b3aa0, metadata-protocol rebuilt, preflight marker in 2 built files: objectql landed 1 failed of 10, runtime fallback 1 failed of 3, partial-writes unit 1 failed of 3. Ablation B (dist): catch landed spread neutralised, blob eccb3c495621 to cb59f9935201: objectql landed 2 failed of 10. Restored to HEAD blobs, rebuilt, --absent preflight green, git diff HEAD empty, 10/10, 3/3, 3/3. A first attempt with comment markers was refused by the preflight (stripped by the build) before any test ran.",
      "gates": "dispatch-gates --commands: 105 derived; serial pass at be4d35b5, three exit-3 prerequisites (check-plugin-teardown-shape --self-test, check:skill-examples, check:dual-build-cjs-loads) re-run exit 0 after fetching the fixture commit and a full turbo build 119/119; --ran with exit codes: 105 run, 0 NOT-MEASURED (derived zero), exit 0. At 4c02bddf8 (adds only the changeset Supersedes paragraph): check-empty-changeset, check:generated, check:nul-bytes exit 0; check-changeset-no-major with the PR body as event exit 0 on semantic, control none exit 1, added exit 0. CI check-runs: in_progress at report time.",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "2 — issue_read get and get_comments on #30429 (read-only)",
      "api_writes": "2 — relay pr_create (#30519, draft, no assignees, 12695 bytes read back identical), this os-dev-report comment via post-stamped.mjs; git push x2 not REST",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "carrier: none · the runtime fallback's thrown seedApplied carries no inserted/updated counts although PublishPackageDraftsResponseSchema declares both required; pre-existing, noted in PR Acceptance notes, not filed",
        "carrier: cloud · the omitted failing dataset's landed rows have no ids on the receipt; cloud can see that unlisted rows exist by comparing inserted with the listed inserted totals"
      ],
      "deviations": "harness default to assign the PR and request a review skipped per os-dev rule 2; commit trailers model-free"
    }

    Generated by Claude Code

  7. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#3 · os-support-ai · session_01WGufzfgvGexKn9vLHsy89K

    Accepted: PR #30519, head 7f2442b0. The ACCEPT is 6660967321; the contract review is 6660144246 (PASS), both on the PR. It lands through the merge queue.

  8. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#3 · os-sales · session_01L6bhgTqqeHSwZYJmApbDCa

    Takeover · #30429 · 2026-11-05T15:50Z

    ① Release. The claims 6658436150 and 6658477761 of domain:spec#3 · os-support-ai · session_01WGufzfgvGexKn9vLHsy89K are taken over. Whose order: the maintainer (os-sales). The words: 「spec 前任没流量了,接手他们的座位和在手工作」. Where: the project chat of the os-sales account's project, with the previous holder's hand-off as this seat thread's opening message (seat post #18883, takeover audit there).

    ② Assignee: os-support-ai → os-sales, in the same stroke as this comment.

    ④ Hand-over record. Branch claude/project-thread-crfqzt, last pushed 7f2442b0338fb295c8ffd047fececd535ea75938 (PR #30519). Status: ACCEPTed (PR #30519 comment 6660967321, contract review 6660144246 PASS), in the merge queue. This seat only lands it: landing note and pm:dispatched off on merge.

    Claim: PM loop round 1 (p2), taken over
    Session: session_01L6bhgTqqeHSwZYJmApbDCa
    Account: os-sales
    Branch: claude/project-thread-crfqzt (continued; PR #30519)
    Worktree: objectstack-issue-30429
    Domain: domain:spec
    Seat: domain:spec#3
    File surface: unchanged from claim 6658477761 (packages/metadata-protocol/src/seed-loader.ts, protocol-publish-batch.ts, seed-applied-landed.ts, the seedApplied.landed describe in packages/spec/src/api/protocol.zod.ts, and their tests).
    Container & model: S, mode:thread (the work is done; landing only), model: TIER_DEFAULT, effort: high
    Clause-②: yes (widening)
    Metadata-protocol: semantic
    Responsibility: unchanged from claim 6658477761: after a publish whose seed load throws mid-batch, the receipt has no landed ids although earlier datasets inserted rows | SeedLoadPartialWrites carries counts only, so applySeedBodies' catch cannot report ids | cloud's "clear sample data" (objectstack-ai/cloud#3598) after any partial publish
    Thread-read: 6660986743
    Premise: holds; the ACCEPT on 7f2442b0 is the reading.
    Serial constraints cleared: none; the PR is in the merge queue.


    Generated by Claude Code

  9. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#3 · os-sales · session_01L6bhgTqqeHSwZYJmApbDCa

    Landed: PR #30519 merged at 38d416f1. When a seed load throws part-way, the publish receipt's seedApplied now carries landed for the datasets that finished before the throw (the same projection, inserted and matched, the same 200-id cap); the dataset that threw is not listed, its rows still count, and error names the object it stopped at. The runtime fallback seed apply reads and projects the same way, and its failure receipt carries the inserted / updated counts the schema requires. landed absent now means only that no load ran.

    The merge queue landed it at 2026-11-05T16:04:34Z; the PR body's Fixes #30429 did not close the card, so this seat closes it as completed and removes pm:dispatched in the same stroke.

    Carried: none (the seed-ownership claim's reading of landedIds versus insertedIds stayed out of scope by the order). objectstack-ai/cloud#3598's cloud half can now clear the sample rows of a partial publish.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingdomain:specDomain lane — seat card indexed by label:pm:seatpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions