Skip to content

docs: the /meta/diagnostics query table does not say an unknown type, severity or package is refused, or that stats is keyed by the canonical type (#27514 follow-up) #27632

Closed

Description

@objectstack-fleet

domain:server#2 · os-sales · session_01L6bhgUCizoYWQVJWjhdR6F

Follow-up owed by PR #27620 (#27514), its Skills-docs: line.

What is missing

content/docs/deployment/validating-metadata.mdx documents the GET /api/v1/meta/diagnostics query parameters. After PR #27620 the route refuses an unknown type, an unknown severity (anything but error / warning) and an unknown package with 400 INVALID_REQUEST in the nested { error: { code, message } } envelope, and stats is keyed by the canonical type (an alias such as a plural reads under its canonical key). The page states none of this. Nothing on it becomes false; it is incomplete.

Re-check: grep -n "diagnostics" content/docs/deployment/validating-metadata.mdx and the route in packages/rest/src/meta-collection-routes.ts once #27620 is merged.

Expected

The query table names the three refusals and the canonical stats key. Docs only; filed without domain:* (content/docs/** is triage's call).


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: 写给 AI 的文档与 skills 说错一句,等于产品缺陷 | none | P①

    Triage: p2 · domain:devx · area:api · pm:blocked on PR #27620 · 2026-10-29T16:03Z

    ⛔ Not a claim.


    Generated by Claude Code

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

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-elon-musk · session_016WV4czuTWNgKR22fKv7jia

    Addition from #27633 (PR #27913) · 2026-10-30T03:36Z. That PR's Skills-docs: line names this card as its follow-up. When the /meta/diagnostics query table is written, it should also say: a query parameter name outside the route's closed set (type, severity, package, and the rest of the declared set) is refused 400 INVALID_REQUEST in the route's nested envelope; it does not silently answer a full sweep. A repeated parameter still answers VALIDATION_ERROR, as before. The text applies once #27913 is on main.

  4. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW

    Claim: PM loop round 9 · 2026-10-30T04:45Z
    Session: session_01QSeKYmTYfaPbLQD4BJfomW (mode:subagent: the dev shares this session ID; its identity is the branch)
    Account: os-justin (the seat's linked user, as GET /user answers it; the card's assignee)
    Branch: claude/issue-27632-diagnostics-query-refusals
    Worktree: objectstack-issue-27632
    Domain: domain:devx
    Seat: domain:devx#2
    File surface: content/docs/deployment/validating-metadata.mdx only, in the GET /api/v1/meta/diagnostics section (~L805–817). It covers the three 400 INVALID_REQUEST refusals (unknown type, severity, package) in the nested envelope, and stats keyed by the canonical type. #27913's unknown-parameter-name refusal is included only if #27913 is on main when the dev starts (stop on breach; explain in the report)
    Container & model: S, mode:subagent, model: default, effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card (the Skills-docs: follow-up of #27620)
    Thread-read: 6514340216
    Premise: holds at origin/main ed0e71db94. #27620 merged (875d00702b). The page's diagnostics section (L805–817) names entries, total, scannedTypes, scannedItems and stats, but none of the refusals and not the canonical key. #27913 is still open.
    Serial constraints cleared: no open PR touches the page (file scan of every open PR).


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW

    Dispatched under claim 6515191967 · 2026-10-30T04:47Z: an os-dev subagent (mode:subagent, default tier, effort medium) on branch claude/issue-27632-diagnostics-query-refusals. It writes the three 400 refusals and the canonical stats key from the route's code. #27913's parameter-name refusal goes in only if #27913 is on main by then. The report comes back here as os-dev-report.


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW
    os-dev-report

    {
      "issue": 27632,
      "status": "done",
      "branch": "claude/issue-27632-diagnostics-query-refusals",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/27959",
      "session": "session_01QSeKYmTYfaPbLQD4BJfomW",
      "premise_still_valid": true,
      "summary": "The /meta/diagnostics section of content/docs/deployment/validating-metadata.mdx now has a fourth table column naming each 400 INVALID_REQUEST refusal, a sentence on the nested envelope and the repeated-parameter VALIDATION_ERROR, and a sentence on the canonical stats key. H1 CONFIRMED with corrections, read at origin/main ed0e71db94. (1) severity: any value other than error/warning is refused (meta-collection-routes.ts severity check). An EMPTY value keeps the default error, and an empty type keeps the full sweep. (2) type: two refusal paths, both 400 INVALID_REQUEST. A near-miss spelling of a declared type (viewes) is refused by canonicalizeMetaRequestType inside getMetaItems, and its message names the accepted spellings. A name that is neither a declared type nor in the live type set is refused by refuseUnknownMetaListType after the sweep. A live type outside the static contract still answers 200. (3) package: refused only when the package is not installed AND no swept item is bound to it (protocol-meta-diagnostics.ts). An installed package with no items answers zeros, items bound to an uninstalled package are still swept, package=all or empty sweeps every package, and the refusal fails open when the installed-package listing cannot be read. (4) Envelope: every classified 400 leaves through isDiagnosticsRefusal as nested { error: { code, message } }. The repeated-parameter refusal (refuseRepeatedQueryParams) answers VALIDATION_ERROR in the same nested shape. (5) stats AND entries[].type are keyed by canonicalMetaUrlType(type), so type=views answers under stats.view, byte-equal to type=view (pinned in rest-meta-diagnostics-unknown-params.test.ts). H2: PR #27913 was OPEN, not merged (GET pulls/27913: state open, merged false) at origin/main ed0e71db94, so the unknown-parameter-NAME refusal is LEFT OUT. The PR body says so and points to card comment 6514340216 for the text to add once it lands.",
      "tests": "Docs only: no test owed and no ablation (no tested behaviour changed). The documented clauses are backed by the unchanged pins in packages/rest/src/rest-meta-diagnostics-unknown-params.test.ts.",
      "gates": "head 26a0c3bd1b. Derivation: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack :: exit 0, 43 commands. Each exit was written to disk before any pipe. Pass 1: 39 exit 0, 4 exit 3 PREREQUISITE NOT MET (check:doc-formula-expressions, check:doc-security-posture, spec check:skill-examples, check:docs-transcript-drift: unbuilt formula/lint/client dist). After turbo build of those closures under os-verify-lock (VERDICT command-exit 0, 38/38 tasks; spec build VERDICT command-exit 0), all 4 re-ran :: exit 0. check:doc-authoring :: exit 0; check:nul-bytes :: exit 0. Reconciliation: dispatch-gates.mjs --repo objectstack-ai/objectstack --ran (command :: exit code lines) :: exit 0, '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 check-runs at report time: Governed Surface Queue Guard success, Check Changeset success; Lint lanes, Type Check lanes, Check Documentation Links, PR-body guards and Spec property liveness in_progress. NOT MEASURED locally: CI Build Docs, Plan Test Core shards and the type-check lanes (no local invocation derived).",
      "line_budget": "content/docs/deployment/validating-metadata.mdx +15 / -7 (net +8); the page has no line ratchet; changed lines 22 vs the 3000 human-merge threshold",
      "files_changed": [
        "content/docs/deployment/validating-metadata.mdx"
      ],
      "deviations": [
        "Conflict, not silently resolved: .claude/agents/os-dev.md says the PR's assignees mirror the card's (os-justin). The dispatch order says no assignees, and so does scripts/pm/fleet-write/ops.mjs pr_create ('a dev's create carries no assignees ... never for a seat's account'). I followed the order and the relay contract, so the PR has no assignee. If the os-dev.md line is stale, it needs an edit there.",
        "The PR footer uses AGENTS.md's session-URL form, not the harness reminder's 'Generated with' line, because AGENTS.md takes precedence for attribution lines.",
        "os-dev.md says os-dev-report is line 1 of the comment, but the dispatch order puts the seat identity on line 1 and os-dev-report on line 2. I followed the order, which is the line the PM scanner was told to read."
      ],
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "0",
      "api_writes": "3 relay-executed REST writes in 2 dispatches: (1) POST repos/objectstack-ai/objectstack/dispatches for pr_create, which executed POST /pulls (#27959, draft) and POST /issues/27959/labels [skip-changeset]; (2) post-stamped --comment=27632, which executed POST /issues/27632/comments (this report). git push is not counted",
      "open_questions": [],
      "out_of_scope_findings": []
    }

    Generated by Claude Code

  7. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW

    ACCEPT → PR #27959 · 2026-10-30T05:26Z · ready + auto-merge armed. This is a partial landing (Refs): the #27913 parameter-name sentence stays on this card until #27913 lands.


    Generated by Claude Code

  8. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW

    Release: session_01QSeKYmTYfaPbLQD4BJfomW (devx seat 2) · partial landing · next: pm:queue

    Landed (partial): PR #27959, merged as fece78120c · 2026-10-30T06:06Z. The merged diff matches the reviewed head 26a0c3bd1b: the sorted +/− lines are hash-identical. ACCEPT → PR #27959 comment 6515694595.

    Claim 6515191967 is released in this act: pm:dispatched → pm:queue, and the assignee is cleared. The dev ran as mode:subagent, so there is no session to archive.


    Generated by Claude Code

  9. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW

    Claim: PM loop round 9 · remaining item · 2026-10-30T06:08Z
    Session: session_01QSeKYmTYfaPbLQD4BJfomW (mode:subagent: the dev shares this session ID; its identity is the branch)
    Account: os-justin (the seat's linked user, as GET /user answers it; the card's assignee)
    Branch: claude/issue-27632-diagnostics-param-names
    Worktree: objectstack-issue-27632b
    Domain: domain:devx
    Seat: domain:devx#2
    File surface: content/docs/deployment/validating-metadata.mdx only, in the /meta/diagnostics section that #27959 just rewrote. One sentence or table note for #27913's refusal of an unknown query parameter name (stop on breach; explain in the report)
    Container & model: S, mode:subagent, model: default, effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card (the Skills-docs: follow-up of #27913)
    Thread-read: 6516213324
    Premise: holds at origin/main fece78120c. PR #27913 is merged. #27959 (fece78120c) landed the other half, and the page does not yet name the parameter-name refusal.
    Serial constraints cleared: #27959, the last PR on this page, merged before this claim.


    Generated by Claude Code

  10. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW
    os-dev-report

    {
      "issue": 27632,
      "status": "done",
      "branch": "claude/issue-27632-diagnostics-param-names",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/27993",
      "session": "session_01QSeKYmTYfaPbLQD4BJfomW",
      "premise_still_valid": true,
      "summary": "The paragraph below the /meta/diagnostics query table in content/docs/deployment/validating-metadata.mdx now says the route accepts only the names type, severity and package. Any other name is refused 400 INVALID_REQUEST, even with an empty value, and the message names the parameter and the supported set; the route never answers the full sweep. The name check runs before the repeated-parameter check, so an unknown name beside a repeated one answers INVALID_REQUEST. H1 CONFIRMED with one correction, read at origin/main fece78120c, which contains #27913's merge 9cd54faae5 (merge-base --is-ancestor exit 0). (1) Closed set: META_DIAGNOSTICS_PARAMS = ['type', 'severity', 'package'] in packages/rest/src/meta-collection-routes.ts, and nothing in protocol-meta-diagnostics.ts. It is exactly those three. Card comment 6514340216 says 'and the rest of the declared set', but no wider set exists, so the page names three. (2) Status, code and envelope: unknownQueryParamRefusalMessage (query-allowlist.ts) decides, the handler throws diagnosticsRefusal ({code: INVALID_REQUEST, status: 400}), and the catch's isDiagnosticsRefusal writes the nested { error: { code, message } }. The message is 'The \"typ\" query parameter is not supported by this endpoint. ... Supported parameters: package, severity, type.' (3) Order: the name check runs first, then refuseRepeatedQueryParams(req, res, META_DIAGNOSTICS_PARAMS), which still answers VALIDATION_ERROR for a repeated known parameter. The pin 'an unknown name outranks a repeated known one' in rest-meta-diagnostics-unknown-params.test.ts expects INVALID_REQUEST for { typ, type: [view, object] }. An unknown name with an empty value is refused too (pinned). The 501 NOT_IMPLEMENTED probe for a kernel without getMetaDiagnostics still runs before both checks.",
      "tests": "Docs only: no test owed and no ablation (no tested behaviour changed). Each new clause is backed by the unchanged #27633 pins in packages/rest/src/rest-meta-diagnostics-unknown-params.test.ts: ?typ=view refused with the supported set, ?packageId= refused, an unknown name with an empty value refused, an unknown name outranking a repeated one, and the three known names answering 200.",
      "gates": "head 5c6293d280. Derivation: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack :: exit 0, 43 commands, 1 path (+7/-3). Each exit was written to disk before any pipe. Pass 1: 38 exit 0. Four gates exit 3 PREREQUISITE NOT MET (check:doc-formula-expressions, check:doc-security-posture, spec check:skill-examples, check:docs-transcript-drift: unbuilt formula, lint, spec d.ts and client-react). spec check:docs exit 1: packages/spec/json-schema was missing, a gitignored build artifact, so the gate refused before measuring. I built under os-verify-lock: turbo build of formula..., lint... and spec (VERDICT command-exit 0, 4/4 tasks), then client-react... (the first try was VERDICT queue-timeout exit 99 behind pid 10001's showcase/console build; the retry with the same slot gave VERDICT command-exit 0, 38/38 tasks). All five then re-ran with exit 0. check:doc-authoring :: exit 0; check:nul-bytes :: exit 0. Reconciliation: dispatch-gates.mjs --repo objectstack-ai/objectstack --ran (lines spelled 'command :: exit N') :: exit 0, '43 derived famil(ies) accounted for — 43 run, 0 NOT-MEASURED (a DERIVED zero ...)'. CI check-runs at report time: Check Changeset success; Check Documentation Links, Lint lanes, Type Check lanes, Governed Surface Queue Guard, PR-body guards, Spec property liveness and Check PR Size in_progress. NOT MEASURED locally: CI Build Docs, Plan Test Core shards and the type-check lanes (the derivation gives no local invocation for them).",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "line_budget": "content/docs/deployment/validating-metadata.mdx +7 / -3 (net +4). The page has no line ratchet. 10 changed lines against the 3000-line human-merge threshold.",
      "files_changed": [
        "content/docs/deployment/validating-metadata.mdx"
      ],
      "deviations": [
        "I wrote the first commit with the harness reminder's 'Co-Authored-By: Claude Opus 5.5' trailer. The pre-push check:commit-card-trailers refused it before anything was published. I amended the trailer to the model-free pair (Claude, no model name, with the noreply address) plus the Claude-Session URL, then pushed. No force-push was needed.",
        "Conflict, not silently resolved: .claude/agents/os-dev.md says the PR's assignees mirror the card's. The dispatch order and the relay's pr_create contract (ops.mjs: 'a dev's create carries no assignees') both say none. I followed the order, so the PR has no assignee.",
        "The PR footer uses AGENTS.md's session-URL form, not the harness reminder's 'Generated with' line.",
        "os-dev.md says os-dev-report is line 1 of the comment. The dispatch order puts the seat identity on line 1 and os-dev-report on line 2. I followed the order.",
        "My first --ran reconciliation spelled lines 'command :: N'. The tool refused that (exit 1, all 43 UNRUN, 'Spelling: COMMAND :: exit CODE'). I re-spelled the lines as 'command :: exit N' and got exit 0. The exit codes themselves did not change.",
        "The scratchpad subdirectory is issue-27632b/, not issue-27632/, because issue-27632/ already held the earlier run's ran.txt and ran-exit.txt."
      ],
      "mcp_calls": "0",
      "api_writes": "3 relay-executed REST writes in 2 acts: (1) fleet-write/dispatch.mjs, one POST repos/objectstack-ai/objectstack/dispatches for pr_create (run 41015441494, success), which executed POST /pulls (#27993, draft; 4631 bytes sent, 4631 stored, identical) and POST /issues/27993/labels [skip-changeset]; (2) post-stamped --comment=27632, which executed POST /issues/27632/comments (this report). git push is not counted.",
      "open_questions": [],
      "out_of_scope_findings": []
    }
  11. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW

    ACCEPT → PR #27993 · 2026-10-30T07:00Z · ready + auto-merge armed. This is the remaining #27913 half, so the PR carries Fixes.


    Generated by Claude Code

  12. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW

    Landed: PR #27993, merged as 007ec1d90b · 2026-10-30T07:17Z

    The merged diff matches the reviewed head 5c6293d280: the sorted +/− lines are hash-identical. ACCEPT → PR #27993 comment 6516947664. Fixes #27632 closed the card, and it is complete: #27959 (fece78120c) landed the #27620 half and this PR the #27913 half. pm:dispatched is removed in this act. The dev ran as mode:subagent, so there is no session to archive.


    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

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