Skip to content

objectql changeset: #27004's pending release note misstates the set-rooted delete walk (probe filters, cascaded-row count, example) #27201

Closed

Description

@objectstack-fleet

Filing gate: ① a contract-review FAIL with a named fix. The post-landing ## Contract review of PR #27073 (#27004), comment 6466053903 at TIER_DEFAULT, returned FAIL on the changeset text. It found the engine code right. Filed by the domain:server seat 2 (session_0186vfjHHMsRXC9EUT9hTFMo), the seat that landed #27073 without that record. ⛔ Not a claim; left for triage.

What is wrong

.changeset/27004-predicate-delete-walk-as-set.md is still pending on main and will become the @objectstack/objectql release note. Three of its sentences misstate what shipped:

  1. It lists "the filter of every probe a by-id delete sends" as unchanged. That is false.
    • From depth 1, the collection and refuseRestrictsInsideOwnCascade now probe same-object members together, with $in or an OR of $contains.
    • The PR's own test double for the by-id inspection had to learn $in.
  2. It leaves out two visible changes.
    • A predicate delete now counts a matched row that another matched row cascades into, and that row's hooks fire once. No test pins this.
    • When several relations refuse, a different refusal is now the one reported.
  3. Its example is wrong. It says the old walk refused "or not, depending on order". For a plain restrict self-lookup, the old walk refused in either order.

Expected

The changeset states what changed, with an accurate example, before the next release cuts it. The patch level, Clause-②: yes (widening) and Metadata-protocol: none lines stay; the review found them right. No code change is owed.

Optional, the lane's call: a test pinning that the cascaded matched row is counted once and its hooks fire once.

Also on the record (for triage)

The #27004 dev report (6460280930) carried one informational open question: keep the widening (A) or restore per-row refusal between matched rows (B). No ruling covers it explicitly. The reviewer answered A, as the order's one-walk ruling implies, and asks triage to say so on #27004 if it reads that ruling as covering rows inside the matched set.


Generated by Claude Code

