Repository navigation
ci(ui-merge): port objectui's lockfile-integrity gate into Type Check UI and retire lockfile-dedupe and the shadcn-check report - #26995
Conversation
… UI, retire lockfile-dedupe and the shadcn-check report Rows 19, 18 and 26 of the objectui workflow roster. - Row 19: check:lockfile-integrity runs as a pull_request-only, continue-on-error step of Type Check UI, before the install, against origin/<base>; the integrity test pins the step, the deep checkout and the alarm-only shape against root ci.yml. - Row 18: the check:lockfile-dedupe alias, its script and its test are deleted (report-only, nothing else reads them). - Row 26: shadcn-check-report.mjs (the weekly workflow's classifier) and its test are deleted; shadcn:check / shadcn:analyze stay, they are the components package's documented maintainer commands. Claude-Session: https://claude.ai/code/session_01ADHkmSracEMN5RmM9xs4Fu Co-authored-by: Claude <noreply@anthropic.com>
席位核对ACCEPT ·
|
Contract reviewServed-tier: Director seat (summon #52, ledger objectstack#12708), summoned by the ① Derived judgments
② Semver level
③ Boundary flags
④ Design judgment
Implemented-by: VERDICT: PASS Generated by Claude Code |
Requested by Steve · project thread
Part of #26717 (slice 2: roster rows 19, 18 and 26 land here; row 7-docs stays open on the card for the seat's decision, see Acceptance notes. Row 17 is out of scope by #25914's ruling.)
Clause-②: no
Metadata-protocol: none
维护者速读
Type Check UI,只在 PR 上跑,发现问题只打一条报错注释,不挡合并,和 objectui 当年一样。另外两个退役:锁文件 dedupe 报告(90 天 145 次运行从未失败)和 shadcn 每周报告的分类脚本,连同它们的测试一起删掉。Type Check UI是必需检查,但新步骤带continue-on-error,它红了不会让这个 job 红,所以不会挡任何 PR。删掉的脚本没有别的读者。回滚就是 revert 本 PR。.github/workflows/ci.yml里Type Check UI新加的check:lockfile-integrity步骤;ui/scripts/__tests__/check-lockfile-integrity.test.ts新加的四条接线测试。pnpm --dir ui run check:lockfile-integrity --base-ref origin/main,预期VERDICT clean — no package gained a copy.,退出码 0。ci.yml(Tier H),需要你明确批准;另外第 7-docs 行(objectui 文档站构建)记录里没定,席位会把选项拿给你。What changes
Rows of the #25697 workflow roster (comment 6388182608), read from the objectui workflows #26058 deleted (
lockfile-integrity.yml,lockfile-dedupe.yml,shadcn-check.ymlataa2f8e31f3's parent).lockfile-integrity.yml(check:lockfile-integrity)Type Check UI,check:lockfile-integrity — compare this pull request's lockfile with its merge baselockfile-dedupe.yml(check:lockfile-dedupe, report-only since objectui#9562's ruling A)ui/scripts/check-lockfile-dedupe.mjsand its test deleted; nothing replaces it, by choice (#25920: 145 runs / 90 days / 0 failures)shadcn-check.yml(weekly report)ui/scripts/shadcn-check-report.mjs(the workflow's classifier and issue-body renderer) and its test deleted; nothing replaces the weekly report, by choiceif: github.event_name == 'pull_request',continue-on-error: true, beforepnpm install, runningpnpm --dir ui run check:lockfile-integrity --base-ref "origin/${BASE_REF}"withBASE_REFfromgithub.base_ref. Why this job: it already checks out withfetch-depth: 0, soorigin/BASEand the merge base are in the clone (objectui paid a separate job for that history), and theuipaths filter listspnpm-lock.yaml, so every lockfile change runs it. Before the install because the script needs only Node builtins and two repo modules, as objectui ran it; Lint UI's pre-install import graph check holds that.continue-on-errorkeeps objectui's classification: a finding prints::error title=Lockfile integrity::PACKAGESon the pull request and does not fail the required job. Making it blocking stays the maintainer's call (NOT_A_GATEinui/scripts/dependabot-merge-gate.mjs). No new job, no new check-run context, no new required context.shadcn:checkandshadcn:analyze(andshadcn-sync.js,shadcn-local-patches.mjs,component-analysis.js) are not retired: they are the components package's maintainer commands, read byui/packages/components/README.md,README_SHADCN_SYNC.md,shadcn-components.json, the other fourshadcn:*aliases andscripts/regen-artifacts.mjs. The weekly workflow only scheduled them; its own artifact was the classifier, and that is what goes. The two ui tests that readshadcn-sync(shadcn-local-patches.test.ts,shadcn-sync-fetch-cache.test.ts) test those live scripts and stay.Forced test edits
ui/scripts/__tests__/check-lockfile-integrity.test.ts: the note saying the port would "bring both pins back against the root job" is replaced by those pins, read from rootci.ymlthroughhelpers/root-ci: the step exists and runs the gate against the pull request base; the job checks out withfetch-depth: 0before it; the step iscontinue-on-errorand before the install; no other root workflow carries the alias. 13 → 17 cases.ui/scripts/__tests__/check-lockfile-dedupe.test.tsandui/scripts/__tests__/shadcn-check-report.test.ts: deleted with the scripts they test.Tests
Measured in this worktree on head
a463a624.Row 19: the step's command, and its counter-probe
pnpm --dir ui run check:lockfile-integrity --base-ref origin/main(the step'srun:withBASE_REF=main): exit 0,base: 7bb80845…:pnpm-lock.yaml (1941 resolutions) head: …/pnpm-lock.yaml (1941 resolutions),VERDICT clean — no package gained a copy.pnpm-lock.yamlmutated with the test's sample (a) (a secondai@7.0.65(zod@4.6.7)snapshot besideai@7.0.118(zod@4.6.7); marker count 1 on disk), then the same command: exit 1,VERDICT 1 lockfile-integrity finding(s): 1 duplication(s).and::error title=Lockfile integrity::ai — see the run log; this is a lockfile regression, not a bundle regression (objectui#8326).Restored bygit checkout HEAD -- pnpm-lock.yamlunder a trap; blob8b64d515before and after;git diff HEADempty; re-run exit 0,VERDICT clean.pnpm --dir ui exec vitest run scripts/__tests__/check-lockfile-integrity.test.ts: 17 passed.Rows 18 and 26: every reader gone
git grep -n -F check:lockfile-dedupe: no hits (exit 1).git grep -n -F shadcn-check-report -- ':!ui/content/docs/guide/ci-cd-pipeline.md' ':!ui/scripts/dependabot-merge-gate.mjs': no hits. The two remaining mentions are prose about objectui's deleted workflows (Acceptance notes).git grep -n -F check-lockfile-dedupe -- ':!ui/content/docs/guide/ci-cd-pipeline.md' ':!ui/scripts/workspace-root.mjs': no hits. Same reason.Acceptance notes
@object-ui/site, objectuici.yml"Build Docs") is not decided here. The card says to decide it with F14 / docs-deploy (sub-issue 4 row 10). Read: tooling(ui-merge): governance in-repo — liveness evidence and spec tests stop citing objectui by commit, one sdui-parser, AGENTS.md / pm scripts dropobjectui#,ui/AGENTS.mdnests, 18 governance workflows merged or retired (parent #25677, 4b/6) #25712's item 5 says objectui'sdocs-deploy.ymlshould become "a second deploy job in this repo'sdocs-deploy.yml(the site stays a separate Vercel project) — the project id/secrets are the maintainer's"; ci(ui-merge): delete objectui's nested workflows and Dependabot config; retire the action-ref scan and the CI page pin test with them #26058 then deleted it with "(none; objectui's site is a separate Vercel project)", and rootdocs-deploy.ymldeploysapps/docsonly. F14 (now on aftercare(ui-merge): the first joint 18.x release from the merged repo — both scopes at one version, @object-ui published, docs site deployed — then close #25556 as superseded and the epic (parent #25677, 6/6) #25753) is the rewrite ofui/content/docs/guide/ci-cd-pipeline.md, not a build decision. So the record decides the deploy, which never landed, and not the per-PR build row. The options go to the seat in the card report; the card stays open (Part of).ui/content/docs/guide/ci-cd-pipeline.md(F14, aftercare(ui-merge): the first joint 18.x release from the merged repo — both scopes at one version, @object-ui published, docs site deployed — then close #25556 as superseded and the epic (parent #25677, 6/6) #25753) still describeslockfile-integrity.yml,lockfile-dedupe.ymlandshadcn-check.ymlas live, as it does every other deleted objectui workflow. Outside this card's file surface; F14 rewrites it.ui/scripts/workspace-root.mjs's docblock still namescheck-lockfile-dedupe.mjsas one of two pre-install importers, andui/scripts/dependabot-merge-gate.mjsstill classifiesLockfile Dedupe Check(OPTIONAL_CONTEXTS) and namesshadcn-check-report.mjsin its header. Prose and context names from objectui's CI, outside the surface;dependabot-merge-gate.mjsruns in no root workflow.dispatch-gates --tierMANDATORY forci.yml; measured on this change set it reports no path-derived mandate (the surface hits none of the 4 declared glob(s)).Verification
Final head
a463a624, after a rootpnpm build(VERDICT command-exit 0, 12m30s underos-verify-lock).Gate sweep and reconciliation
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 74 commands for this change set (7 paths, 2175 changed lines). All 74 ran and exited 0, each exit code captured before any pipe. Among them:pnpm --dir ui exec vitest run scripts/underos-verify-lock(176 files passed, 2 skipped; 5032 tests passed, 2 skipped; VERDICT command-exit 0),pnpm check:pm-dispatch-gates(fast tier, 1935 cases),pnpm check:required-contexts,pnpm check:ci-filter-parity,pnpm check:pm-expected-skips,pnpm check:workflow-step-name-quotingandpnpm check:published-files.node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ran LEDGER:✓ 74 derived famil(ies) accounted for — 74 run, 0 NOT-MEASURED, 0 UNRUN.origin/mainmoved 11 commits after the base7bb80845; none touches this PR's files, so it is not merged in.Not run locally:
pnpm lintand the full test suites, which are CI's run.🤖 Generated with Claude Code
https://claude.ai/code/session_01ADHkmSracEMN5RmM9xs4Fu