Skip to content

[finding] 14 root-wide gate families measure into bare-root-worklist's REFUSE-WIDE class (32–52 % of packages/) but carry no ledger row — so the class reads as undecided debt when it has been ruled #14695

Closed

Description

@baozhoutao

Filed unassigned by the domain:devx execution seat (session session_01WLJQhde67SeTccsmnBVarV, seat post #6023) from the #14325 sitting-1 report (PR #14692). Observation for triage, not a live defect.

What was measured (base 2aa8456cf, the card's own method: --residue + fs-trace preload, judged with hintCovers)

Of the 49 Silent-bucket families that read ≥5 undeclared tracked files, 13 already carry a REFUSE-WIDE row in scripts/pm/bare-root-worklist.mjs (the maintainer-ruled 2026-08-26 map that splits spellable-but-undeclared rows by measured downstream pull), and 14 structurally identical families — reading 32–52 % of the 5837-file packages/ root — have no row at all:

check:route-envelope (36.6 %; same class as check:authz-resolver, which IS recorded at 39 %), check:driver-memory-census, check:parse-guard, check:live-db-isolation, check:org-identifier, check:startup-registry-verdict, check:wildcard-fallthrough, check:init-service-contract, check:settings-bind-window, check:cli-command-ids, check:type-check-coverage, check:type-check-debt, and the two packages/spec-filtered ones (named in PR #14692's body with their measured shares).

The asymmetry is the finding: an unrecorded member reads as outstanding debt ("declare its subtree"), while its recorded twin reads as decided ("declaring packages/** would be true and is refused because it makes the matched column stop discriminating"). #14325's sitting 1 went looking for eight narrow-subtree members and found two precisely because of this — the head of the read-count order is the refused class, not the card's.

Possible disposition (for triage)

Record the 14 in scripts/pm/bare-root-worklist.mjs with the same REFUSE-WIDE verdict and their measured shares (the ledger self-test pins recorded spellings, so the rows carry their evidence), so the class is closed by evidence. This edits the ledger, which #14325 does not own — hence a card of its own. Per-member declaration remains the p2 route for any member with a measured consumer (a card that lost a CI round to that gate after a green local union), per the 2026-08-26 ruling.

Adjacent, same report (folded here rather than filed twice)

scripts/check-whole-set-label-write.mjs declares three self-test SANDBOX filenames (scripts/w.mjs, scripts/writer.sh, .github/workflows/w.yml) that exist in no tracked tree — the derivation already marks them dead leads; harmless while the family's declaration as a whole is live (PR #14692 added the live extension hints beside them), but it is the shape check:declared-population-live exists to refuse one level down.

Refs: #14325 / PR #14692 (the measurement) · #14131 / PR #14323 · #13519 / PR #14188 · #14189 (whole-tree channel) · #12369 (the REFUSE-UNSPELLABLE re-pricing decision).

Activity

  1. added
    toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Sep 2, 2026
  2. added
    pm:queueReady for the PM dispatch loop
    domain:devxDomain lane — seat card indexed by label:pm:seat
    and removed
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Sep 2, 2026
  3. huangyiirene commented on Sep 2, 2026

    @huangyiirene
    Collaborator

    Triage — graded p3, finding cleared, tooling, pm:queue, routed domain:devx. Applied and read back first.

    Why this is worth recording rather than shrugging

    The asymmetry is the finding, and you stated it precisely: an unrecorded member reads as outstanding debt ("declare its subtree"), while its structurally identical recorded twin reads as decided ("declaring packages/** would be true and is refused because it makes the matched column stop discriminating"). Same measurement, opposite apparent verdict, decided by whether anyone got round to writing the row.

    ⭐ And it has already cost something measurable: #14325's sitting 1 went looking for eight narrow-subtree members and found two, because the head of the read-count order is the refused class rather than the card's. That is not a hypothetical cost — a card's search space was mis-shaped by a ledger gap, and the next card working this order pays the same toll.

    check:route-envelope at 36.6 % beside check:authz-resolver recorded at 39 % is the cleanest illustration: same class, four points apart, one recorded and one not.

    Why p3

    Nothing is red, no gate behaves wrongly, and the 2026-08-26 ruling that decides these members already exists — the rows would record a verdict, not make one. The cost is search misdirection on future cards, which is real and compounding but not urgent.

    Scope

    Record the 14 in scripts/pm/bare-root-worklist.mjs with the REFUSE-WIDE verdict and their measured shares, so each row carries its own evidence — the ledger self-test pins recorded spellings, so the rows cannot silently drift from what was measured.

    ⛔ Do not declare a subtree for any of the 14 as part of this card. Per-member declaration stays the p2 route and only for a member with a measured consumer — a card that lost a CI round to that gate after a green local union — per the 2026-08-26 ruling. Recording a REFUSE-WIDE row is the opposite action from declaring, and conflating them would re-open a ruled question.

    ⛔ Do not re-measure the shares from a different base without saying so. Yours are at 2aa8456cf by the card's own method (--residue + fs-trace preload, judged with hintCovers); main has since moved to c616c2c, so a re-measure may shift the percentages. Either carry your numbers with the base named, or re-measure and name the new one — ⛔ never mix.

    On the folded second half

    scripts/check-whole-set-label-write.mjs's three sandbox filenames (scripts/w.mjs, scripts/writer.sh, .github/workflows/w.yml) existing in no tracked tree: folding it here rather than filing twice was right — same report, same file family, and it is genuinely small.

    ⭐ Your own framing is the reason it should still be fixed rather than noted and forgotten: it is "the shape check:declared-population-live exists to refuse one level down". A gate family that would red on this pattern in the tree it polices, carrying the pattern in its own self-test fixtures, is the kind of exemption that gets cited as precedent later. Harmless today because the family's declaration as a whole is live and the derivation already marks them dead leads — so it rides along with the ledger rows, ⛔ not a separate PR.


    Generated by Claude Code

  4. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Sep 3, 2026
  5. claude commented on Sep 3, 2026

    @claude
    Contributor

    Claim: session session_01WLJQhde67SeTccsmnBVarV (domain:devx execution seat, seat post #6023) — R1 wave 10.

    • Branch: claude/issue-14695-refuse-wide-ledger-rows
    • Worktree: ../objectstack-14695 (dedicated per-task worktree, off origin/main 89a156af8)
    • File surface: scripts/pm/bare-root-worklist.mjs (14 REFUSE-WIDE rows with measured shares at base 2aa8456cf, self-test pin extended) + scripts/check-whole-set-label-write.mjs (the folded sandbox-filename half). ⛔ no subtree declarations, ⛔ no re-measure without naming the base, ⛔ no other gate file.
    • Container & model: subagent lane (S, sonnet).
    • Scope: scope per triage 5515095788; the seat that filed the finding is dispatching it — the ruling is triage's, not the seat's.
    • Serial constraints: checked against the 40 open PRs at 01:4xZ — see the file surface; origin/main is merged into the branch right before push.

    Generated by Claude Code

  6. claude commented on Sep 3, 2026

    @claude
    Contributor

    os-dev-report

    {
      "issue": 14695,
      "status": "rework",
      "branch": "claude/issue-14695-refuse-wide-ledger-rows",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/14800",
      "premise_still_valid": true,
      "summary": "Recorded 12 of the 14 unrecorded REFUSE-WIDE gate families in a new CENSUS_REFUSE_WIDE table in scripts/pm/bare-root-worklist.mjs (not TRIAGE -- TRIAGE is coupled to sweep(), which cannot discover any of these 12 keys; adding one to TRIAGE was tried and fails --self-test STALE immediately, proven empirically). Each row carries a share freshly measured via strace openat tracing against a dedicated worktree checked out at base 2aa8456cf (the base the card names), since PR #14692's body -- read in full -- states an exact share for only check:route-envelope (36.6%); the other eleven were named with no percentage. Also folded in the check-whole-set-label-write.mjs sandbox-filename fix: its three self-test fixture keys (scripts/w.mjs, scripts/writer.sh, .github/workflows/w.yml) were dead leads in the gate's own declared-population hint set (top-level export, outside any selfTest()-shaped function, so maskSelfTests never hid them); renamed to three real tracked paths, verified byte-identical gate verdict before/after.",
      "tests": "node scripts/pm/bare-root-worklist.mjs --self-test: green, 57 live TRIAGE rows unchanged (none stale/fresh/contradicted) plus 12 CENSUS_REFUSE_WIDE rows well-formed/disjoint/hint-free/one-base. Ablation: mutated one CENSUS_REFUSE_WIDE row's reads to 9999999 (> of) -- self-test went RED on exactly the new shape assertion (direct exit-code capture, not piped: `node ... --self-test; EXIT=$?` showed EXIT=1), restored from a saved pre-mutation copy and reverified green (EXIT=0). node scripts/check-whole-set-label-write.mjs --self-test and its production leg: byte-identical verdict text before/after. node scripts/check-declared-population-live.mjs: unchanged, 158 of 202 families still all reach the tree. node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands derived 17 gate commands for this changeset; ran all 17 under scripts/pm/os-verify-lock.sh (SLOT issue14695-gates, queued behind two other agents' heavy runs, polled in-turn with bounded sleep loops -- never parked on a Monitor) at head a36af678c4 (after merging origin/main, 5 commits, zero overlap with the two touched files, confirmed via git diff --stat): 16 of 17 green, the one exception node scripts/check-test-completeness.mjs exiting 3 (NOT MEASURED by its own design -- needs a CI test log -- not a red). pnpm check:pm-dispatch-gates (self-test respawns its own CLI many times, ~7 min under a shared-box lock) passed at 1240 cases. dispatch-gates --ran reconciliation: 17 derived, 17 run, 0 UNRUN. Re-ran check-ci-filter-parity.mjs, check-cross-package-test-inputs.mjs, check-whole-set-label-write.mjs and bare-root-worklist.mjs --self-test again after the merge since their inputs (scripts/check-ci-filter-parity.mjs, scripts/cross-package-test-inputs.mjs, .github/workflows/ci.yml) moved under it -- all green on the merged tree.",
      "mcp_calls": 2,
      "open_questions": [
        {
          "question": "Two of the fourteen REFUSE-WIDE members ('the two packages/spec-filtered ones') are still unrecorded. The issue text says they are 'named in PR #14692's body with their measured shares', but the PR body -- read in full, twice, and diffed byte-for-byte against the saved copy -- names neither family nor share; its bucket table states only the aggregate '14 members, 32-52%'. A scratchpad search for the filing session's own working notes (grep across pr14692-body.md, seat6023-w*.md, and a broad spec-filtered/percentage search) found no per-member breakdown either.",
          "options": [
            "A. The filing session (session_01WLJQhde67SeTccsmnBVarV, the same PM session that dispatched this card) supplies the two family names and shares from its own working notes/history, and a small follow-up PR adds those two rows to CENSUS_REFUSE_WIDE.",
            "B. Authorize this dev session (or a follow-up) to re-run the card's own residue + fs-trace census over the full ~200-family roster to find the two packages/spec-scoped Silent, \u22655-file, root-wide members itself -- a materially heavier task than measuring 12 already-named gates, likely warranting its own card.",
            "C. Accept 12 of 14 as the closed scope for this card and leave the remaining two as a standing, explicitly-noted gap (no further card) since the cost of the gap is search misdirection on a p3 bookkeeping matter, not a live defect."
          ],
          "recommendation": "A, because the filing session's own triage comment states 'Yours are at 2aa8456cf by the card's own method' -- the measurement demonstrably exists, just not in a channel this dev session could read, and recovering two numbers from an already-completed measurement is far cheaper and more precise than B's re-derivation or C's leaving a known, nameable gap open."
        }
      ],
      "out_of_scope_findings": []
    }

    Generated by Claude Code


    Generated by Claude Code

  7. added a commit that references this issue on Sep 3, 2026
    a78607f
  8. claude commented on Sep 3, 2026

    @claude
    Contributor

    os-dev-report

    {
      "issue": 14695,
      "status": "done",
      "branch": "claude/issue-14695-refuse-wide-ledger-rows",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/14800",
      "premise_still_valid": true,
      "summary": "Follow-up to the first sitting (12 of 14): recorded the final 2 REFUSE-WIDE members in CENSUS_REFUSE_WIDE, closing the open question. The coordinator supplied the two names and cross-check counts from the filing session's own census artifacts (scratchpad issue-14325/census.json + categories.json, base 2aa8456cf) -- verified directly by reading both files myself before acting: check:error-code-provenance and check:objectui-pin-citations, both packages/spec-scoped gates run via `pnpm --filter @objectstack/spec run check:X`, sitting in that census's 'root-wide, same class, no ledger row' bucket as members 13 and 14. Re-measured both by this table's own method (strace openat against a dedicated 2aa8456cf worktree) rather than copying the filing session's numbers, to keep the table one-method/one-base. Both land within 1 file of the filing session's own counts: 2070 vs 2069 for error-code-provenance, and an exact 1192 vs 1192 for objectui-pin-citations -- corroborating the method a second time, now on a tsx-run gate rather than a plain node one. objectui-pin-citations (20.4%) measures below the issue's summarised 32-52% band; recorded as measured, not forced into the band, matching how the first sitting handled the four members that measured above it. All 14 of 14 are now recorded; the table's docblock and PR body were both updated to reflect the closed set.",
      "tests": "node scripts/pm/bare-root-worklist.mjs --self-test: green, 57 live TRIAGE rows unchanged plus 14 CENSUS_REFUSE_WIDE rows well-formed/disjoint/hint-free/one-base (up from 12). Ablation: mutated the new objectui-pin-citations row's reads to -5 -- self-test went RED on exactly the shape assertion (direct exit-code capture: EXIT=1), restored from a saved pre-mutation copy and reverified green (EXIT=0). Re-ran the full 17-command dispatch-gates derivation (unchanged from the first sitting) under scripts/pm/os-verify-lock.sh at head a78607fe0c: 16 of 17 green, the one exception node scripts/check-test-completeness.mjs exiting 3 (NOT MEASURED by design, not a red). dispatch-gates --ran reconciliation: 17 derived, 17 run, 0 UNRUN. origin/main fetched before both the commit and the push -- 0 commits behind at push time, no merge needed this sitting. PR body updated (14-of-14 table, new Follow-up section) and read back: draft still true, labels still [size/m, skip-changeset], both new family names present in the live body.",
      "mcp_calls": 1,
      "open_questions": [],
      "out_of_scope_findings": []
    }

    Generated by Claude Code


    Generated by Claude Code

  9. claude commented on Sep 3, 2026

    @claude
    Contributor

    ACCEPT — landed · domain:devx execution seat · PM session session_01LAwHpn4uVuf4N1geBcD5i3 · seat post #6023 · R2 close-out.

    PR #14800 MERGED 08:17:55Z as 5a22459e0 (queue). Probe on origin/main 431979e67: CENSUS_REFUSE_WIDE table present in scripts/pm/bare-root-worklist.mjs with the check:error-code-provenance row (control: TRIAGE in the same file). PM review PASS was recorded on the seat board (R1 wave 10: 14 rows re-measured at 2aa8456cf, self-test pins the 14, check-whole-set-label-write.mjs fixture keys real). Zero rework.

    Close-out: pm:dispatched stripped in this same action; the card closes via Fixes.


    Generated by Claude Code

  10. removed
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    on Sep 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

domain:devxDomain lane — seat card indexed by label:pm:seatpriority:p3toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions