@sebastienrousseau/dotfiles 0.2.508 → 0.2.511

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/README.md +5 -5
  3. package/docs/COPYRIGHT +1 -1
  4. package/docs/GOVERNANCE.md +2 -2
  5. package/docs/adr/ADR-011-nushell-tier3-keep.md +2 -2
  6. package/docs/articles/.pages +6 -0
  7. package/docs/articles/2026-07-05-custom-mkdocs-material-dark-theme.md +216 -0
  8. package/docs/articles/2026-07-05-fish-startup-abbr.md +153 -0
  9. package/docs/articles/2026-07-05-master-to-main-rename-runbook.md +128 -0
  10. package/docs/articles/index.md +36 -0
  11. package/docs/guides/INSTALL.md +3 -3
  12. package/docs/index.md +116 -27
  13. package/docs/interop/A2A.md +2 -2
  14. package/docs/interop/POWERSHELL.md +4 -4
  15. package/docs/manual/00-introduction.md +3 -3
  16. package/docs/manual/01-concepts/02-trust-model.md +3 -3
  17. package/docs/manual/01-concepts/04-fleet.md +1 -1
  18. package/docs/manual/02-tutorials/01-first-install.md +1 -1
  19. package/docs/manual/02-tutorials/05-deploy-fleet.md +2 -2
  20. package/docs/manual/03-reference/02-config-files.md +1 -1
  21. package/docs/manual/03-reference/04-templates.md +1 -1
  22. package/docs/manual/04-cookbook/01-recipes.md +1 -1
  23. package/docs/manual/04-cookbook/02-troubleshooting.md +1 -1
  24. package/docs/manual/05-appendices/B-security-checklist.md +1 -1
  25. package/docs/manual/command-index.md +76 -1
  26. package/docs/manual/index.md +1 -1
  27. package/docs/operations/ARCHITECTURE_ROADMAP.md +145 -0
  28. package/docs/operations/CI_CADENCE.md +2 -2
  29. package/docs/operations/COMPLETIONS.md +2 -2
  30. package/docs/operations/COVERAGE.md +4 -4
  31. package/docs/operations/DRIFT.md +1 -1
  32. package/docs/operations/MAINTENANCE.md +6 -6
  33. package/docs/operations/PERFORMANCE.md +6 -6
  34. package/docs/operations/RELIABILITY.md +1 -1
  35. package/docs/operations/ROADMAP_V0_2_503.md +1 -1
  36. package/docs/operations/TRACEABILITY.md +2 -0
  37. package/docs/operations/TRUSTED_AGENT_WORKSTATION.md +6 -6
  38. package/docs/operations/VERSION_SYNC.md +3 -3
  39. package/docs/reference/UTILS.md +82 -0
  40. package/docs/security/AUDIT_BYPASS.md +3 -3
  41. package/docs/security/AUTOMATION_SECRETS.md +1 -1
  42. package/docs/security/CI_PINNING.md +10 -10
  43. package/docs/security/COMMIT_SIGNING.md +10 -10
  44. package/docs/security/DEPS_DEV_EXCEPTIONS.md +4 -4
  45. package/docs/security/DISCLOSURE.md +3 -3
  46. package/docs/security/INCIDENT_RESPONSE.md +1 -1
  47. package/docs/security/INSTALL_VERIFICATION.md +2 -2
  48. package/docs/security/MCP_POLICY.md +4 -4
  49. package/docs/security/SCORECARD.md +7 -7
  50. package/docs/security/SECURITY_CHECKLIST.md +1 -1
  51. package/docs/security/SHELL_EXEMPTIONS.md +2 -2
  52. package/docs/security/SOUP_REGISTER.md +4 -4
  53. package/docs/stylesheets/extra.css +444 -0
  54. package/docs/themes/hero-shot.svg +1 -1
  55. package/install.sh +17 -6
  56. package/package.json +1 -1
  57. package/scripts/ci/check-copyright-headers.sh +1 -1
  58. package/scripts/ci/check-shell-preamble.sh +1 -1
  59. package/scripts/ci/guard-gitleaks-checkout.sh +1 -1
  60. package/scripts/diagnostics/aliases-manifest.sh +19 -1
  61. package/scripts/diagnostics/verify_state.sh +6 -2
  62. package/scripts/diagnostics/version-locks.sh +10 -6
  63. package/scripts/dot/commands/agent.sh +12 -7
  64. package/scripts/dot/commands/ai.sh +8 -5
  65. package/scripts/dot/commands/appearance.sh +14 -1
  66. package/scripts/dot/commands/completion.sh +134 -0
  67. package/scripts/dot/commands/core.sh +8 -0
  68. package/scripts/dot/commands/diagnostics.sh +16 -0
  69. package/scripts/dot/commands/fleet.sh +11 -4
  70. package/scripts/dot/commands/lint.sh +55 -30
  71. package/scripts/dot/commands/registry.sh +7 -1
  72. package/scripts/dot/commands/secrets.sh +61 -7
  73. package/scripts/dot/commands/security.sh +8 -0
  74. package/scripts/dot/commands/tools.sh +11 -2
  75. package/scripts/dot/powershell/Dot.psm1 +1 -1
  76. package/scripts/git-hooks/pre-commit-audit.sh +1 -1
  77. package/scripts/ops/heal-tools.sh +28 -0
  78. package/scripts/ops/teleport.sh +2 -2
  79. package/scripts/qa/examples-coverage.sh +94 -0
  80. package/scripts/tools/detect-collisions.py +19 -1
  81. package/scripts/version-sync.sh +36 -2
  82. package/docs/_config.yml +0 -59
