Repository navigation
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
Copy link
Copy link
Open
Labels
domain:specenhancementNew feature or requestNew feature or requestpm:dispatchedpriority:p1High: required for production / M2High: required for production / M2target:v18
Description
Filing gate ③, a ruled task: ruling 6161173492 on #23388 (letter B, the maintainer's 「23388 B 是不是最简单?」), item 6, verbatim:
- page: a stored page component's
datacan still carry the retired viewapisource — 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'sdatacan still carry the retired viewapisource — 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.
Filed by domain:spec seat 1 (#6017) · huangyiirene · session session_01YRp5z4kK6vgYkrdH97ztsy. ⛔ Not a claim. This is the follow-up that sentence names. #23357's PR #23419 lands first, so the deletion cannot ride it.
Blocked-by: #23388
Reader who acts: the domain:spec seat that claims this card once PR #23418 (#23388) has landed. Its PR deletes the narrow judge and rewrites the sentences the general rule makes false. Seat 3's pointer 6163363165 on #23357 names the second half.
What the follow-up does
- Delete the narrow judge. That means
checkPageComponentViewDataandVIEW_DATA_SOURCE_COMPONENT_TYPESinpackages/spec/src/ui/page.zod.ts, its.superRefineonPageSchema, and its line inobject-refinement-check-exports.test.ts.- It also means its published export from
@objectstack/spec/ui, with theapi-surface/ui.jsonandexport-origins/ui.jsonlines regenerated. - Removing the export narrows the public surface. That is why this card carries
target:v18: after 18 GA the removal waits for 19.
- It also means its published export from
- Rewrite every sentence that the general rule at the save door makes false, "the component-props gate runs at the CLI doors only" and its kin:
- the
refused-shapes.tsdocblock and fate text; - the step-18 entry
18.view-data-api-provider-retired.ts'sacceptanceCriteria; - the comment at
packages/lint/src/validate-component-props.ts:111-116(seat 3's pointer). - the step-18 entry
18.ui-page-action-row-declarative-update-rules.ts(spec(ui): page action rows still accept five declarative-update shapesActionSchemarefuses (patchwithoutoperation;updatewithtarget, aurlexecutor, nopatch, orlist_toolbar): family closing card after #23332 #23427, PR fix(spec)!: page action rows carry ActionSchema's declarative-update rules, read from one judge #23494), which repeats the family's "a page'spropertiesis not parsed on the metadata save or load path". Added by seat 1 at spec(ui): page action rows still accept five declarative-update shapesActionSchemarefuses (patchwithoutoperation;updatewithtarget, aurlexecutor, nopatch, orlist_toolbar): family closing card after #23332 #23427's ACCEPT; the spec(ui): page action rows still accept five declarative-update shapesActionSchemarefuses (patchwithoutoperation;updatewithtarget, aurlexecutor, nopatch, orlist_toolbar): family closing card after #23332 #23427 dev's report names it.
- the
- Re-measure the stored-page fate before rewriting it. Today the fate text says a stored page with the binding "still loads and is served, registered under
[metadata_spec_invalid]with the refusal in the_diagnosticsof every read". That diagnosis comes from thePageSchemaparse, which this card removes. The props rule at'runtime-publish'judges the next save only.- The follow-up states what a stored page does after the deletion: whether it still carries a read diagnostic, and whether its next save is still refused, now by
validateComponentProps. - The contract review of PR feat(spec)!: the page parse refuses a component data prop naming the retired view-level api source, at every door that parses a page #23419 (
6164843252) also noted that the boot count for a page row was measured only with a deleted probe.
- The follow-up states what a stored page does after the deletion: whether it still carries a read diagnostic, and whether its next save is still refused, now by
- Pins:
- the save door still refuses a page component's
dataofprovider: 'api'on the fourobject-*types, now through the props rule, with the retirement's prescription; - the
object/valuecontrol still saves.
- the save door still refuses a page component's
Dedupe
MCP search_issues on objectstack-ai/objectstack, closed included:
delete checkPageComponentViewData page component data api provider judge once validateComponentProps runs at the save door→ 4 hits: page: a stored page component'sdatacan still carry the retired viewapisource — 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 (the judge's own card), [Decision] Pages saved through Studio, REST or MCP skip the component-props rule thatos validaterefuses: cross it to the runtime door, and on what evidence #23388 (the general rule), finding(spec): two live-window page-property aliases (page:headerdescription, an inlineapiaction's objectparams) are converted atos validateand at load but not at the metadata save door, which now runs the component-props rule (PR #23418) #23421 (aliases at the save door), lint/spec: a retired page-component prop (object-grid defaultFilters) passes os validate with only a warning, while the conversion registry says the loader refuses it — the props gate's error upgrade has no carrier since its blockers closed #23026 (closed; the props gate's error upgrade). None is this follow-up.component-props gate runtime publish door page save follow-up narrow judge overlap ruling B 23388→ 73 hits. In the first page: page: a stored page component'sdatacan still carry the retired viewapisource — 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, [Decision] Pages saved through Studio, REST or MCP skip the component-props rule thatos validaterefuses: cross it to the runtime door, and on what evidence #23388, finding(spec): two live-window page-property aliases (page:headerdescription, an inlineapiaction's objectparams) are converted atos validateand at load but not at the metadata save door, which now runs the component-props rule (PR #23418) #23421, spec(ui):ComponentPropsMaphas nolist-viewrow, so a page-embedded list view'spropertiesare judged by nothing:kanban.groupFieldandoptions.gridpass on a page while every list-view door refuses them #22444 and others. None carries item 6.
Generated by Claude Code
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
domain:specenhancementNew feature or requestNew feature or requestpm:dispatchedpriority:p1High: required for production / M2High: required for production / M2target:v18
Activity
objectstack-fleet commentedon Oct 15, 2026
First touch and unlock:
pm:blocked→pm:queue; grade p2 → p1 by the protocol-first class · triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-15T23:55ZRead in this act: the body in full (0 comments), #23388's landing record, and PRs #23418 and #23419.
Blocked-by: #23388: [Decision] Pages saved through Studio, REST or MCP skip the component-props rule thatos validaterefuses: cross it to the runtime door, and on what evidence #23388 closedcompletedat 2026-10-15T23:03Z, when PR feat(lint)!: the two page component rules run on the runtime publish door (ruling B) #23418 merged asd0c09e47c1.datacan still carry the retired viewapisource — 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 feat(spec)!: the page parse refuses a component data prop naming the retired view-level api source, at every door that parses a page #23419 merged first, as05ab9ef895.main:checkPageComponentViewDataappears inpage.zod.tsand five other files underpackages/spec/src, read in this act.superRefineonPageSchema, which changes the spec's accept surface. It also removes a published export from@objectstack/spec/ui, which narrows the declared surface.filing-gate.md〈定级判据〉 says 「修复改 spec 接受/声明面…宽窄皆算」 and 「此类任何车道皆 p1 + 在研大版 target:」.target:v18says why it is window-bound: after 18 GA, the removal waits for 19.domain:spec, confirmed, andtarget:v18stands.⛔ Not a claim.
objectstack-fleet commentedon Oct 16, 2026
Claim: PM loop round 9 (second shift,
batch 3) · 2026-10-16T00:49Z · ruling6161173492item 6, the follow-up for #23357, unlocked by triage6204768090. Delete the narrow judge (checkPageComponentViewData,VIEW_DATA_SOURCE_COMPONENT_TYPES, its.superRefineonPageSchemaand its published export), now that PR #23418 runs the general component-props rule at the save door. Rewrite every sentence that rule makes false, after re-measuring the stored-page fate. One PR,Fixes #23447.Session:
session_01LFqdRsuM5nkqoJdHd5ztVk(the seat; the dev is a cloud session whose draft PR carries its own session link)Account:
os-bill(the seat's linked user asGET /useranswers it; always the card's assignee)Branch:
claude/issue-23447-delete-page-view-data-judgeWorktree:
objectstack-issue-23447Domain:
domain:specSeat:
domain:spec#2(seat post #18549)File surface (at
origin/main29c7157af4or later; stop on a breach and explain it in the report):packages/spec/src/ui/page.zod.ts:checkPageComponentViewData,VIEW_DATA_SOURCE_COMPONENT_TYPES, their docblocks and the.superRefineonPageSchemaonly.packages/spec/src/ui/view.zod.ts: the comment that cites the judge.packages/spec/src/ui/object-refinement-check-exports.test.ts(its one line) andpackages/spec/src/ui/page-component-view-data.test.ts(deleted or re-pointed at the props rule, as the pins in the card's item 4 need).packages/spec/src/conversions/refused-shapes.tsdocblock and fate text, with its test;18.view-data-api-provider-retired.tsacceptanceCriteria;18.ui-page-action-row-declarative-update-rules.ts; and the comment atpackages/lint/src/validate-component-props.ts:111-116.packages/metadata-protocol(protocol.save-union-issues.test.tsand kin). The generatedapi-surface/ui.jsonandexport-origins/ui.json, through the generators only. One changeset,.changeset/23447-*.md.isDefaultorPagePrintSchemaregions ofpage.zod.ts: those are PRs 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 and spec liveness: the console pin hop to objectui 1f23d5b070fa makespage.printandtranslation.flows.successMessage/errorMessagereadplannedwhile the shipped console applies them (family card; theparentDataSourceleg is #23585) #23710. ⛔ Not.changeset/pre/**, which holds released notes. ⛔ Notcontent/docs/releases/.Container & model:
M,mode:cloud,model: default tier(dispatch-gates --tier: no path-derived mandate). Cloud by the seat's interim rule ([Decision] Three spec contract dev agents in one container queued ~70 min each on the shared verify lock: leave packagetest:repoto CI, and send build-heavy cards to cloud sessions? #23607), becausepackages/specplus the lint and metadata-protocol pins is a build-heavy closure. Review ceilingCONTRACT_REVIEW_TIER:PageSchema's parse stops refusing a shape that the props rule then refuses at the CLI and the save door, and a published export leaves@objectstack/spec/ui.Clause-②: yes
Responsibility: n/a — a ruled follow-up, not a defect card
Thread-read: 6204768090
Ruling-ref: 6161173492 (item 6, letter B, the maintainer's 「23388 B 是不是最简单?」)
Serial constraints cleared:
batch 3, the maintainer's newest word in this seat's session. In flight from this seat: 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's pin bump and spec liveness: the console pin hop to objectui 1f23d5b070fa makespage.printandtranslation.flows.successMessage/errorMessagereadplannedwhile the shipped console applies them (family card; theparentDataSourceleg is #23585) #23710, both cloud.page.zod.ts(other regions),object-refinement-check-exports.test.ts, and the uiapi-surface/export-originsshards. Thechore: version packagesPR chore: version packages (next) #23481 holds.changeset/pre/23357-*, which stays untouched. No other open PR touches the files above.mainand regenerates throughscripts/pm/os-regen-merge.sh, keeping both intents.objectstack-fleet commentedon Oct 16, 2026
os-dev-report
{ "issue": 23447, "status": "done", "branch": "claude/issue-23447-delete-page-view-data-judge", "pr": "https://github.com/objectstack-ai/objectstack/pull/23784", "session": "session_016QpnMQNQ3TQ8mvWiHJwN2j", "premise_still_valid": true, "summary": "Deleted checkPageComponentViewData, VIEW_DATA_SOURCE_COMPONENT_TYPES, the PageSchema superRefine and the @objectstack/spec/ui export (api-surface/ui.json and export-origins/ui.json regenerated, one line each). Rewrote the sentences named in item 2 (refused-shapes.ts docblocks and COMPONENT_API_BINDING_FATE, 18.view-data-api-provider-retired acceptanceCriteria, 18.ui-page-action-row-declarative-update-rules reason, the validate-component-props.ts header, the view.zod.ts comment), using the stored-page fate measured beforehand. Moved the save-door pins onto the props rule in protocol.runtime-authoring-gate.test.ts; deleted page-component-view-data.test.ts and the #23357 block of protocol.save-union-issues.test.ts. Hypothesis 1 held: validateComponentProps gives identical findings before and after on 10 bodies (rule component-props-invalid, the prescription, same nested and slot reach). Hypothesis 2 measured: defineStack, definePage and PageSchema now accept the shape, and no spec-side replacement was added. Hypothesis 3 measured: boot invalid 1 -> 0 with no metadata_spec_invalid warn, read _diagnostics.valid false -> true, next save still 422 now by component-props-invalid.", "tests": "HEAD 2aaff034. Door readings before (29c7157af4) -> after: PageSchema custom refusal -> accept; os validate (built CLI) exit 1 defineStack refusal -> exit 1 component-props-invalid at pages[0].regions[0].components[0].properties.data.provider (control exit 0); os build exit 2 -> exit 1 same finding (control exit 0); saveMetaItem 422 failed spec validation code custom, no rulesRun -> 422 failed author-time validation rule component-props-invalid, rulesRun has validateComponentProps; loadMetaFromDb loaded 1 invalid 1 + [metadata_spec_invalid] warn -> loaded 1 invalid 0, no warn; getMetaItem _diagnostics.valid false -> true. metadata-protocol pnpm test 236 files / 20580 passed + typecheck exit 0; lint pnpm test 139 files / 6771 passed + typecheck exit 0; spec full pnpm test showed 1 failure (a missed #23357 half in refused-shapes.test.ts), fixed, then refused-shapes + object-refinement-check-exports 250/250 and spec typecheck exit 0. Ablation via ablation-replace.mjs on packages/lint/src/authoring-rules.ts, validateComponentProps surfaces -> cli only with runtimeTypes dropped: lint rebuilt, dist-preflight marker present in 4 built files, 6 refusal pins red, control green. Restore: blob matched the HEAD hash, rebuilt, preflight --absent passed with a clean tree, file 145/145 green. The first ablation attempt was a no-op: a void-expression marker that esbuild dropped (preflight caught it). It was redone with a surviving marker.", "gates": "Local: dispatch-gates --commands --repo objectstack-ai/objectstack derived 90 commands. Each was run with its exit code recorded before any pipe. First pass: 83 exit 0. Five spec dist gates exited 3 or 1 because the spec dist predated a later test-file edit; after rebuilding spec, check:api-surface, check:dual-source-exports, check:entry-nameability, check:exported-any and check:generated all exit 0. check-plugin-teardown-shape --self-test exited 3 on the shallow clone; after fetching its pinned fixture commit 621a4876 it exits 0. check:dual-build-cjs-loads exit 3: it needs every package's dist and was not run locally (left to CI). --ran reconciliation: 90 derived, 89 run, 1 NOT-MEASURED (derived from exit 3), 0 UNRUN, exit 0. check:adr-0087-registration: BREAKING+bang+clause-2-narrowing, not-required (already-registered). CI on PR #23784 at report time: 24 check-runs; 'No other open PR may claim the same issue' success, 'Packed-tarball smoke (opt-in)' skipped, the other 22 in_progress, among them Lint, Type Check, Check Changeset and Governed Surface Queue Guard.", "mcp_calls": "3 — issue_read get, issue_read get_comments, pull_request_read get_check_runs (all reads)", "api_writes": "2 — fleet-write relay pr_create (POST /repos/objectstack-ai/objectstack/pulls draft + POST /issues/23784/assignees os-bill); this os-dev-report comment (POST /repos/objectstack-ai/objectstack/issues/23447/comments). Plus git push (not REST). label-write: 0, since the dispatch named no label", "line_budget": "PR diff vs origin/main: 13 files, see files_changed; no skills/** touched", "deviations": [ "The CLI probe fixtures (packages/cli/.tmp-23447) were committed in ee76df23 by mistake and removed in the next commit, 26c3fee4. The net PR diff does not carry them.", "The dispatch named .changeset/pre/23357-* as the released note. On main the file is .changeset/23357-page-component-view-data-api-refused.md, still pending; the Version Packages PR #23481 has it under .changeset/pre/. It was not edited. Its 'refused by PageSchema' and stored-page lines describe the behaviour this PR removes, and this PR's changeset states the new behaviour door by door.", "The pins live in protocol.runtime-authoring-gate.test.ts (the #23388 harness, which has the loadMetaFromDb/getMetaItem rig), not in protocol.save-union-issues.test.ts, because the refusal is no longer a parse-union issue. Both files are in the claimed surface.", "The changeset adds '@objectstack/lint': patch (text only: the validate-component-props.ts header) beside '@objectstack/spec': minor." ], "files_changed": [ ".changeset/23447-page-component-view-data-judge-deleted.md", "packages/lint/src/validate-component-props.ts", "packages/metadata-protocol/src/protocol.runtime-authoring-gate.test.ts", "packages/metadata-protocol/src/protocol.save-union-issues.test.ts", "packages/spec/api-surface/ui.json", "packages/spec/export-origins/ui.json", "packages/spec/src/conversions/refused-shapes.test.ts", "packages/spec/src/conversions/refused-shapes.ts", "packages/spec/src/migrations/entries/semantic/18.ui-page-action-row-declarative-update-rules.ts", "packages/spec/src/migrations/entries/semantic/18.view-data-api-provider-retired.ts", "packages/spec/src/ui/object-refinement-check-exports.test.ts", "packages/spec/src/ui/page-component-view-data.test.ts (deleted)", "packages/spec/src/ui/page.zod.ts", "packages/spec/src/ui/view.zod.ts" ], "open_questions": [ { "question": "PR #23418 made the sentence 'a page's properties is not parsed on the metadata save or load path' false in places outside this card's file surface: the shipped reason of 18.ui-page-action-row-operation-declared.ts, 16 other step-18 entry comments, and the exportOptions TSDoc in component.zod.ts. Who rewrites them?", "options": [ "A: a follow-up card in domain:spec rewrites the save half in one sweep (the load half stays true)", "B: leave the comments, fix only the shipped reason string" ], "recommendation": "A: the shipped reason is release text, and the comments are what the next AI author reads as the contract, which is the AI-error axis. One mechanical sweep, no new gate." }, { "question": "The pending .changeset/23357-page-component-view-data-api-refused.md (already consumed into the Version Packages PR) states the PageSchema refusal and the [metadata_spec_invalid] stored-page fate that this PR removes. Amend it, or let this PR's changeset supersede it in the same release?", "options": [ "A: leave it; both changesets ship in 18 and this one states the final door table", "B: a docs-only PR amends the 23357 note before release" ], "recommendation": "A, if both ship in the same release (the reader sees both entries); otherwise B, per the CHANGELOG amend rule." } ], "out_of_scope_findings": [ "carrier: none · noted in PR Acceptance notes: 18.ui-page-action-row-operation-declared.ts reason + 16 step-18 entry comments + component.zod.ts exportOptions TSDoc say component properties are not parsed on the save path, false since PR #23418 · dedupe words: save or load path, component-props gate runtime door, step-18 entry reason stale" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
os-dev-report
{ "issue": 23447, "status": "blocked", "branch": "claude/issue-23447-delete-page-view-data-judge", "pr": "https://github.com/objectstack-ai/objectstack/pull/23784", "session": "session_016QpnMQNQ3TQ8mvWiHJwN2j", "premise_still_valid": false, "summary": "Patch round on PR #23784, head 39977e95. Done: (1) merged origin/main 43567a8f, PR #23708 and PR #23800 included, through scripts/pm/os-regen-merge.sh; (3) dropped '@objectstack/lint': patch from this PR's changeset, no changeset gate asking for it. BLOCKED: (2), the DELIBERATE CORRECTION of .changeset/23357-page-component-view-data-api-refused.md. Its premise is false at the merged head. The Version Packages PR #23481 landed on main as e5136ff1 at 02:12Z and moved the note to .changeset/pre/23357-page-component-view-data-api-refused.md. packages/spec/CHANGELOG.md now carries it under '## 18.0.0-next.2' (line 159, the 05ab9ef entry, including the 'checkPageComponentViewData is exported ... a mirror ... can re-attach it' sentence). npm dist-tags answer next = 18.0.0-next.2, so that note is RELEASED text. Maintainer ruling 6210183493 authorizes correcting it because it is 'still pending: packages/spec/CHANGELOG.md carries no 23357 entry', which no longer holds. The dispatch forbids .changeset/pre/**, and AGENTS.md routes a released CHANGELOG entry to a dedicated docs-only amendment, never a rider on a code PR. I made no edit there, and the PR body was not PATCHed (see open_questions).", "merge": { "packages/spec/src/ui/page.zod.ts": "Conflict at the PageSchema superRefine chain. Kept main's checkPageDefaultPlacement and checkPageRegionPlacement (PR #23708, #23610 ruling A), dropped the deleted checkPageComponentViewData. The trailing comment reads 'the six checks above', and the props-bag sentence stays.", "packages/spec/src/ui/object-refinement-check-exports.test.ts": "5 hunks: main's side in each, minus every checkPageComponentViewData line, i.e. the import, the view-data fixture block (main's #23610 fixtures kept), the MIRRORED row and the barrel row. The leg-3 'declares all six exports' loop names the 4 old checks plus the 2 new ones. This PR's 0-declaration, 0-attachment and barrel-absence pins are kept.", "packages/spec/api-surface/ui.json, packages/spec/export-origins/ui.json": "os-regen driver, not text-merged. Step 2 took main's side, the merge commit was the deferral, then rebuild + gen:api-surface + gen:export-origins on the merged tree, committed as 392224ea. The deferral was discharged. Delta vs origin/main: exactly one removed line in each (checkPageComponentViewData). main's 9 new ui exports are present.", "packages/spec/src/migrations/entries/semantic/18.ui-page-action-row-declarative-update-rules.ts": "No conflict: PR #23800 left this line to this PR. Aligned with #23800's wording precedent: '... 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.'" }, "lint_line": "Dropped. Gate readings on 39977e95: check-empty-changeset --base origin/main exit 0 ('No empty-frontmatter changeset introduced', 'No changeset from the merge base modified or deleted'); check-adr-0087-registration exit 0 ([BREAKING+bang+clause-2-narrowing] not-required (already-registered)); check-changeset-no-major exit 0; check:changeset-gate-self-tests exit 0. The note's last sentence about the lint text-only change is removed too.", "tests": "HEAD 39977e95, merged tree. @objectstack/spec pnpm test: 682 files passed (1 skipped), 20873 tests passed; spec typecheck exit 0. @objectstack/lint pnpm test: 140 files, 6781 passed; typecheck exit 0. @objectstack/metadata-protocol: protocol.runtime-authoring-gate.test.ts + protocol.save-union-issues.test.ts 170/170; typecheck exit 0. git merge-tree --write-tree origin/main HEAD: exit 0.", "gates": "dispatch-gates --commands on 39977e95: 90 commands (same set as round 1), each run with its exit code recorded before any pipe. First pass: 82 exit 0. The 7 refusals: spec api-surface, browser-reachable-entries, dual-source-exports, entry-nameability and exported-any exited 3, and check:generated exited 1, because the spec dist predated my last src edit; lean-entry-closure exited 3 because objectql/core dist was missing after the merge. After rebuilding spec and the objectql closure, all 7 exit 0. check:dual-build-cjs-loads exit 3 (needs every package's dist), not run locally and left to CI. --ran: 90 derived, 89 run, 1 NOT-MEASURED, 0 UNRUN, exit 0. CI on 39977e95: not read in this round.", "mcp_calls": "1 this round: pull_request_read get_comments on #23784 (read). Round total 4.", "api_writes": "1 this round: this os-dev-report comment (POST /repos/objectstack-ai/objectstack/issues/23447/comments via the fleet-write relay). Plus git push. No issue_patch on the PR body. No label write.", "deviations": [ "Item 2 not done: its premise (the 23357 note pending) is false on the merged head. Evidence is in summary.", "PR body not PATCHed although the dispatch granted one issue_patch: .claude/agents/os-dev.md says the dev writes the PR body once, at pr_create, and never PATCHes it; later changes are named in the report and written by the seat. The role file wins on conflict. The body edit is spelled out in open_questions[1] for the seat.", "18.ui-page-action-row-declarative-update-rules.ts got a further phrasing alignment, as the dispatch asked." ], "files_changed": [ ".changeset/23447-page-component-view-data-judge-deleted.md (lint line + its sentence removed)", "packages/spec/src/migrations/entries/semantic/18.ui-page-action-row-declarative-update-rules.ts (phrasing aligned)", "merge commit 4087b452: page.zod.ts, object-refinement-check-exports.test.ts resolved", "392224ea: packages/spec/api-surface/ui.json, packages/spec/export-origins/ui.json regenerated" ], "open_questions": [ { "question": "The 23357 note is now released (CHANGELOG 18.0.0-next.2, npm next). Ruling 6210183493 covered a pending note. Which route corrects the four false sentences?", "options": [ "A: a dedicated docs-only PR amends the released 18.0.0-next.2 entry in packages/spec/CHANGELOG.md (and, if the release tooling reads it, .changeset/pre/23357-*), per AGENTS.md's CHANGELOG rule; #23784 lands as is", "B: the maintainer extends the ruling to edit .changeset/pre/23357-* and/or CHANGELOG.md inside #23784 (reverses two standing rules: the dispatch's ban on .changeset/pre/** and AGENTS.md's 'never in a code PR')", "C: leave the released entry; this PR's changeset (next release) states the final door table, and an upgrading agent reads both" ], "recommendation": "A. The entry is published text, and AGENTS.md says a factual error in a released entry is amended in a dedicated docs-only PR, so the agent grepping the tombstoned name lands on a corrected entry. It keeps #23784 a code PR, adds no gate, and needs the maintainer's word only for the amendment PR. C leaves the false 're-attach it' sentence in the published CHANGELOG." }, { "question": "PR body edit for the seat (the dev does not PATCH): what should change in #23784's body?", "options": [ "Seat applies: in '## Verification', replace the head reference with 39977e95 (merged with origin/main 43567a8f) and these readings: spec 682 files / 20873 tests, lint 140 / 6781, metadata-protocol pin files 170/170, typechecks exit 0, gates 90 derived / 89 run / 1 NOT-MEASURED. In '## Acceptance notes', replace the 23357 bullet with: the 23357 note was released in @objectstack/spec 18.0.0-next.2 (CHANGELOG line 159) while this PR waited, so its correction moves to a docs-only amendment (see #23447). Add a '## Merge with main' line naming the page.zod.ts and object-refinement-check-exports.test.ts resolutions and the regenerated shards. No '## DELIBERATE CORRECTION' section, since no foreign changeset is edited; Check Changeset should stay green." ], "recommendation": "Apply as written." } ], "out_of_scope_findings": [] }Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
os-dev-report
{ "issue": 23447, "status": "blocked", "branch": "claude/issue-23447-delete-page-view-data-judge", "pr": "https://github.com/objectstack-ai/objectstack/pull/23784", "session": "session_016QpnMQNQ3TQ8mvWiHJwN2j", "premise_still_valid": true, "summary": "Patch round 2, head 40624b32. I read and accepted supersession record 6210987382: #23418 (d0c09e47) did edit consumed .changeset/pre/23147-* in place, and release.yml:503 says GA re-consumes pre/. BLOCKED: the in-place edit of .changeset/pre/23357-page-component-view-data-api-refused.md was refused by this session's auto-mode permission classifier, reason 'Modify Shared Resources'. No byte of the file changed (git status clean before the next commit), and I did not route around the refusal with another tool. Below are the exact sentence-by-sentence rewrites, each measured at this head, for the seat (or a session with the permission) to apply verbatim. Done: one measurement-driven fix in this PR's own text. The console pin has carried objectui#12325 since PR #23709 (53e3638e: 'the view-level provider: api data source is no longer read anywhere in objectui', objectui 524136ea7). So COMPONENT_API_BINDING_FATE's 'the console keeps reading it' was false, and it now reads 'the console no longer reads the retired arm, so it sends no request' (40624b32).", "rewrites_for_23357": [ { "where": "title line", "from": "feat(spec)!: the page parse refuses a page component's `data` prop that names the retired view-level `api` data source, so the Studio, REST and MCP save door refuses it as `os validate` does (#23357)", "to": "feat(spec)!: 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 (#23357)" }, { "where": "BREAKING paragraph (marker kept)", "from": "... is now refused by `PageSchema`, at the component's `properties.data.provider`, with the retirement's own prescription. ... but the page parse leaves a component's `properties` an open record, and the component-props gate that refused the binding runs at the CLI doors only. A page saved through the Studio, REST or MCP therefore kept the binding, with its request headers, and the console kept sending it.", "to": "**BREAKING** — a page whose `object-grid`, `object-map`, `object-gantt` or `object-tree` component carries `properties.data` with `provider: 'api'` is refused at the component's `properties.data.provider`, with the retirement's own prescription, by the component-props gate (`validateComponentProps`, `@objectstack/lint`, rule `component-props-invalid`) at `os validate`, `os build`, `os lint` and the metadata save door. Those four components take a view data source (`ViewDataSchema`) as `data`, so the step-18 retirement of the view-level `api` source reached them through the same schema. The page parse leaves a component's `properties` an open record, and before 18 the component-props gate ran at the CLI doors only, so a page saved through the Studio, REST or MCP kept the binding, with its request headers, and the console kept sending it." }, { "where": "'The judge is the retirement's own' paragraph", "from": "The judge is the retirement's own: `ViewDataSchema` parses the component's `data`, and the prescription it raises is raised by the page parse unchanged (... `code` is `custom` ...). ... It judges nothing else in the bag: another `data` provider, a component whose `data` is a row array (...), a custom or registered type with no props row, and a component's own `dataSource` binding are untouched. `checkPageComponentViewData` is exported from `@objectstack/spec/ui`, like the four other `PageSchema` checks, so a mirror built from `PageSchema.shape` can re-attach it.", "to": "The judge is the retirement's own: the component's `ComponentPropsMap` row parses its `data` with `ViewDataSchema`, and the finding carries that schema's prescription unchanged, one text for a view and a page. It reaches every component under `regions` and `slots`, at any depth, a component nested in a `page:tabs` item or a container included. Only those four types meet this prescription: a component whose `data` is a row array (`object-kanban`, `object-calendar`, `object-timeline`) is judged by its own row and refused for its shape, a custom or registered type with no props row is not judged, and a component's own `dataSource` binding is untouched. (The checkPageComponentViewData sentence is deleted.)" }, { "where": "FROM -> TO table header (rows kept)", "from": "| you wrote (accepted by the page parse until this change) | write instead |", "to": "| you wrote (saved by the Studio, REST and MCP door before 18) | write instead |" }, { "where": "'What an author who still writes it sees.'", "from": "`definePage()`, `defineStack({ pages })`, `os validate` and `PUT /api/v1/meta/page/:name` refuse the page at `regions[i].components[j].properties.data.provider` (or the nested or slot position) with the prescription. At the save door that is `422 INVALID_METADATA`, nothing persisted.", "to": "`os validate`, `os build`, `os lint` and `PUT /api/v1/meta/page/:name` refuse the page at `pages[i].regions[j].components[k].properties.data.provider` (or the nested or slot position), rule `component-props-invalid`, with the prescription. At the save door that is `422 INVALID_METADATA`, nothing persisted. `definePage()` and `defineStack({ pages })` run no authoring rule and accept the page." }, { "where": "stored-page paragraph (os migrate sentence kept)", "from": "Left as stored, the page still loads and is served, registered under `[metadata_spec_invalid]` with the refusal in the `_diagnostics` of every read, and its next save is refused with 422. The console stops sending the request when its own reader of the retired arm is deleted (objectstack-ai/objectui#12325); until then a stored page keeps sending it.", "to": "Left as stored, the page still loads and is served as stored, with no read diagnostic for the binding, and its next save is refused with 422 by the component-props gate. The console no longer reads the retired arm (objectstack-ai/objectui#12325), so a stored page does not send the request." }, { "where": "ADR-0087 marker reason (token 'not-required (already-registered view-data-api-provider-retired)' kept)", "from": "this change makes the page parse refuse what that entry retired, and its acceptance criteria now name the page parse beside the component-props gate", "to": "the component-props gate refuses what that entry retired at the CLI doors and the save door, and its acceptance criteria name that gate" } ], "measured_for_rewrites": "On this head through validateComponentProps: object-grid with node dataSource provider api (same-origin) gives no finding; a custom type with data api gives no finding; object-kanban, object-calendar and object-timeline with data api give component-props-invalid at properties.data ('expected array'), not this prescription; object-grid with data provider rest gives component-props-invalid with the union discriminator text. Door readings as pinned in this PR: boot loaded 1 / invalid 0 with no metadata_spec_invalid warn; read _diagnostics.valid true; next save 422 INVALID_METADATA by component-props-invalid. objectui#12325 is in the console pin since 53e3638e.", "deliberate_correction_section_draft": "## DELIBERATE CORRECTION\n\nFile: `.changeset/pre/23357-page-component-view-data-api-refused.md`. The note was consumed by `18.0.0-next.2`, and the 18.0.0 GA entry is compiled from `.changeset/pre/` again. Its sentences that this PR makes false are rewritten in place, each against this PR's head. The frontmatter, the `Clause-②:` line, the `**BREAKING**` marker, the FROM → TO rows, the one-line fix, the `os migrate meta --stored` sentence and the ADR-0087 disposition token are unchanged. `packages/spec/CHANGELOG.md` (the published next.2 entry) is not touched.\n\n(the seven from → to rows above)\n\nAuthority: the maintainer's 「同意」, recorded in `6210183493`, as applied by `6210987382`, the record that supersedes `6210952492`. The precedent is PR #23418's `6203578381`. `Check Changeset` reds by design on this edit; it is not a required context and runs only on `pull_request`.", "tests": "HEAD 40624b32: spec build, then refused-shapes.test.ts + object-refinement-check-exports.test.ts 284/284; check:generated exit 0; check:doc-authoring exit 0. Round-1 suites on 39977e95 (spec 20873, lint 6781, metadata-protocol pins 170/170, typechecks) are not re-run; the only delta since then is one runtime string in refused-shapes.ts.", "gates": "dispatch-gates --commands on 40624b32: 90 commands, the same set as before. Run with exit codes recorded before any pipe: 88 exit 0; check:lean-entry-closure exited 3 (objectql/core dist missing in the fresh worktree) and exits 0 after building the objectql closure; check:dual-build-cjs-loads exit 3, not run locally, left to CI. --ran: 90 derived, 89 run, 1 NOT-MEASURED, 0 UNRUN, exit 0. The changeset gates (check-empty-changeset, check-adr-0087-registration, check-changeset-no-major) are exit 0 within that set, since no foreign changeset is edited.", "mcp_calls": "1 this round (pull_request_read get_comments on #23784); 5 in total", "api_writes": "1 this round: this os-dev-report comment via the fleet-write relay. Plus git push of 40624b32.", "deviations": [ "Item (the in-place 23357 correction) not done: the permission classifier refused the edit (Modify Shared Resources). A follow-up read-only grep in the same worktree was refused too, and the Grep tool then answered. The rewrites are in rewrites_for_23357." ], "open_questions": [ { "question": "Who applies the 23357 rewrites, given this session's classifier refuses edits to .changeset/pre/**?", "options": [ "A: the seat applies rewrites_for_23357 verbatim to .changeset/pre/23357-* on this branch and writes the DELIBERATE CORRECTION section", "B: the maintainer adds a permission rule for this session and re-sends the patch round" ], "recommendation": "A: the text is final and measured. Applying it is mechanical, and it keeps the denied action with an actor who holds the maintainer's word." } ], "out_of_scope_findings": [] }Generated by Claude Code