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
docs(objectql): query-syntax.mdx §9 still declares the all-unknown projection fallback that #27165 / PR #27541 refused #27565
Filing gate ①, the review after landing of PR #27541 (maintainer ruling #27345: a PR that landed owing a review is reviewed on its landed head, and each must-fix becomes a new card). The FAIL record is comment 6497589244 on PR #27541, merge commit ee9a8d6e. ⛔ Not a claim.
The defect
Must-fix 1 — the published protocol page still declares the capability this PR retired, for exactly the callers it affects.content/docs/protocol/objectql/query-syntax.mdx §9 "Unknown Fields Are Tolerated", on origin/main L1487-1507, says: L1489 "Unknown field names are not rejected by engine.find()", and in its callout L1503-1506 "a projection left with no known field falls all the way back to every field. The engine's tolerance guards internal callers (hooks, flows, expand sub-reads, registry-less hosts) that never pass through that ingress." After ee9a8d6e that sentence is false for find / findOne on a registered object: the all-unknown case is refused 400 VALIDATION_ERROR (engine.ts L13639, L13944), and only the mixed case is tolerated. A hook or flow author reading the protocol page is taught the one shape the engine now refuses. A retirement is the declaration and the code together; the Skills-docs: line names only queries.mdx. The prior record named this page explicitly; the delta commit did not touch it.
Done when
§9's lead sentence and callout say that an unknown plain column is dropped only while at least one requested column is known; that a projection whose every entry is unknown is refused by engine.find() / findOne() with 400 VALIDATION_ERROR naming the requested columns, the same refusal as fields: [] (#27008, #27165); that expand sub-reads are unaffected because they always name id; and that the REST ingress still answers 400 INVALID_FIELD for any unknown name. The "falls all the way back to every field" clause reads as the closed history it is or is removed. git grep -n "falls all the way back" content/docs returns nothing, Build Docs and Check Documentation Links are green on the fix PR, and the fix PR's Skills-docs: line names this page. Prose-only, skip-changeset, no code.
Triage grade: p2 · domain:devx (content/docs/**) · area:api. A published protocol page teaches a hook or flow author the one shape the engine now refuses (「写给 AI 的文档与 skills 说错一句,等于产品缺陷」).
Claim: PM loop round 8 · 2026-10-29T13:13Z
Session: session_01QSeKYmTYfaPbLQD4BJfomW (the dispatching seat; the dispatch note under this claim names the cloud session)
Account: os-justin (the seat's linked user, as GET /user answers it; the card's assignee)
Branch: claude/issue-27565-query-syntax-projection
Worktree: the cloud session's own container
Domain: domain:devx
Seat: domain:devx#2
File surface: content/docs/protocol/objectql/query-syntax.mdx §9 only: the lead sentence and the callout, rewritten to the card's "Done when", read against the code that #27541 landed (ee9a8d6e). The rewrite covers four points:
an unknown plain column is dropped only while at least one requested column is known;
an all-unknown projection is refused by find() / findOne() with 400 VALIDATION_ERROR, naming the requested columns, the same refusal as fields: [];
expand sub-reads are unaffected;
the REST ingress answers 400 INVALID_FIELD.
Every claim is verified in the engine and the tests, never taken from the card's wording. ⛔ No code, prose only (stop on breach; explain in the report)
Container & model: S, mode:cloud, model: TIER_DEFAULT (dispatch-gates --tier: "no path-derived mandate"), effort: medium
Clause-②: no
Metadata-protocol: none
Responsibility: PR #27541 (merged as ee9a8d6e) narrowed the engine's projection fallback and left the published page's §9 describing the old fallback; FAIL record 6497589244
Ruling-ref: none — filing gate ① (a review-after-landing must-fix, per ruling #27345)
Thread-read: none
Premise: holds at origin/mainad3a640e35: git grep "falls all the way back" content/docs matches query-syntax.mdx.
Serial constraints cleared: no open PR touches query-syntax.mdx.
Dispatched under claim 6497660661 · 2026-10-29T13:15Z: cloud session session_01QSeKYp3oFeDem8Tbh8pzWA (mode:cloud, TIER_DEFAULT), branch claude/issue-27565-query-syntax-projection. The report comes back here as os-dev-report.
{
"issue": 27565,
"status": "done",
"branch": "claude/issue-27565-query-syntax-projection",
"pr": "https://github.com/objectstack-ai/objectstack/pull/27586",
"session": "session_01QSeKYp3oFeDem8Tbh8pzWA",
"premise_still_valid": true,
"summary": "Rewrote content/docs/protocol/objectql/query-syntax.mdx §9. The heading changed from 'Unknown Fields Are Tolerated' to 'Unknown Projection Fields'; the lead sentence, the example and the callout were rewritten. The page now says: an unknown plain column is dropped only while one requested column is known (id/created_at/updated_at always count as known); an all-unknown projection is refused by find()/findOne() with 400 VALIDATION_ERROR naming the requested columns, the fields: [] refusal; expand sub-reads are unaffected because the engine always adds id; the REST ingress answers 400 INVALID_FIELD for any unknown name, alone or mixed. The 'falls all the way back' clause is removed: git grep -n over content/docs returns nothing (exit 1). Each clause is cited file:line against code and a test in the PR body (head 6535c19c). Prose only, one file, +20/-10. Card assignee untouched; the PR carries no assignees.",
"tests": "head 6535c19c: os-verify-lock 'pnpm --filter @objectstack/objectql exec vitest run --maxWorkers=2 src/engine-empty-projection-refusal.test.ts src/query-expression-conformance.test.ts' → VERDICT command-exit 0, Test Files 2 passed (2), Tests 209 passed (209). These suites pin the cited clauses; nothing was added. No ablation: docs-only diff, no tested behaviour changed.",
"gates": "head 6535c19c (merged origin/main 1ed33609): affected-docs.mjs exit 0 (0 docs named). dispatch-gates --commands --repo objectstack-ai/objectstack derived 43 commands, the same list before and after the merge; all 43 recorded ':: exit 0'. Five first answered exit 3 or 1 on stale prerequisites (packages/lint and client-react dist not built; spec json-schema stale after the merge) until the lint... and client-react... closures were rebuilt under the lock; then exit 0 (check:doc-formula-expressions, check:doc-security-posture, check:skill-examples, check:docs-transcript-drift, check:docs). --ran: '43 derived famil(ies) accounted for — 43 run, 0 NOT-MEASURED (a DERIVED zero — all 43 recorded an exit code and none of them is 3)'. CI families, incl. Build Docs and Check Documentation Links: in_progress at report time, PR #27586 check-runs not yet read; NOT MEASURED locally (CI-only jobs).",
"dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
"mcp_calls": "0",
"api_writes": "2 — (1) fleet-write relay dispatch fw-20261029T135500Z-4dbdcc (run 40886376905, success) executing pr_create: POST /repos/objectstack-ai/objectstack/pulls (draft) + POST /repos/objectstack-ai/objectstack/issues/27586/labels [skip-changeset]; read back: body 5664 bytes identical, labels ['skip-changeset'], assignees none, draft true. (2) this os-dev-report comment on #27565 via scripts/pm/post-stamped.mjs. git push is not counted.",
"open_questions": [
{ "question": "The card's four clauses all hold against the code. Two precisions went in that the card did not state. The tolerance and the refusal apply on a REGISTERED object only: the filter runs only when the schema has fields, and an unregistered object is refused 404 OBJECT_NOT_FOUND first. id/created_at/updated_at always count as known, so ['id','nope'] is not refused. The old callout's 'registry-less hosts' mention was dropped for the same reason. Keep these precisions?", "options": ["A keep them, as landed", "B trim to the card's four clauses verbatim"], "recommendation": "A, because the docs follow the code, and a reader asking why ['id','nope'] is not refused gets the answer from the page" }
],
"out_of_scope_findings": ["carrier: none · noted, not filed: the REST INVALID_FIELD message (packages/metadata-protocol/src/protocol-query-validation.ts:716-727) still explains itself with 'a projection naming no known field fell all the way back to every field'. It is past tense and accurate as the ingress's own history, so it is not a defect."]
}
ACCEPT → PR #27586 comment 6498984756 · 2026-10-29T14:12Z · ready + auto-merge armed. Open question → A (the two precisions stay, since they follow the code).
Landed: PR #27586, merged as 492703e14d through the merge queue · 2026-10-29T14:36Z
Merged = reviewed. The merged diff matches the reviewed head 6535c19c0c: the sorted +/− lines are hash-identical, 1 file, +20/−10. ACCEPT → PR #27586 comment 6498984756. The card was closed by Fixes #27565. pm:dispatched is removed and the assignee cleared in this act, and cloud session session_01QSeKYp3oFeDem8Tbh8pzWA is archived. git grep "falls all the way back" content/docs now has no hits on main. Nothing remains.
Activity
objectstack-fleet commentedon Oct 29, 2026
domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW
Claim: PM loop round 8 · 2026-10-29T13:13Z
Session:
session_01QSeKYmTYfaPbLQD4BJfomW(the dispatching seat; the dispatch note under this claim names the cloud session)Account:
os-justin(the seat's linked user, asGET /useranswers it; the card's assignee)Branch:
claude/issue-27565-query-syntax-projectionWorktree: the cloud session's own container
Domain:
domain:devxSeat:
domain:devx#2File surface:
content/docs/protocol/objectql/query-syntax.mdx§9 only: the lead sentence and the callout, rewritten to the card's "Done when", read against the code that #27541 landed (ee9a8d6e). The rewrite covers four points:find()/findOne()with400 VALIDATION_ERROR, naming the requested columns, the same refusal asfields: [];expandsub-reads are unaffected;400 INVALID_FIELD.Every claim is verified in the engine and the tests, never taken from the card's wording. ⛔ No code, prose only (stop on breach; explain in the report)
Container & model: S,
mode:cloud,model: TIER_DEFAULT(dispatch-gates --tier: "no path-derived mandate"),effort: mediumClause-②: no
Metadata-protocol: none
Responsibility: PR #27541 (merged as
ee9a8d6e) narrowed the engine's projection fallback and left the published page's §9 describing the old fallback; FAIL record 6497589244Ruling-ref: none — filing gate ① (a review-after-landing must-fix, per ruling #27345)
Thread-read: none
Premise: holds at
origin/mainad3a640e35:git grep "falls all the way back" content/docsmatchesquery-syntax.mdx.Serial constraints cleared: no open PR touches
query-syntax.mdx.Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW
Dispatched under claim 6497660661 · 2026-10-29T13:15Z: cloud session
session_01QSeKYp3oFeDem8Tbh8pzWA(mode:cloud,TIER_DEFAULT), branchclaude/issue-27565-query-syntax-projection. The report comes back here asos-dev-report.Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:devx#2 · os-justin · session_01QSeKYp3oFeDem8Tbh8pzWA
os-dev-report
{ "issue": 27565, "status": "done", "branch": "claude/issue-27565-query-syntax-projection", "pr": "https://github.com/objectstack-ai/objectstack/pull/27586", "session": "session_01QSeKYp3oFeDem8Tbh8pzWA", "premise_still_valid": true, "summary": "Rewrote content/docs/protocol/objectql/query-syntax.mdx §9. The heading changed from 'Unknown Fields Are Tolerated' to 'Unknown Projection Fields'; the lead sentence, the example and the callout were rewritten. The page now says: an unknown plain column is dropped only while one requested column is known (id/created_at/updated_at always count as known); an all-unknown projection is refused by find()/findOne() with 400 VALIDATION_ERROR naming the requested columns, the fields: [] refusal; expand sub-reads are unaffected because the engine always adds id; the REST ingress answers 400 INVALID_FIELD for any unknown name, alone or mixed. The 'falls all the way back' clause is removed: git grep -n over content/docs returns nothing (exit 1). Each clause is cited file:line against code and a test in the PR body (head 6535c19c). Prose only, one file, +20/-10. Card assignee untouched; the PR carries no assignees.", "tests": "head 6535c19c: os-verify-lock 'pnpm --filter @objectstack/objectql exec vitest run --maxWorkers=2 src/engine-empty-projection-refusal.test.ts src/query-expression-conformance.test.ts' → VERDICT command-exit 0, Test Files 2 passed (2), Tests 209 passed (209). These suites pin the cited clauses; nothing was added. No ablation: docs-only diff, no tested behaviour changed.", "gates": "head 6535c19c (merged origin/main 1ed33609): affected-docs.mjs exit 0 (0 docs named). dispatch-gates --commands --repo objectstack-ai/objectstack derived 43 commands, the same list before and after the merge; all 43 recorded ':: exit 0'. Five first answered exit 3 or 1 on stale prerequisites (packages/lint and client-react dist not built; spec json-schema stale after the merge) until the lint... and client-react... closures were rebuilt under the lock; then exit 0 (check:doc-formula-expressions, check:doc-security-posture, check:skill-examples, check:docs-transcript-drift, check:docs). --ran: '43 derived famil(ies) accounted for — 43 run, 0 NOT-MEASURED (a DERIVED zero — all 43 recorded an exit code and none of them is 3)'. CI families, incl. Build Docs and Check Documentation Links: in_progress at report time, PR #27586 check-runs not yet read; NOT MEASURED locally (CI-only jobs).", "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm", "mcp_calls": "0", "api_writes": "2 — (1) fleet-write relay dispatch fw-20261029T135500Z-4dbdcc (run 40886376905, success) executing pr_create: POST /repos/objectstack-ai/objectstack/pulls (draft) + POST /repos/objectstack-ai/objectstack/issues/27586/labels [skip-changeset]; read back: body 5664 bytes identical, labels ['skip-changeset'], assignees none, draft true. (2) this os-dev-report comment on #27565 via scripts/pm/post-stamped.mjs. git push is not counted.", "open_questions": [ { "question": "The card's four clauses all hold against the code. Two precisions went in that the card did not state. The tolerance and the refusal apply on a REGISTERED object only: the filter runs only when the schema has fields, and an unregistered object is refused 404 OBJECT_NOT_FOUND first. id/created_at/updated_at always count as known, so ['id','nope'] is not refused. The old callout's 'registry-less hosts' mention was dropped for the same reason. Keep these precisions?", "options": ["A keep them, as landed", "B trim to the card's four clauses verbatim"], "recommendation": "A, because the docs follow the code, and a reader asking why ['id','nope'] is not refused gets the answer from the page" } ], "out_of_scope_findings": ["carrier: none · noted, not filed: the REST INVALID_FIELD message (packages/metadata-protocol/src/protocol-query-validation.ts:716-727) still explains itself with 'a projection naming no known field fell all the way back to every field'. It is past tense and accurate as the ingress's own history, so it is not a defect."] }objectstack-fleet commentedon Oct 29, 2026
domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW
ACCEPT → PR #27586 comment 6498984756 · 2026-10-29T14:12Z · ready + auto-merge armed. Open question → A (the two precisions stay, since they follow the code).
Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW
Landed: PR #27586, merged as
492703e14dthrough the merge queue · 2026-10-29T14:36ZMerged = reviewed. The merged diff matches the reviewed head
6535c19c0c: the sorted +/− lines are hash-identical, 1 file, +20/−10. ACCEPT → PR #27586 comment 6498984756. The card was closed byFixes #27565.pm:dispatchedis removed and the assignee cleared in this act, and cloud sessionsession_01QSeKYp3oFeDem8Tbh8pzWAis archived.git grep "falls all the way back" content/docsnow has no hits onmain. Nothing remains.Generated by Claude Code