Goal
Add a dedicated CI pull request that continuously verifies this dotfiles repository can bootstrap a clean machine, catches configuration errors, and blocks secrets and unsafe dependency/workflow changes before merge.
This issue records the agreed scope and should be the source of truth for the CI PR.
Decisions
- Run the full integration installation on every pull request, not only on a schedule.
- Test every PR on both supported platforms after the cross-platform installer work lands:
- Linux (
ubuntu-latest)
- macOS (a pinned GitHub-hosted macOS runner label)
- Keep fast static/security checks in separate parallel jobs so failures are reported before the full installation finishes.
- Accept the additional runtime and exposure to upstream network/Homebrew/plugin outages in exchange for stronger confidence on every change.
- Do not use path filtering to skip integration tests for documentation-only PRs; every PR gets the same required checks.
- Use Gitleaks as the primary secret scanner because the same pinned implementation works locally through pre-commit and in CI.
- Treat Socket as optional/complementary dependency supply-chain analysis, not as a replacement for secret scanning.
Existing PRs and dependencies
No existing PR currently adds .github/workflows, and the repository has no historical GitHub Actions runs.
Primary/recommended setup
1. Shared pre-commit checks
Use .pre-commit-config.yaml as the shared local/CI source of truth. CI must run:
pre-commit run --all-files
Include pinned hooks for:
The local hook should scan staged changes quickly. CI should additionally scan complete Git history using a full checkout (fetch-depth: 0).
2. Full installer integration on every PR
Run a required Linux/macOS matrix on every pull_request and on pushes to main.
For each platform:
Before enabling the idempotency assertion, fix the current sym behavior:
- An already-correct symlink should be a no-op rather than being backed up and recreated.
- Backup names must be collision-safe. Using only
basename plus seconds-resolution timestamps can collide, e.g. VS Code and Zed both backing up settings.json in the same second.
3. uv malware protection
4. GitHub Actions security baseline
Worthwhile CI checks
Shell and installer
Configuration validation
Dependency and supply-chain security
GitHub-native security and repository features
These are currently disabled or not configured and should be enabled alongside the CI PR:
Workflow shape
Recommended required jobs:
pre-commit — shared fast format/lint/security hooks.
secret-history — complete-history Gitleaks scan.
dependency-audit — Python/OSV checks and optional Socket analysis.
actions-security — actionlint and zizmor.
install (ubuntu) — full clean-home assimilation, assertions, and second-run idempotency.
install (macos) — full Homebrew/cask/tool assimilation, assertions, and second-run idempotency.
All jobs should run in parallel where dependencies allow. The two full installer jobs remain required on every PR even if the fast jobs have already passed.
Acceptance criteria
Known tradeoffs
Running full installations on every PR will make CI slower and can fail due to Homebrew, GitHub release downloads, rustup, package registries, or plugin hosts even when repository code is unchanged. This is an explicit choice: prioritize end-to-end reproducibility on every change. Mitigate it with immutable pins, checksums, minimal safe caching, concurrency cancellation, clear logs, and deterministic assertions rather than moving the test to a schedule.
References
Goal
Add a dedicated CI pull request that continuously verifies this dotfiles repository can bootstrap a clean machine, catches configuration errors, and blocks secrets and unsafe dependency/workflow changes before merge.
This issue records the agreed scope and should be the source of truth for the CI PR.
Decisions
ubuntu-latest)Existing PRs and dependencies
assimilate.shcross-platform and enables Linux integration testing.assimilate.sh.uv/uv.tomlconfiguration.No existing PR currently adds
.github/workflows, and the repository has no historical GitHub Actions runs.Primary/recommended setup
1. Shared pre-commit checks
Use
.pre-commit-config.yamlas the shared local/CI source of truth. CI must run:Include pinned hooks for:
shfmt --diffzed/settings.jsonThe local hook should scan staged changes quickly. CI should additionally scan complete Git history using a full checkout (
fetch-depth: 0).2. Full installer integration on every PR
Run a required Linux/macOS matrix on every
pull_requestand on pushes tomain.For each platform:
HOMEunder the runner's temporary directory.$HOME/dotfiles, matching the installer's documented contract../assimilate.shwithout a links-only or package-skip mode.set -xoutput that could expose sensitive values.Before enabling the idempotency assertion, fix the current
symbehavior:basenameplus seconds-resolution timestamps can collide, e.g. VS Code and Zed both backing upsettings.jsonin the same second.3. uv malware protection
UV_MALWARE_CHECK=1by default in the shared shell environment so normaluv syncoperations perform malware checking.UV_MALWARE_CHECK=1explicitly in CI.uv sync.exclude-newer = "7 days"policy from Manage Python with uv + 7-day minimum release age #23; it is complementary to malware advisory checking.4. GitHub Actions security baseline
permissions: {}and grant only required job-level permissions.actions/checkoutwithpersist-credentials: false.cancel-in-progress: truefor superseded PR commits.github-actionsecosystem so pinned action SHAs remain maintainable.Worthwhile CI checks
Shell and installer
bash -nfor Bash scripts/configuration.zsh -nfor Zsh configuration.assimilate.sh's shebang matches the language features it uses.Configuration validation
gitconfigwithgit config --file gitconfig --list.luac -pover Hammerspoon Lua files.docker compose config --quiet.scripts/docker/Dockerfile.notebook.Dependency and supply-chain security
pip-auditor OSV-Scanner againstscripts/docker/requirements.txt.requirements.txtand GitHub Actions. Do not assume it coversBrewfile; current Socket manifest documentation does not list it.GitHub-native security and repository features
These are currently disabled or not configured and should be enabled alongside the CI PR:
Workflow shape
Recommended required jobs:
pre-commit— shared fast format/lint/security hooks.secret-history— complete-history Gitleaks scan.dependency-audit— Python/OSV checks and optional Socket analysis.actions-security— actionlint and zizmor.install (ubuntu)— full clean-home assimilation, assertions, and second-run idempotency.install (macos)— full Homebrew/cask/tool assimilation, assertions, and second-run idempotency.All jobs should run in parallel where dependencies allow. The two full installer jobs remain required on every PR even if the fast jobs have already passed.
Acceptance criteria
main.pre-commitand CI enforce the same pinned core checks.UV_MALWARE_CHECK=1is enabled locally and in CI with a compatible uv version.Known tradeoffs
Running full installations on every PR will make CI slower and can fail due to Homebrew, GitHub release downloads, rustup, package registries, or plugin hosts even when repository code is unchanged. This is an explicit choice: prioritize end-to-end reproducibility on every change. Mitigate it with immutable pins, checksums, minimal safe caching, concurrency cancellation, clear logs, and deterministic assertions rather than moving the test to a schedule.
References