Repository navigation
docs(spec): record:related_list's parentDataSource is described as rendered - #24578
Conversation
…ered The console pin carries objectui's parentDataSource reader, so the describe drops its PLANNED marker, the TSDoc names the read points, and the liveness note's PLANNED sentence becomes a LIVE record. Claude-Session: https://claude.ai/code/session_019oFY6Hi35J7atvgVFnmoaK Co-authored-by: Claude <noreply@anthropic.com>
…ource describe Claude-Session: https://claude.ai/code/session_019oFY6Hi35J7atvgVFnmoaK Co-authored-by: Claude <noreply@anthropic.com>
…rent-data-source-live
📓 Docs Drift CheckThis PR changes 1 package(s): 1 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:
⛔ 2 release-owned page(s) also name something this change touched. These are read-only:
What this run could not see
Coarse fallback — 143 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 d7e482efbdca3cdb6ea0ce99e529c1f9cb2aa6a7 && git checkout d7e482efbdca3cdb6ea0ce99e529c1f9cb2aa6a7
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin ba4afcc2391922a86678bf5e47b1a0e4d2c87ff1 53624a10cfb6f28c2b4de4c50df1bde17a404fbd && git checkout -B drift-repro ba4afcc2391922a86678bf5e47b1a0e4d2c87ff1 && git merge --no-ff 53624a10cfb6f28c2b4de4c50df1bde17a404fbd
node scripts/docs-audit/affected-docs.mjs --json ba4afcc2391922a86678bf5e47b1a0e4d2c87ff1
|
席位核对 (seat check) · PR #24578 ·
|
| item | reading |
|---|---|
| Shape | Draft, base main, assignee zhuangjianguo. Line 1 is Fixes #23585. Clause-②: no starts a line. 5 files, +49 / −17. Not governed. The changeset is patch on @objectstack/spec. |
| The change | parentDataSource's describe drops [PLANNED — not yet rendered] and is otherwise unchanged. Its TSDoc names the console's read points with the objectui: realm mark. liveness/page.json's _note sentence becomes a live record, and the regions row's read-point entry drops its (PLANNED) tag. The pin (case E) is re-trued to assert no planned marker, with a control. component.mdx is regenerated. No accept set moves. |
| Premises | P1 true: objectui d81e46043 is an ancestor of this repository's .objectui-sha (4016370af3) and of objectui main, and every describe clause kept is read at that pin. P2 true: the marker and the note were present. P3: two other texts say "Planned, not yet rendered", the released .changeset/pre/23134-… and CHANGELOG.md:2200. Both are release-owned and true when released, so they are left alone. |
| Seat re-read | Deviation (2) rewrites the docblock clause "that arm is still unrendered" about dataSource's api arm. The seat checked it in this act: objectui c4dd7078ed (the API binding's renderer) is an ancestor of the .objectui-sha pin, so the old clause was false, and the rewrite claims no rendering of its own. |
| Pins and gates | Pin file: 18 passed. Re-planting the marker turns exactly case E red. Full spec suite: 701 files passed. The 111 derived gate commands all exit 0, including check:liveness and check:generated. |
| CI | On this head at this act: 38 runs, 18 success, 5 skipped, 15 in progress, 0 failure. Landing waits for green. |
| Accepted deviations | (1) The regions-row read-point entry tagged parentDataSource (PLANNED) is the ledger's one evidence entry for the key, which keeps no row of its own, so it was inside the claim's "status, evidence" item. (3) The main merge 53624a10cf touches objectql and service-automation only. (4) and (5) carry no contract effect. |
| Findings | Both are noted, not filed. The two emptyState markers (component.zod.ts about :1170 and :1175) are still true: no emptyState reader at the pin. Their carrier is objectui#12932. The released changelog texts are release-owned. |
| Landing | After a contract-review PASS and a green head: pr_ready then automerge_enable. Fixes #23585 closes the card. |
Generated by Claude Code
Contract reviewServed-tier: Inputs: card #23585 (body and all six comments, the ① Derived judgmentsD1 — the describe: only the marker left. Byte comparison of the D2 — every describe clause is true at the pin. Each clause, with the code that honours it:
No clause is one the pinned renderer does not honour (Prime Directive #10): none to name. Two nuances, named and not findings: with a named D3 — the rewritten D4 — the ledger D5 — the regions-row read-point entry [10] (dev deviation 1). Base: D6 — pin E re-true. D7 — generated reference. D8 — card criterion on the head. ② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
|
Contract review adopted ·
Generated by Claude Code |
Fixes #23585
Clause-②: no
record:related_list'sparentDataSourceis rendered by the console at its pin, and@objectstack/specnow says so. Before this change, the key's describe opened with[PLANNED — not yet rendered], its TSDoc said no renderer reads it, and the liveness_noterecorded it as planned. All three told an author, an AI author first, not to use a binding the console renders. The change is describe, TSDoc and ledger text only:RecordRelatedListPropsaccepts exactly what it accepted before, no key is added, and every refusal keeps its issuecodeandpath.The new describe, verbatim
Only the marker left. Every sentence after it holds at the pin (P1 below), so no sentence was added or removed.
P1 — the pin carries the renderer, and the renderer does what each clause says
.objectui-shaonorigin/mainis4016370af3c9c9dafec2bc5299afd8e8079701b8. In../objectui,git merge-base --is-ancestor d81e46043 4016370af3c9exits 0, andgit merge-base --is-ancestor d81e46043 fe11eb12e5(objectuiorigin/main) exits 0. An exit 0 proves itself, so no control leg is owed.git diff --stat 4016370af3 fe11eb12e5over the two renderer files prints nothing: objectuimainreads the key the same way.scripts/sdui-manifest.record.jsonrecordsobjectuiSha4016370af3…, andsdui.manifest.jsonlistsparentDataSourceas an input ofrecord:related_list. The console this repository builds is built from that pin.git show 4016370af3:PATHin../objectui. R ispackages/plugin-detail/src/renderers/.R record-related-list.tsx:810const parentBinding = schema?.parentDataSource;, handed toParentRecordBindingat:814–:824.sortis the parent.R recordBinding.tsx:429const params: QueryParams = { $top: 1 };and:431if (sortKey) params.$orderby = JSON.parse(sortKey);. The row is read throughuseResolvedDataSource(:384), the page's own adapter, so under the caller's identity (module doc:45–:46).R recordBinding.tsx:475: whenabsentis given and the settled read has no row,BoundRecordProviderreturnsabsentin place of its children. The related list passesabsent={NoParentRecord …}atR record-related-list.tsx:821, andNoParentRecord(:772–:786) draws arole="status"notice. The absence replaces the children, so no child query is sent. A read the server refuses as forbidden reads the same as no row (R recordBinding.tsx:449).relationshipValueFieldis read on that row.R record-related-list.tsx:259–:263reads it on the record context (ctx?.recordId, orctx?.data[relationshipValueField]).BoundRecordProviderprovides the bound row as that context.R recordBinding.tsx:274: whenisElementDataSourceConfig(binding)is false (no binding),ParentRecordBindingreturns its children as they are, so the record page's record context still reaches the list.dataSourceis still the CHILD rows.R record-related-list.tsx:724–:729mapscolumns,filter,sortandlimitonto the list. The parent gate is given the parent binding alone (R recordBinding.tsx,ParentRecordBindingdocblock).R __tests__/record-related-list.parentDataSource-12294.test.tsx, carries a case for each clause: first row bysort,relationshipValueFieldon the bound row, no row is the absence with no child query, 403 is the same absence, noparentDataSourcekeeps the page record, and the registration publishes the input.No describe clause is untrue at the pin, so the prohibition does not apply.
P2 — the marker and the note were present on
origin/main5b14b7f3adcomponent.zod.ts:1743(docblock) and:1747(describe) carried[PLANNED — not yet rendered].liveness/page.json:3's_notecarried thePLANNED RECORD (#23134 …)sentence.The card's criterion, on this head:
git grep -n "PLANNED — not yet rendered" -- packages/spec/src/ui/component.zod.tsnames:1170and:1175only, both on theemptyStatedescription (out of scope, G4).git grep -c "PLANNED RECORD (#23134" -- packages/spec/liveness/page.jsonanswers nothing (exit 1).P3 — every text here that called
parentDataSourceplanned, unread or not renderedMeasured with
git grep -n parentDataSourceandgit grep -n "not yet rendered"over the whole tree.Rewritten here:
packages/spec/src/ui/component.zod.ts, the describe: the marker is gone.objectui:realm marker and the pin. The same docblock said theapiarm ofdataSource"is still unrendered". That is false since objectuic4dd7078ed(recorded in this ledger's_note), so the clause now says why the key takes the object binding only: it is the shape the sibling blocks read, and the shape objectui's parent read takes (isElementDataSourceConfigasks the binding for anobject).packages/spec/liveness/page.json,_note: thePLANNED RECORD (#23134 …)sentence is aLIVE RECORD, in the form theElementApiDataSourcerecord took when its renderer shipped. It cites the pin and each objectui path with theobjectui:realm marker.regionsrow's component-member read-point list, entry [10]:record:related_list.parentDataSource (PLANNED)pointed at the old measurement (objectui@f0532d8a, "the record context read"). It now lists the read points at@4016370af3c9in the list's ownobjectui @SHA FILE#SYMBOLspelling. The ledger keeps noparentDataSourcerow; this entry is its one piece ofparentDataSourceevidence, so I read it as inside the claim's "theparentDataSourcerow's status, evidence" item. Named here so a reviewer can disagree.content/docs/references/ui/component.mdx:1971, regenerated bygen:docs.packages/spec/src/ui/component-record-related-list-parent-23134.test.ts, pin E: it asserted the describe opens with the marker. Re-trued, not deleted: it now asserts thatcheck-liveness's planned matcher (MARKER_RE.planned, copied with its source named) reads nothing in the describe, with a DARK case showing the same matcher catches the replaced marker.Named, not edited:
.changeset/pre/23134-related-list-parent-data-source.md:13andpackages/spec/CHANGELOG.md:2200("Planned, not yet rendered"). Both are the consumed changeset and the released entry for4cc3ff9. They were true when that release was cut, so they are not factual errors, and both are release-owned.content/docs/**(hand-written) andskills/**: no hit forparentDataSource.G1–G4
parentDataSourcerow, so there is no row status to move and no author warning. The liveness record is the_note(item 3) and the evidence entry (item 4).pnpm --filter @objectstack/spec run check:livenessexits 0 (in the gate run below).pnpm --filter @objectstack/spec build, thencheck:generatednamed one stale artifact,content/docs/references/**.gen:docsrewrotecomponent.mdx:1971(1 line). A secondcheck:generated: "All 14 generated artifacts are up to date".authorable-surface.base.jsondid not move..changeset/23585-related-list-parent-data-source-rendered.md,patchon@objectstack/spec,Clause-②: no.main,git grep -n emptyState -- packages/plugin-detail/srcoutside tests answers nothing. The renderer for the:1170/:1175emptyStatemarkers (objectui#12932) has not shipped, so those markers are still true.Tests
pnpm --filter @objectstack/spec teston131a5615e9: 701 files passed, 21312 tests passed, 1 todo.pnpm --filter @objectstack/spec typecheckon131a5615e9: exit 0;check:test-typecheckOK.scripts/ablation-replace.mjsput the marker back into the describe (anchor 1 → 0, blob2d039146d858→d8a66adf1db4). The pin file then failed in the expected direction: 1 failed, 17 passed, the failure being E's "no planned marker" case. The tool restored the file: blob equal to HEAD,git diff HEADempty.origin/main(04669a467e,packages/objectqlandpackages/services/service-automationonly) touches no package this diff touches, so the spec suite was not re-run on the merge commit.Gates
Run on the final head,
git rev-parse --short HEAD=53624a10cf.node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack(no paths; change set from the merge base04669a467) derives 111 commands from the 5 changed paths. Each ran with its exit code captured before any pipe: 111 of 111 exit 0.--ranon that record: "111 derived, 111 run, 0 NOT-MEASURED, 0 UNRUN".131a5615e9recorded six PREREQUISITE NOT MET (exit 3): the two@objectstack/lintdoc gates,check:skill-examples,check:docs-transcript-drift,check:dual-build-cjs-loadsandcheck:lean-entry-closure. After the@objectstack/lintand@objectstack/objectqlclosures were built, all six measured on53624a10cfand exit 0. That earlier run is not the reading; the one above is.53624a10cf:check:generated"All 14 generated artifacts are up to date";check:docs"227 generated files in sync with packages/spec";check:livenessexit 0 ("1038 live · 1 experimental · 1 live-elsewhere · 112 dead · 23 planned = 1175 classified");check:nul-bytesOK;check:authorable-surfaceexit 0.pnpm check:dev-prereqsexit 0.Acceptance notes
emptyStatemarkers incomponent.zod.ts(:1170,:1175) stay. Their renderer has not shipped (G4).4cc3ff9text that calls the key planned stays as released (P3, "Named, not edited").Generated by Claude Code