Skip to content

docs(source-control): document unscheduled checks and the tracker-reference form - #3061

Merged
kyle-sexton merged 2 commits into
mainfrom
claude/tracker-ref-and-unscheduled-checks
Aug 20, 2026
Merged

docs(source-control): document unscheduled checks and the tracker-reference form#3061
kyle-sexton merged 2 commits into
mainfrom
claude/tracker-ref-and-unscheduled-checks

Conversation

@kyle-sexton

Copy link
Copy Markdown
Contributor

No linked issue

Summary

Two findings from a babysit session, both of which cost real time and neither of which was written down anywhere. They are unrelated in mechanism but share a cause: an operator hits them only in CI, with no local signal.

Fix

1. stuck-checks.md — checks that never schedule. That file covered checks which are present and never settle, detected under UNSTABLE. It did not cover the opposite failure with the same surface complaint. A conflicted PR has no computable merge ref, so pull_request workflows are never created — absent rather than pending or failing, and therefore invisible to checks.stuck, which can only classify records that exist.

What makes it actively misleading is that pull_request_target lanes run against the base and still pass. The PR shows a short all-green list with no failures anywhere — reading as "passing" or "not started yet" — while most gates are simply missing. The remedy is merge-or-rebase, not a CI investigation; diagnosing it as a trigger or App-token problem spends time on an uninvolved mechanism, which has already happened here once.

The section names the two pull_request_target lanes rather than counting the split, and says to derive the split from the on: blocks. A count in prose goes stale the next time a lane is added — the exact defect the two recent skill-count-gate changes addressed.

2. New docs/conventions/tracker-reference-form. What a code comment may say about an issue. It needs a written home precisely because the comment-hygiene lane cannot be run locally: the action is not vendored, so a violation is discoverable only after pushing.

Written from the action source at the SHA ci.yml pins, not from memory — and that mattered. The belief carried into this change was that PR #N and owner/repo#N are simply rejected, but the tree contains passing instances of both. Reading the action resolved the contradiction: the allowlist is an extension set that excludes Markdown and YAML, so those instances are out of scope rather than tolerated. The doc states that scoping explicitly, so the counterexamples don't later read as evidence the rule is lax.

Documentation only; no executable surface.

Verification

  • check-changelog-parity.sh --check, --check-bump origin/main, --check-order — all green; source-control bumped with a matching entry
  • check-skill-count-claims.sh --check — every claim matches the tree
  • check-shell-portability.sh --paths on the changed skill file — clean
  • markdownlint-cli2 on both docs — 0 issues
  • typos, editorconfig-checker, and jq on the manifest — clean

The one rule this PR documents that it cannot verify locally is comment-hygiene itself; the added comment text was grepped for each rejected shape before pushing, and both changed docs are Markdown, which the policy does not scan.

Related

Refs #3050 and #3057 — the two changes whose sessions produced these findings. This PR closes out the last of them, so nothing from that work remains unrecorded.


Generated by Claude Code

…erence form

Two findings from a babysit session, both of which cost real time and neither
of which was written down anywhere.

1. `stuck-checks.md` covered checks that are present and never settle, detected
   under UNSTABLE. It did not cover the opposite failure with the same surface
   complaint: checks that never get created at all. A conflicted PR has no
   computable merge ref, so `pull_request` workflows are never scheduled --
   absent rather than pending or failing, and so invisible to `checks.stuck`,
   which can only classify records that exist.

   What makes it actively misleading is that `pull_request_target` lanes run
   against the base and still pass. The PR then shows a short all-green list
   with no failures anywhere, reading as "passing" or "not started", while most
   gates are missing. The remedy is to merge or rebase, not to investigate CI;
   diagnosing it as a trigger or App-token problem is time spent on an
   uninvolved mechanism, which has already happened here once.

   The section deliberately NAMES the two `pull_request_target` lanes instead of
   counting the split, and says to derive the split from the `on:` blocks. A
   count in prose goes stale the next time a lane is added -- the defect two
   recent changes to the skill-count gate were about.

2. A new `docs/conventions/tracker-reference-form` records what a code comment
   may say about an issue. This needs a written home specifically because the
   `comment-hygiene` lane CANNOT be run locally: the action is not vendored, so
   a violation is only discoverable after pushing.

   Written from the action source at the SHA ci.yml pins, not from memory. That
   mattered: the belief being carried into this change was that `PR #N` and
   `owner/repo#N` are simply rejected, but the tree contains passing instances
   of both. Reading the action resolved it -- the allowlist is an extension set
   that excludes markdown and YAML, so those instances are out of scope rather
   than tolerated. The doc states the scoping, so the counterexamples do not
   later read as evidence the rule is lax.

Documentation only; no executable surface. Verified: changelog parity
(--check, --check-bump, --check-order), the skill-count gate, portability on
the changed skill file, markdownlint, typos, editorconfig, and manifest JSON.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ADsDCToTtjvYut3ZQXJHDM
@kyle-sexton
kyle-sexton enabled auto-merge (squash) August 20, 2026 21:56
@claude

claude Bot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Claude finished @kyle-sexton's task in 46s —— View job


Security review — no relevant surface

  • Load /review:security-review skill instructions
  • Run skip-gate check (PR open, security-relevant surface, no prior applicable review)
  • Review changed files (gh pr diff 3061)
  • Report findings (or state none found)

Skip gate hit: no security-relevant surface. All four changed files are documentation/metadata only:

  • docs/conventions/tracker-reference-form/README.md — new prose doc describing a comment-hygiene convention; no executable content.
  • plugins/source-control/.claude-plugin/plugin.json — version bump only (0.54.120.54.13).
  • plugins/source-control/CHANGELOG.md — changelog entry only.
  • plugins/source-control/skills/babysit-prs/reference/stuck-checks.md — added prose section on diagnosing conflicted-PR check absence; no scripts, no workflow files, no permissions/config changes.

No GitHub Actions workflows, scripts, credentials handling, or trust-boundary logic are touched, so there is no injection surface, permission-widening, or supply-chain change to evaluate. Per this lane's skip gate, stopping here with no findings.

@github-actions

github-actions Bot commented Aug 20, 2026

Copy link
Copy Markdown

Last security-reviewed head: f4957ddf963840c2470295940325425b19f0cb56. On the next push, the relevance gate compares only the commits since this SHA; delete this comment to force a full re-review.

@claude

claude Bot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Claude finished @kyle-sexton's task in 3m 32s —— View job


Code review complete

  • Gather context (PR diff, CLAUDE.md, REVIEW.md)
  • Run /review:code-review criteria against changed files
  • Post findings (inline comments + summary)

Scope: Documentation-only PR (docs/conventions/tracker-reference-form/README.md added; plugins/source-control/skills/babysit-prs/reference/stuck-checks.md, CHANGELOG.md, and plugin.json updated). No executable surface, so the code-review lane's atomicity/observability checks don't apply, and this repo carries a claude-security-review.yml workflow, so security is out of scope for this lane per REVIEW.md.

No blocking or suggestion-level findings. No inline comments were posted.

I independently verified (not just restating the author's claimed verification) the factual claims this PR's argument depends on, against the current tree:

  • The two named pull_request_target lanes in stuck-checks.md's new section — do-not-merge and pr-issue-linkage — are in fact the only two workflows in .github/workflows/ triggered on pull_request_target; every other lane (including ci.yml, which bundles ~40+ jobs) is on pull_request, consistent with the "short all-green list vs. the rest missing" claim (stuck-checks.md#L43-L70).
  • tracker-reference-form/README.md's relative links resolve correctly (../../../.github/workflows/ci.yml → repo root's ci.yml; ../commit-convention/README.mddocs/conventions/commit-convention/README.md), and both targets exist.
  • The two cited "passing counterexamples" are real and exactly as described: PR #3011 appears in a ci.yml comment (ci.yml#L554), and melodic-software/github-iac#89 appears in .github/dependabot.yml — both outside the doc's stated scanned-extension allowlist (.yml/no extension isn't in it), so they're correctly explained as out-of-scope rather than tolerated.
  • The audit-comment-residue exclusion the new doc describes matches the actual exclude: block wired into ci.yml's comment-hygiene step verbatim, including the SHA-pinned action reference.
  • The bare (#N) form the doc calls "used throughout this repository" is genuinely pervasive (766 occurrences across 175 files in code/script comments).
  • pr-issue-linkage.yml does require a native closing keyword in the PR body, matching the doc's "Not a ban" section.
  • The CHANGELOG.md/plugin.json version bump (0.54.12 → 0.54.13) as a patch-level bump for an ### Added doc-only entry matches this changelog's established precedent (e.g. 0.54.6→0.54.7, 0.53.23→0.53.24 are also patch-level Added entries).

Not independently verifiable from this checkout (network access to the external ci-workflows action source and to run markdownlint-cli2/typos/editorconfig-checker wasn't available to this review) — flagging as author-claimed, not confirmed by me: the exact rejected-form list and the code-extension allowlist as they exist in the comment-hygiene action at the pinned SHA, and the linting tool results cited in the PR's Verification section.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 1452a46055

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread plugins/source-control/skills/babysit-prs/reference/stuck-checks.md
Comment thread docs/conventions/tracker-reference-form/README.md Outdated
@github-actions

github-actions Bot commented Aug 20, 2026

Copy link
Copy Markdown

Claude has reviewed this PR 2 times. The lane skips further automatic reviews after 5; deleting this comment resets the count.

…and name both exclusions

Two reviewer findings, both real, and the first is the more serious kind: the
guidance was not wrong, it was unreachable.

1. `stuck-checks.md` is loaded only when `checks.stuck` is non-empty
   (`runbook-cycle.md`), and `SKILL.md` advertised it as the UNSTABLE signal
   alone. The section added in the previous commit applies precisely when that
   array is EMPTY, so under the documented load rules the flow would never open
   the file in the situation the section exists for. Content nobody reaches is
   worse than content that is merely imprecise, because it looks done.

   The snapshot already models this case: `compute_branch_freshness` maps DIRTY
   and CONFLICTING to `branch_freshness.state == "conflicting"`. That is the
   section's real queue signal, so the load condition now fires on it as well,
   `SKILL.md`'s description covers both directions, and the section states its
   own entry condition instead of leaving it implied by the file it sits in.

2. The tracker-reference doc named only the `scripts/**` exclusion. `ci.yml`
   excludes `audit-comment-residue`'s `scripts/**` AND `evals/**`, and the
   omission is observable rather than academic: `evals/fixtures/
   residue-snippet.py` carries a scanned extension and a rejected form, and
   passes only because the evals tree is excluded. A doc explaining the policy's
   scope while understating that scope would have contradicted itself. Both are
   now named, pointing at ci.yml as authoritative.

The cause of (2) is worth recording: the exclusion was read through a `sed`
window that ended one line above the second entry, and the truncated view was
written up as if complete. The reviewer had the whole block.

Documentation only. Re-verified after the fixes: markdownlint, typos,
editorconfig, changelog parity (--check-bump, --check-order), and the
skill-count gate. Version stays 0.54.13 -- unreleased in this PR -- with its
changelog entry extended rather than a second version added.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ADsDCToTtjvYut3ZQXJHDM
@claude

claude Bot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Claude finished @kyle-sexton's task in 35s —— View job


Security review — no relevant surface

  • Load /review:security-review skill instructions
  • Run skip-gate check (PR open, security-relevant surface, no prior applicable review)
  • Review changes since last-reviewed head (gh/git diff against 1452a4605563cf36a837d247d76ff1745482029b)
  • Report findings (or state none found)

Skip gate hit: no security-relevant surface. The last successful security review on this PR covered up to 1452a4605563cf36a837d247d76ff1745482029b. The only new commit since then, f4957dd, addresses two reviewer findings (a load-condition fix and naming a second exclusion) and touches only:

  • docs/conventions/tracker-reference-form/README.md — prose edit naming both audit-comment-residue exclusions (scripts/** and evals/**); no executable content.
  • plugins/source-control/skills/babysit-prs/SKILL.md — one-line description edit.
  • plugins/source-control/skills/babysit-prs/reference/runbook-cycle.md — prose edit to the load-condition for a reference file.
  • plugins/source-control/skills/babysit-prs/reference/stuck-checks.md — added prose stating the section's entry condition.
  • plugins/source-control/CHANGELOG.md — changelog entry only.

No GitHub Actions workflows, scripts, credentials handling, or trust-boundary logic are touched by this commit. All changes are Markdown prose/reference-link edits inside documentation and skill-guidance files. No injection surface, permission-widening, or supply-chain change to evaluate. Per this lane's skip gate, stopping here with no findings.

@claude

claude Bot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Claude finished @kyle-sexton's task in 2m 39s —— View job


Code review complete

  • Gather context (PR diff, CLAUDE.md, prior comments/reviews)
  • Invoke /review:code-review skill and follow its instructions
  • Post findings (inline comments + summary)

Scope: This is a re-review triggered by the new commit f4957dd, which was pushed specifically to fix the two P2 findings Codex raised against the prior commit (1452a46). Still documentation-only — no executable surface — so per REVIEW.md and this repo's claude-security-review.yml workflow, security stays out of scope for this lane.

No blocking or suggestion-level findings. No inline comments were posted. I independently verified both fixes against the actual source they claim to describe, not just the prose:

  • Reachability fix (runbook-cycle.md#L34-42, stuck-checks.md#L50-54, SKILL.md#L418): Codex's point was that the "never scheduled" section was added under a load condition (checks.stuck non-empty) that provably can never be true when that section applies. I confirmed this against classify_stuck_checks in babysit_checks.py#L264 — it hard-returns [] unless merge_state == "UNSTABLE", so checks.stuck really is empty by construction whenever a PR is DIRTY/CONFLICTING. I also confirmed compute_branch_freshness in babysit_delta.py (line 241) maps both mergeStateStatus == "DIRTY" and mergeable == "CONFLICTING" to branch_freshness.state == "conflicting", which is exactly the new second load trigger added to runbook-cycle.md. The fix is correct and closes the gap.
  • Missing evals/** exclusion (tracker-reference-form/README.md#L42-48): confirmed the live exclude: block in ci.yml#L224-226 excludes both audit-comment-residue/scripts/** and audit-comment-residue/evals/** — the doc now names both. I also confirmed the doc's own justifying example is real: evals/fixtures/residue-snippet.py exists, has a scanned .py extension, and contains PR #45 on line 9 — a form the policy rejects everywhere it's in scope — so the doc's claim that this file "passes only because the evals tree is excluded" checks out.

Both ../scripts/babysit_delta.py and ci.yml relative links in the changed docs resolve correctly. The CHANGELOG.md addition extends the existing unreleased [0.54.13] entry rather than adding a second version bump, consistent with the commit message's claim and this repo's convention for iterating on an unreleased entry.

Not independently re-run in this environment (no network access): markdownlint-cli2, typos, editorconfig-checker — the author's commit message claims these were re-run and passed; noting as author-claimed, not confirmed by me. I did manually check the one syntactically-interesting spot (the nested bold/code-span construct **\scripts/` and `evals/`**in the README) and it parses as valid CommonMark by hand-trace. · branch:claude/tracker-ref-and-unscheduled-checks`

@kyle-sexton
kyle-sexton merged commit 80df6b0 into main Aug 20, 2026
49 checks passed
@kyle-sexton
kyle-sexton deleted the claude/tracker-ref-and-unscheduled-checks branch August 20, 2026 22:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants