Skip to content

Commit f211ae3

Browse files
committed
wip(sdui-manifest): retire the parity ratchet and the browser dump; console ships the tracked manifest
The node generator's output over objectui's built tree at the pin and the browser dump over the same tree are cmp-identical, so the dump retires: build-console.sh copies the tracked sdui.manifest.json into the console dist. The declaration-parity gate, its test, baseline and helper are deleted, with the lint and cut-rc steps. The manifest is regenerated at the pin and the JSX witness ledger drops its three rows that went stale with it. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013RDBh5DqXd2xnLwvHLgLFr
1 parent c77331c commit f211ae3

32 files changed

Lines changed: 468 additions & 3243 deletions

‎.claude/hooks/guard-process-kill.selftest.sh‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,8 +124,8 @@ echo "== the teardown AGENTS.md itself prescribes: the port is one YOU picked ==
124124
expect allow 'kill $(lsof -ti tcp:38421)'
125125
expect allow 'kill $(lsof -ti tcp:3000) 2>/dev/null'
126126

127-
echo "== pgrep -P / -s select by a handle the caller owns — live in two tracked scripts =="
128-
# scripts/publish-smoke.sh kill_tree() and scripts/gen-sdui-manifest.sh sdui_live_pids().
127+
echo "== pgrep -P / -s select by a handle the caller owns — legitimate teardown shapes =="
128+
# scripts/publish-smoke.sh kill_tree() uses -P; -s was the retired gen-sdui-manifest.sh's.
129129
# A rule that reddened these would be routed around within the hour.
130130
expect allow 'for child in $(pgrep -P "$pid"); do kill "$child"; done'
131131
expect allow 'pgrep -s "$leader" | xargs kill'

