Repository navigation
Description
Filing gate: maintainer-directed task. Filed by the 18.2.0 release-assessment thread · session_01G3h9iZTpL8aCiXbfsp8H5u. ⛔ Not a claim, ⛔ not dispatched.
Maintainer's words (project thread, 2026-10-25, verbatim): 22:54Z 「约 300 条清单准确性问题:是不是应该开卡?」, then 22:55Z 「写issue,不派发」.
Parent: wave anchor #25807 (18.2.0 release test sweep). RUNNER's extraction obligation parks checklist-accuracy findings on the anchor; the maintainer asked for them as issues, so the wave's findings are split into one card per ledger file and the anchor links each card. This is not a release blocker, so it carries no target:v18.
Reader who acts: the lane owning docs/qa/platform-checklist/** (domain:devx). Dedupe (open and closed): no card holds these lines; the 18.0 precedent closed its accuracy rows on its anchor #24579.
Wanted
For each line below, edit docs/qa/platform-checklist/areas/api-backend.json: revise the item's text, bump its revision, and append a history entry citing the run record the line comes from. Keep pnpm check:platform-checklist green. A line that turns out to describe a product defect rather than stale text gets its own card instead of a ledger edit.
Findings (28)
From #25815 — release-18.2.0-tier1, 156 items, at 6679644a, pin b41ed7f68956 (clause labels: aK = acceptance[K], nK = negative[K])
api-backend.action-activation-door-contracta6: ref/verify says 'both owners named'; the ambiguity case asserts only messageOf(res) toContain('crm_account')api-backend.action-activation-door-contracta5: ledger-reach asserts the key set via rows.find, never that exactly one row exists, and does not read the 200 body {name, objectName, enabled}api-backend.action-activation-door-contracta2: ref claims 'unknown-key/non-boolean 400s' — pin asserts code VALIDATION_FAILED only, not fields[0] unknown_field/invalid_type or the non-object-body armapi-backend.bulk-write-contractref '(bulk halves)' overclaims: the pin's bulk cases call ql.update/ql.delete({multi:true}) on the engine with a resolved authz context; none of the createMany/updateMany/deleteMany HTTP doors the clauses name is driven, so no clause a0-a5/n0 is assertedapi-backend.bulk-write-contracta3: packages/rest/src/rest-batch-size-cap.test.ts pins BATCH_TOO_LARGE at the unit layer (mock protocol) and is not in this item's ref; it still would not score an api oracleapi-backend.data-request-shape-and-query-aritya1-a4: every pin invokes RestServer route handlers / HttpDispatcher.dispatch directly (real ObjectQL+SqlDriver for data-write-request-gate, data-delete-expected-version, data-conflict-caller-visibility; stubs for the arity files) — none boots the Hono adapter, so the api-oracle clauses stay a live legapi-backend.data-request-shape-and-query-aritya1: the empty-version-token leg is in data-delete-expected-version.test.ts (DELETE), while the clause speaks of PATCH bodies + an empty version token — check the clause intends DELETE for the tokenapi-backend.declarative-endpoint-executiona1: no pin asserts the 401 body's code (UNAUTHENTICATED); showcase case checks success:false only, policy case status onlyapi-backend.declarative-endpoint-executiona2: spec gate (a) asserts the fix sentence but not that the message names the endpoint; theapi注册表条目声明 allowRuntimeCreate: true,但运行时创建的端点匹配器永远看不见 —— 声明的能力运行时不兑现(真实 boot 实测) #5488 runtime-authoring withdrawal is unasserted; the build oracle's os validate/os build run is not a pinapi-backend.error-sentences-and-unique-violation-wire-codea1: the verify names rest-hook-script-fault-envelope.test.ts for the 'live /data door' — that file imports mapDataError only, so the live leg is unit, not the doorapi-backend.error-sentences-and-unique-violation-wire-codea2: dispatcher-unique-violation-wire-code.test.ts uses a real engine + SqlDriver behind HttpDispatcher; no Hono adapter, so the wire body is the dispatcher's result, not an HTTP answerapi-backend.meta-read-doors-v18a4: no ref pin asserts the data-sort 403 on F (the 'two agree' half); showcase-fls-read-mask-strip.dogfood.test.ts has a sort-403 case but is not in this refapi-backend.meta-read-doors-v18a1-a3: precedent QA run · tier1:24681-touched (63/82) · 307ce4c4 · 2026-10-20 · 10 PASS / 53 PARTIAL / 0 FAIL / 0 BLOCKED / 19 NOT-RUN #24840 carried these as pass from QA run · surface:api (116/130) · 580fd4ed · 2026-10-20 · 62 PASS / 54 PARTIAL / 0 FAIL / 0 BLOCKED / 14 NOT-RUN #24779; on this tree every ref pin drives route handlers with a stub server/response (no Hono adapter), so they score a0 onlyapi-backend.packaged-action-disabled-dispatcha0: dogfood asserts status 409 and text toMatch(/ACTION_DISABLED|is disabled/) — neither the exact code nor the describeDisabledAction sentence, and no task re-read for side effects; the exact sentence is unit-only (action-activation-dispatch.test.ts › the shared guard itself › answers 409 ACTION_DISABLED with the ENGINE's own sentence)api-backend.packaged-action-disabled-dispatcha3/a6/n1: ref credits action-activation-dispatch.test.ts for the 403-not-an-oracle, flow-type and absence-means-active legs, but it is a unit HttpDispatcher over fakes — it stops above the HTTP layer the api oracle needsapi-backend.packaged-action-disabled-dispatcha5: ref correctly says the restart leg stays manualapi-backend.query-contract-matrixa4: engine.test.ts '[Security: $expand bypasses RLS/FLS on the referenced object (data leak on lookups) #2850] routes the expand sub-read through the middleware … tagged __expandRead' proves the sub-read is routed through middleware on a mock driver — not that a contributor's expand withholds the contact over HTTP; under rule 6 it cannot score a4 (round 4 QA run · tier1:24681-touched (63/82) · 307ce4c4 · 2026-10-20 · 10 PASS / 53 PARTIAL / 0 FAIL / 0 BLOCKED / 19 NOT-RUN #24840 scored it pass)api-backend.query-contract-matrixn0: request-schema-gate.conformance.test.ts drives RestServer with a mocked protocol — the ref says so itselfapi-backend.query-contract-matrixwhole item: Tier 1 in name only — no clause has a pin at its oracle's layerapi-backend.rest-batch-config-contracta5: rest-sub-config-parse-not-cast.test.ts §E › 'refusesbatch.operations.upsertManyandbatch.defaultAtomic' asserts the key and /never built/ resp. /options.atomic/; it does not assert that the messages name BatchEndpointsConfigSchema, nor the upsert replacement (an operation type of the generic batch door)api-backend.rest-crud-config-contracta3: packages/rest/src/discovery-services-route-follows-mount.test.ts ('[finding] discovery contradicts itself under a non-defaultcrud.dataPrefix:routes.datafollows the key,services.data.routestays hard-coded at/api/v1/data#16674 — a movedcrud.dataPrefixmoves BOTH halves of the document') pins the discovery-advertisement half at a non-default prefix and is not in the ref; the moved-route-table half has no pin.api-backend.rest-crud-config-contracta4: ref says §E pins acceptance[4]; the case asserts 'crud.patterns' + 'CrudEndpointsConfigSchema' + /was removed in @objectstack/spec 17/ only — the declarative-api-endpoint prescription is never matched, and the objectParamStyle refusal is checked for its key and /was removed/ only.api-backend.rest-metadata-config-contracta1: ref says §D 'pins prefix … survival' — true, but no pin mounts at prefix '/metadata' or reads the discovery body's routes.metadata; the clause's move-together claim is unpinnedapi-backend.rest-metadata-config-contracta5: §E's cacheTtl case asserts the key, MetadataEndpointsConfigSchema and /was removed/; the endpoints.schema case asserts the key and /does not exist/ only — neither asserts the replacement named in the verifyapi-backend.rest-metadata-config-contracta3: only the normalizeConfig half is pinned; ref concedes the masking-effect half has no pinapi-backend.rest-route-generation-tombstonesa0: §E › 'refuses everyroutes.*key' assertsroutes.<key>, RouteGenerationConfigSchema and /was removed/ — not the clause's 'was removed in @objectstack/spec 17'; nameTransform driven with 'none' only (ref concedes)
From #25817 — release-18.2.0-manual-set, 29 items, at 6679644a, pin b41ed7f68956
api-backend.aggregate-contract-matrix: The analytics: the in-memory date bucket shifts a timezone-naiveField.dateone day EARLIER under any negative-offsettimezone(America/New_York → 2026-10-01 buckets as 2026-09-30), so it disagrees with the SQL pushdown path #24618 negative-offset shift no longer reproduces; the item text can say it is fixed.- api-backend.formula-stdlib-matrix steps[5] / requires[1]: a scratch object without
sharingModelgets 422security-owd-unset. The step should say to declare one.
Acceptance
- Every line above is either applied (item revised,
revisionbumped,historycites the record) or answered on this card with the reason it was not. pnpm check:platform-checklistis green.- The PR links this card and [sweep] v18.2.0 release test sweep #25807.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 26, 2026
Claim: PM loop · 2026-10-26T11:34Z
Session:
pending(card thread, dispatched by seat sessionsession_01LKHDniRQSWjRJyDtacwpEd)Account:
os-elon-muskBranch:
pending(the harness-pinned branch for the card thread; it names no issue, so this claim is the identity record)Worktree:
objectstack-issue-25837Domain:
domain:devxSeat:
domain:devx#1(seat post #6023)File surface: docs/qa/platform-checklist/areas/api-backend.json only (stop on breach; explain in the report)
Container & model:
M,mode:thread,model: default tier,effort: highClause-②: no
Metadata-protocol: none
Responsibility: Card #25837: 28 api-backend ledger edits from the 18.2.0 sweep
Thread-read: none
Serial constraints cleared: own area file only; #26035 slice 1 out of scope
Dispatched under the maintainer's 「同意」 to the director's ruling batch 1, item 5A (devx dispatches p1–p3). Dispatch order:
/mnt/project-files/pm-devx-seat/dispatch-25837.md.objectstack-fleet commentedon Oct 26, 2026
Release: devx seat 1 (#6023) releases its claim 6415015843 on this card, unstarted. No card thread was opened and no branch exists.
Why: the maintainer lowered devx seat 1's concurrency to 1 (2026-10-26 12:05Z, 「当前任务处理完,并发降到1」), and devx seat 2 (#20163) is coming on duty. The card goes back to
pm:queueso either seat can pick it up. The shared dispatch order for the 18.2.0 ledger cards still applies:/mnt/project-files/pm-devx-seat/dispatch-ledger-18-2.md.Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
Claim: PM loop round 1 · 2026-10-26T12:19Z
Session:
session_01Q4MDXRbEJCNdPAP4SiXwp9(devx seat 2) · card threadsession_01MosPkPhtm6BKBKAmyfGtfwAccount:
os-steveBranch:
claude/project-thread-ejl77k(the harness-pinned branch of the card thread; it names no issue, so this claim is the identity record; amended on spawn)Worktree:
objectstack-issue-25837Domain:
domain:devxSeat:
domain:devx#2(seat post #20163)File surface:
docs/qa/platform-checklist/areas/api-backend.jsononly (stop on breach; explain in the report)Container & model: M,
mode:thread,model: default tier (TIER_DEFAULT, from dispatch-gates --tier: no path-derived mandate),effort: highClause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card
Thread-read: 6415651981
Premise: holds (action surface
git log origin/mainon the file since filing: no commit; the dev re-reads each line against main first)Serial constraints cleared: own ledger file only; seat 1 holds #25835 / #25836 on other files; #26035 left the retired objectui pin wording in these files to these cards; no other
Claim:names this fileGenerated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
os-dev-report
{ "issue": 25837, "status": "done", "branch": "claude/project-thread-ejl77k", "pr": "https://github.com/objectstack-ai/objectstack/pull/26115", "session": "session_01MosPkPhtm6BKBKAmyfGtfw", "premise_still_valid": true, "summary": "14 items of docs/qa/platform-checklist/areas/api-backend.json revised from the 28 lines of QA runs #25815 and #25817 (at 6679644a), each re-read against origin/main f6c61932: automated.ref and clause verify texts now name the layer each pin reaches and the half the live run owes; 4 pins the refs lacked are named (data-update-expected-version, showcase-fls-read-mask-strip dogfood, discovery-services-route-follows-mount, meta-object-fls); aggregate negative[2] records #24618 as no longer reproducing; formula-stdlib scratch objects declare a sharingModel. Each item revision +1 with one history row citing its run record. 27 lines applied; packaged-action-disabled-dispatch a5 confirmed the ref as written (no edit). No line was a product defect. The file carries 0 hits of the retired objectui:build / .objectui-sha / pin-script wording. Card assignee untouched (os-steve, set by the seat).", "tests": "docs-only ledger edit, no package touched (no build closure, no package tests owed). Edit applied by exact asserted substring replacement; JSON round-trip byte-identical before the edit; diff 126+/42- in 1 file at head 8bbb36f0.", "gates": "local at 8bbb36f0, each exit captured before any pipe: pnpm check:platform-checklist 0 (OK, 16 areas, 329 items; anchors 986/996, 18 floors held; line citations 0); dispatch-gates --commands derived 13 families, all run, all exit 0: check-ci-filter-parity, check-closing-keyword-parity, check-closing-keyword-parity --self-test, check-comment-mask-corpus, @objectstack/lint check:doc-formula-expressions (first run exit 3 PREREQUISITE NOT MET, re-run 0 after turbo build of @objectstack/formula + @objectstack/lint under os-verify-lock, VERDICT command-exit 0), check:cross-package-test-inputs, check:doc-authoring, check:driver-memory-census, check:gitlink-declared, check:nul-bytes, check:platform-checklist, check:refd-timer-probe, check:watch-hint-literal (first pass of 7 of them exit 3 before pnpm install; re-run 0 after install). --ran reconciliation: 13 derived, 13 run, 0 NOT-MEASURED, 0 UNRUN. CI on PR #26115: in_progress at report time (Lint, Type Check, Test Core queued/in_progress; UI and dogfood jobs skipped by selector).", "line_budget": "168 changed lines (+126/-42), 1 file, under the 3000 human-merge threshold", "files_changed": [ "docs/qa/platform-checklist/areas/api-backend.json" ], "dogfood_battery": "n/a — no ! in the PR title and Clause-② no with no (narrowing) arm", "mcp_calls": "2 — mcp__github__issue_read (get, get_comments) on #25837; reads only, no MCP write", "api_writes": "2 — relay stroke fw-20261026T124535Z-cf1584 (POST /repos/objectstack-ai/objectstack/dispatches → pr_create: POST /pulls, POST /issues/26115/assignees, POST /issues/26115/labels, read back identical) + this os-dev-report comment (POST /issues/25837/comments via post-stamped)", "deviations": [ "edited in the card thread's own checkout on its harness-pinned branch rather than a separate worktree (single-agent container, branch fast-forwarded to origin/main f6c61932 first)", "PR reviewer request to os-steve not sent: the dispatch forbids any GitHub MCP write and named only assignees for pr_create", "commit trailers are the model-free pair per AGENTS.md, not the harness's model-named Co-Authored-By" ], "open_questions": [], "out_of_scope_findings": [ "carrier: none · noted, not filed — api-backend.api-console-discovery-execute spells 3 Console source paths as the sibling repo (objectui apps/console/src/pages/developer/...), now ui/apps/console/...; path spelling outside this card's lines, in PR Acceptance notes" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
devx seat 2 · review: ACCEPT → PR #26115 comment 6416391172. Landing: ready + merge queue once every check on the reviewed head is green or skipped.
Generated by Claude Code