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
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.
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.
family
status
code
ledgered
validation
400
VALIDATION_FAILED
✅
auth (anonymous)
401
UNAUTHENTICATED
✅
not-found OBJECT
404
OBJECT_NOT_FOUND
✅
not-found RECORD
404
RECORD_NOT_FOUND
✅
batch
400
VALIDATION_FAILED
✅
query-param rejection
400
UNSUPPORTED_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)
[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:
comparand
answer
plain object
400 INVALID_FILTER — "requires a single comparable value, but received an object ({"a":1})"
nested array
400 INVALID_FILTER — "received an array, which cannot be bound"
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:
head
answer
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:
item
rev
result
ai.skill-instructions-mcp-prompts
1
pin mcp/src/skill-prompts.test.ts — 12 assertions green
identity-auth.invitation-scope-gates
1
pin delegated-admin-invite.dogfood.test.ts — 4 assertions green
plugin-security/src/no-active-organization-write-refusal.test.ts — 19 assertions green
records-forms.* array-lowering
—
objectql/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.
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.
Post-release sweep for 17.1.0, api-backend lane. Selected because 17.1.0 narrows
error.codeto a closed vocabulary at every door and addsdeclaredCode(#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): framework19f98fa1fffbeb305bdcb6af64bc826fb25a46b1,.objectui-sha/ console dist stamp both9a3daf8d37ad973a621e5edd276fe32467f90684, 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
api-backend.query-contract-matrixobjectql/src/engine.test.ts, 135 assertionsapi-backend.bulk-write-contractowner-anchor-and-bulk-writes.dogfood.test.tsapi-backend.declarative-endpoint-executionshowcase-declarative-endpoints.dogfood.test.ts, 17 assertionsapi-backend.error-envelope-ledgerapi-backend.filter-comparand-conformanceNo
failrecorded, 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 inerror-code-ledger.zod.ts(245) = 290 codes.VALIDATION_FAILEDUNAUTHENTICATEDOBJECT_NOT_FOUNDRECORD_NOT_FOUNDVALIDATION_FAILEDUNSUPPORTED_QUERY_PARAMVALIDATION_FAILED,fields[0] = {field:"name", code:"required", message:"Invoice Number is required", label:"Invoice Number"}(lowercase-snake field code, ADR-0114 D2)fieldErrorskey — pass, absent from all six bodies (ADR-0114 D4 tombstone holds)not_in/in的比较值是标量(非数组)时答 500 DATABASE_ERROR,而不是带信封的 400 —— 而这个形状是 spec 合法的 ViewFilterRule #5869 NEGATIVE is excludedOBJECT_NOT_FOUND"Object 'not_a_real_object' is not registered" vsRECORD_NOT_FOUND"Record nonexistent-id-0000 not found in showcase_task". A client can tell schema drift from data absenceapi-backend.filter-comparand-conformance(rev 1)Accepted set read from the pinned export:
string · number · bigint · boolean · null · Date. Baselineshowcase_accounttotal = 14 (the control every leak assertion is measured against).400 INVALID_FILTER— "requires a single comparable value, but received an object ({"a":1})"400 INVALID_FILTER— "received an array, which cannot be bound"$fn400 INVALID_FILTER— "Unsupported filter operator "$fn" … Supported operators: $eq, $ne, $gt, …"None answered
200over the unfiltered 14-row set — i.e. no predicate was silently dropped, which is the row-leak failure this item exists for.2**53cannot survive JSON parsing on the REST path (it is rounded before the platform ever sees it), so a200here 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.owner_id.name)400 INVALID_FIELD— "follows the relationship 'owner_id' into another object"name.length)400 INVALID_FIELD— "a dotted path into 'name', a 'text' field on object 'showcase_account'"nope.deep)400 INVALID_FIELD— "is not a field on object 'showcase_account'"Adjacent pins executed in this session
Belonging to the
since:v17sweep rather than this area, recorded here so the evidence is not lost — they should be carried forward when that round is run properly:ai.skill-instructions-mcp-promptsmcp/src/skill-prompts.test.ts— 12 assertions greenidentity-auth.invitation-scope-gatesdelegated-admin-invite.dogfood.test.ts— 4 assertions greenaccess-security.no-active-org-session-semantics(blocked item's pin)plugin-security/src/no-active-organization-write-refusal.test.ts— 19 assertions greenrecords-forms.*array-loweringobjectql/src/engine-filter-array-lowering.test.ts— 46 assertions greenChecklist gaps (for the wave anchor card — NOT extracted)
api-backend.filter-comparand-conformanceclause [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.error-envelope-ledgerneeds a named baseline-member persona infixtures.requires; without one, clause [5] cannot reachpasson 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) arebuild-oracle items and are the cheapest next batch — they need no browser and no persona.