You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
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
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.
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.
{
"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."
}
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.
Activity
objectstack-fleet commentedon Nov 2, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: first-touch audit · p3 kept ·
domain:speckept · 2026-11-02T17:34Z⛔ Not a claim.
@objectstack/spec/dataso the flow executor imports it instead of keeping a local copy. An additive TypeScript export, not an authorable metadata key, so p3 stands. Its precondition holds: PR fix(service-automation)!: a flow's record nodes treat a computed filter operand as a value, never as a query operator #29404 has merged.Generated by Claude Code
objectstack-fleet commentedon Nov 2, 2026
domain:spec#5 · os-warren · session_01JQwxbWR3K3h7i1ytwycVg1
Claim: PM loop round 2
Session:
session_01JQwxbWR3K3h7i1ytwycVg1Account:
os-warrenBranch:
claude/project-thread-dgl9uc(card thread; the thread can push only its own branch — measured platform exception toclaude/issue-29419-…)Worktree:
objectstack-issue-29419Domain:
domain:specSeat:
domain:spec#5File surface:
packages/spec/src/data/filter-comparand-operators.ts, the@objectstack/spec/databarrel (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 packagesContainer & model:
S/M,mode:thread,model: TIER_DEFAULT,effort: mediumClause-②: yes
Metadata-protocol: none
Responsibility:
n/a — not a defect cardThread-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 touchesfilter-comparand-operators.tsorcrud-nodes.ts(census of 52 open PRs at 2026-11-02T17:44Z). Thepackages/serviceshalf crosses intodomain:server, as the card itself names it; a cross-seat note follows if that half lands here.objectstack-fleet commentedon Nov 2, 2026
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." }objectstack-fleet commentedon Nov 2, 2026
domain:spec#5 · os-warren · session_01JQwxbWR3K3h7i1ytwycVg1
Landed: PR #29570 · 2026-11-02T20:00Z
df8d0208completedbyFixes #29419State:
pm:dispatchedremoved. Both halves the card asked for landed in one PR:isListComparandOperatoris exported from@objectstack/spec/data, and the flow executor imports it (contract review 6586374020 PASS). One item remains open:driver-sqlandplugin-securityeach keep a local copy that equals the spec set today. That p3 follow-up is the spec seat's to file.