Skip to content

basics: name the path-filtered-conformance trap as a rule - #594

Merged
missingbulb merged 2 commits into
mainfrom
claude/per-repo-baselining-d9v18j
Jul 30, 2026
Merged

basics: name the path-filtered-conformance trap as a rule#594
missingbulb merged 2 commits into
mainfrom
claude/per-repo-baselining-d9v18j

Conversation

@missingbulb

Copy link
Copy Markdown
Owner

maintenance.delivery: auto-merge arms GitHub's auto-merge, which is a queue for checks. Three CI shapes exist, and only one fails silently:

shape outcome
no pull_request workflow at all baselining merges directly (#588) — coherent
an unfiltered conformance flow the sweep runs, auto-merge lands on green — correct
a path-filtered flow the arm succeeds and no check ever runs — the PR waits forever

The third is invisible from every angle: the repo looks like it has CI, hasPrCi is true, the arm reports success, and the maintenance PR simply never lands. TLDR sat in it — all three of its test workflows filter to extension/**, server/**, dev/requirements/**, so a mount-only diff matched nothing. The same filters had also hidden two blocking claudinite-isolation findings on its main for as long as they'd existed (fixed in TLDR#156, which adds the workflow).

The rule

packs/basics/conformance-workflow.mjs — a member should have a workflow running check_the_world on every pull request, unfiltered.

Advisory, deliberately. Shipping it blocking would turn every member lacking the workflow red on its very next baselining — which is exactly the #555 failure mode this rule exists to make less likely: a required thing added to the canon with no path for consumers to comply first. It becomes blocking once the fleet carries the workflow, and the promotion is a one-line change with the reasoning recorded in the file.

Relevance-first on the vendored mount, so it is inert in any non-member. A repo with no pull_request workflow is deliberately not flagged — that is #588's coherent shape, not a defect.

Verification

Full CI test set 1029 pass / 0 fail; check_the_world 0 blocking, 9 advisory (all pre-existing file-placement). Ten see-it-fail cases, including the exact TLDR shape, and verified firing against the real TLDR tree before the fix and silent after it. packs/README.md corpus tally updated 66 → 67 in the same change, as its guard requires.

Refs #592


Generated by Claude Code

claude added 2 commits July 30, 2026 22:28
Two repo settings decide whether a member's baselining can deliver at all,
and converging them alongside the sheepdog freshness sweep would be the
natural home — a sweep keeps them true where adoption only sets them once.
It is blocked on credential scope: FLEET_GITHUB_TOKEN is not an admin
token, and both endpoints require admin on the member.

Recorded in docs/future-directions.md rather than the sheepdog pack's
RULES.md. RULES.md is injected into every session that declares the pack,
so it is the wrong place for an idea nobody can act on — a deferred
direction should cost no context. The new file is documentation only, and
carries no link from any vendored pack file (a pack reaching into the
canon's docs/ would dangle in every consumer).

Refs #590

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ECifRRammkF9uD7zdEGFpb
auto-merge is a queue for CHECKS, so three CI shapes exist and only one
of them silently fails:

  no pull_request workflow  -> baselining merges directly (#588). Coherent.
  an UNFILTERED sweep       -> runs, auto-merge lands on green. Correct.
  a PATH-FILTERED sweep     -> the arm succeeds and no check ever runs.

The third is invisible: the repo looks like it has CI, hasPrCi is true,
the arm reports success, and the maintenance PR simply never lands. TLDR
sat in it — all three of its test workflows filter to the product tree, so
a mount-only diff matched nothing, and the same filters had hidden two
blocking claudinite-isolation findings on its main.

ADVISORY on purpose. Shipping it blocking would red every member lacking
the workflow on its very next baselining — which is precisely the #555
failure this rule exists to make less likely. It becomes blocking once the
fleet carries the workflow; the promotion is a one-line change.

Relevance-first on the vendored mount, so it is inert in any non-member.
A repo with no pull_request workflow at all is deliberately not flagged.

Refs #592

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ECifRRammkF9uD7zdEGFpb
@missingbulb
missingbulb merged commit 8b01f9b into main Jul 30, 2026
1 check passed
@missingbulb
missingbulb deleted the claude/per-repo-baselining-d9v18j branch July 30, 2026 22:54
missingbulb added a commit that referenced this pull request Jul 31, 2026
Four lessons from the 2026-07-30 window (#594, #591, #583, #586, #578, #581),
captured on the home's own local pack.

One converts to a check:

- `pack-discovery-entry-await` (blocking, `.claudinite/local/packs/claudinite/`)
  — pack discovery imports every `packs/<name>/pack.mjs` and every
  `<pack>/skills/<skill>/checks.mjs` on disk *before* activation is consulted, so
  a module in that graph that is also a CLI entry point is re-imported while
  still evaluating; a top-level `await` in its entry block then never settles and
  Node exits 13 having run nothing. That is #581 verbatim, and its fail-soft
  caller made it silent in every repo. The rule walks the static import graph
  from the real manifests, judges only the entry block (comments and string
  bodies blanked first), and stays quiet on the seven CLI workers that
  legitimately await at top level because none is in that graph. Red-first: with
  `run()` neutered the two violating fixtures fail and the five guards stay green.

Three stay prose in that pack's `RULES.md` — none has a false-positive-free
static signature:

- green canon CI is not evidence about a consumer (#592's four same-day cases);
  name the consumer-side evidence in the PR instead.
- a pack's `RULES.md` is injected into every declaring session, so an idea nobody
  can act on belongs in `docs/` — and a pack file may not link there, since
  `docs/` is outside the vendor set (#591, the #424 class).
- pick a scheduled task's cadence from how often its signal actually moves; a
  `sharedMount` precondition fires nearly every night on a member (#583).

`packs/README.md`'s derived corpus tally moves 67 → 68, as
`packs-tests/catalog-tally.test.mjs` requires of any rule added anywhere.

Full suite `node --test $(git ls-files '*.test.mjs')` → 1029 pass, 0 fail.
`check_the_world` → 0 blocking, 9 advisory (all pre-existing `file-placement`).

Refs #599

Co-authored-by: Claude <noreply@anthropic.com>
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