Skip to content

test(dogfood): pin five api-backend checklist items at the HTTP layer - #26787

Merged
objectstack-fleet[bot] merged 3 commits into
mainfrom
claude/project-thread-0g4hto
Oct 27, 2026
Merged

objectstack-fleet[bot] merged 3 commits into
mainfrom
claude/project-thread-0g4hto

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Warren · project thread
Refs #26572 (slice 1 of about 3: items declarative-endpoint-execution, second-object-exposure-and-internal-fields, data-request-shape-and-query-arity, meta-read-doors-v18, error-sentences-and-unique-violation-wire-code)

Clause-②: no
Metadata-protocol: none

维护者速读

  • 改了什么:给 api-backend 清单里 5 个被 18.2.0 Tier 1 扫描判为 PARTIAL 的条目补上 HTTP 层(真实 Hono 栈)的 dogfood 钉子,并把这 5 条的 automated.ref、verify 文本、revision 和 history 更新。
  • 为什么改:这些条款的判据在 HTTP 或构建层,旧钉子只到单元/引擎层,每次发版扫描都要人工再跑活腿;现在变成常驻、可重跑的证明。
  • 风险与回滚:只加测试和清单文本,不改任何产品代码;回滚就是 revert 本 PR。dogfood 只在 main 的定时/推送批次跑,不进 PR 和合并队列。
  • 先看:packages/qa/dogfood/test/declarative-endpoint-authoring-refusal.dogfood.test.ts(子进程跑 CLI)、packages/qa/dogfood/test/fixtures/second-object-exposure-fixture.ts(共享 fixture 加了一个 internal 字段)、docs/qa/platform-checklist/areas/api-backend.json。
  • 两分钟验证:pnpm --filter @objectstack/dogfood exec vitest run --maxWorkers=2 test/data-request-shape-live.dogfood.test.ts,预期 13 个用例全绿。
  • 需要你做的:无,席位落地。

What changes

