Repository navigation
Commit d959b0b
test(app-shell): fold six more RecordDetailView pins over the shared chrome mocks onto the harness (#31057)
<!-- claude-projects-attribution: {"github_login":"os-tesla"} -->
_Requested by **Tesla** · [project
thread](https://claude.ai/code/project/chan_01AXsQkLFKRdQCqQ3RTr6Jao?thread=cmsg_01AXsQkLFKRdQCqQ3RTr6Jao6CPiJykR19ZgQhCLgp8Wkm)_
Fixes #29469
Clause-②: no
Metadata-protocol: none
## 维护者速读
- **改了什么**:再把记录详情页 `RecordDetailView`(`app-shell` 包)的 6 个单卡测试文件并入 #31051
建的共享测试文件 `RecordDetailView.harness.test.tsx`,每个原文件变成一个顶层
`describe`,断言和标题一字未改;复原帮手 `restoreAfterBlock()`
多复原一样东西:地址栏(其中一个原文件把记录地址写进真实 `history` 后不放回)。
- **为什么改**:#29469 最后一族 RecordDetailView 的第二片,也是这张卡的最后一个 PR(席位修订 2:每族最多两个
PR),所以写 Fixes。本地同机实测,这 6 个文件加上 4a 那份共享文件合计约 48 秒 CPU,并入后整个共享文件约 9 秒;没折的
90 个文件全部列在下面的表里,每一行写了不折的原因。
- **风险与回滚**:只动测试文件,不改源码、门禁、CI,不发布任何东西。块之间串状态的风险用探针在原顺序和三种乱序下排除(13
个块,每块开头状态相同)。回滚 = revert 本 PR。
- **先看**:`restoreAfterBlock()` 里新加的两行(`href` 的记录与
`history.replaceState`),再随便挑一块对照原文件;下面「留下的 pin」表是卡的收尾清单。
- **两分钟验证**:在 `ui/` 下跑 `pnpm exec vitest run
packages/app-shell/src/views/RecordDetailView.harness.test.tsx`,应见 1
个文件、49 个测试全过。
- **需要你做的**:无,席位落地。
- **席位意见**:ui 席 2 对照 head `bed3e2b3` 的 diff 复核:7 个文件、+1229 /
−1467,纯测试改动,无受治理路径。RecordDetailView 家族再并入 6 个用例文件(含 4 个 `vi.spyOn`
用例,各自在 afterEach 里 `vi.restoreAllMocks()`,`RelatedCountStore._reset()`
按块执行);it 20 = 20、expect 99 = 99、标题一致,乱序种子下通过;`restoreAfterBlock`
另外复原地址栏(recordTabRowUrl 会把记录地址写进 history)。并入的文件 CPU 约 48 s → 9 s。正文列出其余
90 个未并入用例及原因。CI 全绿,Clause-② no,不欠契约复审。这是本卡最后一个 PR,同意落地。
## What changes
Slice 4b, the second and last `RecordDetailView*` PR of the shared-setup
rollout (ruling 6583487846 on #29469; seat amendment 2, 6672694520: at
most two PRs per family), and the card's last PR. Slice 4a (#31051,
merged as `81deb548`) created
`ui/packages/app-shell/src/views/RecordDetailView.harness.test.tsx` with
7 blocks; this PR adds 6 more from the same cluster, the pins that share
the harness's eight mocks verbatim (`@object-ui/auth`,
`@object-ui/collaboration`, `sonner`, `./ActionConfirmDialog`,
`./ActionParamDialog`, `./ActionResultDialog`, `./FlowRunner`,
`./MetadataInspector`).
- **The six.** The two that passed every census check at 4a's head,
`relatedListTitlePlural-11733` and `feedRefusal-11195`, and the four
smallest of the `vi.spyOn` row, `relatedListsOrder-27241`,
`bodyTablePredicate-27478`, `relatedCountsFirst-27056` and
`recordTabRowUrl-27524`. Each of those four spies on
`HTMLElement.prototype.getBoundingClientRect` in its own `beforeEach`
and undoes it with `vi.restoreAllMocks()` in its own `afterEach`, so the
spy never outlives a test of its block.
- **How they move.** As in 4a: each former file is a top-level
`describe` named after its stem (`RecordDetailView.STEM`), docblock
above it, `restoreAfterBlock()` first, the rest of the file after its
imports and mocks moved verbatim and re-indented two spaces
(template-literal lines keep their bytes). The six files are deleted.
The harness's imports gain `screen`, `act` and `fireEvent` from
`@testing-library/react`, `BrowserRouter` from `react-router-dom`,
`RelatedCountStore` from `@object-ui/components` and `createI18n` from
`@object-ui/i18n`; no two files bound one local name to different
modules. Those 4 import lines and the helper are the only harness lines
from 4a that change.
- **What was dropped:** each file's license header, its import lines and
its eight `vi.mock` calls, and the one-line comments directly above
those mocks. A line-multiset check of the six former files against the
harness finds nothing else missing.
- **`restoreAfterBlock()` also puts back the address bar.**
`recordTabRowUrl-27524` writes the record's path into the real
`window.history` (`replaceState` in its render helper, then the view's
own pushes) and leaves it there; its former file got a fresh window, and
a block after it in the harness would now start at
`/app/demo/showcase_project/p-1`. The helper reads
`window.location.href` in its `beforeAll` and calls
`window.history.replaceState(null, '', href)` in its `afterAll`. The
probe found this under three shuffle seeds, where
`recordTabRowUrl-27524` is not the last block (see Verification).
No other file names any of the six (`git grep` of each stem over the
whole tree finds only the harness), so no comment elsewhere changes.
Test files only: no source file, no changeset (`skip-changeset`).
## Tests
### Former file → describe (no title or assertion dropped)
TypeScript AST walk of each former file at `origin/main` (`81deb548`)
against the `describe` of the same name in the harness at this PR's
head. An `it` is a call to `it` / `test`; an `expect(` is a call to
`expect`; titles are the `describe > it` paths under the block, compared
as sorted lists.
| former file | it before | it after | expect( before | expect( after |
titles identical |
|---|--:|--:|--:|--:|:-:|
| `RecordDetailView.relatedListTitlePlural-11733.test.tsx` | 4 | 4 | 15
| 15 | yes |
| `RecordDetailView.feedRefusal-11195.test.tsx` | 7 | 7 | 25 | 25 | yes
|
| `RecordDetailView.relatedListsOrder-27241.test.tsx` | 2 | 2 | 4 | 4 |
yes |
| `RecordDetailView.bodyTablePredicate-27478.test.tsx` | 2 | 2 | 8 | 8 |
yes |
| `RecordDetailView.relatedCountsFirst-27056.test.tsx` | 2 | 2 | 19 | 19
| yes |
| `RecordDetailView.recordTabRowUrl-27524.test.tsx` | 3 | 3 | 28 | 28 |
yes |
| **total** | 20 | 20 | 99 | 99 | yes |
The whole harness holds 49 `it` and 153 `expect(` calls: 4a's 29 and 54,
which this PR does not change, plus the 20 and 99 above. No statement
outside the blocks holds either.
### CPU before and after (local A/B, one machine)
**CI after: NOT MEASURED**: the per-file timings reporter (#29517)
uploads on `main`'s full-battery runs only. Its first after-reading is
the first full-battery `main` run after this merges.
Local A/B on one 4-vCPU container, under `os-verify-lock` (shared-box
seconds), same command both legs, from `ui/`: `pnpm exec vitest run
packages/app-shell/src/views/RecordDetailView. --maxWorkers=2` (every
`RecordDetailView.*` file), with a throwaway reporter summing each
module's `diagnostic()`. Fixed = environment + prepare + setup + collect
(import). The "before" leg writes the six files and the harness from
`origin/main` (`81deb548`, 4a's harness of 7 blocks) into the branch's
tree, so both legs run the same 90 other files; the tree is reset to
`HEAD` after each before leg and checked clean. Run order: before 1,
after 1, before 2, after 2.
| | files | tests passed | fixed CPU | test CPU | total CPU | wall |
|---|--:|--:|--:|--:|--:|--:|
| RecordDetailView family, before (run 1 / 2) | 97 | 653 | 455.2 / 471.1
s | 95.2 / 98.0 s | 550.4 / 569.1 s | 288.7 / 297.8 s |
| RecordDetailView family, after (run 1 / 2) | 91 | 653 | 435.5 / 431.8
s | 93.2 / 93.3 s | 528.8 / 525.1 s | 275.4 / 273.7 s |
| the six files, before (run 1 / 2) | 6 | 20 | 26.3 / 28.0 s | 4.4 / 4.3
s | 30.7 / 32.2 s | |
| 4a's harness, before (run 1 / 2) | 1 | 29 | 15.0 / 12.7 s | 2.4 / 2.2
s | 17.4 / 14.9 s | |
| the harness, after (run 1 / 2) | 1 | 49 | 4.4 / 4.8 s | 4.7 / 4.7 s |
9.1 / 9.6 s | |
The six files took 31.5 s of CPU on average, and the harness that now
holds them and 4a's seven takes 9.4 s. 4a's harness read 7.1 / 7.6 s in
4a's A/B and 17.4 / 14.9 s in this one's before legs: its import time
depends on which worker picks it up, so the honest per-file comparison
is the six files plus 4a's harness, 48.1 / 47.1 s, against this harness,
9.1 / 9.6 s (−80 %). The family read 559.8 s before and 527.0 s after on
average (−5.9 %), wall 293.3 s to 274.6 s; the two before runs differ by
18.7 s, so this is a reading of two runs per leg on a shared box, not a
measured saving.
## Acceptance notes
- **Why the fold stops here.** Amendment 2 allows two PRs per family and
this is the second; each stays under 3,000 changed lines, and this one
is at 2,696. The smallest remaining pin of the same cluster,
`phoneOwnerLine-28909` (204 lines), would add about 410 changed lines
and take it past 3,000. So the family ends with 13 of its 103 pins in
the harness, and with it the card's fourth and last family.
- **Every pin left unfolded** is in the table below: 90 files, 29,399
lines, grouped by shared setup, each row with the reason it stays a file
of its own. Same rules as 4a's census: a file in the eight-mock cluster
sits under the most restrictive check it fails.
- **One harness, one package.** All `RecordDetailView` pins are in
`ui/packages/app-shell/src/views/`.
- `headerRefresh` is named by path in
`ui/scripts/__tests__/check-vi-mock-override-shape.test.ts`, so it stays
a file of its own. Names of pins in source-file comments stay as they
are (claim 6694271643: source files are ⛔).
- The moved docblocks keep their issue numbers in prose, as 4a's blocks
do; no new citation line is added outside moved text (`pnpm
check:new-line-citations`: 0 new).
- `ui/scripts/test-shard-timings.json` is keyed by a hash of each file's
path, so the six deleted files leave six stale keys until the timings
refresh, as 4a's did.
### RecordDetailView pins left unfolded: 90 files, 29,399 lines, by
shared setup
Names drop the `RecordDetailView.` prefix and `.test.tsx`. "Named by"
lists the other files whose text names the pin.
| shared setup | files (lines) | lines | why it stays a file of its own
|
|---|---|--:|---|
| the eight harness mocks, but another file names it, so a fold also
edits that file (a test file; a name in a source-file comment stays as
it is) | `feedRecordScope` (461; named by
`defaults-maps-mirror-en-pack.test.tsx`), `relatedBadgeArity-8882` (453;
named by `related-count-store.ts`), `discussionFallbackPipeline-8983`
(439; named by `record-chatter.tsx`), `relatedListFilter-4664` (420;
named by `deriveRelatedLists.relatedListFilter-4664.test.ts`,
`RecordDetailView.childWriteRefreshesParent-12244.test.tsx`,
`RecordDetailView.relatedBadgeArity-8882.test.tsx`,
`related-count-store.declaredScope-4664.test.ts`,
`related-count-store.ts`,
`buildDefaultPageSchema.relatedListFilter-4664.test.ts`), `feedLoading`
(394; named by
`RecordDetailView.discussionFallbackPipeline-8983.test.tsx`,
`RecordDetailView.harness.test.tsx`,
`RecordDetailView.headerRefresh.test.tsx`),
`authoredChildWriteRefreshesParent-26890` (351; named by
`RecordDetailView.unregisteredObjectLists-26988.test.tsx`,
`recordPageChildObjects.test.ts`), `discussionExplicitComposition-7298`
(327; named by
`RecordDetailView.discussionFallbackPipeline-8983.test.tsx`),
`sectionHeadingsRenderPath-6190` (320; named by `CHANGELOG.md`,
`CHANGELOG.md`, `DetailView.expandFls-7230.test.tsx`),
`managedByBadgeAuthoring-12194` (213; named by
`ObjectView.managedByBadgeAuthoring-12194.test.tsx`,
`RecordFormPage.managedByBadgeAuthoring-12194.test.tsx`),
`printAction-11958` (162; named by `RecordDetailView.harness.test.tsx`,
`RecordDetailView.printPageHeaderActions-12906.test.tsx`) | 3540 | Same
setup, so it could join the harness, but the fold also edits each file
that names it. The family's two PRs are spent and this one is at 2,696
of its 3,000 lines. |
| the eight harness mocks, plus `vi.spyOn` (each restored in its
`afterEach`) | `recordPageTiers-26678` (431), `phoneFace-27058` (425),
`panelToggles-27052` (381), `activityMapIdentity-5878` (346),
`topBar-27524` (312), `relatedListInheritedSort-5795` (296),
`phoneOwnerLine-28909` (204) | 2395 | Same setup, and the pattern is
proven by the four `vi.spyOn` blocks this PR folds. The family's two PRs
are spent; the smallest of these (`phoneOwnerLine-28909`) would take
this PR past 3,000 lines. |
| the eight harness mocks, plus a side-effect import of its own |
`userActionPredicates` (513), `headerActionLookupPredicate` (352),
`builtinActionSessionUserPredicate` (346), `reactionWriteFailure-10899`
(346), `authoredActivityThreading-12249` (335), `replyCountOnRead-12144`
(302), `commentWriteFailure-10899` (259), `accessibleNames-12625` (199)
| 2652 | Its side-effect import would run for every block of the
harness, not just its own, so each needs a check that the import changes
nothing the other blocks read. Not done inside the two-PR budget. |
| the eight harness mocks, but its body registers tests from a loop or
`describe.each` at collection time | `hiddenAffordanceVerdicts-13045`
(250), `oneProvenanceFooter-12307` (208), `appendInset-27520` (183) |
641 | Registers tests at collection time, so it cannot be counted or
moved verbatim the way the other blocks are without checking each
generated title. Not done inside the two-PR budget. |
| the eight harness mocks, plus a `vi.hoisted` / `globalThis` slot or a
global installer of its own | `unregisteredObjectLists-26988` (312),
`namedRecordPage-12715` (293) | 605 | Its hoisted slot or global
installer lives at module scope, where every block of the harness would
share it. Needs its own isolation work, not done inside the two-PR
budget. |
| the eight harness mocks, but named by path in a file outside the tests
(a ledger or a script test): stays a file of its own | `headerRefresh`
(251; named by `check-vi-mock-override-shape.test.ts`) | 251 | A file
outside the tests names its path, so it stays a file of its own (claim
6694271643). |
| the same eight modules, but its `@object-ui/auth` factory answers a
different user or organization | `reactionRecords-12078` (567),
`childWriteRefreshesParent-12244` (433), `feedGrant-12082` (428),
`withheldMentions-28218` (310), `printPageHeaderActions-12906` (287),
`reactionKeepIds-11019` (271), `reactionsCommentRowsOnly-11035` (265),
`activityActorId-12067` (176) | 2737 | A `vi.mock` factory applies to
the whole file, and its `@object-ui/auth` answers a different user or
organization from the harness's `Ada`. It needs a harness of its own. |
| mocks `../hooks/useActionModal` + `../utils/consoleServerAction` +
`./ActionConfirmDialog` + `./ActionParamDialog` + `./ActionResultDialog`
+ `./FlowRunner` + `./MetadataInspector` + `@object-ui/auth` +
`@object-ui/collaboration` + `@object-ui/react` + `sonner`, not the
harness set | `paramRuntimeParity-6431` (610), `approvalDeclaredActions`
(543), `confirmRuntimeParity-5835` (458), `headerRecordIdLoadWindow`
(404), `approvalRecallGate` (355), `approvalLock-25934` (348),
`recordIdParamSeed` (339), `accessEndedAfterDecision-26589` (330),
`undoLookupId-11122` (309), `paramDialogTitle` (302),
`headerApiInterpolation` (296), `undoCapture-11082` (291),
`apiActionDoor-27611` (280), `modalDispatch` (278), `approvalLock-12220`
(273), `paramCancelText-28879` (263), `paramSubmitText-28158` (263),
`undoneToast-11056` (231), `banCompanion-30205` (227), `ctxOrg-10918`
(222), `apiFlowRefusal-27487` (212) | 6834 | It mocks a different set of
modules, and `vi.mock` applies to the whole file, so it cannot join a
harness whose mocks it does not share. A harness for its set would be
new work. |
| mocks `@object-ui/auth` + `@object-ui/collaboration` + `sonner`, not
the harness set | `recordOpenWaves-13010` (811), `feedLoadFailure-29188`
(462), `recordPagePayload-27627` (389), `timelineCount-28737` (368),
`recordOpenRequests-12701` (350), `afterActionExplain-13341` (315),
`recordReadFailure-11902` (303), `recordOpenOneRequest-28470` (290),
`approvalRequestPage-28546` (180), `phoneGuardBar-28483` (161) | 3629 |
It mocks a different set of modules, and `vi.mock` applies to the whole
file, so it cannot join a harness whose mocks it does not share. A
harness for its set would be new work. |
| mocks `./ActionParamDialog` + `./ActionResultDialog` + `./FlowRunner`
+ `./MetadataInspector` + `@object-ui/auth` + `@object-ui/collaboration`
+ `sonner`, not the harness set | `feedCommentEditDelete-12268` (518),
`updateActionRefresh-29935` (329), `deleteConfirmDialog-11001` (310),
`favoritesEntry-12427` (293), `paneOpenAsPage-27545` (292),
`placedHeaderActions-29951` (262), `apiNewTabUrl-26747` (257),
`headerMenuIcons-12529` (239), `deleteCascade-28472` (188) | 2688 | It
mocks a different set of modules, and `vi.mock` applies to the whole
file, so it cannot join a harness whose mocks it does not share. A
harness for its set would be new work. |
| mocks `./MetadataInspector` + `@object-ui/auth` +
`@object-ui/collaboration` + `@object-ui/react` + `sonner`, not the
harness set | `flowActionDoor-12037` (277),
`flowDoneSuccessMessage-12274` (240), `refusedLaunch-9973` (236),
`flowActionSuccessMessage-12234` (219) | 972 | It mocks a different set
of modules, and `vi.mock` applies to the whole file, so it cannot join a
harness whose mocks it does not share. A harness for its set would be
new work. |
| mocks `./ActionConfirmDialog` + `./ActionParamDialog` +
`./ActionResultDialog` + `./FlowRunner` + `./MetadataInspector` +
`@object-ui/auth` + `@object-ui/collaboration` + `@object-ui/fields` +
`sonner`, not the harness set | `lookupDependsOn-7190` (619) | 619 | It
mocks a different set of modules, and `vi.mock` applies to the whole
file, so it cannot join a harness whose mocks it does not share. A
harness for its set would be new work. |
| mocks `@object-ui/auth` + `@object-ui/collaboration` +
`@object-ui/permissions` + `react` + `sonner`, not the harness set |
`recordOpenRequests-11699` (505) | 505 | It mocks a different set of
modules, and `vi.mock` applies to the whole file, so it cannot join a
harness whose mocks it does not share. A harness for its set would be
new work. |
| mocks `../context/NavigationContext` + `../hooks/useActionModal` +
`../utils/consoleServerAction` + `./ActionConfirmDialog` +
`./ActionParamDialog` + `./ActionResultDialog` + `./FlowRunner` +
`./MetadataInspector` + `@object-ui/auth` + `@object-ui/collaboration` +
`@object-ui/react` + `react-router-dom` + `sonner`, not the harness set
| `onSuccessNavigateHost-13396` (399) | 399 | It mocks a different set
of modules, and `vi.mock` applies to the whole file, so it cannot join a
harness whose mocks it does not share. A harness for its set would be
new work. |
| mocks `./ActionConfirmDialog` + `./ActionParamDialog` +
`./ActionResultDialog` + `./FlowRunner` + `./MetadataInspector` +
`@object-ui/auth` + `@object-ui/collaboration` +
`@object-ui/plugin-detail` + `sonner`, not the harness set |
`activityUnmappedType-5896` (380) | 380 | It mocks a different set of
modules, and `vi.mock` applies to the whole file, so it cannot join a
harness whose mocks it does not share. A harness for its set would be
new work. |
| mocks `./ActionConfirmDialog` + `./ActionParamDialog` +
`./ActionResultDialog` + `./FlowRunner` + `./MetadataInspector` +
`@object-ui/auth` + `@object-ui/collaboration` +
`@object-ui/permissions` + `sonner`, not the harness set |
`expandFls-7230` (281) | 281 | It mocks a different set of modules, and
`vi.mock` applies to the whole file, so it cannot join a harness whose
mocks it does not share. A harness for its set would be new work. |
| no `vi.mock` | `headerActionGates` (182), `actionUser` (89) | 271 | It
renders over the real modules, and the harness's eight mocks would
replace them. It stays as it is. |
| **total** | 90 files | 29399 | |
## Verification
At head `bed3e2b3`, on `origin/main` `81deb548` (4a's merge), every run
under `os-verify-lock`:
- Harness: 1 file, 49 / 49 passed in declaration order and under
`--sequence.shuffle.tests` with `--sequence.seed` 11, 222 and 3333 (each
VERDICT command-exit 0). The seed runs and the probe read the tree one
commit earlier, before a comment-only rewrap of the helper's docblock;
both A/B after legs ran this head's harness, 49 / 49 passed.
- Probe: a throwaway copy of the harness whose `restoreAfterBlock()`
writes the state at each block's first test (the same fields as 4a's
probe: registry entries, `localStorage` descriptor and both storages,
`lang` / `dir`, `innerWidth` / `innerHeight`, react-i18next's
`getI18n()`, `document.title`, `body`, added window keys, the `fetch`
stub, `toast` call counts, `location.href`). With this head's helper,
all 13 blocks start from the same state in all four orders. With 4a's
helper, the three shuffled orders show `location.href` at
`/app/demo/showcase_project/p-1` for every block after
`recordTabRowUrl-27524`, which is why the helper now puts the address
back. With the helper's `afterAll` body removed, `lang` / `dir`,
`innerWidth` and `localStorage` also leak, as in 4a. The probe copies
were deleted.
- `pnpm run type-check` in `ui/packages/app-shell` (`tsc --noEmit && tsc
-p tsconfig.test.json`): VERDICT command-exit 0, 0 `error TS`.
- `eslint` on the harness from `ui/packages/app-shell`: 0 errors, 24
warnings (all `no-explicit-any`), the same as 4a's harness (12) plus the
six former files at `origin/main` (12).
- Derived gates (`node scripts/pm/dispatch-gates.mjs --commands`, change
set 7 paths against merge base `81deb548`): 26 derived, 26 run with
stdin from `/dev/null`, each exit 0 captured before any pipe, among them
`pnpm --dir ui exec vitest run scripts/`, `node
scripts/check-sdui-manifest.mjs` and its `--self-test`, and `pnpm
check:test-source-alias`. `--ran` reconciliation: 26 derived, 26 run, 0
NOT-MEASURED, 0 UNRUN, every family with a recorded exit code. `pnpm
check:new-line-citations` from `ui/`: 0 new citations.
- The RecordDetailView family (91 files after, 97 before): 653 tests
passed in every A/B leg, 0 failed. The rest of `@object-ui/app-shell`'s
suite was not run locally; no file outside the family changed, and CI's
Test UI runs it.
- Size: `git diff --shortstat origin/main HEAD` is 7 files, +1,229 /
−1,467, 2,696 changed lines.
- `main` has moved 2 commits past `81deb548`; neither touches
`ui/packages/app-shell/src/views/`, `ui/vitest.config.mts` or the
`ui/vitest.setup.*` files, so the branch is not re-merged and the
readings above stand for this head.
- Open pull requests: none of the open PRs that touch `ui/` or a package
(#31053, #31052, #31013, #31009, #31006, #31000, #31037, #31046, #31047)
changes a `RecordDetailView` file (read from each PR head's diff against
its merge base before the push; #31052 and #31047 have merged since,
neither touching `ui/packages/app-shell/src/views/`).
- No ablation of a product behaviour: none changed, and the assertions
moved verbatim.
## Human Minimum
- [x] 1. Schemas start as Zod; `packages/spec` holds no runtime logic.
(`packages/spec` not touched.)
- [x] 2. Every name I added uses the casing for its kind.
- [x] 3. No formatter ran; `pnpm lint` passes. (`ui/` is linted by its
own config; the lint readings are above.)
- [x] 4. One issue, one branch off an up-to-date `main`, one pull
request.
- [x] 5. A change that publishes carries a changeset, and both
declaration lines are filled in here and in the changeset. (Nothing
publishes: `skip-changeset`.)
- [x] 6. `packages/spec` touched: its generated artifacts are
regenerated and committed. (Not touched.)
- [x] 7. No hand edits to `content/docs/references/`,
`packages/*/CHANGELOG.md` or `content/docs/releases/`.
- [x] 8. Title, body and comments are in English (the maintainer
quick-read is the allowed Chinese section).
<!-- signed: domain:ui#2 · os-tesla · session_01L9qibw7DekEe3wx5f3zphf
-->
Co-authored-by: Claude <noreply@anthropic.com>1 parent f120661 commit d959b0b
7 files changed
Lines changed: 1229 additions & 1467 deletions
This file was deleted.
0 commit comments