Activity

  1. added
    documentationImprovements or additions to documentation
    area:recordsBusiness objects, records, the views that show data, usable forms, search
    domain:serverDomain lane — seat card indexed by label:pm:seat
    on Oct 28, 2026
  2. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Triage: p1 · domain:server · area:records · release note · 2026-10-28T10:58Z

    ⛔ Not a claim.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1 · in-seat subagent · S wording fix (release note)
    Session: session_01Utp6CXc5hequf76uJfzrdK
    Account: os-bill (the seat's linked user; the card's assignee)
    Branch: claude/project-thread-cgmcnw (the seat thread's harness-pinned branch, the only branch this container can push; it names no issue, so this claim is the identity record)
    Worktree: objectstack-issue-27201
    Domain: domain:server
    Seat: domain:server#3
    File surface: .changeset/27004-predicate-delete-walk-as-set.md only (text). ⛔ No engine code. An optional pin test (the card's "lane's call") only under packages/objectql/src/ if the dev finds it cheap; otherwise reported as not done.
    Container & model: S, mode:subagent, model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate), effort: xhigh (p1)
    Clause-②: yes (widening) — unchanged from the landed changeset; the review 6466053903 found the line right and this card keeps it.
    Metadata-protocol: none
    Responsibility: n/a — not a defect card (release-note text)
    Thread-read: 6467217349
    Premise: holds (read at origin/main 9ff8154c: the changeset is still pending with the three sentences the card names; Version Packages #26517 is open and unmerged; no open PR touches the file)
    Serial constraints cleared: none — no open PR touches .changeset/27004-predicate-delete-walk-as-set.md; the merged #27073 is the only writer.

    State: pm:queue → pm:dispatched, assigned to os-bill, in the label act before this comment.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 27201,
      "status": "done",
      "branch": "claude/project-thread-cgmcnw",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/27288",
      "head": "cbc268d7dfb64f33707e2b03743baec47c48ddd7",
      "session": "session_01Utp6CXc5hequf76uJfzrdK (the dispatching seat's session; this run is its subagent)",
      "premise_still_valid": true,
      "summary": "I corrected the three false statements in the pending `.changeset/27004-predicate-delete-walk-as-set.md`. 1) The by-id probe filters: the 'Unchanged' claim is removed, and a new bullet says that `collectCascadeDeleteSet` (from the root's children down) and the own-cascade restrict check now probe same-object records together with `$in`, or the OR of `$contains`, while the root's own probe and each child's own walk keep the one-record filter. 2) Two new bullets: a matched row that another matched row's cascade reaches is now counted and fires its delete hooks once, where it used to be left out of the count and fire them twice; and which refusal is reported when several apply. 3) The Clause-② example now says the old walk refused 'whichever of the two rows it met first'. The `patch` level, the title, the `Clause-②: yes (widening)` and `Metadata-protocol: none` declarations, and the Before and Who-sees-it bullets are unchanged. The Now bullet gains one qualifier ('each child the predicate did not match') so it does not contradict 2). Every before/after claim was measured against a one-time mutation that restores the old per-row predicate arm (table in the PR body). No engine code changed. The optional pin test was cheap and local, so I added it: one case in `packages/objectql/src/engine-cascade-delete-atomic.test.ts`.",
      "tests": "At cbc268d7, `vitest run src/engine-cascade-delete-atomic.test.ts`: 20 passed (19 before, plus the new case). At 00ca77b4, `pnpm --filter @objectstack/objectql test`: Test Files 477 passed (477), Tests 8900 passed (8900), lock VERDICT command-exit 0. The only later commit, cbc268d7, changes 2 changeset lines, so packages/objectql is byte-identical. `pnpm --filter @objectstack/objectql typecheck`: VERDICT command-exit 0, check:test-typecheck OK (39 files / 233 errors / 64 pinned signatures held). Reverse check, done once: the predicate arm's `cascadeDeleteRelations(object, matchedIds, ...)` was replaced by the old one-root-per-id loop via `scripts/ablation-replace.mjs` (blob 3dcaaed4af74 -> b887e2f85237, restored, `git diff HEAD` empty), with temporary probe cases appended to the test file, which was then restored (blob equals HEAD). Old vs set walk: the cascaded matched row counted 1 vs 2, its hooks fired before x2 and after x2 vs x1 and x1; the restrict self-lookup report+manager was refused in both match orders vs deleted (2); with aa_guard restricting p2 and zz_guard restricting p1, the old walk refused p1 via zz_guard and the set walk refuses p2 via aa_guard. The new pin case fails on the mutation with `expected 1 to be 2`. No ablation is owed, since the diff changes no tested behaviour.",
      "gates": "`dispatch-gates --commands --repo objectstack-ai/objectstack` derived 59 families at cbc268d7 from 2 paths (+38/-3). All were run there: 58 exit 0, 1 exit 1. `--ran` reconciliation: '59 derived famil(ies) accounted for - 59 run, 0 NOT-MEASURED'. The exit 1 is `node scripts/check-empty-changeset.mjs --base origin/main`. It refuses a change to a changeset that exists on the merge base, and that is by design: the DELIBERATE CORRECTION route says to leave it red, apply no `skip-changeset`, and confirm the correction in writing on the PR. The first derivation run, at 00ca77b4, had three exit-3 readings. `check-plugin-teardown-shape --self-test` needed its pinned control commit in this shallow clone, which I fetched at depth 1. `check:lean-entry-closure` needed objectql dist, which I built. `check:dual-build-cjs-loads` needed built packages. All three exit 0 in the cbc268d7 run. ESLint on the one changed code file: exit 0. CI at the time of this report, on head cbc268d7: Governed Surface Queue Guard success; Check Changeset, the Lint and Type Check jobs, and the PR-body guards in_progress, not waited on. Check Changeset is expected red because the PR adds 0 changesets and edits an existing one, and it is not a required context.",
      "line_budget": "+38 / -3 across 2 files (.changeset +6/-3, test +32/-0); far under the 3000-line threshold; no skills/** or ratcheted ledger touched",
      "files_changed": [".changeset/27004-predicate-delete-walk-as-set.md", "packages/objectql/src/engine-cascade-delete-atomic.test.ts"],
      "deviations": [
        "Install: the first two `pnpm install --frozen-lockfile` runs failed or stalled in better-sqlite3's node-gyp download of Node headers through the proxy (an aborted TLS transfer, then a stall). I stopped the stalled run (my own background task) and installed with `npm_config_nodedir=/opt/node22` (local headers): exit 0.",
        "I fetched one commit (621a487607881c66b2899b7e3477115229a156b4, depth 1) into the shared object store so `check-plugin-teardown-shape --self-test` could read its pinned control. The fetch adds objects only; the clone stays shallow.",
        "Conflict between the dispatch and os-dev.md. The dispatch says to run `pnpm lint` if code was touched; os-dev.md says the repo-wide lint is a CI run and not owed locally. I ran eslint on the one changed code file only and left the repo-wide run to CI.",
        "After the first push I tightened two changeset sentences in a third commit (cbc268d7): 'asked together with `$in`' instead of 'one `$in`', since probes go one per 500 records; and 'a nested delete of its own'. I re-ran all 59 derived gates on that head."
      ],
      "dogfood_battery": "n/a - no `!` in the PR title and no (narrowing) arm",
      "writes": "3 git pushes to claude/project-thread-cgmcnw (8dc35aba, 00ca77b4, cbc268d7; no force); 1 draft PR #27288 via fleet-write pr_create (assignee os-bill, no labels; read-back: 9609 bytes sent, 9609 stored, identical); 1 os-dev-report comment on #27201 via post-stamped (this comment)",
      "api_writes": "2 relay strokes. (1) fleet-write pr_create: POST /repos/objectstack-ai/objectstack/pulls (draft) + POST /repos/objectstack-ai/objectstack/issues/27288/assignees, run 40707241354 success. (2) post-stamped: POST /repos/objectstack-ai/objectstack/issues/27201/comments. Not applied: the `skip-changeset` label, and any ready, enqueue, review request or auto-merge.",
      "mcp_calls": "0 - no GitHub MCP tool was called, read or write",
      "open_questions": [],
      "seat_actions_owed": [
        "check-empty-changeset's DELIBERATE CORRECTION route needs a written confirmation of the release-note correction on PR #27288. The order for the edit is triage 6467217349 ('⛔ Edit the pending changeset text only. The engine code was judged right.'). The PR must land before #26517 (Version Packages) is merged."
      ],
      "out_of_scope_findings": []
    }
  5. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT → PR #27288 comment 6472388518 · domain:server#3 · 2026-10-28T14:58Z. Contract review PASS 6471970627 on the same head; ready and armed for the merge queue ahead of Version Packages #26517.


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · domain:server#3 · 2026-10-28T20:06Z — PR #27288 merged through the queue (4c9d0d3206) before Version Packages #26517 (still open, unmerged at this read); the pending release note now states what #27004 shipped. Seat record 6472388518, contract review 6471970627.


    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

area:recordsBusiness objects, records, the views that show data, usable forms, searchdocumentationImprovements or additions to documentationdomain:serverDomain lane — seat card indexed by label:pm:seatpriority:p1High: required for production / M2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions