Skip to content

Commit d1ba685

Browse files
Jack Qclaude
andauthored
fix(spec): re-measure the four #9881/#9972 objectui pin citations at the current pin, and gate the class (#10439)
* fix(spec): re-measure the four #9881/#9972 objectui pin citations and gate the class Fixes #10274 * docs(spec): regenerate the expression-bindable-text-keys reference for 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 --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 68ca346 commit d1ba685

8 files changed

Lines changed: 544 additions & 13 deletions

File tree

.github/workflows/lint.yml

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2147,6 +2147,34 @@ jobs:
21472147
- name: Check every shipped template manifest satisfies TemplateManifestSchema
21482148
run: pnpm --filter @objectstack/spec check:template-manifests
21492149

2150+
# [#10274] The read-point records in packages/spec/src cite the objectui
2151+
# commit their file:line anchors were counted in — "the objectui pin this
2152+
# repo builds against (`.objectui-sha` = `<sha>`)". That sentence is what
2153+
# makes a record RE-CHECKABLE, and it is the entire justification #9881 /
2154+
# #9972 were filed on after #9397 spent a full dispatch cycle re-deriving
2155+
# one read point from scratch.
2156+
#
2157+
# Nothing linked the sentence to the pin file. #10137 bumped `.objectui-sha`
2158+
# and four records went on naming a pin this repo does not build against —
2159+
# not WRONG (the anchors held) but UNVERIFIABLE, which is the exact state
2160+
# they were written to end. Prose has no dependency edge, so the class
2161+
# recurs silently on every bump. This gate is the edge.
2162+
#
2163+
# It checks only the ASSERTING spelling. `.objectui-sha` pin `<sha>` is a
2164+
# dated record of where a past measurement was taken (#5010 absorbed at
2165+
# `09987b68`, a renderer's branch semantics at `665661ab0932`) and a later
2166+
# bump does not falsify it; forcing those forward would demand re-measuring
2167+
# settled history on every bump. A sha named in NEITHER spelling fails
2168+
# loudly rather than being skipped — an unrecognised spelling is how a
2169+
# source scan loses a citation silently.
2170+
#
2171+
# Reads `src/` and the root pin file only — no build — so it belongs in
2172+
# this pre-build source-audit group. Unfiltered and required: a paths
2173+
# filter on packages/spec/** would go dormant on exactly the PR that moves
2174+
# `.objectui-sha`, which is the PR this exists to catch.
2175+
- name: Check spec pin citations still name the pin this repo builds against
2176+
run: pnpm --filter @objectstack/spec check:objectui-pin-citations
2177+
21502178
# Lane 2 of 4 behind the required `TypeScript Type Check` context. The
21512179
# aggregator job at the bottom of this file explains the split, holds the
21522180
# contract, and is the thing the merge queue actually requires — read it

content/docs/references/ui/expression-bindable-text-keys.mdx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ renderer happens to read.
5050
## Why these rows (measured, not inferred)
5151

5252
Rows are a RECORD of what each component renderer already reads back from
53-
the node's top level, measured at the objectui pin (`.objectui-sha`
54-
`82a9417`, re-verified identical at objectui `origin/main` `6c68b13` on
53+
the node's top level, measured at the `.objectui-sha` pin `82a9417`
54+
(re-verified identical at objectui `origin/main` `6c68b13` on
5555
2026-08-18) — declaring a key a renderer does not read back would recreate
5656
the evaluated-but-blank half of the objectui#4795 table:
5757

packages/spec/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@
217217
"check:exported-any": "tsx scripts/check-exported-any.ts --self-test && tsx scripts/check-exported-any.ts",
218218
"check:dual-source-exports": "tsx scripts/check-dual-source-exports.ts --self-test && tsx scripts/check-dual-source-exports.ts",
219219
"check:browser-reachable-entries": "tsx scripts/check-browser-reachable-entries.ts --self-test && tsx scripts/check-browser-reachable-entries.ts",
220+
"check:objectui-pin-citations": "tsx scripts/check-objectui-pin-citations.ts --self-test && tsx scripts/check-objectui-pin-citations.ts",
220221
"check:authorable-surface": "OS_EAGER_SCHEMAS=1 tsx scripts/build-schemas.ts --check",
221222
"gen:migration-registry": "tsx scripts/build-migration-registry.ts",
222223
"check:migration-registry": "tsx scripts/build-migration-registry.ts --self-test --check",

packages/spec/scripts/check-generated.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,24 @@ const NO_GENERATOR: ReadonlyArray<{ check: string; why: string }> = [
260260
check: 'check:scripts-typecheck',
261261
why: 'type-checks packages/spec/scripts/** (the generators and gate scripts themselves) under tsconfig.scripts.json — no artifact, and no debt ledger by design (#5475)',
262262
},
263+
// #10274. Audits this package's own PROSE: a read-point record that says
264+
// "`.objectui-sha` = `<sha>`" is asserting the pin this repo builds against,
265+
// and #10137 moved the pin under four such records without anything failing.
266+
//
267+
// NO_GENERATOR, and here the classification is the SAFETY PROPERTY rather than
268+
// a bookkeeping choice. The `gen:` a reader would reach for — rewrite each
269+
// cited sha to the pin file — is the one operation this gate must never offer:
270+
// the sha is not the record, the objectui file:line anchors beside it are, and
271+
// they are only true of the tree they were counted in. Regenerating the sha
272+
// alone would leave every record CLAIMING the current pin while its anchors
273+
// still described the old one, i.e. it would convert a loud "unverifiable" into
274+
// a silent lie. #10274 measured that as real, not theoretical: re-measuring the
275+
// four records found two anchors that had been wrong since they were written.
276+
// A failure here is always a re-measurement, never a command.
277+
{
278+
check: 'check:objectui-pin-citations',
279+
why: 'audits spec source prose: a citation in the asserting spelling (`.objectui-sha` = `<sha>`) must equal the root pin file — no artifact, and deliberately no `gen:`, because rewriting the sha without re-measuring the anchors beside it is the failure mode (#10274)',
280+
},
263281
];
264282

265283
/**

0 commit comments

Comments
 (0)