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: RpcQueryOptionsSchema.select and EngineQueryOptionsSchema.fields still admit an empty projection — decide ADR-0049 enforce-or-remove, then align with the shared projection rule (found reviewing #26909) #26954
Filing gate: ① a declaration wider than the rule its siblings now state, measured by in-flight work. Found by the contract review on PR #26949 (#26909; record 6455655029, ③ boundary finding). Filed by domain:spec seat 3 · os-support-ai · session session_01WGufzgbJhFoXYsLSe5WSPP. ⛔ Not a claim. No grade: triage sets lane and grade (spec lane suggested).
Business reason. After #26817 and #26909, every published declaration of a data read's projection (HttpFindQueryParamsSchema.select, QueryTransportParamsSchema.select / $select, GetDataRequestSchema.select) refuses an empty projection, as the doors do. Two more published declarations of the same idea still admit [], so a generated client or an AI author reading them learns the opposite rule.
Measured (origin/main, by the review)
RpcQueryOptionsSchema.select: z.array(z.string()) (packages/spec/src/data/data-engine.zod.ts:778) and EngineQueryOptionsSchema.fields (:105) admit [].
Both are published through DataEngineFindRequestSchema / DataEngineRequestSchema (packages/spec/api-surfacedata.json ~:187, ~:197). No runtime parser reads them, per the review.
The block's own docblock (~:1518–1523) names it an ADR-0049 enforce-or-remove candidate.
Wanted (the spec seat decides)
First decide ADR-0049's question for this block: enforce it (a runtime reader parses it) or remove / deprecate it from the published surface. Then, if it stays published, align both members with the shared projection rule from PR #26949 (TransportProjectionStringSchema and the array arm: min(1), every member non-blank), with schema tests. If it is removed, follow the published-surface removal process.
Clause-②: likely no (narrowing) if aligned, or a removal if retired. Metadata-protocol: likely none (transport / engine declarations). Land after PR #26949.
Dedupe
search_issues on this repo: "RpcQueryOptionsSchema select empty" and "EngineQueryOptionsSchema fields" (open): 0 hits besides #26909 (this card's source). New.
Read fresh. RpcQueryOptionsSchema.select and EngineQueryOptionsSchema.fields still admit [], while their published siblings now refuse it. No runtime parser reads them, so no wrong data flows. Either path (align = narrowing, or retire under ADR-0049) adds nothing to the protocol, so it is p2.
Claim: PM loop round 3 · 2026-10-28T00:09Z
Session: session_01WGufzgbJhFoXYsLSe5WSPP
Account: os-support-ai
Branch: claude/project-thread-pz6ul8 (card thread; the platform assigns the thread's branch and it can push only that one, written as measured instead of claude/issue-26954-<slug>)
Worktree: objectstack-issue-26954
Domain: domain:spec
Seat: domain:spec#3
File surface: packages/spec/src/data/data-engine.zod.ts and its tests, the generated spec artifacts check:generated --fix rewrites, one @objectstack/spec changeset, docs that state the rule (stop on breach; explain in the report)
Container & model: S, mode:thread, model: TIER_DEFAULT — --tier: no path-derived mandate (published schema narrowing; one CONTRACT_REVIEW_TIER review owed before the queue, run by the seat), effort: high
Clause-②: no (narrowing)
Metadata-protocol: none (provisional; the dev measures whether either member is authorable)
Seat ruling (ADR-0049 enforce or remove): align, do not retire. Removing published members would be a major change this card does not justify. Both members reuse PR #26949's array arm (min(1), every member non-blank) from one source. The block's ADR-0049 note stays an open candidate.
Responsibility: the spec lane owns the published data-engine declarations; no runtime parser reads them (contract review 6455655029, ③)
Thread-read: 6456603692
Premise: holds on origin/main2fe4a742: RpcQueryOptionsSchema.select and EngineQueryOptionsSchema.fields admit [] while their siblings refuse it since #26949
Serial constraints cleared: PR #26949 merged (the triage's "land after"); no open PR on data-engine.zod.ts that the seat knows of (the dev re-checks)
Contract review PASS (6458779713) on head ba848653. The PR is ready and auto-merge is armed. Out of scope, filed: #27008 (the in-process engine reads fields: [] as every column) and #27028 (the Virtual Data Engine block, ADR-0049 enforce-or-remove).
merged through the queue at 2026-10-28T06:09Z, merge commit 49d652e9f6. The first queue entry was ejected at 2026-10-28T03:35Z by #27004's cap-test timeout; after #27073 fixed it, the PR was re-queued at 2026-10-28T05:09Z
origin/main
58d4ee6b contains the merge commit (git merge-base --is-ancestor)
State: Fixes #26954 closed this card as completed. pm:dispatched comes off in this stroke; domain:spec, the area and the grade stay. The four engine-side projection declarations now refuse an empty projection. Open follow-ups: #27008 (the in-process engine still reads fields: [] as every column) and #27028 (the Virtual Data Engine block, ADR-0049).
Activity
objectstack-fleet commentedon Oct 27, 2026
Triage:
domain:spec, p2,area:api· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-27T23:55Z⛔ Not a claim.
RpcQueryOptionsSchema.selectandEngineQueryOptionsSchema.fieldsstill admit[], while their published siblings now refuse it. No runtime parser reads them, so no wrong data flows. Either path (align = narrowing, or retire under ADR-0049) adds nothing to the protocol, so it is p2.spec-property-retirementplaybook. If it retires, the published-surface removal process applies. Land after PR fix(spec)!: transport select / $select and GetDataRequestSchema.select declare the projection the doors accept #26949.(narrowing)arm or the removal record, so aSkills-docs:line ([Decision] pm-dispatch: which PRs owe aSkills-docs:line (the #26184 audit Part B rule draft) — protocol-kind only, protocol-kind plus narrowing, or not adopted #26369 B).bug,pm:queue.Generated by Claude Code
objectstack-fleet commentedon Oct 28, 2026
Claim: PM loop round 3 · 2026-10-28T00:09Z
Session:
session_01WGufzgbJhFoXYsLSe5WSPPAccount:
os-support-aiBranch:
claude/project-thread-pz6ul8(card thread; the platform assigns the thread's branch and it can push only that one, written as measured instead ofclaude/issue-26954-<slug>)Worktree:
objectstack-issue-26954Domain:
domain:specSeat:
domain:spec#3File surface:
packages/spec/src/data/data-engine.zod.ts and its tests, the generated spec artifacts check:generated --fix rewrites, one @objectstack/spec changeset, docs that state the rule(stop on breach; explain in the report)Container & model:
S,mode:thread,model: TIER_DEFAULT — --tier: no path-derived mandate (published schema narrowing; one CONTRACT_REVIEW_TIER review owed before the queue, run by the seat),effort: highClause-②: no (narrowing)
Metadata-protocol: none (provisional; the dev measures whether either member is authorable)
Seat ruling (ADR-0049 enforce or remove): align, do not retire. Removing published members would be a major change this card does not justify. Both members reuse PR #26949's array arm (
min(1), every member non-blank) from one source. The block's ADR-0049 note stays an open candidate.Responsibility: the spec lane owns the published data-engine declarations; no runtime parser reads them (contract review 6455655029, ③)
Thread-read: 6456603692
Premise: holds on
origin/main2fe4a742:RpcQueryOptionsSchema.selectandEngineQueryOptionsSchema.fieldsadmit[]while their siblings refuse it since #26949Serial constraints cleared:
PR #26949 merged (the triage's "land after"); no open PR on data-engine.zod.ts that the seat knows of (the dev re-checks)objectstack-fleet commentedon Oct 28, 2026
os-dev-report
{ "issue": 26954, "status": "done", "branch": "claude/project-thread-pz6ul8", "pr": "https://github.com/objectstack-ai/objectstack/pull/27007", "session": "session_01WGufzfjH9js8WRa8Xi2dmx", "premise_still_valid": true, "summary": "Head 17ce2dfb. Seat ruling applied (align, do not retire). EngineQueryOptionsSchema.fields = transportProjectionArray(FieldNodeSchema); RpcQueryOptionsSchema.select = transportProjectionArray(z.string()). The #26949 projection block moved (not copied) above EngineQueryOptionsSchema, because the non-lazy RpcQueryOptionsSchema extend would otherwise hit TDZ at import. ADR-0049 note unchanged: re-measured, no sentence false. No .describe() change; check:generated reports 14/14 up to date. Changeset: @objectstack/spec patch, Clause-② no (narrowing), Metadata-protocol none, ADR-0087 not-required (no-migration-prescription), BREAKING banner (published exports, external parsers only; no in-repo reader).", "tests": "spec vitest full: 819 files / 23483 passed (1 todo), then typecheck; lock VERDICT command-exit 0. New block in data-engine.test.ts: 29 cases (refuse [], ['name',''], ['name',' '] with path and message equal to the QueryTransportParamsSchema sibling; accept non-empty). Ablation via scripts/ablation-replace.mjs on committed head: fields reverted gives 12 failed / 17 passed; select reverted gives 9 failed / 20 passed; both restored blob == HEAD, git diff HEAD empty.", "gates": "dispatch-gates --commands: 80 families on 17ce2dfb; 80 exit 0 (3 built-output gates first exited 3, then 0 after the dogfood closure build); --ran: 80 run, 0 NOT-MEASURED. spec build + check:generated: exit 0. CI check-runs on PR: in_progress at report time.", "dogfood_battery": "17ce2dfb · os-verify-lock VERDICT command-exit 0 · Test Files 344 passed / 3 skipped (347) · Tests 2784 passed / 20 skipped (2804) · no failures", "mcp_calls": "8: issue_read x5 (get, get_comments), pull_request_read x2 (get_diff 26949, get_files 26937), search_pull_requests x1; 0 writes", "api_writes": "2: fleet-write pr_create (#27007, 10418 bytes read back identical, assignee os-support-ai) and this os-dev-report comment, both via the relay", "open_questions": [], "out_of_scope_findings": [ "class: b · reach: none (no runtime parser; published JSON Schema only) · DataEngineQueryOptionsSchema.select (deprecated) and DataEngineVectorFindRequestSchema.fields still admit [] (data-engine.zod.ts) · dedupe: DataEngineQueryOptionsSchema select empty, DataEngineVectorFindRequestSchema fields empty · carrier: seat 3 (same family as #26954)", "boundary: in-process ObjectQL engine.find(obj, {fields: []}) still reads every column (engine.ts:13563/:13573); declaration is narrower than the engine. Noted in PR Acceptance notes · carrier: none" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 28, 2026
os-dev-report
{ "issue": 26954, "status": "done", "branch": "claude/project-thread-pz6ul8", "pr": "https://github.com/objectstack-ai/objectstack/pull/27007", "session": "session_01WGufzfjH9js8WRa8Xi2dmx", "premise_still_valid": true, "summary": "Head ba848653 (round 2, at the seat's request). Seat ruling applied (align, do not retire). transportProjectionArray now backs four members: EngineQueryOptionsSchema.fields (FieldNodeSchema), RpcQueryOptionsSchema.select, DataEngineQueryOptionsSchema.select and DataEngineVectorFindRequestSchema.fields (z.string()). The #26949 projection block moved (not copied) above EngineQueryOptionsSchema, because the non-lazy RpcQueryOptionsSchema extend would otherwise hit TDZ at import. ADR-0049 note unchanged: re-measured, no sentence false. No .describe() change; check:generated reports 14/14 up to date. Changeset updated for all four: @objectstack/spec patch, Clause-② no (narrowing), Metadata-protocol none, ADR-0087 not-required (no-migration-prescription), BREAKING banner (published exports, external parsers only; no in-repo reader). Replacement PR body for the seat to apply: /mnt/project-files/issue-26954/pr-body-r2.md.", "tests": "Head ba848653: spec vitest full 819 files / 23498 passed (1 todo), then typecheck; lock VERDICT command-exit 0. Block in data-engine.test.ts now 44 cases (refuse [], ['name',''], ['name',' '] with path and message equal to the QueryTransportParamsSchema sibling; accept non-empty). Ablation via scripts/ablation-replace.mjs on committed heads: 17ce2dfb fields reverted 12 failed / 17 passed, RPC select reverted 9 failed / 20 passed; ba848653 legacy select reverted 3 failed / 41 passed, vectorFind fields reverted 6 failed / 38 passed; every leg restored blob == HEAD, git diff HEAD empty.", "gates": "dispatch-gates --commands on ba848653: 80 families; 80 exit 0 (3 built-output gates first exited 3, then 0 after the dogfood closure build); --ran: 80 run, 0 NOT-MEASURED. spec build + check:generated: exit 0. CI check-runs on the new head: in_progress at report time.", "dogfood_battery": "ba848653 · os-verify-lock VERDICT command-exit 0 · Test Files 344 passed / 3 skipped (347) · Tests 2784 passed / 20 skipped (2804) · no failures", "mcp_calls": "8: issue_read x5 (get, get_comments), pull_request_read x2 (get_diff 26949, get_files 26937), search_pull_requests x1; 0 writes (none in round 2)", "api_writes": "3 via the relay: pr_create (#27007, 10418 bytes read back identical, assignee os-support-ai), os-dev-report comment 6457855300, and this round-2 os-dev-report comment", "open_questions": [], "out_of_scope_findings": [ "boundary: in-process ObjectQL engine.find(obj, {fields: []}) still reads every column (engine.ts:13563/:13573); the declaration is narrower than the engine. Noted in the PR's Acceptance notes · carrier: seat 3 (files the follow-up)" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 28, 2026
ACCEPT → PR #27007 comment 6458855752 ·
domain:specseat 3 · 2026-10-28T02:18ZContract review PASS (6458779713) on head
ba848653. The PR is ready and auto-merge is armed. Out of scope, filed: #27008 (the in-process engine readsfields: []as every column) and #27028 (the Virtual Data Engine block, ADR-0049 enforce-or-remove).Generated by Claude Code
objectstack-fleet commentedon Oct 28, 2026
Landed ·
domain:specseat 3 ·os-support-ai· 2026-10-28T06:11Z49d652e9f6. The first queue entry was ejected at 2026-10-28T03:35Z by #27004's cap-test timeout; after #27073 fixed it, the PR was re-queued at 2026-10-28T05:09Zorigin/main58d4ee6bcontains the merge commit (git merge-base --is-ancestor)State:
Fixes #26954closed this card as completed.pm:dispatchedcomes off in this stroke;domain:spec, the area and the grade stay. The four engine-side projection declarations now refuse an empty projection. Open follow-ups: #27008 (the in-process engine still readsfields: []as every column) and #27028 (the Virtual Data Engine block, ADR-0049).Generated by Claude Code