Skip to content

Commit 02d6507

Browse files
docs(qa): wave-3 checklist accuracy slice S6 — api-backend, ai and automation (#28362)
<!-- claude-projects-attribution: {"github_login":"os-zhuang"} --> _Requested by **Sam** · [project thread](https://claude.ai/code/project/chan_01LjZwNRFiG2fkp8SNf6rHNx?thread=cmsg_01LjZwNRFiG2fkp8SNf6rHNxNVTbwyL9LkMqUayiw5y7EE)_ Fixes #28340 Part of #27377 (wave-3 checklist accuracy, slice S6). Clause-②: no Metadata-protocol: none ## 维护者速读 - 改了什么:三份测试清单(api-backend、ai、automation)里 18 个条目按当前代码改正文字,每个条目 revision +1、追加一行 history;automation 的 qa-flow-status-doors 夹具新增第 6 步。 - 为什么改:18.3.0 第三波 QA(#27392、#27409、#27441)发现这些条目的步骤或判据与产品现状不符,跑测的人按旧文字会误判。 - 风险与回滚:只改 docs/qa 下三个 JSON,不碰产品代码;没有条款被放宽,回滚即 revert。 - 先看:automation.json(新夹具第 6 步与 trigger-status-contract)、ai.json(mcp-oauth-private-host-transport 的未持有私网地址读法)、api-backend.json(formula-stdlib-matrix 29→30)。 - 两分钟验证:`pnpm check:platform-checklist`,预期末行 OK、352 items。 - 需要你做的:无,席位落地。 ## What changes 25 of the slice's 26 census rows still held at `488b3ed0` and are corrected to what the code says today; one row needs no edit. Every touched item gets `revision` +1 and exactly one appended `history` row citing its run record and #27377. main's history is an exact prefix of every touched item (the edit script asserted it, and the parsed result equals the intended model). | file | item | census rows | run | |---|---|---|---| | api-backend | aggregate-contract-matrix | 4, 5, 6 | #27392 | | api-backend | api-methods-verb-gate | 7, 8 | #27392 | | api-backend | error-envelope-ledger | 9 | #27392 | | api-backend | query-contract-matrix | 49, 50 | #27409 | | api-backend | formula-stdlib-matrix | 70, 124 | #27441 | | ai | mcp-run-action-exposure-gate | 1 | #27392 | | ai | agent-tool-skill-metadata-roundtrip | 10 | #27392 | | ai | mcp-oauth-private-host-transport | 27, 47 | #27409 | | ai | mcp-http-surface | 44 | #27409 | | ai | mcp-validate-expression | 46 | #27409 | | ai | mcp-coded-refusals-and-runtime-exposure | 48 | #27409 | | automation | packaged-flow-subflow-disable-refusal | 13 | #27392 | | automation | trigger-status-contract (+ the qa-flow-status-doors recipe) | 14, 15 | #27392 | | automation | trigger-type-matrix | 58 | #27409 | | automation | durable-suspend-restart | 59 | #27409 | | automation | flow-authoring-refusals-v18 | 60 | #27409 | | automation | flow-node-type-matrix | 109 | #27441 | | automation | packaged-flow-clone-contract | 110 | #27441 | Highlights: - **aggregate-contract-matrix**: the retirement message's tail is `AGG_RETIRED_TAIL` (names `os migrate meta` and the protocol upgrade guide, no `--from 16`); a grouped empty `where` answers no groups, so the empty-where identities are read ungrouped; knownGaps[0] names the seeded rows (a null `annual_revenue` row, 2025-12-29 Monday and 2026-01-04 Sunday in ISO 2026-W01, 2027-01-01 in 2026-W53). - **api-methods-verb-gate**: the import body is spelled (`format: 'json'`, `rows`, `writeMode`, `matchFields` for update), and the parser's 400 INVALID_REQUEST is named as not-the-gate; both legacy warnings print once per process (per combination, per object name), so each legacy leg takes its own object name. - **error-envelope-ledger**: sign-up answers 403 SELF_REGISTRATION_CLOSED under the invite_only default; a third identity comes from admin create-user or an invitation. - **query-contract-matrix**: compound AST filters are prefix-form `['and', cond, cond]`; the four substring operators are case-sensitive, `$icontains` is the ASCII-fold twin. - **formula-stdlib-matrix**: the count is 30 (29 chained calls plus the `label()` macro); a `label()` known-answer row is added; the scratch-object legs name a writable package with a declared namespace. - **mcp-run-action-exposure-gate** (GAP): a staging recipe for the permitted half of `list_actions` — a runtime declarative update action, ai-exposed, requiring `manage_metadata`. - **agent-tool-skill-metadata-roundtrip**: `agent.tools` / `agent.knowledge` / `skill.triggerPhrases` are plain unknown keys naming the upgrade guide since #25767; the surviving prescriptions are listed and `agent.lifecycle` is probed. - **mcp-oauth-private-host-transport** (STALE + GAP): boot (a) is staged by the base URL's host literal, held or not; a held address stays required for the real-client leg only. - **mcp-http-surface**: acceptance[4] names the HTTP door; stdio serves 9 tools because its bridge has no action methods. - **mcp-validate-expression**: a new negative and step for blank input (the save gate's verdict, `invalid_union`). - **mcp-coded-refusals-and-runtime-exposure**: names the `qa_ai_mark` producer the run used for acceptance[3]. - **trigger-status-contract**: the recipe gains step 6 (`qa_input_schema_invalid`, the 422 FLOW_INPUT_SCHEMA_INVALID row), the "no stock trigger" knownGap is dropped, and the purge leg warns that `showcase_inquiry_purge` really deletes. - **durable-suspend-restart**: the PT1M follow-up may complete on the new process before the re-read; that completion is its survival proof, and the nested pair must still read paused and identical. - **packaged-flow-clone-contract**: an empty-string name answers `invalid_type`; the arm is added. ## Tests No code changed. The three files are validated by `pnpm check:platform-checklist` (green). The two new staging bodies were parsed against the built spec at `8de73450`: the recipe's step-6 flow parses with `FlowSchema`, both action bodies (`qa_ai_gated`, `qa_ai_mark`) parse with `ActionSchema`, and a control with an illegal `inputSchema` type is refused. ## Acceptance notes - **Row 37 (`automation.paused-run-trigger-record-masked`) is not edited.** Its fixtures.requires[1] already asks for an object with an `internal: true` field; the run used `showcase_field_zoo`, which has none. That is a runner deviation, not a ledger gap. - **Row 47 / 27 is a reading, flagged for the seat.** The census called it a light ruling. The code judges only the configured base URL's host literal (`isOAuthEligibleBaseUrl`), and the run reproduced the whole (a) shape on an unheld 10.0.0.5, so the item now scores (a) that way and keeps a held address for the real-client leg. No clause text changed. If the seat wants a ruling first, this one hunk can be reverted on its own. - **Two GAP recipes are derived from source, not yet run live**: `qa_ai_gated` (row 1) and the fast `time_relative` clone (row 58, whose interval spelling is the showcase's own `schedule: { type: 'interval', intervalMs: 60000 }`). The history rows say so. - Not edited, noticed on the way: `ai.agent-tool-skill-metadata-roundtrip`'s `variants` still label `agent.tools`, `agent.knowledge` and `skill.triggerPhrases` as "retiredKey" and list no `agent.lifecycle` variant. Changing variants changes the run matrix, so it is left for a seat call. - No product defect was found while re-verifying. ## Verification <details><summary>dispatch-gates (16 derived families, all exit 0)</summary> Derived at `8de73450` with `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack`, change set 3 paths, 244 changed lines. ```text node scripts/check-adr-links.mjs :: exit 0 node scripts/check-adr-links.mjs --self-test :: exit 0 node scripts/check-closing-keyword-parity.mjs :: exit 0 node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0 node scripts/check-comment-mask-corpus.mjs :: exit 0 node scripts/ci/plan-test-core-shards.mjs --self-test :: exit 0 pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0 (first run exit 3, prerequisite unbuilt; re-run after building formula + lint) pnpm check:ci-filter-parity :: exit 0 pnpm check:cross-package-test-inputs :: exit 0 pnpm check:doc-authoring :: exit 0 pnpm check:driver-memory-census :: exit 0 pnpm check:gitlink-declared :: exit 0 pnpm check:nul-bytes :: exit 0 pnpm check:platform-checklist :: exit 0 pnpm check:refd-timer-probe :: exit 0 pnpm check:watch-hint-literal :: exit 0 ``` `--ran` reconciliation: 16 derived, 16 run, 0 NOT-MEASURED (a derived zero: all 16 recorded an exit code). </details> <details><summary>check:platform-checklist</summary> ```text check-platform-checklist: OK — 16 areas, 352 items (347 active, 1 planned); provisioning: 10 area recipes, 15 item references resolved (2 area-qualified), 10/10 recipes referenced; symbol anchors: 1066/1076 resolved (was 1064/1074 at base) ``` </details> --- _Generated by [Claude Code](https://claude.ai/code/session_01QUs3BvdUqqhcRdQJHjUSXA)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent bb24a53 commit 02d6507

3 files changed

Lines changed: 159 additions & 85 deletions

File tree

0 commit comments

Comments
 (0)