Repository navigation
skills(running-tend): weigh the root-cause fix in every workflow, not just triage - #4086
Conversation
… just triage The rule sat under Issue Triage, so it read as advice for answering a bug report; the failure it describes keeps landing in the nightly sweep. Promote it to a top-level section, widen its trigger to cover a stale value, and name the case it was missing: a value stale because it duplicates a source of truth, where annotating the copy leaves the duplication in place.
worktrunk-bot
left a comment
There was a problem hiding this comment.
The heading and the trigger widened, but the operative clause did not: the gate still fires "before opening a docs-only PR", and the closing sentence still keys on "a config change". The section's own example is the counterexample — #4069 annotated values in docs/demos/shared/themes.py, Python source, so it was not a docs-only PR and recommended no config change. A future sweep making a comments-only change to a source file can read that clause literally and conclude the gate doesn't bind — the same literal-scope miss (the rule filed under ## Issue Triage) that this PR exists to fix, one clause further down. Two suggestions inline.
…rigger The rewrite widened the heading and the trigger but left the gate keyed on "before opening a docs-only PR" and the closing sentence on "a config change". The section's own example is neither: #4069 annotated values in docs/demos/shared/themes.py and recommended no config change, so a comments-only source change could read the clause literally and conclude the gate doesn't bind — the same literal-scope miss the promotion out of "## Issue Triage" exists to fix.
| downsides in the PR body up front, not only when challenged. | ||
|
|
||
| This governs every workflow that opens a PR here, not just issue triage. The | ||
| nightly sweep's #4069 annotated twelve stale VHS theme colors with |
There was a problem hiding this comment.
I thought we had guidance against giving references to specific historical events?
There was a problem hiding this comment.
Yes — skill-pr-workflow.md step 3: "State the rule, not the incident that produced it … step 4's PR body is where the case history goes." That paragraph was a straight violation of it, and the case history it repeated is already in the PR body where it belongs.
Dropped the two incident sentences in b05d05268, keeping only the scope clause: "This governs every workflow that opens a PR here, not just issue triage."
…l now carries (#4189) Two H3 sections under `## Issue Triage` in the `running-tend` overlay restate rules that tend's bundled `fix-a-bug` skill carries, so the overlay copies can only drift from them — and one already has. - **`Don't fix tests by adding skip guards`** duplicates bundled **Don't "fix" tests by adding skip guards**, down to the same smell list (`let Ok(_) = … else { return };`, `if !path.exists() { return; }`, `#[ignore]`). The bundled version is already wider: it adds `skipIf` / `pytest.skip`, and it leads with the test that generalizes — does the change restore the assertion, or remove coverage for the failing scenario? - **`Same-root-cause-class triage`** duplicates bundled **Defer to in-flight same-root-cause PRs**, with nothing left over. The drift that matters is scope. Both overlay copies sat under `## Issue Triage`, so they read as triage-only rules; `fix-a-bug` is loaded before any fix in any workflow, so the bundled rules bind a nightly sweep and a CI-fix run too. A session reading the overlay alone could conclude a skip guard is fair game outside triage. That's the same correction #4086 made for the root-cause rule. So this PR deletes both sections and keeps only what is genuinely worktrunk's, as an addition to the bundled rule rather than a restatement of it: a test leaning on inherited state reworks its own setup via `TestRepo::with_initial_commit()` plus a tempdir. That survivor moves to a top-level section beside the test commands, since it is no more triage-specific than the rules it defers to, and says so explicitly. Both rules were added by #2639, whose own body flagged that the skip-guard one "may also generalize beyond worktrunk" — it since has. No regression test: this is instruction text with no code path to exercise. The overlay carries no cross-references to either heading, and `.agents/skills` is a symlink to `.claude/skills`, so the Codex view follows automatically. --------- Co-authored-by: worktrunk-bot <254187624+worktrunk-bot@users.noreply.github.com>
running-tend's "weigh the root-cause fix before shipping a config/docs workaround" rule sat under## Issue Triage, so it read as advice for answering a bug report. The failure it describes keeps happening in the nightly sweep instead. This promotes the section to top level, widens its trigger from "a mismatch or false-positive report" to include a stale value, and names the case the rule was missing: a value that is stale because it duplicates a source of truth, where annotating the copy leaves the duplication in place.Net effect on the file is a heading level, four reworded sentences, and one added sentence — deliberately small, because the behavior this is about is adding explanation where consolidation was available.
The occurrence
#4069 opened from the nightly sweep as a comments-only repoint of the VHS theme values, and its own review rounds added
(pre-Starlight; site is #xxxxxx)to twelve of them — accurate, verified, and a record of drift rather than a fix for it. The values were stale becausedocs/demos/shared/themes.pyheld its own copy of the site's ANSI palette. Before merging,max-sixtyreplaced all twelve in820eb6873by reading the hex--wt-*properties out ofcustom.cssat build time; that commit message ends "This replaces the per-value 'pre-Starlight' annotations."CLAUDE.mdalready says the general form — "Consolidate or remove existing prose and machinery before adding another explanation, mode, or special case", added in27c73088on 2026-08-28. The PR above was authored two weeks later. Therunning-tendsection is where the workflow-specific form of that rule already lives, and it was scoped to the one workflow that didn't produce this.Gates
This is the sixth occurrence of a pattern the daily review log has tracked since July, and the pre-registered condition under which it becomes actionable: the 2026-08-29 entry recorded "if a 6th occurrence lands on work authored after
27c73088, the maintainer's rule has been read and not followed, and a workflow-placed rule becomes the right instrument." Occurrences 1–5 are #3516 (07-19), #3736 (08-05), #3770 (08-08), #3812 (08-18) and #3947→#3948 (08-29); five earlier windows checked for a sixth and found none.One caveat worth your attention: the bot has five PRs open right now, which is where the standing guidance says to hold self-initiated work. This is the only PR this run opens, and everything else it found is recorded in #3980 rather than filed. Close it if you'd rather the queue drained first — the analysis is in the tracker either way.
Verification
The annotation counts per commit on #4069, against
docs/demos:git grep -c pre-Starlight origin/mainreturns nothing, so none reachedmain. The cost was five maintainer-authored commits on a bot PR, not a wrong claim left standing.Source: review-runs run 34746147397, window 2026-09-12T07:48:32Z → 2026-09-13T07:48Z.