Skip to content

test(dogfood): pin five records-forms checklist items at the REST door (slice 2) - #26813

Merged
objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/project-thread-jcuzjj
Oct 27, 2026
Merged

objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/project-thread-jcuzjj

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Warren · project thread

Refs #26573 (items action-param-widgets, cascading-multilevel-and-clear, cascading-options, conditional-rules-header, field-history-tracking; slice 2)

Clause-②: no
Metadata-protocol: none

维护者速读

  • 改了什么:records-forms 区按卡片顺序的下 5 个清单项,新增 5 个 dogfood 测试文件,在原样启动的 showcase 上经 REST 门断言它们的 api 条款,并把 5 项的 automated.ref 指向新钉测(revision 各加 1,history 引本卡)。
  • 为什么改:18.2.0 Tier 1 扫描把这些 api 条款判为 PARTIAL(没有 oracle 层的钉测);钉在 HTTP 层后每次发版可直接复跑。
  • 风险与回滚:只加测试和清单文字,不动产品代码、不加 CI 车道;新文件落在 dogfood 现有的 isolated 项目里。回滚即 revert 本 PR。
  • 先看:cascade-server-boundary.dogfood.test.ts(两个 KNOWN GAP 按现状钉住:服务端哪天开始拦截就会变红,按条目自己的话应另开卡,而不是算通过);field-history-tracking-activity.dogfood.test.ts(未追踪字段的实测摘要是 record discussion feed: thirteen consecutive system entries "Updated Campaign \"CPG-0001 - …\"" with no field diff — an update event should carry what changed and consecutive same-actor updates should fold #25787 通用框架,会写出字段标签 Website 但不写值)。
  • 两分钟验证:先建依赖闭包,再 pnpm --filter @objectstack/dogfood exec vitest run --maxWorkers=2 test/action-param-gallery-dispatch.dogfood.test.ts test/cascade-server-boundary.dogfood.test.ts test/cascade-role-gated-option.dogfood.test.ts test/invoice-conditional-rules-server.dogfood.test.ts test/field-history-tracking-activity.dogfood.test.ts,预期 5 个文件 14 个用例全绿;node scripts/check-platform-checklist.mjs 预期 OK。
  • 需要你做的:无,席位落地。

What changes

Five new dogfood files, each booting the showcase as shipped through @objectstack/verify and driving its REST doors:

Item (rev → new) Clauses now pinned over REST Pin
action-param-widgets (4 → 5) acceptance[2], negative[1], acceptance[3] server half action-param-gallery-dispatch.dogfood.test.ts: the gallery action's body has no side effect and echoes received, so every refusal asserts the echo is absent (the body never ran); a bag missing only p_text is its own case
cascading-multilevel-and-clear (8 → 9) acceptance[2], [4], [5], negative[2] (plus negative[0]–[1] as the control) cascade-server-boundary.dogfood.test.ts: the two recorded gaps pinned as they stand today
cascading-options (6 → 7) acceptance[2] persistence and server halves, acceptance[4], negative[1] cascade-role-gated-option.dogfood.test.ts: a member graded admin (positions read back with org_admin) vs a plain member
conditional-rules-header (5 → 6) acceptance[1], acceptance[2] server half, acceptance[5] API half, negative[0]–[1] invoice-conditional-rules-server.dogfood.test.ts: requiredWhen refusal and readonlyWhen strip on seeded INV-1003
field-history-tracking (7 → 8) acceptance[0], [1], [3], negative[0], [2] field-history-tracking-activity.dogfood.test.ts: the sys_activity summary rows and GET /auth/me/permissions

Each item's automated.ref keeps the pins it already named and adds the new one with what it scores. One history row per item, citing #26573. No clause text, fixture, step or knownGaps line was edited (the claim's file surface).

Skipped, by the slice-2 order:

  • record-discussion-mentions: waits on qa(checklist): records-forms — provisioning recipes for a walled two-organization mention leg, a packaged action specimen, and the app-crm import specs #26625 (the walled two-organization recipe).
  • adhoc-filter-sort-builder: next in card order, but every clause is a network/dom oracle; it needs Playwright, and the ruling adds no lane.
  • Browser legs inside the five items, left unpinned: action-param-widgets acceptance[0], [1], acceptance[3] dialog half, negative[0]; cascading-multilevel-and-clear acceptance[0], [3]; cascading-options acceptance[0], [3] and acceptance[2]'s "sees" half; conditional-rules-header acceptance[0], [2] client lock, [3], [4], negative[2]; field-history-tracking acceptance[2], negative[1]. cascading-* acceptance[1] stays on the objectui live spec and field-history-tracking acceptance[4] on its unit pin.

