diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 83390571..100b7f0d 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,6 +1,9 @@ # High-risk paths. Last matching pattern wins. # Root-anchored so nested copies (e.g. skills/**/scripts/) are not owned here. /.github/ @jaredwray +/.vscode/ @jaredwray /.cursor/ @jaredwray /.devcontainer/ @jaredwray +/.claude/ @jaredwray +/.codex/ @jaredwray /scripts/ @jaredwray diff --git a/DEFENSE_IN_DEPTH.md b/DEFENSE_IN_DEPTH.md index 4adf37df..f400e80c 100644 --- a/DEFENSE_IN_DEPTH.md +++ b/DEFENSE_IN_DEPTH.md @@ -9,11 +9,14 @@ Profile: npm library · public - [x] `DEFENSE_IN_DEPTH.md` present (this file) — PR #1698 ## 2. CODEOWNERS and cloud bootstrap -- [x] `.github/CODEOWNERS` covers `/.github/`, `/.cursor/`, `/.devcontainer/`, `/scripts/` with owners the maintainer names — PR #1704 -- [x] Codespaces and Cursor Cloud Agents bootstrap Aikido Safe Chain via scripts/setup-cloud-environment.sh (--ci shims, frozen lockfile) — PR #1699 +- [ ] `.github/CODEOWNERS` covers `/.github/`, `/.vscode/`, `/.cursor/`, `/.devcontainer/`, `/.claude/`, `/.codex/`, `/scripts/` with owners the maintainer names (PR #1734 pending) +- [ ] Codespaces, Cursor Cloud Agents, and Claude Code on the web bootstrap Aikido Safe Chain via scripts/setup-cloud-environment.sh (--ci shims, frozen lockfile); Claude Code runs it from `.claude/hooks/session-start.sh` (web sessions only, install log on stderr, 600s timeout) and `.gitignore` keeps `.claude/settings.json` and `.claude/hooks/` tracked +- [ ] Codex cloud environments use Manual setup with `bash ./scripts/setup-cloud-environment.sh` as the setup and maintenance script (manual) +- [ ] Claude Code on the web environments allow `malware-list.aikido.dev` (Custom network access plus the default package-manager list) (manual) +- [x] Dev Container `image` pinned by digest (`name:@sha256:`; not a floating tag) — PR #1718 ## 3. Dependencies (pnpm) -- [x] `packageManager: pnpm@11.3+` pinned in `package.json` — verified 2026-08-24 +- [x] `packageManager: pnpm@11.3+` pinned in `package.json` — PR #1733 - [x] 7-day cooldown: `minimumReleaseAge: 10080`, `minimumReleaseAgeStrict: true`, `minimumReleaseAgeIgnoreMissingTime: false`; no first-party `minimumReleaseAgeExclude` — PR #1700 - [x] `trustPolicy: no-downgrade`; no first-party `trustPolicyExclude` — PR #1700 - [x] Lifecycle scripts blocked: `strictDepBuilds: true`, `dangerouslyAllowAllBuilds: false`, `allowBuilds: {}` baseline — PR #1700 @@ -27,18 +30,18 @@ Profile: npm library · public - [x] Every action pinned to a full commit SHA (`npx actions-up`) — PR #1701 - [x] Every job installs Socket Firewall (`SocketDev/action` SHA-pinned, `firewall-version` pinned); `pnpm install` / `npm install` run as `sfw pnpm install` / `sfw npm install` — PR #1701 - [x] `.github/workflows/check-workflows.yaml` lints workflows with zizmor on every PR — PR #1701 -- [x] Workflow `name:` and job `name:` contain no spaces (kebab-case) so they can be set as required status checks; matrix checks are `test-22` / `test-24` / `test-26` plus a `test` gate — PR #1701, PR #1706 +- [x] Workflow `name:` and job `name:` contain no spaces (kebab-case) so they can be set as required status checks — PR #1701, PR #1706 - [x] `persist-credentials: false` on checkouts that don't push — PR #1701 - [x] No `pull_request_target` on workflows that run untrusted PR code — verified 2026-08-24 - [x] Artifact-publishing workflows disable `actions/setup-node` default caching (`package-manager-cache: false`) to prevent cache poisoning — PR #1701 - [x] No npm tokens (or other registry credentials) in Actions secrets — verified 2026-08-24 ## 5. npm publishing — npm libraries only -- [x] OIDC trusted publishing configured **stage-only** on npmjs.com for the publish workflow — it can stage, never publish live — PR #1706 +- [x] OIDC trusted publishing configured **stage-only** on npmjs.com for the publish workflow — it can stage, never publish live (manual) — PR #1706 - [x] `.github/workflows/release.yaml` packs then stages with `pnpm stage publish ./packed/*.tgz --no-git-checks` — PR #1702 -- [x] Maintainer promotes staged versions with 2FA — PR #1706 -- [x] Drydock connected — staged releases reviewed before promotion — PR #1706 -- [x] No direct publish rights: package requires 2FA and disallows tokens — PR #1706 +- [x] Maintainer promotes staged versions with 2FA (manual) — PR #1706 +- [x] Drydock connected — staged releases reviewed before promotion (manual) — PR #1706 +- [x] No direct publish rights: package requires 2FA and disallows tokens (manual) — PR #1706 - [x] `package.json` `repository.url` accurate so provenance maps to this repo — verified 2026-08-24 ## 6. Security tooling @@ -47,6 +50,6 @@ Profile: npm library · public - [x] Socket reviews every PR that changes dependencies — verified 2026-08-24 ## 7. Repository lockdown -- [x] Phishing-resistant 2FA (passkeys / hardware keys) on the GitHub and npm accounts — PR #1706 -- [x] Recovery codes stored offline in a password manager — PR #1706 -- [x] `lockdown-repo.sh` applied by a repo admin (never committed to this repo); `--check` with `--required-checks "test,test-22,test-24,test-26,zizmor"` and `--allowed-actions "pnpm/*,codecov/*,cloudflare/*"` passes (PRs required on the default branch, merges blocked unless required status checks pass, tag ruleset, immutable releases, fork-PR approval (public repos), read-only workflow tokens, Actions allowlist, secret scanning, Dependabot disabled, private vulnerability reporting (public repos)) — PR #1705, required checks updated PR #1707 +- [x] Phishing-resistant 2FA (passkeys / hardware keys) on the GitHub and npm accounts (manual) — PR #1706 +- [x] Recovery codes stored offline in a password manager (manual) — PR #1706 +- [x] `lockdown-repo.sh` applied by a repo admin (never committed to this repo); `--check` with `--required-checks` and `--allowed-actions` passes (PRs required on the default branch, merges blocked unless required status checks pass, tag ruleset, immutable releases, fork-PR approval (public repos), read-only workflow tokens, Actions allowlist, secret scanning, Dependabot disabled, private vulnerability reporting (public repos)) — PR #1705, required checks updated PR #1707