Five api-backend checklist items that the release-18.2.0 Tier 1 sweep (#26468) scored PARTIAL now carry pins at the layer their oracle names. Every new case drives a booted stack through @objectstack/verify's real HTTP surface (Hono request injection), or the CLI's own bin/run.js as a child process for the one build oracle.

Item Clauses pinned Pin
api-backend.declarative-endpoint-execution acceptance[1] (401 UNAUTHENTICATED code), acceptance[2] (os validate / os build refuse a script and a proxy endpoint, naming it, the type and the flow prescription, no artifact; the #5488 withdrawal: PUT /meta/api/NAME answers 403 NOT_CREATABLE) showcase-declarative-endpoints.dogfood.test.ts (extended), declarative-endpoint-authoring-refusal.dogfood.test.ts (new)
api-backend.second-object-exposure-and-internal-fields acceptance[1] (refusal located at filter.REL on both doors), acceptance[3] (an internal: true field refused 400 INVALID_FIELD naming object and field in filter, sort, groupBy and aggregate positions) second-object-exposure.dogfood.test.ts (extended); its fixture gains sox_source.internal_f
api-backend.data-request-shape-and-query-arity acceptance[1]–[4] data-request-shape-live.dogfood.test.ts (new)
api-backend.meta-read-doors-v18 acceptance[1]–[4] (the FLS half for a client_liaison-bound member, both halves agreeing) meta-read-doors-live.dogfood.test.ts (new)
api-backend.error-sentences-and-unique-violation-wire-code acceptance[1]–[3] error-sentences-live.dogfood.test.ts + fixtures/error-sentences-fixture.ts (new scratch app)

Each item's automated.ref names the new pins and what they assert, the verify texts that said "live leg" now say which pin carries the clause, revision is bumped and a history row cites #26572. No clause text changed. No product code changed.

Why

The card's ruled scope (triage 6437722483): pin the 11 api-backend Tier 1 clauses the 18.2.0 sweep scored PARTIAL at the layer their oracle names, in packages/qa/dogfood/**, with the checklist item revisions bumped, in slices of about five items, with no new CI lane. This is the first slice. The other six items (packaged-action-disabled-dispatch, action-activation-door-contract, rest-crud-config-contract, rest-batch-config-contract, rest-metadata-config-contract, rest-route-generation-tombstones) are left for later slices.

Tests

All seven touched dogfood files on the final head 19a4d70, under the verify lock, after rebuilding the one package main moved since the base (driver-sql):

pnpm --filter @objectstack/dogfood exec vitest run --maxWorkers=2 test/data-request-shape-live.dogfood.test.ts test/meta-read-doors-live.dogfood.test.ts test/error-sentences-live.dogfood.test.ts test/declarative-endpoint-authoring-refusal.dogfood.test.ts test/second-object-exposure.dogfood.test.ts test/import-reference-exposure.dogfood.test.ts test/showcase-declarative-endpoints.dogfood.test.ts
 Test Files  7 passed (7)
      Tests  119 passed (119)
os-verify-lock: VERDICT command-exit 0

import-reference-exposure.dogfood.test.ts is in the run because it shares the fixture that gained a field. Every expectation was first measured against the live answer on a probe boot and checked against the clause text before it was written down. No ablation: the diff changes no tested behaviour, only adds pins over behaviour that already holds.

Acceptance notes

  • Dogfood runs only in main's scheduled and push battery (Dogfood Regression Gate's if: excludes pull_request and merge_group), so the PR's CI does not run these files; the local run above is their evidence until the next main battery.
  • The CLI pin writes its scratch config through defineStack(…, { strict: false }) with @objectstack/spec linked into a temporary node_modules: the commands accept only a stack defineStack returned, and the strict factory would refuse the endpoint at import, before the command's own gate.
  • The located position of a nested-relation refusal lives only in the refusal sentence (… at 'filter.REL' …); the pin asserts that token, the code, the status and object.
  • The storage fault is forced by putting the local adapter's root under a regular file, so the write fails with ENOTDIR; the pin asserts 500 INTERNAL and that neither the errno, the path nor a stack line reaches the body.

Verification

Gates (dispatch-gates --commands, reconciled with --ran)
  • node scripts/check-platform-checklist.mjs: exit 0, OK — 16 areas, 329 items (324 active, 1 planned).
  • 55 derived commands: 53 exit 0; 2 exit 3 (prerequisite not met, nothing measured): node scripts/check-plugin-teardown-shape.mjs --self-test (its positive control is pinned to a commit outside this shallow clone) and pnpm check:dual-build-cjs-loads (reads built output of packages outside the dogfood closure). Both run in CI's Lint & Repo Gates.
  • pnpm --filter @objectstack/dogfood run typecheck: exit 0.
  • eslint over the eight touched TypeScript files: exit 0.
  • dispatch-gates --ran: 55 derived families accounted for, 53 run, 2 NOT-MEASURED, 0 unrun.

No changeset: @objectstack/dogfood is private and docs/qa/** ships in no package, so this PR carries skip-changeset.

Human Minimum

  • 1. Schemas start as Zod; packages/spec holds no runtime logic. (not touched)
  • 2. Every name I added uses the casing for its kind.
  • 3. No formatter ran; pnpm lint passes. (eslint over the touched files)
  • 4. One issue, one branch off an up-to-date main, one pull request.
  • 5. A change that publishes carries a changeset. (nothing publishes)
  • 6. packages/spec touched: n/a.
  • 7. No hand edits to content/docs/references/, packages/*/CHANGELOG.md or content/docs/releases/.
  • 8. Title, body and comments are in English.

🤖 Generated with Claude Code

https://claude.ai/code/session_01JQwxbWUpGqdpDRiD79LqXV


Generated by Claude Code

@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

Nothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 0 changed package(s)), so this run has no opinion about the docs.

What this run could not see

Coarse fallback — 0 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json 0f3d068cf1299470995840795bc5687ec42d95f1 → packageMentionDocs.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

