Repository navigation
Description
Filing gate ③: a maintainer-directed task. Maintainer, 2026-10-24, verbatim: 「同意:建议新建:与合并无关、独立成卡的产品/契约项(可现在建)」, approving the review's list of independent product / contract cards. Batch-of: 13 (this review batch; the per-fire quota is overridden by the maintainer's direction).
维护者速读
39 个发布包里 30 个没有 sideEffects 字段(false 5、true 2、数组 2)。字段缺失在 webpack / Rollup / Vite 消费者那里等于「每个模块都可能有副作用」,整个包不能摇树——这正是 check-side-effects-array.mjs 自己文件头量过的代价(app-shell 漏写时 console 首屏多出约 3.3 MB gzip)。而那个 1,380 行的门禁只校验两个包的数组。短期逐包声明;长期把「导入即注册」改成显式 register*(),每个包都能写 false,门禁随之删除。
Measured (2026-10-24, HEAD 7981384; manifest census)
sideEffectspresent in 9 of 39 published manifests:falsein core, i18n, react-runtime, sdui-parser, types;truein components, fields; arrays in app-shell (18 entries) and layout. Absent in the other 30: auth, cli, collaboration, create-plugin, data-objectstack, mobile, permissions, providers, react, runner, everyplugin-*except none, console.scripts/check-side-effects-array.mjs(1,380 lines) validates exactly the two array packages; its header records the measured cost of an omitted field on app-shell.- The plugin packages register on import (
ComponentRegistry.register(…)at module top level;apps/console/src/register-plugins.tsimports five of them for the side effect), so for them an honest value today is an array ortrue; pure libraries (react, providers, permissions, mobile, auth, collaboration, data-objectstack) can sayfalseafter a read of each entry. - Business reason: every external host that bundles
@object-ui/*pays for code it never calls; the console's own first-load budget (objectui#13447, console: first authenticated load pulls 336 eager JS chunks (~11.7 MB decoded) objectui#11798) is the in-house symptom of the same mechanism. - Dedup (
sideEffects): 12 hits, 2 open — objectui#13410 (app-shell pulling the chatbot root; the consumer-side symptom) and a Dependabot bump; closed: feat(app-shell): the designer registries are observable, and their readers re-render on registration (objectui#11939 step 1) objectui#11963, feat(app-shell): register record:approval_decision, armed in @object-ui/types (objectui#12342) objectui#12362 (registration observability). No card asks for the field on the 30 packages.
Task
- Per package:
falsefor the pure libraries, an array (the existing gate in--listmode helps derive it) ortruefor packages that register on import.sideEffectsis one of the eight contract fields, so each change carries a changeset. - Longer term (decision in its own card when ready): explicit registration (
register*()exports, no import-time mutation) so every package can declarefalseandcheck-side-effects-array.mjsis deleted. - 未实测: consumer bundle delta — measure with
check-eager-closure-budgetonapps/consolebefore and after.
Who acts: objectui domain:ui seat, one PR for the declarations. Effort M (30 manifests, each read). Risk: a wrong false drops a live registration (the objectui#6535 failure class) — run the gate per package before landing.
Filed by the read-only whole-repo review session https://claude.ai/code/session_01BDtwYUWhLGyWLzYQjZ95Cf on 2026-10-24, written through the maintainer's own account token (the session holds no fleet-bot credential). Evidence files: that session's scratchpad (objectui-review-report.md, findings-*.md). ⛔ Not a claim; triage grades and routes; suggested labels are suggestions only.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 24, 2026
Triage: first grade —
tech-debt·priority:p3·domain:ui·area:devpath·pm:queue· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-24T17:06Z⛔ Not a claim, ⛔ not a dispatch.
findingcomes off.sideEffectsper package now, measured package by package. Explicitregister*()comes later, on its own card, because it changes what an import does for consumers.Generated by Claude Code
objectstack-fleet commentedon Oct 25, 2026
Claim: PM loop round 1 · 2026-10-25T02:19Z
Session:
session_01Q4K9dtZAX6vw67etsxBeuP(the card session that works this card; claim written by thedomain:uiseat 4 sessionsession_01XWGTsmqrtrt1Zqh1ioWqsT)Account:
os-elon-muskBranch:
claude/project-thread-q1we3g(platform-assigned at spawn; the card session can push only this branch)Worktree:
objectui-issue-13464Domain:
domain:uiSeat:
domain:ui#4File surface: the
sideEffectsfield (that field only) in the publishedpackages/*/package.jsonmanifests that lack it;scripts/check-side-effects-array.mjsonly if an array package's list must change and its own tests; one.changeset/13464-*.mdnaming every package it changes (stop on breach; explain in the report)Container & model:
M,mode:thread,model: default tier (dispatch-gates --tier --repo objectstack-ai/objectui: no path-derived mandate),effort: highClause-②: no
Metadata-protocol: none
Responsibility:
n/a — not a defect cardThread-read: 6387079537
Premise: holds as a census — on objectui
main23e912ethe card's count (30 of 39 published manifests withoutsideEffects) is re-measured by the card session at its start; it works from its own listSerial constraints cleared: seat 4's PR objectstack-ai/objectui#13481 (React peer narrowing, 31 manifests) and PR objectstack-ai/objectui#13486 (
plugin-list/plugin-map/plugin-timelinemanifests) are in the merge queue — mergemainbefore opening and again before landing; seat 1's objectui#13442 / objectstack-ai/objectui#13449 / objectstack-ai/objectui#13450 declare no manifest fieldWrites: all PR, comment and label writes go only through objectstack's relay (
scripts/pm/fleet-write); never write with GitHub MCP.6387079537: declare per package now, measured package by package; explicitregister*()later, on its own card.falseonly after reading every entry module and finding no import-time mutation (registryregister(…), global CSS, polyfills,windowwrites); a package that registers on import gets an array of exactly those modules (derive it withcheck-side-effects-array.mjs --list) ortrue. A wrongfalsedrops a live registration (the objectui#6535 class): for eachfalse, the PR names the read; for each array, the gate passes on it.apps/console/dist/eager-closure.json, real production build), stated in the body. Lower no ceiling in this PR unless the drop is measured; the console first load: @objectstack/spec arrives as self-contained subpath bundles that duplicate each other; three tiny imports pull /system, /kernel and /api whole into the eager closure #25925 card owns the ceiling line concurrently — if both move it, the second to land re-measures.register*()and deletingcheck-side-effects-array.mjs(the card's longer-term item);apps/console(not published).objectstack-fleet commentedon Oct 25, 2026
Claim amendment ·
domain:ui#4· 2026-10-25T02:32Z · amends the claim6392391793(append-only; the claim's other lines stand)File surface, added on the card session's request:
scripts/__tests__/side-effects-declaration-consistency.test.ts, for two things only:impureNodescan the carve-out the array gate already has (local-binding-write): a member write whose root binding is declared in the same module and whose right side calls nothing, e.g.X.displayName = '…'. Pin both directions: that shape passes, and a write to an imported or global binding still fails.This keeps
falsehonest forreact,auth,mobileandpermissions, whose only top-level statements aredisplayNamewrites on local bindings.Readings accepted: the executables (
cli,create-plugin,runner) andplugin-gridgettrue.plugin-grid's reachability chain admits no array under the gate, which the PR states.Generated by Claude Code
objectstack-fleet commentedon Oct 25, 2026
os-dev-report
{ "issue": 13464, "status": "done", "branch": "claude/project-thread-q1we3g", "pr": "https://github.com/objectstack-ai/objectui/pull/13495", "session": "session_01Q4K9dtZAX6vw67etsxBeuP", "premise_still_valid": true, "summary": "29 published manifests now declare sideEffects (apps/console out of scope). false for react, auth, collaboration, data-objectstack, mobile, permissions, providers after a full-src scan (only same-module displayName writes). Gate-derived arrays for 15 plugins. true for plugin-ai, plugin-chatbot, plugin-dashboard, plugin-grid (no array satisfies every guard: no bundler alias / pure barrels via export star / loop-registered keys / reachability chain) and for the executables cli, create-plugin, runner. Per the amended claim 6392496025 the consistency test gains the gate local-binding-write carve-out (pinned both directions) and its census grows.", "tests": "head fcfc372: vitest run side-effects-declaration-consistency + check-side-effects-array + check-sdui-registration-pins tests: Test Files 3 passed (3), Tests 172 passed (172). c16787a: vitest run --maxWorkers=2 scripts/ = 1 failed of 5857 (sdui-registration-pins could not read plugin-dashboard loop keys; fixed in fcfc372 by declaring true, re-run green above); export-to-react-preamble + tenancyPostureWall.parity: 9 passed. Reverse check on c16787a: carve-out line removed -> 2 failed / 113 passed (the false-package case and the pure-direction pin); restored from HEAD, git diff HEAD empty.", "gates": "local: check-side-effects-array exit 0 (17 packages); check-eager-closure-budget exit 0; check-sdui-registration-pins exit 0 (68 registrations present); check-changeset-presence exit 0; check-changeset-no-major exit 0; check-changeset-fixed exit 0; check:new-line-citations exit 0; eslint on the changed test exit 0. objectui has no dispatch-gates.mjs, list hand-derived. CI families: in_progress at report time (PR just opened).", "measurement": "console eager closure, real production build (turbo build packages + console build): before 6f629a7 3,106,386 B gzip 85/2291 chunks; after fcfc372 3,106,204 B gzip 85/2291 chunks (-182 B). No ceiling moved.", "dogfood_battery": "n/a: no ! in the PR title and no (narrowing) arm", "mcp_calls": "0", "api_writes": "2 relay strokes: pr_create objectui#13495 (assignee os-elon-musk); this os-dev-report comment + pr_request_reviewers", "open_questions": [], "out_of_scope_findings": [ "carrier: none. The two sideEffects guards disagree on a pure barrel (array gate requires every entry form; consistency test refuses a named source entry with no load-time effect), so plugin-chatbot is true. Noted in PR Acceptance notes, not filed: a reading, no consumer-visible defect." ] }Generated by Claude Code
objectstack-fleet commentedon Oct 25, 2026
ACCEPT → PR objectstack-ai/objectui#13495 comment 6392817892 ·
domain:ui#4· 2026-10-25T03:13Z. Landing under the maintainer's standing word;Part of, so after merge this card returns topm:queuewith the explicitregister*()item and thecheck-side-effects-array.mjsretirement.22 remaining items
objectstack-fleet commentedon Oct 29, 2026
domain:devx#1 · os-elon-musk · session_01LKHDniRQSWjRJyDtacwpEd
Claim: PM loop round 1 · 2026-10-29T14:51Z
Session:
pending(card thread, dispatched by seat sessionsession_01LKHDniRQSWjRJyDtacwpEd; amended when it starts)Account:
os-elon-muskBranch:
pending(the card thread's harness-pinned branch; amended)Worktree:
objectstack-issue-25913Domain:
domain:devxSeat:
domain:devx#1File surface: the
sideEffectsfield of the publishedui/packages/*/package.jsonmanifests that lack one, one changeset per touched package, andscripts/check-side-effects-array.mjsonly if an array package is added (stop on breach; explain in the report)Container & model:
M,mode:thread,model: default,effort: highClause-②: no — a manifest bundling hint, no
packages/spec/src/**schema and no accepted set changes; the dev says so in the PR, and if a declaration would narrow what a consumer can import, it stops and reportsMetadata-protocol: none
Responsibility: 30 of 39 published ui packages declare no
sideEffects, so no consumer can tree-shake them |check-side-effects-array.mjscovers only the two array packages | every external host that bundles the ui packagesThread-read: 6430916285
Premise: measured 2026-10-24 at 7981384; the dev re-runs the manifest census on origin/main first
Serial constraints cleared: the dev lists open PRs touching any
ui/packages/*/package.jsonbefore editing; changesets live in the root.changeset/(standing constraint)Seat pick on the full order with seat 2 (#20163), alternation (knock 6499301324). Scope = the card's first box only (per-package declarations). The explicit-registration rewrite stays a later decision card. Contract review: not triggered unless the dev declares
Clause-②: yes.Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:devx#1 · os-elon-musk · session_01LKHDniRQSWjRJyDtacwpEd
Release:
session_01LKHDniRQSWjRJyDtacwpEd(devx seat 1) · the seat dispatched the stale first box, not the re-scope 6416621475; the card thread found that out on measurement and changed nothing · next:pm:queue(the re-scoped item waits on the rootci.ymlconstraint, 6430916285)Seat correction. The dispatch order was written from the card body's first box. It should have been written from triage's re-scope 6416621475: only the retirement of
check-side-effects-array.mjsremains on this card. The card thread (session_016WV4cyd9xXusapQ3CGmV1w, branchclaude/project-thread-3hxw8u) measured before editing and stopped. Nothing was pushed.Census at origin/main
77e993ea(everyui/packages/*andui/apps/*manifest): every publishedui/packages/*manifest already declaressideEffects.false: 11 (auth, collaboration, core, data-objectstack, i18n, mobile, permissions, providers, react, react-runtime, types).true: 7 (cli, components, create-plugin, fields, plugin-chatbot, plugin-dashboard, plugin-grid).@object-ui/test-support(private) and@object-ui/console(ui/apps). For the console, absent is the honest value: Vite applies a package'ssideEffectsto its own relative imports, sofalsewould tree-shake the console's own CSS andregister-pluginsimports.That matches objectui#13495 (landed 2026-10-25). The remaining item, retiring the gate, keeps the two pitfalls in 6430916285: the root
ci.ymlwiring is under the maintainer'sci.ymlconstraint, andcheck-sdui-registration-pins.mjsreads the script as a library.Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW
Maintainer ruling recorded · 2026-10-30T12:50Z. The question was put to the maintainer (os-justin) in seat session
session_01QSeKYmTYfaPbLQD4BJfomW. It named the remaining item (retireui/scripts/check-side-effects-array.mjs), the rootci.ymlwiring and the library reader. The maintainer first said, verbatim, 「p3 的任务也可以处理」, then chose, verbatim: 「A 授权改 ci.yml (Recommended)」.Option A as put to the maintainer:
side-effects-declaration-consistency.test.tsfully supersedes the gate.ci.ymlstep. The PR is Tier H and waits on maintainer approval.This lifts the standing
ci.ymlconstraint for this card's one step only.Claim: PM loop round 12 · 2026-10-30T12:50Z
Session:
session_01QSeKYmTYfaPbLQD4BJfomW(mode:subagent: the dev shares this session ID; its identity is the branch)Account:
os-justin(the seat's linked user, asGET /useranswers it; the card's assignee)Branch:
claude/issue-25913-retire-side-effects-array-gateWorktree:
objectstack-issue-25913Domain:
domain:devxSeat:
domain:devx#2File surface (stop on breach; explain in the report):
ui/scripts/check-side-effects-array.mjsand its testui/scripts/__tests__/check-side-effects-array.test.ts;ui/scripts/check-sdui-registration-pins.mjs(+ its test),ui/scripts/check-eager-closure-budget.mjs,ui/scripts/vite-declared-lazy-views.ts, andui/scripts/__tests__/side-effects-declaration-consistency.test.ts(reference text only);ui/scripts/if the shared derivation moves;check:side-effects-arrayline inui/package.json;.github/workflows/ci.ymlL3562 (that one step only);lint.ymlrun_self_testline the self-test wiring gate forces. Code comments inui/packages/app-shell/**that name the script are text only.Container & model:
M,mode:subagent,model: opus,effort: high; the contract review runs atCONTRACT_REVIEW_TIER(Tier H via.github/workflows/**), and the seat waits for that tier and never downgrades.Clause-②: no (internal tooling; no published package changes)
Metadata-protocol: none
Responsibility: n/a — not a defect card (gate retirement, tooling)
Thread-read: 6500172459
Premise: holds at origin/main
6410029d1b. The gate is still wired at.github/workflows/ci.yml:3562(pnpm --dir ui run check:side-effects-array).ui/package.json:71defines the script.check-sdui-registration-pins.mjsstill imports from it. Whether the consistency test fully supersedes it is the dev's first measurement.Serial constraints cleared: the dev lists open PRs touching
.github/workflows/ci.ymlorui/scripts/**before editing, and mergesmainbefore opening and again before landing.Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW
Dispatched under claim 6523253073 · 2026-10-30T12:51Z: an
os-devsubagent (mode:subagent, effort high) on branchclaude/issue-25913-retire-side-effects-array-gate.Measurement comes first. The dev builds a table with one row per gate assertion, each showing where that assertion lives after retirement.
premise_still_valid: false. The card then closes not planned, as option A said.ci.ymlstep.That PR is Tier H. It waits on the at-tier contract review and on maintainer approval. The report comes back here as
os-dev-report.Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW
os-dev-report
{ "issue": 25913, "status": "done", "branch": "claude/issue-25913-retire-side-effects-array-gate", "pr": null, "session": "session_01QSeKYmTYfaPbLQD4BJfomW", "premise_still_valid": false, "summary": "H1 FAILS: the consistency test does not supersede ui/scripts/check-side-effects-array.mjs, so per the maintainer's ruling (Option A, 「A 授权改 ci.yml (Recommended)」, 'if it does not: report back; the card closes not planned') nothing was changed and no PR was opened. Read at origin/main 59547058ae. The decisive LOST row is the gate's core MISSING-registrar check, and it was measured, not only read: deleting app-shell's './dist/console/diagnostics/CloudAiModelStatus.js' (a ruled control) from its sideEffects array makes the gate exit 1 (MISSING) while side-effects-declaration-consistency.test.ts stays 109/109 green; the same holds when the './src/...CloudAiModelStatus.tsx' line is deleted instead. Both texts already say this: the gate header (L224-235) calls the two guards 'deliberately independent', and the consistency test (L636-641, L1369-1370) hands 'is the set EXACTLY right, missing or stale' to the gate. H1 TABLE (gate assertion @ gate line → asserted where after retirement): R1 at least one array package, else exit 2 @L1291 → COVERED consistency L1083 'discovers the declaring packages'. R2 a non-string entry throws @L325 → COVERED L209. R3 an unsupported workspace glob throws @L302 → COVERED L184. R4 every published entry form is named @L1226 → COVERED L1320 'every sideEffects array covers all of its package's entry forms'. R5 the barrel's source spelling is named @L1227 → COVERED by L1258 + L1320 (the alias src form must exist and be declared). R6 MISSING: every registering module in the entry graph is named in both spellings @L1228-1235 → LOST (probes above; check-sdui-registration-pins derives its keys FROM the array, so it cannot see an unnamed registrar either). R7 STALE source spelling @L1236 → PARTIAL, L1377 'every declared source entry really does have a load-time side effect'; that classifier counts any call, write or bare import, where the gate counts registrations only. R8 STALE published (dist) spelling of a deep module @L1236 → LOST (the L1348 phantom check accepts any module form). R9 reachability, every registrar reached through covered modules @L1247 checkReachability → LOST. R10 an unknown top-level effect in an array package is refused with exit 2 @L1204 → LOST (the consistency test reds on effects only in false packages, L1291). R11 initializer registration, export const X = f() where f writes an escaping binding @L620/L705 → LOST (the consistency header L126-132 says it does not prove this). R12 every published subpath is a walk root @L1187-1192 → LOST (the consistency test walks the barrel only, L1027). R13 an unclassifiable published form is refused @L1109 → LOST. R14 the spelling map round-trips on the barrel @L974 → LOST. R15 a published barrel and a source barrel exist @L923/L937 → PARTIAL: source COVERED at L1242, published LOST. R16 an unresolved relative specifier is refused @L1194 → COVERED for the barrel graph at L1264. R17 a glob entry is refused @L1238 → COVERED L1428. R18 the per-package graph has at least 2 modules @L1255 → PARTIAL, only an aggregate floor of 150 at L1287. H2 reading (no edit): two importers. ui/scripts/check-sdui-registration-pins.mjs:64 imports deriveSpellingMap and readArrayPackages; ui/scripts/__tests__/check-side-effects-array.test.ts:10-20 imports EXIT_*, classifyEffect, evaluate, evaluatePackage, main, readArrayPackages and walkEntryGraph. Readers by name only: check-eager-closure-budget.mjs:162; vite-declared-lazy-views.ts:64, :362 and :592 (the last is author-facing remedy text naming 'pnpm check:side-effects-array'); pins :16/:103/:122/:134 and its test :39/:196; consistency :639/:736/:1370; app-shell register-builtin-designers.ts:39. ui/scripts has no lib/ dir (shared modules sit flat, e.g. component-registrations.mjs). Today the exact-enumeration condition and the spelling-map exit-2 condition have exactly one owner each: evaluatePackage (L1170-1276) and deriveSpellingMap (L921) in this gate, and pins L134 defers to it. Retirement would leave both with zero owners. H3 reading: holds but moot. The only wiring is .github/workflows/ci.yml:3561-3562. The step name and 'check:side-effects-array' appear nowhere else in .github/, scripts/ or ui/scripts (no lint.yml run_self_test line, no roster, no required-check name).", "tests": "No code changed. Baseline at 59547058ae under os-verify-lock: vitest run of side-effects-declaration-consistency + check-side-effects-array + check-sdui-registration-pins: Test Files 3 passed (3), Tests 170 passed (170), VERDICT command-exit 0. Baseline gate: node scripts/check-side-effects-array.mjs exit 0, 17 packages ok. Mutation probe 1, via scripts/ablation-replace.mjs (anchor x1 → x0, blob 31e89666 → a019a722), deleting app-shell './dist/console/diagnostics/CloudAiModelStatus.js': GATE_EXIT=1 'MISSING ./dist/console/diagnostics/CloudAiModelStatus.js'; consistency test TEST_EXIT=0, Tests 109 passed (109). Restored: blob == HEAD 31e89666, git diff HEAD empty. Mutation probe 2, the same with './src/console/diagnostics/CloudAiModelStatus.tsx' (blob → ee2a41de): GATE_EXIT=1 MISSING; TEST_EXIT=0, 109 passed. Restored: blob == HEAD, git diff HEAD empty. Each part's exit was captured on its own line, not taken from the batch verdict.", "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack: exit 2, 'this branch changes nothing against origin/main (merge base 59547058a) — nothing to derive' (empty diff, so --ran has nothing to reconcile). No PR, so no check-runs.", "dogfood_battery": "n/a: no PR, no ! title and no (narrowing) arm", "mcp_calls": "0", "api_writes": "1: POST issues/25913/comments (this os-dev-report) via scripts/pm/post-stamped.mjs. Also one git push (an empty branch at 59547058ae, the landing marker), which is not a REST write.", "line_budget": "n/a: no file changed", "files_changed": [], "deviations": [ "The worktree was cut from origin/main 59547058ae, not the claim's premise sha 6410029d1b, because main moved. Both premise lines still hold at the new base: ci.yml:3562 and ui/package.json:71.", "Mutation probe 1 joined its parts with ';', so os-verify-lock printed batch-last-exit. Per-part exits (GATE_EXIT, TEST_EXIT) were echoed and are what is cited. Probe 2 used '&&'-joined groups.", "The empty branch claude/issue-25913-retire-side-effects-array-gate remains on origin at 59547058ae with no commits. It was not deleted; deleting it is a PM call." ], "open_questions": [], "out_of_scope_findings": [ "carrier: none. Noted, not filed: the card's remaining item contradicts the gate's own recorded design (two independent guards, header L224-235). Closing not-planned per Option A is the ruled outcome. Dedupe words: side-effects-array, sideEffects gate retirement, consistency test supersede, check-sdui-registration-pins." ] }Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW
Closed not planned · 2026-10-30T12:58Z. This follows the maintainer's ruling recorded in 6523253073. The maintainer, os-justin, chose 「A 授权改 ci.yml (Recommended)」 in seat session
session_01QSeKYmTYfaPbLQD4BJfomW. That option's second arm reads: "if it does not [fully supersede the gate]: report back; the card closes not planned."Why the arm fired (os-dev-report 6523384102; the seat re-read the two texts at origin/main):
sideEffectsarray makescheck-side-effects-array.mjsexit 1 (MISSING), whileside-effects-declaration-consistency.test.tsstays green at 109/109. The probe was run twice, once with thedistspelling and once with thesrcspelling, and the tree was restored to HEAD each time.check-sdui-registration-pins.mjsderives its keys from the arrays and importsderiveSpellingMap/readArrayPackagesfrom the gate, so it cannot stand in for the missing-registrar check.State:
ci.ymlstep at L3562 stays.sideEffectsdeclarations themselves landed in objectui#13495. Explicitregister*()stays uncarded per triage 6416621475.pm:dispatchedcomes off in this stroke.claude/issue-25913-retire-side-effects-array-gate(no commits) is left as it is.Generated by Claude Code