Repository navigation
fix(spec): page.print and the flow terminal-toast translations read live in the liveness ledger, so a print page is no longer warned that nothing applies it - #23776
Conversation
…ive in the liveness ledger, at the console pin that applies them Claude-Session: https://claude.ai/code/session_01QVkaSahaBPN9mkBRwLJ44o Co-authored-by: Claude <noreply@anthropic.com>
…nts, and add the changeset Claude-Session: https://claude.ai/code/session_01QVkaSahaBPN9mkBRwLJ44o Co-authored-by: Claude <noreply@anthropic.com>
…in row, now that page.print is live Claude-Session: https://claude.ai/code/session_01QVkaSahaBPN9mkBRwLJ44o Co-authored-by: Claude <noreply@anthropic.com>
…ed row, now that no shipped row opts in Claude-Session: https://claude.ai/code/session_01QVkaSahaBPN9mkBRwLJ44o Co-authored-by: Claude <noreply@anthropic.com>
📓 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:
What this run could not see
Coarse fallback — 142 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 d74cabceb4abe406dd6bac40a9b6705c5676dfc6 && git checkout d74cabceb4abe406dd6bac40a9b6705c5676dfc6
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin d3df3ba24bbbb280d138d98fed7af5fe05f4a9ce dba62c578e8b21a72d208be6f23cc9cca6bbb210 && git checkout -B drift-repro d3df3ba24bbbb280d138d98fed7af5fe05f4a9ce && git merge --no-ff dba62c578e8b21a72d208be6f23cc9cca6bbb210
node scripts/docs-audit/affected-docs.mjs --json d3df3ba24bbbb280d138d98fed7af5fe05f4a9ce
|
席位核对 — ACCEPT · objectstack
|
…veness-print-flow-messages
Claude-Session: https://claude.ai/code/session_01QVkaSahaBPN9mkBRwLJ44o Co-authored-by: Claude <noreply@anthropic.com>
…daeb77fc84dd, where both readers are byte-identical Claude-Session: https://claude.ai/code/session_01QVkaSahaBPN9mkBRwLJ44o Co-authored-by: Claude <noreply@anthropic.com>
席位核对 — ACCEPT (delta) · objectstack
|
Fixes #23710
Clause-②: no
The console at the
.objectui-shapin (f96f771140f1) prints a page that declaresprintand shows the translated flow terminal toasts. The liveness ledger still graded bothplanned, solintLivenessPropertiestold every author of a print page that printing it prints the screen layout. This PR flips those verdicts tolive, citing each objectui reader at the pin, dropsprint'sauthorWarn, and rewritesPagePrintSchema's describes, which said "until it ships, nothing applies it". The accept set does not change. TheparentDataSourceleg stays with #23585.Evidence per flipped verdict (objectui re-read at
f96f771140f1, the pin this lands against)Each reader's landing commit is an ancestor of the pin:
git merge-base --is-ancestor 2312bd9a6 f96f771140f1gives exit 0 (objectui#11958), andgit merge-base --is-ancestor 42d8e8db6 f96f771140f1gives exit 0 (objectui#12075). Both were read in a full, non-shallow objectui clone.page.jsonprops.print: 13 rows, all read, all flipped. That is the container, its 8 keys, and the 4marginssides. The card counted 12 children, becausemarginsis both a key and a container. No row staysplanned.print(container)packages/components/src/renderers/layout/page.tsx#PageRenderermountsbuildPagePrintStylesheet(print)as astyleelement, only whenschema.printis an object, and stamps the page root withPRINT_PAGE_ATTRIBUTE. The refusals stay cited as before: the spec'scheckPagePrintCompositionand lint'svalidatePrintPageBlocks.paperSize,orientationpage-print.ts#buildPagePrintStylesheetwrites@page { size }throughpageRule, and only for an enum member.marginsandmargins.top/.right/.bottom/.leftpageRulewrites onemargin-SIDE: Nmmfor each declared finite, non-negative side.pageNumberspageRulewrites the@bottom-rightmargin box withcounter(page)/counter(pages).repeatHeader,repeatFooterpage.tsx#RunningRegionsputs the region in a realthead/tfoot.runningRegionRulesturns that table back into a table on paper.repeatTableHeadersthead { display: table-header-group }, ortable-row-groupwhen the key isfalse.avoidBreakInsidebreak-inside: avoidon every block of a region.translation.jsonflows.successMessage/flows.errorMessage.packages/app-shell/src/utils/flowResponse.ts#translatedFlowMessagecalls the spec'stranslateFlowforflows.FLOW.KEYand falls back to the served string.interpretFlowResponse(the terminal-success arm) andflowFailureMessagecall it.views/FlowRunner.tsx#FlowRunnerpasses the run's flow name and bundle. The spec-side evidence in each row is unchanged.authorWarn/authorHintare dropped fromprintin the same edit, becausecheck:livenessrefuses them on aliverow. With that, no shipped ledger row opts intoauthorWarnany more:printwas the last one.Describes (
packages/spec/src/ui/page.zod.ts)Only text changed: the 8 key describes,
PageSchema.print's describe, thePagePrintSchemadocblock, theprintproperty's docblock, and the section comment above the printable subset. Each one now names the console's browser print rendering as the consumer that applies the key. The server-side PDF renderer (card ③) is still "to follow". No schema shape, enum, alias or refinement was touched.check:authorable-surfaceis in the gate run below.Pins
packages/lint/src/lint-liveness-properties.test.tsos lint/os validatecrash on any stack whose mapping authorsconnectorSource: the ledger row islivewithauthorWarn: true, and the liveness rule throws its integrity sentinel #21127 control usedpage.printas its "warnedplannedrow". A new#23710block pins the issue's criterion on the real ledger: a page declaringprintgets noliveness-planned-property. The anti-vacuity check is that the same call still raises theexternalSharingModeldead row.plannedrow still warns" control now uses the planted translation group that the file already uses for exactly this shape.print. The line is removed, and its comment now says that both opt-in classes are held by the SYNTHETIC case right below it.packages/spec/scripts/liveness/check-liveness.test.ts: the census control asserted that the shipped walk reaches at least one warned row, which wasprint. The reach is now proved on a copy with one shippedplannedrow markedauthorWarn: the gate stays green and the census counts exactly one more row.Generated
content/docs/references/ui/page.mdx,liveness/state-counts/page.md(planned 11 → 0) andliveness/state-counts/translation.md(planned 2 → 0) were regenerated withgen:docsandgen:liveness-counts. Those are the two thatcheck:generatedproved stale. Nothing was hand-written in them.Verification (head
6375c0cb15)pnpm --filter @objectstack/spec test: 679 files, 20,756 passed, 1 todo, exit 0. Run underos-verify-lockon head6375c0cb15.pnpm --filter @objectstack/lint test: 139 files, 6,767 passed, 5 skipped, exit 0. Run ond03703eb. The lint package has not changed since; the only later commit edits a spec script test.typecheckexit 0 for@objectstack/lint(tsc --noEmit+check:test-typecheck) and@objectstack/spec(tsc --noEmit+check:scripts-typecheck+check:test-typecheck).check:generatedon the built spec: the first run named exactly two stale artifacts (content/docs/references/**,liveness/state-counts/), both regenerated. It is in the derived run below at exit 0.node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack(no paths) gives 110 commands. Each was run with its exit code captured before any pipe, on head6375c0cb15after a full workspace build: 110 exit 0. The--ranreconciliation over theCOMMAND :: exit Nrecord reports "110 derived, 110 run, 0 NOT-MEASURED, 0 UNRUN (a DERIVED zero)". An earlier pass on9c9f0a3ereturned 7PREREQUISITE NOT METexit 3s (unbuiltdist/and a shallow clone). Those are not measurements; they cleared aftergit fetch --unshallowand the build.check:dev-prereqsexit 0,check:skill-frame-freshnessexit 0.dispatch-gateslists outside the derived total).lint-liveness-properties.test.tshint-leak pin, "expected 0 to be greater than 0";check-liveness.test.tscensus, "a walk reaching zero warned rows is a degraded walk"). Both were re-anchored as described above. I rewrote theprintcontrol before running it against the new ledger, so its red was not observed.Acceptance notes
packages/spec/liveness/README.md: thepageandtranslationprose cells described the old verdicts, so I updated them. These two cells are outside the claim's listed file surface, but leaving them would keep a published statement this PR makes false.packages/spec/scripts/liveness/check-liveness.test.tsis outside the listed surface for the same reason: its pin asserted the old census..changeset/pre/22158-print-page-spec.mdstill says nothing appliesprint. That file is pre-mode release state, so this PR leaves it alone.check-liveness.mtshas a comment recording an old count ("3 opt in withauthorWarn"). It is a dated measurement, not a claim about the current tree, and is left as is.page.zod.tsandliveness/page.jsonand also regeneratespage.mdx. It was not onmainwhen this was pushed, so whichever lands second mergesmainand regenerates throughscripts/pm/os-regen-merge.sh, keeping both changes.@objectstack/specpatch. The ledger (files[]includesliveness) and the describes ship in the package, and@objectstack/lintreads the ledger from it.@objectstack/lint's published code is unchanged; only its tests changed.Generated by Claude Code