维护者速读

  • 改了什么:api-backend 区第一批 5 条清单项(声明式端点执行、第二对象暴露与内部字段、/data 请求形状与查询参数重复、v18 /meta 读门、错误句与唯一冲突码)里被 18.2.0 评为「部分覆盖」的条款,现在都在其判据要求的层上有了钉测:启动整栈后走 HTTP;有一条构建类判据,改为以子进程跑 CLI 的 os validate / os build。新增 4 个 dogfood 测试文件和 1 个临时应用夹具,扩了 2 个现有钉测,5 条清单项各自的 automated.ref、修订号和历史行都已更新。
  • 为什么改:旧钉测停在下一层(直接调函数或模拟请求),每次发版扫描都得手工补跑现场测试,或者只能记成「部分」。
  • 风险与回滚:只加测试和清单文字,不改产品代码;回滚 = revert 本 PR。注意 Dogfood Regression Gate 在 PR 和合并队列上都不跑,这批钉测要到 main 的下一次全量跑才首次在 CI 上执行;线程本地在最终 head 上 119 个测试全绿。
  • 先看:packages/qa/dogfood/test/error-sentences-live.dogfood.test.ts(钩子拒绝原句、409 UNIQUE_VIOLATION、存储 500 不泄露路径),以及 areas/api-backend.json 里这 5 条的 verify 改写。
  • 两分钟验证:node scripts/check-platform-checklist.mjs,退出 0。
  • 需要你做的:无,席位落地。余下 6 条由后续批次派发。
  • 席位意见:每个拒绝用例都配有对照(CONTROL)用例,也都断言「什么都没写入」,所以钉测不会靠一个恒拒的门变绿。

席位核对

ACCEPT · domain:devx#1 · session_01JQwxbaFpnMwgpCgneKe2qS · head 19a4d705f1 · 2026-10-27T15:57Z

  1. Shape: 9 files, +845/−23, all under packages/qa/dogfood/test/** plus docs/qa/platform-checklist/areas/api-backend.json. Not governed (check-governed-merges --pr 26787, 868 lines ≤ 3000). File surface as in claim 6445168911; Refs #26572 (slice 1 of the card's 11 items).
  2. Read by the seat: the new error-sentences pin and its fixture in full. The hook refusal asserts the verbatim sentence, no code, and zero rows written. The action door asserts 409 UNIQUE_VIOLATION with details exactly {developerMessage, object}, and that the row keeps its email. The storage 500 forces ENOTDIR under a regular file and checks that neither the errno nor the path reaches the body. The other three new files read as one describe per acceptance clause, each with a CONTROL arm. The JSON edits bump revision, add a history row with ref: #26572, and rewrite verify to name the new pin and layer.
  3. Gates: head check-runs on 19a4d705f1: 35 success, 16 skipped, 0 failing; check-expected-skips --pr 26787: OK, all 16 in main's roster. Thread's local run on the final head: 119 tests green, check-platform-checklist exit 0, --ran 53 of 55 derived gates exit 0, 2 NOT MEASURED (exit 3, prerequisite). Report 6446474715.
  4. Accepted deviations: the dogfood battery does not run on pull_request or merge_group, so these pins are first exercised by CI on main's next full battery. The thread's local run is the evidence until then. If that battery reds on one of these files, it is main-red and this seat stanches it (Warren's 2026-10-26 ruling).
  5. Out of scope: noted, not filed: a sandboxed hook's handled 400 on POST /data/OBJECT also logs [REST] Unhandled error: SandboxError … with a stack, which is log noise with no wrong answer. Skills-docs: not owed.
  6. Landing: not governed, CI green on this head, mergeable clean ⇒ the seat readies it and arms auto-merge through the relay. The card stays pm:dispatched for the next slice.

Generated by Claude Code

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

Labels

size/l skip-changeset PR has no user-facing published change; bypasses the changeset gate tests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants