Skip to content

docs(qa): re-point records-forms.field-history-tracking to the record page v3 sys_audit_log gate; the live history spec reads the Changes chip - #27651

Merged
objectstack-fleet[bot] merged 4 commits into
mainfrom
claude/issue-27492-history-clause-repoint
Oct 29, 2026
Merged

objectstack-fleet[bot] merged 4 commits into
mainfrom
claude/issue-27492-history-clause-repoint

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #27492

Clause-②: no
Metadata-protocol: none

维护者速读

  • 改了什么:把清单条目 records-forms.field-history-tracking 里还在找 History 标签页的三条断言,改指向记录页 v3 的真实形态:开了 trackHistory 的对象读 sys_audit_log,结果出现在时间线的「变更」筛选里;没开的对象不读。另外更新了夜间 live e2e 用例 record-history-display.spec.ts,它在主干上一直是红的。
  • 为什么改:记录页 v3(console record page v3: frameless detail sections, one merged timeline (discussion + activity + field changes), compact related cards, header 1 primary + 2 secondary + ⋯ — the synthesized default page, drawn from the object's roles; the dead BuildPageOptions hints go #27055)在所有宽度下都去掉了 History 标签页,产品本身没问题。旧断言让每轮发版巡检都多一条假红,还会盖住同条目里的真红。
  • 风险与回滚:只动了一份清单 JSON 和一个夜间 e2e 用例,不碰产品代码,也不进任何已发布的包。回滚就是 revert 这个 PR。
  • 先看:docs/qa/platform-checklist/areas/records-forms.json 的 acceptance[2] 和新加的 knownGaps 第 2 条(任务详情页那一半的证据由两道闸门共同决定,单看它证明不了标志位);然后看 ui/e2e/live/record-history-display.spec.ts 的视口和定位器。
  • 两分钟验证:在本地起 showcase 和 console dev server,然后跑 LIVE_APP_URL=… LIVE_API_URL=… pnpm --dir ui exec playwright test --config=playwright.live.config.ts record-history-display.spec.ts。预期是 1 passed,旧版本会在等 History 标签页时超时。
  • 需要你做的:无,席位落地。

What changes

One item, records-forms.field-history-tracking, goes from revision 9 to 10. It is the only item edited, and the live spec it cites is updated with it. No product code changes.

  • acceptance[2] no longer asks for a History tab. It now says the record page's sys_audit_log field-change history is gated on object-level enable.trackHistory in both directions. On the account, the page reads sys_audit_log and the timeline stream's Changes chip lists the tracked edits as old → new lines with display values. The task makes no sys_audit_log read. The oracle moves from dom to network, because the Changes chip cannot prove an absence: it also lists the stream's sys_activity created/updated rows (ACTIVITY_TYPE_TO_FEED_TYPE maps both to field_change).
  • negative[1]: a sys_audit_log read on the task detail is a FAIL. It is judged on the network log, never on an empty Changes chip or a missing tab.
  • steps[3] says where the stream sits in each width tier (recordPageTierFor): the timeline column, or the Activity card while the reader's timeline switch is off (the default for showcase_account), or the Timeline tab. It gives the measured widths. The steps no longer send the runner to look for a History tab.
  • negative[3] was a cross-reference that could only ever score skipped. It moves out of negative[] into source[4], the field sibling items already use for cross-refs (access-security.* carry 15+ "cross-ref …" rows in source). The checklist has no notes key, and none was invented.
  • automated.ref now says what the re-pointed live spec holds: acceptance[2]'s flag-true DOM half, at 1440×900. It also says the read gate is still driven by hand in both directions.

Scope additions inside the same item, all the same stale-History-tab class, declared here because the claim's file surface did not list them:

  • the title said "gates the History tab";
  • fixtures.requires[1] said "the tab/op gating";
  • negative[0] exempted "the History tab" from the per-field rule. It now exempts the stream's audit-log lines. On a trackHistory object those lines replace the stream's sys_activity updated rows (mergeTimelineStream). Without this change, a runner would FAIL a correct "Website old → new" line;
  • source[2] still pointed at the objectui-era path and the "History tab gate";
  • one new knownGaps entry. showcase_task's record page is the authored kind: 'full' showcase_task_detail page. RecordDetailView serves the audit read only to a synthesized page (RecordDetailView.recordOpenWaves-13010.test.tsx: "an assigned page of a trackHistory object never reads the audit log"). So the task's absent read holds with or without the flag. No showcase object pairs per-field flags, no enable block, and a synthesized page.

ui/e2e/live/record-history-display.spec.ts (nightly list, unchanged) now opens showcase_account at 1440×900. It selects the Changes chip of the Timeline region and asserts the same display contract as before: real actor, option labels, localized dates, resolved owner. The page has no tab and no switch to click at that width. The unknown-user guard now matches the stream's detail.unknownUser fallback (Unknown / 未知用户).

Tests

All readings come from a showcase booted from this branch with pnpm dev -- --fresh -p 38497 (backend) and the console vite dev server (DEV_PROXY_TARGET pointing at it, port 38581). The tree was base 882d4e4a5c plus this diff, with no product code changed.

The spec at base, unchanged: red, for the reason the card names
✘ e2e/live/zz-orig-27492.spec.ts:50:1 › History tab shows display values … (30.8s)
  Error: locator.waitFor: Test timeout of 30000ms exceeded.
  - waiting for getByRole('tab', { name: /^(History|历史)$/ }) to be visible
os-verify-lock: VERDICT command-exit 1

The failure screenshot at its 1000×800 viewport shows two columns, details plus related, and no tab strip. The stream sits in the Activity card, with the chips All / Activity / Discussion / Changes. A temporary copy of the base spec was used for this run and then deleted.

The re-pointed spec: green, run twice on that boot
✓ e2e/live/record-history-display.spec.ts:62:1 › the timeline stream's Changes chip shows display values (localized dates, option labels, resolved lookups, real actor) instead of raw audit payloads (19.0s)
1 passed (19.0s)
os-verify-lock: VERDICT command-exit 0

The stream's text for the seeded record:

Owner Dev Admin → Ada Auditor (demo) · Dev Admin · just now
Industry Technology → Finance; Lifecycle Prospect → Active · Dev Admin · just now
Customer Since 7/26/2026 → 8/4/2026 · Dev Admin · just now
Tier and audit-read measurement (temporary probe spec, deleted afterwards)
object window record view layout tabs sys_audit_log reads at load after opening Timeline
showcase_account 1440×900 1184 px details · related (timeline folded) none 1 —
showcase_task 1440×900 1184 px authored page, no stream none 0 —
showcase_account 1000×800 952 px (sidebar as its icon rail) details · related none 1 —
showcase_task 1000×800 952 px authored page, no stream none 0 —
showcase_account 700×800 700 px tabbed Details / Related / Timeline 0 1
showcase_task 700×800 700 px authored page, no stream none 0 0

On a seeded account, the Changes chip showed a sys_activity row (Updated Account "华宁科技": Search Index) next to the audit read. This is the measured reason an empty Changes chip is no absence oracle.

Acceptance notes

  • The PM's premise correction (H1) does not hold. fix(plugin-detail,app-shell,components): record page round 2 — related OFF draws no column or rail, one segmented panel control in the header row, three columns in a 1440 window with the sidebar #27473 moved this spec to 1000×800 to stay in the tabbed tier, where the History tab was assumed to still exist. It does not exist there. buildDefaultTabs emits Details / Timeline / Related / Approvals only, and buildDefaultPageSchema.test.ts asserts "no Activity or History tab". Live at 1000×800 the console sidebar comes up as its icon rail, the record view is 952 px, and the page draws two columns with no tab strip. Only a narrower window, measured at 700, reaches the tabbed tier. The spec has been red on the nightly list since the record page v3 change.
  • Card wording vs. tree. The card asked that an untracked object show "no Changes entries". The tree contradicts that for any synthesized page, because the Changes chip also lists sys_activity created/updated rows. For showcase_task the stream is absent altogether, since its record page is authored. The item now follows the tree.
  • Not filed, noted here. These are the same stale-History-tab family in sibling items and comments. None is a product defect.
  • acceptance[0].verify says "the timeline renders the same row". On a trackHistory object the stream drops the sys_activity updated row in favour of the audit entry (mergeTimelineStream). The text a runner sees is the same old → new pair, so this was left alone.

Verification

Gate list derived with node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack at head 19d6a65a14, after merging origin/main, with no conflicts. The 24 families were all run locally on that head, each exit code captured before any pipe.

24 derived families, all exit 0; --ran reconciliation
0 node scripts/check-adr-links.mjs
0 node scripts/check-adr-links.mjs --self-test
0 node scripts/check-closing-keyword-parity.mjs
0 node scripts/check-closing-keyword-parity.mjs --self-test
0 node scripts/check-comment-mask-corpus.mjs
0 node scripts/ci/plan-test-core-shards.mjs --self-test
0 pnpm --filter @objectstack/lint run check:doc-formula-expressions
0 pnpm check:ci-filter-parity
0 pnpm check:cross-package-test-inputs
0 pnpm check:doc-authoring
0 pnpm check:driver-memory-census
0 pnpm check:engine-double-contract
0 pnpm check:gitlink-declared
0 pnpm check:nul-bytes
0 pnpm check:platform-checklist
0 pnpm check:published-files
0 pnpm check:query-options-erasure
0 pnpm check:refd-timer-probe
0 pnpm check:tier-file-adoption
0 pnpm check:type-check-coverage
0 pnpm check:type-check-debt
0 pnpm check:undeclared-dep-imports
0 pnpm check:watch-hint-literal
0 pnpm check:where-matcher
✓ dispatch-gates --ran: 24 derived famil(ies) accounted for — 24 run, 0 NOT-MEASURED (a DERIVED zero — all 24 recorded an exit code and none of them is 3).
check-platform-checklist: OK — 16 areas, 352 items (347 active, 1 planned)
check-platform-checklist --changed-from origin/main: exit 0, 0 anchored files in the change set

No changeset: nothing published moves. The diff is docs/qa/** and ui/e2e/live/**, and ui/package.json is private: true with no files. Labelled skip-changeset.


Generated by Claude Code

… page v3 audit-read gate (WIP)

Claude-Session: https://claude.ai/code/session_01QSeKYmTYfaPbLQD4BJfomW
Co-authored-by: Claude <noreply@anthropic.com>
…p, record page v3 has no History tab (WIP)

Claude-Session: https://claude.ai/code/session_01QSeKYmTYfaPbLQD4BJfomW
Co-authored-by: Claude <noreply@anthropic.com>
…read; the live spec reads the Changes chip at 1440x900

Measured on a booted showcase: no tab strip at 1440x900 or 1000x800, tabs
without History only at 700x800; the task detail is an authored page with
no audit read.

Claude-Session: https://claude.ai/code/session_01QSeKYmTYfaPbLQD4BJfomW
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW

席位核对 — ACCEPT · domain:devx#2 · head 19d6a65a14 · 2026-10-29T16:34Z

维护者速读

  • 改了什么:清单条目 records-forms.field-history-tracking 原来有三条断言在找 History 标签页,现在改成对照记录页 v3 的实际形态:开了 trackHistory 的对象会读 sys_audit_log,读到的结果出现在时间线的「变更」筛选里;没开的对象不读。夜间 live e2e 用例 record-history-display.spec.ts 也一起改了,改成在 1440×900 下看「变更」筛选。
  • 为什么改:记录页 v3(console record page v3: frameless detail sections, one merged timeline (discussion + activity + field changes), compact related cards, header 1 primary + 2 secondary + ⋯ — the synthesized default page, drawn from the object's roles; the dead BuildPageOptions hints go #27055)在所有宽度下都去掉了 History 标签页,产品本身没问题。旧断言让每轮发版巡检都多出一条假红,那条夜间用例在主干上也一直等不到标签页而超时。
  • 风险与回滚:只改一份清单 JSON 和一个夜间 e2e 用例(+69/−48),不动产品代码,不发布任何包。回滚 = 还原本 PR。
  • 先看:records-forms.json 里的 acceptance[2](判据从 dom 改为 network)和新增的 knownGaps 第 2 条;再看 spec 的视口和定位器。
  • 两分钟验证:本地起 showcase 和 console dev server,跑 pnpm --dir ui exec playwright test --config=playwright.live.config.ts record-history-display.spec.ts,应为 1 passed。
  • 需要你做的:无。席位落地。

席位意见:合入。席位派发时的假设 H1(1000px 下仍是页签布局)被 dev 实测证伪,已在卡上公开更正(6502368614),原卡前提成立。判据改用网络请求是对的:「变更」筛选里还会出现 sys_activity 的增改行,看界面证明不了「没有读审计日志」。

Shape: draft → main, Fixes #27492. 2 files: docs/qa/platform-checklist/areas/records-forms.json and ui/e2e/live/record-history-display.spec.ts (the cross-domain half the claim declared), +69/−48. Labels tests, size/m, skip-changeset. No assignees or reviewers (non-governed; the seat lands it). The dev opened it through the relay; report 6502299806, claim 6500498782.

Premise measured: the card held, and the seat's dispatch hypothesis H1 did not. buildDefaultTabs emits Details / Timeline / Related / Approvals only, and at 1000×800 the sidebar folds to its icon rail, giving two columns and no tabs. The unchanged spec times out on the History tab (dev's live run, VERDICT 1). Correction 6502368614.

Seat's own read of the diff:

Gates: on head 19d6a65a14, 62 check-runs: 48 success, 14 skipped, 0 failure; mergeable_state: clean. check-expected-skips --pr 27651: OK, all 14 skips are in main's roster (exit 0). check-governed-merges --pr 27651: NOT governed, 117 changed lines. Dev's union: dispatch-gates --ran reports 24 derived, 24 run, all exit 0; check:platform-checklist reports "OK — 16 areas, 352 items".

Accepted deviations:

  • Same-class fixes inside the one item beyond the claim's listed fields, declared in the PR body: title, fixtures.requires[1], negative[0]'s exemption, source[2], and the new knownGaps entry.
  • A full workspace build under the lock, so the showcase could boot.
  • Two stray pid files at the container root are left for a person; deleting them was refused by the harness and was not routed around.

Out of scope, with destinations:

Landing: non-governed, 117 changed lines. In this act the seat readies the PR and arms auto-merge. On merge the seat verifies the merged diff and posts the landing note on #27492. There is no cloud session to archive (mode:subagent).


Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 29, 2026 16:35
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 29, 2026 16:35
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 29, 2026
Merged via the queue into main with commit 2cd9304 Oct 29, 2026
63 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-27492-history-clause-repoint branch October 29, 2026 16:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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

Projects

None yet

1 participant