Why

The 18.2.0 release-candidate Tier 1 run scored these api clauses PARTIAL: no pin asserted them at the oracle's layer, so each sweep drove them by hand. The triage ruling allows ~5-item slices and no new CI lane; the new files fall under the dogfood package's existing isolated vitest project and run where the dogfood legs run today.

Tests

Measured answers the pins now hold (all first read live, then pinned exactly):

  • gallery dispatch: the conformant bag → 200 with the body's received echo; out-of-set p_priority + undeclared bogus → 400 naming both, no echo; only p_text missing → 400 naming p_text, no echo.
  • cascade: create {cn, zj} then PATCH {country:'us'} → 200, re-read holds province: 'zj'; the same pair in the payload → 400 province / invalid_option. Invoice on Contoso with an existing Northwind contact → 201, stored as sent; a fabricated contact → 400 contact / reference_not_found, nothing stored.
  • role gate: the graded member's tier: 'restricted' → 201, re-reads; the plain member's → 400 VALIDATION_FAILED tier / invalid_option, nothing stored; tier: 'standard' → 201.
  • invoice: status: 'sent' without issued_on → 400 with exactly [issued_on, required], nothing stored; draft and dated-sent → 201. PATCH tax_rate: 99 on paid INV-1003 → 200, re-read unchanged; the same PATCH on a draft persists.
  • history: PATCH industry retail → finance lands summary: 'Industry: Retail → Finance' (message key fieldChanges); a website-only PATCH lands Updated Account (Success Overlay) "<name>": Website (key activityUpdatedFields, no arrow, neither URL). /auth/me/permissions → objects.showcase_account.apiOperations contains history; showcase_task's contains get, not history.
Runs

No ablation was run: this diff adds tests and changes no behaviour they pin. Each refusal assertion has a same-door admitted control beside it, so none passes on a door that refuses everything.

Acceptance notes

  • field-history-tracking: the showcase boot composes no audit plugin, so this file adds AuditPlugin the way objectstack serve composes it (as activity-withheld-update.dogfood.test.ts does). acceptance[1] says "no field-diff summary naming website"; the measured row is the record discussion feed: thirteen consecutive system entries "Updated Campaign \"CPG-0001 - …\"" with no field diff — an update event should carry what changed and consecutive same-actor updates should fold #25787 generic frame, which names the changed field's label and never its values, so the pin asserts no old → new for website. The clause text was not reworded (outside the claim's surface).
  • cascading-multilevel-and-clear acceptance[2] and [4] are KNOWN GAP clauses: the pins assert today's 200/201, so new server enforcement turns them red, which by the item's own text is new enforcement to file, not a pass.
  • cascading-options acceptance[2]: the seeded admin is org_owner, which does not imply org_admin, so the admin persona is a signed-up member whose sys_member row is graded admin, read back from the resolved positions before any write.

