Repository navigation
chore(ui-merge): clear the objectui leftovers after the ui/ merge (#25753) - #26598
Conversation
… field.externalId, re-root spec renderer citations
- ui/scripts/check-cross-repo-closer-outcome.mjs: deleted. Its subject, objectui's
cross-repo-issue-closer workflow, left with ui/.github/workflows and nothing runs
it; check-closing-keyword-parity drops its NON_PARSERS row.
- ui/scripts/__tests__/workflow-checks.ts: deleted. Its workflow parser had no
caller; the two tests that imported repoRoot compute it themselves.
- ui/scripts/markdown-test-inputs.mjs: --changed retired with objectui's decision
step, its only caller. The ledger stays as an audit.
- packages/spec/liveness/field.json: field.externalId re-graded live -> dead; no
reader in packages/** or ui/**.
- packages/spec/src/ui/{page,component}.zod.ts: renderer citations spelled
ui/packages/... instead of the objectui: realm marker.
Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L9qibvE77Ed7MKdzPxJTQQ
…g repo objectui lives in this repository's ui/ and its repo is archived. The pm-dispatch references, the os-dev agent, the checklist-test and dogfood-verification skills drop the sibling-repo rules (objectui's labeler, release PR title, required checks, pin chain, skip-changeset reading) and describe ui/ where a rule still applies. The settings allow-list drops its five objectui write rows. Ratchet ceilings fall to the landed counts. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L9qibvE77Ed7MKdzPxJTQQ
The splice ran once, at the ui/ cutover. The pnpm-workspace.yaml comment that cited its step 6 now names the commit where the recipe can still be read. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L9qibvE77Ed7MKdzPxJTQQ
…d re-grade Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L9qibvE77Ed7MKdzPxJTQQ
📓 Docs Drift CheckThis PR changes 1 package(s): 12 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:
⛔ 6 release-owned page(s) also name something this change touched. These are read-only:
What this run could not see
Coarse fallback — 147 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 37a79d7e165b86fba7d9eac4324872eb9f6fd0b6 && git checkout 37a79d7e165b86fba7d9eac4324872eb9f6fd0b6
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin f7c95cd191fc0bc8464eeb7cb53d9121704eb727 fab4534b1d23fb5a8713b4d1de75722ea2bc6642 && git checkout -B drift-repro f7c95cd191fc0bc8464eeb7cb53d9121704eb727 && git merge --no-ff fab4534b1d23fb5a8713b4d1de75722ea2bc6642
node scripts/docs-audit/affected-docs.mjs --json f7c95cd191fc0bc8464eeb7cb53d9121704eb727
|
Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L9qibvE77Ed7MKdzPxJTQQ
The flag is graded dead: no upsert, import or seed reads it. The schema description, the generated reference pages and three hand-written field tables now say so and name the two keys that do match records. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L9qibvE77Ed7MKdzPxJTQQ
Conflicts in three skill files main also edited (#26536, #26569): kept main's root-run console:build wording and its ninth required context (Test UI), kept this branch's removal of the objectui-only lines and the retired SHA-stamp drift bullet (no .objectui-sha pin or build-console.sh exists any more). Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L9qibvE77Ed7MKdzPxJTQQ
|
I re-derived the shard's item list locally with I'm re-running the failed jobs once. If it is red again, I'll treat it as real and dig in. Generated by Claude Code |
Contract reviewServed-tier: Inputs read: card #25753 body and all 5 comments; #25712 closing record 6432294556; PR #26598 body, 42-file list, net diff ① Derived judgmentsEach accept-set or public-surface change the diff implies, judged on the head's code.
② Semver level
③ Boundary flagsDev flags in the PR body's "Not in this PR":
No Must-fix (decide the verdict):
Should-fix (do not decide the verdict):
④ 设计判断Per hits file, does the change hold against the cited code and the card's acceptance scenario (card #25753 item 3 "retire one-time import scripts"; item 4 "pm-dispatch references that still say two repos updated"; #25712 residuals F18, F19, F20, F23, F27, 2h list)?
Implemented-by: VERDICT: FAIL Generated by Claude Code |
#26599 retired the conditionalRequired row, so the shipped field ledger's warned set is externalId alone; the lint pin and the regenerated field count shard say so. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L9qibvE77Ed7MKdzPxJTQQ
Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L9qibvE77Ed7MKdzPxJTQQ
…ines left behind The release-board section still counted three boards and kept a console pin precondition that no longer has a pin; the director lane kept the pin chain in its heading and summaries; triage still alternated two repos. The externalId ledger row now names every ui/ carrier and the preview search. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L9qibvE77Ed7MKdzPxJTQQ
Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L9qibvE77Ed7MKdzPxJTQQ
Contract reviewServed-tier: Inputs read: card #25753 body and all 5 comments (6410938536, 6416455214, 6432304442, 6437605220, 6439149364); #25712 closing record 6432294556; PR #26598 body, 42-file list, API state ( Earlier FAIL itemsMust-fix 1 (head did not merge with main; pin and counts disagreed with the merged truth): FIXED.
Must-fix 2 (governed rule text left self-contradictory): FIXED in all three files.
Should-fix items from the earlier record (do not decide the verdict):
① Derived judgmentsEach accept-set or public-surface change the net diff implies, judged on the head's code.
② Semver level
③ Boundary flagsDev flags in the PR body's "Not in this PR":
No Must-fix: none. Should-fix (do not decide the verdict):
④ 设计判断Per hits file, does the change hold against the cited code and the card's acceptance scenario (card #25753 item 3 "one-time import scripts retired"; item 4 "pm-dispatch references that still say two repos updated"; #25712 residuals F18, F19, F20, F23, F27 and the 2h list)?
Implemented-by: VERDICT: PASS Generated by Claude Code |
# Conflicts: # .claude/skills/pm-dispatch/references/lanes/director.md
…n merge Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L9qibvE77Ed7MKdzPxJTQQ
|
Contract-review note · triage seat · ⛔ Not a claim, not a review. The triage contract review PASS (6443120447) names head Generated by Claude Code |
|
Contract-review-handoff: triage — CONTRACT_REVIEW_TIER unavailable (this seat's Fable usage limit refused its earlier review call on this PR; maintainer ruling 「契约复审都要等分诊」, 2026-10-27; handed off 2026-10-27T15:00Z) · head 6f64f2a Delta since the PASS on
Local runs on the head, all exit 0: the skill line ratchet and its self-test (164 cases), Generated by Claude Code |
Contract reviewServed-tier: Inputs read: card #25753 body and all 5 comments (6410938536, 6416455214, 6432304442, 6437605220, 6439149364; nothing new since the last record); PR #26598 body (one paragraph added since Delta since c260fddTwo commits: Method: the PR-side net diff at the PASS head (
What main's side of Current merge state against ① Derived judgmentsEach accept-set or public-surface change the net diff (
② Semver level
③ Boundary flagsDev flags in the PR body's "Not in this PR" (unchanged): F12 No The PR is no longer a draft ( Must-fix:
Should-fix (do not decide the verdict):
④ 设计判断Per hits file, does the change hold against the cited code and the card's acceptance scenario (card #25753 item 3 "one-time import scripts retired"; item 4 "pm-dispatch references that still say two repos updated"; #25712 residuals F18, F19, F20, F23, F27)? Unchanged files restate the PASS record's finding re-read at this head.
Implemented-by: VERDICT: FAIL Generated by Claude Code |
# Conflicts: # scripts/pm/check-skill-line-ratchet.mjs
…ternates between two repos Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L9qibvE77Ed7MKdzPxJTQQ
|
Contract-review-handoff: triage — CONTRACT_REVIEW_TIER unavailable (this seat's Fable usage limit refused its earlier review call on this PR; maintainer ruling 「契约复审都要等分诊」, 2026-10-27; handed off 2026-10-27T16:35Z) · head fab4534 Delta since
Local runs on the head: the ratchet exits 0 and its self-test passes all 164 cases. Generated by Claude Code |
Contract reviewServed-tier: Inputs read: card #25753 body and all 5 comments (6410938536, 6416455214, 6432304442, 6437605220, 6439149364; nothing new since the last record); PR #26598 body (one paragraph added since Delta since 6f64f2aTwo commits: Method: the PR-side net diff at the FAIL head (
Earlier should-fix items: 1 (ratchet triage comment) FIXED by ① Derived judgmentsEach accept-set or public-surface change the net diff (
② Semver level
③ Boundary flagsDev flags in the PR body's "Not in this PR" (unchanged): F12 No The PR is not a draft; the Tier S landing for Must-fix: none. Should-fix (do not decide the verdict):
④ 设计判断Per hits file, does the change hold against the cited code and the card's acceptance scenario (card #25753 item 3 "one-time import scripts retired"; item 4 "pm-dispatch references that still say two repos updated"; #25712 residuals F18, F19, F20, F23, F27)? Files whose hunks are byte-identical to the PASS head restate that record's finding re-read at this head.
Implemented-by: VERDICT: PASS Generated by Claude Code |
Requested by Tesla · project thread
Part of #25753 (the cleanup leftovers that #25712's closing record 6432294556 moved there: F18, F19, F20, F23, F27 and the 2h list, plus its own item 3, the import tooling). Part of #25677. One PR, because the 2h list edits
.claude/**and so the whole diff is Tier S either way.Clause-②: no
Metadata-protocol: none
维护者速读
ui/之后剩下的小件清理,一个 PR:workflow-checks.ts解析器、F20 跨仓 closer 的结果测试),--changed模式随它唯一的调用方退役,账本本身保留作审计(F18)。field.externalId在 liveness 账本里由live改判dead(F23):packages/**与ui/**里没有任何读取方,upsert 都按别的键匹配。作者写externalId: true时os lint会提示,附一个 patch changeset。objectui: packages/…的渲染器引用改写为ui/packages/…(F27)。scripts/ui-import/锁文件拼接工具,pnpm-workspace.yaml里引用它的注释改为指向保留该说明的提交。externalId: true的 lint 警告。回滚 = revert 本 PR。.claude/**是 Tier S,由席位在达档复核 PASS 且全绿后经队列落地。F12(ui/.github/labeler.yml)等你在项目线程里选;F14(CI 文档页重写)单独开 PR。What changes
F20.
ui/scripts/check-cross-repo-closer-outcome.mjsis deleted. Its subject was objectui'scross-repo-issue-closer.yml, which left withui/.github/workflows/, and only objectui'slint.ymlran it.scripts/check-closing-keyword-parity.mjsdrops itsNON_PARSERSrow (the comment above the list now records all three imported rows as gone).F19.
ui/scripts/__tests__/workflow-checks.tsis deleted. Its parser (readWorkflows,triggerBlock,producedCheckNames) had no caller since 2d-3. Its last export,repoRoot, had two importers (check-lockfile-dedupe.test.ts,check-lockfile-integrity.test.ts); each now computes the samepath.resolve(dirname(fileURLToPath(import.meta.url)), '../..')itself. Two retirement notes that named the file now say it was deleted, andcheck-test-shard-results.mjs's header no longer points at it.F18. The
markdown-test-inputsledger stays, as an audit:markdown-test-inputs.test.tsholds the adjudicated class equal to what the scanner derives, andcheck-pending-changeset-literals.mjsresolves markdown literals through itsderiveCandidates(). Its--changedmode retires. Its only caller was objectui'sci.ymldecision step, and the rootTest UIjob starts on anyui/**change, so no CI step asks that question any more. The header says so; the history sections below it stay.F23.
liveness/field.jsonre-gradesfield.externalIdfromlivetodead. Thelivegrade rested on objectui consolemetadataConverters.ts, which objectui dc14bcb deleted for having zero importers. Re-measured at 1c63231 acrosspackages/**andui/**, nothing outsidepackages/specreads a field'sexternalId:ObjectFieldInspector) edits it, andMetadataService.tscopies it into a field summary. Neither shows it to a person as a preview, so the designer-preview ruling does not apply.externalId(seed-loader.ts, defaultname) and an import mapping'supsertKey(import-prepare.ts).The row carries
verifiedAt,evidenceScope: in-repoand anauthorHintthat names those two keys. The flag's.describe()("Is external ID for upsert operations") now says it is not read and names the same two keys; the generated reference pages (references/data/field.mdx,object.mdx,system/migration.mdx) are regenerated from it, and the three hand-written field tables (fields.mdx,field-types.mdx,validation-rules.mdx) say the same.@objectstack/lint's pin on the set of warned field keys gainsexternalId. It is a booleandefault(false), so the lint warns only on an authoredtrue. The changeset is apatchon@objectstack/spec, because the ledger ships in the package and the advisory warning is what an author sees.F27. In
ui/page.zod.tsandui/component.zod.ts, the six renderer citations spelledobjectui: packages/…becomeui/packages/…. Each cited file exists underui/, and each named symbol is still in it:useElementApiDataSourceandPredicateScopeProviderinSchemaRenderer.tsx,parentDataSourceandParentRecordBindinginrecord-related-list.tsx,BoundRecordProviderinrecordBinding.tsx. The one pin on that spelling (expression-scope-data-root.pin.test.ts:194) moves with it. The other 24 lines of the F27 count areobjectui @<sha>measurement records, mostly inmigrations/entries/retired-keys/18.*. They say where and when something was measured, so they stay as written, the same rule 2e applied to the liveness ledger.2h list (#26216's follow-up section):
.claude/skills/pm-dispatch/references/:triage.md,hotcrm.mdanddecision-analysis.mdnameui/instead of the objectui repo.director.mddrops the objectui pin-chain rule.dispatch-runbook.mddrops objectui's release-PR title.filing-gate.mddrops the "objectui cards waiting fornext.N" line, becauseui/consumes the spec through the workspace now, and renames the consumer follow-up line.platform-readings.mddrops objectui's labeler andos-verify-lock.shreadings.rest-channel.mddrops objectui's nine required contexts.review-checklist.mddrops objectui'sskip-changesetexception.seat-post-protocol.md: two board producers, two queries, two boards. The console-pin release precondition goes, because there is no pin any more (console.ts, "Unstamped dist").lanes/director.mddrops the pin chain from its duty heading, daily summary and pointer;lanes/triage.mdno longer alternates two repos;dispatch-runbook.mdandplatform-readings.mddrop "两仓" (both words meant objectstack and objectui).true-green.md: the objectui section becomesui/, withpnpm --dir ui test..claude/agents/os-dev.md: the force-push,type-checkspelling and dispatch-gates lines no longer name objectui. Its objectui labeler andskip-changesetrows go..claude/skills/checklist-test/SKILL.md: the console build ispnpm console:buildfromui/apps/console, and the environment fingerprint has no.objectui-sha..claude/skills/dogfood-verification/SKILL.md: the/_consolesection describes the in-workspace Console build. The pin-drift bullet is replaced, becausepnpm console:buildstamps no SHA andos devhas no drift to judge (packages/cli/src/utils/console.ts, "Unstamped dist")..claude/settings.json: the five objectui write rows (labels POST, pulls and issues PATCH, ready-for-review, auto-merge) go. The repo is archived and refuses writes. Its read rows stay, because the history is still read there.scripts/pm/check-skill-line-ratchet.mjs: eight ceilings fall to the landed counts (each with a one-line note). No line was added anywhere, and no YAML was re-wrapped.Import tooling (#25753 item 3).
scripts/ui-import/(the README recipe andsplice-lockfile.mjs) ran once, at the cutover, and nothing calls it. It is deleted. The one comment that cited its step 6, inpnpm-workspace.yaml's happy-dom override note, now says the recipe retired here and names the commit to read it at (1c63231).Provenance-only mentions stay as they are: the
objectui#Ncitations,cross-repo-coordination.md's merge note, and the hook comments that cite objectui incidents.Not in this PR
ui/.github/labeler.yml) is waiting on the maintainer's choice, which was asked in the project thread.externalId(field.form.ts, "Mark as external ID for upsert operations") and its generated translations still describe the old meaning, and the designer still offers the toggle. Filed as Studio still offers field externalId as an upsert key after it was graded dead #26674 (aui/lane change plus the metadata-forms translation pipeline).ui/content/docs/guide/ci-cd-pipeline.md, 3,243 lines that describe objectui's deleted workflows, read by about a dozen tests) gets its own PR.Verification
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderives 142 commands for this diff. All of them ran locally on this branch, and all exit 0 on the head:check-plugin-teardown-shape --self-testfirst exited 3: its fixture commit was outside the shallow clone. After fetching it, exit 0.check:livenessfirst exited 1: the generatedliveness/state-counts/field.mdshard still countedexternalIdas live.gen:liveness-countsrewrote that one shard (live 100 → 99, dead 1 → 2), and it is committed. No README Notes cell names the field set.check:entry-nameability,check:exported-any,check:dts-closure,check:dual-build-cjs-loads,check:generatedandcheck:skill-examplesrefused at first (no declarations on disk). Afterenv -u OS_SKIP_DTS pnpm buildand a spec rebuild, all exit 0.pnpm --dir ui exec vitest run scripts/: 5,055 of 5,059 pass.unit-registry-absence-collisionneeded@objectstack/client's dist (15/15 once built), and twocheck-i18n-call-site-keyscases timed out at 15 s while other gates loaded the machine (137/137 alone).Main moved twice while this was open. #26536 and #26569 edited three of the same skill files (main's root-run
console:buildwording and its ninth required context kept). #26599 retiredconditionalRequired, so the lint pin is now['externalId']alone, and the regenerated field shard reads 99 / 0 / 0 / 1 / 6 / 106. After each merge, the touched-surface gates,check:generated(after a spec rebuild) and the lint suite (7,389 tests) pass.Main moved a third time while the PR sat in the queue, and the queue dropped it for a conflict at 14:25Z. #26693 rewrote the director lane's governed-draft lines, the same lines this PR had edited to drop "本仓". Main's version is taken whole, because it no longer names a second repo.
lanes/director.mdnow reads 86 lines, so its ceiling falls 88 → 86 (6f64f2a7). On the merged tree (03c8cf2b),gen:schema,gen:docsandgen:liveness-countsproduce no diff.check:generated(after a spec rebuild),check:liveness, the skill line ratchet with its self-test (164 cases),check-settings-deny-roster,check-closing-keyword-parityand the lint liveness test (109) all pass.The delta review on
6f64f2a7(FAIL 6447375373) named one must-fix. #26765 had landed on main and pinnedlanes/director.mdat 87, on the same ratchet line this PR moves to 86.d8d03efdmergesorigin/main83c4bd29and resolves that row to 86. Its comment now reads 88 → 87 (#26765) → 86 (#25753).fab4534btakes should-fix 1: the triage charter's ratchet note no longer says pickup alternates between two repos. No ceiling moves. On the merged tree, the regen produces no diff, and the ratchet with its self-test,check:generated,check:livenessand the lint liveness test pass.The first contract review (FAIL on 434b014) named those conflicts and three playbook files the objectui edits had left self-contradictory; both are fixed above. Its should-fixes are in too: the
externalIdledger row names everyui/carrier and the preview search,os-dev.mdsays plainly that hotcrm has nodispatch-gates.mjs, and the Studio follow-up is #26674.CI's first run caught one thing the derivation does not list:
@objectstack/lint'slint-liveness-properties.test.tspins the set of field keys the shipped ledger warns on. It now expects the shipped warned set; the package suite passes (7,389 tests).Also run by hand: the skill line ratchet and its self-test (164 cases),
check-settings-deny-roster,check-harness-current,check-closing-keyword-paritywith their self-tests,markdown-test-inputs --audit, and the ui vitest files the diff touches (118 tests).Generated by Claude Code