@@ -5,7 +5,7 @@ render_with_liquid: false
5
5
  # Pre-Push Audit Bypass
6
6
 
7
7
  This page documents when the pre-push reliability audit can be bypassed,
8
- how to do it, and why the answer is "almost never on `master`."
8
+ how to do it, and why the answer is "almost never on `main`."
9
9
 
10
10
  ## Background
11
11
 
@@ -57,7 +57,7 @@ bypassed?" without git archaeology.
57
57
 
58
58
  Short list — anything outside this is suspicious:
59
59
 
60
- - **Hotfix push to a non-master branch** when CI infrastructure itself
60
+ - **Hotfix push to a non-main branch** when CI infrastructure itself
61
61
  is the audit blocker (e.g., the audit pre-flight depends on a remote
62
62
  service that's down). The fix should land *before* the
63
63
  infrastructure recovers; bypass is the bridge.
@@ -66,7 +66,7 @@ Short list — anything outside this is suspicious:
66
66
 
67
67
  When bypass is **not** legitimate:
68
68
 
69
- - Routine `master` pushes. The whole point of the audit is to guard
69
+ - Routine `main` pushes. The whole point of the audit is to guard
70
70
  the protected branch.
71
71
  - Pushes whose audit failure is "annoying" — the right move is to fix
72
72
  the failure, not skip the check.
@@ -21,6 +21,6 @@ render_with_liquid: false
21
21
  ## Provisioning notes
22
22
 
23
23
  1. Store the SSH signing private key in GitHub Actions as `ACTIONS_BOT_SIGNING_KEY`.
24
- 2. Store the matching public key in [allowed_signers](../../defaults/dot_config/git/allowed_signers.tmpl).
24
+ 2. Store the matching public key in [allowed_signers](https://github.com/sebastienrousseau/dotfiles/blob/main/defaults/dot_config/git/allowed_signers.tmpl).
25
25
  3. Rotate the key on personnel or workstation change.
26
26
  4. Fail closed when secrets are absent.
@@ -17,7 +17,7 @@ Every external dependency the CI pipeline consumes must be pinned by
17
17
  When `ci.yml` calls a reusable via `./.github/workflows/reusable-X.yml`,
18
18
  GitHub resolves the reusable from the **same ref as the calling
19
19
  workflow at run time**. For an in-repo PR that's the PR's branch —
20
- fine. The risk is the inverse: a malicious push to `master` (or any
20
+ fine. The risk is the inverse: a malicious push to `main` (or any
21
21
  ref the calling workflow might resolve from) can swap reusable
22
22
  content under a CI run, with no audit trail in the PR diff.
23
23
 
@@ -29,11 +29,11 @@ site — visible in the PR diff, reviewable, revertible.
29
29
 
30
30
  ```yaml
31
31
  # Acceptable — full SHA pin.
32
- uses: sebastienrousseau/dotfiles/.github/workflows/reusable-shell-lint.yml@b0615f8fb5c0f3826f58904a5567eff11b6c500e # master
32
+ uses: sebastienrousseau/dotfiles/.github/workflows/reusable-shell-lint.yml@b0615f8fb5c0f3826f58904a5567eff11b6c500e # main
33
33
  ```
34
34
 
35
35
  The trailing comment is a human-readable hint at what the SHA
36
- represented when it was pinned (typically `master`, sometimes a tag
36
+ represented when it was pinned (typically `main`, sometimes a tag
37
37
  like `v0.2.501`). The hint is documentation only — the SHA is what
38
38
  GitHub uses.
39
39
 
@@ -44,7 +44,7 @@ GitHub uses.
44
44
  uses: ./.github/workflows/reusable-shell-lint.yml
45
45
 
46
46
  # Rejected — branch ref is mutable.
47
- uses: sebastienrousseau/dotfiles/.github/workflows/reusable-shell-lint.yml@master
47
+ uses: sebastienrousseau/dotfiles/.github/workflows/reusable-shell-lint.yml@main
48
48
 
49
49
  # Rejected — tag ref is mutable (tags can be moved).
50
50
  uses: sebastienrousseau/dotfiles/.github/workflows/reusable-shell-lint.yml@v0.2.501
@@ -57,20 +57,20 @@ rejected forms above.
57
57
  ## Refreshing pinned SHAs
58
58
 
59
59
  `bump-reusable-pins.yml` handles this automatically. On every push to
60
- `master` that touches `.github/workflows/reusable-*.yml`, the bot scans
60
+ `main` that touches `.github/workflows/reusable-*.yml`, the bot scans
61
61
  caller workflows for stale pins and opens a PR bumping them to the new
62
62
  SHA. Signed with `ACTIONS_BOT_SIGNING_KEY` so the resulting commit
63
63
  passes `Verify Commit Signatures`.
64
64
 
65
65
  The manual recipe below stays here as a fallback — for example, if you
66
- need to bump pins before a merge to master, or if the bot's run failed
66
+ need to bump pins before a merge to main, or if the bot's run failed
67
67
  and you want to short-circuit waiting for the next push trigger.
68
68
 
69
69
  ```sh
70
- # 1. Land the change to the reusable on master via a PR.
71
- # 2. After merge, capture the new master SHA:
72
- git fetch origin master
73
- PIN=$(git rev-parse origin/master)
70
+ # 1. Land the change to the reusable on main via a PR.
71
+ # 2. After merge, capture the new main SHA:
72
+ git fetch origin main
73
+ PIN=$(git rev-parse origin/main)
74
74
  echo "$PIN"
75
75
 
76
76
  # 3. Bump every call site:
@@ -1,6 +1,6 @@
1
1
  # Commit Signing — Policy & Setup
2
2
 
3
- Every commit that reaches `master` in this repository must carry a
3
+ Every commit that reaches `main` in this repository must carry a
4
4
  cryptographic signature that GitHub can verify. The policy is enforced
5
5
  in three independent layers, so a single bypass does not break the
6
6
  chain. This document explains the policy, walks through SSH and GPG
@@ -24,16 +24,16 @@ is missing. The chain below removes every escape hatch.
24
24
  `git verify-commit` against every commit in the push range. A
25
25
  single unverified commit aborts the push. `--no-verify` skips
26
26
  this layer; the next two catch it.
27
- 3. **GitHub Rulesets** — `.github/rulesets/master.json` declares
28
- `required_signatures` on `refs/heads/master`. The rule is part
27
+ 3. **GitHub Rulesets** — `.github/rulesets/main.json` declares
28
+ `required_signatures` on `refs/heads/main`. The rule is part
29
29
  of the repo so it's reproducible across forks. Apply with
30
- `gh ruleset import .github/rulesets/master.json`.
30
+ `gh ruleset import .github/rulesets/main.json`.
31
31
  4. **`compliance-guard.yml` workflow** — runs on every PR targeting
32
- `master`. Walks the commit range with `git verify-commit` and
32
+ `main`. Walks the commit range with `git verify-commit` and
33
33
  marks unsigned commits in the PR summary; fails the workflow
34
34
  when `unsigned_count > 0`.
35
35
 
36
- A merge to `master` therefore requires (Ruleset accepts the push) AND
36
+ A merge to `main` therefore requires (Ruleset accepts the push) AND
37
37
  (the workflow's signed-commit check passes) AND (the maintainer's
38
38
  push key is allowed). The protection holds even if a contributor's
39
39
  local hooks are missing or skipped.
@@ -100,7 +100,7 @@ git log "$(git merge-base @{u} HEAD)..HEAD" \
100
100
  for c in $(git rev-list "$(git merge-base @{u} HEAD)..HEAD"); do
101
101
  git verify-commit "$c" >/dev/null 2>&1 \
102
102
  && echo "✓ $c" \
103
- || echo "✗ $c — unsigned, will be rejected by master ruleset"
103
+ || echo "✗ $c — unsigned, will be rejected by main ruleset"
104
104
  done
105
105
  ```
106
106
 
@@ -112,7 +112,7 @@ done
112
112
  | `error: Load key "/.../id_ed25519": Permission denied` | SSH key permissions too open | `chmod 600 ~/.ssh/id_ed25519` |
113
113
  | GitHub shows "Unverified" on a commit signed locally | Signing key not uploaded to GitHub | `gh ssh-key add … --type signing` (SSH) or `gh gpg-key add` (GPG) |
114
114
  | Pre-push hook rejects a merge commit you didn't author | Upstream commit lacks a signature | Either pull the rebased branch, or fast-forward instead of merging |
115
- | Ruleset import via `gh` complains "invalid JSON" | Rulesets API expects the `target` + `rules` envelope, not just the rules array | Use the file as-is — `gh ruleset import .github/rulesets/master.json` |
115
+ | Ruleset import via `gh` complains "invalid JSON" | Rulesets API expects the `target` + `rules` envelope, not just the rules array | Use the file as-is — `gh ruleset import .github/rulesets/main.json` |
116
116
 
117
117
  ## Re-applying the ruleset after a manual edit
118
118
 
@@ -121,14 +121,14 @@ file-of-truth wins. Re-apply:
121
121
 
122
122
  ```sh
123
123
  gh api -X POST repos/{owner}/{repo}/rulesets \
124
- --input .github/rulesets/master.json
124
+ --input .github/rulesets/main.json
125
125
  ```
126
126
 
127
127
  (or `-X PUT` against the existing ruleset's ID if it already exists).
128
128
 
129
129
  ## References
130
130
 
131
- - `.github/rulesets/master.json` — the enforced policy.
131
+ - `.github/rulesets/main.json` — the enforced policy.
132
132
  - `.github/workflows/compliance-guard.yml` — the workflow that
133
133
  fails PRs containing unsigned commits.
134
134
  - `scripts/git-hooks/pre-push` — the local pre-push gate.
@@ -7,7 +7,7 @@ render_with_liquid: false
7
7
  The CI workflow `.github/workflows/deps-dev-validation.yml` scans
8
8
  direct dependencies (npm + PyPI + GitHub Actions) against the
9
9
  [deps.dev Insights API](https://docs.deps.dev/) on every PR, every
10
- push to `master`, and every Tuesday at 04:00 UTC. When an advisory
10
+ push to `main`, and every Tuesday at 04:00 UTC. When an advisory
11
11
  is reported at or above the threshold (default `HIGH`), the workflow
12
12
  fails.
13
13
 
@@ -79,8 +79,8 @@ auto-fail the gate even when they're still listed here.
79
79
 
80
80
  ## References
81
81
 
82
- - [`tools/ci/check-deps-dev.sh`](../../tools/ci/check-deps-dev.sh) — the scanner.
83
- - [`.github/workflows/deps-dev-validation.yml`](../../.github/workflows/deps-dev-validation.yml) — CI wiring.
84
- - [`tests/unit/security/test_check_deps_dev.sh`](../../tests/unit/security/test_check_deps_dev.sh) — contract test against canned fixtures.
82
+ - [`tools/ci/check-deps-dev.sh`](https://github.com/sebastienrousseau/dotfiles/blob/main/tools/ci/check-deps-dev.sh) — the scanner.
83
+ - [`.github/workflows/deps-dev-validation.yml`](https://github.com/sebastienrousseau/dotfiles/blob/main/.github/workflows/deps-dev-validation.yml) — CI wiring.
84
+ - [`tests/unit/security/test_check_deps_dev.sh`](https://github.com/sebastienrousseau/dotfiles/blob/main/tests/unit/security/test_check_deps_dev.sh) — contract test against canned fixtures.
85
85
  - [deps.dev API reference](https://docs.deps.dev/api/v3/).
86
86
  - Issue [#877](https://github.com/sebastienrousseau/dotfiles/issues/877).
@@ -34,7 +34,7 @@ gpg --fingerprint security@sebastienrousseau.com
34
34
  ```
35
35
 
36
36
  The fingerprint must match the one published in
37
- [`.github/SECURITY.md`](../../.github/SECURITY.md). Cross-verify
37
+ [`.github/SECURITY.md`](https://github.com/sebastienrousseau/dotfiles/blob/main/.github/SECURITY.md). Cross-verify
38
38
  against the SSH signing key in `dot_config/git/allowed_signers.tmpl`
39
39
  — the maintainer signs commits with the same identity, so both
40
40
  fingerprints derive from the same identity claim.
@@ -75,7 +75,7 @@ subjects in plain text).
75
75
  ## 5. Acknowledgement
76
76
 
77
77
  You should receive an acknowledgement within the SLA in
78
- [`.github/SECURITY.md`](../../.github/SECURITY.md):
78
+ [`.github/SECURITY.md`](https://github.com/sebastienrousseau/dotfiles/blob/main/.github/SECURITY.md):
79
79
 
80
80
  | Severity | Initial response |
81
81
  |---|---|
@@ -122,7 +122,7 @@ The maintainer commits to:
122
122
 
123
123
  ## See also
124
124
 
125
- - [`.github/SECURITY.md`](../../.github/SECURITY.md) — policy
125
+ - [`.github/SECURITY.md`](https://github.com/sebastienrousseau/dotfiles/blob/main/.github/SECURITY.md) — policy
126
126
  overview + fingerprint.
127
127
  - [`docs/security/KEY_ROTATION.md`](KEY_ROTATION.md) — schedule for
128
128
  when the disclosure key is rotated.
@@ -113,7 +113,7 @@ lock-configs
113
113
  gh workflow disable <workflow-name>
114
114
 
115
115
  # Force-protect the main branch
116
- gh api repos/{owner}/{repo}/branches/master/protection \
116
+ gh api repos/{owner}/{repo}/branches/main/protection \
117
117
  --method PUT \
118
118
  --field required_status_checks='{"strict":true,"contexts":["ci"]}' \
119
119
  --field enforce_admins=true
@@ -56,7 +56,7 @@ These are weaker than a SHA256 check, but they catch the obvious
56
56
  After chezmoi is installed, `install.sh` clones the dotfiles repo
57
57
  itself. This isn't currently cryptographically verified beyond Git's
58
58
  own object integrity, but commits in the repo are SSH-signed and
59
- branch protection on `master` requires signed commits (see #853).
59
+ branch protection on `main` requires signed commits (see #853).
60
60
 
61
61
  ## How to obtain per-release hashes
62
62
 
@@ -64,7 +64,7 @@ The verified-install snippet uses the SHA256 of the `install.sh`
64
64
  file *as it exists at the release tag*. To regenerate after a release:
65
65
 
66
66
  ```bash
67
- git switch master
67
+ git switch main
68
68
  git pull
69
69
  NEW_TAG="v0.2.502" # adjust
70
70
  git tag -s "$NEW_TAG" -m "..."
@@ -21,9 +21,9 @@ Properties:
21
21
 
22
22
  ## Policy artifact
23
23
 
24
- The source of truth lives in [mcp-policy.json](../../defaults/dot_config/dotfiles/mcp-policy.json).
25
- Approved package pins live in [mcp-lock.json](../../defaults/dot_config/dotfiles/mcp-lock.json).
26
- Tracked server registry entries live in [mcp-registry.json](../../defaults/dot_config/dotfiles/mcp-registry.json).
24
+ The source of truth lives in [mcp-policy.json](https://github.com/sebastienrousseau/dotfiles/blob/main/defaults/dot_config/dotfiles/mcp-policy.json).
25
+ Approved package pins live in [mcp-lock.json](https://github.com/sebastienrousseau/dotfiles/blob/main/defaults/dot_config/dotfiles/mcp-lock.json).
26
+ Tracked server registry entries live in [mcp-registry.json](https://github.com/sebastienrousseau/dotfiles/blob/main/defaults/dot_config/dotfiles/mcp-registry.json).
27
27
 
28
28
  Current defaults:
29
29
 
@@ -75,4 +75,4 @@ Current approved refs:
75
75
  - active servers match the tracked registry entries
76
76
  - remote HTTP transports are HTTPS and OAuth-backed
77
77
 
78
- Policy bundle baselines live in [policy-bundles.json](../../defaults/dot_config/dotfiles/policy-bundles.json).
78
+ Policy bundle baselines live in [policy-bundles.json](https://github.com/sebastienrousseau/dotfiles/blob/main/defaults/dot_config/dotfiles/policy-bundles.json).
@@ -41,7 +41,7 @@ Aggregate score **7.6 / 10** at 2026-05-17T08:11:51Z.
41
41
  [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/sebastienrousseau/dotfiles/badge)](https://scorecard.dev/viewer/?uri=github.com/sebastienrousseau/dotfiles)
42
42
 
43
43
  The badge above is regenerated every Monday at 06:00 UTC and on every
44
- push to `master` by `.github/workflows/scorecard.yml`. The SARIF
44
+ push to `main` by `.github/workflows/scorecard.yml`. The SARIF
45
45
  result is uploaded to GitHub Code Scanning (Security tab) and
46
46
  retained as a 30-day workflow artifact.
47
47
 
@@ -57,7 +57,7 @@ Regressions are triaged within one Monday cycle: identify the check
57
57
  that dropped, either remediate or file an exception entry below with
58
58
  a rationale and an expiry date.
59
59
 
60
- ## Per-check posture (snapshot, master HEAD)
60
+ ## Per-check posture (snapshot, main HEAD)
61
61
 
62
62
  The checks below come from OpenSSF Scorecard's published rubric. Tick
63
63
  marks reflect this repo's posture at the time of writing — the
@@ -65,19 +65,19 @@ marks reflect this repo's posture at the time of writing — the
65
65
 
66
66
  | Check | Status | Notes |
67
67
  |---|---|---|
68
- | Branch-Protection | ⚠ | `master` requires signed commits, linear history, required checks (`.github/rulesets/master.json`). Scorecard can't read classic protection rules without a fine-grained PAT, so this check reports as `-1` ("internal error"). |
68
+ | Branch-Protection | ⚠ | `main` requires signed commits, linear history, required checks (`.github/rulesets/main.json`). Scorecard can't read classic protection rules without a fine-grained PAT, so this check reports as `-1` ("internal error"). |
69
69
  | Code-Review | ⚠ | Single-maintainer repo; PRs are self-merged after CI. Scorecard scores 0/30 here by design — see `Open findings` below. |
70
70
  | Signed-Commits | ✓ | Enforced by pre-push hook (`scripts/git-hooks/pre-push`) and at-push by branch protection (#853 + #857). |
71
71
  | Dependency-Update-Tool | ✓ | Dependabot configured for github-actions / npm / docker / devcontainers / uv. |
72
72
  | Fuzzing | ⚠ | `install.sh` fuzz harness lives under `tests/fuzz/` (closes #881), but it's shell-based and Scorecard's heuristic only recognizes OSS-Fuzz / ClusterFuzzLite / native Go fuzz / libFuzzer / Atheris. None support shell. Property tests under `tests/unit/functions/test_property_*.sh` cover the closest equivalent surface. |
73
73
  | License | ✓ | MIT at repo root (`LICENSE`). |
74
- | Maintained | ✓ | Active commit cadence; the [README](../../README.md) lists the current `dotfiles_version`. |
74
+ | Maintained | ✓ | Active commit cadence; the [README](https://github.com/sebastienrousseau/dotfiles/blob/main/README.md) lists the current `dotfiles_version`. |
75
75
  | Pinned-Dependencies | ⚠ | Closed 8 of 14 findings this cycle (every Dockerfile base + every workflow action + 2 `curl \| sh` installers + the `npm install -g npm` upgrade step). 5 residual findings stay open by design — see `Open findings`. |
76
76
  | SAST | ✓ | CodeQL (`.github/workflows/codeql.yml`) + Checkov + Grype. |
77
77
  | SBOM | ✓ | Generated per PR by `sbom-diff.yml` and per release by `security-release.yml`. |
78
78
  | Security-Policy | ✓ | `.github/SECURITY.md` + this page + `docs/security/THREAT_MODEL.md`. |
79
79
  | Token-Permissions | ✓ | Top-level `permissions:` blocks restricted to `contents: read`. `write` scopes scoped to the jobs that need them (#886). |
80
- | Vulnerabilities | ✓ | Grype gate hard-fails on `high` / `critical` on `master` (#852). |
80
+ | Vulnerabilities | ✓ | Grype gate hard-fails on `high` / `critical` on `main` (#852). |
81
81
  | Webhooks | n/a | No external webhooks configured. |
82
82
  | CI-Tests | ✓ | Linux + macOS Intel + Apple Silicon matrix; optional Windows. |
83
83
  | CII-Best-Practices | ☐ | Not applied yet — see `Open work` below. |
@@ -138,7 +138,7 @@ false positives in Scorecard's regex.
138
138
  - **Re-trigger Scorecard after SLSA backfill propagates** — expected `Signed-Releases` 3 → 10.
139
139
  - **`harden-runner` block-mode adoption (#878)** — should tighten the `Token-Permissions` check further.
140
140
  - **Investigate `License` 9/10 false-positive** — repo is MIT (SPDX-compliant), Scorecard's penalty should not apply.
141
- - **Investigate `Branch-Protection` `-1`** — scanner internal error; manually verify with `gh api repos/:owner/:repo/branches/master/protection` and document.
141
+ - **Investigate `Branch-Protection` `-1`** — scanner internal error; manually verify with `gh api repos/:owner/:repo/branches/main/protection` and document.
142
142
 
143
143
  ### Enabling Branch-Protection + Webhooks checks (one-time PAT setup)
144
144
 
@@ -180,7 +180,7 @@ gh api 'repos/sebastienrousseau/dotfiles/code-scanning/alerts?state=open&per_pag
180
180
  --jq '[.[].rule.id] | group_by(.) | map({rule: .[0], count: length})'
181
181
 
182
182
  # Trigger Scorecard manually:
183
- gh workflow run scorecard.yml --ref master
183
+ gh workflow run scorecard.yml --ref main
184
184
  ```
185
185
 
186
186
  If a new category appears, add a row to the matching bucket. If a
@@ -45,7 +45,7 @@ Run `dot mcp --strict --json` to validate all MCP server configurations and capt
45
45
  - [ ] **SBOM Generation**: Verify `dotfiles-sbom.spdx.json` is generated in release workflow.
46
46
  - [ ] **Attestation Signing**: Confirm `actions/attest-build-provenance` signs the release artifacts.
47
47
  - [ ] **Attestation Verification**: Verify with `gh attestation verify <artifact> --repo sebastienrousseau/dotfiles`.
48
- - [ ] **Branch Protection**: Ensure `security-attestation` is a required status check on master.
48
+ - [ ] **Branch Protection**: Ensure `security-attestation` is a required status check on main.
49
49
  - [ ] **Automation Keying**: Confirm `ACTIONS_BOT_SIGNING_KEY` exists and matches the signer in `dot_config/git/allowed_signers`.
50
50
 
51
51
  ## 7. Final Verification
@@ -7,10 +7,10 @@ render_with_liquid: false
7
7
  Every bash script in this repo must include `set -euo pipefail` (or
8
8
  `set -eu` for POSIX `sh`) within its first 50 lines. The rule is
9
9
  enforced by
10
- [`tools/ci/check-shell-preamble.sh`](../../tools/ci/check-shell-preamble.sh),
10
+ [`tools/ci/check-shell-preamble.sh`](https://github.com/sebastienrousseau/dotfiles/blob/main/tools/ci/check-shell-preamble.sh),
11
11
  wired into `pre-commit` and the `reusable-shell-lint.yml` CI job.
12
12
  Tests pin the contract under
13
- [`tests/unit/security/test_shell_preamble_lint.sh`](../../tests/unit/security/test_shell_preamble_lint.sh).
13
+ [`tests/unit/security/test_shell_preamble_lint.sh`](https://github.com/sebastienrousseau/dotfiles/blob/main/tests/unit/security/test_shell_preamble_lint.sh).
14
14
 
15
15
  ## Why the preamble is mandatory
16
16
 
@@ -12,13 +12,13 @@ Controlled inventory for software of unknown pedigree used by the dotfiles platf
12
12
 
13
13
  | Component | Source | Version control | Verification path | Owner | Status |
14
14
  | :--- | :--- | :--- | :--- | :--- | :--- |
15
- | Homebrew installer | `raw.githubusercontent.com/Homebrew/install` | Moving upstream script, gated by `HOMEBREW_INSTALLER_SHA256` | SHA-256 in [package_managers.sh](../../install/lib/package_managers.sh) | Repo maintainer | Conditional |
15
+ | Homebrew installer | `raw.githubusercontent.com/Homebrew/install` | Moving upstream script, gated by `HOMEBREW_INSTALLER_SHA256` | SHA-256 in [package_managers.sh](https://github.com/sebastienrousseau/dotfiles/blob/main/install/lib/package_managers.sh) | Repo maintainer | Conditional |
16
16
  | Chezmoi installer | `get.chezmoi.io` | Pinned by `CHEZMOI_INSTALLER_SHA256` when used | SHA-256 in `install/lib/chezmoi.sh` | Repo maintainer | Controlled |
17
17
  | GitHub Actions marketplace actions | GitHub Marketplace | Full commit SHA pinning | Workflow `uses:` pins | Repo maintainer | Controlled |
18
- | Grype container | `anchore/grype` | Pinned tag in workflow | Container tag in [security-enhanced.yml](../../.github/workflows/security-enhanced.yml) | Repo maintainer | Controlled |
19
- | Trivy container | `aquasec/trivy` | Pinned tag in workflow | Container tag in [security-enhanced.yml](../../.github/workflows/security-enhanced.yml) | Repo maintainer | Controlled |
18
+ | Grype container | `anchore/grype` | Pinned tag in workflow | Container tag in [security-enhanced.yml](https://github.com/sebastienrousseau/dotfiles/blob/main/.github/workflows/security-enhanced.yml) | Repo maintainer | Controlled |
19
+ | Trivy container | `aquasec/trivy` | Pinned tag in workflow | Container tag in [security-enhanced.yml](https://github.com/sebastienrousseau/dotfiles/blob/main/.github/workflows/security-enhanced.yml) | Repo maintainer | Controlled |
20
20
  | Checkov action | GitHub Marketplace | Full commit SHA pinning | Workflow `uses:` pin | Repo maintainer | Controlled |
21
- | Nix inputs | GitHub flakes | Locked in [flake.lock](../../flake.lock) | `narHash` and revision lock | Repo maintainer | Controlled |
21
+ | Nix inputs | GitHub flakes | Locked in [flake.lock](https://github.com/sebastienrousseau/dotfiles/blob/main/flake.lock) | `narHash` and revision lock | Repo maintainer | Controlled |
22
22
  | GitHub release metadata queries | GitHub API | Discovery only, not release validation | `update-deps.yml` query path | Repo maintainer | Monitored |
23
23
 
24
24
  ## Validation record