Skip to content

lint 18.x: page-predicate-over-budget becomes an error, refusing a page component props CEL slot over the platform parse bounds (the refusal half of #24953) #25002

Closed

Description

@objectstack-fleet

Filed by domain:spec seat 3 (seat post #18883) · baozhoutao · session session_01D6F9axfoPzR7t8G1J7Ytzz. It carries the deferred half of #24953 under the standing ruling 「甲」 (#6015 6292005854, rule 2). ⛔ Not a claim. Grade and routing are triage's. Target: the next protocol major (19.0).

Why it is deferred

In 18.x, page-predicate-over-budget (validatePagePredicateBounds, @objectstack/lint, landed by PR #24999 for #24953) reports a warning at os validate, os build, os lint and the page publish door. It fires on a CEL slot declared inside a page component's properties bag whose source overruns DEFAULT_LIMITS (maxAstNodes 256, maxDepth, maxListElements). Examples are a page:tabs item visibleWhen, object-form section and inline field visibleWhen / readonlyWhen / requiredWhen, record:alert visible, and action:* visible / disabled. Such a source does not parse anywhere on the platform, faults on every evaluation, and the console fails open. The refusal is a narrowing no ADR-0087 conversion can carry.

19.0 scope

  1. Severity and tier: the finding's severity becomes error, and in the same edit the authoring-rules entry moves its tier from advisory to gating. A page carrying such a slot then fails os build and is refused at the page door with 422 VALIDATION_ERROR on its next save. Stored pages keep loading, because the gate judges writes only.
  2. Message: drop "A future major release refuses it."
  3. Tests: validate-page-predicate-bounds.test.ts flips its warning assertions to error and adds a door-refusal pin with code and status.
  4. Changeset: breaking, FROM (warning, page saves) → TO (error, page refused), with the one-line fix: shrink the predicate, or precompute it into a formula or roll-up field.

Acceptance: the card's ~390-node tab-item visibleWhen is refused at os build and at the page door, with the bound named. A within-bounds source is unchanged.

Dedupe

Dedupe words: page-predicate-over-budget, maxAstNodes, page:tabs visibleWhen, 19.0 refusal. This is new: the 18.x half is #24953.


Generated by Claude Code

Activity

  1. changed the title [-]lint 19.0: `page-predicate-over-budget` becomes an error, refusing a page component props CEL slot over the platform parse bounds (the deferred half of #24953)[/-] [+]lint 18.x: `page-predicate-over-budget` becomes an error, refusing a page component props CEL slot over the platform parse bounds (the refusal half of #24953)[/+] on Oct 21, 2026
  2. objectstack-fleet commented on Oct 21, 2026

    @objectstack-fleet
    ContributorAuthor

    Re-timed to 18.x: pm:queue, p2. Triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-21T01:37Z


    Generated by Claude Code

  3. added
    area:studioChanging a running app without code — authoring, publish, docs and the portal
    enhancementNew feature or request
    on Oct 21, 2026
  4. objectstack-fleet commented on Oct 21, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 30
    Session: session_01D6F9axfoPzR7t8G1J7Ytzz
    Account: baozhoutao (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-25002-page-predicate-budget-error
    Worktree: objectstack-issue-25002
    Domain: domain:spec
    Seat: domain:spec#3 (seat post #18883)
    File surface (at origin/main 688052e147 or later; stop on a breach and explain it in the report):

    Read on origin/main 688052e147 at 2026-10-21T06:42Z: validate-page-predicate-bounds.ts reports at warning (lines 81 and 205), and its message says "A future major release refuses it." (line 212).

  5. objectstack-fleet commented on Oct 21, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 25002,
    "status": "done",
    "branch": "claude/issue-25002-page-predicate-budget-error",
    "pr": "#25088",
    "session": "session_01D6F9axfoPzR7t8G1J7Ytzz",
    "premise_still_valid": true,
    "summary": "page-predicate-over-budget (validatePagePredicateBounds) now emits severity 'error'. Its authoring-rules entry moves from advisory to gating. The message drops 'A future major release refuses it.' The docblock and the registry comment cite the amended 「甲」 (6303865025). A page whose component props carry a CEL slot over DEFAULT_LIMITS now fails os validate, os build and os lint, and an active save or a draft promotion is refused at the page door. Measured door code: 422 INVALID_METADATA, not the card's VALIDATION_ERROR. The pins and the changeset use what the door answers. Producers measured: 0 in-repo pages carry such a slot, and so does HotCRM at c8a7a70, so no producer fix was needed. Changeset: @objectstack/lint minor with a BREAKING FROM/TO section, the one-line fix, the claim's Clause-② line, and an adr-0087 not-required (no-migration-prescription) marker, following the shape of bb4f5cc. No generated docs reference the rule, so nothing was regenerated. Deviation: origin/main was not merged before opening. It is 7 commits ahead, and the only lint overlap is validate-component-props.ts, not a file this PR touches. CI builds the merge ref.",
    "tests": "All runs at HEAD 53ae2b0, after building @objectstack/lint... and @objectstack/metadata-protocol^... under os-verify-lock (VERDICT command-exit 0 both). lint targeted: vitest run on validate-page-predicate-bounds.test.ts, runtime-gate.page-visibility-predicate-writes.test.ts and authoring-rule-wiring.test.ts gave 'Test Files 3 passed (3) / Tests 59 passed (59)'. lint whole package: 'Test Files 153 passed (153) / Tests 7056 passed (7056)', chained with && after metadata-protocol typecheck, lock VERDICT command-exit 0. lint typecheck (tsc + check:test-typecheck): exit 0. Door file protocol.runtime-authoring-gate.test.ts: '1 passed / Tests 180 passed (180)', including 4 new #25002 pins: (a) 422 INVALID_METADATA, the issue at properties.items[1].visibleWhen naming 'maxAstNodes budget (platform limit 256)', no active row stored; (a) the draft promotion is refused; (b) door and build give the same finding key by key; (c) a within-bounds control saves. Ablation, under the lock with trap restore: committed first, then ablation-replace anchor x1 to x0, blob e4a15923c57d to 51d908070c3a, severity back to 'warning' spelled with marker ablation25002. Rebuilt lint; ablation-dist-preflight shows the marker present in 4 dist files. Mutant lint file: 'Tests 5 failed | 13 passed (18)'. Mutant door file -t #25002: 'Tests 3 failed | 1 passed | 176 skipped' (the control stays green). Restore: git checkout HEAD -- PATH, git diff HEAD empty, hash equals the HEAD blob. Rebuilt; preflight --absent shows the marker absent in all 20 dist files and the tree clean. Restored runs: 18/18 and 180/180. dispatch-gates --commands: 66 derived, all run. 63 exit 0, including check-adr-0087-registration --base origin/main, check-changeset-no-major, check-empty-changeset, check:changeset-gate-self-tests, check:nul-bytes, check:cross-package-test-inputs and check:test-source-alias. NOT MEASURED, exit 3 on a prerequisite: check:dual-build-cjs-loads (needs a whole-workspace dist), check:lean-entry-closure (needs objectql dist) and check:type-check-debt (its closure build hit the lock's queue budget). dispatch-gates --ran with exit codes: '66 derived, 63 run, 3 NOT-MEASURED, 0 UNRUN'. CI gates: in_progress. Producer measurement: 30 page modules (65 page values) and the crm, multi-package and todo composed stacks gave 0 findings. Literal scan: 9,919 files and 13,840 strings of 120+ chars gave 0 cel-too-large. HotCRM c8a7a70: 611 files, 0. A planted 78-term control is found by both instruments.",
    "mcp_calls": "0 GitHub MCP calls. 1 claude-code-remote add_repo (objectstack-ai/hotcrm, read-only; it answered read_available and attached nothing).",
    "api_writes": "3 REST writes, all through the fleet-write relay as objectstack-fleet[bot]: POST /repos/objectstack-ai/objectstack/pulls (draft, pr_create); POST /repos//issues/25088/assignees (baozhoutao, the same pr_create action); POST /repos//issues/25002/comments (this os-dev-report). Plus git push of the branch (not REST). Zero label writes: the dispatch named no label, and skip-changeset does not apply because the PR carries a changeset.",
    "open_questions": [],
    "out_of_scope_findings": [
    "carrier: domain:spec seat 3 (the owner of #24999's changeset). The pending .changeset/24953-page-predicate-bounds-warning.md still says 'It is a warning in 18.x ... A future major release refuses it.' If it ships in the same release as this PR, the @objectstack/lint CHANGELOG states both the warning and the refusal. That file is outside this claim's file surface, so it was left untouched. This PR's changeset says it supersedes the warning-only behaviour. Suggested fix: delete that one sentence in a docs-only edit before the release. Noted, not filed.",
    "carrier: none (the card's text). The card and the issue body name the door's refusal code as '422 VALIDATION_ERROR'. The door answers 422 INVALID_METADATA, measured in the new pin. Noted in Acceptance notes only."
    ]
    }


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 21, 2026

    @objectstack-fleet
    ContributorAuthor

    Close-out — landed

    • PR fix(lint)!: os build and the page save door refuse a page component props CEL slot over the platform parse bounds (#25002) #25088 merged as 31f0f279f3 (single-parent squash on main).
    • Patch-id verified: the merged commit's patch-id equals the reviewed head 53ae2b07d2 (131ffb4afb).
    • Seat review: PASS, 6312571507 on the PR. No contract review was owed: the PR touches only lint, has no governed path, and declares Clause-②: no.
    • What shipped: page-predicate-over-budget is an error, and its authoring-rules tier is gating. A page component props CEL slot over the platform parse bounds now fails os validate / os build / os lint, and its next save is refused at the page door with 422 INVALID_METADATA. The card said VALIDATION_ERROR; the PR uses the code the door actually answers.
    • Release text: the pending .changeset/24953-page-predicate-bounds-warning.md still says "A future major release refuses it." Correcting it is held for the maintainer, together with the seat's other pending release-note corrections.
    • The claim on this card ends here. pm:dispatched removed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:studioChanging a running app without code — authoring, publish, docs and the portaldomain:specenhancementNew feature or requestpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions