Skip to content

Commit 2cd9304

Browse files
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/records-forms.json‎

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5135,10 +5135,10 @@
51355135
},
51365136
{
51375137
"id": "records-forms.field-history-tracking",
5138-
"title": "Per-field trackHistory: a tracked edit lands the ADR-0052 §5b old→new timeline summary with display values, an untracked edit does not, and object-level enable.trackHistory gates the History tab and derived history op both ways",
5138+
"title": "Per-field trackHistory: a tracked edit lands the ADR-0052 §5b old→new timeline summary with display values, an untracked edit does not, and object-level enable.trackHistory gates the record page's sys_audit_log field-change read and derived history op both ways",
51395139
"since": "v15",
51405140
"status": "active",
5141-
"revision": 9,
5141+
"revision": 10,
51425142
"priority": "P1",
51435143
"surface": "mixed",
51445144
"personas": [
@@ -5148,17 +5148,18 @@
51485148
"app": "showcase",
51495149
"requires": [
51505150
"showcase_account: enable.trackHistory:true (account.object.ts) + per-field trackHistory on industry/status — the BOTH-halves fixture",
5151-
"showcase_task: per-field trackHistory on status/priority (examples/app-showcase/src/data/objects/task.object.ts#Task: its status and priority fields declare trackHistory) with NO object-level enable block — the natural negative for the tab/op gating"
5151+
"showcase_task: per-field trackHistory on status/priority (examples/app-showcase/src/data/objects/task.object.ts#Task: its status and priority fields declare trackHistory) with NO object-level enable block — the natural negative for the audit-read/op gating"
51525152
],
51535153
"knownGaps": [
5154-
"no showcase object declares trackHistory:true on a REFERENCE field, so the referenced-record-title rendering (clause 5) is a unit-pin verdict (audit-lookup-summary.test.ts) unless a scratch tracked lookup is authored — record which the verdict rests on"
5154+
"no showcase object declares trackHistory:true on a REFERENCE field, so the referenced-record-title rendering (clause 5) is a unit-pin verdict (audit-lookup-summary.test.ts) unless a scratch tracked lookup is authored — record which the verdict rests on",
5155+
"showcase_task's record page is the authored kind:'full' showcase_task_detail page (examples/app-showcase/src/ui/pages/task-detail.page.ts), which draws no timeline stream, and RecordDetailView serves its sys_audit_log 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 enable.trackHistory, and it does not prove the flag half of the gate on its own. No showcase object pairs per-field flags, no enable block and a synthesized page. The flag half rests on the historyEnabled code read unless a scratch object with that shape is authored"
51555156
]
51565157
},
51575158
"steps": [
51585159
"boot the showcase on its own port and DB; sign in as admin; open a seeded account record",
51595160
"edit the TRACKED select `industry` (e.g. Technology → Finance); save; read the record's sys_activity rows over the API and open the timeline",
51605161
"edit an UNTRACKED field (e.g. website) alone; save; re-read sys_activity for the record",
5161-
"open the account's History tab; then open a seeded task's detail and look for a History tab",
5162+
"record the network log from page load, open the account record and select its timeline stream's Changes chip (变更). Record page v3 has no History tab at any width (#27055). Where the stream sits depends on the record view's width (ui/packages/plugin-detail/src/synth/recordPageColumns.ts#recordPageTierFor), which is the window minus the console sidebar. At 760 px and wider it is resident: the Timeline column, or, while the reader's timeline switch is off, the Activity card at the foot of the related column. The switch is off by default for an object that is not worked, and showcase_account is not one (ui/packages/plugin-detail/src/synth/recordPageColumns.ts#recordTimelineDefaultReason answers null). Narrower, it is the Timeline tab. Measured on this item's re-point: a 1440×900 window gave 1184 px (sidebar expanded) and a 1000×800 window 952 px (sidebar as its icon rail), both columns with no tab strip; only a 700×800 window drew the tabs (Details / Related / Timeline). Then open a seeded task's detail and read the network log again",
51625163
"GET /api/v1/auth/me/permissions and compare apiOperations for showcase_account vs showcase_task"
51635164
],
51645165
"acceptance": [
@@ -5175,10 +5176,10 @@
51755176
"evidence": "the sys_activity read"
51765177
},
51775178
{
5178-
"clause": "the History TAB gates on OBJECT-level enable.trackHistory, both ways: the account detail renders the tab (flag true) and the task detail does NOT (no enable block — per-field flags alone do not summon it)",
5179-
"oracle": "dom",
5180-
"verify": "screenshot both detail pages after settle (the task detail page carries no tablist at all, so corroborate its 'no History tab' with the absent sys_audit_log fetch, QA run #24616); gating ruled at objectui RecordDetailView.tsx (trackHistory must be explicitly true)",
5181-
"evidence": "both screenshots"
5179+
"clause": "the record page's sys_audit_log field-change history gates on OBJECT-level enable.trackHistory, both ways: the account detail (flag true) reads sys_audit_log and its timeline stream's Changes chip lists the tracked edits as old → new lines with display values; the task detail (no enable block — per-field flags alone do not summon it) makes NO sys_audit_log read",
5180+
"oracle": "network",
5181+
"verify": "the network log after settle: one sys_audit_log read for the account record (at page load in a column tier; in the tabbed tier when the Timeline tab opens, or at load under ?tab=timeline) and none for the task; screenshot the account's Changes chip showing the industry edit. Gating ruled at ui/packages/app-shell/src/views/RecordDetailView.tsx (historyEnabled: enable.trackHistory explicitly true, sys_audit_log registered, the viewed object not sys_audit_log itself; and the read serves only the synthesized page's stream, never an assigned page); the read's rows reach the stream through RecordFieldChangesContext as field_change items (ui/packages/plugin-detail/src/recordTimelineStream.ts#auditEntriesToFeedItems). The task half is over-determined (knownGaps): record which gate the verdict rests on. ⛔ An empty Changes chip is never an absence oracle: the chip also lists the stream's sys_activity created/updated rows (ACTIVITY_TYPE_TO_FEED_TYPE maps both to field_change). Measured on a seeded account, the chip showed a sys_activity 'Updated Account …' row beside the audit read. ⛔ Nor is a History tab: record page v3 removed it at every width (#27055; buildDefaultPageSchema.test.ts asserts 'no Activity or History tab'), so looking for one fails a working product (QA run #27438)",
5182+
"evidence": "the two network logs + the account's Changes screenshot"
51825183
},
51835184
{
51845185
"clause": "the derived `history` API operation follows get ∧ enable.trackHistory, both ways: present in showcase_account's effective operation vocabulary, absent from showcase_task's",
@@ -5194,24 +5195,24 @@
51945195
}
51955196
],
51965197
"negative": [
5197-
"an untracked edit producing an old→new diff in the sys_activity summary / Discussion timeline is a FAIL — trackHistory is opt-in per field (spec default false, object.zod.ts family note), and the per-field opt-in governs exactly that surface. ⛔ Not the History tab: it reads sys_audit_log (the compliance audit, objectui RecordDetailView.tsx), which records every field and is not per-field-gated, so 'Website: old → new' there for the untracked field is correct; sys_activity.metadata also carries raw old/new for untracked fields by design — only the rendered summary is gated (QA run #24616)",
5198-
"a task detail rendering a History tab is a FAIL — per-field flags without the object-level opt-in must not summon it",
5199-
"a tracked select rendering raw option VALUES ('in_progress') instead of labels is a FAIL (#7289 closed exactly that)",
5200-
"cross-ref guard: do NOT re-score crud-roundtrip clause 5 (History-tab display quality on the create/update pair) here — this item owns the tracked/untracked boundary and the two gating directions, that one owns the tab's rendering contract"
5198+
"an untracked edit producing an old→new diff in the sys_activity summary is a FAIL — trackHistory is opt-in per field (spec default false, object.zod.ts family note), and the per-field opt-in governs exactly that surface. ⛔ Not the timeline stream's audit-log lines (on a trackHistory object they fill the Changes chip, and the stream's sys_activity `updated` rows step aside for them: ui/packages/plugin-detail/src/recordTimelineStream.ts#mergeTimelineStream): they come from sys_audit_log (the compliance audit, ui/packages/app-shell/src/views/RecordDetailView.tsx), which records every field and is not per-field-gated, so 'Website old → new' there for the untracked field is correct; sys_activity.metadata also carries raw old/new for untracked fields by design — only the rendered summary is gated (QA runs #24616, #27438)",
5199+
"a sys_audit_log read on the task detail is a FAIL — per-field flags without the object-level opt-in must not summon the field-change history; judged on the network log, never on an empty Changes chip or a missing tab (acceptance[2].verify says why)",
5200+
"a tracked select rendering raw option VALUES ('in_progress') instead of labels is a FAIL (#7289 closed exactly that)"
52015201
],
52025202
"traps": [
52035203
"hydration-race",
52045204
"eventual-consistency"
52055205
],
52065206
"automated": {
52075207
"kind": "unit",
5208-
"ref": "packages/plugins/plugin-audit/src/audit-lookup-summary.test.ts (reference titles + read plan); audit-option-label-summary.test.ts (option labels); objectui e2e/live/record-history-display.spec.ts (the History tab's display contract, which negative[3] assigns to records-forms.crud-roundtrip. It opens showcase_account's History tab in a browser, the enable.trackHistory object, so it holds acceptance[2]'s flag-true half; it never reads the task detail, so the absence half has no pin and is driven by hand). packages/qa/dogfood/test/field-history-tracking-activity.dogfood.test.ts, at the REST doors of the showcase with AuditPlugin added as objectstack serve composes it: acceptance[0] and negative[2] (PATCH industry retail → finance lands a sys_activity row whose summary is exactly 'Industry: Retail → Finance', message key fieldChanges), acceptance[1] and negative[0] (a website-only PATCH lands the generic frame naming the Website label with no arrow and neither URL, message key activityUpdatedFields) and acceptance[3] (GET /api/v1/auth/me/permissions: showcase_account's apiOperations carry history, showcase_task's carry get and not history). acceptance[4] stays the unit pin's. acceptance[2]'s absence half and negative[1] (no History tab on the task detail) stay live browser legs: they are judged on the rendered detail page, which no HTTP pin reaches, and the card's ruling adds no Playwright lane (#26573)"
5208+
"ref": "packages/plugins/plugin-audit/src/audit-lookup-summary.test.ts (reference titles + read plan); audit-option-label-summary.test.ts (option labels); ui/e2e/live/record-history-display.spec.ts (the record history's display contract, which the cross-ref in source[4] assigns to records-forms.crud-roundtrip. At 1440×900, a column tier whatever the sidebar does, it opens the timeline stream's Changes chip on showcase_account in a browser, the enable.trackHistory object, so it holds acceptance[2]'s flag-true DOM half; it reads no network log and never opens the task detail, so the read gate both ways is driven by hand). packages/qa/dogfood/test/field-history-tracking-activity.dogfood.test.ts, at the REST doors of the showcase with AuditPlugin added as objectstack serve composes it: acceptance[0] and negative[2] (PATCH industry retail → finance lands a sys_activity row whose summary is exactly 'Industry: Retail → Finance', message key fieldChanges), acceptance[1] and negative[0] (a website-only PATCH lands the generic frame naming the Website label with no arrow and neither URL, message key activityUpdatedFields) and acceptance[3] (GET /api/v1/auth/me/permissions: showcase_account's apiOperations carry history, showcase_task's carry get and not history). acceptance[4] stays the unit pin's. acceptance[2]'s absence half and negative[1] (no sys_audit_log read from the task detail) stay live browser legs: they are judged on the network log of the rendered detail page, which no HTTP pin reaches, and the card's ruling adds no Playwright lane (#26573)"
52095209
},
52105210
"source": [
52115211
"packages/plugins/plugin-audit/src/audit-writers.ts#planTrackedLookupReads (planTrackedLookupReads), (renderTrackedChangeSummary — ADR-0052 §5b, #7230/#7289 localization), (zero-reads-by-default plan)",
52125212
"packages/spec/src/data/object.zod.ts#trackHistory (history derives from get ∧ trackHistory), (opt-in default false); packages/spec/src/data/api-derivation.ts",
5213-
"objectui: packages/app-shell/src/views/RecordDetailView.tsx (History tab three-precondition gate)",
5214-
"examples/app-showcase/src/data/objects/account.object.ts (the deliberate both-halves fixture + its comment ruling the tab gate), examples/app-showcase/src/data/objects/task.object.ts#Task (its status and priority fields declare trackHistory)"
5213+
"ui/packages/app-shell/src/views/RecordDetailView.tsx (historyEnabled, the three-precondition gate on the sys_audit_log read; record page v3 hands its rows to the timeline stream, #27055)",
5214+
"examples/app-showcase/src/data/objects/account.object.ts (the deliberate both-halves fixture), examples/app-showcase/src/data/objects/task.object.ts#Task (its status and priority fields declare trackHistory)",
5215+
"cross-ref records-forms.crud-roundtrip clause 5 (acceptance[4]) — it owns the record history's display contract on the create/update pair (option labels, localized dates, real actor); this item owns the tracked/untracked boundary and the two gating directions, so do not re-score that contract here"
52155216
],
52165217
"history": [
52175218
{
@@ -5267,6 +5268,12 @@
52675268
"date": "2026-10-27",
52685269
"change": "automated.ref says negative[1] and acceptance[2]'s absence half stay live browser legs, and why (#26573 Done-when). No clause changed",
52695270
"ref": "#26573"
5271+
},
5272+
{
5273+
"revision": 10,
5274+
"date": "2026-10-29",
5275+
"change": "acceptance[2], negative[1], steps[3] and the title re-pointed from the History tab to the record page v3 surface, from QA run #27438 (18.3.0 sweep, wave 3). Record page v3 (#27055) removed the History tab at every width, and the gate now lives on the sys_audit_log read: the account's read fills the timeline stream's Changes chip, and the task makes none. acceptance[2]'s oracle moves from dom to network, because the Changes chip also lists sys_activity rows and is no absence oracle. Measured at base 882d4e4a5c on a booted showcase with the console dev server. Account: one audit read at load, no tab strip, at 1440×900 (record view 1184 px) and 1000×800 (952 px, the sidebar as its icon rail). Only 700×800 drew tabs (Details / Related / Timeline, no History), and its read went out when Timeline opened. Task: the authored showcase_task_detail page, no stream, no audit read at any of the three widths. So that half is over-determined (new knownGaps entry). negative[0]'s exemption now names the stream's audit-log lines instead of the History tab. negative[3], a cross-reference that could only score skipped, moved to source[4]. source[2] and automated.ref point at ui/ and at the re-pointed live spec, record-history-display.spec.ts, which now reads the Changes chip at 1440×900 (passed once on that boot)",
5276+
"ref": "#27492"
52705277
}
52715278
]
52725279
},

0 commit comments

Comments
 (0)