Verification

  • node scripts/check-platform-checklist.mjs → exit 0, OK — 16 areas, 329 items (324 active, 1 planned), on the commit head and again on the final head.
  • node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack → 55 commands on the tree of this PR's commit 38c2de88 (run before a message-only reword), each run and reconciled with --ran: 55 derived famil(ies) accounted for — 55 run, 0 NOT-MEASURED, all exit 0.
  • CI families are read from this PR's check-runs, not re-run locally. Dogfood Regression Gate does not run on pull_request, so the local runs above are this PR's evidence for the new pins.

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. (CI-owned run)
  • 4. One issue, one branch off an up-to-date main, one pull request.
  • 5. A change that publishes carries a changeset — nothing publishes here (@objectstack/dogfood is private; docs/qa/** ships in no package), so skip-changeset; both declaration lines are filled in above.
  • 6. packages/spec not touched.
  • 7. No hand edits to content/docs/references/, packages/*/CHANGELOG.md or content/docs/releases/.
  • 8. Title, body and comments are in English (the maintainer brief above is Chinese by the repo's communication rule).

Generated by Claude Code

…r (slice 2)

Items action-param-widgets, cascading-multilevel-and-clear,
cascading-options, conditional-rules-header and field-history-tracking.

Five new dogfood pins on the showcase as shipped score the api clauses the
18.2.0 sweep left PARTIAL: the action param gate's body-never-ran echo, the
two recorded cascade gaps pinned as they stand, both sides of the org_admin
option gate, the invoice requiredWhen/readonlyWhen server half, and the
trackHistory activity summary plus the derived history operation. Each
item's automated.ref names its pin, revision +1, one history row.

Claude-Session: https://claude.ai/code/session_01JQwxbZ3oTCkvGGTMNd5XYU
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Oct 27, 2026
@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 cee4b16584158928a6cb6d88789ae5c337d71d71 → packageMentionDocs.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

维护者速读

  • 改了什么:records-forms 区按卡片顺序的下 5 个清单项(动作参数控件、多级级联与清空、级联选项、条件规则表头、字段历史追踪),新增 5 个 dogfood 测试文件,在原样启动的 showcase 上经 REST 门钉住它们的接口层条款;5 项的 automated.ref、修订号和历史行已更新。
  • 为什么改:18.2.0 Tier 1 扫描把这些接口条款判为 PARTIAL,没有接口层的钉测,每次发版都要手跑。
  • 风险与回滚:只加测试和清单文字,不改产品代码,不加 CI 通道;新文件落在 dogfood 现有的 isolated 项目里。回滚 = revert 本 PR。
  • 先看:cascade-server-boundary.dogfood.test.ts,两条 KNOWN GAP 按今天的 200/201 钉住,服务端哪天开始拦截就会变红,按条目原话那是要另开卡的新约束。
  • 两分钟验证:node scripts/check-platform-checklist.mjs,退出 0。
  • 需要你做的:无,席位落地。余下 11 条由后续批次派发。
  • 席位意见:每个拒绝用例都复读确认没写入(或动作体没跑),并配了有权一侧的对照,不会靠一律拒绝变绿。

席位核对

ACCEPT · domain:devx#1 · session_01JQwxbaFpnMwgpCgneKe2qS · head efe6101ef4 · 2026-10-27T17:33Z

  1. Shape: 6 files, +521/−10: docs/qa/platform-checklist/areas/records-forms.json and five new packages/qa/dogfood/test/*.dogfood.test.ts. Not governed (check-governed-merges --pr 26813, 531 lines ≤ 3000). File surface as in claim 6445199361; Refs #26573 (slice 2).
  2. Read by the seat: all five new files. Each refusal is followed by a re-read proving nothing was stored, or (for the gallery action, whose body has no side effect) that the received echo is absent, and each carries an entitled-side control: the draft twin, the ungated standard tier, the draft invoice's persisting tax_rate, the written stale child refused invalid_option. The org-admin persona is read back off the resolved context before any case runs. The field-history file composes AuditPlugin the way existing dogfood files already do, and @objectstack/plugin-audit is already a dogfood dependency. No new file needs SHARED_SHOWCASE; all sit in isolated, where the env toggle and the INV-1003 read are safe.
  3. Gates: head check-runs on efe6101ef4: 35 success, 16 skipped, 0 failing; check-expected-skips --pr 26813: OK, all 16 in main's roster; mergeable clean. Thread's local run: 14/14 tests on the final head, dispatch-gates 55/55 exit 0, check-platform-checklist OK. Report 6448627061.
  4. Accepted deviations: the two KNOWN GAP clauses of cascading-multilevel-and-clear are pinned at today's 200/201 on purpose, turning the item's "new enforcement to file, not a pass" into a red test; whoever closes either gap updates the pin and the item together. The dogfood battery does not run on pull_request or merge_group, so these pins first run in CI on main's next full battery; a red there is main-red and this seat stanches it.
  5. Out of scope: record-discussion-mentions waits on qa(checklist): records-forms — provisioning recipes for a walled two-organization mention leg, a packaged action specimen, and the app-crm import specs #26625; adhoc-filter-sort-builder is all network/dom clauses and needs a browser lane, which the ruling does not add. field-history-tracking acceptance[1]'s wording against the measured record discussion feed: thirteen consecutive system entries "Updated Campaign \"CPG-0001 - …\"" with no field diff — an update event should carry what changed and consecutive same-actor updates should fold #25787 generic frame (it names the Website label, no values) may want an item-text pass; that is clause text, outside this slice's surface. 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

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 27, 2026 17:36
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 27, 2026 17:36
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 27, 2026
Merged via the queue into main with commit 3c2187f Oct 27, 2026
52 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/project-thread-jcuzjj branch October 27, 2026 18:19
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