‎.claude/hooks/guard-process-kill.sh‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@
5353
# you picked, not a name
5454
# pgrep -P "$pid" / pgrep -s "$leader" — even piped into a kill: the selector is a parent
5555
# or session handle the caller owns, and both are
56-
# live in scripts/publish-smoke.sh and
57-
# scripts/gen-sdui-manifest.sh
56+
# legitimate teardown shapes (scripts/publish-smoke.sh
57+
# uses the first)
5858
# pkill -P "$pid" / pkill -s "$sid" — the same selectors on pkill, with NO pattern
5959
# operand. Add a pattern and it is blocked again.
6060
# pgrep -f foo / ps aux | grep node — a READ. Nothing dies; look all you like. But a
@@ -243,7 +243,7 @@ check_killall() {
243243
# --- does this segment select processes by NAME? (pgrep with a bare pattern operand) -----
244244
# Returns 0 = yes, this is a name-pattern selector. `pgrep -s "$leader"` and
245245
# `pgrep -P "$pid"` consume their argument and leave no operand behind, so they answer 1 —
246-
# which is what keeps scripts/publish-smoke.sh and scripts/gen-sdui-manifest.sh legal.
246+
# which is what keeps scripts/publish-smoke.sh's `pgrep -P` teardown legal.
247247
is_name_selector() {
248248
[ "$HEAD" = "pgrep" ] || return 1
249249
local n=${#W[@]} i=$((HEAD_I + 1))

‎.github/workflows/cut-rc.yml‎

Lines changed: 5 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -405,42 +405,11 @@ jobs:
405405
- name: Verify the Console dist stamp matches the pin
406406
run: pnpm check:console-sha
407407

408-
# ────────────────────────────────────────────────────────────────────────
409-
# ADR-0082 D4 declaration-parity ratchet — the mandatory SECOND HALF of
410-
# every pin move (#5960), run here against the pin as COMMITTED.
411-
#
412-
# ⚠️ Since #10134 this lane no longer moves the pin, so this is no longer
413-
# "the second half of a move this run performed" — the move, and the
414-
# ratchet that belongs to it, happen on the manual bump PR. Kept anyway,
415-
# and deliberately: the ratchet is an on-demand gate by decision (ADR-0082
416-
# addendum), which means "unrun" is its live failure mode, and a bump PR
417-
# that skipped it leaves a divergence that reaches a release unnoticed.
418-
# This is the last place before publish that can still say so. It writes to
419-
# a gitignored path and asserts against the committed baseline, so it adds
420-
# no file to the version commit; on a pin that already ratcheted it simply
421-
# passes.
422-
#
423-
# Installing a Playwright browser is fine HERE. The #5960 ruling that keeps
424-
# the ratchet off CI is about not putting an objectui build plus a browser
425-
# download on every matching PR; this workflow runs a handful of times a
426-
# month, on purpose, and has already built the console two steps above.
427-
# ────────────────────────────────────────────────────────────────────────
428-
- name: Install a Playwright browser for the manifest dump
429-
run: |
430-
# The dump runs INSIDE objectui's build tree (gen-sdui-manifest.sh does
431-
# `pushd $BUILD_ROOT` and drives objectui's own playwright), so the
432-
# browser must be installed against THAT workspace. `pnpm exec
433-
# playwright` from the framework root resolves nothing — playwright is
434-
# not a framework dependency.
435-
BUILD_ROOT=".cache/objectui-${OBJECTUI_SHA:0:12}"
436-
if [ ! -d "$BUILD_ROOT" ]; then
437-
echo "::error::expected objectui build tree at ${BUILD_ROOT} (created by 'pnpm objectui:build'). Cannot install the browser the ratchet needs."
438-
exit 1
439-
fi
440-
pnpm --dir "$BUILD_ROOT" exec playwright install chromium-headless-shell
441-
442-
- name: 'Declaration-parity ratchet at the committed pin (ADR-0082 D4)'
443-
run: pnpm sdui:manifest
408+
# No SDUI manifest step follows. The console dist built above already
409+
# carries the TRACKED repo-root sdui.manifest.json (build-console.sh copies
410+
# it), whose freshness against the pin the required lint job holds on every
411+
# PR; the ADR-0082 D4 declaration-parity ratchet that used to run here, and
412+
# the Playwright browser it needed, are retired.
444413

445414
# ────────────────────────────────────────────────────────────────────────
446415
# PRE-VERSION GATES. Every one of these reads `.changeset/*`, so all of them

‎AGENTS.md‎

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -155,11 +155,11 @@ pull its build into `packages/console/`.
155155
Other scripts: `objectui:bump` (pull only), `objectui:build`, `objectui:clean`. ⛔ Never hand-edit
156156
`packages/console/dist/` or `.cache/objectui-*/` — regenerated.
157157

158-
**Moving the pin has a second half: regenerate the committed manifest** — `node scripts/gen-sdui-manifest-node.mjs
159-
--objectui-version {the @object-ui version the new pin ships}`; `scripts/check-sdui-manifest.mjs` reds until you do.
160-
ADR-0082 D4's spec↔registry declaration-parity ratchet reads that tracked artefact, so it gates **every PR**, not a
161-
pin bump alone. `pnpm sdui:manifest` is the separate browser dump of objectui's own registry (needs Playwright
162-
chromium); `objectui:bump` and `objectui:refresh` print it. Full procedure: `docs/releases-maintenance.md`.
158+
**Moving the pin has a second half: regenerate the committed manifest** — `pnpm objectui:build`, then
159+
`node scripts/gen-sdui-manifest-node.mjs`, which reads objectui's BUILT tree at the pin (never an npm install, whose
160+
version string names an older commit) and takes no arguments; `scripts/check-sdui-manifest.mjs` reds until you do.
161+
`objectui:bump` and `objectui:refresh` print the step, and the console build ships that same tracked file in
162+
`packages/console/dist/`. Full procedure: `docs/releases-maintenance.md`.
163163

164164
**Fast iteration on `../objectui` src (no commit/refresh loop):** run objectui's own console dev server —
165165
`cd ../objectui && pnpm --filter @object-ui/console dev` (Vite on **:5180**, HMR). Its `/api` proxy targets
@@ -755,18 +755,6 @@ Principles the wrapper encodes (its own output is the authority on detail):
755755
a name, with accepted cases in the shrink-only, hand-edited
756756
`dual-source-exports.baseline.json`.
757757

758-
**`check:react-declaration-parity` compares two DECLARATIONS, not a declaration against an
759-
implementation** — the props the spec zod schema declares vs the inputs the objectui
760-
registry config declares. Its `spec-only` / `registry-only` / `missing` signals are real;
761-
just don't read it as proof anything renders. Its right-hand side is the **tracked
762-
repo-root `sdui.manifest.json`** and its record `scripts/sdui-manifest.record.json`, which
763-
the required lint job's `scripts/check-sdui-manifest.mjs` checks OFFLINE only — existence,
764-
shape, sha256 vs the record, record pin vs `.objectui-sha`; its version-vs-pin leg runs
765-
only where an objectui checkout is in hand, so lint prints `NOT CHECKED` by design.
766-
`lint.yml` runs THIS gate `--strict` against it on every PR; it still **exits 1** with no
767-
usable manifest and `check:generated` files it `EXTERNAL_INPUT_REQUIRED` because that
768-
aggregate hands it none. ⛔ Do not "fix" a red by re-adding a skip.
769-
770758
Two generators have **no** gate at all — `gen:openapi` and `gen:sbom`. Nothing verifies
771759
their output is current; the wrapper reports that each run rather than staying silent.
772760

@@ -1100,7 +1088,7 @@ Both non-handshake shapes, and how to classify and probe your own:
11001088
so a removal or rename the pinned sibling still imports turns `main` red for every PR in the repo the moment it
11011089
merges — "retire the surface" and "leave the sibling untouched" cannot both hold. A ruling that authorizes such a
11021090
removal therefore implicitly authorizes the objectui-side fix and the pin bump as part of the same landing (the
1103-
bump's `sdui:manifest` second half included — see the Frontend section). Pre-merge check for any removal or rename
1091+
bump's manifest-regeneration second half included — see the Frontend section). Pre-merge check for any removal or rename
11041092
of an exported surface: does the pinned sibling import what you are removing? `git grep` it in `../objectui` at the
11051093
pinned SHA before merging.
11061094
5. **Touched `packages/spec`? Regenerate and commit its artifacts before pushing** — § *Touched `packages/spec`*

‎docs/audits/2026-06-react-blocks-conformance.md‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@
2020
> "frontend-only" as "the registry declared an input the spec did not", not as
2121
> "the component accepts it". Evidence about the render path comes from
2222
> objectui's `public-block-binding-reach.test.tsx`; see the ADR-0082 addendum.
23+
>
24+
> **Retired (2026-09-18, maintainer ruling on #17735).** `check:react-declaration-parity`,
25+
> its script, test and baseline, and the `pnpm sdui:manifest` browser dump no longer
26+
> exist; the commands below are a record of how this audit ran, not something to
27+
> run. The status line on ADR-0082 decision 4 carries the ruling.
2328
2429
**Question** (raised in review): we can't guarantee the frontend (objectui)
2530
components actually implement the props the backend spec protocol declares —

0 commit comments

Comments
 (0)