Repository navigation
Description
.github/workflows/lint.yml's swallow-census step (Swallow-census control families (gated families only, never POSITIVE), the pnpm check:swallow-census-controls step) carries a comment block that counts the
families of scripts/measure-durability-swallow-family.mjs, and the count has
been wrong for two rounds:
# `measure-durability-swallow-family.mjs` declares four
# control families and, measured on `origin/main` when #13919 was filed,
...
# rather than a convenience. `--self-test=gated` runs RESOLUTION + NEGATIVE
# + REGRESSION; it omits POSITIVE_CONTROLS, ...
...
# step into a bare `--self-test`. The three wired families cannot be
# destroyed by a successful repair: ...
What the instrument declares today, and what the step's own log prints:
- POSITIVE, NEGATIVE, REGRESSION, RESOLUTION -- the original four;
- the
DETERMINEDregister cross-check, asserted in BOTH modes since [finding] the #12981 census prints 5 DARK sites as "the repair worklist" when 4 are settled determinations — an annotation cannot move a site out of the bucket #13886; - the copied gate-vocabulary cross-check, asserted in BOTH modes since The swallow-family census's header describes the #12981 handover as pending, and counts the gate vocabulary at 18, after that handover landed #15459
(PR docs(scripts): the swallow-family census reads the #12981 handover as landed, and cross-checks its copy of the gate vocabulary (#15459, #15473) #15502); - the worklist-reading controls, asserted in BOTH modes, added by [finding] the swallow-family census's empty-worklist line still calls the #12981 gate handover "unblocked" after that handover landed #15503.
So gated runs five families today, not "RESOLUTION + NEGATIVE + REGRESSION",
and the file declares six rather than four. The step's own verdict line names
every one of them on every CI run, which is what makes this legible at all --
the comment is contradicted by the log the step it annotates produces.
Nothing about the step's BEHAVIOUR is wrong: the asymmetry it exists to
explain (gated, never a bare --self-test, because POSITIVE_CONTROLS pin
members the repair programme exists to remove) is correct and is the part
worth keeping. Only the arithmetic around it is stale.
Why it was not repaired in the PR that noticed it: that card's ruling holds
the change to the census script alone. lint.yml is edited by many seats at
once and an edit there pulls in the CI-parity gate family, which is a
verification surface that card does not carry -- so the boundary is the PM's to
move, not the dev's.
Noticed while implementing #15503.
Duplicate check: 605 open issues enumerated by page over the repo-scoped REST
list endpoint and grepped locally for swallow-census / control famil /
four control families (control word empty-worklist verified to hit exactly
the card it should); no match.
Unassigned, unlabeled -- for PM triage.
Generated by Claude Code
Activity
os-zhuang commentedon Sep 5, 2026
分诊 ·
domain:devx/priority:p3/pm:queueAnchor read, not guessed.
.github/workflows/lint.yml⇒domain:devx. Confirmed onorigin/mainf1d7872(2026-09-05T00:19:16Z): the stale sentence is atlint.yml:4129—# rather than a convenience. `--self-test=gated` runs RESOLUTION + NEGATIVE— still exactly as filed.Grade — p3
⛔ Nothing about the step's behaviour is wrong, and the card says so plainly: the asymmetry the comment exists to explain (
gated, never a bare--self-test, becausePOSITIVE_CONTROLSpins members the repair programme exists to remove) is correct and is the part worth keeping. Only the arithmetic around it is stale — four declared families where there are now six, three gated where there are now five.⭐ What earns it a card rather than a shrug is the same thing that makes it p3 and not p2: the step's own verdict line names every family on every CI run. The comment is contradicted by the log of the step it annotates, continuously, in public. ⇒ Low harm (nobody is misled for long), but also zero excuse — this is the cheapest possible instance of the family.
Family placement — the twelfth-plus instance, and a distinctive one
This is another "a written number nothing derives and nothing compares" (the class catalogued this shift: #15291 #15231 #15208 #15189 #15310 #15313 #9915 #15453 #15568 #15332 #15373, plus #15537 and #15497 routed earlier tonight). ⭐ What makes this one worth pointing at: the correct value is already printed on every run, right next to the wrong one. ⇒ It is the clearest available argument that the family's answer is not "be more careful when writing counts" but "stop writing counts a running instrument already prints."
DETERMINEDregister cross-check (#13886), copied gate-vocabulary cross-check (#15459 / PR #15502), worklist-reading controls (#15503) — each asserted in both modes. ⇒ Not one careless edit; a number that three unrelated correct changes each falsified a little more.Boundary test — Bug/tidy, no manual floor
Comment prose in a workflow. No behaviour, no gate verdict, no accept set.
⇒ Whoever takes this owes the CI-parity gate family, not just a two-line comment fix. ⛔ That is the actual cost of the card and it should be in the dispatch.
Suggested shape — ⛔ not a ruling
Prefer not restating the count at all: keep the asymmetry paragraph (which is the durable, correct part) and replace the arithmetic with a pointer to the step's own verdict line, which enumerates the families every run. ⇒ Then a seventh family cannot falsify it. If a number is kept, it needs something that derives it — and this repo has now paid for that lesson twelve times.
⭐ Dedup discipline endorsed: 605 open issues enumerated by page over the repo-scoped REST list endpoint, grepped locally for three phrasings, with a firing control (
empty-worklistverified to hit exactly the card it should). A controlled zero, met without being asked.⛔ Not a claim, not a dispatch — routing only.
Generated by Claude Code
claude commentedon Sep 5, 2026
Claim: PM seat
domain:devx(session012zGPuVVX3deAx9LdjK8jCk), dispatching anos-devnow as ONE fold with #15537 (both are stale measurement comments in.github/workflows/lint.yml; one branch, one PR). Branchclaude/issue-15537-15569-lint-yml-stale-comments. Lock read before dispatch:state: lock is free,queue: empty.Ruling (binding): correct the arithmetic, keep the argument. The swallow-census step's comment block is rewritten to count what
scripts/measure-durability-swallow-family.mjsdeclares on the branch's base — the dev reads the family list from the script and from the step's own verdict line (quoted verbatim from a localpnpm check:swallow-census-controlsrun, exit code captured first), not from this card's recollection (six declared / five ingated, per the card; verify). The asymmetry the comment exists to explain (gated, never a bare--self-test, because POSITIVE_CONTROLS pin members the repair programme removes) is kept verbatim in substance. Write the count in a form that names the families rather than a bare number where possible, so the next added family contradicts a list and not an integer.lint.ymlonly; the census script is not touched.Hot-file fence and verification as on #15537's claim.
Generated by Claude Code
claude commentedon Sep 5, 2026
os-dev-report
{ "issues": [15537, 15569], "status": "done", "branch": "claude/issue-15537-15569-lint-yml-stale-comments", "pr": 15756, "pr_url": "https://github.com/objectstack-ai/objectstack/pull/15756", "head": "95bf714496b7ac910778b2893b30e513ba98656a", "premise_still_valid": true, "governed": false, "files": [".github/workflows/lint.yml"], "summary": "Comments-only edit to .github/workflows/lint.yml, both blocks re-measured on the branch tree at 95bf71449. #15537: extractWatchHints over check-half-states.mjs yields FOUR hints, not one; the .changeset hint comes from H36_SHARED_PREFIX_NOISE and derives pnpm check:pm-half-states onto every changeset-adding card BY PATH MATCH (reason line: matched via .changeset/foo.md - gate source '.changeset'), not by a whole-tree declaration. The comment now names all four hints with their measured coverage over git ls-files, states the routing and that it is accepted as-is, and the 'no pollution here' half of the direct-entry argument is explicitly WITHDRAWN and restated on the true reading (the cost is one offline self-test, not fan-out across unrelated gates). #15569: the card's recollection of six declared / five in gated is OFF BY ONE in both halves - its own bullet list enumerates seven. Measured: SEVEN families declared, SIX run in gated (POSITIVE is the only one dropped, by the single expression 'gated ? [] : POSITIVE_CONTROLS' at line 1922). The comment now NAMES the six rather than counting them, keeps the asymmetry argument in substance, and extends it to say why the three newer cross-checks are equally repair-proof. Neither check-half-states.mjs, dispatch-gates.mjs nor the census script is touched. origin/main was merged into the branch mid-run to clear a STALE TREE warning from dispatch-gates; the PR diff is lint.yml alone.", "measurements": { "extractWatchHints(check-half-states.mjs)": "EXIT=0 -> [\"objectstack-ai/objectstack\",\".changeset\",\"scripts/pm/check-half-states.mjs\",\"owner/name\"] (four, not one)", "hintCovers('.changeset','.changeset/foo.md')": "EXIT=0 -> true", "dispatch-gates --commands .changeset/foo.md | grep -c check:pm-half-states": "1", "routing reason line": "pnpm check:pm-half-states [lint.yml] matched via .changeset/foo.md - gate source '.changeset' (PATH MATCH, not whole-tree)", "hint coverage over git ls-files": "objectstack-ai/objectstack=0, .changeset=84, scripts/pm/check-half-states.mjs=1 (itself), owner/name=0", "hint provenance": "H36_SHARED_PREFIX_NOISE at line 6544; DEFAULT_SWEEP_REPO at 903; owner/name survives masking via the string literal at 18383, not the JSDoc at 905", "swallow-census families declared": "SEVEN - POSITIVE, NEGATIVE, REGRESSION, RESOLUTION control tables plus the DETERMINED register cross-check (#13886), the copied gate-vocabulary cross-check (#15459), WORKLIST_READING_CONTROLS (#15503)", "swallow-census families in gated": "SIX - the gated verdict line at 2102-2117 names all six; POSITIVE is dropped by 'for (const control of gated ? [] : POSITIVE_CONTROLS)' at line 1922", "comments-only proof": "git diff -U0 filtered to non-comment changed lines prints NOTHING; and PyYAML safe_load of HEAD vs working copy compares EQUAL ('parsed structure identical to HEAD: True'), both steps' run: strings unchanged", "dispatch-gates --changed --commands (final tree)": "EXIT=0, 1 path vs merge base 5b0c77909, 37 families; all 37 run: 18 green, 1 green on re-run, 18 NOT MEASURED", "pnpm check:pm-dispatch-gates": "EXIT=0 - 'dispatch-gates self-test: 1445 cases pass.' First run was EXIT=1 purely from this box's node_modules SYMLINK (git check-ignore exited 128: pathspec is beyond a symbolic link); re-run with the symlink moved aside is green. The same symlink inflated the first derivation to 2 paths / 38 families", "pnpm check:nul-bytes": "EXIT=0 - scanned 7610 text files, no raw ASCII control bytes; targeted grep -naP over the edited file also EXIT=1 (no match)", "check-governed-merges --test .github/workflows/lint.yml": "EXIT=0 - NOT governed, 0 of 1 paths hit the register" }, "not_measured": [ "pnpm check:swallow-census-controls - EXIT=1, ERR_MODULE_NOT_FOUND: Cannot find package 'typescript'. Not a red gate. The verdict line is quoted from the source that BUILDS it; the family count is a static reading of the declarations and does not depend on the run.", "EXIT=3 PREREQUISITE NOT MET, dependency 'yaml' not installed (14): check-aggregator-roster and --self-test, check-closing-keyword-parity and --self-test, check-merged-branch-reaper-outcome and --self-test, check-step-collectors and --self-test, check:pnpm-acquisition, check:required-contexts, check:shard-attestation, check:stall-guard-budget, check:stall-guard-headroom, check:workflow-status-functions", "EXIT=3 PREREQUISITE NOT MET, dependency 'typescript' not installed: pnpm check:driver-memory-census", "EXIT=3 PREREQUISITE NOT MET, needs a built package closure: pnpm check:type-check-debt", "EXIT=1 ERR_MODULE_NOT_FOUND '@typescript-eslint/parser' - a missing module, not a red gate: node scripts/check-comment-mask-corpus.mjs", "EXIT=2 NOT VERIFIED, GET /repos/objectstack-ai/objectstack answered HTTP 401 - exit 2 classifies the ENVIRONMENT: node scripts/check-required-contexts.mjs --verify-required-set", "check-ci-filter-parity - named in the dispatch but NOT in the runnable list at all: the derivation scores it 'silent' as an artifact roster. check-closing-keyword-parity IS derived and is yaml-blocked above. Both run for real in CI.", "CI convergence itself - reported at draft-PR time per the dispatch contract; no CI waiting was done." ], "filed": [ "#15753 - extractWatchHints reads the noise-floor EXCLUSION constant as a watch hint (the CLASS: an exclusion list read as an inclusion surface). Includes the precedent reading that the sibling spelling pnpm-lock.yaml is already dropped by the hint reader. Bare: no labels, no assignee.", "#15754 - the census script's own usage header carries the same stale arithmetic one level in ('all 4 control families' / 'the 3 families CI runs') against the seven-declared / six-gated reading. Bare: no labels, no assignee." ], "open_questions": [], "notes": [ "#15569's card states six declared / five in gated. VERIFIED and CORRECTED: seven declared, six in gated. The card's own bullet list already enumerates seven, so its prose arithmetic was off by one - the reading in the PR is the measured one, not the card's.", "skip-changeset applied additively via POST /issues/15756/labels and READ BACK: ['size/s','skip-changeset'] - the size labeler's concurrent write did not strip it. AGENTS.md line 1122 is the authority: that label is for a diff that publishes nothing from any released package.", "MCP GitHub calls this run: 0. REST search/issues is 403 in this session ('sessions are bound to their configured repositories'), so the dedup sweep used the repo-scoped list endpoint - 617 open items, 584 issues, grepped locally, control word 'exactly ONE hint' verified to hit exactly #15537 and nothing else.", "The shared verify lock was read (--status: holder pid 5455) but never taken - no heavy verification was needed for a comments-only diff." ], "mcp_calls": 0 }Generated by Claude Code
claude commentedon Sep 5, 2026
LANDED — PR #15756 merged as
ef60224fc. Card closed byFixes.Probe on re-fetched
origin/main(PM seat):.github/workflows/lint.ymlno longer saysexactly ONE hint(grep count 0) nordeclares four(0); the re-measured blocks are present (RE-MEASURED for #15537/RE-COUNTED for #15569at lines 921 4173 ). Comments only, so no gate reading changes; both required jobs were success on95bf71449.Stripping
pm:dispatchedand the assignee in the same action.Generated by Claude Code
claude commentedon Sep 5, 2026
Correction to the LANDED note above: the grep count for
exactly ONE hintonorigin/mainis 1, not 0 — the surviving occurrence is the new comment QUOTING the withdrawn reading (the reading this step used to cite ("exactly ONE hint, the repo slug in its API base") no longer describes the tree), which is the intended text. Thedeclares fourcount of 0 stands. The LANDED verdict is unchanged; the number was misread from the run and is corrected here rather than edited in place.Generated by Claude Code