Repository navigation
docs(ui): re-take the react-block-needs-record-context transcript from os validate; the close-out census reads 0 author-time ids over 200 - #24313
Merged
Conversation
…m os validate The react-pages transcript of the record-context refusal predated the one-line message and fix shape: its verdict line, its fix line and its rule line (no os explain pointer, pages[27]) were no longer what the CLI prints. The four lines are now the real output of os validate on the showcase with <RecordHighlights> planted on the renewals page, taken on main at 21070a2; the fence and the surrounding prose are unchanged. Claude-Session: https://claude.ai/code/session_019oFY6Hi35J7atvgVFnmoaK Co-authored-by: Claude <noreply@anthropic.com>
Contributor
Author
席位核对 (seat check) · PR #24313 · #22161 close-out ·
|
| item | reading |
|---|---|
| Shape | Draft, base main. The body's line 1 is Fixes #22161, line 2 is Clause-②: no; no other closing keyword. skip-changeset is on the PR: content/docs/** ships in no package. 1 file, +3/-3. |
The close condition (triage 6219576699) |
The census on main (21070a2f0, report): 240 ids fire. 3 are over 200, all repo-gate ids in lint-startup-registry-verdict.ts, which are outside the condition. 0 author-time ids over 200. The controls are seen (react-block-needs-record-context 195, field-no-consumers 175). A second instrument, a static floor over 281 hint sites, agrees. Item 3's slices have all landed (slice 21 → 9c74d4098d). The domain:cli half, #22841, is closed. So Fixes is right. |
The transcript, checked line by line against origin/main |
The verdict line matches validate-react-page-props.ts:1083–:1084 ("which reads its record from a record page's context; a kind:'react' page mounts none, so the block renders empty"). The fix: line matches :1085 (Instead: ${REACT_RECORD_BLOCK_ALTERNATIVES[...]}). The rule: line carries the os explain pointer slices 11–21 added. The block was taken from a real os validate run on a planted page, with the restore proven by blob hash. |
| Cross-lane | content/docs/ui/react-pages.mdx is domain:devx's. The declaration is in the PR body, and the seat posts the seat-post note to #6023 in this act. |
| Out of scope | Both Acceptance notes. The neighbouring react-prop-missing-required transcript (:402–:407) prints pages[27] where main now prints pages[28]; the misleading test says that does not mislead, since it is one stale index in an elided example. The 200-character bound is measured over fixtures and the showcase, and long names can pass it. |
| Landing | After every check on this head is green: pr_ready then automerge_enable. The merge closes #22161. |
Generated by Claude Code
This was referenced Oct 18, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #22161
Clause-②: no
The close-out slice of the card. It does two things. It takes the census the close condition asks for, as a reading on
main. It also re-takes the one stale docs transcript that slice 15's landing (6136999237) carried to this slice. The census reads 0 author-timepackages/lintids firing a hint orfix:over 200 characters, so this PR closes the card. Thedomain:clihalf is a separate card: #22841 remains open, and nothing here touches it.Claim:
6248840553. It is the newestClaim:on the card and it names this branch. I checked that before any edit.Cross-lane declaration:
content/docs/ui/react-pages.mdxbelongs todomain:devxby the domain table. This one transcript block is carried here by triage6109231286and slice 15's landing6136999237. Nothing else incontent/docs/**is touched.The close condition, read on
mainThe condition (triage
6219576699): "no author-timepackages/lintid fires a hint orfix:over 200 characters, item 3's slice has landed, and the close-out slice's carries are done." Item 3's slices 11–21 have landed; slice 21 landed as9c74d4098d. The carries are the transcript below and this census.All readings are on
mainat21070a2f0(this branch's base), inobjectstack-ai/objectstack.mainthen moved to30da04f8e, and the branch merges it. None of those 3 commits touchespackages/lint,packages/cli,packages/formula,packages/sdui-parserorpackages/spec/src:git diff --quiet 21070a2f0 HEADover those paths exits 0. So the reading also holds at this PR's head.Instrument 1: a fire census over the whole lint suite. It is a copy of slice 21's preload.
Array.prototypepush / unshift / map / filter / forEach / find / findIndex / some / every / flatMap / concat / slice hooks record every finding-shaped object the suite handles: a stringruleandmessage, plushint,fix,where,pathandseverity. My copy drops slice 21's "must carry a hint" filter, so it also counts ids that fire without one. It runs as scratch tooling and is never committed.packages/lint, 144 files / 6857 tests passed, VERDICT 0 (verify lock, slotissue-22161-co). That gives 4379 distinct finding rows.fix:string. One of those isexpression-invalid's empty hint, which is by design: the CLI prints nofix:line for it.relationship/missing-referencecarries none.lint-startup-registry-verdict.ts:startup-open-vocabulary-verdict972,startup-verdict-assertive-wording972 andstartup-source-unparseable254.functional-completeness.tsids, which the lint suite runs). The longest hint is 200, fromapproval-approvers-may-resolve-empty(GROUP_ONLY_FIX). Next come 199 (sharing-rule-unlowerable-condition,semantic-role-field-unprovisioned), 198 (flow-bare-dollar-reference,filter-preset-comparand) and 197 (rls-predicate-over-budget). No hint has a line break.react-block-needs-record-context(5 distinct hints, longest 195) and the card's ownfield-no-consumers(16 distinct, longest 175). The instrument also records over-200 text when it fires: the 3 repo-gate ids are recorded at 972 / 972 / 254. Slice 21's preload, unmodified, reads the same suite as 4376 rows / 239 ids with the same 3 over 200. My copy adds exactly the 3 hint-lessrelationship/missing-referencerows.Instrument 2: a static floor over the source. It is a TypeScript AST walk of every
hint:/fix:property inpackages/lint/src's 97 non-test files. For each site it counts the characters the source fixes, whatever the fixture: string literals, template heads and spans,+chains, and same-file string constants. Calls and parameters count 0, so each reading is a floor.lint-startup-registry-verdict.ts:743and:769, the two 972-character repo-gate hints.GROUP_ONLY_FIXreads 200 in both.Census-invisible ids (exported or named, never fired by the suite). I enumerated the ids statically: the values at every
rule:position (literals, and identifiers resolved to string constants) together with every exported id-shaped string constant. That gives 249 ids, of which 233 fire. The 7jsx-*ids also fire, through the one template-literal id site (validate-jsx-pages.ts:66). The 16 that do not fire:packages/cli's, notpackages/lint's.packages/lintholds only theirRULE_EXPLANATIONSentries; the ids are emitted inpackages/cli(utils/collect-docs.ts,lint/hook-body-lowering.ts,utils/picklist-references.ts). They aredocs/duplicate-name,docs/frontmatter-tags,docs/nav-target,docs/uncollected-directory,hook-body/bundled-fallback,hook-body/extraction-failed,hook-body/not-lowerable,hook-body/unparseableandpicklist-reference-unverified. They are thedomain:clihalf.packages/spec:view/row-color-unresolvable-value(functional-completeness.ts). Itsfix:is 59 fixed characters plus the field name.condition. It is an alias-map value quoted in a comment invalidate-expressions.ts.packages/lintids the suite never fires, read from source:authoring-rule-threw(runtime-gate.ts): a fully static hint of 131 characters.relationship/association-inline-edit: a staticfix:of 54.rollup/missing-summary: afix:of 27 fixed characters plus the child object and field names.chart-config-missing: no emit site. The id is kept sosuppressWarningsentries keep parsing.react-prop-deprecated: the hint is the react-blocks contract's own deprecationnote. Onmainthe contract (REACT_BLOCKS, 4 blocks) declares 0 deprecated interactions, so the id cannot fire. Its sibling's notes (REACT_RETIRED_OVERLAY_PROPS, 2 entries) are at most 129.At the public door.
os validateonexamples/app-showcase, unmodified, built CLI at21070a2f0: exit 0,Running author-time rules (49), 64 warnings, 64fix:lines from 5 rule ids. The longest are 200 (approval-approvers-may-resolve-empty) and 199 (field-no-consumers).The transcript
content/docs/ui/react-pages.mdx, in therecord:*-blocks section, holds the bare fence at:360–:365. Three of its four lines no longer matched what the rule prints:fix:line: it now opens withInstead:and no longer says "On a react page bind the record yourself:" (slice 15's one-line shape);rule:line: the path ispages[28].source(it waspages[27]), and the line now carries the pointer "os explain react-block-needs-record-contextfor why a record block renders empty on a react page".How it was taken: from a real run, not by hand. I built the showcase's dependency closure (
turbo run build --filter=@objectstack/example-showcase^..., 63 tasks, VERDICT 0). Then I planted RecordHighlights on the showcase renewals page, the page this transcript has always been taken from. The plant swapped the view-mode ObjectForm forRecordHighlights objectName="showcase_account" recordId={sel}, throughscripts/ablation-replace.mjsin wrap mode. That mode checks that the anchor hits exactly once and that the blob changed, and it restores by absolute path. Then I rannode ../../packages/cli/bin/run.js validatefromexamples/app-showcase. The run exited 1 withAuthor-time rules failed (1 issue). The four lines from✗throughrule:were copied byte for byte out of that log into the fence, by a script that asserts each line's prefix. The page restore is proven: blobfd28f319b1equalsHEAD's,git diff HEADis empty and the status is clean.My first attempt was a no-op. Its replacement contained the anchor text, so
ablation-replacerefused (anchor count 1 → 1), the command never ran, and the page was restored. The second attempt used the anchor above.The fence, its language-less info string and the surrounding prose are unchanged.
pnpm check:docs-transcript-driftis not this block's judge. Its header pins only the registry-derived author-time rule count, in blocks declaredtranscript=KIND. This block is a bare fence, and itsAuthor-time rules failed (1 issue)is a different sentence the gate deliberately does not match.--listshows 4 declared values across 417 pages, allok(49 = 49), and none is this block. The edited page compiles through@mdx-js/mdx.Verification
Final head
609c99c07(this branch's commiteb0e3b839plus a clean merge oforigin/main30da04f8e). Exit codes were captured before any pipe.node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack, no paths, at609c99c07: 40 families over 1 path since merge base30da04f8e. That is identical to the PM's derivation. All 40 were run one by one and all exit 0.check:skill-examplesfirst exited 3 (PREREQUISITE NOT MET:packages/client-reactwas unbuilt), so it measured nothing. I built that package directly and re-ran the gate: 262 marked examples type-check, exit 0.--ran: "40 derived, 40 run, 0 NOT-MEASURED, 0 UNRUN", exit 0.check:dev-prereqsandcheck:skill-frame-freshness, since the diff touches neither apackages/specbuild input nor the four-axis frame files. Nor is any package test or typecheck, since the diff touches no package.grep -naPover the changed file and this body finds nothing (exit 1).Acceptance notes
react-prop-missing-requiredblock at:402–:407saysat pages[27].source. The same planted-run method (ObjectChart'sobjectNameremoved on the renewals page) printspages[28].source. Its verdict,fix:andrule:lines are otherwise byte-identical to the page. The block is outside this claim's file surface, which names the record-context block only, so it is left as written. A one-token docs edit takes it. Not filed: it is index drift in an elided example, and no defect class applies.field-no-consumersprints 199 on the showcase, against 175 in the suite, because its line quotes the first carrier path. A longer object or field name pushes it past 200. The static floor names 10 author-time sites whose fixed text is 150–200 and which interpolate. The highest isfield-group-shadowedat 192.os explainwas not run. This slice changes no explanation.Generated by Claude Code