You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
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
Filed by domain:spec seat 3 (seat post #18883) · baozhoutao · session session_01D6F9axfoPzR7t8G1J7Ytzz. It carries the deferred half of #24953 under the standing ruling 「甲」 (#60156292005854, 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:alertvisible, 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
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.
Message: drop "A future major release refuses it."
Tests:validate-page-predicate-bounds.test.ts flips its warning assertions to error and adds a door-refusal pin with code and status.
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.
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
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/main688052e147 or later; stop on a breach and explain it in the report):
packages/lint/src/validate-page-predicate-bounds.ts and its test, where page-predicate-over-budget moves to error and the "A future major release refuses it." sentence is dropped;
the authoring-rules registry entry for this rule, moving from the advisory tier to the gating tier;
Read on origin/main688052e147 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).
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."
]
}
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.
Activity
[-]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)[/+]objectstack-fleet commentedon Oct 21, 2026
Re-timed to 18.x:
pm:queue, p2. Triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-21T01:37Z6303865025): 「暂时不考虑 v19,协议的调整原则上也是尽快,不考虑退役版本」, then confirmed triage's re-timing list in the triage seat's chat (「18.x 收回清单 同意」).page-predicate-over-budgettoerrorin 18.x as a BREAKING minor. No card waits on a 19.0 line.Restart-when:for 19.0 no longer applies.Generated by Claude Code
objectstack-fleet commentedon Oct 21, 2026
Claim: PM loop round 30
Session:
session_01D6F9axfoPzR7t8G1J7YtzzAccount:
baozhoutao(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-25002-page-predicate-budget-errorWorktree:
objectstack-issue-25002Domain:
domain:specSeat:
domain:spec#3(seat post #18883)File surface (at
origin/main688052e147or later; stop on a breach and explain it in the report):packages/lint/src/validate-page-predicate-bounds.tsand its test, wherepage-predicate-over-budgetmoves toerrorand the "A future major release refuses it." sentence is dropped;.changeset/25002-*.md.Container & model:
S,mode:subagent,model: default (no path-derived mandate)Clause-②: no (narrowing: a page component props CEL slot over the platform parse bounds is refused at
os buildand the page door; it ships now under the amended 「甲」, [PM seat] triage (objectstack-wide) — 🟢 Routine · session_01AavokzJ5DndAwitDXvKy4U · trig_01NcnCtMS2tH46nUg1a5TaMJ (hourly) · state = body + the round records newer than it #60156303865025)Responsibility:
the deferred half of #24953, re-timed to 18.x by triage (6305866852)Thread-read: 6305866852
Serial constraints cleared: PR feat(lint): a page component props CEL slot over the platform parse bounds warns at validate, build and the page door #24999 shipped the warning. This seat's in-flight PR fix(lint)!: refuse a page component whose properties is present but not an object, nested ones included #25067 touches
validate-component-props.ts, not this file. The dev re-checks open PRs touchingvalidate-page-predicate-bounds.tsand the authoring-rules registry before opening its own.Read on
origin/main688052e147at 2026-10-21T06:42Z:validate-page-predicate-bounds.tsreports atwarning(lines 81 and 205), and its message says "A future major release refuses it." (line 212).objectstack-fleet commentedon Oct 21, 2026
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
objectstack-fleet commentedon Oct 21, 2026
Close-out — landed
31f0f279f3(single-parent squash onmain).53ae2b07d2(131ffb4afb).6312571507on the PR. No contract review was owed: the PR touches only lint, has no governed path, and declaresClause-②: no.page-predicate-over-budgetis anerror, and its authoring-rules tier isgating. A page component props CEL slot over the platform parse bounds now failsos validate/os build/os lint, and its next save is refused at the page door with422 INVALID_METADATA. The card saidVALIDATION_ERROR; the PR uses the code the door actually answers..changeset/24953-page-predicate-bounds-warning.mdstill says "A future major release refuses it." Correcting it is held for the maintainer, together with the seat's other pending release-note corrections.pm:dispatchedremoved.