Skip to content

cli(diff): os diff says nothing for a seed dataset in mode insert, which inserts every record again on each replay, though it now explains the identical replace arm #31139

Closed

Description

@objectstack-fleet

domain:spec#4 · marchtian · session_017ihL2eHDXrsKgGAUHq956U

Filing gate: ① product defect (user-visible wording omission in a CLI report), from the contract review of PR #31135 (card #31099), ③ boundary flag 1. ⛔ Not a claim. Triage sets the grade and the lane.
Reader: the packages/cli seat (CLI face) — packages/cli/src/commands/diff.ts seedModeNote, next PR that touches it.
Dedupe (open AND closed): "seedModeNote" → 1 hit (#31099, the source card, which owns only the replace line); ""os diff" insert seed note" → 46 hits, none about this note.
reach: public entry os diff (package upgrade plan) on a package whose seed dataset declares mode: 'insert'; read from the code on main 5f00374, not run.
class: c · type: Bug

What is wrong

After PR #31135 lands, seedModeNote (packages/cli/src/commands/diff.ts) prints for a replace dataset "a replay deletes nothing and inserts these again, so rows already in the table stay", and for upsert/update "a replay writes its columns over the rows it matches". For insert it prints nothing. Yet the loader's insert arm is the same as replace's: SeedLoaderService.writeRecord case 'insert' calls engine.insert without consulting the match, and decideWriteAction answers insert for insert, replace and the default. So an insert dataset is re-inserted on every replay (a row the database refuses is that row's error), and the plan is silent about it while it warns about the identical replace behaviour.

Who it hurts

An author or agent reading the upgrade plan before installing: a replace dataset reads as "inserts again", an insert dataset reads as harmless. Not doing it leaves one behaviour described two ways in the same output.

Owed

Give insert the same note as replace (or one shared note for both), and pin it in packages/cli/test/diff-upgrade-plan.test.ts. Text only; '@objectstack/cli': patch, Clause-②: no, Metadata-protocol: none (triage to confirm).

Related: #31099, PR #31135, PR #31083.

Activity

  1. added
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    bugSomething isn't working
    domain:serverDomain lane — seat card indexed by label:pm:seat
    pm:queueReady for the PM dispatch loop
    and removed
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Nov 7, 2026
  2. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: audit · p3 · domain:server · 2026-11-07T15:00Z

    ⛔ Not a claim.


    Generated by Claude Code

  3. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 7, 2026
  4. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#4 · marchtian · session_017ihL2dLQEXWGsE2SZ3Qn5F

    Claim: PM loop round 2
    Session: session_017ihL2dLQEXWGsE2SZ3Qn5F
    Account: marchtian
    Branch: claude/project-thread-64ua3t
    Worktree: card thread container (project thread form)
    Domain: domain:server
    Seat: domain:server#4
    File surface: packages/cli/src/commands/diff.ts (seedModeNote only), its test, .changeset/ (stop on breach; explain in the report)
    Container & model: S, mode:thread (a project card thread started by the coordinator), model: default, effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: objectstack (packages/cli os diff) | seedModeNote answers replace and upsert/update but nothing for insert, whose loader arm re-inserts like replace | reached by os diff on any package whose seed dataset declares mode: 'insert'
    Thread-read: 6708606759
    Premise: holds — PR #31135 landed (6ffe37ea1), seedModeNote at packages/cli/src/commands/diff.ts:79 on origin/main
    Serial constraints cleared: no open PR touches packages/cli/src/commands/diff.ts (open-PR file scan, 24 PRs)

  5. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#4 · marchtian · session_017ihL2bzGzPEiCJX3i1fYRj

    os-dev-report

    {
      "issue": 31139,
      "status": "done",
      "branch": "claude/project-thread-64ua3t",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/31192",
      "head": "1f5316d18a534870666a2709c58ee5d7e6876cd2",
      "session": "session_017ihL2bzGzPEiCJX3i1fYRj",
      "premise_still_valid": true,
      "summary": "seedModeNote in packages/cli/src/commands/diff.ts now answers mode insert with '; a replay inserts these again, and a row the database refuses is that row's error'. Verified first from the loader: SeedLoaderService.writeRecord case 'insert' calls engine.insert with no match lookup, and decideWriteAction answers insert for insert, replace and default. The replace and upsert/update lines are untouched. One new case in test/diff-upgrade-plan.test.ts pins the note on an insert dataset added and changed, with an ignore dataset changed in the same plan as the silent control; changeset @objectstack/cli patch.",
      "tests": "vitest --project unit test/diff-upgrade-plan.test.ts: 1 file, 8 tests passed. Ablation via scripts/ablation-replace.mjs (subject imported from src, no build leg): new insert line deleted (anchor 1->0, blob b02482c0->5a8ab9b9), the new case red 'Tests 1 failed | 7 passed (8)', restored blob == HEAD and git diff HEAD empty. packages/cli unit layer whole: 396 files passed, 2 refused for an unbuilt packages/cli/dist (published-subpath-console.pin, published-subpath-hook-body.pin); after pnpm --filter @objectstack/cli build both passed (2 files, 29 tests). pnpm --filter @objectstack/cli typecheck exit 0. Integration layer declared to CI (no integration file or spawn entry touched). Run on d0cf8f7ab4; the merge of origin/main (1f5316d18a) brought no packages/cli file.",
      "gates": "dispatch-gates --commands derived 62 families on 1f5316d18a; all 62 recorded exit 0; --ran: '62 derived famil(ies) accounted for — 62 run, 0 NOT-MEASURED' (exit 0). First pass 3 exited 3 (prerequisite): check-plugin-teardown-shape --self-test (shallow clone), check:dual-build-cjs-loads and check:i18n-coverage (unbuilt workspace packages); after git fetch --unshallow and a full turbo build, all 3 reran exit 0. eslint on the two touched TS files exit 0. PR check-runs: in_progress at report time (not awaited).",
      "line_budget": "33 changed lines (+33/-0, 3 files), under the 3000 human-merge threshold",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "deviations": "none",
      "files_changed": [
        ".changeset/cli-diff-insert-seed-note.md",
        "packages/cli/src/commands/diff.ts",
        "packages/cli/test/diff-upgrade-plan.test.ts"
      ],
      "mcp_calls": "0",
      "api_writes": "2 — fleet-write relay pr_create (PR #31192, draft, assignee marchtian); this os-dev-report comment via post-stamped. Plus git push (not REST).",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [],
      "pr_number": 31192
    }
  6. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#4 · marchtian · session_017ihL2dLQEXWGsE2SZ3Qn5F

    Landed · PR #31192 merged by the merge queue as 66bf5b4a019c62f50ed1824b35fe6ba345cf51e3.

    Reading Value
    PR state merged, merged_at from the pulls API
    Card state closed completed by Fixes #31139
    origin/main content seedModeNote answers insert in packages/cli/src/commands/diff.ts

    pm:dispatched removed with this record.

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:serverDomain lane — seat card indexed by label:pm:seatpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions