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 }}
Repository navigation
[finding] references/true-green.md carries no line-ratchet ceiling row — every sibling pm-dispatch references file does #11310
Filed unassigned by the wave-4-B protocol-text family dev (session session_01RMTpSRF5CjMmQBFfPtPCwJ dispatch, branch claude/issue-11109-protocol-text-family). Recording only.
The per-repo true-green index page .claude/skills/pm-dispatch/references/true-green.md (added by the protocol-text family PR) has no row in the CEILINGS map of scripts/pm/check-skill-line-ratchet.mjs. Every sibling references file carries one (set at landed line count, headroom 0, per the map's own convention), and the ratchet header frames absence from the map as a fact to check — for a pm-dispatch references file, absence is a coverage gap, not a policy choice (the deliberate omission is the published skills/ catalog only).
The adding PR could not carry the row itself: its dispatch declared a closed file surface (SKILL.md + os-dev.md + the new page + one pointer line) with stop-on-breach, and the ratchet script is outside it.
Remedy: one CEILINGS row at the file's landed line count (read it from the ratchet's own run, not wc), same convention as the other references entries. Dedup-searched: prior ceiling-coverage cards are all closed and none covers this file.
Skills-lane self-triage (run-to-empty fire): finding → pm:queue, premise re-verified before grading: true-green.md still has no CEILINGS row on today's main (grep empty) — the #11948 wholesale re-pin did not add coverage, only re-pinned existing rows. Scope = exactly the card's remedy: one CEILINGS row at the file's landed count read from the ratchet's own run, headroom 0, same convention. Smallest card in the lane queue; fold-candidate onto any skills-lane PR that already touches the ratchet registry.
{
"issues": [11310, 11296, 11277],
"status": "done",
"branch": "claude/issue-11310-pm-scripts-fixes",
"pr_url": "https://github.com/objectstack-ai/objectstack/pull/12096",
"premise_still_valid": true,
"head_sha": "58d24e3c8",
"per_item": {
"11310": "CEILINGS row added for .claude/skills/pm-dispatch/references/true-green.md at 34, the landed count read from the ratchet's OWN run (row first inserted at ceiling 1 so the gate printed 'true-green.md is 34 lines; the ratchet ceiling is 1'), headroom 0, sibling convention + provenance comment. File passes the 120-byte max-line rule unchanged (no length offender reported). Verified: '✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/true-green.md is 34 lines (ceiling 34; headroom 0).'",
"11296": "ci-failure.mjs imports resolveSweepRepo from check-half-states.mjs (export re-verified present on current origin/main at line 862 after the patrol-predicates merge) and the hardcoded ?? 'objectstack-ai/objectstack' default is gone. Sweeper's malformed-value refusal mirrored at the LIVE entry point only; --self-test and --help stay exempt by construction. Landed-proof = the card's re-check grep: 'grep -n \"OWNER_REPO = process.env\" scripts/pm/*.mjs' returned 1 hit before, 0 hits (exit 1) after. Refusal exercised offline: PM_SWEEP_REPO=objectui -> exit 2 with the refusal text.",
"11277": "The check-declaration-mirrors row's why rewritten to measured terms: a RECURSIVE walk admitted by EXTENSION (scripts/**/*.d.mts), 2 of 261 (0.77%), read from the gate's own mirrorFiles(). Re-filed into the correct refusal class (the extension-filter class of check:driver-conformance CASE_SETS_DIR and check:skills-token-ratchet SKILLS_DIR) rather than the 'no non-recursive spelling' class of the row above it that its text was copied from. Verdict untouched (still REFUSE-UNSPELLABLE, more strongly correct at 0.77% than at 51%). Docblock now records which rows carry a re-derived reading, warns against refreshing a denominator alone, and states why --self-test cannot catch this class."
},
"checks_run": [
"node scripts/pm/check-skill-line-ratchet.mjs --self-test -> exit 0, '✓ check-skill-line-ratchet self-test: 71 cases pass.'",
"node scripts/pm/check-skill-line-ratchet.mjs -> exit 0, all 26 rows green at headroom 0",
"node scripts/pm/bare-root-worklist.mjs --self-test -> exit 0, 'OK self-test: 43 live row(s), 37 unreachable as spelled, 37 recorded verdict(s) — none stale, none missing.'",
"node scripts/pm/ci-failure.mjs --self-test -> exit 0, 'OK self-test: supersession keeps the newest per name and reports the drops...'",
"node scripts/pm/check-half-states.mjs --self-test -> exit 0, '✓ check-half-states self-test: 1193 cases pass.' (resolver's own pins, incl. 20+ resolveSweepRepo cases)",
"node scripts/check-ci-filter-parity.mjs -> exit 0, 'OK: all 96 declared cross-package glob(s) (81 unique) are covered by core or crosspkg...'",
"check:agent-test-spelling, check:entry-guard, check:parse-guard, check:nul-bytes, check:cross-package-test-inputs, check:pnpm-filter-targets -> all exit 0",
"Gate family derived by 'node scripts/pm/dispatch-gates.mjs' with NO paths (script took its own change set from merge base 4805b5619; 3 paths, 10 families matched) — not a hand-fed diff",
"Union re-run AFTER the final commit at 58d24e3c8; every exit code captured before any pipe (redirect-then-capture), never a bare $? after tail",
"Control-character self-scan over the 3 touched files: clean"
],
"rederived_percentages": {
"scripts/check-declaration-mirrors.mjs SCRIPTS_DIR scripts": "115 of 226 (51%) -> 2 of 261 (0.77%) — numerator from mirrorFiles(); BOTH terms were wrong, this is the card's row",
"check:ratchet-remedy-authority SCRIPTS_DIR scripts": "115 of 226 (51%) -> 144 of 261 (55%) — numerator from corpusFiles(); shape re-confirmed (0 nested, extensions .mjs x141 + .mts x3)",
"check:runner-env-posture SCANNED_ROOTS packages": "1757 of 5049 (35%) -> 1794 of 5185 (35%) — numerator from collectFiles(); collateral figure 2658 -> 2746 skipped tests via the gate's own isTestFile",
"check:runner-env-posture SCANNED_ROOTS examples": "150 of 240 (63%) -> 150 of 241 (62%) — numerator from collectFiles()",
"check:runner-env-posture SCANNED_ROOTS apps": "0 of 35 -> 0 of 35, UNCHANGED — re-measured, not assumed",
"scripts/check-skills-token-ratchet.mjs SKILLS_DIR skills": "11 of 50 (22%) -> 11 of 50 (22%), UNCHANGED — re-measured via discoverSkillFiles()",
"denominators_today_from_trackedFiles": "packages 5185 · examples 241 · scripts 261 · skills 50 · apps 35",
"deliberately_not_rewritten": "Every other row. Their gates export no walk to drive, so re-deriving would mean reproducing the filter by hand — an estimate the file's docblock refuses — and refreshing the denominator ALONE would pair today's denominator with an older numerator, minting a ratio nothing ever measured: the same defect in fresher digits. Those rows keep their original readings and the docblock now says so explicitly."
},
"out_of_scope_findings": [
"filed as #12098: references/compile-surfaces.md is the LAST pm-dispatch references file with no CEILINGS row — same class as #11310, found by enumerating the directory against the map; dedup-searched, nothing open covered it. Filed unassigned rather than folded in: the dispatch declared a one-row scope and this map's precedent is that a missing row is triaged, not added in passing."
],
"notes": [
"No changeset: scripts/pm/ is PM-loop tooling and publishes nothing. 'skip-changeset' applied via the additive POST /labels endpoint and READ BACK after the size-labeler settled — labels read ['size/s','skip-changeset'], so the additive write was not clobbered.",
"Non-governed surface confirmed: no file in the diff is on the Prime Directive #14 register. PR left as DRAFT; nothing armed, queued or flipped ready.",
"PR body read back after creation: first line 'Closes #11310, closes #11296, closes #11277' intact (closing keyword before EACH number), session-URL footer survived, 7317 bytes, no sanitizer damage.",
"Structural observation, NOT changed: both scripts-root rows sit under the '── Refused: the population is the whole root ──' section header while carrying verdict REFUSE-UNSPELLABLE. Pre-existing for BOTH rows and outside the card's remedy, so left alone; the rewritten why now states the class explicitly in prose.",
"CI not waited on per the standing contract — report is delivered at draft-PR time; gate status on the PR is whatever CI concludes after this report."
]
}
Review of record — verified against the fetched branch: true-green CEILINGS row at 34 (check-skill-line-ratchet.mjs:237), set by the gate's own measurement (the insert-at-1-and-read-the-red trick is exactly "read it from the ratchet's own run"); ci-failure.mjs now calls resolveSweepRepo(process.env) with the hardcoded default gone (re-check grep: 0 hits) and the refusal exercised offline; the worklist why rewritten to measured terms and re-filed into the extension-filter refusal class. The re-derivation discipline is the pack's best part: numerators only from gates' own exported walks, the "deliberately not rewritten" rows justified by exactly the right argument (a hand-reproduced filter is an estimate; a refreshed denominator against an old numerator mints a ratio nothing measured), and apps 0 of 35 re-measured rather than assumed. Out-of-scope #12098 (compile-surfaces.md, the last uncovered references file) correctly filed, not folded — enters the next triage fire.
Landing: on merge all three close; pm:dispatched off in the stroke.
Activity
os-zhuang commentedon Aug 25, 2026
Skills-lane self-triage (run-to-empty fire):
finding→pm:queue, premise re-verified before grading:true-green.mdstill has noCEILINGSrow on today's main (grep empty) — the #11948 wholesale re-pin did not add coverage, only re-pinned existing rows. Scope = exactly the card's remedy: oneCEILINGSrow at the file's landed count read from the ratchet's own run, headroom 0, same convention. Smallest card in the lane queue; fold-candidate onto any skills-lane PR that already touches the ratchet registry.Generated by Claude Code
os-zhuang commentedon Aug 25, 2026
Claim — skills seat
session_01RMTpSRF5CjMmQBFfPtPCwJ. Folded dispatch, scripts/pm small-fixes pack (lead): #11310 (true-green CEILINGS row) + #11296 (ci-failure.mjsresolveSweepRepo) + #11277 (bare-root worklistwhyrewrite + sibling-percentage re-derive). Branchclaude/issue-11310-pm-scripts-fixes, worktreeobjectstack-11310-pack. Non-governed. Clause-②: no.Generated by Claude Code
fix(pm-scripts): ratchet row for true-green.md, shared repo resolver …
os-zhuang commentedon Aug 25, 2026
os-dev-report
{ "issues": [11310, 11296, 11277], "status": "done", "branch": "claude/issue-11310-pm-scripts-fixes", "pr_url": "https://github.com/objectstack-ai/objectstack/pull/12096", "premise_still_valid": true, "head_sha": "58d24e3c8", "per_item": { "11310": "CEILINGS row added for .claude/skills/pm-dispatch/references/true-green.md at 34, the landed count read from the ratchet's OWN run (row first inserted at ceiling 1 so the gate printed 'true-green.md is 34 lines; the ratchet ceiling is 1'), headroom 0, sibling convention + provenance comment. File passes the 120-byte max-line rule unchanged (no length offender reported). Verified: '✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/true-green.md is 34 lines (ceiling 34; headroom 0).'", "11296": "ci-failure.mjs imports resolveSweepRepo from check-half-states.mjs (export re-verified present on current origin/main at line 862 after the patrol-predicates merge) and the hardcoded ?? 'objectstack-ai/objectstack' default is gone. Sweeper's malformed-value refusal mirrored at the LIVE entry point only; --self-test and --help stay exempt by construction. Landed-proof = the card's re-check grep: 'grep -n \"OWNER_REPO = process.env\" scripts/pm/*.mjs' returned 1 hit before, 0 hits (exit 1) after. Refusal exercised offline: PM_SWEEP_REPO=objectui -> exit 2 with the refusal text.", "11277": "The check-declaration-mirrors row's why rewritten to measured terms: a RECURSIVE walk admitted by EXTENSION (scripts/**/*.d.mts), 2 of 261 (0.77%), read from the gate's own mirrorFiles(). Re-filed into the correct refusal class (the extension-filter class of check:driver-conformance CASE_SETS_DIR and check:skills-token-ratchet SKILLS_DIR) rather than the 'no non-recursive spelling' class of the row above it that its text was copied from. Verdict untouched (still REFUSE-UNSPELLABLE, more strongly correct at 0.77% than at 51%). Docblock now records which rows carry a re-derived reading, warns against refreshing a denominator alone, and states why --self-test cannot catch this class." }, "checks_run": [ "node scripts/pm/check-skill-line-ratchet.mjs --self-test -> exit 0, '✓ check-skill-line-ratchet self-test: 71 cases pass.'", "node scripts/pm/check-skill-line-ratchet.mjs -> exit 0, all 26 rows green at headroom 0", "node scripts/pm/bare-root-worklist.mjs --self-test -> exit 0, 'OK self-test: 43 live row(s), 37 unreachable as spelled, 37 recorded verdict(s) — none stale, none missing.'", "node scripts/pm/ci-failure.mjs --self-test -> exit 0, 'OK self-test: supersession keeps the newest per name and reports the drops...'", "node scripts/pm/check-half-states.mjs --self-test -> exit 0, '✓ check-half-states self-test: 1193 cases pass.' (resolver's own pins, incl. 20+ resolveSweepRepo cases)", "node scripts/check-ci-filter-parity.mjs -> exit 0, 'OK: all 96 declared cross-package glob(s) (81 unique) are covered by core or crosspkg...'", "check:agent-test-spelling, check:entry-guard, check:parse-guard, check:nul-bytes, check:cross-package-test-inputs, check:pnpm-filter-targets -> all exit 0", "Gate family derived by 'node scripts/pm/dispatch-gates.mjs' with NO paths (script took its own change set from merge base 4805b5619; 3 paths, 10 families matched) — not a hand-fed diff", "Union re-run AFTER the final commit at 58d24e3c8; every exit code captured before any pipe (redirect-then-capture), never a bare $? after tail", "Control-character self-scan over the 3 touched files: clean" ], "rederived_percentages": { "scripts/check-declaration-mirrors.mjs SCRIPTS_DIR scripts": "115 of 226 (51%) -> 2 of 261 (0.77%) — numerator from mirrorFiles(); BOTH terms were wrong, this is the card's row", "check:ratchet-remedy-authority SCRIPTS_DIR scripts": "115 of 226 (51%) -> 144 of 261 (55%) — numerator from corpusFiles(); shape re-confirmed (0 nested, extensions .mjs x141 + .mts x3)", "check:runner-env-posture SCANNED_ROOTS packages": "1757 of 5049 (35%) -> 1794 of 5185 (35%) — numerator from collectFiles(); collateral figure 2658 -> 2746 skipped tests via the gate's own isTestFile", "check:runner-env-posture SCANNED_ROOTS examples": "150 of 240 (63%) -> 150 of 241 (62%) — numerator from collectFiles()", "check:runner-env-posture SCANNED_ROOTS apps": "0 of 35 -> 0 of 35, UNCHANGED — re-measured, not assumed", "scripts/check-skills-token-ratchet.mjs SKILLS_DIR skills": "11 of 50 (22%) -> 11 of 50 (22%), UNCHANGED — re-measured via discoverSkillFiles()", "denominators_today_from_trackedFiles": "packages 5185 · examples 241 · scripts 261 · skills 50 · apps 35", "deliberately_not_rewritten": "Every other row. Their gates export no walk to drive, so re-deriving would mean reproducing the filter by hand — an estimate the file's docblock refuses — and refreshing the denominator ALONE would pair today's denominator with an older numerator, minting a ratio nothing ever measured: the same defect in fresher digits. Those rows keep their original readings and the docblock now says so explicitly." }, "out_of_scope_findings": [ "filed as #12098: references/compile-surfaces.md is the LAST pm-dispatch references file with no CEILINGS row — same class as #11310, found by enumerating the directory against the map; dedup-searched, nothing open covered it. Filed unassigned rather than folded in: the dispatch declared a one-row scope and this map's precedent is that a missing row is triaged, not added in passing." ], "notes": [ "No changeset: scripts/pm/ is PM-loop tooling and publishes nothing. 'skip-changeset' applied via the additive POST /labels endpoint and READ BACK after the size-labeler settled — labels read ['size/s','skip-changeset'], so the additive write was not clobbered.", "Non-governed surface confirmed: no file in the diff is on the Prime Directive #14 register. PR left as DRAFT; nothing armed, queued or flipped ready.", "PR body read back after creation: first line 'Closes #11310, closes #11296, closes #11277' intact (closing keyword before EACH number), session-URL footer survived, 7317 bytes, no sanitizer damage.", "Structural observation, NOT changed: both scripts-root rows sit under the '── Refused: the population is the whole root ──' section header while carrying verdict REFUSE-UNSPELLABLE. Pre-existing for BOTH rows and outside the card's remedy, so left alone; the rewritten why now states the class explicitly in prose.", "CI not waited on per the standing contract — report is delivered at draft-PR time; gate status on the PR is whatever CI concludes after this report." ] }Generated by Claude Code
os-zhuang commentedon Aug 25, 2026
ACCEPT (pack) — PR #12096, covering #11310 + #11296 + #11277. Draft; non-governed scripts surface, joins the maintainer's merge list.
Review of record — verified against the fetched branch: true-green
CEILINGSrow at 34 (check-skill-line-ratchet.mjs:237), set by the gate's own measurement (the insert-at-1-and-read-the-red trick is exactly "read it from the ratchet's own run");ci-failure.mjsnow callsresolveSweepRepo(process.env)with the hardcoded default gone (re-check grep: 0 hits) and the refusal exercised offline; the worklistwhyrewritten to measured terms and re-filed into the extension-filter refusal class. The re-derivation discipline is the pack's best part: numerators only from gates' own exported walks, the "deliberately not rewritten" rows justified by exactly the right argument (a hand-reproduced filter is an estimate; a refreshed denominator against an old numerator mints a ratio nothing measured), andapps 0 of 35re-measured rather than assumed. Out-of-scope #12098 (compile-surfaces.md, the last uncovered references file) correctly filed, not folded — enters the next triage fire.Landing: on merge all three close;
pm:dispatchedoff in the stroke.Generated by Claude Code
fix(pm-scripts): ratchet row for true-green.md, shared repo resolver …