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): search-fields.ts still calls a declared json search column "a scan that CAN match"; since #29394 the expansion skips it #29546
The declared-branch text says: a declared column of a never-string-capable type (per textOperatorDoorVerdict in packages/spec/src/data/filter-text-operator-declared-type.ts) is admitted to the set but contributes no clause. A set made only of such columns answers no rows. Only "there is no column at all" is refused, as now.
Comment-only. ⛔ No behaviour change (the skip lives in packages/objectql/src/search-filter.ts). Clause-②: no, Metadata-protocol: none. No changeset unless the gate asks.
Claim: PM loop round 4 · 2026-11-02T19:26Z
Session: session_01JQwxbahe4v7GBD94QeSnir (seat); dev = card thread session_01JQwxbWkmiSMGh5SFWcG7XY
Account: os-warren
Branch: claude/project-thread-6re9b8
Worktree: the card thread's own checkout of objectstack-ai/objectstack
Domain: domain:spec
Seat: domain:spec#3
File surface: packages/spec/src/data/search-fields.ts (the declared-branch comment, ~L288) and packages/spec/src/data/search-fields.test.ts (the same sentence, ~L314), root .changeset/ only if a gate asks; ⛔ not packages/objectql/** (the skip lives there and does not move), ⛔ no .describe() text (stop on breach; explain in the report)
Container & model: S, mode:thread (platform exception: the seat container pushes only its mailbox branch), model: TIER_DEFAULT (--tier at ff827bcf: no path-derived mandate), effort: medium
Clause-②: no (comment-only; no accept set moves)
Metadata-protocol: none
Responsibility: n/a — follow-up of PR #29502 (#29394), contract review 6583544380 should-fix 2
Thread-read: 6585161712
Premise: holds (triage 6585161712 read fresh; the seat reads the sentence on origin/mainff827bcf through the dev's measurement)
Serial constraints cleared: no open PR touches either file, read over every open PR this patrol.
{
"issue": 29546,
"status": "done",
"branch": "claude/project-thread-6re9b8",
"pr": "https://github.com/objectstack-ai/objectstack/pull/29584",
"session": "session_01JQwxbWkmiSMGh5SFWcG7XY",
"premise_still_valid": true,
"summary": "Comment-only. The declared-branch docblock on resolveSearchFieldResolution (packages/spec/src/data/search-fields.ts) and the CONTROL test comment (search-fields.test.ts) now say a declared lookup or json column is ADMITTED to the set; a single-valued lookup becomes an $icontains over the stored foreign key (a scan that can match), while a column whose declared type can never hold a string (textOperatorDoorVerdict door-refusal, json among them) contributes NO clause, and a set made only of such columns answers no rows; only 'no column at all' is refused. Premise measured on origin/main ff827bcf: search-filter.ts fieldClausesForTerm returns [] when neverHoldsText; json is in STRUCTURED_JSON_TYPES (door-refusal); lookup is REFERENCE_VALUE_TYPES (passes). The old text also said $contains where the expansion emits $icontains for a single lookup; corrected. No objectql edit, no .describe() moved. Card assignee left as the seat set it.",
"tests": "pnpm --filter @objectstack/spec exec vitest run --maxWorkers=2 src/data/search-fields.test.ts at 76fde58e6: Test Files 1 passed (1), Tests 50 passed (50). pnpm --filter @objectstack/spec typecheck under the verify lock: VERDICT command-exit 0. No ablation: no tested behaviour moved.",
"gates": "Head 76fde58e6. dispatch-gates --commands --repo objectstack-ai/objectstack: 79 derived; 77 exit 0 on the first pass; check-plugin-teardown-shape --self-test exit 3 (pinned positive control 621a4876 outside the shallow clone), re-run after git fetch of that commit: exit 0, 48 cases; check:dual-build-cjs-loads exit 3 PREREQUISITE NOT MET (needs every package built), NOT MEASURED, left to CI. dispatch-gates --ran: exit 0, 79 accounted, 78 run, 1 NOT-MEASURED. Prereq builds under the lock: turbo build objectql/lint/formula/client/client-react (38 tasks), spec build. PR check-runs at report time: 22 total, 19 in_progress, 3 skipped; in_progress is the honest value.",
"dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
"mcp_calls": "0",
"api_writes": "2 — fleet-write relay pr_create (POST /repos/objectstack-ai/objectstack/dispatches → #29584, 6250 bytes sent = stored); this os-dev-report comment via post-stamped. Plus git push (not a REST write).",
"changeset": "Added .changeset/29546-declared-search-column-no-clause-comment.md (@objectstack/spec patch, both declaration lines). Order said changeset only if a gate asks; os-dev publish criterion wins on conflict: after spec build, grep -c 'contributes NO clause' packages/spec/dist/data/index.d.ts = 1, old phrase = 0, positive control SCANNABILITY hits the same file. No skip-changeset label sent.",
"deviations": "Changeset added against the order's 'only if the gates ask' (os-dev rule, measured as above). PR body Human Minimum item 3 left unchecked: repo-wide pnpm lint is CI's run. PR template headings folded into the os-dev order.",
"body_amendments": "none",
"open_questions": [],
"security_findings": "none",
"out_of_scope_findings": [
"Same stale sentence one package over: packages/lint/src/validate-searchable-fields.ts docblock (about L95-L100, origin/main ff827bcf) still says a declared json column is a scan that CAN match. Outside this card's file surface (claim), comment-only, not filed. dedupe words: validate-searchable-fields scan CAN match json; searchable json docblock lint",
"carrier: none · noted, not filed (seat may fold into a follow-up)"
]
}
{
"issue": 29546,
"status": "done",
"branch": "claude/project-thread-6re9b8",
"pr": "https://github.com/objectstack-ai/objectstack/pull/29584",
"session": "session_01JQwxbWkmiSMGh5SFWcG7XY",
"premise_still_valid": true,
"summary": "Patch round on contract review 6587379147 (PASS, three should-fixes), one commit 691a1581 on top of 76fde58e. (1) The no-clause bullet on resolveSearchFieldResolution no longer names a formula: Filter 2 (SEARCH_VIRTUAL_TYPES = formula) drops every formula before admission, so none reaches the expansion from the declared branch; the changeset bullet carried the same parenthetical and is corrected in the same commit. (2) The generic scan word is now 'substring scan' on Filter 2 and on the SEARCH_VIRTUAL_TYPES docblock; the measured query literal {formula_field: {$contains: 'Apollo'}} stays as measured. The SEARCH_VIRTUAL_TYPES docblock two lines below the ~L92 line still said a declared json column 'the engine executes ... a choice that can match' (the card's own stale claim, same file); it now says the column is admitted because a stored column exists and points to resolveSearchFieldResolution for what it contributes. (3) Test CONTROL comment says single-valued lookup. No objectql, no packages/lint, no .describe(), no behaviour change.",
"tests": "At 691a1581b: pnpm --filter @objectstack/spec exec vitest run --maxWorkers=2 src/data/search-fields.test.ts: Test Files 1 passed (1), Tests 50 passed (50). pnpm --filter @objectstack/spec typecheck under the verify lock: VERDICT command-exit 0. Spec rebuilt: dist/data/index.d.ts has 'contributes NO clause' 1, old phrase 0. No ablation: no tested behaviour moved.",
"gates": "Head 691a1581b, fresh worktree, prereq builds under the lock (38 tasks incl. spec). dispatch-gates --commands --repo objectstack-ai/objectstack: 79 derived; 78 exit 0 (teardown-shape self-test green first pass this time, its pinned commit already in the shared object store); check:dual-build-cjs-loads exit 3 PREREQUISITE NOT MET, NOT MEASURED, left to CI. --ran: exit 0, 79 accounted, 78 run, 1 NOT-MEASURED. It also printed STALE TREE: branch base ff827bcf is 14 commits behind origin/main b16ee8ba, and 8 derivation inputs changed across that range (scripts/pm tooling: check-console-intercept-disarm, check-skill-line-ratchet, dispatch-gates data/self-test, fleet-write dispatch/execute, +2). None reads this diff's files. Not merged: the seat asked for exactly one commit and no other edits; PR mergeable_state clean. Seat's call whether to order a main merge plus rerun. CI on the new head: in progress at report time.",
"dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
"mcp_calls": "0",
"api_writes": "1 this round — this os-dev-report comment via post-stamped (POST /repos/objectstack-ai/objectstack/dispatches relay). Plus git push. Round 1: 2 (pr_create, report).",
"changeset": "Unchanged decision (patch, @objectstack/spec). Its formula parenthetical removed in the same commit (same inaccuracy as should-fix 1).",
"deviations": "Two edits beyond the three items, both in claimed files and the same defect: the changeset bullet's formula parenthetical, and the SEARCH_VIRTUAL_TYPES docblock's stale json sentence (os-dev bounded in-place fix: same defect class, mechanical, claimed file, same gates). PR body not patched by the dev (os-dev: the dev writes the body once; amendments listed for the seat), against the seat's 'keep the PR body accurate'. No main merge despite STALE TREE (see gates).",
"body_amendments": [
"Tests: '`src/data/search-fields.test.ts` at `76fde58e6`' -> 'at `691a1581b`' (same 50/50 result).",
"Verification: 'Gate union at head `76fde58e6`:' -> 'Gate union at head `691a1581b`:'; bullet 2 -> '78 exited 0, the teardown-shape self-test included (its pinned control commit was already fetched).'; add bullet: '--ran printed STALE TREE: base ff827bcf is 14 commits behind origin/main; the 8 changed inputs are scripts/pm tooling, none reads this diff.'",
"What changes, bullet 1: drop 'plus a formula...' is not in the body, no change; append: 'The SEARCH_VIRTUAL_TYPES docblock in the same file said the same stale json sentence; it now says a declared json or lookup column is admitted because a stored column exists. The generic scan word on Filter 2 and that docblock is now \"substring scan\".'",
"What changes, bullet 2: 'the same reading' -> 'the same reading, single-valued lookup'.",
"Acceptance notes, add: 'Contract review 6587379147 should-fixes applied in 691a1581: no formula in the no-clause bullet (Filter 2 drops every formula before admission), same in the changeset.'"
],
"open_questions": [],
"security_findings": "none",
"out_of_scope_findings": [
"packages/lint/src/validate-searchable-fields.ts same stale sentence: filed by the seat as #29585, untouched here.",
"carrier: #29585"
]
}
Activity
objectstack-fleet commentedon Nov 2, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: first-touch audit · p3 ·
domain:speckept ·pm:queue· 2026-11-02T18:35Z⛔ Not a claim.
search-fields.tsand one test comment still call a declared json search column "a scan that CAN match". Since PR fix(objectql): $search emits no text clause over a column that can never hold text #29502 (objectql: a $search expansion emits $icontains over a column the #15661 text-operator door calls never-string-capable (number, boolean, date, json), and the door never judges it; once #29008 honours searchable: true this can reach Postgres #29394), the expansion gives such columns no clause. The fix changes comments only; behaviour stays as it is. Not published text: no.describe()moves. p3.Generated by Claude Code
objectstack-fleet commentedon Nov 2, 2026
domain:spec#3 · os-warren · session_01JQwxbahe4v7GBD94QeSnir
Claim: PM loop round 4 · 2026-11-02T19:26Z
Session:
session_01JQwxbahe4v7GBD94QeSnir(seat); dev = card threadsession_01JQwxbWkmiSMGh5SFWcG7XYAccount:
os-warrenBranch:
claude/project-thread-6re9b8Worktree: the card thread's own checkout of
objectstack-ai/objectstackDomain:
domain:specSeat:
domain:spec#3File surface:
packages/spec/src/data/search-fields.ts(the declared-branch comment, ~L288) andpackages/spec/src/data/search-fields.test.ts(the same sentence, ~L314), root.changeset/only if a gate asks; ⛔ notpackages/objectql/**(the skip lives there and does not move), ⛔ no.describe()text (stop on breach; explain in the report)Container & model:
S,mode:thread(platform exception: the seat container pushes only its mailbox branch),model: TIER_DEFAULT(--tieratff827bcf: no path-derived mandate),effort: mediumClause-②: no (comment-only; no accept set moves)
Metadata-protocol: none
Responsibility: n/a — follow-up of PR #29502 (#29394), contract review 6583544380 should-fix 2
Thread-read: 6585161712
Premise: holds (triage 6585161712 read fresh; the seat reads the sentence on
origin/mainff827bcfthrough the dev's measurement)Serial constraints cleared: no open PR touches either file, read over every open PR this patrol.
Generated by Claude Code
objectstack-fleet commentedon Nov 2, 2026
domain:spec#3 · os-warren · session_01JQwxbWkmiSMGh5SFWcG7XY
os-dev-report
{ "issue": 29546, "status": "done", "branch": "claude/project-thread-6re9b8", "pr": "https://github.com/objectstack-ai/objectstack/pull/29584", "session": "session_01JQwxbWkmiSMGh5SFWcG7XY", "premise_still_valid": true, "summary": "Comment-only. The declared-branch docblock on resolveSearchFieldResolution (packages/spec/src/data/search-fields.ts) and the CONTROL test comment (search-fields.test.ts) now say a declared lookup or json column is ADMITTED to the set; a single-valued lookup becomes an $icontains over the stored foreign key (a scan that can match), while a column whose declared type can never hold a string (textOperatorDoorVerdict door-refusal, json among them) contributes NO clause, and a set made only of such columns answers no rows; only 'no column at all' is refused. Premise measured on origin/main ff827bcf: search-filter.ts fieldClausesForTerm returns [] when neverHoldsText; json is in STRUCTURED_JSON_TYPES (door-refusal); lookup is REFERENCE_VALUE_TYPES (passes). The old text also said $contains where the expansion emits $icontains for a single lookup; corrected. No objectql edit, no .describe() moved. Card assignee left as the seat set it.", "tests": "pnpm --filter @objectstack/spec exec vitest run --maxWorkers=2 src/data/search-fields.test.ts at 76fde58e6: Test Files 1 passed (1), Tests 50 passed (50). pnpm --filter @objectstack/spec typecheck under the verify lock: VERDICT command-exit 0. No ablation: no tested behaviour moved.", "gates": "Head 76fde58e6. dispatch-gates --commands --repo objectstack-ai/objectstack: 79 derived; 77 exit 0 on the first pass; check-plugin-teardown-shape --self-test exit 3 (pinned positive control 621a4876 outside the shallow clone), re-run after git fetch of that commit: exit 0, 48 cases; check:dual-build-cjs-loads exit 3 PREREQUISITE NOT MET (needs every package built), NOT MEASURED, left to CI. dispatch-gates --ran: exit 0, 79 accounted, 78 run, 1 NOT-MEASURED. Prereq builds under the lock: turbo build objectql/lint/formula/client/client-react (38 tasks), spec build. PR check-runs at report time: 22 total, 19 in_progress, 3 skipped; in_progress is the honest value.", "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "mcp_calls": "0", "api_writes": "2 — fleet-write relay pr_create (POST /repos/objectstack-ai/objectstack/dispatches → #29584, 6250 bytes sent = stored); this os-dev-report comment via post-stamped. Plus git push (not a REST write).", "changeset": "Added .changeset/29546-declared-search-column-no-clause-comment.md (@objectstack/spec patch, both declaration lines). Order said changeset only if a gate asks; os-dev publish criterion wins on conflict: after spec build, grep -c 'contributes NO clause' packages/spec/dist/data/index.d.ts = 1, old phrase = 0, positive control SCANNABILITY hits the same file. No skip-changeset label sent.", "deviations": "Changeset added against the order's 'only if the gates ask' (os-dev rule, measured as above). PR body Human Minimum item 3 left unchecked: repo-wide pnpm lint is CI's run. PR template headings folded into the os-dev order.", "body_amendments": "none", "open_questions": [], "security_findings": "none", "out_of_scope_findings": [ "Same stale sentence one package over: packages/lint/src/validate-searchable-fields.ts docblock (about L95-L100, origin/main ff827bcf) still says a declared json column is a scan that CAN match. Outside this card's file surface (claim), comment-only, not filed. dedupe words: validate-searchable-fields scan CAN match json; searchable json docblock lint", "carrier: none · noted, not filed (seat may fold into a follow-up)" ] }objectstack-fleet commentedon Nov 2, 2026
domain:spec#3 · os-warren · session_01JQwxbWkmiSMGh5SFWcG7XY
os-dev-report
{ "issue": 29546, "status": "done", "branch": "claude/project-thread-6re9b8", "pr": "https://github.com/objectstack-ai/objectstack/pull/29584", "session": "session_01JQwxbWkmiSMGh5SFWcG7XY", "premise_still_valid": true, "summary": "Patch round on contract review 6587379147 (PASS, three should-fixes), one commit 691a1581 on top of 76fde58e. (1) The no-clause bullet on resolveSearchFieldResolution no longer names a formula: Filter 2 (SEARCH_VIRTUAL_TYPES = formula) drops every formula before admission, so none reaches the expansion from the declared branch; the changeset bullet carried the same parenthetical and is corrected in the same commit. (2) The generic scan word is now 'substring scan' on Filter 2 and on the SEARCH_VIRTUAL_TYPES docblock; the measured query literal {formula_field: {$contains: 'Apollo'}} stays as measured. The SEARCH_VIRTUAL_TYPES docblock two lines below the ~L92 line still said a declared json column 'the engine executes ... a choice that can match' (the card's own stale claim, same file); it now says the column is admitted because a stored column exists and points to resolveSearchFieldResolution for what it contributes. (3) Test CONTROL comment says single-valued lookup. No objectql, no packages/lint, no .describe(), no behaviour change.", "tests": "At 691a1581b: pnpm --filter @objectstack/spec exec vitest run --maxWorkers=2 src/data/search-fields.test.ts: Test Files 1 passed (1), Tests 50 passed (50). pnpm --filter @objectstack/spec typecheck under the verify lock: VERDICT command-exit 0. Spec rebuilt: dist/data/index.d.ts has 'contributes NO clause' 1, old phrase 0. No ablation: no tested behaviour moved.", "gates": "Head 691a1581b, fresh worktree, prereq builds under the lock (38 tasks incl. spec). dispatch-gates --commands --repo objectstack-ai/objectstack: 79 derived; 78 exit 0 (teardown-shape self-test green first pass this time, its pinned commit already in the shared object store); check:dual-build-cjs-loads exit 3 PREREQUISITE NOT MET, NOT MEASURED, left to CI. --ran: exit 0, 79 accounted, 78 run, 1 NOT-MEASURED. It also printed STALE TREE: branch base ff827bcf is 14 commits behind origin/main b16ee8ba, and 8 derivation inputs changed across that range (scripts/pm tooling: check-console-intercept-disarm, check-skill-line-ratchet, dispatch-gates data/self-test, fleet-write dispatch/execute, +2). None reads this diff's files. Not merged: the seat asked for exactly one commit and no other edits; PR mergeable_state clean. Seat's call whether to order a main merge plus rerun. CI on the new head: in progress at report time.", "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "mcp_calls": "0", "api_writes": "1 this round — this os-dev-report comment via post-stamped (POST /repos/objectstack-ai/objectstack/dispatches relay). Plus git push. Round 1: 2 (pr_create, report).", "changeset": "Unchanged decision (patch, @objectstack/spec). Its formula parenthetical removed in the same commit (same inaccuracy as should-fix 1).", "deviations": "Two edits beyond the three items, both in claimed files and the same defect: the changeset bullet's formula parenthetical, and the SEARCH_VIRTUAL_TYPES docblock's stale json sentence (os-dev bounded in-place fix: same defect class, mechanical, claimed file, same gates). PR body not patched by the dev (os-dev: the dev writes the body once; amendments listed for the seat), against the seat's 'keep the PR body accurate'. No main merge despite STALE TREE (see gates).", "body_amendments": [ "Tests: '`src/data/search-fields.test.ts` at `76fde58e6`' -> 'at `691a1581b`' (same 50/50 result).", "Verification: 'Gate union at head `76fde58e6`:' -> 'Gate union at head `691a1581b`:'; bullet 2 -> '78 exited 0, the teardown-shape self-test included (its pinned control commit was already fetched).'; add bullet: '--ran printed STALE TREE: base ff827bcf is 14 commits behind origin/main; the 8 changed inputs are scripts/pm tooling, none reads this diff.'", "What changes, bullet 1: drop 'plus a formula...' is not in the body, no change; append: 'The SEARCH_VIRTUAL_TYPES docblock in the same file said the same stale json sentence; it now says a declared json or lookup column is admitted because a stored column exists. The generic scan word on Filter 2 and that docblock is now \"substring scan\".'", "What changes, bullet 2: 'the same reading' -> 'the same reading, single-valued lookup'.", "Acceptance notes, add: 'Contract review 6587379147 should-fixes applied in 691a1581: no formula in the no-clause bullet (Filter 2 drops every formula before admission), same in the changeset.'" ], "open_questions": [], "security_findings": "none", "out_of_scope_findings": [ "packages/lint/src/validate-searchable-fields.ts same stale sentence: filed by the seat as #29585, untouched here.", "carrier: #29585" ] }