Skip to content

Pin @objectstack/* to 17.1.0 - #5529

Draft
os-support-ai wants to merge 4 commits into
mainfrom
claude/issue-5328-spec-pin-17-1-0
Draft

Pin @objectstack/* to 17.1.0#5529
os-support-ai wants to merge 4 commits into
mainfrom
claude/issue-5328-spec-pin-17-1-0

Conversation

@os-support-ai

@os-support-aios-support-ai commented Aug 21, 2026

Copy link
Copy Markdown
Collaborator

Fixes#5328

One gate is deliberately red and I did not fix it — check:eager-closure. It needs a maintainer decision, described at the bottom. Everything else is green; verification is quoted below against the merged HEAD.

The pin

A lockfile refresh, nothing else. All four @objectstack/* packages move together — a split resolution is what produced the dual-version spec graph that reddened check:spec-symbols in this repo's history.

packagebeforeaftermanifest edit
@objectstack/spec17.0.017.1.0none
@objectstack/client17.0.017.1.0none
@objectstack/formula17.0.017.1.0none
@objectstack/lint17.0.017.1.0none

No manifest edit was required, confirming the card's assumption: all 38 declarations across 33 packages are ^17.0.0, a single distinct range per package, and ^17.0.0 already admits 17.1.0. Two transitive @objectstack/* packages move in lockstep with them (core, sdui-parser17.0.017.1.0), which is what keeps the graph single-version — grep -c '@objectstack/[a-z-]*@17\.0\.0' pnpm-lock.yaml is 0. One unrelated transitive re-resolved inside its own caret: @mongodb-js/saslprep 1.4.13 → 1.5.0.

motion is untouched, so PR #4958's lockfile change was not absorbed — the branch point is correct.

Note on pnpm update, because it does more than the card asked for: run against the four package names it rewrote all 31 manifests from ^17.0.0 to ^17.1.0, and also silently re-indented two unrelated check:* script lines in the root package.json. Both were reverted and the install re-run, so the lockfile's specifier: fields still read ^17.0.0 while version: reads 17.1.0. The diff is lockfile-only for the pin, as the card specified.

Green-keeping

Each item below is forced by the new build and nothing else. Every one was counter-probed against origin/main with the 17.0.0 lockfile to confirm it is bump fallout rather than a pre-existing red.

Fixed here — mechanical, one correct answer already pinned by existing evidence:

  • icontains is a new canonical VIEW_FILTER_OPERATORS member (vocabulary 19 → 20) and is itself a member of VALID_AST_OPERATORS. Three places needed it: data-objectstack's alias table (an identity row like contains — unmapped, an authored icontains reaches the wire raw, the shape that shipped an unfiltered query in objectstack#3948); plugin-view's canonical-to-builder table, which is keyed by ViewFilterOperator and so failed to compile (mapped to the builder's containsCaseInsensitive, the id that authors $icontains — deliberately not folded onto contains, which would rewrite a case-insensitive filter as case-sensitive on the next save); and plugin-list's mapOperator, given an explicit arm rather than left to the default passthrough that happens to work today.
  • onSuccess added to core's SPEC_ACTION_KEYS — diagnostic only. That list feeds warnOnUnknownActionKeys, so without it an author writing the key the spec now declares is told it is unknown.
  • Palette: the stale element:filter exclusion is dropped and the newly-declared record:discussion excluded as the same renderer as the already-offered record:chatter. Nothing the palette offers changes.
  • Console registry parity: the two targetVariable exemptions deleted — they went dangling-and-stale exactly as that file's own docblock predicted they would at the next pin; the five record:* blocks 17.1.0 adds to ComponentPropsMap (37 → 42) pinned using the same pin-dependent shape GA_ONLY_BLOCKS already established.
  • Tombstone judge: 17.1.0 retires element:filterwholly — it leaves PageComponentType while its props schema stays in ComponentPropsMap with every key tombstoned. That is a retired block, not the "broken probe" the old floor assumed, so the floor now applies to blocks the enum still offers, and the control key is searched for rather than taken from found[0] (which had made the assertion depend on sort order).

Recorded, not fixed — each is capability wiring or a contract call, which a pin bump does not take as a rider. Each uses the gate's own purpose-built, ratcheted ledger, so the entry dies the moment the real fix lands:

One observation filed and not acted on: the palette advertises the pair under the legacy alias (record:chatter) and now explicitly excludes the canonical record:discussion#5495.

Also worth recording, because it defeats the obvious check: PageComponentType has 34 members before and after. element:filter left as record:discussion arrived, so a member-count assertion cannot see this release at all.

Verification

Run on merged HEAD 97c1162af (this branch after git merge origin/main), exit codes captured before any pipe.

  • pnpm build — turbo: Tasks: 43 successful, 43 total
  • pnpm type-check — turbo: Tasks: 81 successful, 81 total
  • pnpm lint — turbo: Tasks: 47 successful, 47 total (the full farm, not a narrowed run)
  • pnpm test, all four shards: 1,762 files, 22,433 passed, 1 skipped, 0 failed
  • Gates, each PASS: check:spec-symbols · check:phantom-deps · check:self-import · check:action-forward-parity · check:control-bytes · check:published-dist · check:node-esm-load · check:esm-specifiers · check:doc-types · check:doc-snippets · check:i18n-keys · check:i18n-drift · check:i18n-dead-keys · check:skills-paths · lint:coverage · type-check:coverage · quick-reference:check · changeset:check · check-changeset-presence

Their own verdict lines, rather than a bare exit code:

✅ spec symbol derivation: 1282 files scanned against 4966 spec export names; 13 declared dialects, 4 untriaged collisions in 2 packages.
✅ action forward parity: 5 surfaces checked against 40 runtime-read keys from 4 consumers; 19 justified omissions, 11 known gaps, 0 payloads exempt from the freshness rule.
✅ 8 source file(s) of 6 released package(s) changed, and this change declares 1 changeset(s).

⛔ The one red gate — check:eager-closure, and why I did not touch it

readingvalue
eager closure, origin/main @ 2524e7450 with the 17.0.0 lockfile3,871,997 B gzipped (PASS, 85.9 KB headroom)
eager closure, this branch4,001,689 B gzipped
delta+129,692 B (+126.7 KiB, +3.35%)
MAX_EAGER_CLOSURE_GZIP_BYTES3,960,000
over by41,689 B

The growth is real content, not a packaging accident — the spec's own dist.mjs goes from 11,661,923 to 12,593,720 bytes (+8%) — and essentially all of it lands in one chunk: vendor-objectstack 1493.3 KB → 1619.5 KB.

I did not raise the ceiling, for three reasons:

  1. [Decision] Should the eager-closure budget be tightened below today's payload — absolute ceiling, true ratchet, or per-chunk budgets? #5468 was ruled today, and the recorded outcome (Add per-chunk budgets on top of the aggregate eager-closure ceiling — vendor-objectstack (38%) first — ruled follow-up of #5468 #5490) is option A"the absolute aggregate ceiling stays as shipped (PR fix(ci): weigh the console eager closure, not one entry chunk #5466)". That card also says, in its own words: "Gate-strength policy is the maintainer's. ⛔ No seat should pick this."
  2. Raising it is not a one-line change. The headroom invariant is an expect()MAX - BASELINE.gzipBytes must stay below REGRESSION_THIS_GATE_MUST_CATCH_BYTES (91,136) — so covering a 129,692 B delta means also rewriting the hardcoded BASELINE in scripts/__tests__/check-eager-closure-budget.test.ts, i.e. dismantling the very assertion [Decision] Should the eager-closure budget be tightened below today's payload — absolute ceiling, true ratchet, or per-chunk budgets? #5468 cites as the ceiling's guarantee.
  3. This regression is larger than the 89 KiB apps/console: the vendor-objectstack advancedChunks group folds the lazily-imported @objectstack/lint into an eagerly-loaded chunk — 89 KiB gzipped on every page load #5266 incident the gate was built to catch. The gate is working exactly as designed; this is the case it was sized for.

There are also queued cards pointing at this chunk specifically — #5490 is pm:queue to add per-chunk budgets starting with vendor-objectstack, and #5325 / #5359 are the cleave direction — so widening the aggregate now would hide the growth inside headroom right before a card lands a budget on it.

The decision needed: either re-baseline the ceiling deliberately (accepting +126.7 KiB on every console page load, which is what the mandated 17.1 upgrade costs), or land a cleave first and let this PR follow. I have no recommendation to offer past the measurements — the ruling above puts this choice outside a dev seat.


Generated by Claude Code

…oves
Lockfile refresh only — every manifest already declared `^17.0.0`, which
admits 17.1.0, so no dependency range changed. spec, client, formula and
lint move in lockstep (a split resolution is what produced the dual-version
spec graph that reddened check:spec-symbols in this repo's history).
Green-keeping, each forced by the new build and nothing else:
- data-objectstack: identity alias row for `icontains`, a canonical
VIEW_FILTER_OPERATORS member as of 17.1.0 and itself a member of
VALID_AST_OPERATORS. Unmapped, an authored `icontains` reaches the wire
raw — the shape that shipped an unfiltered query in objectstack#3948.
- app-shell palette: drop the now-stale `element:filter` exclusion, exclude
the newly-declared `record:discussion` as the same renderer as the offered
`record:chatter`. Nothing the palette offers changes.
- check-spec-symbol-derivation DEBT: `ReferenceRailEntry`, which 17.1.0
started exporting under a name objectui already used. The shapes disagree
on `icon` (spec's schema is $strict and refuses it), so reconciling is a
contract call — filed as #5494.
- check-action-forward-parity KNOWN_GAPS: `onSuccess` x4 declared surfaces.
ActionRunner has honoured it all along; 17.1.0 supplied the missing half
by declaring it authorable, so it became owed. Forwarding it is capability
wiring — filed as #5493.
check:eager-closure is NOT addressed here and is left red deliberately: the
closure grows 129,270 gzipped bytes (3,871,997 to 4,001,267), 41,267 over a
ceiling the maintainer ruled on today in #5468 — "the absolute aggregate
ceiling stays as shipped", and "gate-strength policy is the maintainer's".
Refs #5328
All four are forced by the new contract and nothing else.
- plugin-view: map the newly-canonical `icontains` onto the builder's
`containsCaseInsensitive` (the id that authors the spec's `$icontains`).
The table is keyed by ViewFilterOperator, so this was a compile error,
not a silent gap. Deliberately not folded onto `contains`, which would
rewrite a case-insensitive filter as case-sensitive on the next save.
- test-support tombstone judge: 17.1.0 retires `element:filter` WHOLLY —
it leaves PageComponentType while its props schema stays in
ComponentPropsMap with every key tombstoned. That is a retired block,
not the "broken probe" the old floor assumed, so the floor now applies
to blocks the enum still offers. The control key is searched for rather
than taken from found[0], which had made it depend on sort order.
- console registry parity: delete the two `targetVariable` exemptions,
which went dangling-and-stale exactly as that file's docblock predicted
they would at the next pin; pin the five `record:*` blocks 17.1.0 adds
to ComponentPropsMap (37 entries to 42) using the same pin-dependent
shape GA_ONLY_BLOCKS already established; exempt
`record:reference_rail.entries`, an array of objects a flat scalar
`inputs` carrier cannot express, whose editor also needs #5494's `icon`
question settled first.
Refs #5328
Three inventories that enumerate a spec vocabulary, all named by their own
ratchets on the bump.
- plugin-list `mapOperator`: explicit `icontains` arm. The emitted spelling
equals the input, so `default` already returned it — but that file's
header records relying on the AST set happening to accept a raw view
spelling as exactly how it stopped discriminating in #3641, so the arm
is written out and pinned in EXPECTED_AST_TARGET.
- plugin-list tab presets: VIEW_FILTER_OPERATORS is 20, not 19.
- core `SPEC_ACTION_KEYS`: add `onSuccess`. Diagnostic only — the list
feeds warnOnUnknownActionKeys, so without it an author writing the key
the spec now declares gets told it is unknown. The forwarding gap stays
open and tracked (#5493).
Refs #5328
@github-actions

Copy link
Copy Markdown
Contributor

❌ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 52 chunks)3908.4 KB3867.2 KB
Main entry chunk (gzip)151.1 KB350 KB
Entry fileindex-DGDtL58r.js
StatusFAIL

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

PackageSizeGzipped
app-shell (index.js)10.04KB3.72KB
app-shell (runtime-config.js)7.42KB2.32KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)1.17KB0.53KB
auth (AuthProvider.js)29.34KB7.05KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)6.35KB2.43KB
auth (index.js)2.77KB1.22KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.02KB0.89KB
auth (useIsWorkspaceAdmin.js)3.04KB1.45KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)506.94KB113.63KB
core (index.js)4.51KB1.80KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)160.38KB44.54KB
fields (index.js)237.14KB59.49KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.22KB3.08KB
i18n (provider.js)23.13KB7.63KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)30.51KB7.57KB
i18n (useSafeTranslation.js)7.77KB3.13KB
layout (index.js)38.95KB10.97KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)9.35KB3.31KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)4.42KB1.42KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)1.81KB0.83KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)46.62KB12.83KB
plugin-charts (index.js)64.72KB18.35KB
plugin-chatbot (index.js)181.21KB43.14KB
plugin-dashboard (index.js)128.51KB32.94KB
plugin-designer (index.js)212.39KB42.83KB
plugin-detail (index.js)242.15KB60.89KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)124.40KB30.26KB
plugin-gantt (index.js)164.10KB39.87KB
plugin-grid (index.js)200.75KB54.24KB
plugin-kanban (index.js)52.93KB14.60KB
plugin-list (index.js)111.74KB27.18KB
plugin-map (index.js)20.06KB6.62KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.49KB11.93KB
plugin-timeline (index.js)26.68KB7.66KB
plugin-tree (index.js)8.50KB2.88KB
plugin-view (index.js)84.56KB20.69KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)3.77KB1.33KB
react (SchemaRenderer.js)43.66KB14.77KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)1.33KB0.69KB
react (schema-input.js)1.45KB0.83KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (index.js)4.77KB2.16KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)10.76KB3.17KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.29KB0.24KB
sdui-parser (validate.js)6.92KB2.40KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)0.20KB0.18KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)0.20KB0.18KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.87KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-retry.js)4.32KB2.02KB
types (index.js)3.08KB1.53KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)0.20KB0.18KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@os-support-aiClaude

Copy link
Copy Markdown
CollaboratorAuthor

PM review — holding at draft, blocked on a maintainer decision

Reviewer of record: the spec@objectui seat (session_01BisYvhR7yZ7ggXAwthTZH5), the seat that dispatched #5328. Verified against GitHub, not against the report's self-description.

The red gate is correctly red, and correctly not fixed here

check:eager-closure fails by 41,689 B (branch 4,001,689 B vs MAX_EAGER_CLOSURE_GZIP_BYTES 3,960,000; origin/main measured at 3,871,997 B with 85.9 KB headroom). Raising the ceiling is gate-strength policy, which is a maintainer decision — not this dev's, and not mine.

The dev's citation checks out. I read #5490 directly: it records the maintainer's ruling of today verbatim as 「其他接受」 = A now + C next, B rejected, with the aggregate ceiling staying as shipped, and states in its own words that "Gate-strength policy is the maintainer's. ⛔ No seat should pick this." Refusing to raise it was the right call, and reporting it rather than quietly widening the budget is exactly the behaviour the gate exists to protect.

Escalated with a four-axis analysis and three costed options: #5531.

What I verified, beyond the report

  • PR shape: draft ✅, base main ✅, Fixes #5328 on the first line ✅, changeset present and scoped to the five affected packages ✅.
  • Governed-surface check (run before any ready/queue consideration, from get_files rather than the report): the 13 changed paths touch no governed surface — no .claude/**, no skills/**, no docs/adr/**, no AGENTS.md / CLAUDE.md. So this PR is on the ordinary path once it is green; it is held only by the gate above.
  • CI right now: 22 check runs, zero failures so far — 9 green, several still in_progress including Bundle Analysis, which is the one that will independently confirm the eager-closure red. No conclusion has been read as green that is merely pending.
  • Serial constraint held: motion is untouched in the lockfile, so PR chore(deps): bump motion from 12.43.0 to 13.1.0 #4958's change was not absorbed — the branch point was correct, as the report claims and the diff confirms.
  • Lockstep: all four declared @objectstack/* moved together, plus the two transitives (core, sdui-parser), with zero @objectstack/*@17.0.0 left in the lockfile — which is what keeps check:spec-symbols green.

On the out-of-scope findings

#5493, #5494 and #5495 were filed rather than ridden in, and each was parked in the gate's own ratcheted ledger so the entry dies when the real fix lands. That is the right shape — a pin bump takes no riders. I have not re-graded them; grading is triage's.

One judgement I specifically agree with: mapping icontains to the builder's containsCaseInsensitive rather than folding it onto contains. Folding would have silently rewritten a user's case-insensitive filter into a case-sensitive one on the next save — a data-visible defect that would have looked like a tidy one-line simplification.

Verdict

Not ACCEPT, not REWORK — ESCALATE. The implementation is sound and I found nothing to send back. It waits on #5531.

⛔ Staying draft. Not flipped to ready, not queued, not auto-merged.


Generated by Claude Code

@os-support-aiClaude

Copy link
Copy Markdown
CollaboratorAuthor

CI is fully in: 1 failure, and it is the escalated one

All 22 check runs are now completed on head 97c1162a. 18 success · 3 skipped · 1 failure. The single failure is Bundle Analysis — the eager-closure budget already escalated to #5531.

This upgrades the PR body's "everything else is green" from a self-report to a CI-verified fact. Green includes Type Check, Lint, all four Test shards, Build & E2E, Build Docs, Live E2E (informational), and every changeset and doc gate.

CI and the dev's local measurement agree exactly — the same numbers in different units:

CI (KiB)local (B)check
eager closure3908.4 KB4,001,689×1024 = 4,002,202 ✅
budget3867.2 KB3,960,000×1024 = 3,960,013 ✅

One reading CI adds that the local run did not surface: the entry chunk is 151.1 KB against a 350 KB budget — comfortably inside. So this is not an entry-point regression; it is the statically-reachable closure across 52 chunks. That matters for the decision on #5531, because it means no amount of entry-point tidying reaches this — only reducing what console's first screen statically pulls in, or accepting the weight.

Why I am not pushing a fix

⛔ The only change that turns this green is raising the ceiling, and that is gate-strength policy — the maintainer's, per the ruling recorded on #5490 today ("Gate-strength policy is the maintainer's. ⛔ No seat should pick this."). This is precisely the case the gate was built for: the regression is larger than the 89 KiB incident that motivated it.

Skipping, disabling, or re-baselining the gate to get green is off the table for this seat under any of the three options on #5531. The PR stays draft until that card is answered.

No re-run requested: this is a deterministic budget computation, not a flake — a second run returns the same bytes.


Generated by Claude Code

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

Projects

None yet

2 participants

@os-support-ai@claude