Repository navigation
fix(spec): the page-template-closed-region-unplaced-refused entry says what the console shows for a stored row - #24215
Conversation
…s what the console shows for a stored row The entry's reason said a page row stored with an unregistered template or an unplaced region "renders as before". The console that ships with 18 draws a refusal in its place instead: an unregistered template draws no layout, only a refusal naming it and the registered templates; on a default, header-sidebar-main or three-column page an unplaced region is not drawn, and a refusal under main names it and the template's slots. A page that names no template still takes its page type's layout, which stacks such a region under main. acceptanceCriteria is unchanged. Claude-Session: https://claude.ai/code/session_01TyRhWbVbbQpQJTDbW8VahJ Co-authored-by: Claude <noreply@anthropic.com>
…ge-template-entry-reason
📓 Docs Drift CheckNothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 1 changed package(s)), so this run has no opinion about the docs. 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): |
Contract reviewServed-tier: Inputs: card #24195, its body and all three comments (triage 6238135277, Claim 6238361195, os-dev report 6239553860); PR #24215, its body, its file list (2 files, +18/-2) and the net diff against main (merge-base a237d7f); the check-runs on the head. The head had not moved at read time: refs/heads/claude/issue-24195-page-template-entry-reason is fdb41f4. Read at 2026-10-17T19:39Z. ① Derived judgmentsAccept-set and public-surface changes the diff implies: none. The diff replaces the last sentence of one string literal, the Each claim the new sentence makes, read in the cited code:
Judged wrong: nothing. ② Semver levelChangeset ③ Boundary flagsThe dev declared
Implemented-by: VERDICT: PASS Generated by Claude Code |
席位核对 · ACCEPT · PR #24215 @
|
Fixes #24195
Clause-②: no
What changes
packages/spec/src/migrations/entries/semantic/18.page-template-closed-region-unplaced-refused.ts: only the last sentence of the entry'sreason.acceptanceCriteria,surfaceandreplacementare unchanged, and no other entry is touched.Before (published in
@objectstack/spec18.0.0-next.2 and next.3):After:
Plus one changeset,
.changeset/24195-page-template-entry-reason.md(@objectstack/specpatch,Clause-②: no).Why, and where the new wording comes from
The old sentence was true of the console when the entry shipped. objectstack-ai/objectui#12901 (merge commit
044f23193068, objectuimain) removes that fallback, per the maintainer ruling on #23610 (record6190536588, Q2 A: the renderer keeps no fallback for a shape the spec refuses). The new sentence describes what that commit'spackages/components/src/renderers/layout/page.tsxdraws. It was read at044f23193068, andgit diff 044f23193068 origin/mainon that file is empty in objectui today:resolveTemplate: a template nameTEMPLATE_REGISTRYdoes not hold resolves toUnregisteredTemplateRefusal, which replaces the whole layout. Its text: "Not drawn: this page's template is not registered", then the template and the four registered names.DefaultTemplate(throughRegionLayoutwithtemplateset),HeaderSidebarMainTemplateandThreeColumnTemplate: each region outsidePAGE_TEMPLATE_SLOTS[template]is left out of every slot.UnplacedRegionsRefusalis drawn undermain, naming each region and the template's slots.templatetakes thepageTypedispatch (RecordPageLayout/HomePageLayout/AppPageLayout/UtilityPageLayout, all callingRegionLayoutwith notemplate), which still stacks such a region undermain. objectui's own changeset for that PR says the same (.changeset/12476-page-template-slots.md, "Unchanged" paragraph). The spec still refuses that page's save, becausecheckPageRegionPlacementjudges a missing template asdefault. So the card's Expected wording ("the console draws a refusal in its place") holds for a page that names a template, and the last sentence names the exception. Without it, the sentence would be wrong in the other direction for template-less rows.packages/metadata-protocol/src/protocol.ts, the non-view branch after the save-doorsafeParse). No D2 entry rewrites an unregistered name or an unplaced region, and a storedfull-widthrow is rewritten todefaulton read, as the entry's earlier sentence already says.The text names no tracker number, per AGENTS.md's runtime-string rule.
Transition window (not handled here)
objectstack's
.objectui-shareads5e15928b46, 38 commits behind objectui044f23193068.git merge-base --is-ancestor 5e15928b46 044f23193068exits 0, so the pin is older than the change. Until the pin moves to a commit that includes objectstack-ai/objectui#12901, the console this repo serves still lays an unplaced region out undermain, and still lays an unregistered template out as the page type's layout. The new text describes the console the upgrade guide is written for. This PR does not touch.objectui-sha: the pin bump is a single-claim path and belongs to another card.Generated artifacts
None is committed for this text. The upgrade guide is generated at publish and at docs build into gitignored paths.
packages/spec/src/migrations/registry.tsis gitignored and was regenerated by the build.pnpm --filter @objectstack/spec check:generatedexits 0, with all 14 artifacts up to date. A scratch render (tsx scripts/build-upgrade-guide.ts --out SCRATCH_PATH) carries the new sentence, and no copy of "renders as before, while saving it again" is left in it.Tests and gates (head
fdb41f468, which mergesorigin/maina237d7f49)pnpm --filter @objectstack/spec build(under the verify lock), before and after the merge:VERDICT command-exit 0.check:generatedexits 0 at both heads.pnpm --filter @objectstack/spec testonfdb41f468: 691 files, 20962 passed, 1 todo,SPEC_TEST_EXIT=0. The pre-merge heade402d82e7read the same counts.pnpm --filter @objectstack/spec typecheckonfdb41f468:SPEC_TYPECHECK_EXIT=0.git grep "renders as before, while saving it again"finds only the entry), so no pin moved and none was added. This is prose, and no consumer parses it.node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackgave 81 commands. Each was run onfdb41f468with its exit code captured before any pipe, and the record was reconciled with--ran: "81 derived famil(ies) accounted for — 80 run, 1 NOT-MEASURED". The one NOT MEASURED ispnpm check:dual-build-cjs-loads, which exited 3 (PREREQUISITE NOT MET). It loads every workspace package's builtdist/, so it needs a full workspace build. That narrowing is declared here, andLint & Repo Gatesruns the gate in CI.check:doc-formula-expressionsandcheck:lean-entry-closurerefused until the@objectstack/formula,@objectstack/lintand@objectstack/objectqlclosure was built. Re-run after that build, both exit 0. Gates 27 to 56 were run again because their first pass overlapped that build, which rewrotepackages/spec/dist. All 30 exit 0 on the second pass, and the first-pass readings are discarded as unmeasured, not counted as failures. The last derivation flags a stale tree:origin/mainmoved 3 commits after the merge (rest, service-settings), and the one derivation input that changed isscripts/check-route-envelope.mjs. None of those commits touches this entry.Acceptance notes
packages/spec/CHANGELOG.mdandpackages/objectql/CHANGELOG.md, and the consumed changeset.changeset/pre/23610-page-isdefault-template-slots.md. AGENTS.md sends a factual error in a released entry to a dedicated docs-only PR. It is in the report for the seat.pageTypepath still stacks an unplaced region that the spec judges againstdefault. fix(components): a slotted page template draws only the regions it places, and full-width retires (objectui#12476) objectui#12901 recorded this in its own acceptance notes and left it as is. If objectui later retires that path, this entry's last sentence needs the same kind of edit. Noted here, not filed.Generated by Claude Code