Skip to content

feat(spec): the view display page size defaults to 50 — PaginationConfigSchema.pageSize .default(25) → .default(50) - #20184

Merged
objectstack-fleet[bot] merged 5 commits into
mainfrom
claude/issue-20050-view-page-size-default-50
Sep 27, 2026
Merged

objectstack-fleet[bot] merged 5 commits into
mainfrom
claude/issue-20050-view-page-size-default-50

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #20050
Clause-②: no

What

The view display page size defaults to 50. PaginationConfigSchema.pageSize in packages/spec/src/ui/view.zod.ts moves from .default(25) to .default(50). That is the only declaration of the view display default. Maintainer ruling, verbatim (objectui#9853, batch #223 item 4): 「9853 默认页大小改为50」. The change goes into the protocol first: the renderer reads the spec default (objectui#9853 ruling C′ item 1), and no renderer hardcodes 50.

Contract face: accept set unchanged, one default moved

  • Default: ui/PaginationConfig:pageSize moves from 25 to 50. This is the only default the build's ratchet saw move (📌 1 declared default change(s) accepted (#4666): - ui/PaginationConfig:pageSize: 25 → 50).

  • Accept set: unchanged. The type is still z.number().int().positive(). The refusal pins should reject negative pageSize, should reject zero pageSize and should reject non-integer pageSize (view.test.ts) still pass without edits, and so does the component-arm cross-check (component-object-grid-pagination-accept-set.pin.test.ts). Measured on the built dist: PaginationConfigSchema.safeParse({ pageSize: 0 }) is refused with too_small at pageSize.

  • Describe text: unchanged, byte for byte. It still reads: "Number of records per page. On a view with no pager (kanban, gallery, timeline) it is the fetch ceiling, and the renderer owes two things: bound its fetch at this number, and, when the filtered set is larger than it, show a visible truncation signal saying what is on screen is not the whole set". The schema docblock gains one paragraph naming the ruling and stating that the renderer reads this default.

  • Parse outputs, measured on the rebuilt packages/spec/dist:

    input parsed pagination
    ListViewSchema with pagination: {} { pageSize: 50 } (was 25)
    ListViewSchema with no pagination absent, before and after
    ListViewSchema with pagination: { pageSize: 25 } { pageSize: 25 }
  • Published JSON Schema: json-schema/ui/PaginationConfig.json now has pageSize.default: 50.

Sweep of every text stating the display default as 25, counted by declaration

The declaration census covers every pageSize .default( under packages/spec/src. It finds 3 declarations: ui/view.zod.ts (25, this card), kernel/metadata-plugin.zod.ts (50) and marketplace/marketplace.zod.ts (20). The last two are out of scope per the card and untouched. Texts restating the view default:

text what it said this PR
view.zod.ts PaginationConfigSchema.pageSize .default(25) .default(50)
packages/spec/authorable-defaults/ui.json (generated) ui/PaginationConfig:pageSize = 25 regenerated by the build to = 50
content/docs/references/ui/view.mdx (generated), 3 rows: ListView.pagination, ObjectListView.pagination, ## PaginationConfig optional (default: 25) regenerated by gen:docs to optional (default: 50)
view.test.ts pin should default pageSize to 25 toBe(25) flipped to should default pageSize to 50 / toBe(50)
view.test.ts pin should accept custom page size input pageSize: 50 input changed to 25. With a default of 50 an input of 50 could no longer tell "the authored value survived" from "the default applied", so the pin now uses a non-default value

Deliberately unchanged. None of these states the current default:

  • component-object-grid-pagination-accept-set.pin.test.ts docblock table row | view — PaginationConfigSchema | …default(25) | no |. Its column header is declaration before #19046, so it is a historical record and still accurate.
  • Authored pagination: { pageSize: 25 } values: plugin-approvals sys-approval-request.object.ts (3 list views) and the CLI view scaffold template (packages/cli/src/commands/generate.ts). These are explicit author choices and still parse to 25.
  • Other pageSize: 25 hits in packages/spec/src/api/metadata.test.ts, kernel/metadata-plugin.test.ts, benchmark.bench.ts and sdui-parser tests. These are different surfaces or authored inputs.
  • Governed files: none. No file under skills/** or docs/adr/** states the view page-size default (grep for page size / pagination with 25, zero hits).
  • Hand-written docs / examples: none. No hand-written page under content/docs/** (outside references/) or examples/** states a page-size default of 25.

Surfaces this needed beyond the claim's list (measured, not optional)

  1. packages/spec/scripts/lib/default-changes.ts gains the row ui/PaginationConfig:pageSize from '25' to '50'. Without it pnpm --filter @objectstack/spec build fails with ❌ 1 authorable key(s) changed the DEFAULT they apply when the author omits them: - ui/PaginationConfig:pageSize: 25 → 50, and the gate prints this exact row to add. The row's reason states what moves and the one-line way to keep 25.
  2. Semantic migration entry view-pagination-page-size-default-50 (src/migrations/entries/semantic/18.…ts, plus registry.ts regenerated by gen:migration-registry). The ledger header prescribes one for a default move that reaches already-deployed silent documents. Every precedent where deployed behaviour moves has one: the autonumber unique default, the audience posture default and the approval escalation flip. The precedents where nothing deployed moves have none. gen:spec-changes and gen:upgrade-guide were re-run and produced zero diff, because step 18 is not projected yet. The same holds for the other 170 step-18 entries.

Changeset level: minor

This is a behaviour change for every author who omits the key, with no refusal and no type change. It is not a bug fix, so patch would understate it. It is not a narrowing and not a removal, so it is not breaking: Clause-②: no, no ADR-0087 marker owed (check-adr-0087-registration: "this PR adds no declared-breaking changeset"), and a major is refused by the repo in any case. This matches the level the previous published-default moves shipped at (the enableOnInstall default move and the default-flip conversion class both shipped minor). The changeset states the behaviour change for authors who omit pagination.pageSize and gives a FROM → TO table.

Reverse verification (ablation), after the fix was committed

node scripts/ablation-replace.mjs put back .positive().default(25).describe( in place of .default(50) at HEAD eaf5d39. The view.zod.ts blob c474dcb477c7 is identical at 72e9a6a. The anchor hit x1 → x0, and the blob went c474dcb477c7 → c6933f3d2587. Then it ran vitest run src/ui/view.test.ts. The direction observed was the expected one, red: Tests 1 failed | 460 passed (461) with FAIL … PaginationConfigSchema > should default pageSize to 50 and AssertionError: expected 25 to be 50. The restore was proven two ways: the blob equals the HEAD blob (c474dcb477c7…) and git diff HEAD is empty. The script also carried an EXIT/INT/TERM trap with an absolute path. The test imports ./view.zod from source, so no dist leg was needed.

Tests and gates (at 72e9a6a0, after merging origin/main e2c4e12)

  • @objectstack/spec build: exit 0 (📌 … ui/PaginationConfig:pageSize: 25 → 50). check:generated: 1 stale artifact (content/docs/references/**), fixed with gen:docs, then green.

  • @objectstack/spec test (--project local): Test Files 540 passed (540), Tests 15820 passed | 2 todo. Test (--project repo): 31 passed, 579 passed. typecheck: exit 0.

  • Consumer suites (contract-face fixture triage): @objectstack/platform-objects 55 files / 911 tests passed; @objectstack/lint 108 files / 4144 tests passed. A repo-wide grep finds no test outside packages/spec that asserts a parsed view's pagination.pageSize (no .snap/JSON fixture carries one either). plugin-approvals / cli suites were not run locally; they are declared to CI (their fixtures author pageSize: 25 explicitly).

  • Derived gates: dispatch-gates.mjs --commands --repo objectstack-ai/objectstack on the actual 8 changed paths (merge base e2c4e12) gives 112 commands. Every one was run at 72e9a6a, and its exit code was written to disk before any pipe. 108 exit 0. 4 are NOT MEASURED; each exited 3 with PREREQUISITE NOT MET because it reads BUILT output of packages this diff does not touch:

    • check:skill-examples needs @objectstack/client-react dist;
    • check:lean-entry-closure needs @objectstack/objectql dist;
    • check:dual-build-cjs-loads and check:type-check-debt need the whole workspace built.

    The targeted closure build could not get the shared verify lock (two 9-minute queue timeouts), so this is a declared narrowing, left to CI. This diff adds or changes no export, type or module (check:api-surface, check:dts-closure and check:published-files are green). The reconciliation dispatch-gates.mjs --ran reads: 112 derived famil(ies) accounted for — 108 run, 4 NOT-MEASURED (4 DERIVED from a recorded exit 3), 0 UNRUN. Three lint-dist gates first exited 3; after the lint closure was built they were re-run green. Also run: the 5 artifact-roster gates whose roster lives in a directory this diff touches (check-changeset-fixed, check:meta-url-spelling, check:authz-resolver, check:error-code-casing, check:filter-alias-parity), all exit 0.

  • Mergeability: a driver-less merge-tree of this head onto origin/main 836aad2a (7 commits newer, one of them touching registry.ts) is clean.

  • turbo ls --affected is not used for any narrowing here.

objectui (read-only, at .objectui-sha f8a9d0fb05)

No objectui test pins 25 as the spec default. objectui brings the spec schema in as stripImportedDefaults(SpecPaginationConfigSchema) (packages/types/src/zod/objectql.zod.ts), and spec-subschema-parity.test.ts asserts identity against that stripped object, not a value. Every pageSize: 25 in objectui tests is an authored input. objectui#9853 is where the renderer starts reading this default. objectui was not edited.

Acceptance notes


Generated by Claude Code

…hema.pageSize)

WIP: default flip and the flipped default pin; ledger, generated
artifacts and changeset follow.

Claude-Session: https://claude.ai/code/session_01Rjy9MeetSfq34PKn81CRiN
Co-authored-by: Claude <noreply@anthropic.com>
… -> 50

check:authorable-surface refuses an undeclared default move; this is the
DEFAULT_CHANGES_BY_MAJOR row the gate printed, with its reason.

Claude-Session: https://claude.ai/code/session_01Rjy9MeetSfq34PKn81CRiN
Co-authored-by: Claude <noreply@anthropic.com>
…us its changeset

Semantic migration entry view-pagination-page-size-default-50 (step 18,
registry regenerated) and a minor @objectstack/spec changeset naming the
behaviour change for authors who omit the page size.

Claude-Session: https://claude.ai/code/session_01Rjy9MeetSfq34PKn81CRiN
Co-authored-by: Claude <noreply@anthropic.com>
…efaults, view reference)

Claude-Session: https://claude.ai/code/session_01Rjy9MeetSfq34PKn81CRiN
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions github-actions Bot added size/m documentation Improvements or additions to documentation protocol:ui tests tooling labels Sep 27, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

2 anchor(s) derived from 1 changed package(s); no hand-written page names any of them. ⚠️ 1 changed file(s) yielded no anchor (packages/spec/authorable-defaults/ui.json), so the pages documenting them are NOT COVERED by this run — this is not a clean bill of health for those files.

What this run could not see
  • 1 changed file(s) yielded no anchor (packages/spec/authorable-defaults/ui.json) — pages documenting those are invisible to this run
  • 4 name(s) were too generic to anchor anything (single lowercase words)
  • the SDK route bridge reached 54 of 207 client-bound route-ledger rows — the other 153 have no registrar path: tail to select them, so pages documenting THEIR client methods cannot appear above, on this or any run. Of those 153: 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; 98 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 — 136 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 836aad2a19bd4639ded6a3a6bf18db8a75d3a2c3 → packageMentionDocs.

Which tree this was computed on

This run read content/docs from d8ad5893cd5bf2fe76471fd3e4affd725405e0ed — the merge of head 72e9a6a027fe4c3279d67ca1d100a4c95bcceb82 into base 836aad2a19bd4639ded6a3a6bf18db8a75d3a2c3, 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 d8ad5893cd5bf2fe76471fd3e4affd725405e0ed && git checkout d8ad5893cd5bf2fe76471fd3e4affd725405e0ed
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 836aad2a19bd4639ded6a3a6bf18db8a75d3a2c3 72e9a6a027fe4c3279d67ca1d100a4c95bcceb82 && git checkout -B drift-repro 836aad2a19bd4639ded6a3a6bf18db8a75d3a2c3 && git merge --no-ff 72e9a6a027fe4c3279d67ca1d100a4c95bcceb82

node scripts/docs-audit/affected-docs.mjs --json 836aad2a19bd4639ded6a3a6bf18db8a75d3a2c3

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

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 72e9a6a027fe4c3279d67ca1d100a4c95bcceb82

① Derived judgments

  • The declaration moved, and only the declaration. packages/spec/src/ui/view.zod.ts:1109 is pageSize: z.number().int().positive().default(50).describe( (was .default(25) at merge-base 836aad2a); the three describe lines are diff context, so the describe is byte-identical. The other two pageSize defaults in the tree (kernel/metadata-plugin.zod.ts:400 = 50, marketplace/marketplace.zod.ts:435 = 20) are untouched, per the card's scope line. Right.
  • Accept set unchanged. Probe on a throwaway worktree of the head (tsx against src/ui/view.zod.ts, then the same with view.zod.ts swapped to origin/main and restored): { pageSize: 0 } REFUSED too_small@pageSize, { pageSize: -1 } REFUSED too_small@pageSize, { pageSize: 2.5 } REFUSED invalid_type@pageSize, identical before and after. The three refusal pins in view.test.ts and component-object-grid-pagination-accept-set.pin.test.ts are unedited in the diff. Right.
  • Parsed output: {} moves 25 to 50, absence stays absent, authored values survive. Probe, before / after: PaginationConfigSchema.parse({}) 25 / 50; ListViewSchema with pagination: {} 25 / 50; ListViewSchema with no pagination key: 'pagination' in data false on both sides (view.zod.ts:2616 is PaginationConfigSchema.optional(), no default); pagination: { pageSize: 25 } 25 / 25; ObjectListViewSchema behaves the same ({} to 50, absent stays absent). The changeset's FROM/TO table and the PR body's three-row parse table say exactly this. Right.
  • Public surface regenerated where it is tracked. packages/spec/authorable-defaults/ui.json:85 now reads ui/PaginationConfig:pageSize = 50; content/docs/references/ui/view.mdx:930, :1329, :1598 (the ListView.pagination, ObjectListView.pagination and PaginationConfig tables) read optional (default: 50). The PR body's "published JSON Schema json-schema/ui/PaginationConfig.json now has default: 50" is a statement about build output, not a tracked file: packages/spec/json-schema/ is gitignored (.gitignore:63); the tracked witness for that emission is the authorable-defaults row, which the ratchet re-derives from the build. Consistent. Right.
  • By-declaration sweep is complete. git grep at the head over content/, docs/, skills/, examples/, apps/, packages/ and the tracked spec sidecars (docs/, prompts/, declaration-map/, authorable-surface/, liveness/, api-surface/) for any text stating 25 as a page-size default: zero hits outside the PR's own new files. Every remaining pageSize: 25 is an authored value (plugin-approvals sys-approval-request.object.ts x3, packages/cli/src/commands/generate.ts:164, spec tests on other surfaces) and parses to 25 on both sides. The one .default(25) left in prose, component-object-grid-pagination-accept-set.pin.test.ts:14, sits under the column header declaration before #19046 (line 12): a historical record, correctly left alone. Right.
  • Test pins. The default pin flipped to 50; the "custom page size" pin moved its input from 50 to 25 (view.test.ts:1437-1441 and :1444-1453). Necessary, not cosmetic: with a default of 50 an input of 50 could no longer tell "authored value survived" from "default applied". Right.
  • objectui at the pin (f8a9d0fb05) does NOT receive the 50 through the schema. packages/types/src/zod/objectql.zod.ts:146 is PaginationConfigSchema = stripImportedDefaults(SpecPaginationConfigSchema); the walk in packages/types/src/zod/imported-defaults.ts removes every ZodDefault at the import boundary and re-optionalises (objectui#8317, batch Organize JSON schema output by protocol category #90), so objectui's validator materialises no page size from the spec before or after this PR. The renderers keep their own numbers today: plugin-grid/src/ObjectGrid.tsx:1164 DEFAULT_FLAT_PAGE_SIZE = 10, plugin-list/src/ListView.tsx:962 DEFAULT_LIST_PAGE_SIZE = 100, plugin-kanban/src/ObjectKanban.tsx:85 DEFAULT_KANBAN_LIMIT = 100. So 50 reaches the Console only when objectui#9853 makes the renderer read the spec's declared default by a route other than the stripped parse. The changeset says exactly this ("the Console does so once objectui#9853 lands") and the PR body says "objectui#9853 is where the renderer starts reading this default"; nothing in the PR claims a Console effect today. Right. Wording note, not blocking: the new docblock at view.zod.ts:1100-1103 states the norm in the present tense ("a renderer reads the spec default, it never keeps a page size of its own"); at the pin that is the ruling, not the shipped state. It reads as the contract's requirement, which is what a schema docblock is for.
  • One objectui text still states 25 as the spec default. objectql.zod.ts:143 docblock: "the spec's .default(25) is stripped at the import boundary". The PR body's "No objectui test pins 25 as the spec default" is true but narrower than the sweep it implies; objectui is read-only for this card, so the correction belongs to objectui#9853 (noted under ③).

② Semver level

  • minor for @objectstack/spec is right. No accept-set change, no removal, no new key, no type change; a behaviour change for every author who omits the key, so not patch. .github/workflows/pr-automation.yml:753-766 ("WHICH LEVEL") grades a widening at least minor and leaves the two sub-major levels to the act; scripts/check-changeset-no-major.mjs refuses major in the launch window. Precedent for a published-default move: .changeset/enableoninstall-optional-preserve.md and .changeset/18605-enable-on-install-one-authority.md, both '@objectstack/spec': minor. Check Changeset concluded success on the head.
  • Clause-②: no is the right declaration. Clause ② is "a new key on a published payload" (check-changeset-no-major.mjs:7-8); a moved default adds no key, so the level axis stands down. The changeset carries no BREAKING banner, so check-adr-0087-registration.mjs judges nothing and no ADR-0087 registered marker is owed (script header lines 51-60: the gate is driven off the changeset's own breaking declaration).
  • DEFAULT_CHANGES_BY_MAJOR row: demanded by the build, and truthful. packages/spec/scripts/lib/default-changes.ts:537-539 (ui/PaginationConfig:pageSize, from '25', to '50') sits under 17, which is CURRENT_MAJOR (spec 17.4.0; build-schemas.ts:955), the only bucket that authorises anything (header lines 25-26). The header (lines 11-12) says check:authorable-surface refuses any default move until it is declared here, so this file was not optional. from and to are re-derived from the merge-base fingerprint and the build's emission, so the row cannot be wrong without the gate going red; its reason states what moves and the one-line way to keep 25, which is what the header asks for (lines 43-49). The authorable-defaults.test.ts:410-421 self-test's constraints (from differs from to, reason longer than 20 characters, key shape) are met.
  • Semantic entry view-pagination-page-size-default-50: warranted, correctly filed, accurate. Warrant: default-changes.ts:51-55 prescribes a semantic entry for a default change "that also warrants a migration TODO", and this one reaches deployed documents silently: the objectql engine registers the PARSED body of every assembled viewItems: entry (packages/objectql/src/engine.ts:6574, :6589, :6596), and the probe shows AssembledViewArtifactSchema with a list overlay carrying pagination: {} parsing to pageSize 25 before and 50 after. Filing at step 18 for a 17.x change: correct per registry.ts:4773-4783 ("v17.0.0 was cut before these narrowings landed, so their migration prescriptions belong to the NEXT major ... The enforcement itself ships earlier on the 17.x line ... this step is where migrate meta users are told"); precedent data/Field:unique (row under 17 at default-changes.ts:365, entry 18.autonumber-default-unique-organization.ts). Content: every sentence of reason and acceptanceCriteria (18.view-pagination-page-size-default-50.ts:17-36) matches the probe (empty config to 50, pagination: {} on a list view to 50, authored 25 stays 25, 0 / negative / fraction refused, absent stays absent); surface (line 14) carries no backtick, as its own comment and build-upgrade-guide.ts require, and a surface with spaces and a dash has 37 precedents in the registry. It tells an upgrading deployment the one true thing a mechanical pass cannot decide: which silent views were relying on 25. Not noise.
  • Registry regeneration. registry.ts:14062 places the entry in id order between view-filter-rule-scalar-operator-array-refused and wait-node-event-config-required, with the entry file's leading // comment carried verbatim, which is what build-migration-registry.ts (sorted by id, comment run copied) emits per entries/README.md. Step-18 ids are not projected: packages/spec/docs/protocol-upgrade-guide.md and packages/spec/spec-changes.json at the head contain no step-18 id (0 hits for three of them), so "gen:spec-changes and gen:upgrade-guide produced zero diff" is right. Whether the regions match byte-for-byte is check:migration-registry's call and is left to the head's check-runs (not rerun here).

③ Boundary flags

  • CLI scaffold pagination: { pageSize: 25 } (packages/cli/src/commands/generate.ts:164). Answer: an authored value, validates, parses to 25 on both sides; not a defect under this card. But it now scaffolds the OLD number rather than the platform default, so every os generate view output silently pins 25 rows where the ruling says 50. Worth a follow-up card (drop the key, or write 50); carrier none today, as the dev noted.
  • Stored views with pagination: {} change visible row count on upgrade, by channel. (a) Tenant-authored / runtime-assembled views travel in viewItems: and the engine registers the parsed body (engine.ts:6574-6596), so such a view is served with pageSize: 50 materialised (was 25) and the Console honours a served pagination.pageSize (ObjectGrid.tsx:1231, ListView.tsx:1307): those views show 50 rows on upgrade with no objectui change. (b) Stack-authored views: containers register without a full ViewSchema.parse (engine.ts:6521 comment) and objectui strips the default, so a pagination: {} container view keeps the renderer's own number (grid 10, list 100, kanban 100) until objectui#9853. The PR body does not separate the two channels; the changeset's "pagination block without pageSize now shows 50 rows" is exact for (a) and lands for (b) only with objectui#9853. Not blocking: the contract statement is correct on both, and the semantic entry already tells the deployment to write pageSize: 25 where 25 was relied on.
  • No server-side consumer reads the parsed default as a query limit. git grep for pagination?.pageSize / pagination.pageSize outside packages/spec, non-test, at the head: zero hits. No REST list limit or engine path derives from this default. Right.
  • Spec describe vs the renderer's plan for non-paged views. The card's Unblocks section says objectui#9853 keeps "a renamed fetch batch of 100" for non-paged views and kanban, while the unchanged describe (view.zod.ts:1110-1112) says pageSize is the fetch ceiling on a view with no pager. Pre-existing, not moved by this PR; objectui#9853 should reconcile which number a silent kanban actually fetches (50 per the spec default, or its own 100).
  • objectui residual text. packages/types/src/zod/objectql.zod.ts:143 still says .default(25); objectui#9853 should update it when it lands the renderer side.
  • Check-runs on the head, final snapshot at hand-back (per check, latest run). 27 concluded success (including Check Changeset, Type Check · source gates, Spec property liveness, Governed Surface Queue Guard, Check Documentation Links, the single-writer and claim guards); skipped: Auto Label, Check PR Size, Console Pin Gate, Packed-tarball smoke (opt-in); still in_progress at hand-back: Lint & Repo Gates, Test Core (1/6), Test Core (5/6); non-success conclusions: none. The verdict below is conditional on the in-progress families concluding success; a failure among them re-opens this record.

Implemented-by: claude/issue-20050-view-page-size-default-50
Reviewed-by: session_01Rjy9MeetSfq34PKn81CRiN

VERDICT: PASS

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/m tests tooling

Projects

None yet

2 participants