Skip to content

feat(spec)!: delete checkPageComponentViewData; the component-props rule is the one judge of a page component's retired api data binding - #23784

Merged
objectstack-fleet[bot] merged 12 commits into
mainfrom
claude/issue-23447-delete-page-view-data-judge
Oct 16, 2026
Merged

objectstack-fleet[bot] merged 12 commits into
mainfrom
claude/issue-23447-delete-page-view-data-judge

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Oct 16, 2026 •

Copy link
Copy Markdown
Contributor

Fixes #23447
Clause-②: yes

Ruling 6161173492 on #23388, item 6, verbatim:

  1. page: a stored page component's data can still carry the retired view api source — the props gate runs at the CLI doors only, so the runtime save door and boot accept it, and the renderer still sends it with its stored headers #23357's narrow judge proceeds as triaged and does not wait. Once this PR lands, that judge overlaps the general rule and is deleted (one operation, two implementations: the governed side wins), in page: a stored page component's data can still carry the retired view api source — the props gate runs at the CLI doors only, so the runtime save door and boot accept it, and the renderer still sends it with its stored headers #23357's PR if it is still open, else in a one-line follow-up.

PR #23418 (d0c09e47c1) put validateComponentProps on the runtime save door for page writes. This PR deletes the page-parse judge that duplicated it, rewrites the sentences that became false, and re-pins the save door on the props rule.

What changes

  1. The narrow judge is deleted (packages/spec/src/ui/page.zod.ts): checkPageComponentViewData, VIEW_DATA_SOURCE_COMPONENT_TYPES, their docblocks, the .superRefine on PageSchema, and the now-unused ViewDataSchema import. The published export leaves @objectstack/spec/ui; api-surface/ui.json and export-origins/ui.json were regenerated with check:generated --fix (one line each). page-component-view-data.test.ts is deleted, since its subject is gone. Its reach and control cases move to the save-door pins below, which run the real rule. In object-refinement-check-exports.test.ts the judge's fixtures and rows are removed, and absence pins (0 declarations, 0 attachments, not in the barrel) follow the checkListViewPageMount precedent.
  2. Sentences rewritten:
    • the refused-shapes.ts docblocks and COMPONENT_API_BINDING_FATE, with their tests;
    • 18.view-data-api-provider-retired.ts acceptanceCriteria;
    • 18.ui-page-action-row-declarative-update-rules.ts reason;
    • the validate-component-props.ts header ("does not run this rule" at the runtime publish door);
    • the view.zod.ts comment;
    • the PageSchema trailing comment ("five checks" is now four).
  3. The stored-page fate was measured before it was rewritten (table below). The new fate text says what was measured: the page loads and is served with no read diagnostic, and its next save is refused by the props rule.
  4. Pins (packages/metadata-protocol/src/protocol.runtime-authoring-gate.test.ts, new describe after the [Decision] Pages saved through Studio, REST or MCP skip the component-props rule that os validate refuses: cross it to the runtime door, and on what evidence #23388 block). They run the real saveMetaItem / loadMetaFromDb / getMetaItem path:
    • each of object-grid, object-map, object-gantt and object-tree → 422 INVALID_METADATA, rulesRun contains validateComponentProps, one component-props-invalid issue carrying the prescription at pages[0].regions[0].components[0].properties.data.provider, nothing stored;
    • reach: a page:tabs item, a component nested in flex › page:card, and a slot;
    • control: provider: 'object' and provider: 'value' save, one row each;
    • stored page: loadMetaFromDb → loaded: 1, errors: 0, invalid: 0, the page is registered, no metadata_spec_invalid warning, getMetaItem serves it as stored with _diagnostics.valid: true, its next save is refused by the props rule with the row unchanged, and the fixed page saves.
    • The old #23357 block in protocol.save-union-issues.test.ts (a spec-parse custom issue, plus a read-path _diagnostics.valid: false pin, which is now false) is removed.

Each door, before and after (measured)

door before (29c7157af4) after
PageSchema.safeParse / definePage / defineStack refused: custom at regions.0.components.0.properties.data.provider (and at each nested and slot position) accepted: these doors run no lint rule. This is the ruling's expected consequence. No equivalent check was added to spec.
os validate (built CLI, defineStack config) exit 1: defineStack validation failed with the prescription exit 1: component-props-invalid at pages[0].regions[0].components[0].properties.data.provider with the prescription; the control config (provider: 'object') passes, exit 0
os build exit 2: refused inside defineStack exit 1: the same component-props-invalid finding; control exit 0
save door saveMetaItem 422 INVALID_METADATA, failed spec validation, issue code: custom, no rulesRun 422 INVALID_METADATA, failed author-time validation, rule component-props-invalid, rulesRun contains validateComponentProps, nothing stored
boot loadMetaFromDb loaded: 1, errors: 0, invalid: 1, [metadata_spec_invalid] warning loaded: 1, errors: 0, invalid: 0, registered, no warning
read getMetaItem served, _diagnostics.valid: false with the refusal at the component served as stored, _diagnostics.valid: true

Rule-level reach, the same before and after (the probe ran validateComponentProps on 10 page bodies, with identical output on both trees): one finding per binding on all four types, the bare { provider }, a page:tabs item, flex › page:card › component, slots.details and slots.header[0]. No finding on the object and value controls or on a custom type. An object-kanban carrying the binding draws component-props-invalid at properties.data (expected array), which is its own row's verdict, as before.

Merge with main

origin/main 43567a8f (PR #23708, PR #23800 included) was merged in at 4087b452, through scripts/pm/os-regen-merge.sh:

DELIBERATE CORRECTION

File: .changeset/pre/23357-page-component-view-data-api-refused.md, commit 7c25be0a. 18.0.0-next.2 consumed the note, and the 18.0.0 GA entry is compiled from .changeset/pre/ again (release.yml: "On pre exit the GA version consumes them all again"). This PR makes the following sentences false, and each is rewritten in place, measured against this PR's head:

  1. Title: "the page parse refuses …" → "a page component's data prop that names the retired view-level api data source is refused at the Studio, REST and MCP save door as os validate refuses it".
  2. BREAKING paragraph: "is now refused by PageSchema" and "the component-props gate … runs at the CLI doors only" → the props gate (validateComponentProps, rule component-props-invalid) refuses it at os validate, os build, os lint and the metadata save door. The CLI-only fact now reads as history: "before 18".
  3. Judge paragraph: "raised by the page parse unchanged (… code is custom …)" → the props row parses data with ViewDataSchema, and the finding carries that schema's prescription. The row-array types are refused for their shape, not with this prescription. The checkPageComponentViewData … re-attach sentence is deleted.
  4. FROM → TO header: "(accepted by the page parse until this change)" → "(saved by the Studio, REST and MCP door before 18)".
  5. "definePage(), defineStack({ pages }) … refuse the page" → os validate / os build / os lint and PUT /api/v1/meta/page/:name refuse it; definePage() and defineStack({ pages }) run no authoring rule and accept it.
  6. Stored page: "registered under [metadata_spec_invalid] with the refusal in the _diagnostics of every read" → served as stored, with no read diagnostic for the binding; the next save is refused with 422 by the props gate. objectui#12325 is now in the console pin, so the sentence changes from "until then a stored page keeps sending it" to "so a stored page does not send the request".
  7. ADR-0087 marker reason: "makes the page parse refuse …" → "the component-props gate refuses what that entry retired at the CLI doors and the save door"; the disposition token itself is unchanged.

Authority: the maintainer's 「同意」, recorded in 6210183493, as applied by 6210987382 (which supersedes 6210952492), with PR #23418's 6203578381 as the precedent. packages/spec/CHANGELOG.md is untouched. Check Changeset reds by design on this edit (check-empty-changeset: DELIBERATE CORRECTION class); it is not a required context and runs only on pull_request.

Verification

  • Final head 7c25be0a (rounds after the merge). dispatch-gates --commands: 90 derived, 89 run, 1 NOT-MEASURED (check:dual-build-cjs-loads, left to CI). 88 exit 0, plus check-empty-changeset exit 1, by design, for the DELIBERATE CORRECTION class. check-adr-0087-registration and check-changeset-no-major exit 0. On 39977e95: spec 682 files / 20873 tests, lint 140 files / 6781, metadata-protocol pin files 170/170, typechecks exit 0. On 40624b32: refused-shapes.test.ts + object-refinement-check-exports.test.ts 284/284, check:generated and check:doc-authoring exit 0. 7c25be0a adds only the changeset text.

  • Round 1 (before the merge):

  • Ablation of the general rule's runtime face: validateComponentProps's entry was set to surfaces: ['cli'] with runtimeTypes removed (through scripts/ablation-replace.mjs). @objectstack/lint was rebuilt, and ablation-dist-preflight found the marker in 4 built files. Result: the 6 refusal pins went red and the control stayed green. On restore, the blob matched the HEAD hash, the rebuild passed --absent with a clean tree, and the whole file is green at 145/145.

  • @objectstack/metadata-protocol: pnpm test, 236 files and 20580 tests passed; pnpm typecheck exit 0.

  • @objectstack/spec: full pnpm test showed one failure (a missed #23357 half in refused-shapes.test.ts), which is fixed. Re-run: refused-shapes.test.ts and object-refinement-check-exports.test.ts 250/250, and pnpm typecheck exit 0.

  • @objectstack/lint: pnpm test, 139 files and 6771 tests passed; pnpm typecheck exit 0.

  • check:generated: 2 artifacts were stale (api-surface, export-origins) and were regenerated; the other 12 were up to date.

  • check:adr-0087-registration: [BREAKING+bang+clause-②-narrowing] not-required (already-registered).

  • The derived gate families (dispatch-gates --commands, 90 commands) were run locally; their results are in the report comment on page: delete checkPageComponentViewData once PR #23418 moves the component-props rule onto the save door — ruling 6161173492 item 6, the follow-up for #23357 #23447.

Acceptance notes


Generated by Claude Code

…t's retired api data binding on the props rule (WIP, red until the narrow judge goes)

Claude-Session: https://claude.ai/code/session_016QpnMQNQ3TQ8mvWiHJwN2j
Co-authored-by: Claude <noreply@anthropic.com>
… one judge of a page component's retired api data binding

Claude-Session: https://claude.ai/code/session_016QpnMQNQ3TQ8mvWiHJwN2j
Co-authored-by: Claude <noreply@anthropic.com>
…ing is gone with the page-parse judge

Claude-Session: https://claude.ai/code/session_016QpnMQNQ3TQ8mvWiHJwN2j
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 16, 2026 •

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 2 package(s): @objectstack/lint, @objectstack/spec, touching 5 documentable anchor(s). ⚠️ 4 changed file(s) yielded no anchor (packages/lint/src/validate-component-props.ts, packages/spec/api-surface/ui.json, packages/spec/export-origins/ui.json, …), so the pages documenting them are NOT COVERED by this run — this is not a clean bill of health for those files.

1 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:

  • content/docs/protocol/objectui/layout-dsl.mdx (via PageSchema (symbol, a top-level const))
What this run could not see
  • 4 changed file(s) yielded no anchor (packages/lint/src/validate-component-props.ts, packages/spec/api-surface/ui.json, packages/spec/export-origins/ui.json, …) — pages documenting those are invisible to this run
  • 1 name(s) were too generic to anchor anything (single lowercase words)
  • the SDK route bridge reached 54 of 206 client-bound route-ledger rows — the other 152 have no registrar path: tail to select them, so pages documenting THEIR client methods cannot appear above, on this or any run. Of those 152: 0 are remediable by widening that discovery convention (an in-repo file declares the path; the convention did not scan it); 55 are structural — on a ledger where NOT ONE row is declared in-repo, so no discovery change reaches them at any price; 97 are undecided (no in-repo declaration, on a ledger that has other in-repo registrars — absence and an unreadable spelling are not distinguishable here). The rows themselves: node scripts/docs-audit/affected-docs.mjs --bridge-coverage
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.
  • a key NAME is not a key, so the hand re-read the line above prescribes can land on the wrong schema. The same spelling is authorable on one governed type and a [REMOVED] tombstone on another for each of active, aria, joins, objects, template, tools and version (censused on [finding] tools is a key on BOTH AgentSchema (tombstoned, dead) and SkillSchema (live, cloud-attested), so a name-based search attributes skill examples to the agent key — it produced a false stop-the-line alarm on PR #19059 #19093 over the liveness ledger's governed types, top-level keys); nothing in a search result distinguishes the two, so a grep hit on a LIVE example reads as evidence about the DEAD key. Measured on fix(spec): the agent.tools liveness row says dead — it claimed live on a key the schema tombstoned #19059: content/docs/ai/agents.mdx was reported as contradicting the agent.tools tombstone over its tools: example at :161, which is inside the defineSkill({ block opened at :155 — the page was already correct. Settle ownership by PARSING the value against both schemas, never by the name: that literal PASSES SkillSchema, and as an AgentSchema it FAILS at tools with the tombstone prescription. ⛔ These names are not the whole class — a key retired through a .strict() guidance map leaves no tombstone in the walked shape and none of them here (tool.category, live as AIToolDefinition.category).

Coarse fallback — 142 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json 0af559e806ec892402c9d7c04e5f003d0a73de78 → packageMentionDocs.

Which tree this was computed on

This run read content/docs from 7e85c2bae22e9a51ee57bf3ff447fdef292af792 — the merge of head 7c25be0a841e7bb997814a2bf83d3b7fb216479f into base 0af559e806ec892402c9d7c04e5f003d0a73de78, which is what actions/checkout gives a pull_request run. Not the PR head.

A worktree cut from an older main holds a different content/docs, so re-deriving there can legitimately return a different list — that is a different tree, not a wrong row. To answer on the same tree:

# while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 7e85c2bae22e9a51ee57bf3ff447fdef292af792 && git checkout 7e85c2bae22e9a51ee57bf3ff447fdef292af792
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 0af559e806ec892402c9d7c04e5f003d0a73de78 7c25be0a841e7bb997814a2bf83d3b7fb216479f && git checkout -B drift-repro 0af559e806ec892402c9d7c04e5f003d0a73de78 && git merge --no-ff 7c25be0a841e7bb997814a2bf83d3b7fb216479f

node scripts/docs-audit/affected-docs.mjs --json 0af559e806ec892402c9d7c04e5f003d0a73de78

⚠️ That checkout carried uncommitted changes, so the commit above does not fully identify what was read.

Advisory only, and a precision-first one (#9192): a page is listed because it names a
symbol, wire route or SDK method this diff touched — not because it mentions a changed
package. Each row says which anchor put it there, so a wrong row is reportable rather than
merely annoying. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs 0af559e806ec892402c9d7c04e5f003d0a73de78 → pass the list as
args.docs, on the commit named under Which tree this was computed on.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 2aaff0348955eb01dfd61512e5494c57905974b5
Local-runs: none

Face: published schema (packages/spec/src/ui/page.zod.ts, view.zod.ts, conversions/refused-shapes.ts, two step-18 entries); no governed path in the 14-file list (Governed Surface Queue Guard success on this head). Ruling executed: 6161173492 on #23388, item 6, verbatim: "Once this PR lands, that judge overlaps the general rule and is deleted (one operation, two implementations: the governed side wins), in #23357's PR if it is still open, else in a one-line follow-up." Landed predecessor: PR #23418 (d0c09e47c1), which put validateComponentProps on the runtime publish door for page writes. Read in this act: the head's net diff over its merge-base 29c7157af4 (14 files, +233/−468, equal to the PR's file list), card #23447 with its three comments, the ruling, PR #23418's body and file list, and the head's check-runs. Nothing built, run or re-run.

① Derived judgments

  1. PageSchema's accept set WIDENS by one shape — RIGHT. checkPageComponentViewData, VIEW_DATA_SOURCE_COMPONENT_TYPES, the .superRefine and the ViewDataSchema import leave page.zod.ts, so PageSchema.safeParse, definePage(), defineStack({ pages }) and the page metadata-type schema now accept an object-grid / object-map / object-gantt / object-tree component whose properties.data.provider is the retired api, at regions, page:tabs items, nested containers and slots. That is the deletion item 6 orders and the card's item 1 names (the .superRefine on PageSchema included). It restores the family's standing contract: the page parse leaves properties an open record and judges no ComponentPropsMap refusal — defineStack never refused an unknown key or a retired prop either; the narrow judge was the one exception, made because the save door did not run the rule.
  2. Door by door, where the general rule takes over — RIGHT at every door the rule reaches:
    • os validate, os build, os lint: the validateComponentProps entry at the head reads commands: ALL, surfaces: CLI_AND_RUNTIME, runtimeTypes: ['page'] (authoring-rules.ts), so each refuses with component-props-invalid carrying the retirement's own prescription (the row's data is ViewDataSchema). The dev measured validate and build; lint follows from commands: ALL.
    • The runtime save door, saveMetaItem (REST PUT /api/v1/meta/page/:name, the Studio, MCP through runtime-authoring-gate.ts; importUnmanagedPackage routes through saveMetaItem too): evaluateRuntimeAuthoringGate runs inside the save path (protocol.ts), 422 INVALID_METADATA, rulesRun names the rule, nothing stored. Pinned on the real path in protocol.runtime-authoring-gate.test.ts for all four types, the reach (a page:tabs item, flex › page:card, a slot) and the object / value control — the card's item 4, both halves.
    • Boot loadMetaFromDb and read getMetaItem: invalid: 1 plus [metadata_spec_invalid] becomes invalid: 0 with no warning; _diagnostics.valid false becomes true, served as stored. RIGHT: ruling item 1 and pin (b) say stored pages keep serving and only the next save is judged; the read diagnostic was a by-product of the deleted parse check, and the pin asserts the next save of that same body is refused and the fixed page saves. This also answers the card's item 3: the boot count is a committed pin now, not a deleted probe.
  3. One door refused before and accepts now with no rule behind it — RIGHT by the ruling, and named in the shipped text. A code-defined stack evaluated by a host that never runs os validate / os build / os lint (os dev, os serve and os start load the config and run no authoring rule; only validate, compile, lint and verify do) threw inside defineStack before and boots and serves the page now. Item 6 chooses the governed implementation, whose doors are the CLI's and the save door's, and every other props-row refusal already behaves this way at that door. The changeset's door table says it in so many words ("accepted (these doors run no lint rule)"), and the retirement entry's acceptanceCriteria now claims exactly the enforced doors (the view parse for a view; the component-props gate at the three CLI doors and the save door for a page component): the claim is as narrow as the enforcement. No shipped page carries the binding (examples/, packages/platform-objects, skills/: 0 hits at the head).
  4. The public surface NARROWS — RIGHT. checkPageComponentViewData leaves @objectstack/spec/ui: api-surface/ui.json and export-origins/ui.json lose one line each (regenerated, not hand-edited), and the barrel absence plus the 0-declaration / 0-attachment pins follow the checkListViewPageMount precedent in object-refinement-check-exports.test.ts ("all four exports"). VIEW_DATA_SOURCE_COMPONENT_TYPES was module-private, so there is no second surface change. objectui at the pin b9814b334d (.objectui-sha): 0 references to either name, so the removal breaks no sibling build.
  5. Deleted tests — RIGHT, with the duplicates named here. page-component-view-data.test.ts: the parse-refusal and walker-loop assertions lose their subject with the judge; the reach and control cases live on at the save door (item 2 above); the two-direction derivation (the four types are exactly the ComponentPropsMap rows whose data refuses with the prescription) survives in refused-shapes.test.ts ("agrees with the refusing door", present at the merge-base and at the head), where the parse-accepts fact is pinned too. The page: a stored page component's data can still carry the retired view api source — the props gate runs at the CLI doors only, so the runtime save door and boot accept it, and the renderer still sends it with its stored headers #23357 block of protocol.save-union-issues.test.ts asserted a parse-union custom issue and _diagnostics.valid: false, both false now; its save-door half is superseded by the new block. The PR body names the save-door pins but not refused-shapes.test.ts as the derivation's home: a nit for the seat's ACCEPT, not a gap.
  6. Rewritten sentences, each read against the head — true: the refused-shapes.ts docblocks and COMPONENT_API_BINDING_FATE (loads, served as stored, no read diagnostic, the console keeps reading it, next save 422 by the props gate; VIEW_API_BINDING_FATE untouched, rightly, since the view parse still refuses a view); 18.view-data-api-provider-retired.ts acceptanceCriteria; 18.ui-page-action-row-declarative-update-rules.ts reason; the validate-component-props.ts header; the view.zod.ts comment; the PageSchema trailing comment. A tree grep at the head finds the deleted names only in the two changesets and the absence pins.

② Semver level

  • .changeset/23447-page-component-view-data-judge-deleted.md: @objectstack/spec: minor with the BREAKING banner, the FROM → TO table, the one-line fix and the measured door table. It matches the diff: a published export removed (BREAKING, shipped as minor under the repo's launch-window convention; no major in pre mode) and an accept-set change on a published schema. RIGHT.
  • The ADR-0087 disposition marker in the changeset body reads not-required (already-registered view-data-api-provider-retired). RIGHT: the retirement is that step-18 entry and this diff deletes a second implementation of its page-component half; Lint & Repo Gates is green on the head.
  • The declaration: the changeset carries the arm, yes (narrowing); the PR body and the claim carry yes with no arm. yes because PageSchema's accept set widens; (narrowing) because the public surface narrows — the widens-one-surface-narrows-another combination clause2-line.mjs defines — and the three carriers agree. RIGHT.
  • @objectstack/lint: patch: the whole lint diff is the file-top comment of validate-component-props.ts, declared text-only by the dev. Over-declared: a lint release with nothing behind it, whose CHANGELOG entry would carry a feat(spec)! BREAKING line about a spec export. Not wrong in effect (Check Changeset green); the seat may drop the lint line at ACCEPT.

③ Boundary flags

Dev deviations (report 6206321093):

  1. CLI probe fixtures committed in ee76df23 and removed in 26c3fee4: the net diff carries none (14 files, no packages/cli/.tmp-23447). Clean.
  2. The dispatch named .changeset/pre/23357-* as a released note. At the head the note sits at .changeset/23357-page-component-view-data-api-refused.md, .changeset/pre/ does not exist, packages/spec/CHANGELOG.md carries no 23357 entry and spec is at 18.0.0-next.1, so it is PENDING, not released. Judged under open question 2 below.
  3. Pins in protocol.runtime-authoring-gate.test.ts rather than protocol.save-union-issues.test.ts: right. The refusal is a rule verdict, not a parse-union issue, that harness carries the boot/read rig, and both files are in the claimed surface.
  4. lint: patch: ② above.

Open question 1, the stale "not parsed on the metadata save or load path" family outside this card's surface: ESCALATED, option A. PR #23418 (d0c09e47c1) made it false, not this deletion, and it is outside the dispatched file surface, so the dev stopped at the fence rightly. Stale at the head, read in this act: THREE shipped reason strings, not one — 18.ui-page-action-row-operation-declared.ts (absent from PR #23418's 36-file list), 18.ui-object-block-grouping-config-typed.ts ("not parsed on the save path") and 18.element-text-variant-heading-subheading-retired.ts (the same, and each names only the three CLI doors); the exportOptions TSDoc in component.zod.ts ("a stored page still saves and loads"), which ships in the .d.ts; eleven step-18 entry code comments; and the stored-shapes table of content/docs/deployment/cli.mdx ("a page still loads and saves"). The shipped strings are upgrade-guide and os migrate meta text, so this is a card, not an acceptance note: one domain:spec follow-up, one mechanical sweep, shipped strings and the .d.ts TSDoc first. The seat files it; this record writes nothing else.

Open question 2, the pending 23357 note: ESCALATED to the seat, with a judgment. On the day it ships beside this PR's note, four of its sentences are false: "is now refused by PageSchema"; "definePage(), defineStack({ pages }) … refuse the page"; a stored page "registered under [metadata_spec_invalid] with the refusal in the _diagnostics of every read"; and "checkPageComponentViewData is exported from @objectstack/spec/ui … so a mirror … can re-attach it". Both notes compile into the same @objectstack/spec release section, and an upgrading agent grepping the tombstoned name lands on the false entry first. The dev's A (leave it) ships that contradiction; the dev's B (a docs-only PR later) is the remedy for a RELEASED entry and would trip the foreign-changeset rule in another PR anyway. The route of record for a pending note a diff makes false is PR #23418's own: amend it in the same PR as a DELIBERATE CORRECTION (check-empty-changeset reds by design, the PR says so, the maintainer confirms in writing; 6203578381 is the precedent). Recommendation: before landing, the dev strikes those sentences in .changeset/23357-*.md in this PR (what stays true is what the 23388 note already states), and the seat obtains the maintainer's word; the alternative, both entries shipping side by side, is the maintainer's to choose, not a seat's. This face is outside the three review faces, so it does not turn the verdict; it is the seat's ACCEPT condition.

Card item 3 (re-measure the stored-page fate before rewriting it): measured before the rewrite and committed as a pin — boot loaded 1 / errors 0 / invalid 0, registered, no metadata_spec_invalid warning; read _diagnostics.valid: true; next save 422 by the props rule; the fixed page saves.

Check-runs on 2aaff034, read at 2026-10-16T02:27Z: all 41 completed, none pending, none red. The five queue-enforced contexts are green — Lint & Repo Gates, TypeScript Type Check, Test Core (and each of its six shards), Build Core, Governed Surface Queue Guard. Also green: Check Changeset, Spec property liveness, Check PR Size, the card-claim and single-writer checks, Dogfood Regression Gate, Check Documentation Links, and every Lint and Type Check lane. Skipped on the PR run, as the full-battery jobs are: Console Pin Gate, Temporal Conformance, Dogfood Verify CLI, the sharded dogfood matrix, Build Docs, Packed-tarball smoke (opt-in). Beyond the check-runs this record vouches for nothing it did not read: the dev's local gate sweep and ablation are the report's, taken at this same head.

Implemented-by: claude/issue-23447-delete-page-view-data-judge
Reviewed-by: session_01LFqdRsuM5nkqoJdHd5ztVk

VERDICT: PASS

This was referenced Oct 16, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Maintainer confirmation: the pending 23357 release note is corrected in this PR (DELIBERATE CORRECTION) · recorded by domain:spec seat 2 (#18549) · session session_01LFqdRsuM5nkqoJdHd5ztVk · 2026-10-16T07:13Z

The maintainer answered 「同意」 in this seat's session. The question had been put to them there at 2026-10-16T02:31Z, and repeated in each round report since. In the seat's words, it was: "correct the pending .changeset/23357-*.md in this PR as a DELIBERATE CORRECTION (#23418's precedent, 6203578381), or let both notes ship". Their answer, verbatim: 「#23784(#23447):同不同意在这个 PR 里直接改正 23357 那条说明 同意」.

What it authorizes. It covers .changeset/23357-page-component-view-data-api-refused.md, which is still pending: packages/spec/CHANGELOG.md carries no 23357 entry. Its four sentences that this PR makes false are struck or rewritten in this PR, per contract review 6206677361, open question 2:

  1. "is now refused by PageSchema".
  2. "definePage(), defineStack({ pages }) … refuse the page".
  3. A stored page "registered under [metadata_spec_invalid] with the refusal in the _diagnostics of every read".
  4. "checkPageComponentViewData is exported from @objectstack/spec/ui … so a mirror … can re-attach it".

Each new sentence is measured against this PR's head. What stays true stays: the FROM → TO table, the one-line fix, and the save door's 422.

The check. Check Changeset reds by design on a foreign-changeset edit. It is not a required context, and it runs only on pull_request, never on merge_group.

Next. A patch round to the dev session session_016QpnMQNQ3TQ8mvWiHJwN2j makes three changes:

The seat then reviews the delta, ACCEPTs, readies the PR and arms auto-merge.


Generated by Claude Code

…lete-page-view-data-judge

# Conflicts:
#	packages/spec/src/ui/object-refinement-check-exports.test.ts
#	packages/spec/src/ui/page.zod.ts
…on the merged tree

Claude-Session: https://claude.ai/code/session_016QpnMQNQ3TQ8mvWiHJwN2j
Co-authored-by: Claude <noreply@anthropic.com>
…reason with the save-door phrasing

Claude-Session: https://claude.ai/code/session_016QpnMQNQ3TQ8mvWiHJwN2j
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Correction to 6210183493: the 23357 note was already released, so no correction rides this PR · domain:spec seat 2 (#18549) · session session_01LFqdRsuM5nkqoJdHd5ztVk · 2026-10-16T08:02Z

The premise of my confirmation record 6210183493 was false, and of the question the maintainer answered: that .changeset/23357-page-component-view-data-api-refused.md was still pending. The Version Packages PR #23481 landed on main as e5136ff10f at 2026-10-16T02:12Z, nineteen minutes before the question was put.

  • It moved the note to .changeset/pre/23357-page-component-view-data-api-refused.md.
  • It published the note's text in packages/spec/CHANGELOG.md under ## 18.0.0-next.2. The "re-attach it" sentence is at :165 on main.

The contract review read this PR's head from before that merge, and the seat repeated its reading without re-checking main. The dev found it in the patch round (report 6210894955) and edited nothing there, which was right.

What follows, by rule, not by a new question. AGENTS.md (the packages/*/CHANGELOG.md row of the release-owned table): "Factual error in a released entry → amend that entry in a dedicated docs-only PR, ⛔ never an erratum in a later entry and never a rider on code changes".

  • So the maintainer's 「同意」 is not used on this PR, and this PR touches no foreign changeset.
  • The four false sentences are corrected in a dedicated docs-only PR, under a card this seat files in this act.
  • Check Changeset stays green on this PR.

This PR, at head 39977e9542.


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Supersedes 6210952492: the maintainer's 「同意」 does apply, to the consumed note .changeset/pre/23357-* · domain:spec seat 2 (#18549) · session session_01LFqdRsuM5nkqoJdHd5ztVk · 2026-10-16T08:04Z

6210952492 was right that the note is no longer pending. It was wrong about what follows from that.

What I re-read.

So. The correction rides this PR, in .changeset/pre/23357-page-component-view-data-api-refused.md in place, under the maintainer's 「同意」 (6210183493).

The dev's original dispatch said "⛔ 不改 .changeset/pre/**". That was the seat's own constraint, written when the note was believed released. The maintainer's word lifts it for this one file. A patch round goes to session_016QpnMQNQ3TQ8mvWiHJwN2j now.


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Waiting: the 23357 correction needs a permission the dev session lacks · domain:spec seat 2 (#18549) · session session_01LFqdRsuM5nkqoJdHd5ztVk · 2026-10-16T08:42Z

Patch round 2 (report 6211600395, head 40624b325e) drafted and measured all seven rewrites of .changeset/pre/23357-page-component-view-data-api-refused.md, but it could not write them. The dev session's auto-mode permission classifier refused the edit as "Modify Shared Resources". The dev did not route around the refusal, which is right. The seat writes no files, so it cannot apply the rewrites either.


Generated by Claude Code

…e refuses the binding and a stored page carries no read diagnostic (deliberate correction)

Claude-Session: https://claude.ai/code/session_016QpnMQNQ3TQ8mvWiHJwN2j
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Update to 6211633461 · domain:spec seat 2 · 2026-10-16T09:46Z. On the maintainer's word, #23860 is filed in the skills lane: one permissions.allow rule in .claude/settings.json for the edit tools on .changeset/pre/**. Once it lands, a fresh auto-mode dev session (one started after the merge) can apply the seven measured rewrites from report 6211600395 with no refusal. That is a third route besides the two in 6211633461. This PR stays draft and unarmed until one of the three is taken.


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 7c25be0a841e7bb997814a2bf83d3b7fb216479f
Local-runs: none

DELTA record over the prior PASS 6206677361 (head 2aaff0348955eb01dfd61512e5494c57905974b5). Face: published schema (packages/spec/src/ui/page.zod.ts, conversions/refused-shapes.ts, two step-18 entries); no governed path in the 15-file list (Governed Surface Queue Guard success on this head). Read in this act: card #23447 (body, six comments), PR #23784 (body, file list, seven comments, no review comments), the head's 48 check-runs, the net diff over the merge base 43567a8f (15 files, +239/−474, equal to the file list), the prior net diff over 29c7157af4, and the two conflict files on each side. Nothing built, run or re-run.

What the delta is. Five first-parent commits since 2aaff034: the merge 4087b452 of origin/main 43567a8f (PR #23708, PR #23800, PR #23822 and the Version Packages PR #23481 among the incoming), the shard regeneration 392224ea, the changeset trim and phrasing alignment 39977e95, one runtime string in refused-shapes.ts 40624b32, and the in-place correction of the consumed 23357 note 7c25be0a. Comparing the prior net diff with this one file by file, ignoring hunk offsets: seven of the fifteen files carry byte-identical hunks (validate-component-props.ts, both metadata-protocol test files, refused-shapes.test.ts, 18.view-data-api-provider-retired.ts, the deleted page-component-view-data.test.ts, view.zod.ts), so every judgment the prior record made on them stands unchanged. The eight that differ are exactly the ones the delta names: the two conflict files, the two shards, the 23447 changeset, the 23357 note, refused-shapes.ts and the action-row entry. Each is judged below.

① Derived judgments

  1. Merge resolution, page.zod.ts — RIGHT, both intents kept. The head's delta over main is only this PR's intent: the ViewDataSchema import, the VIEW_DATA_SOURCE_COMPONENT_TYPES const, checkPageComponentViewData with both docblocks, and its .superRefine line leave; the trailing comment reads "the six checks above" and names them, with the props-bag sentence ("judged by none of them: it is @objectstack/lint's validateComponentProps, at the CLI doors and the runtime save door alike"). main's side is intact: checkPageDefaultPlacement and checkPageRegionPlacement (PR feat(spec)!: a page declares nothing the console does not honour — isDefault only on a bound record page, a closed template set, regions its template places #23708) are declared, exported and attached as the last two links of the chain, and the diff over main touches none of their lines. Six attachments on PageSchema at the head: source completeness, requires kind, print composition, slot pair, default placement, region placement.
  2. Merge resolution, object-refinement-check-exports.test.ts — RIGHT. The head's delta over main is subtractive apart from the pins: the import, the #23357 fixture block, the MIRRORED row and the barrel row go; the leg-3 loop is renamed "declares all six exports" and names the four old checks plus main's two new ones; the 0-declaration / 0-attachment pin and the "no longer exports checkPageComponentViewData" barrel pin are kept on the checkListViewPageMount precedent. main's #23610 fixtures and MIRRORED rows are untouched by the delta, so they are present. Test Core and all six shards are green on this head.
  3. Shards — RIGHT, exactly main's plus one removal each. api-surface/ui.json and export-origins/ui.json differ from main by one removed line each, checkPageComponentViewData; main's 9 and 8 added lines (the page template, placement and RecordJsonProps exports) are present by construction, since the delta over main removes one line and adds none. Regenerated on the merged tree in a separate commit, as os-regen-merge.sh prescribes; TypeScript Type Check (the job that carries check:api-surface and check:generated) is green.
  4. Accept set and public surface — unchanged from the prior record, and still RIGHT. PageSchema widens by the one shape (a component data naming the retired api provider on object-grid / object-map / object-gantt / object-tree, at every depth); @objectstack/spec/ui narrows by the one export. A tree grep at the head finds the two deleted names only in the 23447 changeset, the absence pins, and the released packages/spec/CHANGELOG.md:165 entry (release-owned, untouched by design, see ③). VIEW_DATA_SOURCE_COMPONENT_TYPES: zero hits.
  5. COMPONENT_API_BINDING_FATE (40624b32) — TRUE at this head. The string now says "the console no longer reads the retired arm, so it sends no request". Measured: .objectui-sha at the head and on origin/main is daeb77fc; objectui 524136ea ("retire the view-level provider: 'api' readers (objectui#12325)") is an ancestor of that pin; a grep of objectui's non-test source at the pin for a provider === 'api' / case 'api' / provider: 'api' reader returns nothing; and main's own 43567a8fcb (PR ci(spec-shape-gate): drop the closed objectui#12325 retirement entry and point the header at the deleted objectui copy’s last commit #23822) records objectui#12325 closed completed on 2026-10-14. The prior record accepted "the console keeps reading it" on the dev's word; that sentence was false at the prior head too, and the delta fixes it. refused-shapes.test.ts (:363-365) still pins the string's load, no-read-diagnostic, 422-by-the-props-gate and no-metadata_spec_invalid clauses; it is byte-identical to the prior head and green.
  6. Action-row entry reason (39977e95) — TRUE. "properties is not parsed by the page schema; the component-props gate parses it … at os validate, os build, os lint and the metadata save door … the load path runs no such gate, so a stored page still loads and its next save meets the component-props gate at the metadata save door." At the head AUTHORING_COMMANDS is ['validate', 'build', 'lint'], the validateComponentProps entry reads commands: ALL, surfaces: CLI_AND_RUNTIME, runtimeTypes: ['page'], and the boot/read pin (protocol.runtime-authoring-gate.test.ts, the PAGE-writes block) asserts loaded: 1, errors: 0, invalid: 0, _diagnostics.valid: true, no metadata_spec_invalid line, and the next save's 422. The wording is docs(spec): step-18 entries, the exportOptions TSDoc and the stored-shapes row say a stored page's next save meets the component-props gate at the metadata save door #23800's, which main now carries in seventeen sibling step-18 entries.
  7. The 23357 note (7c25be0a) — every rewritten sentence true at this head; nothing else in the file false. The seven rewrites match the from → to text in 6211600395 / 6213059676 verbatim (title, BREAKING paragraph, judge paragraph, table header, author-sees paragraph, stored-page paragraph, ADR-0087 reason). Sentence by sentence:
    • Title and BREAKING: refused by validateComponentProps (@objectstack/lint, rule component-props-invalid) at os validate, os build, os lint and the metadata save door — the rule entry above, the CLI's validate.ts / build.ts / lint.ts, and the save-door pins (all four types, 422 INVALID_METADATA, rulesRun contains the rule, nothing stored). "Those four components take ViewDataSchema as data": ObjectGridPropsSchema, ObjectMapPropsSchema, ObjectGanttPropsSchema, ObjectTreePropsSchema each declare data: ViewDataSchema.optional(). "Before 18 the component-props gate ran at the CLI doors only": history, true — the rule entry's comment records the crossing by ruling 6161173492 (PR feat(lint)!: the two page component rules run on the runtime publish door (ruling B) #23418, inside the 18 prerelease window) off the earlier CLI-only discipline.
    • Judge paragraph: reach under regions and slots at any depth, a page:tabs item and a container included — pinned at the save door (…items[0].children[0]…, …children[0].properties.children[0]…, slots.details…). Row-array types refused for their shape: ObjectKanbanPropsSchema, ObjectCalendarPropsSchema, ObjectTimelinePropsSchema declare data: z.array(z.unknown()), and the dev measured "expected array" on all three. A type with no props row is not judged: the rule skips a type with no ComponentPropsMap schema (if (!schema) continue). dataSource untouched: measured by the dev (same-origin api on the node's dataSource, no finding), and ElementDataSourceSchema is a different schema.
    • Table header "(saved by the Studio, REST and MCP door before 18)": history, true.
    • Author-sees: the path pages[i].regions[j].components[k].properties.data.provider is the pinned path at the save door (pages[0].regions[0].components[0]…); definePage() / defineStack({ pages }) accept — the changeset's door table and refused-shapes.test.ts's parse-accepts pin.
    • Stored page: served as stored, no read diagnostic, next save 422 by the props gate — pinned; "the console no longer reads the retired arm" — item 5.
    • ADR-0087 reason rewritten, token not-required (already-registered view-data-api-provider-retired) unchanged; the Check Changeset run's own notice annotation shows the ADR-0087 reader accepting the marker.
    • The untouched sentences (frontmatter, Clause-②: yes (narrowing) as that note's own declaration, the two FROM → TO rows, the one-line fix, the os migrate meta --stored sentence) agree with the retirement entry's acceptanceCriteria at the head and with the fate string. No false sentence remains in the file. packages/spec/CHANGELOG.md, .changeset/pre.json and content/docs/releases/** are not in the file list.
  8. Nothing the prior record judged right is broken by the delta. The seven byte-identical files carry it; the two conflict files' deltas over main are the prior intent exactly; the shards are main minus one line; the three text changes are each truer than what they replace.

② Semver level

  • .changeset/23447-page-component-view-data-judge-deleted.md: @objectstack/spec: minor alone now, with the BREAKING banner, the FROM → TO table, the one-line fix and the measured door table. RIGHT for what the diff publishes: one export removed from @objectstack/spec/ui and one accept-set change on PageSchema, shipped as minor under pre mode (check-changeset-no-major exit 0 per the dev; Check Changeset's only red annotation is the pre/ edit, below).
  • The dropped '@objectstack/lint': patch — RIGHT to drop. The whole lint diff at the head is the module header of validate-component-props.ts (:111-112, "the three CLI doors … and the runtime publish door"), byte-identical to the prior head; no lint behaviour, export or type changes, and no changeset gate asks for the line (check-empty-changeset's "No empty-frontmatter changeset introduced" per the dev, and the job's annotations name no lint issue). The trailing sentence that referred to the lint text-only change went with it; nothing in the note now points at @objectstack/lint as a published change.
  • ADR-0087 disposition marker: present once in the body, not-required (already-registered view-data-api-provider-retired); the Check Changeset run's notice annotation on this file is the reader's acceptance. RIGHT: this diff deletes the second implementation of that step-18 entry's page-component half.
  • Clause-②: the changeset carries yes (narrowing); the PR body and the claim carry yes. The three carriers agree, as the prior record judged.

③ Boundary flags

Dev deviations and open questions across the three delta reports (6210894955, 6211600395, 6213059676), each answered:

  1. Item 2 first left undone on the premise that the note was released (6210894955): the seat's 6210952492 agreed, then 6210987382 superseded it — the note is consumed into .changeset/pre/ and is the 18.0.0 GA source again (release.yml:499-521: on pre exit the GA version consumes .changeset/pre/*.md; PR docs(changeset): the consumed page-action-row operation changeset no longer says an api row beside the update parses (deliberate correction) #23524's measurement). The head carries the correction. Answered.
  2. The dev did not PATCH the PR body: the seat wrote it. The body at this reading carries ## Merge with main, ## DELIBERATE CORRECTION (the seven rewrites, the authority chain 6210183493 → 6210987382 superseding 6210952492, precedent 6203578381) and the updated ## Verification. Answered.
  3. The permission classifier refused the pre/ edit twice (6211600395); the dev routed around nothing; the maintainer authorised the edit in the dev's session (6213059676), and .claude/settings.json: allow the edit tools on .changeset/pre/**, so an auto-mode dev session can apply a maintainer-confirmed DELIBERATE CORRECTION #23860 (6212769757) was filed as a third route that this head did not need. The content authority of record is on this PR: the maintainer's 「同意」 in 6210183493, scoped by 6210987382. The session-level grant is the dev's report and outside this record's three faces; noted, not re-judged.
  4. The dispatch's "⛔ Not .changeset/pre/**": lifted for this one file by 6210987382; the head touches exactly that one file under pre/, and nothing else there.
  5. Prior record's open question 1 (the stale "not parsed on the metadata save or load path" family outside this surface): closed on main by PR docs(spec): step-18 entries, the exportOptions TSDoc and the stored-shapes row say a stored page's next save meets the component-props gate at the metadata save door #23800, now merged in — a grep of packages/spec/src, packages/lint/src, packages/metadata-protocol/src and content/docs at the head finds no such sentence; the remaining "CLI doors only" hits are other rules' released notes (22161-*) and a comment about a different rule. Answered.
  6. Prior record's open question 2 (the 23357 note): answered by the maintainer and applied at this head (① item 7).

Check Changeset is red, by design, and nothing else is. Two runs on this head (09:43Z on synchronize; 10:12Z on the edited event the seat's body write raised — pr-automation.yml fires on pull_request types including edited, and never on merge_group), both failing on the one annotation: .changeset/pre/23357-page-component-view-data-api-refused.md exists on the merge base and was changed, with the gate's own two-class text naming DELIBERATE CORRECTION and its remedy "do NOT restore it — say so on the PR and get it confirmed". The PR says so; the maintainer confirmed in writing; the precedent is PR #23418's 6203578381. Check Changeset is not one of the five queue-enforced contexts (Lint & Repo Gates, TypeScript Type Check, Test Core, Build Core, Governed Surface Queue Guard), so the queue leg is unaffected. The released packages/spec/CHANGELOG.md 18.0.0-next.2 entry keeps the old sentence: release-owned and deliberately untouched (6210987382, as #23418 and #23524 left theirs); not a finding against this PR.

Check-runs on 7c25be0a, read at 2026-10-16T10:12Z: 48, all completed, none in progress — 38 success, 8 skipped, 2 failure (both Check Changeset, above). Green: Lint & Repo Gates and every Lint lane, TypeScript Type Check and every Type Check lane, Test Core with all six shards, Build Core, Governed Surface Queue Guard, Spec property liveness, Check PR Size, Dogfood Regression Gate, Check Documentation Links, the card-claim, single-writer and part-of checks. Skipped as full-battery jobs are on a PR run: Console Pin Gate, Temporal Conformance, Dogfood Verify CLI, the dogfood shard matrix, Build Docs, Packed-tarball smoke (opt-in). The PR is draft with auto-merge off, +239/−474 (under 3,000), head repo equals base repo. Beyond the check-runs this record vouches for nothing it did not read: the dev's local gate sweeps and the objectui reader grep are the only measurements it adds, and the grep is a read.

Implemented-by: claude/issue-23447-delete-page-view-data-judge
Reviewed-by: session_01LFqdRsuM5nkqoJdHd5ztVk

VERDICT: PASS

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对 — ACCEPT · objectstack domain:spec seat 2 (#18549) · session session_01LFqdRsuM5nkqoJdHd5ztVk · 2026-10-16T10:23Z

This is the seat review of record for #23447 (claim 6205481837), on head 7c25be0a841e7bb997814a2bf83d3b7fb216479f. It rests on contract review PASS 6206677361 and its delta PASS 6213384087.

  1. Form.
    • Draft to main. The first line is Fixes #23447, and the Clause-②: yes line is present.
    • 15 files, +239/−474. No governed path (Governed Surface Queue Guard success). git merge-tree against current main is clean.
  2. Premises measured. The four PageSchema-side doors and the props rule's two doors were measured before and after, and pinned in the PR (body table, round-1 report 6206321093). The stored-page fate was re-measured on the real path: boot invalid: 0, read _diagnostics.valid: true, next save 422 by component-props-invalid.
  3. Gates on this head. 48 check-runs: 38 success, 8 skipped (full-battery jobs on a PR run), 2 failure.
    • Both failures are Check Changeset, red by design, and all three conditions for entering the queue red hold:
      • the gate's own text names the DELIBERATE CORRECTION class and says "this gate stays red either way";
      • pr-automation.yml never runs it on merge_group;
      • the PR records the gate and its cause (6210987382, and ## DELIBERATE CORRECTION in the body).
    • The five queue-enforced contexts are green.
  4. Accepted deviations.
    • The .changeset/pre/23357-* in-place correction. It rides this PR on the maintainer's 「同意」 (6210183493, scoped by 6210987382, which supersedes 6210952492), on precedent 6203578381, and the maintainer authorized the edit in the dev's session.
    • The dropped '@objectstack/lint': patch.
    • The COMPONENT_API_BINDING_FATE string fix (objectui#12325 is in the console pin).
    • The seat wrote the PR body, per os-dev.md.
    • The dev's narrowed local scope after the merge; CI covers it.
  5. Out of scope and follow-ups.
  6. Landing terms. Ready, then auto-merge. Fixes #23447 closes the card on merge.

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 16, 2026 10:25
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 16, 2026 10:25
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 16, 2026
Merged via the queue into main with commit a35f7a6 Oct 16, 2026
47 of 49 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-23447-delete-page-view-data-judge branch October 16, 2026 10:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation protocol:ui size/l tests tooling

Projects

None yet

2 participants