Repository navigation
Commit 2cd9304
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)
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(#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.
<details><summary>The spec at base, unchanged: red, for the reason the
card names</summary>
```
✘ 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.
</details>
<details><summary>The re-pointed spec: green, run twice on that
boot</summary>
```
✓ 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
```
</details>
<details><summary>Tier and audit-read measurement (temporary probe spec,
deleted afterwards)</summary>
| 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.
</details>
## Acceptance notes
- **The PM's premise correction (H1) does not hold.** #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.
- `records-forms.crud-roundtrip` (rev 15): steps and
acceptance[4].verify still say "open the record's History tab". This is
the contract this item's cross-ref points at.
- `records-forms.record-edit-undo` (rev 5): one verify still says "after
screenshot of the History tab".
- `examples/app-showcase/src/data/objects/account.object.ts`: the
comment on `enable` still narrates the History tab.
- #27312 already tracks the spec `describe()` of `enable.trackHistory`.
- 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.
<details><summary>24 derived families, all exit 0; --ran
reconciliation</summary>
```
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
```
</details>
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](https://claude.ai/code/session_01QSeKYmTYfaPbLQD4BJfomW)_
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent 1fd68ea commit 2cd9304
2 files changed
Lines changed: 69 additions & 48 deletions
File tree
- docs/qa/platform-checklist/areas
- ui/e2e/live
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
5135 | 5135 | | |
5136 | 5136 | | |
5137 | 5137 | | |
5138 | | - | |
| 5138 | + | |
5139 | 5139 | | |
5140 | 5140 | | |
5141 | | - | |
| 5141 | + | |
5142 | 5142 | | |
5143 | 5143 | | |
5144 | 5144 | | |
| |||
5148 | 5148 | | |
5149 | 5149 | | |
5150 | 5150 | | |
5151 | | - | |
| 5151 | + | |
5152 | 5152 | | |
5153 | 5153 | | |
5154 | | - | |
| 5154 | + | |
| 5155 | + | |
5155 | 5156 | | |
5156 | 5157 | | |
5157 | 5158 | | |
5158 | 5159 | | |
5159 | 5160 | | |
5160 | 5161 | | |
5161 | | - | |
| 5162 | + | |
5162 | 5163 | | |
5163 | 5164 | | |
5164 | 5165 | | |
| |||
5175 | 5176 | | |
5176 | 5177 | | |
5177 | 5178 | | |
5178 | | - | |
5179 | | - | |
5180 | | - | |
5181 | | - | |
| 5179 | + | |
| 5180 | + | |
| 5181 | + | |
| 5182 | + | |
5182 | 5183 | | |
5183 | 5184 | | |
5184 | 5185 | | |
| |||
5194 | 5195 | | |
5195 | 5196 | | |
5196 | 5197 | | |
5197 | | - | |
5198 | | - | |
5199 | | - | |
5200 | | - | |
| 5198 | + | |
| 5199 | + | |
| 5200 | + | |
5201 | 5201 | | |
5202 | 5202 | | |
5203 | 5203 | | |
5204 | 5204 | | |
5205 | 5205 | | |
5206 | 5206 | | |
5207 | 5207 | | |
5208 | | - | |
| 5208 | + | |
5209 | 5209 | | |
5210 | 5210 | | |
5211 | 5211 | | |
5212 | 5212 | | |
5213 | | - | |
5214 | | - | |
| 5213 | + | |
| 5214 | + | |
| 5215 | + | |
5215 | 5216 | | |
5216 | 5217 | | |
5217 | 5218 | | |
| |||
5267 | 5268 | | |
5268 | 5269 | | |
5269 | 5270 | | |
| 5271 | + | |
| 5272 | + | |
| 5273 | + | |
| 5274 | + | |
| 5275 | + | |
| 5276 | + | |
5270 | 5277 | | |
5271 | 5278 | | |
5272 | 5279 | | |
| |||
0 commit comments