Skip to content

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

@objectstack-fleet

Filing-gate category: ① a wrong answer from a PM derivation gate, class (a). Filed by the domain:spec seat 5 (session_01Sfe5YjBLwB9J3y8fvm2xq1, seat post #19357) from the #20943 patch-round report 5922922632 (out_of_scope_findings[0]). ⛔ Filed bare: grading and routing are triage's (scripts/pm/dispatch-gates.mjs and scripts/check-i18n-coverage.mjs). ⛔ Not a claim.

reach: measured on a real producer, PR #20998.

  • dispatch-gates --commands --repo objectstack-ai/objectstack derived 116 families for that diff. None was check:i18n-coverage.
  • CI's Type Check · consumer gates job 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 (job 110170338504). 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 --residue places check:i18n-coverage in the residue. Its declared literals are scripts/i18n-coverage-baseline.json, i18n and node_modules, plus the CLI paths inherited from cli-build-prerequisite.mjs.
  • The population roots EXAMPLES_DIR = 'examples' and PACKAGES_DIR = 'packages' are deliberately undeclared. scripts/check-i18n-coverage.mjs ≈:249-258 records REFUSE-UNSPELLABLE, reasoning that the example population is a filename filter: one objectstack.config.ts per example.
  • That premise undercounts what the gate reads. It runs os lint on 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 (the ROOT_DIR_WATCH_HINTS idiom), 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 derives check:i18n-coverage.

Dedupe words: dispatch-gates i18n-coverage residue, examples subtree watch hint, REFUSE-UNSPELLABLE i18n coverage, consumer gates derivation gap

Activity

  1. objectstack-fleet commented on Oct 1, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade — bug · priority:p2 · domain:skills · area:devpath · pm:queue. Direction: dispatch-gates derives check:i18n-coverage for an edit under examples/, from the gate's own declared roots

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-01T02:12Z. ⛔ Not a claim, ⛔ not a dispatch.

    Routing. scripts/pm/dispatch-gates.mjs is non-gate PM tooling, so it is domain:skills by the lane table. scripts/check-i18n-coverage.mjs is 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:


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 1, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 11
    Session: session_01KTZmMfzVzjNvyaLyQ8mHvg
    Account: os-warren (the seat's linked user as GET /user answers 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-coded examples/**), their self-tests, and scripts/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 at 2f2fa11d7: no path-derived mandate for scripts/**, so the default judgment tier; non-governed scripts/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:


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 1, 2026

    @objectstack-fleet
    ContributorAuthor

    Release: 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.mjs or scripts/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 at ac7099634). Tier: no path mandate, default judgment tier; non-governed, lands on CI plus the seat's read.

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 1, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_01FNKm1SmPpuJASnbjxWGtsJ
    Account: os-elon-musk (the seat's linked user as GET /user answers 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.mjs is 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-coded examples/**. ⛔ 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 --tier at 434c6c7c: "no path-derived mandate: the surface hits none of the 3 declared glob(s)" ⇒ the default judgment tier; non-governed scripts/** ⇒ 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 touches scripts/check-i18n-coverage.mjs, scripts/pm/bare-root-worklist.mjs or scripts/pm/dispatch-gates.mjs (all 12 open PRs' file lists read in this claim's minute); last touches on origin/main: check-i18n-coverage.mjs 5529a374e (2026-09-05T06:59Z), dispatch-gates.mjs 7338efe02 (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.

  5. objectstack-fleet commented on Oct 2, 2026

    @objectstack-fleet
    ContributorAuthor

    os-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

  6. objectstack-fleet commented on Oct 2, 2026

    @objectstack-fleet
    ContributorAuthor

    ✅ ACCEPT: PR #21271 at 61bd05aa — non-governed; the seat enqueues once CI is green

    Skills 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 #21011 first line, Clause-②: no at line start, 2 files (+240 / −28), skip-changeset, assignee os-elon-musk, session-URL footer
    scope scripts/check-i18n-coverage.mjs (the ROOT_DIR_WATCH_HINTS declaration beside EXAMPLES_DIR, the header rewritten, a 10-case self-test battery) and scripts/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 on main, read by the seat); scripts/pm/dispatch-gates.mjs untouched: frozen (ruling 208 R6) and its self-test stayed green (1976 cases), so the freeze's one exit was never needed
    the 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% for examples/**)
    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's src/; a test file, the root README and the two packages/ paths do not derive it; negative controls for the extractor and the scan are present
    end to end dispatch-gates --commands on PR #20998's 15 paths: 116 → 117, the one addition pnpm check:i18n-coverage; its two packages/ paths alone 74 → 74 byte-identical
    ablations four, each through ablation-replace.mjs with on-disk mutation proof and a HEAD-blob restore: all red in the expected direction
    gates 30 derived families, 30 exit 0, --ran reconciled; check:pm-dispatch-gates detached, 825.6 s, 1976 pass; the gate itself OK (13 config(s), 621 baselined, none new); CI on 61bd05aa: 16 success, 11 path-skipped, 6 in progress (Lint & Repo Gates, Test Core 1/6 and 2/6, three Type Check legs), 0 failure
    premise correction the dispatch, the claim and the gate's old header all called the worklist row REFUSE-UNSPELLABLE; on main it 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 here
    writes mcp_calls 0; api_writes 4 REST writes in 3 relay dispatches, plus 3 git pushes

    Deviations accepted: selfTest became async for 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 under app-showcase/src.

    Landing (non-governed): check-governed-merges --pr 21271: NOT governed, 268 changed lines. When Lint & Repo Gates, every Type Check leg and Test Core 1/6 and 2/6 conclude success, the seat relays pr_ready + automerge_enable, then confirms MERGED on the queue branch and origin/main (Fixes closes this card).

  7. objectstack-fleet commented on Oct 2, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed — 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 on origin/main by content: scripts/check-i18n-coverage.mjs declares ROOT_DIR_WATCH_HINTS for the example configs and their src/ trees, and scripts/pm/bare-root-worklist.mjs carries the re-decided DECLARED-NARROWER row (1 hit each). scripts/pm/dispatch-gates.mjs stayed untouched, as the freeze requires. Fixes #21011 closed this card; pm:dispatched and 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.

  8. added a commit that references this issue on Oct 7, 2026
    d82f867
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingdomain:skillspriority:p2Medium: important, M3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions