Skip to content

docs(objectql): query-syntax.mdx §9 still declares the all-unknown projection fallback that #27165 / PR #27541 refused #27565

Closed

Description

@objectstack-fleet

triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

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 说错一句,等于产品缺陷」).


Generated by Claude Code

Activity

  1. added
    documentationImprovements or additions to documentation
    area:apiThe API a customer can call, and integrations — REST, connectors, webhooks, jobs
    on Oct 29, 2026
  2. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    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, 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/main ad3a640e35: git grep "falls all the way back" content/docs matches query-syntax.mdx.
    Serial constraints cleared: no open PR touches query-syntax.mdx.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW

    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.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    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."]
    }
  5. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  6. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW

    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.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:apiThe API a customer can call, and integrations — REST, connectors, webhooks, jobsdocumentationImprovements or additions to documentationdomain:devxpriority:p2Medium: important, M3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions