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 }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
finding(test-infra): 40 vi.mock('@object-ui/i18n') factories still freeze the mock surface — the specifier is outside check-vi-mock-inherit's coverage, and one frozen helper has zero importers #7337
Filed by the domain:ui execution seat (session session_01NRRumy89BYdW9ogbcdHTho) on behalf of the dev that implemented objectui#7173 (PR #7330), which measured it while fixing a collection-time failure and handed it over for scoping. Filed unassigned, finding, awaiting first grading.
A new module-scope createSafeTranslation(...) call in packages/plugin-chatbot killed packages/app-shell/src/console/ai/__tests__/ConversationsSidebar.test.tsx at COLLECTION — [vitest] No "createSafeTranslation" export is defined on the "@object-ui/i18n" mock — because that test's vi.mock('@object-ui/i18n', …) factory hand-listed its exports. That is exactly objectui#6849's shape (closed by PR #6894, which added the check-vi-mock-inherit ratchet), except that the ratchet's COVERED_SPECIFIERS covers @object-ui/react, not @object-ui/i18n.
Survey on the PR's merged head (generic-aware scan, not a substring match — a naive grep over-reported 84):
92 vi.mock('@object-ui/i18n', …) call sites across packages/*/src and apps/*/src;
41 of them do NOT obtain and spread the real module (importOriginal under any name, or vi.importActual of the same specifier);
all 40 test files among those 41 were run in one vitest invocation: Test Files 1 failed | 39 passed (40) — only ConversationsSidebar.test.tsx reaches plugin-chatbot today, and PR fix(plugin-chatbot): translate the whole AI pending-actions inbox #7330 converts that one file to the inheriting form;
the 41st is apps/console/dev/__tests__/setup/common-mocks.ts, which exports applyCommonConsoleMocks with a frozen @object-ui/i18n factory and has ZERO importers repo-wide (only its own doc comment and export line mention it) — dormant dead code carrying the same shape.
So 40 frozen factories remain live, each one collection-death waiting for the next export any widely-imported @object-ui/i18n consumer reads at module scope. Nothing reports them, because the gate that catches this class does not list the specifier.
Suggested direction
The gate's own documented expansion path: drive the @object-ui/i18n frozen population to zero (convert the 40 to async (importOriginal) => ({ ...(await importOriginal()), /* overrides */ }), or vi.importActual in zero-parameter factories) and add @object-ui/i18n to COVERED_SPECIFIERS in scripts/check-vi-mock-inherit.mjs in the SAME PR, so the ratchet holds it at zero. Delete apps/console/dev/__tests__/setup/common-mocks.ts or wire it up — a helper nobody imports should not exist in either shape. objectui#6849's caveat still applies: the recogniser must be semantic (the 11 already-correct spellings in that card's census), which the gate already is.
Dedupe
search_issues is zeroed in the filing session at the moment (control query returned 0 — the shape objectui#7185 records), so dedupe went through the label-scoped listing of open finding cards (none about @object-ui/i18n mock factories) plus a direct read of #6849 (closed by PR #6894; scope @object-ui/react only). If a card already covers the i18n specifier, close this one as a duplicate.
scripts/check-vi-mock-inherit.mjs:100 * zero for it, then add it to `COVERED_SPECIFIERS` in the same PR. The list only
scripts/check-vi-mock-inherit.mjs:101 * ever grows. objectui#6892 carries the per-specifier worklist.
Suggested shape: One card per specifier rather than one card for 298 sites — each is independently landable, each ends with a one-line addition to COVERED_SPECIFIERS, and a stalled one blocks nothing.
⚠️Re-derive the numbers before acting on them. They are a snapshot at 9ce20233f, taken with the guard rather than with a grep — and the whole reason #6849 exists is that the previous figures came from a grep and were wrong in both directions.
Measured on #6768: Test Files 3 failed | 546 passed with Tests 6694 passed — zero failed assertions, because those files' tests never ran. It reads as flake, and the bill lands on whoever added the export, in a red suite that does not point at them.
Claim: PM loop round 43 (wave 2) — domain:devx @ objectui execution seat
Session: session_01KDq78vMMSzCGWGmhUYBabh
Branch: claude/issue-7337-vi-mock-i18n-inherit
Worktree: objectui-issue-7337
Domain: domain:devx
File surface: scripts/check-vi-mock-inherit.mjs (its COVERED_SPECIFIERS) + the @object-ui/i18nvi.mock factories across package tests + pins in scripts/__tests__/. ⛔ Stop on breach: any packages/*/srcnon-test file; root package.json; the specifiers this card does not cover.
Container & model: M, mode:subagent, model: opus — default judgment tier, from this run of node scripts/pm/dispatch-gates.mjs --tier: "no path-derived mandate … floor sonnet · default opus · ceiling fable."⚠️ Its gate-family half derives nothing for this repo (it REFUSES a --repo objectstack-ai/objectui assertion), so the objectui gate list is hand-derived and you re-derive it for the files you actually change.
Clause-②: no — a gate/tooling or docs change; it does not alter what any published package accepts or rejects, and widens no public surface. ⚠️ Void condition: if the work turns out to need a change to a published package's exports or behaviour, stop and report — that is a re-tier.
Serial constraints cleared: Fresh reading at 2026-09-06T00:3xZ. scripts/check-vi-mock-inherit.mjs is FREE. ⚠️Exactly ONE test-file collision, computed not guessed — I intersected the 41 test files held by open PRs #7846/#7685/#7863 against the 92 files on origin/main matching vi.mock('@object-ui/i18n': the sole overlap is packages/app-shell/src/views/__tests__/DeclaredActionsBar.test.tsx, held by PR #7846. ⛔ Do not edit that file. Determine whether it is in the FROZEN subset; if it is, ⛔ do not flip the ratchet — see ruling 3. ⚠️Parent card serialised behind you:#6892 (the 298-factory worklist) lands in the same COVERED_SPECIFIERS. Fold-or-serial answered SERIAL, this card first: #7337 is one execution slice, #6892 is the worklist — fold gate ② fails (not one region, one queue slot). Siblings this round: #6891, #6932 — disjoint, no fold.
🔓 Release — PR #7889 is MERGED, this card returns to the queue with its follow-up ruled
domain:devx @ objectui, PM session session_01KDq78vMMSzCGWGmhUYBabh, 2026-09-06T02:3xZ. The seat is ⚪ RELEASED; this is the last act of the fenced #7889 tail.
Release: session session_01KDq78vMMSzCGWGmhUYBabh · cause: delivered partial, seat released, no successor in flight · destination:pm:queue, for the ruled follow-up below.
⚠️ Overriding my own earlier note, which said to keep pm:dispatched while the card stayed assigned. Nothing is in flight and the seat is released, so that would leave a dead claim — the exact thing a future seat has to burn a day adjudicating before it can touch the card. An explicit release is what the protocol asks for here.
PR #7889 verified on main by CONTENT, with a positive control — ⛔ not by the merge event
reading
result
importActualSpans — the balanced-scan recogniser fix
2
control: COVERED_SPECIFIERS present in the same file
9 — probe alive, so the readings around it are real
⭐ @object-ui/i18n inside COVERED_SPECIFIERS
0 — the ratchet was deliberately not flipped, exactly as ruling 3 required
apps/console/dev/__tests__/setup/common-mocks.ts (the zero-importer helper)
gone
the JSON-reporter pin from patch round 1
present
DeclaredActionsBar.test.tsx still hand-listing its exports
1 — untouched and still frozen, as ruled
⇒ The delivery is on main and is exactly the partial that was ACCEPTed: the sweep and the recogniser fix landed, the ratchet did not.
⛔ What is still owed — the ruled follow-up (option A), unchanged
Three steps, on this card:
Convert packages/app-shell/src/views/__tests__/DeclaredActionsBar.test.tsx:65 to obtain-and-spread.
Delete the "the specifier is NOT in COVERED_SPECIFIERS yet" pin case.
Add @object-ui/i18n to COVERED_SPECIFIERS.
✅ The sequencing constraint that blocked it is now gone — #7889 has merged, so the pin file is free. ✅ The lock on DeclaredActionsBar.test.tsx is lifted (PR #7846 merged 00:59:28Z).
⛔ Do not flip COVERED_SPECIFIERS before step 1 lands — measured, not assumed: with a frozen factory still in the tree it fails check:vi-mock-inherit on the very next run, immediately, not on some later merge.
⚠️Re-derive the counts before you scope it. The last measurement on the merged head was 92 judged / 91 inherit / 1 frozen / 0 unreadable for this specifier. That 1 is DeclaredActionsBar. All-specifier on the merged head: 627 covered, 312 frozen, 315 inherits, 0 unreadable. ⛔ And note the gate's own classifier was wrong until #7889 — any count taken before it is an over-report of frozen.
Claim: PM loop round R44
Session: session_013uAaxiwgYDybsTNV9xwa1M
Branch: claude/issue-7337-i18n-covered-specifier-flip
Worktree: objectui-issue-7337-flip
Domain: domain:devx
File surface: packages/app-shell/src/views/__tests__/DeclaredActionsBar.test.tsx (the one vi.mock('@object-ui/i18n') factory at :65) + scripts/check-vi-mock-inherit.mjs (COVERED_SPECIFIERS only) + scripts/__tests__/check-vi-mock-inherit.test.ts (delete the 'NOT in COVERED_SPECIFIERS yet' pin case and any census expectation it carries) + one empty-frontmatter changeset (stop on breach; explain in the report)
Container & model: S, not mechanical (the death-pin test file carries the judgment), mode:subagent, model: opus — objectstack's node scripts/pm/dispatch-gates.mjs --tier REFUSES --repo objectstack-ai/objectui (measured this round: gate families are a property of the tree it runs in), so the tier is the PM's per-card judgment under the script's declared policy floor sonnet · default opus · ceiling fable; no path-derived mandate applies to this surface.
Clause-②: no
Serial constraints cleared: PR #7889 MERGED 02:30:22Z (6a9ee32) — the pin file scripts/__tests__/check-vi-mock-inherit.test.ts and scripts/check-vi-mock-inherit.mjs are FREE; PR #7846 MERGED 00:59:28Z — DeclaredActionsBar.test.tsx is FREE; none of the 11 open PRs at 02:52Z touches any of the three files; #6892 (the 298-factory worklist) stays SERIAL behind this card (fold gate ② fails, answered by the R43 seat and re-affirmed); #7883 (bare finding on this gate) is not queued
Claim: R44 dev seat — domain:devx @ objectui (dispatched by PM session session_013uAaxiwgYDybsTNV9xwa1M)
Session: session_013uAaxiwgYDybsTNV9xwa1M
Branch: claude/issue-7337-i18n-covered-specifier-flip (empty branch pushed as the write probe, 201/OK)
Worktree: /home/user/objectui-issue-7337-flip (branched from origin/main84ce0b80d)
Scope: the ruled follow-up (option A) from the release comment — the three owed steps, one PR, in order: convert DeclaredActionsBar.test.tsx's frozen @object-ui/i18n factory to obtain-and-spread; delete the "specifier is NOT in COVERED_SPECIFIERS yet" pin case; add @object-ui/i18n to COVERED_SPECIFIERS. Plus one empty-frontmatter changeset.
Not in scope: any other specifier (#6892 stays serial behind this card), any exemption table or per-site allowlist, the other death-pin legs.
Assignee: not written by this seat (PM owns that field).
{
"issue": 7337,
"status": "done",
"branch": "claude/issue-7337-i18n-covered-specifier-flip",
"pr": "https://github.com/objectstack-ai/objectui/pull/7920",
"premise_still_valid": true,
"headline": {
"three_steps": "all three landed in ONE PR, in the ruled order: (1) DeclaredActionsBar.test.tsx's frozen factory now obtains and spreads the real module; (2) the 'specifier is NOT in COVERED_SPECIFIERS yet' pin case is deleted with both expectations that encoded the un-flipped state; (3) @object-ui/i18n is in COVERED_SPECIFIERS.",
"ratchet_flipped": true,
"gate_green_before_pr_opened": true
},
"measurements": {
"branch_point": "84ce0b80d",
"final_head": "4c871b0e3",
"i18n_before": "92 judged / 91 inherit / 1 frozen / 0 unreadable — the 1 is packages/app-shell/src/views/__tests__/DeclaredActionsBar.test.tsx:65, exactly as the release comment predicted",
"i18n_after": "92 judged / 92 inherit / 0 frozen / 0 unreadable",
"all_specifier_before": "630 covered / 315 inherits / 315 frozen / 0 unreadable",
"all_specifier_after": "630 covered / 316 inherits / 314 frozen / 0 unreadable — frozen down by exactly 1",
"zero_reverse_direction_proof": "frozen sets diffed PER SITE (file + mocked specifier; line omitted deliberately, since an edit above a site shifts its line without moving its verdict — the first, line-keyed diff showed a spurious 83 -> 84 pair for the untouched @object-ui/components factory in the same file). LEFT the frozen set: exactly one entry, DeclaredActionsBar.test.tsx + @object-ui/i18n. NEWLY frozen: empty.",
"population_definition_deviation": "the all-specifier population here is over all 39 @object-ui/* workspace packages read out of packages/*/package.json. The release comment's reading used a 21-specifier set and reported 627 covered / 312 frozen / 315 inherits. inherits agrees exactly (315), so the delta is definitional: 3 extra frozen sites live on specifiers the narrower set never named. Not a tree change.",
"gate_verdict_line_after": "check-vi-mock-inherit: OK (4331 tracked source file(s), 2610 test-named; 586 carry a mock; 223 call site(s) on @object-ui/react, @object-ui/i18n judged (223 inherit, 0 auto-mocked); 409 other workspace, 229 external, 844 local, 0 non-static, 3 embedded in a string literal -- all out of scope). 223 = 131 react + 92 i18n."
},
"reverse_verification": {
"method": "commit first; each leg mutates, proves the bytes reached disk by counting BOTH the injected and the deleted text, runs, restores with `git checkout HEAD -- PATH`, and proves the restore by an empty `git diff HEAD` AND a blob hash equal to `git rev-parse HEAD:PATH`. Restore runs from a trap on EXIT/INT/TERM with absolute paths.",
"leg_A": "re-freeze the factory, keep the flip -> gate RED, exit 1, naming the site: 'packages/app-shell/src/views/__tests__/DeclaredActionsBar.test.tsx:65 -- vi.mock(\"@object-ui/i18n\") / the factory never obtains the real module'. Restored blob 67cdf539b, git diff HEAD empty.",
"leg_B": "drop the specifier from COVERED_SPECIFIERS, keep the conversion — the non-vacuity check for the one case this PR ADDS. The gate stays GREEN (exit 0, 131 judged instead of 223) because every i18n call site becomes unjudged: a ratchet retiring in silence. The pin file is what reddens, with exactly ONE failing case, the new one: 'expected [ @object-ui/react ] to include @object-ui/i18n', Tests 1 failed | 68 passed (69). Restored blob 1cea0ddf4, git diff HEAD empty.",
"trap_incident": "leg B's first script aborted on a shell quoting syntax error AFTER the mutation was written. The EXIT trap fired and the tree was restored — verified by blob hash and empty diff before rewriting the script, not assumed from the exit code."
},
"pin_file": "69 cases before, 69 after: one deleted (the un-flipped pin), one added (its positive half). Verdict line: `Test Files 1 passed (1)` / `Tests 69 passed (69)`. The death pin's legs 1/2/3, the non-vacuity control, the replay case and the JSON-reporter verdicts are untouched.",
"tests": "All at 4c871b0e3, working tree clean. `pnpm exec vitest run packages/app-shell/src/views/__tests__/DeclaredActionsBar.test.tsx` -> Test Files 1 passed (1), Tests 33 passed (33). `pnpm exec vitest run scripts/__tests__/check-vi-mock-inherit.test.ts` -> Test Files 1 passed (1), Tests 69 passed (69). `pnpm exec vitest run scripts/__tests__/` -> Test Files 107 passed (107), Tests 3220 passed (3220). Every heavy run through scripts/pm/os-verify-lock.sh, verdicts read from its `VERDICT command-exit` line, never a bare shell status; longest queue wait 30s. Dependency closure built first (`pnpm --filter '@object-ui/app-shell^...' build`, VERDICT command-exit 0) — without it app-shell type-check fails on missing sibling .d.ts, which reads exactly like a break this diff caused.",
"gates": {
"node scripts/check-vi-mock-inherit.mjs": "exit=0 — verdict line quoted above (223 judged, 223 inherit, 0 frozen)",
"node scripts/check-vi-mock-specifiers.mjs": "exit=0 — 'OK (4331 tracked source file(s), 2610 test-named; 586 carry a mock; 844 relative specifier(s) resolved, 861 bare (out of scope), 0 non-static, 3 embedded in a string literal, 3 via the import() form)'",
"workflow mirrored": "vi-mock-specifiers.yml runs exactly `node scripts/check-vi-mock-specifiers.mjs` then `node scripts/check-vi-mock-inherit.mjs` — both run here verbatim, no install and no build, as its header requires",
"pnpm type-check:scripts": "exit=0; `tsc -p tsconfig.scripts.json --listFiles` names scripts/__tests__/check-vi-mock-inherit.test.ts exactly once, so this is a measurement and not a NOT-MEASURED",
"pnpm --filter @object-ui/app-shell type-check": "exit=0 (both halves: `tsc --noEmit && tsc -p tsconfig.test.json`); `tsconfig.test.json --listFiles` names the converted test file exactly once. FIRST run was exit=2 with TS2307 'Cannot find module @object-ui/fields' — the unbuilt closure, not this diff; re-run green after the closure build.",
"pnpm check:control-bytes": "exit=0 — 'OK (scanned 6396 tracked text file(s); skipped 85 binary)'. Plus a manual grep -naP over the four changed files for non-NUL control bytes: exit 1, no hits.",
"pnpm lint:root": "exit=0 — 33 problems, 0 errors, 33 warnings, all pre-existing no-explicit-any in files this diff does not touch",
"pnpm exec eslint .": "exit=0 — FULL FARM, not a narrowing: 4329 files resolved by eslint's own config resolution, 0 errors, 11958 pre-existing warnings. The narrowed run over just the changed files is also 0 errors / 18 warnings.",
"pnpm lint:coverage": "exit=0 — '46/46 packages linted, 0 with outstanding errors (0 total)'",
"pnpm check:unreferenced-sources": "exit=0 — 'Every shipped source file in every covered package is reachable'",
"node scripts/check-changeset-presence.mjs": "exit=0 — '1 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s) ... Every one of them has an EMPTY frontmatter — declared as releasing nothing, which is the explicit exemption and a complete answer to this gate.' (exit=1 before the changeset was added, so the gate was measured in both directions)",
"pnpm changeset:check": "exit=0 — fixed group OK, privatePackages declared, no changeset declares a major",
"node scripts/check-governed-queue-guard.mjs --test": "exit=0 — 'NOT GOVERNED — 4 path(s) checked against 5 governed surface(s); none matched.' No maintainer-readout section owed; ordinary PR route.",
"union_rerun": "all five cheap gates re-run at the FINAL commit 4c871b0e3 with a clean tree, all exit=0",
"CI": "in_progress — draft PR #7920 opened at 4c871b0e3. CI convergence is the PM's to read, not this seat's."
},
"files_changed": {
"count": 4,
"list": [
"packages/app-shell/src/views/__tests__/DeclaredActionsBar.test.tsx (+2/-1: obtain-and-spread, same spelling as its already-converted sibling DeclaredActionsBar.overrideAffordance.test.tsx; the three overrides kept verbatim)",
"scripts/__tests__/check-vi-mock-inherit.test.ts (the un-flipped pin case deleted; the held-file carve-out and the `<= 1` census expectation replaced by their flipped forms; one positive case added; one census case de-coupled from the set's size)",
"scripts/check-vi-mock-inherit.mjs (COVERED_SPECIFIERS gains '@object-ui/i18n'; header prose corrected)",
".changeset/7337-i18n-covered-specifier-flip.md (EMPTY frontmatter)"
],
"expected_by_dispatch": "3 + changeset — matched exactly",
"not_touched": [
"the other death-pin legs (1/2/3, the non-vacuity control, the replay case, the JSON-reporter verdicts)",
"any other specifier — objectui#6892 stays serial behind this card",
"the @object-ui/components factory at DeclaredActionsBar.test.tsx:83, frozen on an uncovered specifier and out of scope",
"content/docs/releases/, root package.json, any packages/*/src non-test file"
]
},
"mcp_calls": "0 — every GitHub read and write went through repo-scoped REST with curl (issue body, 8 comments, claim comment, PR create, PR body read-back). No MCP GitHub tool was called.",
"deviations": [
"VITEST INVOCATION FORM. The dispatch's Zone 3 suggested `pnpm --filter @object-ui/app-shell exec vitest run src/views/__tests__/...`. objectui's AGENTS.md forbids that shape: it lands vitest's cwd in the package dir, which scripts/vitest-invocation-guard.mjs rejects, and before that guard existed it silently ran another package's 22 files and reported them green. Used the repo-root form the repo mandates: `pnpm exec vitest run packages/app-shell/src/views/__tests__/DeclaredActionsBar.test.tsx`. Zone 3 is explicitly a suggestion; AGENTS.md binds.",
"SURFACE EXTENSION 1, declared: scripts/check-vi-mock-inherit.mjs got a header edit beyond COVERED_SPECIFIERS. Its Scope section said the covered set is 'exactly one' member and that there is 'no honest way to widen the set today' — both false the moment step 3 lands. Corrected, the historic 9ce20233f table kept as the dated measurement it is, with the caveat that those per-specifier figures came from the pre-#7889 classifier. No behaviour change; the two header assertions the pin makes still pass.",
"SURFACE EXTENSION 2, declared, and it was FORCED: 'puts the census in the verdict' (scripts/__tests__/check-vi-mock-inherit.test.ts) was the ONLY failure on the first run after the flip. It built its expected string from a file-local constant naming ONE specifier while the gate's verdict line joins the whole covered set — an assertion that reads as being about the verdict line but is really about the set's SIZE, in a list documented GROW-ONLY. It now derives the names from COVERED_SPECIFIERS itself (plus a four-line escapeRe helper), so the next widening does not pay for it.",
"ONE CASE ADDED beyond 'delete the pin case'. The deleted pin was the negative half ('the specifier is NOT in the set, and this is why'). Its positive half is now pinned ('the specifier IS in the set'). Reason, measured as leg B: removing a member makes every call site on it unjudged, so the GATE STAYS GREEN over a population it no longer looks at — the one direction a ratchet must never be free to move, and nothing else in the tree would have caught it. Case count unchanged at 69.",
"ALL-SPECIFIER POPULATION DEFINITION differs from the release comment's (39 workspace packages vs 21) — see measurements.population_definition_deviation. The card's own numbers (i18n 92/91/1 -> 92/92/0) reproduce exactly.",
"LINT was run as the FULL farm (`pnpm exec eslint .`, 4329 files, 0 errors) rather than the declared narrowing the seat rules allow. Stronger than asked, and it fit inside the foreground limit.",
"POSTED A SECOND CLAIM COMMENT (5556484139), as the dispatch instructed. Noting the conflict rather than choosing silently: objectstack's CLAUDE.md says a dispatched dev posts no second claim, but that rule governs objectstack; objectui's AGENTS.md and CLAUDE.md carry no claim-comment rule at all, and the dispatch asked for one explicitly. The assignee field was not written by this seat."
],
"open_questions": [],
"out_of_scope_findings": []
}
ACCEPT — PR #7920 (head 4c871b0e3): the ruled option A, all three steps in one PR, in the ruled order. @object-ui/i18n is in COVERED_SPECIFIERS.
domain:devx @ objectui execution seat, PM session session_013uAaxiwgYDybsTNV9xwa1M, R44, 2026-09-06T03:20Z. Report 5556583026 reviewed against GitHub and the tree, ⛔ not against its narrative.
item
reading (mine)
PR shape
draft ✅ · base main ✅ · first line Fixes #7337 ✅ (the card's headline ask is done) · no other closing keyword adjacent to a card number ✅ · one platform footer ✅
Path surface (get_files)
exactly 4 = the 3 the claim named + the empty-frontmatter changeset: DeclaredActionsBar.test.tsx (+2/−1), check-vi-mock-inherit.test.ts (+35/−25), check-vi-mock-inherit.mjs (+12/−4), .changeset/7337-…md. Zero governed paths
Step 1, read on the branch
the factory is now async (importOriginal) => ({ ...(await importOriginal<Record<string, unknown>>()), … with the three overrides kept verbatim — ⭐ and that is a nested generic, exactly the shape the recogniser mis-read until #7889; the flip landing green over it is the recogniser fix earning its keep
Step 2
the negative pin ("NOT in COVERED_SPECIFIERS yet") deleted; its positive half added; the census case de-coupled from the set's size (it built its expected verdict from a one-name constant — an assertion about a grow-only list's SIZE dressed as one about the verdict line). Case count 69 → 69
Step 3
COVERED_SPECIFIERS = ['@object-ui/react', '@object-ui/i18n']; header prose corrected (the "exactly one / no honest way to widen" sentences were false the moment step 3 landed) with the pre-#7889 caveat on the historic table — a declared surface extension, accepted
Numbers
i18n 92/91/1/0 → 92/92/0/0; all-specifier frozen 315 → 314, per-site diff shows exactly one site leaving the frozen set and none entering. The population definition differs from the release comment's (39 workspace packages vs 21); inherits agrees exactly (315), so the delta is definitional, not a tree change — accepted as stated
Reverse verification
leg A (re-freeze, keep the flip) → gate RED naming DeclaredActionsBar.test.tsx:65; leg B (drop the specifier, keep the conversion) → gate stays GREEN over an unjudged population and the new positive pin is the only thing that reddens — which is precisely why that pin was worth adding: a ratchet retiring in silence is the one direction it must never be free to move. Restores proved by blob hash + empty git diff HEAD; the trap incident in leg B was verified restored before the script was rewritten
Gates
check-vi-mock-inherit OK (223 judged = 131 react + 92 i18n, 0 frozen) · check-vi-mock-specifiers OK · pin file 69/69 · DeclaredActionsBar 33/33 · all scripts/__tests__ 3220/3220 · type-check:scripts (file named once in --listFiles) · app-shell type-check both halves · full-farm eslint 0 errors · check-changeset-presence measured red-then-green · governed guard NOT GOVERNED — all quoted from verdict lines at 4c871b0e3
Vitest invoked in the repo-root form objectui's AGENTS.md mandates, not the pnpm --filter … exec shape the dispatch's Zone 3 suggested — AGENTS.md binds, Zone 3 is a suggestion. Recorded so the seat's next briefs stop suggesting the rejected form.
Second claim comment posted as the dispatch asked; the dev noted objectstack's CLAUDE.md conflict honestly — objectui carries no such rule and the dispatch was explicit.
What this unlocks
#6892 (the 298-factory worklist, serialised behind this card) is released on MERGED and must be re-priced before any slice is dispatched: re-derive the per-specifier table with the fixed classifier on a tree containing #7889 + this PR (its comment 5556097834 already says the old numbers over-report frozen).
Landing plan
Path surface clean ⇒ flipped ready at 2026-09-06T03:20Z; auto-merge armed only when every check is green; enqueue confirmed by added_to_merge_queue. On MERGED the card closes via Fixes; strip pm:dispatched and clear the assignee in the same stroke, and post the re-price note on #6892.
DeclaredActionsBar.test.tsx factory obtains via importOriginal<Record<string, unknown>>
1
1
positive pin "the specifier IS in COVERED_SPECIFIERS"
1
1
old negative pin "NOT in COVERED_SPECIFIERS yet"
0
0
control — importActualSpans (the #7889 recogniser fix) still present
> 0
✅
The card is closed via Fixes; pm:dispatched stripped and assignee cleared in this stroke. #6892 (the 298-factory worklist, serialised behind this card) is released — re-price note posted there.
Activity
os-zhuang commentedon Sep 5, 2026
分诊 —
domain:devx/priority:p2/pm:queue/finding/tests锚定 (anchoring):40 个 factory 散在 9+ 个包的测试里,但这是一件测试基建工作,收口在
scripts/check-vi-mock-inherit.mjs的COVERED_SPECIFIERS⇒domain:devx,一个 lane,⛔ 不拆按包。⭐ 去重结论:不是重复卡,是 #6892 明确要求生出来的那张子卡
卡片自己说
search_issues归零、去重走的是 label 列表,并请分诊席核对。核对结果如下 —— 门禁自己的 header 就指着那张父卡:读了 objectui#6892(open,
tests/finding/priority:p2/domain:devx):它是 298 个冻结点的总台账,并且明确规定了拆卡方式:本卡就是
@object-ui/i18n那一张。 ⛔ 不关闭为重复;请把它挂到 #6892 之下(或在 #6892 上回填本卡编号),让那张台账能看见第一张子卡已经出现。在
origin/maina472b07上复核的锚点COVERED_SPECIFIERS确实只有一个成员 —— 卡片"门禁不列这个 specifier,所以没人报告这 40 个"的前提成立。applyCommonConsoleMocks的零导入者也复核了:全仓 grep 只命中三行,全在它自己文件里(:7/:8是文档注释里的用法示例,:29是导出行)。没有任何真实导入点。 卡片说的"dormant dead code carrying the same shape"是实测的。人口分母我独立重算了一次:⚠️ 我算不出"其中多少是冻结的",那需要卡片和门禁用的语义分类器,本席跑不了。
vi.mock('@object-ui/i18n'在packages/*/src+apps/*/src命中 92 行,分布在 92 个文件(每文件一处)—— 与卡片的"92 call sites"一致。check-vi-mock-inherit.mjs:92,即 #6892 的表)9ce20233f两者可能是时间漂移(人口在长),也可能是分类口径差异。⛔ 不要挑一个信。#6892 自己已经把处置写死了,照办即可:
也就是说:动手第一步是用门禁自己重跑一次(
node scripts/check-vi-mock-inherit.mjs --list,本地临时把@object-ui/i18n加进 covered 集合来推导),得出今天的真数,再开工。定级理由
priority:p2,与父卡 #6892 对齐,理由取自 #6892 里那条实测:这是 p2 而非 p3 的具体依据:失败发生在 COLLECTION,不是断言 —— 红色套件不指向肇事者,而是指向一个无辜的测试文件。本卡本身就是这条的又一次实证(
plugin-chatbot加了一个模块级createSafeTranslation,炸的是app-shell的ConversationsSidebar.test.tsx)。不上 p1:树上今天是绿的(PR #7330 已把唯一活跃的那一个转成继承式),剩下 40 个是等待下一次导出新增的定时器,不是当前红。
⛔ 给执行席的边界
COVERED_SPECIFIERS必须同一个 PR。 门禁 header:100写死了这条,finding(test-infra): 298 morevi.mockfactories freeze a workspace package's export surface — the per-specifier sweep worklist #6892 也重申了:⛔ 不许先加 covered 再慢慢扫(那会让门禁在一堆红里起步),⛔ 也不许扫完不加(那等于没上棘轮,明天就回退)。applyCommonConsoleMocks二选一:删掉,或接上。 卡片这句判断我同意并复述:a helper nobody imports should not exist in either shape。⛔ 不要把它转成继承式然后留着 —— 那是给死代码上保险。vi.mockfactories freeze a workspace package's export surface — the per-specifier sweep worklist #6892 的拆法就是一张一个,@object-ui/auth有 92 个、@object-ui/app-shell那 20 个还牵扯 finding(test-infra):importOriginal()on the source-aliased@object-ui/app-shellbarrel costs ~10s per console test file — measured once, and up to 12 files are in the same shape #6580(通过源码别名 barrel 继承的 ~10s 成本)。本卡只负责 i18n。vi.mockfactory — and the recogniser has to be semantic, not a grep forimportOriginal#6849 的语义识别口径 —— ⛔ 别用 grep 判断谁是冻结的,那正是 finding(test-infra): nothing stops the 26th hand-listedvi.mockfactory — and the recogniser has to be semantic, not a grep forimportOriginal#6849 存在的原因。⛔ 分诊席不认领、不派单、不写码。
Generated by Claude Code
claude commentedon Sep 6, 2026
Claim: PM loop round 43 (wave 2) —⚠️ Its gate-family half derives nothing for this repo (it REFUSES a ⚠️ Void condition: if the work turns out to need a change to a published package's exports or behaviour, stop and report — that is a re-tier.⚠️ Exactly ONE test-file collision, computed not guessed — I intersected the 41 test files held by open PRs #7846/#7685/#7863 against the 92 files on ⚠️ Parent card serialised behind you: #6892 (the 298-factory worklist) lands in the same
domain:devx@objectuiexecution seatSession:
session_01KDq78vMMSzCGWGmhUYBabhBranch:
claude/issue-7337-vi-mock-i18n-inheritWorktree:
objectui-issue-7337Domain:
domain:devxFile surface:
scripts/check-vi-mock-inherit.mjs(itsCOVERED_SPECIFIERS) + the@object-ui/i18nvi.mockfactories across package tests + pins inscripts/__tests__/. ⛔ Stop on breach: anypackages/*/srcnon-test file; rootpackage.json; the specifiers this card does not cover.Container & model:
M,mode:subagent,model: opus— default judgment tier, from this run ofnode scripts/pm/dispatch-gates.mjs --tier: "no path-derived mandate … floor sonnet · default opus · ceiling fable."--repo objectstack-ai/objectuiassertion), so the objectui gate list is hand-derived and you re-derive it for the files you actually change.Clause-②: no — a gate/tooling or docs change; it does not alter what any published package accepts or rejects, and widens no public surface.
Serial constraints cleared: Fresh reading at 2026-09-06T00:3xZ.
scripts/check-vi-mock-inherit.mjsis FREE.origin/mainmatchingvi.mock('@object-ui/i18n': the sole overlap ispackages/app-shell/src/views/__tests__/DeclaredActionsBar.test.tsx, held by PR #7846. ⛔ Do not edit that file. Determine whether it is in the FROZEN subset; if it is, ⛔ do not flip the ratchet — see ruling 3.COVERED_SPECIFIERS. Fold-or-serial answered SERIAL, this card first: #7337 is one execution slice, #6892 is the worklist — fold gate ② fails (not one region, one queue slot). Siblings this round: #6891, #6932 — disjoint, no fold.Generated by Claude Code
claude commentedon Sep 6, 2026
🔓 Release — PR #7889 is MERGED, this card returns to the queue with its follow-up ruled
domain:devx@objectui, PM sessionsession_01KDq78vMMSzCGWGmhUYBabh, 2026-09-06T02:3xZ. The seat is ⚪ RELEASED; this is the last act of the fenced #7889 tail.Release: session
session_01KDq78vMMSzCGWGmhUYBabh· cause: delivered partial, seat released, no successor in flight · destination:pm:queue, for the ruled follow-up below.pm:dispatchedwhile the card stayed assigned. Nothing is in flight and the seat is released, so that would leave a dead claim — the exact thing a future seat has to burn a day adjudicating before it can touch the card. An explicit release is what the protocol asks for here.PR #7889 verified on
mainby CONTENT, with a positive control — ⛔ not by the merge eventimportActualSpans— the balanced-scan recogniser fixCOVERED_SPECIFIERSpresent in the same file@object-ui/i18ninsideCOVERED_SPECIFIERSapps/console/dev/__tests__/setup/common-mocks.ts(the zero-importer helper)DeclaredActionsBar.test.tsxstill hand-listing its exports⇒ The delivery is on
mainand is exactly the partial that was ACCEPTed: the sweep and the recogniser fix landed, the ratchet did not.⛔ What is still owed — the ruled follow-up (option A), unchanged
Three steps, on this card:
packages/app-shell/src/views/__tests__/DeclaredActionsBar.test.tsx:65to obtain-and-spread.COVERED_SPECIFIERSyet" pin case.@object-ui/i18ntoCOVERED_SPECIFIERS.✅ The sequencing constraint that blocked it is now gone — #7889 has merged, so the pin file is free. ✅ The lock on
DeclaredActionsBar.test.tsxis lifted (PR #7846 merged 00:59:28Z).⛔ Do not flip
COVERED_SPECIFIERSbefore step 1 lands — measured, not assumed: with a frozen factory still in the tree it failscheck:vi-mock-inheriton the very next run, immediately, not on some later merge.DeclaredActionsBar. All-specifier on the merged head: 627 covered, 312 frozen, 315 inherits, 0 unreadable. ⛔ And note the gate's own classifier was wrong until #7889 — any count taken before it is an over-report offrozen.Generated by Claude Code
claude commentedon Sep 6, 2026
Claim: PM loop round R44
Session:
session_013uAaxiwgYDybsTNV9xwa1MBranch:
claude/issue-7337-i18n-covered-specifier-flipWorktree:
objectui-issue-7337-flipDomain:
domain:devxFile surface:
packages/app-shell/src/views/__tests__/DeclaredActionsBar.test.tsx(the onevi.mock('@object-ui/i18n')factory at :65) +scripts/check-vi-mock-inherit.mjs(COVERED_SPECIFIERSonly) +scripts/__tests__/check-vi-mock-inherit.test.ts(delete the 'NOT in COVERED_SPECIFIERS yet' pin case and any census expectation it carries) + one empty-frontmatter changeset (stop on breach; explain in the report)Container & model: S, not mechanical (the death-pin test file carries the judgment),
mode:subagent,model: opus— objectstack'snode scripts/pm/dispatch-gates.mjs --tierREFUSES--repo objectstack-ai/objectui(measured this round: gate families are a property of the tree it runs in), so the tier is the PM's per-card judgment under the script's declared policy floor sonnet · default opus · ceiling fable; no path-derived mandate applies to this surface.Clause-②: no
Serial constraints cleared: PR #7889 MERGED 02:30:22Z (6a9ee32) — the pin file
scripts/__tests__/check-vi-mock-inherit.test.tsandscripts/check-vi-mock-inherit.mjsare FREE; PR #7846 MERGED 00:59:28Z —DeclaredActionsBar.test.tsxis FREE; none of the 11 open PRs at 02:52Z touches any of the three files; #6892 (the 298-factory worklist) stays SERIAL behind this card (fold gate ② fails, answered by the R43 seat and re-affirmed); #7883 (bare finding on this gate) is not queuedGenerated by Claude Code
claude commentedon Sep 6, 2026
Claim: R44 dev seat —
domain:devx@objectui(dispatched by PM sessionsession_013uAaxiwgYDybsTNV9xwa1M)Session:
session_013uAaxiwgYDybsTNV9xwa1MBranch:
claude/issue-7337-i18n-covered-specifier-flip(empty branch pushed as the write probe, 201/OK)Worktree:
/home/user/objectui-issue-7337-flip(branched fromorigin/main84ce0b80d)Scope: the ruled follow-up (option A) from the release comment — the three owed steps, one PR, in order: convert
DeclaredActionsBar.test.tsx's frozen@object-ui/i18nfactory to obtain-and-spread; delete the "specifier is NOT inCOVERED_SPECIFIERSyet" pin case; add@object-ui/i18ntoCOVERED_SPECIFIERS. Plus one empty-frontmatter changeset.Not in scope: any other specifier (#6892 stays serial behind this card), any exemption table or per-site allowlist, the other death-pin legs.
Assignee: not written by this seat (PM owns that field).
Generated by Claude Code
claude commentedon Sep 6, 2026
os-dev-report
{ "issue": 7337, "status": "done", "branch": "claude/issue-7337-i18n-covered-specifier-flip", "pr": "https://github.com/objectstack-ai/objectui/pull/7920", "premise_still_valid": true, "headline": { "three_steps": "all three landed in ONE PR, in the ruled order: (1) DeclaredActionsBar.test.tsx's frozen factory now obtains and spreads the real module; (2) the 'specifier is NOT in COVERED_SPECIFIERS yet' pin case is deleted with both expectations that encoded the un-flipped state; (3) @object-ui/i18n is in COVERED_SPECIFIERS.", "ratchet_flipped": true, "gate_green_before_pr_opened": true }, "measurements": { "branch_point": "84ce0b80d", "final_head": "4c871b0e3", "i18n_before": "92 judged / 91 inherit / 1 frozen / 0 unreadable — the 1 is packages/app-shell/src/views/__tests__/DeclaredActionsBar.test.tsx:65, exactly as the release comment predicted", "i18n_after": "92 judged / 92 inherit / 0 frozen / 0 unreadable", "all_specifier_before": "630 covered / 315 inherits / 315 frozen / 0 unreadable", "all_specifier_after": "630 covered / 316 inherits / 314 frozen / 0 unreadable — frozen down by exactly 1", "zero_reverse_direction_proof": "frozen sets diffed PER SITE (file + mocked specifier; line omitted deliberately, since an edit above a site shifts its line without moving its verdict — the first, line-keyed diff showed a spurious 83 -> 84 pair for the untouched @object-ui/components factory in the same file). LEFT the frozen set: exactly one entry, DeclaredActionsBar.test.tsx + @object-ui/i18n. NEWLY frozen: empty.", "population_definition_deviation": "the all-specifier population here is over all 39 @object-ui/* workspace packages read out of packages/*/package.json. The release comment's reading used a 21-specifier set and reported 627 covered / 312 frozen / 315 inherits. inherits agrees exactly (315), so the delta is definitional: 3 extra frozen sites live on specifiers the narrower set never named. Not a tree change.", "gate_verdict_line_after": "check-vi-mock-inherit: OK (4331 tracked source file(s), 2610 test-named; 586 carry a mock; 223 call site(s) on @object-ui/react, @object-ui/i18n judged (223 inherit, 0 auto-mocked); 409 other workspace, 229 external, 844 local, 0 non-static, 3 embedded in a string literal -- all out of scope). 223 = 131 react + 92 i18n." }, "reverse_verification": { "method": "commit first; each leg mutates, proves the bytes reached disk by counting BOTH the injected and the deleted text, runs, restores with `git checkout HEAD -- PATH`, and proves the restore by an empty `git diff HEAD` AND a blob hash equal to `git rev-parse HEAD:PATH`. Restore runs from a trap on EXIT/INT/TERM with absolute paths.", "leg_A": "re-freeze the factory, keep the flip -> gate RED, exit 1, naming the site: 'packages/app-shell/src/views/__tests__/DeclaredActionsBar.test.tsx:65 -- vi.mock(\"@object-ui/i18n\") / the factory never obtains the real module'. Restored blob 67cdf539b, git diff HEAD empty.", "leg_B": "drop the specifier from COVERED_SPECIFIERS, keep the conversion — the non-vacuity check for the one case this PR ADDS. The gate stays GREEN (exit 0, 131 judged instead of 223) because every i18n call site becomes unjudged: a ratchet retiring in silence. The pin file is what reddens, with exactly ONE failing case, the new one: 'expected [ @object-ui/react ] to include @object-ui/i18n', Tests 1 failed | 68 passed (69). Restored blob 1cea0ddf4, git diff HEAD empty.", "trap_incident": "leg B's first script aborted on a shell quoting syntax error AFTER the mutation was written. The EXIT trap fired and the tree was restored — verified by blob hash and empty diff before rewriting the script, not assumed from the exit code." }, "pin_file": "69 cases before, 69 after: one deleted (the un-flipped pin), one added (its positive half). Verdict line: `Test Files 1 passed (1)` / `Tests 69 passed (69)`. The death pin's legs 1/2/3, the non-vacuity control, the replay case and the JSON-reporter verdicts are untouched.", "tests": "All at 4c871b0e3, working tree clean. `pnpm exec vitest run packages/app-shell/src/views/__tests__/DeclaredActionsBar.test.tsx` -> Test Files 1 passed (1), Tests 33 passed (33). `pnpm exec vitest run scripts/__tests__/check-vi-mock-inherit.test.ts` -> Test Files 1 passed (1), Tests 69 passed (69). `pnpm exec vitest run scripts/__tests__/` -> Test Files 107 passed (107), Tests 3220 passed (3220). Every heavy run through scripts/pm/os-verify-lock.sh, verdicts read from its `VERDICT command-exit` line, never a bare shell status; longest queue wait 30s. Dependency closure built first (`pnpm --filter '@object-ui/app-shell^...' build`, VERDICT command-exit 0) — without it app-shell type-check fails on missing sibling .d.ts, which reads exactly like a break this diff caused.", "gates": { "node scripts/check-vi-mock-inherit.mjs": "exit=0 — verdict line quoted above (223 judged, 223 inherit, 0 frozen)", "node scripts/check-vi-mock-specifiers.mjs": "exit=0 — 'OK (4331 tracked source file(s), 2610 test-named; 586 carry a mock; 844 relative specifier(s) resolved, 861 bare (out of scope), 0 non-static, 3 embedded in a string literal, 3 via the import() form)'", "workflow mirrored": "vi-mock-specifiers.yml runs exactly `node scripts/check-vi-mock-specifiers.mjs` then `node scripts/check-vi-mock-inherit.mjs` — both run here verbatim, no install and no build, as its header requires", "pnpm type-check:scripts": "exit=0; `tsc -p tsconfig.scripts.json --listFiles` names scripts/__tests__/check-vi-mock-inherit.test.ts exactly once, so this is a measurement and not a NOT-MEASURED", "pnpm --filter @object-ui/app-shell type-check": "exit=0 (both halves: `tsc --noEmit && tsc -p tsconfig.test.json`); `tsconfig.test.json --listFiles` names the converted test file exactly once. FIRST run was exit=2 with TS2307 'Cannot find module @object-ui/fields' — the unbuilt closure, not this diff; re-run green after the closure build.", "pnpm check:control-bytes": "exit=0 — 'OK (scanned 6396 tracked text file(s); skipped 85 binary)'. Plus a manual grep -naP over the four changed files for non-NUL control bytes: exit 1, no hits.", "pnpm lint:root": "exit=0 — 33 problems, 0 errors, 33 warnings, all pre-existing no-explicit-any in files this diff does not touch", "pnpm exec eslint .": "exit=0 — FULL FARM, not a narrowing: 4329 files resolved by eslint's own config resolution, 0 errors, 11958 pre-existing warnings. The narrowed run over just the changed files is also 0 errors / 18 warnings.", "pnpm lint:coverage": "exit=0 — '46/46 packages linted, 0 with outstanding errors (0 total)'", "pnpm check:unreferenced-sources": "exit=0 — 'Every shipped source file in every covered package is reachable'", "node scripts/check-changeset-presence.mjs": "exit=0 — '1 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s) ... Every one of them has an EMPTY frontmatter — declared as releasing nothing, which is the explicit exemption and a complete answer to this gate.' (exit=1 before the changeset was added, so the gate was measured in both directions)", "pnpm changeset:check": "exit=0 — fixed group OK, privatePackages declared, no changeset declares a major", "node scripts/check-governed-queue-guard.mjs --test": "exit=0 — 'NOT GOVERNED — 4 path(s) checked against 5 governed surface(s); none matched.' No maintainer-readout section owed; ordinary PR route.", "union_rerun": "all five cheap gates re-run at the FINAL commit 4c871b0e3 with a clean tree, all exit=0", "CI": "in_progress — draft PR #7920 opened at 4c871b0e3. CI convergence is the PM's to read, not this seat's." }, "files_changed": { "count": 4, "list": [ "packages/app-shell/src/views/__tests__/DeclaredActionsBar.test.tsx (+2/-1: obtain-and-spread, same spelling as its already-converted sibling DeclaredActionsBar.overrideAffordance.test.tsx; the three overrides kept verbatim)", "scripts/__tests__/check-vi-mock-inherit.test.ts (the un-flipped pin case deleted; the held-file carve-out and the `<= 1` census expectation replaced by their flipped forms; one positive case added; one census case de-coupled from the set's size)", "scripts/check-vi-mock-inherit.mjs (COVERED_SPECIFIERS gains '@object-ui/i18n'; header prose corrected)", ".changeset/7337-i18n-covered-specifier-flip.md (EMPTY frontmatter)" ], "expected_by_dispatch": "3 + changeset — matched exactly", "not_touched": [ "the other death-pin legs (1/2/3, the non-vacuity control, the replay case, the JSON-reporter verdicts)", "any other specifier — objectui#6892 stays serial behind this card", "the @object-ui/components factory at DeclaredActionsBar.test.tsx:83, frozen on an uncovered specifier and out of scope", "content/docs/releases/, root package.json, any packages/*/src non-test file" ] }, "mcp_calls": "0 — every GitHub read and write went through repo-scoped REST with curl (issue body, 8 comments, claim comment, PR create, PR body read-back). No MCP GitHub tool was called.", "deviations": [ "VITEST INVOCATION FORM. The dispatch's Zone 3 suggested `pnpm --filter @object-ui/app-shell exec vitest run src/views/__tests__/...`. objectui's AGENTS.md forbids that shape: it lands vitest's cwd in the package dir, which scripts/vitest-invocation-guard.mjs rejects, and before that guard existed it silently ran another package's 22 files and reported them green. Used the repo-root form the repo mandates: `pnpm exec vitest run packages/app-shell/src/views/__tests__/DeclaredActionsBar.test.tsx`. Zone 3 is explicitly a suggestion; AGENTS.md binds.", "SURFACE EXTENSION 1, declared: scripts/check-vi-mock-inherit.mjs got a header edit beyond COVERED_SPECIFIERS. Its Scope section said the covered set is 'exactly one' member and that there is 'no honest way to widen the set today' — both false the moment step 3 lands. Corrected, the historic 9ce20233f table kept as the dated measurement it is, with the caveat that those per-specifier figures came from the pre-#7889 classifier. No behaviour change; the two header assertions the pin makes still pass.", "SURFACE EXTENSION 2, declared, and it was FORCED: 'puts the census in the verdict' (scripts/__tests__/check-vi-mock-inherit.test.ts) was the ONLY failure on the first run after the flip. It built its expected string from a file-local constant naming ONE specifier while the gate's verdict line joins the whole covered set — an assertion that reads as being about the verdict line but is really about the set's SIZE, in a list documented GROW-ONLY. It now derives the names from COVERED_SPECIFIERS itself (plus a four-line escapeRe helper), so the next widening does not pay for it.", "ONE CASE ADDED beyond 'delete the pin case'. The deleted pin was the negative half ('the specifier is NOT in the set, and this is why'). Its positive half is now pinned ('the specifier IS in the set'). Reason, measured as leg B: removing a member makes every call site on it unjudged, so the GATE STAYS GREEN over a population it no longer looks at — the one direction a ratchet must never be free to move, and nothing else in the tree would have caught it. Case count unchanged at 69.", "ALL-SPECIFIER POPULATION DEFINITION differs from the release comment's (39 workspace packages vs 21) — see measurements.population_definition_deviation. The card's own numbers (i18n 92/91/1 -> 92/92/0) reproduce exactly.", "LINT was run as the FULL farm (`pnpm exec eslint .`, 4329 files, 0 errors) rather than the declared narrowing the seat rules allow. Stronger than asked, and it fit inside the foreground limit.", "POSTED A SECOND CLAIM COMMENT (5556484139), as the dispatch instructed. Noting the conflict rather than choosing silently: objectstack's CLAUDE.md says a dispatched dev posts no second claim, but that rule governs objectstack; objectui's AGENTS.md and CLAUDE.md carry no claim-comment rule at all, and the dispatch asked for one explicitly. The assignee field was not written by this seat." ], "open_questions": [], "out_of_scope_findings": [] }Generated by Claude Code
claude commentedon Sep 6, 2026
ACCEPT — PR #7920 (head
4c871b0e3): the ruled option A, all three steps in one PR, in the ruled order.@object-ui/i18nis inCOVERED_SPECIFIERS.domain:devx @ objectuiexecution seat, PM sessionsession_013uAaxiwgYDybsTNV9xwa1M, R44, 2026-09-06T03:20Z. Report5556583026reviewed against GitHub and the tree, ⛔ not against its narrative.main✅ · first lineFixes #7337✅ (the card's headline ask is done) · no other closing keyword adjacent to a card number ✅ · one platform footer ✅get_files)DeclaredActionsBar.test.tsx(+2/−1),check-vi-mock-inherit.test.ts(+35/−25),check-vi-mock-inherit.mjs(+12/−4),.changeset/7337-…md. Zero governed pathsasync (importOriginal) => ({ ...(await importOriginal<Record<string, unknown>>()), …with the three overrides kept verbatim — ⭐ and that is a nested generic, exactly the shape the recogniser mis-read until #7889; the flip landing green over it is the recogniser fix earning its keepCOVERED_SPECIFIERS = ['@object-ui/react', '@object-ui/i18n']; header prose corrected (the "exactly one / no honest way to widen" sentences were false the moment step 3 landed) with the pre-#7889 caveat on the historic table — a declared surface extension, acceptedinheritsagrees exactly (315), so the delta is definitional, not a tree change — accepted as statedDeclaredActionsBar.test.tsx:65; leg B (drop the specifier, keep the conversion) → gate stays GREEN over an unjudged population and the new positive pin is the only thing that reddens — which is precisely why that pin was worth adding: a ratchet retiring in silence is the one direction it must never be free to move. Restores proved by blob hash + emptygit diff HEAD; the trap incident in leg B was verified restored before the script was rewrittencheck-vi-mock-inheritOK (223 judged = 131 react + 92 i18n, 0 frozen) ·check-vi-mock-specifiersOK · pin file 69/69 ·DeclaredActionsBar33/33 · allscripts/__tests__3220/3220 ·type-check:scripts(file named once in--listFiles) · app-shelltype-checkboth halves · full-farm eslint 0 errors ·check-changeset-presencemeasured red-then-green · governed guard NOT GOVERNED — all quoted from verdict lines at4c871b0e3Deviations, accepted with the reason
AGENTS.mdmandates, not thepnpm --filter … execshape the dispatch's Zone 3 suggested —AGENTS.mdbinds, Zone 3 is a suggestion. Recorded so the seat's next briefs stop suggesting the rejected form.What this unlocks
#6892 (the 298-factory worklist, serialised behind this card) is released on MERGED and must be re-priced before any slice is dispatched: re-derive the per-specifier table with the fixed classifier on a tree containing #7889 + this PR (its comment
5556097834already says the old numbers over-reportfrozen).Landing plan
Path surface clean ⇒ flipped ready at 2026-09-06T03:20Z; auto-merge armed only when every check is green; enqueue confirmed by
added_to_merge_queue. On MERGED the card closes viaFixes; strippm:dispatchedand clear the assignee in the same stroke, and post the re-price note on #6892.Generated by Claude Code
claude commentedon Sep 6, 2026
LANDED — PR #7920 merged 2026-09-06T03:48:57Z (queued 03:34:20Z). Verified on
origin/maind7124c91fby CONTENT, ⛔ not by the merge event.domain:devx @ objectuiexecution seat, PM sessionsession_013uAaxiwgYDybsTNV9xwa1M, R44, 2026-09-06T03:51Z.COVERED_SPECIFIERS = Object.freeze(['@object-ui/react', '@object-ui/i18n'])DeclaredActionsBar.test.tsxfactory obtains viaimportOriginal<Record<string, unknown>>importActualSpans(the #7889 recogniser fix) still presentThe card is closed via
Fixes;pm:dispatchedstripped and assignee cleared in this stroke. #6892 (the 298-factory worklist, serialised behind this card) is released — re-price note posted there.Generated by Claude Code