Repository navigation
finding(pm): dispatch-gates never derives check:i18n-coverage for an edit under examples/ — the gate lints each example config, whose imports span the whole example tree, but its population roots are undeclared #21011
Description
Activity
objectstack-fleet commented
on Oct 1, 2026 ContributorAuthorMore actionsTriage: first grade —
bug·priority:p2·domain:skills·area:devpath·pm:queue. Direction:dispatch-gatesderivescheck:i18n-coveragefor an edit underexamples/, from the gate's own declared rootsTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-01T02:12Z. ⛔ Not a claim, ⛔ not a dispatch.Routing.
scripts/pm/dispatch-gates.mjsis non-gate PM tooling, so it isdomain:skillsby the lane table.scripts/check-i18n-coverage.mjsis touched only to declare its population roots, which is a declared cross-lane surface.Why p2. It was measured on a real producer (PR #20998). The local derivation told the dev the diff was covered, and CI then failed it on the same gate. A wrong local answer costs a CI round on every
examples/edit.Direction:
check-i18n-coveragedeclares its population roots (the example configs and the trees they import), in the form other gates use.dispatch-gatesreads that declaration. ⛔ It does not hard-codeexamples/**in the deriver.- Pin: the PR feat(spec)!: an analytics cube member's sql is a column reference, and the showcase done rate moves to its dataset (#20943) #20998 diff derives
check:i18n-coverage, and apackages/-only diff that touches no declared root does not.
Generated by Claude Code
- addedarea:devpathThe road — create, dev, verify, publish/install, connect an agent, iterateThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingSomething isn't workingpriority:p2Medium: important, M3Medium: important, M3
on Oct 1, 2026 objectstack-fleet commented
on Oct 1, 2026 ContributorAuthorMore actionsClaim: PM loop round 11
Session:session_01KTZmMfzVzjNvyaLyQ8mHvg
Account:os-warren(the seat's linked user asGET /useranswers it; the card's assignee)
Branch:claude/issue-21011-i18n-coverage-examples-roots
Worktree:objectstack-issue-21011
Domain:domain:skills
Seat:domain:skills#1
File surface:scripts/check-i18n-coverage.mjs(declare its population roots in the form other gates use — the example configs and the trees they import; ⛔ no change to what the gate judges),scripts/pm/dispatch-gates.mjs(read that declaration; ⛔ no hard-codedexamples/**), their self-tests, andscripts/pm/bare-root-worklist.mjs's REFUSE-UNSPELLABLE record only if the declaration moves it. ⛔ No other gate, ⛔ no.github/workflows. Stop on breach; explain in the report.
Container & model:M,mode:subagent,model: opus(dispatch-gates --tier at2f2fa11d7: no path-derived mandate forscripts/**, so the default judgment tier; non-governedscripts/pm/**+ a gate script ⇒ the landing record is CI plus the seat's read). Clause ② not reached: a PM derivation gate, no contract accept/reject behaviour.
Clause-②: no
Thread-read: 5923354274
Serial constraints cleared:- No open objectstack PR touches
scripts/pm/dispatch-gates.mjs,scripts/check-i18n-coverage.mjsorscripts/i18n-coverage-baseline.json(all 38 open PRs' file lists, read at 2026-10-01T03:23Z). - Last touches on
origin/main:dispatch-gates.mjs7338efe (09-27),check-i18n-coverage.mjs5529a37 (09-05). The REFUSE-UNSPELLABLE record sits in the gate's own header (theEXAMPLES_DIR/PACKAGES_DIRconstants). - The producer PR feat(spec)!: an analytics cube member's sql is a column reference, and the showcase done rate moves to its dataset (#20943) #20998 is still open (head
ac7099634); its diff is the pin's positive case (examples/app-showcaseedit ⇒check:i18n-coveragederived). - Hot-file queue:
scripts/pm/dispatch-gates.mjs→ this card alone; the seat's other in-flight objectstack card (docs(react-pages,skills,showcase): teach the data-invalidation nonce in a react page's live-data effect, and opt the two showcase react pages in (ruling A on objectui#10887 member 3) #20395) touches none of these files. - Verify lock at claim: state: lock is free queue: empty (entry-point waiters only — a free-hand flock waiter takes no ticket)
Generated by Claude Code
- No open objectstack PR touches
objectstack-fleet commented
on Oct 1, 2026 ContributorAuthorMore actionsRelease: skills seat 1,
session_01KTZmMfzVzjNvyaLyQ8mHvg, 2026-10-01T03:28Z — the claim 5924084833 is withdrawn before any dispatch.- Reason: the maintainer's order in the seat session, verbatim 「当前任务处理完就下班」— no new dispatch after the cards already in flight; this card's dev had not been started, so nothing is in hand.
- State: assignee cleared,
pm:dispatched→pm:queue. No branch, no worktree, no PR exists for it. - For the next seat: the claim's readings still hold at this write (no open PR touches
scripts/pm/dispatch-gates.mjs,scripts/check-i18n-coverage.mjsorscripts/i18n-coverage-baseline.json; last touches 7338efe / 5529a37; the producer PR feat(spec)!: an analytics cube member's sql is a column reference, and the showcase done rate moves to its dataset (#20943) #20998 is open atac7099634). Tier: no path mandate, default judgment tier; non-governed, lands on CI plus the seat's read.
Generated by Claude Code
objectstack-fleet commented
on Oct 1, 2026 ContributorAuthorMore actionsClaim: PM loop round 1
Session:session_01FNKm1SmPpuJASnbjxWGtsJ
Account:os-elon-musk(the seat's linked user asGET /useranswers it; always the card's assignee)
Branch:claude/issue-21011-i18n-coverage-examples-roots
Worktree:objectstack-issue-21011
Domain:domain:skills
Seat:domain:skills#1
File surface:scripts/check-i18n-coverage.mjs(declare its population roots in the form other gates read — the example configs and the trees they import; ⛔ no change to what the gate judges),scripts/pm/bare-root-worklist.mjs(its REFUSE-UNSPELLABLE record for this gate, only if the declaration moves it), and these two files' own tests.scripts/pm/dispatch-gates.mjsis FROZEN (ruling 208 R6,references/instrument-discipline.md): touched ONLY if its own self-test pins break from the declaration, and then only the breaking pin — ⛔ no new deriver logic, ⛔ no hard-codedexamples/**. ⛔ No other gate, ⛔ no.github/workflows. Stop on breach; explain in the report.
Container & model:M,mode:subagent,model: opus(dispatch-gates --repo objectstack-ai/objectstack --tierat434c6c7c: "no path-derived mandate: the surface hits none of the 3 declared glob(s)" ⇒ the default judgment tier; non-governedscripts/**⇒ the landing record is CI plus the seat's read). Clause ② not reached: a PM derivation gate, no contract accept/reject behaviour.
Clause-②: no
Thread-read: 5924141171
Serial constraints cleared: no open objectstack PR touchesscripts/check-i18n-coverage.mjs,scripts/pm/bare-root-worklist.mjsorscripts/pm/dispatch-gates.mjs(all 12 open PRs' file lists read in this claim's minute); last touches onorigin/main:check-i18n-coverage.mjs5529a374e(2026-09-05T06:59Z),dispatch-gates.mjs7338efe02(2026-09-27T20:59Z) — no same-day churn; the producer PR #20998 the card names is the pin's positive case (its current state is the dev's to re-read); no in-flight lane claim shares these files; verify lock free at claim. The released claim 5924084833 on this card belongs to a signed-off session; its readings are superseded by these.- added a commit that references this issue
on Oct 1, 2026 objectstack-fleet commented
on Oct 2, 2026 ContributorAuthorMore actionsos-dev-report
{ "issue": 21011, "status": "done", "branch": "claude/issue-21011-i18n-coverage-examples-roots", "pr": "https://github.com/objectstack-ai/objectstack/pull/21271", "session": "session_01FNKm1SmPpuJASnbjxWGtsJ", "premise_still_valid": true, "summary": "scripts/check-i18n-coverage.mjs now declares ROOT_DIR_WATCH_HINTS = [examples/*/objectstack.config.ts, examples/*/src/**] beside EXAMPLES_DIR, so dispatch-gates derives check:i18n-coverage for an example edit with zero deriver change (dispatch-gates.mjs untouched; PM hypothesis 1 confirmed). The spelling is narrower than the whole examples subtree on measurement: os lint loads each config through bundle-require (esbuild, @objectstack/* external), whose closure at 30c530e5 is 153 tracked files, every one a config or under that example own src/; the two hints cover 170 (complete, 90% precise) where examples/** covers 256 (60%). A new 10-case self-test battery holds the declaration through the derivation own extractWatchHints/hintCovers (dynamic import inside selfTest, so the follow set is unchanged): PR #20998 showcase paths and every config derive, no relative import leaves an example src/ (177 edges, 0 escapes), a test file / root README / the two #20998 packages/ paths do not derive. bare-root-worklist re-decides the EXAMPLES_DIR row SPELLABLE-UNDECLARED -> DECLARED-NARROWER (consumer #21011 measured) with a re-measured multi-hint spelling held set-equal to the gate array; PACKAGES_DIR stays SPELLABLE-UNDECLARED.", "tests": "All at head 61bd05aa. check-i18n-coverage --self-test green (new battery 10 cases) and the gate itself after its closure build under the verify lock: check-i18n-coverage: OK (13 config(s), 621 baselined untranslated string(s), none new). bare-root-worklist --self-test OK (12 DECLARED-NARROWER held set-equal, was 11). check:pm-dispatch-gates detached: dispatch-gates self-test: 1976 cases pass (825.6s), no pin moved. End to end, base 30c530e5 vs head 61bd05aa, dispatch-gates --commands: PR #20998 full 15-path list 116 -> 117 (only addition pnpm check:i18n-coverage); its 4 examples paths 40 -> 41; its 2 packages/ paths 74 -> 74 byte-identical; examples/app-showcase/test/gap-fill.test.ts alone 38, absent. Ablations via scripts/ablation-replace.mjs on the committed head, mutation proven by anchor count and blob hash, restore proven blob == HEAD and git diff HEAD empty: (1) declaration -> [examples/**]: self-test red 1 failure (precision case names the test file and examples/README.md); (2) computed from EXAMPLES_DIR: red 4 failures, extraction falls back to the 3 old literals; (3) src hint dropped: red 2 failures; (4) same mutation vs bare-root-worklist --self-test: red 1 failure NOT DECLARED: examples/*/src/**. Expected direction: red, observed red in all four. Narrowed lint (declared narrowing, full pnpm lint is CI): eslint --no-inline-config --format json over the 2 changed files -> 2 files, 0 errors, 0 warnings; eslint.config.mjs enables no type-aware linting (no parserOptions.project), so the diff cannot move any untouched file verdict. Control-byte self-scan: grep exit 1, none.", "mcp_calls": "0 — no MCP GitHub tool was called", "api_writes": "3 relay strokes (fleet-write repository_dispatch, as objectstack-fleet[bot]), 4 endpoints: POST /repos/objectstack-ai/objectstack/pulls (pr_create draft, #21271; read-back 8217 bytes sent = stored); POST /repos/objectstack-ai/objectstack/issues/21271/labels (skip-changeset) + POST /repos/objectstack-ai/objectstack/issues/21271/assignees (os-elon-musk) in one label-write stroke, read-back matches; POST /repos/objectstack-ai/objectstack/issues/21011/comments (this os-dev-report). git push x3 (branch probe + 2 commits) is not REST.", "open_questions": [], "out_of_scope_findings": [ "carrier: none · noted, not filed — the PACKAGES half: a packages/spec or service edit can move this gate count through the workspace packages a config imports by name, and the derivation names the gate only via the inherited CLI half; declaring it is the packages/ root wholesale (REFUSE-WIDE shape). Recorded in the PR Acceptance notes and the gate header comment.", "carrier: none · noted, not filed — 3 files under examples/app-showcase/src are imported by no config (src/coverage.ts, src/system/connectors/status-openapi.json, src/system/datasources/index.ts): observation only (no defect, contract or trap evidence), counted in the declaration precision figure." ], "gates": { "head": "61bd05aa", "derived_by": "node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands (no paths; change set from merge base 30c530e5c, 2 paths) — 30 families, identical to the dispatch list", "results": { "node scripts/check-ci-filter-parity.mjs": 0, "node scripts/check-closing-keyword-parity.mjs": 0, "node scripts/check-closing-keyword-parity.mjs --self-test": 0, "node scripts/check-comment-mask-corpus.mjs": 0, "node scripts/check-declaration-mirrors.mjs": 0, "node scripts/check-declaration-mirrors.mjs --self-test": 0, "node scripts/check-scripts-symbol-anchors.mjs": 0, "node scripts/check-scripts-symbol-anchors.mjs --self-test": 0, "node scripts/check-self-test-wired.mjs": 0, "node scripts/check-self-test-wired.mjs --self-test": 0, "node scripts/check-self-test-workflow-commands.mjs": 0, "node scripts/check-self-test-workflow-commands.mjs --self-test": 0, "node scripts/check-whole-set-label-write.mjs": 0, "node scripts/check-whole-set-label-write.mjs --self-test": 0, "node scripts/pm/bare-root-worklist.mjs --self-test": 0, "pnpm check:agent-test-spelling": 0, "pnpm check:bash32-floor": 0, "pnpm check:cli-command-ids": 0, "pnpm check:cross-package-test-inputs": 0, "pnpm check:driver-memory-census": 0, "pnpm check:entry-guard": 0, "pnpm check:gitlink-declared": 0, "pnpm check:i18n-coverage": 0, "pnpm check:nul-bytes": 0, "pnpm check:parse-guard": 0, "pnpm check:pm-dispatch-gates": 0, "pnpm check:pnpm-filter-targets": 0, "pnpm check:ratchet-remedy-authority": 0, "pnpm check:refd-timer-probe": 0, "pnpm check:watch-hint-literal": 0 }, "extra": { "node scripts/check-declared-population-live.mjs": 0, "eslint --no-inline-config (2 changed files, narrowed)": 0 }, "reconciliation": "dispatch-gates --ran: 30 derived famil(ies) accounted for — 30 run, 0 NOT-MEASURED (a DERIVED zero — all 30 recorded an exit code and none of them is 3)", "ci": "in_progress at report time (Lint & Repo Gates, Type Check x4, Test Core 1-6 in_progress; Governed Surface Queue Guard, Dogfood Regression Gate, Check Changeset, claim/single-writer checks success; Build Core and Temporal Conformance skipped by path filter). Not awaited, per contract." }, "line_budget": "n/a — no skills/** surface", "deviations": [ "Premise correction (PM hypotheses 2/3): the worklist record for check-i18n-coverage EXAMPLES_DIR was SPELLABLE-UNDECLARED (spelling example app configs, deferred for want of a consumer), not REFUSE-UNSPELLABLE as the dispatch, the claim and the gate own header said. The declaration moves it, so it was re-decided to DECLARED-NARROWER under the 2026-08-26 ruling split criterion (measured consumer), recorded in the worklist header; the stale gate header comment is replaced.", "Route zone: declared the narrower configs + src/** spelling instead of the suggested examples subtree, on the measured closure (153 of 170 vs 153 of 256).", "PM hypothesis 4 falsified in the harmless direction: dispatch-gates self-test stayed green (1976 cases), so scripts/pm/dispatch-gates.mjs is untouched and no pin was edited.", "check-i18n-coverage selfTest became async for the dynamic import; dispatch spelled (await selfTest()) !== SELF_TEST_VERDICT, an existing idiom.", "Commit trailers use the AGENTS.md model-free pair (Claude-Session + Co-authored-by: Claude) instead of the harness-suggested model-named trailer; PR body ends with the AGENTS.md session-URL footer rather than the harness footer form.", "check:pm-dispatch-gates ran detached per its header and was awaited with tail --pid (825.6s on a contended box)." ], "files_changed": [ "scripts/check-i18n-coverage.mjs (+189/-15)", "scripts/pm/bare-root-worklist.mjs (+51/-13)", "total 2 files, +240/-28" ], "cleanup": "worktree ../objectstack-issue-21011 removed (node_modules first, tree clean, head pushed); comparison worktree at base removed; no background process left (build and dispatch-gates self-test PIDs both exited)." }
Generated by Claude Code
objectstack-fleet commented
on Oct 2, 2026 ContributorAuthorMore actions✅ ACCEPT: PR #21271 at
61bd05aa— non-governed; the seat enqueues once CI is greenSkills seat 1 (
domain:skills#1),session_01FNKm1SmPpuJASnbjxWGtsJ(os-elon-musk), 2026-10-02T00:24Z. Checked against the PR, its patch and the head's check-runs, not against the report's narrative. Claim 5942770103 · dev report 5943178120. No contract face (scripts/**only,Clause-②: no) ⇒ CI plus the seat's read; no at-tier record is owed.item reading PR shape draft, base main,Fixes #21011first line,Clause-②: noat line start, 2 files (+240 / −28),skip-changeset, assigneeos-elon-musk, session-URL footerscope scripts/check-i18n-coverage.mjs(theROOT_DIR_WATCH_HINTSdeclaration besideEXAMPLES_DIR, the header rewritten, a 10-case self-test battery) andscripts/pm/bare-root-worklist.mjs(the EXAMPLES row re-decided SPELLABLE-UNDECLARED → DECLARED-NARROWER with a re-measured two-shape spelling; the old single-hint spelling entry removed — referenced nowhere else onmain, read by the seat);scripts/pm/dispatch-gates.mjsuntouched: frozen (ruling 208 R6) and its self-test stayed green (1976 cases), so the freeze's one exit was never neededthe declaration examples/*/objectstack.config.ts+examples/*/src/**, narrower than the whole subtree and measured: the 4 configs' esbuild import closure is 153 tracked files, all inside those two shapes (complete; 90% precise against 60% forexamples/**)pins the battery holds the declaration through the derivation's own extractWatchHints/hintCovers: PR #20998's showcase paths and every live config derive the gate; 177 relative-import edges, 0 escape the example'ssrc/; a test file, the root README and the twopackages/paths do not derive it; negative controls for the extractor and the scan are presentend to end dispatch-gates --commandson PR #20998's 15 paths: 116 → 117, the one additionpnpm check:i18n-coverage; its twopackages/paths alone 74 → 74 byte-identicalablations four, each through ablation-replace.mjswith on-disk mutation proof and a HEAD-blob restore: all red in the expected directiongates 30 derived families, 30 exit 0, --ranreconciled;check:pm-dispatch-gatesdetached, 825.6 s, 1976 pass; the gate itselfOK (13 config(s), 621 baselined, none new); CI on61bd05aa: 16 success, 11 path-skipped, 6 in progress (Lint & Repo Gates,Test Core1/6 and 2/6, three Type Check legs), 0 failurepremise correction the dispatch, the claim and the gate's old header all called the worklist row REFUSE-UNSPELLABLE; on mainit was SPELLABLE-UNDECLARED (「no consumer has asked」). This card is that consumer and the re-decision follows the 2026-08-26 split criterion the worklist header records. The seat's premise was off by one verdict; the dev's reading stands and is acknowledged herewrites mcp_calls0;api_writes4 REST writes in 3 relay dispatches, plus 3 git pushesDeviations accepted:
selfTestbecameasyncfor the dynamic import (the dispatch spelling other gates already use); the narrower route over the suggested whole-subtree spelling, on the measured closure; the lint narrowing declared with its three readings (no type-aware linting in the config; 2 files judged; untouched files' verdicts cannot move).Out of scope, noted not filed: the PACKAGES half (a
packages/edit can move this count through the workspace packages a config imports; declaring it is the REFUSE-WIDE shape); three unimported files underapp-showcase/src.Landing (non-governed):
check-governed-merges --pr 21271: NOT governed, 268 changed lines. WhenLint & Repo Gates, every Type Check leg andTest Core1/6 and 2/6 concludesuccess, the seat relayspr_ready+automerge_enable, then confirms MERGED on the queue branch andorigin/main(Fixescloses this card).objectstack-fleet commented
on Oct 2, 2026 ContributorAuthorMore actionsLanded — skills seat 1,
session_01FNKm1SmPpuJASnbjxWGtsJ(os-elon-musk), 2026-10-02T01:19Z.PR #21271 MERGED through the queue at 2026-10-02T01:15Z (non-governed: ACCEPT 5943249825 on
61bd05aa, readied and armed by the seat, enqueued 00:41Z). Confirmed onorigin/mainby content:scripts/check-i18n-coverage.mjsdeclaresROOT_DIR_WATCH_HINTSfor the example configs and theirsrc/trees, andscripts/pm/bare-root-worklist.mjscarries the re-decided DECLARED-NARROWER row (1 hit each).scripts/pm/dispatch-gates.mjsstayed untouched, as the freeze requires.Fixes #21011closed this card;pm:dispatchedand the assignee are stripped in this stroke. The dev's premise correction (the worklist row was SPELLABLE-UNDECLARED, not REFUSE-UNSPELLABLE) is recorded on the ACCEPT.- added a commit that references this issue
on Oct 7, 2026
Filing-gate category: ① a wrong answer from a PM derivation gate, class (a). Filed by the
domain:specseat 5 (session_01Sfe5YjBLwB9J3y8fvm2xq1, seat post #19357) from the #20943 patch-round report5922922632(out_of_scope_findings[0]). ⛔ Filed bare: grading and routing are triage's (scripts/pm/dispatch-gates.mjsandscripts/check-i18n-coverage.mjs). ⛔ Not a claim.reach: measured on a real producer, PR #20998.
dispatch-gates --commands --repo objectstack-ai/objectstackderived 116 families for that diff. None wascheck:i18n-coverage.Type Check · consumer gatesjob runs that gate on every PR, and it went red on this PR's own showcase edit:examples/app-showcase, untranslated declared strings 414 → 416 (job110170338504). So the local derivation told the dev the diff was covered, and CI then failed it.The mechanism, as the dev read it
dispatch-gates --residueplacescheck:i18n-coveragein the residue. Its declared literals arescripts/i18n-coverage-baseline.json,i18nandnode_modules, plus the CLI paths inherited fromcli-build-prerequisite.mjs.EXAMPLES_DIR = 'examples'andPACKAGES_DIR = 'packages'are deliberately undeclared.scripts/check-i18n-coverage.mjs≈:249-258records REFUSE-UNSPELLABLE, reasoning that the example population is a filename filter: oneobjectstack.config.tsper example.os linton each config, which loads everything the config imports (datasets, translation bundles, objects, dashboards). An edit anywhere in an example's source tree moves the verdict, and the derivation stays silent.Direction (for triage)
Either declare
examples/as a subtree for this gate (theROOT_DIR_WATCH_HINTSidiom), since most files there are config imports, or teach the derivation each config's import closure. Pin: an edit to a file an example config imports derivescheck:i18n-coverage.Dedupe words: dispatch-gates i18n-coverage residue, examples subtree watch hint, REFUSE-UNSPELLABLE i18n coverage, consumer gates derivation gap