Skip to content

QA run · area:api-backend · 5/14 · 19f98fa1 · 2026-08-20 #10233

Description

@os-elon

Post-release sweep for 17.1.0, api-backend lane. Selected because 17.1.0 narrows error.code to a closed vocabulary at every door and adds declaredCode (#9106) — a change that rewrites the expected shape of every refusal assertion in the ledger.

Environment

Identical to companions #10224 (priority:P0) and #10225 (area:automation): framework 19f98fa1fffbeb305bdcb6af64bc826fb25a46b1, .objectui-sha / console dist stamp both 9a3daf8d37ad973a621e5edd276fe32467f90684, showcase on port 3456 against a file DB, 2026-08-20.

Execution mode: SEQUENTIAL, declared. No subagent fan-out.

Scope

Selector area:api-backend → 14 runnable items. 5 adjudicated, 9 not reached — this run was scoped to the release's highest-risk surface rather than the full area.

Per-item verdicts

itemrevverdictevidence
api-backend.query-contract-matrix2passpin objectql/src/engine.test.ts, 135 assertions
api-backend.bulk-write-contract1passpin owner-anchor-and-bulk-writes.dogfood.test.ts
api-backend.declarative-endpoint-execution1passpin showcase-declarative-endpoints.dogfood.test.ts, 17 assertions
api-backend.error-envelope-ledger2partial 5/6hand-driven, detail below
api-backend.filter-comparand-conformance1partial 4/5hand-driven, detail below
9 othersnot-runlisted under handoff

No fail recorded, so no reproduction rules are owed.

api-backend.error-envelope-ledger (rev 2)

Ledger membership was checked against the real union — StandardErrorCode (errors.zod.ts, 50 members) ∪ the registered codes in error-code-ledger.zod.ts (245) = 290 codes.

familystatuscodeledgered
validation400VALIDATION_FAILED
auth (anonymous)401UNAUTHENTICATED
not-found OBJECT404OBJECT_NOT_FOUND
not-found RECORD404RECORD_NOT_FOUND
batch400VALIDATION_FAILED
query-param rejection400UNSUPPORTED_QUERY_PARAM
  • [0] every sampled code is ledgered — pass
  • [1] field-level shape — pass: top-level VALIDATION_FAILED, fields[0] = {field:"name", code:"required", message:"Invoice Number is required", label:"Invoice Number"} (lowercase-snake field code, ADR-0114 D2)
  • [2] retired fieldErrors key — pass, absent from all six bodies (ADR-0114 D4 tombstone holds)
  • [3] status↔code mapping — pass, table above; no 5xx for caller-fixable input, so the 数据 API:集合算子 not_in/in 的比较值是标量(非数组)时答 500 DATABASE_ERROR,而不是带信封的 400 —— 而这个形状是 spec 合法的 ViewFilterRule #5869 NEGATIVE is excluded
  • [4] the two 404 flavors are distinguishable — pass: OBJECT_NOT_FOUND "Object 'not_a_real_object' is not registered" vs RECORD_NOT_FOUND "Record nonexistent-id-0000 not found in showcase_task". A client can tell schema drift from data absence
  • [5] one sample per family — partial: the 403 authorization family was not sampled (needs a baseline-member persona). Five of six families captured, which per the clause's own wording leaves the item partial

api-backend.filter-comparand-conformance (rev 1)

Accepted set read from the pinned export: string · number · bigint · boolean · null · Date. Baseline showcase_account total = 14 (the control every leak assertion is measured against).

  • [0] accepted members — pass: string → 1 row, number → 14, null → 0, Date-ish → 6; each returns a distinct, non-degenerate answer set
  • [1] non-accepted types are REFUSED — pass, and the load-bearing NEGATIVE is positively excluded:
comparandanswer
plain object400 INVALID_FILTER — "requires a single comparable value, but received an object ({"a":1})"
nested array400 INVALID_FILTER — "received an array, which cannot be bound"
function-shaped $fn400 INVALID_FILTER — "Unsupported filter operator "$fn" … Supported operators: $eq, $ne, $gt, …"

None answered 200 over the unfiltered 14-row set — i.e. no predicate was silently dropped, which is the row-leak failure this item exists for.

  • [2] bigint exact-integer boundary — not-run, and the clause is not testable through this door: a comparand past 2**53 cannot survive JSON parsing on the REST path (it is rounded before the platform ever sees it), so a 200 here says nothing about platform precision handling. Verifying it needs the engine/objectql door. Worth recording on the item so the next runner does not repeat the attempt.
  • [3] dotted head classification — pass, all three classes refused with a located message and none returning the unfiltered set:
headanswer
relation (owner_id.name)400 INVALID_FIELD — "follows the relationship 'owner_id' into another object"
scalar (name.length)400 INVALID_FIELD — "a dotted path into 'name', a 'text' field on object 'showcase_account'"
unknown (nope.deep)400 INVALID_FIELD — "is not a field on object 'showcase_account'"
  • [4] second-door parity — not-run (only the REST door was exercised)

Adjacent pins executed in this session

Belonging to the since:v17 sweep rather than this area, recorded here so the evidence is not lost — they should be carried forward when that round is run properly:

itemrevresult
ai.skill-instructions-mcp-prompts1pin mcp/src/skill-prompts.test.ts — 12 assertions green
identity-auth.invitation-scope-gates1pin delegated-admin-invite.dogfood.test.ts — 4 assertions green
access-security.no-active-org-session-semantics (blocked item's pin)plugin-security/src/no-active-organization-write-refusal.test.ts — 19 assertions green
records-forms.* array-loweringobjectql/src/engine-filter-array-lowering.test.ts — 46 assertions green

Checklist gaps (for the wave anchor card — NOT extracted)

  • api-backend.filter-comparand-conformance clause [2] pins a bigint boundary that cannot be exercised through the REST door at all (JSON number precision). The clause should either name the engine door explicitly or be marked door-specific.
  • The 403 family in error-envelope-ledger needs a named baseline-member persona in fixtures.requires; without one, clause [5] cannot reach pass on stock showcase.

Not reached — handoff

batch-transactional-discovery (rev 3) · formula-gates (rev 2) · enforce-or-remove-authoring-gates (rev 2) · server-timing-admin-gated (rev 2) · route-ledger-live-parity (rev 2) · package-rest-lifecycle (rev 1) · api-console-discovery-execute (rev 1) · date-range-preset-matrix (rev 1) · retired-def-refusal (rev 1).

Three of these (formula-gates, enforce-or-remove-authoring-gates, retired-def-refusal) are build-oracle items and are the cheapest next batch — they need no browser and no persona.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions