Skip to content

Commit 927ef97

Browse files
authored
feat(sisters): add Dependabot config-coverage check (#25)
New check 11 verifies each sister's .github/dependabot.yml covers its shipped manifests (uv/npm/cargo/docker/github-actions), recognizing documented deferrals and skipping templates/ + tools/ noise (mirrors check 7's primary-manifest scope). Also refreshes the check-list summaries in docs/skills/sisters.md + docs/examples.md, which had fallen behind checks 8-10 (branch protection, codecov, log-retention).
1 parent 1854945 commit 927ef97

4 files changed

Lines changed: 63 additions & 8 deletions

File tree

ROADMAP.md

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -83,11 +83,6 @@ wild.
8383
toggle; Dependabot keeps SHA pins fresh once adopted.
8484
research(2026-05): github.blog/changelog/2025-08-15 (policy enforcement
8585
+ immutable releases).
86-
- **Dependabot config drift check in `/techne:sisters`** — compare each
87-
sister's `.github/dependabot.yml` against
88-
`templates/dependabot.yml.example`: ecosystem coverage vs detected
89-
manifests, plus schedule/group shape. Closes the gap where the
90-
template exists but nothing enforces sisters tracking it.
9186
- **Renovate revisit trigger** — if the fleet consolidates into a
9287
monorepo or wants cross-repo shared presets + auto-merge, re-evaluate
9388
Renovate (shared `extends` preset). Also re-enable the `uv` ecosystem
@@ -123,6 +118,13 @@ wild.
123118

124119
One-liner per item, newest first. Detail moves to git history when work lands.
125120

121+
- 2026-05-25 — **Sisters audit: Dependabot config coverage (check 11)**
122+
`/techne:sisters` now verifies each sister's `.github/dependabot.yml`
123+
covers its shipped manifests (uv/npm/cargo/docker/github-actions),
124+
recognizing documented deferrals and skipping `templates/` + `tools/`
125+
noise (mirrors check 7's primary-manifest scope). Also refreshed the
126+
stale check-list summaries in `docs/skills/sisters.md` +
127+
`docs/examples.md` (they'd fallen behind checks 8–10)
126128
- 2026-05-25 — **Dependabot fleet rollout** — canonical
127129
`templates/dependabot.yml.example` + techne's own
128130
`.github/dependabot.yml` (uv + github-actions), rolled out per-ecosystem

docs/examples.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ You maintain a few related repos and want to make sure their CI pins, toolchain
88

99
1. Configure the linked repos in `~/.claude/techne.toml` (see [Configuration](configuration.md)).
1010
2. Run `/techne:sisters`.
11-
3. Read the drift report. It groups findings by category: action-pin drift, toolchain-pin drift, GitHub merge-setting drift, open PRs, stale branches, local `main` divergence.
11+
3. Read the drift report. It groups findings by category: action-pin drift, toolchain-pin drift, GitHub merge-setting + branch-protection drift, Codecov config, log-retention, Dependabot coverage, open PRs, stale branches, local `main` divergence.
1212
4. Apply fixes in each repo. Re-run `/techne:sisters` to confirm the drift is gone.
1313

1414
The skill is read-only; you commit the fixes manually.

docs/skills/sisters.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# `techne:sisters`
22

3-
Cross-repo drift audit across the sister repos listed in `~/.claude/techne.toml`. Read-only inspection: CI action pins, toolchain pins in `pyproject.toml`, skill-context structural parity, GitHub merge settings, open PRs, and branch hygiene.
3+
Cross-repo drift audit across the sister repos listed in `~/.claude/techne.toml`. Read-only inspection: CI action pins, toolchain pins in `pyproject.toml`, skill-context structural parity, GitHub merge settings + branch protection, Codecov config, `make clean` log-retention, Dependabot config coverage, open PRs, and branch hygiene.
44

55
## When to use
66

@@ -16,7 +16,7 @@ Invoke by name in Claude Code:
1616
/techne:sisters
1717
```
1818

19-
The skill reads the active sister list from `~/.claude/techne.toml`, runs all checks in parallel, and outputs a single audit block grouped by category: merge settings, skill-context parity, action-pin drift, toolchain-pin drift, open PRs, stale branches, and local main sync.
19+
The skill reads the active sister list from `~/.claude/techne.toml`, runs all checks in parallel, and outputs a single audit block grouped by category: merge settings, skill-context parity, action-pin drift, toolchain-pin drift, branch protection, Codecov config, log-retention policy, Dependabot coverage, open PRs, stale branches, and local main sync.
2020

2121
The skill is read-only. It surfaces findings; it does not edit files, push branches, or change GitHub settings.
2222

plugins/techne/skills/sisters/SKILL.md

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,55 @@ Report:
257257
- Any sister whose threshold differs from 30 days (the canonical pin) — flag the value and ask whether to converge.
258258
- Sisters with no `logs/` dir are silently skipped — this is a conditional check.
259259

260+
### 11. Dependabot config coverage
261+
262+
Every sister should carry `.github/dependabot.yml` covering each dependency surface it actually ships. The canonical config + per-ecosystem guidance live in `templates/dependabot.yml.example`. This check maps detected manifests to expected `package-ecosystem` entries and flags gaps — except where the config documents a deliberate deferral.
263+
264+
Scope mirrors check 7: inspect primary manifests only. Skip `templates/` (scaffolding emitted to generated projects) and `tools/` (dev experiments) — those aren't the repo's shipped dependency surface and only generate noise. `uv` is the canonical Python ecosystem (GA 2025-03-13); `pip` still provides coverage but should be migrated. Docker maps from a literal `Dockerfile` only — Dependabot doesn't auto-detect `*.Dockerfile` custom names (dependabot/feedback#145), so a repo using that convention legitimately omits docker.
265+
266+
```
267+
for repo in $SISTERS; do
268+
cfg="$WORKSPACE/$repo/.github/dependabot.yml"
269+
[ -f "$cfg" ] || cfg="$WORKSPACE/$repo/.github/dependabot.yaml"
270+
if [ ! -f "$cfg" ]; then
271+
echo "$repo: NO .github/dependabot.yml -> add one (template: templates/dependabot.yml.example)"
272+
continue
273+
fi
274+
declared=$(grep -oE "package-ecosystem:[[:space:]]*['\"]?[a-z-]+" "$cfg" \
275+
| grep -oE '[a-z-]+$' | sort -u | tr '\n' ' ')
276+
manifests=$(git -C "$WORKSPACE/$repo" ls-files 2>/dev/null | grep -vE '(^|/)(templates|tools)/')
277+
expected=""
278+
echo "$manifests" | grep -qE '(^|/)(pyproject\.toml|uv\.lock)$' && expected="$expected uv"
279+
echo "$manifests" | grep -qE '(^|/)package\.json$' && expected="$expected npm"
280+
echo "$manifests" | grep -qE '(^|/)Cargo\.toml$' && expected="$expected cargo"
281+
echo "$manifests" | grep -qE '(^|/)Dockerfile$' && expected="$expected docker"
282+
expected="$expected github-actions"
283+
missing=""
284+
for eco in $expected; do
285+
if [ "$eco" = uv ]; then
286+
echo " $declared " | grep -qE ' (uv|pip) ' && continue
287+
else
288+
echo " $declared " | grep -q " $eco " && continue
289+
fi
290+
# documented deferral: an in-config comment naming the ecosystem + defer/skip
291+
grep -iE '^[[:space:]]*#' "$cfg" | grep -i "$eco" | grep -qiE 'defer|skip' && continue
292+
missing="$missing $eco"
293+
done
294+
if [ -n "$missing" ]; then
295+
echo "$repo: missing ecosystem(s) for present manifests:$missing | declared: $declared"
296+
else
297+
echo "$repo: coverage OK | declared: $declared"
298+
fi
299+
done
300+
```
301+
302+
Report:
303+
304+
- Any sister with no `.github/dependabot.yml`.
305+
- Any sister with a shipped manifest (`pyproject.toml`/`uv.lock`, `package.json`, `Cargo.toml`, literal `Dockerfile`) but no matching `package-ecosystem` entry and no documented deferral.
306+
- Any sister still on the `pip` ecosystem — flag for migration to native `uv`.
307+
- Deferrals (e.g., kourai's `uv` pending dependabot-core#14004) are recognized via an in-config comment naming the ecosystem + "defer"/"skip", so they don't false-positive.
308+
260309
## Output format
261310

262311
A single block, no preamble (concrete repo names below are illustrative — substitute the actual entries from `$SISTERS`):
@@ -308,6 +357,10 @@ A single block, no preamble (concrete repo names below are illustrative — subs
308357
- repo-b: no logs/ dir — skip
309358
- repo-c: logs/ present, no age-based prune → add 30-day prune to clean
310359
360+
### Dependabot coverage
361+
- All sisters: dependabot.yml covers every shipped manifest (deferrals documented) ✓
362+
(or list drift: "repo-c: has package.json but no npm ecosystem → add it")
363+
311364
### Verdict
312365
313366
<"N drift items to address." | "All sisters coherent.">

0 commit comments

Comments
 (0)