Uh oh!
There was an error while loading. Please reload this page.
fix(spec): re-measure the four #9881/#9972 objectui pin citations at the current pin, and gate the class - #10439
Conversation
… gate the class Fixes#10274
📓 Docs Drift CheckThis PR changes 1 package(s): ⛔ 1 release-owned page(s) name something this change touched. These are read-only:
What this run could not see
Coarse fallback — 122 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 23a73edb6780ca1580d5b55061b78201a41afa7b && git checkout 23a73edb6780ca1580d5b55061b78201a41afa7b
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 359f5956d7910aed7ae9f8fccc9fbb988b3e4882 67e0ad6c1ac3a467a9130a85701e94ca3602deed && git checkout -B drift-repro 359f5956d7910aed7ae9f8fccc9fbb988b3e4882 && git merge --no-ff 67e0ad6c1ac3a467a9130a85701e94ca3602deed
node scripts/docs-audit/affected-docs.mjs --json 359f5956d7910aed7ae9f8fccc9fbb988b3e4882
|
…r the normalized pin citation The module docblock feeds content/docs/references/ via gen:docs, so the citation-spelling normalization propagates. Generated, not hand-edited: pnpm --filter @objectstack/spec gen:schema && ... gen:docs
…e current objectui pin and promote the citation to the asserting spelling (#10435) The SINGLE_RECORD_WRITE_ONLY entry for sys_api_key justified itself with a present-tense claim ("the console build this release pins") while citing .objectui-sha 6314e87f2 — but the release pins 9a3daf8d37ad. Re-measured all three claims at 9a3daf8d3 (they hold, see PR body) and promoted the citation to the asserting spelling so check:objectui-pin-citations (#10274/PR #10439) re-checks this site on every future pin bump. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016gcKVsiywU9CcS96S5t9qD
…n-citation-refresh # Conflicts: # .github/workflows/lint.yml # packages/spec/package.json # packages/spec/src/data/api-methods-batch-conformance.test.ts
Fixes#10274
The four #9881/#9972 read-point records cited
.objectui-sha=82a94170c. #10137 moved the pin to9a3daf8d3, so the sentence "the objectui pin this repo builds against" named a pin this repo does not build against. The records did not become wrong — they became unverifiable, which is the exact state they were written to end.This re-measures all four at the current pin and adds the gate that closes the class, so the next pin bump cannot silently re-rot them.
1. Re-measurement — not a sha find-and-replace
Each read point was re-derived from the objectui blob at the current pin, not edited in place:
9a3daf8d3page:tabsitemicon—LazyIconinTabsTriggercontainers.tsx:662-665662-668page:tabsregistrationitemsinput:721:721page:accordionitemicon—LazyIconinAccordionTriggercontainers.tsx:851-853851-857page:accordionregistrationitemsinput:898:898Both read points are alive at the current pin. Neither moved nor died, so no docblock needed more than a citation refresh.
The finding that justifies the "⛔ not a find-and-replace" instruction
The two icon anchors were wrong when they were written, not merely stale.
containers.tsxis byte-identical between the old and new pin across the whole read-point region:(The two pins differ only from line 1403 down, in the unrelated
page:headerreadMaxregion.)Both cited ranges stop mid-element. Reading the tab trigger line by line at the pin:
662opens theitem.iconguard and its paren;663opens theLazyIconelement;664is itsnameprop;665itsclassName;666itsaria-hidden;667the self-closing bracket;668the guard's closing paren and brace;669is the label span. So the element the record points at runs 662-668, and the cited662-665cut it off at theclassName— naming three of its seven lines.851-853did the identical thing to the accordion's copy (which runs 851-857), stopping at itsnameprop.Both truncations were equally wrong at the old pin, per the hashes above. A sha-only rewrite would have preserved both errors and hidden them behind a fresh-looking sha. This is the #10053 MetricCard near-miss repeating, and it is now written into the gate's failure text and its ledger entry.
Incidentally: the card notes
82a94170cwas unreachable in the shallow../objectuicheckout when it was filed. It is reachable now, which is what made the byte-identity comparison possible.The claims around the anchors were re-verified too, not just the line numbers — the tab icon's
mr-1.5 h-3.5 w-3.5 shrink-0 opacity-70/aria-hiddenand its position left of the label span (:669); the accordion icon's grouping with the label inside the trigger's one wrapping span (:850–:859); and both registrations' documenteditemsshapes.2.
check:objectui-pin-citations— the class-closing gatepackages/spec/scripts/check-objectui-pin-citations.ts. Prose has no dependency edge to the pin file; this is that edge.It keys on two canonical spellings, because two different things get said about a sha and only one of them can rot:
.objectui-sha.objectui-shain backticks, then=, then the sha in backticks.objectui-shain backticks, then the wordpin, then the sha in backticksForcing historical records forward (#5010 absorbed at
09987b68, a renderer's branch semantics measured at665661ab0932) would demand re-measuring settled history on every bump, and rewriting their shas without re-measuring would be a lie the gate manufactured.An unrecognised spelling FAILS rather than being skipped. A source scan sees only the spellings it knows, and an unrecognised one produces no flag — silently, the failure mode AGENTS.md records for
check:cross-package-test-inputs. A.objectui-shamention naming a sha-shaped token in neither form is a hard failure asking the author to pick one. Mentions naming no sha are skipped (they make no falsifiable claim), and that boundary is stated in the header rather than left implicit.Discovered population on the merged tree — 971 spec sources, 12 citations, no allowlist anywhere:
8 asserting / 4 historical.
component.zod.ts:1675and:2150are the two records #10270 added; they were already correct and are untouched. The batch-conformance site is asserting because #10521 (issue #10435) re-measured it and landed on main — see section 3.Deliberately no
gen:. The obvious automation — rewrite every cited sha to the pin — is the one thing this gate must never offer, for the reason section 1 measured: the sha is not the record, the anchors are. ClassifiedNO_GENERATORin thecheck:generatedledger forcheck:browser-reachable-entries' reason exactly (agen:would grant by command the one thing that has to be earned by measurement). Ledger reconciles on the merged tree:25 check: + 17 gen: scripts, all classified (… 9 source audits …).Why it scans raw text and not
scripts/js-comment-mask.mjs: that helper answers "comment or code?", and this gate does not have the question — a pin citation is a citation wherever it is written, and nothing is stripped, so there is no privatestripCommentsto drift. Wrapped prose is handled generally: comment decoration is peeled and lines joined before matching, with a per-character map back to the original line so failures name a line a reader can open.3. Spelling normalizations (declared — beyond the card's four sites)
The gate can only find citations spelled findably, so these sites were normalized. Token-level only; not one word of any claim changed.
component.test.ts:1949(a [finding]element:button.iconandobject-metric.iconcarry vocabulary-only describes — live readers measured, read point unrecorded #10053 record) — the citation wrapped between=and the sha. Un-wrapped and backticked. Its contrast clause ("NOT the82a94170cthe earlier records cite") became false the moment this PR re-measured those four, so it is restated to say the four now agree.expression-bindable-text-keys.zod.ts:49— the sentence "measured at the objectui pin" put the keyword before the token and left the sha on the next line. Reordered to the recognised historical form; the re-verification note and its date are untouched.api-methods-batch-conformance.test.ts:64— superseded on main; no longer this PR's change. This PR originally normalized it to the historical spelling and filed the substantive staleness as [finding]api-methods-batch-conformance.test.tsasserts "the console build this release pins" while citing6314e87f2— the release pins9a3daf8d3, and the claim was never re-measured #10435, because that seat had not re-measuredplugin-gridand would not fake a measurement. docs(spec): re-measure the sys_api_key batch-conformance claims at the current objectui pin and promote the citation to the asserting spelling #10521 then did the re-measurement and promoted the site to the ASSERTING spelling (.objectui-sha=9a3daf8d3, with6314e87f2kept as a dated provenance note). Mergingorigin/mainconflicted on exactly that line and main's landed text wins — so the site now appears in the asserting column above, and the caveat this body previously carried is discharged by docs(spec): re-measure the sys_api_key batch-conformance claims at the current objectui pin and promote the citation to the asserting spelling #10521 rather than by anything here.4. Generated-docs propagation (commit 2) — and a correction to this body
The second
expression-bindable-text-keys.zod.tsdocblock is agen:docsinput: it is rendered verbatim intocontent/docs/references/ui/expression-bindable-text-keys.mdx. An earlier revision of this body claimed the diff "moves no generated artifact" — that was wrong, and CI is what falsified it (check:docs: "content/docs/references/ is out of date with packages/spec"). Recording the correction rather than quietly overwriting it, since a claim like that is exactly the kind a later reader would trust without re-checking.Fixed by regeneration, never by hand-editing the mdx:
The result is a 2-line change carrying only the reworded citation — no other content moved. Nothing under
content/docs/releases/is touched.5. Merge with main (commit 3)
git merge origin/main— merge commit, no rebase, no force-push. Three conflicts, all resolved and re-verified:api-methods-batch-conformance.test.tspackages/spec/package.jsoncheck:script at the same insertion pointcheck:browser-reachable-entries(#10398) andcheck:objectui-pin-citationsare independent gates.github/workflows/lint.ymlTypeScript Type Checkinto 4 lanes; this branch inserted a step in the pre-build source-audit groupThe last two were additive collisions, not supersessions, and the workflow gates confirm main's restructure survived:
check:workflow-status-functionsnow sees 49 jobs (was 45) andcheck:node-version32 setup-node steps (was 29).Verification
Measured on the merged head
67e0ad6c1.Reverse-verification, both legs, mutation proven on disk each time (run on
9a62304b3; the gate's logic is untouched by the merge). This gate reads source, notdist, so no rebuild is involved — the ablation's validity rests on the file the scanner opens.component.zod.ts:638to82a94170c(on-disk:82a94170c0→1 occurrence,9a3daf8d34→3 lines). Gate exit 1, namingcomponent.zod.ts:638 cites 82a94170c. Restored; on-disk absence confirmed..objectui-shawith a fake sha (on-disk: fake present 1, real absent 0). Gate exit 1 listing all asserting citations as stale, and none of the historical ones. Restored; on-disk absence confirmed.Both legs failed in the expected direction (red), and leg 2 confirms the gate fires on the pin move rather than only on an edited citation.
check:objectui-pin-citations✅ 8 asserting objectui pin citation(s) match .objectui-sha (9a3daf8d3), 4 historical citation(s) recorded and not checked, across 971 spec source(s).check:objectui-pin-citations --self-test✅ self-test: asserting citations are checked against the pin and historical ones are not; …check:generated --reconcile-only✓ … 25 check: + 17 gen: scripts, all classified (14 gated, 9 source audits, …)check:docs✅ 229 generated files in sync with packages/spec(aftergen:schema—json-schema/is a gitignored artifact a fresh worktree lacks, and the gate hard-refuses rather than reporting from a tree it never read)check:nul-bytesOK (scanned 6177 text file(s) … no raw ASCII control bytes)check:workflow-status-functionsOK (scanned 26 workflow file(s), 49 job(s), 24 job-level if: expression(s))check:node-versionOK (32 setup-node step(s) across 26 workflow(s), all on Node 22)check:required-contexts/check:shard-attestationPre-merge head
9a62304b3additionally ran green: spec suiteTest Files 415 passed (415)/Tests 11071 passed (11071);check:authorable-surface;check:scripts-typecheck+ spectypecheck;check:cross-package-test-inputs;check:engine-double-contract;check:where-matcher;check:query-options-erasure;check:slot-lookup;check:spec-parsed-alias;check:type-check-coverage;check:type-source-resolution;check:merge-driver;check:doc-anchors;check:docs-redirects;check:docs-audit-scope;check:role-word;check:quick-reference-counts;check:published-readme-links;check:doc-authoring;check:docs-image-tag—none newon every ratchet.Changeset
None —
skip-changeset. Thepackages/spec/srcdiff is comment lines only: zero.describe(), zero schema, zero export, zero runtime behaviour, andcheck:authorable-surfaceleaves the JSON Schema tree clean. The one generated artifact that moves is a docs-site reference page (section 4), which publishes no package. So this PR releases nothing and takes the label route. An empty-frontmatter changeset is the wrong instrument here andcheck:empty-changesetrejects newly added ones — its header records why (an empty changeset is a real input tochangesets/actionand can take thehasChangesets && !hasNonEmptyChangesetsbranch that silently stalled 17.0.0-rc.2, which the label cannot do).Scope
Per the card's fences: prose + a new observing gate, no acceptance change anywhere.
check:objectui-pin-citationsonly observes; it relaxes nothing. #10270's two records are untouched.Generated by Claude Code