Skip to content
Merged
Show file tree
Hide file tree
Changes from 30 commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
26df343
build: pin rust 1.95.0 toolchain, bump rust-version to 1.95
jdalton Jul 11, 2026
a7d0274
perf(pm): mark rare branches in hot install loops with cold_path()
jdalton Jul 11, 2026
aa4033e
build: switch toolchain pin to nightly-2026-07-04 (7-day soak)
jdalton Jul 11, 2026
1012a75
build: enable cargo min-publish-age with a 7-day soak
jdalton Jul 11, 2026
9cbc841
build: add 7-day soak manager, taze, pinned external tools
jdalton Jul 11, 2026
5356b7e
ci: gate soak + tool pins, route installs through socket firewall, ad…
jdalton Jul 11, 2026
53a3693
fix(soak): make update-deps dry-run actually dry
jdalton Jul 11, 2026
4629aba
fix(soak): timeout stalled external-tool downloads
jdalton Jul 11, 2026
3c21801
fix(soak): harden gates and installer against review findings
jdalton Jul 11, 2026
7e422e3
build: manage .dockerignore with untracked, gate docker prebake pins
jdalton Jul 11, 2026
3ddcef3
ci: zizmor hygiene across all workflows
jdalton Jul 11, 2026
05f8e44
build: pin pnpm 11.8 + npm 12 via the tool rack, dogfood dep installs
jdalton Jul 11, 2026
d947ec8
fix(soak): shim self-clobber, windows .exe resolve, date guards; add …
jdalton Jul 11, 2026
4132147
refactor(soak): perfectionist pass — dead code out, tests isolated, d…
jdalton Jul 11, 2026
0a91e90
feat(soak): enforce the toolchain nightly soak, add the soak skill
jdalton Jul 11, 2026
2802a6f
docs(soak): align skill with claude prompting and skill-authoring gui…
jdalton Jul 11, 2026
32e4b72
test(soak): cover cli paths, fixers, download token gating, installer…
jdalton Jul 11, 2026
0ab0e05
refactor(soak): dedupe the rust-toolchain.toml path, complete the hea…
jdalton Jul 11, 2026
5a726cb
fix(ci): fixture anchor, zizmor scope, docker whitelist, sfw cargo by…
jdalton Jul 11, 2026
0bf3643
fix(soak): anchor the pnpm soak in tools/ — a root workspace yaml red…
jdalton Jul 12, 2026
5b3524e
fix(ci): reachable rust-toolchain pin, windows-safe tar extraction
jdalton Jul 12, 2026
eddffbe
ci: exact version comments on docker action hash pins (ref-version-mi…
jdalton Jul 12, 2026
872c0a0
fix(soak): use System32 bsdtar on windows — Git Bash's GNU tar can't …
jdalton Jul 12, 2026
c000bb5
fix(soak): windows handles forward to the rack — symlinks strand SEA …
jdalton Jul 12, 2026
744f1ba
fix(deps): strip .exe from win32 tool handle base name
jdalton Jul 12, 2026
49610a3
chore: encode PR home + push fork as a checked remote map
jdalton Jul 12, 2026
ff97dbf
fix(deps): close the renovate soak bypass — explicit minimumReleaseAg…
jdalton Jul 12, 2026
9313b63
fix: portable awk comment in commit-msg hook — C-style broke BSD awk
jdalton Jul 12, 2026
ca90946
test: pin commit-msg hook behavior — clean stderr, trailer strip, bla…
jdalton Jul 12, 2026
003447a
fix(soak): match .exe on windows tool-install early-exit
jdalton Jul 13, 2026
493195f
Merge remote-tracking branch 'origin/main' into pr442-merge
colinhacks Jul 24, 2026
41a0097
Merge remote-tracking branch 'origin/main' into pr442-merge
colinhacks Jul 24, 2026
426042a
build: drop the repo-root nightly pin, soak cargo at update time
colinhacks Jul 24, 2026
b59bba1
ci: clear zizmor workflow-hygiene findings
colinhacks Jul 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .cargo/config.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# Supply-chain soak for cargo's own dependency resolution — the same
# soak-window rule the PM applies to npm deps via minimumReleaseAge:
# crate versions younger than the window are pubtime-incompatible and
# the resolver skips them unless already in Cargo.lock
# (resolver.incompatible-publish-age defaults to "deny"). The unstable
# feature is active because rust-toolchain.toml pins a nightly.
[unstable]
min-publish-age = true

[registry]
global-min-publish-age = "7 days"
3 changes: 2 additions & 1 deletion .claude/skills/aube-sync/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,8 @@ Because the invariant held (`nub-fork` tip tree == `vendor/aube` before the merg
```sh
rm -rf /tmp/merged && mkdir -p /tmp/merged
git archive <merge-commit-sha> | tar -x -C /tmp/merged
rsync -a --delete /tmp/merged/ <nub-worktree>/vendor/aube/
# Guard: an empty /tmp/merged (failed archive) + --delete would EMPTY vendor/aube.
test -n "$(ls -A /tmp/merged)" && rsync -a --delete /tmp/merged/ <nub-worktree>/vendor/aube/
git -C <nub-worktree> add vendor/aube
git -C <nub-worktree> status --short vendor/aube # == the upstream delta filelist, nothing else
```
Expand Down
2 changes: 1 addition & 1 deletion .claude/skills/benchmarking/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ Benchmarking `nub install` against another PM; producing or refreshing the homep
```sh
# COLD: empty the tool's REAL cache + wipe node_modules before each run (untimed), then time the install.
hyperfine --warmup 0 --runs 5 \
--prepare 'rm -rf node_modules && rm -rf "$(bun pm cache)"' \
--prepare 'rm -rf node_modules && d="$(bun pm cache)" && rm -rf "${d:?}"' \
'bun install --ignore-scripts'

# WARM-RELINK: cache populated, wipe ONLY node_modules before each run.
Expand Down
86 changes: 86 additions & 0 deletions .claude/skills/soak/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
---
name: soak
description: Manages the repo's supply-chain soak window (SOAK_DAYS) — checks and fixes the derived surfaces, bumps or disables the window, adds dated per-package exclusions, and bumps pinned external tools. Use when a task touches minimumReleaseAge, min-release-age, min-publish-age, the nightly toolchain pin, external-tools.json, renovate.json, or taze cooldowns, or when investigating why a freshly published version won't install.
---

# The soak window

One rule: a release must be at least `SOAK_DAYS` old before this repo
adopts it. The delay gives the ecosystem time to catch a malicious or
yanked release before we ever install it. The window is defined exactly
once — read the current value from `scripts/soak/constants.mts` and never
hardcode it elsewhere. Every surface derives from or is parity-checked
against it:

| Surface | Key | Units |
|---|---|---|
| `.cargo/config.toml` | `global-min-publish-age` | `"N days"` |
| `rust-toolchain.toml` | nightly channel date vs `# adopted:` line | days |
| `tools/pnpm-workspace.yaml` | `minimumReleaseAge` | minutes |
| `.npmrc` | `min-release-age` | days |
| `tools/taze.config.mts` | `maturityPeriod` | imports `SOAK_DAYS` |
| `external-tools.json` | `soakBypass` annotations | days |
| `.github/renovate.json` | `minimumReleaseAge` (explicit — an `extends:` preset doesn't count) | `"N days"` |

## Commands (package.json scripts — the code lives in `scripts/soak/`)

- `pnpm run soak` — parity-check every surface (CI-gated in docs-links)
- `pnpm run soak:fix` — rewrite drifted windows, prune expired exclusions
- `pnpm run deps:update` — bump npm (taze) + cargo deps through the window
- `pnpm run tools:check` / `tools:install` — validate / install the
SRI-pinned external tools (`external-tools.json`)
- `pnpm run test:scripts` — the scripts' own unit tests

A soak change is done when `pnpm run soak` and `pnpm run test:scripts`
both exit 0 — the same gates CI runs. Re-run them after every fix.

## Change the window (one place)

1. Edit `SOAK_DAYS` in `scripts/soak/constants.mts`.
2. `pnpm run soak:fix` (rewrites cargo/npmrc/yaml; taze follows by import).
3. `pnpm run soak` + `pnpm run test:scripts` — existing exclusion
annotations encode the old window and will be flagged; re-date or
remove them, then re-run until both pass.

**Opt out entirely**: set `SOAK_DAYS = 0` and run the same two steps —
cargo, pnpm/nub (`minimumReleaseAge: 0`), npm, and taze all treat zero as
disabled. There is deliberately no env-var bypass: opting out is a
committed, reviewable change, never a silent one.

## Skip the soak for ONE package (dated, temporary)

Add to `minimumReleaseAgeExclude` in `tools/pnpm-workspace.yaml` with the
annotation on the line above (block list only — flow `[..]` is rejected
because a comment line can't attach to an inline entry):

```yaml
# published: 2026-07-08 | removable: 2026-07-15
- 'name@1.2.3'
```

`removable` = `published + SOAK_DAYS` (this example assumes a 7-day
window). `published` must be the real registry publish date. Once
`removable` passes, `pnpm run soak` fails until the pin is pruned
(`soak:fix` does it). Bare names / `@scope/*` globs are standing trust and
need no annotation. External tools use the same shape via a `soakBypass`
object in `external-tools.json`.

## Bump the nightly toolchain

Pick the newest nightly at least `SOAK_DAYS` old **today**, set it as
`channel`, and update the `# adopted: <today>` line in
`rust-toolchain.toml` — `pnpm run soak` enforces the arithmetic.

## Maintaining this skill

`scripts/soak/` is the law; this file only documents it — when they
disagree, fix this file. When editing, follow Anthropic's guidance:

- [Prompting best practices](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices)
- [Prompting Claude Fable 5](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-fable-5)
- [Skill authoring best practices](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/best-practices)
- [Write an effective CLAUDE.md](https://code.claude.com/docs/en/best-practices#write-an-effective-claude-md)

Keep it concise (goal + constraints, not step enumeration), keep the
description in third person with explicit "use when" triggers, and keep
the window value in `constants.mts` rather than restating it here.
Loading