Skip to content

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

Closed

Description

@objectstack-fleet

Filing gate ③, a ruled task: ruling 6161173492 on #23388 (letter B, the maintainer's 「23388 B 是不是最简单?」), 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.

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

  1. Delete the narrow judge. That means checkPageComponentViewData and VIEW_DATA_SOURCE_COMPONENT_TYPES in packages/spec/src/ui/page.zod.ts, its .superRefine on PageSchema, and its line in object-refinement-check-exports.test.ts.
    • It also means its published export from @objectstack/spec/ui, with the api-surface/ui.json and export-origins/ui.json lines regenerated.
    • Removing the export narrows the public surface. That is why this card carries target:v18: after 18 GA the removal waits for 19.
  2. 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:
  3. 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 _diagnostics of every read". That diagnosis comes from the PageSchema parse, which this card removes. The props rule at 'runtime-publish' judges the next save only.
  4. Pins:
    • the save door still refuses a page component's data of provider: 'api' on the four object-* types, now through the props rule, with the retirement's prescription;
    • the object/value control still saves.

Dedupe

MCP search_issues on objectstack-ai/objectstack, closed included:


Generated by Claude Code

Activity

  1. added
    enhancementNew feature or request
    domain:specDomain lane — seat card indexed by label:pm:seat
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    on Oct 14, 2026
  2. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    First touch and unlock: pm:blocked → pm:queue; grade p2 → p1 by the protocol-first class · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-15T23:55Z

    Read in this act: the body in full (0 comments), #23388's landing record, and PRs #23418 and #23419.

    ⛔ Not a claim.

  3. added
    pm:queueReady for the PM dispatch loop
    priority:p1High: required for production / M2
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    pm:queueReady for the PM dispatch loop
    on Oct 15, 2026
  4. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 9 (second shift, batch 3) · 2026-10-16T00:49Z · ruling 6161173492 item 6, the follow-up for #23357, unlocked by triage 6204768090. Delete the narrow judge (checkPageComponentViewData, VIEW_DATA_SOURCE_COMPONENT_TYPES, its .superRefine on PageSchema and 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 as GET /user answers it; always the card's assignee)
    Branch: claude/issue-23447-delete-page-view-data-judge
    Worktree: objectstack-issue-23447
    Domain: domain:spec
    Seat: domain:spec#2 (seat post #18549)
    File surface (at origin/main 29c7157af4 or later; stop on a breach and explain it in the report):

  5. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  6. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  7. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  8. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    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": "Patch round 2 completed at head 7c25be0a. The maintainer authorized the edit directly in this session (「授权你做修改」), which cleared the earlier permission refusal. .changeset/pre/23357-page-component-view-data-api-refused.md is corrected in place with the seven rewrites listed in comment 6211600395, verbatim; diff 7 insertions, 7 deletions. Unchanged: 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 token 'not-required (already-registered view-data-api-provider-retired)'. packages/spec/CHANGELOG.md, content/docs/releases/**, .changeset/pre.json and every other .changeset/pre/* are untouched. This round also carries 40624b32 (COMPONENT_API_BINDING_FATE: the console no longer reads the retired arm, since the console pin carries objectui#12325).",
      "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"
        }
      ],
      "deliberate_correction_section": "## DELIBERATE CORRECTION\n\nFile: `.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:\n1. 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\".\n2. 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\".\n3. 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.\n4. FROM → TO header: \"(accepted by the page parse until this change)\" → \"(saved by the Studio, REST and MCP door before 18)\".\n5. \"`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.\n6. 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\".\n7. 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.\n\nAuthority: 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`.",
      "tests": "Unchanged since round 2. 40624b32: refused-shapes.test.ts + object-refinement-check-exports.test.ts 284/284, check:generated exit 0, check:doc-authoring exit 0. 39977e95: spec 20873, lint 6781, metadata-protocol pins 170/170, typechecks exit 0. 7c25be0a adds only the changeset text.",
      "gates": "dispatch-gates --commands on 7c25be0a: 90 commands, the same set as before, each run with its exit code recorded before any pipe. 88 exit 0. check-empty-changeset --base origin/main exit 1: the DELIBERATE CORRECTION class, by design ('do NOT restore it -- say so on the PR and get it confirmed'). 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. check-adr-0087-registration exit 0; check-changeset-no-major exit 0.",
      "mcp_calls": "0 this round; 5 in total",
      "api_writes": "1 this round: this os-dev-report comment via the fleet-write relay. Plus git push 40624b32..7c25be0a.",
      "deviations": [
        "The patch round's in-place edit was refused twice by the session's permission classifier. It was done after the maintainer authorized it in this session: first with the Edit tool, and then the push, once the maintainer turned auto mode off."
      ],
      "open_questions": [],
      "out_of_scope_findings": []
    }

    Generated by Claude Code

  9. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT → PR #23784 comment 6213402099 · domain:spec seat 2 · session session_01LFqdRsuM5nkqoJdHd5ztVk · 2026-10-16T10:24Z · on contract review PASS 6206677361 and delta PASS 6213384087. Ready + auto-merge in this act; Fixes #23447 closes this card on merge.

  10. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · PR #23784 → a35f7a6764 (Fixes #23447) · domain:spec seat 2 · os-bill · session session_01LFqdRsuM5nkqoJdHd5ztVk · 2026-10-16T10:59Z

    probe reading
    PR object merged 2026-10-16T10:56Z out of the merge queue, as a squash a35f7a6764 on parent 34b740f2d1
    origin/main git merge-base --is-ancestor a35f7a6764 origin/main → exit 0
    merged vs reviewed head git diff 34b740f2d1 a35f7a6764 and the reviewed net diff git diff 43567a8f 7c25be0a share git patch-id --stable 1d176d68. page.zod.ts's blob differs from the head's only because PR #23831 touched the same file on main in between
    queue branch no gh-readonly-queue/main/pr-23784-* ref remains
    card closed completed by Fixes #23447; pm:dispatched cleared in this act

    What holds on main now.

    • checkPageComponentViewData and its PageSchema superRefine are gone. The props rule, validateComponentProps with rule component-props-invalid, is the one judge of a page component's retired view-level api data binding. It judges at os validate, os build, os lint and the metadata save door.
    • A stored page with such a binding loads and is served as stored, with no read diagnostic, and its next save is refused with 422.
    • The consumed note .changeset/pre/23357-* says so for the 18.0.0 GA entry. That correction was a DELIBERATE CORRECTION, on the maintainer's 「同意」 (6210183493, scoped by 6210987382).

    Chain:

    • claim 6205481837
    • dev reports 6206321093, 6210894955, 6211600395, 6213059676
    • contract review PASS 6206677361, delta PASS 6213384087
    • ACCEPT 6213402099

    Follow-ups: #23789 is closed (the stale save-half family, PR #23800). #23860 (skills lane) is open, so a future .changeset/pre/ correction needs no in-session approval.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

domain:specDomain lane — seat card indexed by label:pm:seatenhancementNew feature or requestpriority:p1High: required for production / M2target:v18

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions