Repository navigation
refactor(spec-liveness): the renderer's ledger evidence is in-repo under ui/; objectui becomes a retired realm that fails - #26150
Merged
Conversation
…aintainer's ruling The maintainer kept objectui's `.github/workflows/**` row on objectstack#25712 (option b): it stays in the register and is read through the root register. The comment above the moved-row case said the call was pending; it now records the ruling, and leaves the register's own retirement to sub-issue 4. Comment only. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A6SEitNngAMugGbuJHWsDS
…der ui/; objectui becomes a retired realm that fails objectui merged into this repo as ui/ (#25677), so the liveness ledger's renderer evidence stops being cross-repo (objectstack#25712 item 1). Reader (scripts/liveness/evidence.mts): - `ui` joins REPO_ROOTS, so `ui/packages/...` pointers resolve like any path: the file exists, a cited line is inside it, an anchored symbol is in it, and the file names the key. - `objectui` leaves FOREIGN_REALMS and becomes RETIRED_REALMS (objectui -> ui). A path still attributed to it lands in a bucket of its own that the gate fails on, whatever the row's status, printing the ui/ spelling as the remedy. Counted as foreign, it would never fail. Read as local, it could resolve against the wrong root, because both trees have packages/core/. A path already spelled ui/ is local whatever prose precedes it. Ledger (24 files): 374 objectui-attributed pointers in 164 rows are re-rooted under ui/, and the `objectui [@sha]:` marker in front of each one is dropped. verifiedAt is unchanged everywhere. 107 cross-repo rows become in-repo. The one row that also cites cloud stays cross-repo, and the 56 undeclared scopes stay undeclared. Line citations: of the 133 objectui `path:N` pointers, 6 named the same lines in ui/, 66 named code that moved, 58 could not be checked against today's file, and 3 were in deleted files. A clause is relocated only when every line it cites (the pointer plus its bare `:N` follow-ons) is byte-identical at exactly one offset, both at the cited objectui commit and in today's file, so one clause never mixes old and new numbering. That gives 7 kept, 58 relocated, and 65 that drop the line from the pointer and keep the reading as prose (`ui/p (:N at objectui @sha)`). Line numbers written as prose inside a relocated clause (sibling `file.tsx:N` refs and "line N" in eight rows) were relocated by the same rule. Rows whose objectui reader is gone get no repoint and a dated note line: - app.navigation.id: the useNavOrder clause (objectui#12059). - view.list.hiddenFields and view.form.groups: the spec-bridge clauses (objectui#6632). - field.widget: the permission-facet-link registration (objectui#12998). - field.externalId: the only pointer was deleted in objectui dc14bcb, so it is now prose, and follow-up F23 owns finding the reader. Key mention: 13 newly in-repo citations read a renamed key or delegate to an anchored sibling: list.inlineEdit -> `editable`, form.subforms -> `details`, page print members -> `print`, chartConfig -> `chartConfigPresentation`, and flows.screens -> the localized field keys. Each is a key-mention.baseline.json row that names the spelling the file uses. Tests: evidence and gate cases are retargeted from objectui to cloud/ee, with new cases for the retired realm. The `path:NNN` contract test and the line-citation floor are restored, as their own guard comments instruct once that population is non-zero again. The README sections on the realm marker, the commit pin, evidenceScope and the preview lookup now cite ui/. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A6SEitNngAMugGbuJHWsDS
Contributor
📓 Docs Drift Check
What this run could not see
Coarse fallback — 145 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
This was referenced Oct 26, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Requested by Tesla · project thread
Part of #25712 (4b PR 2e: the liveness ledger, card item 1; Tier S).
Part of objectstack#25677.
Clause-②: no
Metadata-protocol: none
维护者速读(草稿)
ui/<路径>,去掉 objectui 标记和钉的提交。verifiedAt一律不动。evidenceScope由cross-repo改为in-repo。同时引用 cloud 的那 1 行保持cross-repo,原本没声明 scope 的 56 行仍不声明。ui当作本仓根目录,ui/路径和其他路径一样必须存在、行号在文件内、锚点符号存在、文件里出现该键名。objectui改为「已退役的 realm」:仍标成 objectui 的路径单独列出并判红,同时打印对应的ui/写法。ui/workspace:D1 裁定(A+)的执行父单 — 一个 PR 同时改 spec 与渲染器,删除两仓互钉,@object-ui 保留包名并与 @objectstack 同一版本组,objectui 仓归档为迁移说明 #25677),这些证据不再是跨仓的。路径:行号是在旧提交上读的。对照今天的ui/:6 个行号未变,66 个代码挪了位置,58 个无法核对,3 个所在文件已删除。规则如下:(:N at objectui @sha)。field.externalId唯一的读者已被删除,记为后续 F23。ui/文件读的是改名后的键(如inlineEdit→editable)或委托给已锚定的兄弟文件,每条都写明文件实际用的名字。席位核对
(left for the dispatch seat)
Why
objectui merged into this repo as
ui/(#25677). The liveness ledger still cited the renderer as another repository:objectui @<sha>: packages/…pointers, counted foreign, never resolved. Card #25712 item 1 asks for:ui/<path>#<symbol>);in-repo;PM ruling A (#25712 comment 6415397254) sets done-when to 0 objectui-attributed pointers, enforced by the reader. Note history stays. Unresolved rows go to the worklist, and no path is guessed.
What changes
Reader:
scripts/liveness/evidence.mts,check-liveness.mtsuijoinsREPO_ROOTS. Aui/…pointer is local, so it gets the existence, line-bound, symbol-anchor and key-mention checks.objectuileavesFOREIGN_REALMS(nowcloud,ee) and becomes the one entry ofRETIRED_REALMS(objectui → ui).scanEvidencereturns a third bucket,retired.evidenceorproducer.ui/spelling:query/limit → objectui: packages/core/src/index.ts (now ui/packages/core/src/index.ts).objectui: packages/core/…could pass against this repo's ownpackages/core/, a file that never was the reader.ui/…is local whatever prose precedes it, so a dated reading can still name the old repo.empty-state.mtsand thekey-mention.mtsremedy text saycloud:where they saidobjectui:.Ledger: 24 files
evidenceorproducerui/objectui [@sha]:markers in front of a pointer, droppedobjectuiwords left as prose (no path directly after)evidenceScopecross-repo→in-repocross-repo(also citescloud)verifiedAtchangedUntouched:
notehistory, including the "read at objectui @sha" readings and_notefields;evidencestrings that name objectui in prose with no repo-rooted path (objectui action renderers + runtime dispatcher);cloudrow.Line citations: the 133-citation breakdown
Each objectui
path:Nwas read at a pinned objectui commit. A clone of objectui (unshallowed) was compared with today'sui/at this PR's base:940ba24, 33 lines), or the cited lines changedRule applied (PM-accepted):
:Nfollow-ons (…ListView.tsx:763 seeds … and :1491-1494 filters …), or none of them moves.ui/p (:N at objectui @sha):Nrefs: 18 relocated with their clause, and 32 stay at the dated reading.action-icon.tsx:Nrefs inaction.bodyShapeandbodyExtra;:N/:Npairs inaction.methodandview.form.subforms;email_template.label/descriptionandwebhook.label/description.ListView.tsxby 9 lines;view.list.hiddenFieldsnow cites:2020,:3812-3815and:3830;NavigationRenderer.tsxby 28 lines;app.navigation.runAction's producer now cites:850,:870-875,:963and:968.Rows whose objectui reader is gone
Each row below gets no repoint and a dated note line saying what left and when:
app.navigation.idUnifiedSidebar.tsx#useNavOrderview.list.hiddenFieldslist-view.ts:123view.form.groupsform-view.ts:169view.zod.tsand the ObjectForm reading stayfield.widgetplugin-detail/src/index.tsx:563(permission-facet-linkregistration)field.externalIdmetadataConverters.ts:125Key mention: 13 exemptions
Once in-repo, these citations met the key-mention check for the first time. Each cited file reads a renamed key, or names the parent key and delegates to the entry's other, anchored citation. Each row in
key-mention.baseline.jsonnames the spelling the file actually uses:page/print.{paperSize, orientation, margins.right, margins.bottom, pageNumbers, repeatTableHeaders, avoidBreakInside}(7)layout/page.tsxprint(isPagePrintDeclaration(schema.print))dashboard/widgets.chartConfig.{showDataLabels, annotations, interaction}(3)plugin-dashboard/src/DatasetWidget.tsxchartConfigPresentationview/list.inlineEditplugin-grid/src/ObjectGrid.tsxeditableview/form.subformsplugin-form/src/MasterDetailForm.tsxdetailstranslation/flows.screensapp-shell/src/views/ScreenView.tsxlabel/placeholder/inlineHelpTextThe baseline stays shrink-only. A row fails once its pair anchors.
Tests and README
evidence.test.ts: the realm cases move fromobjectuitocloud/ee, and a new block pins the retired realm. Itsui/paths are synthetic (ui/packages/layout/src/x.tsx): the scanner never opens them, and a real path there would be an undeclared cross-package input tocheck:cross-package-test-inputs.check-liveness.test.ts:objectuitocloud/ee;evidence, inproducer, and on adeadrow;(cloud / ee — not resolvable here).path:NNNcontract test and the line-citation floor come back. [finding]field.conditionalRequiredis ledgeredliveciting a.transformthat protocol 17 removed — and the rule-validator fallback its note relies on is gone too #13043 retired both when that population reached zero, with the instruction to restore them when a citation was written again.README.mdupdates the realm-marker section, the commit-pin advice,evidenceScope, the preview lookup (git grep -- ui/instead ofgit -C ../objectui) and "confirmed absence".The first commit is the governed-queue-guard comment fix held from #26058, accepted by the PM to ride here.
Follow-ups (sub-issue 4)
F23 (new). Find the current reader of
field.externalId, or re-classify it. Its only cited reader was a dead module.F24 (new, optional). The 65 relocated
ui/line citations are now in-repopath:Npointers, and they rot in range the way [finding] A liveness citation can rot IN RANGE:action.targetandaction.requiredPermissionspoint at the wrong lines one day after being repointed, and every check stays green #12516 describes: the two base moves above shifted seven of them in two hours. Converting them to#symbolanchors is the durable form.F25 (new, noted).
docs/qa/platform-checklist/areas/*.jsonstill writeobjectui: packages/…refs. That surface is not the ledger and is outside this card item.F26 (new, reported to the dispatch seat). After this PR, the gate and
evidence.test.tsread 113ui/files through the ledger. Aui/-only PR schedules neither:paths:do not listui/**, and it is not a required context;@objectstack/spec#test:repodoes not hashui/**, so in the merge queue it is a cache hit.So a
ui/PR that renames a cited file or symbol lands green, and the next spec PR goes red (mainis red for every PR that touchespackages/spec: #7769 gavesys_api_keyupdatewithoutbulk, and the conformance scan that catches it lives in a package #7769 never touched #7802's shape).packages/**citations do not have this gap, because spec declares those roots. Closing it means declaring theui/sources inscripts/cross-package-test-inputs.mjsandturbo.json, and covering them in rootci.ymlcrosspkg, whichcheck:ci-filter-parityrequires. That is Tier H, and everyui/PR would then start Test Core for spec. Left to the dispatch seat; not widened here.Verification
Head
23cb18d2b9, onmain1bbb7bf490. 33 files, +703 / −385. Tier S: no governed path, under 3000 lines.pnpm --filter @objectstack/spec check:liveness, exit 0:evidence paths: 1036 repo-local paths declared, 1036 resolved; 41 attributed to another repo (cloud / ee).line citations: 65 writtenpath:NNN, 65 inside the cited file.symbol anchors: 1220 writtenpath#symbol, 1220 named.key-mention anchoring: 1036 pairs, 1022 anchored, 14 exempt.vitest run scripts/liveness/: 12 files, 358 tests passed.Gate sweep:
node scripts/pm/dispatch-gates.mjs --commandsderives 68 gates for this diff. All 68 ran on23cb18d2b9and exited 0.--ranreconciles 68 derived, 68 run, 0 NOT-MEASURED, 0 UNRUN.check:cross-package-test-inputsred on four realui/paths inevidence.test.ts. Those unit cases now use synthetic paths (see Tests).Push battery (
GITHUB_ACTIONS=true GITHUB_EVENT_NAME=push node scripts/pm/check-dispatch-gates.mjs) on23cb18d2b9: 2182 cases pass, 0 fail (fast 1917, slow 265; 1800 s).🤖 Generated with Claude Code
https://claude.ai/code/session_01A6SEitNngAMugGbuJHWsDS