Skip to content

ci: pin GitHub Actions to commit SHAs + add Dependabot - #1

Open
allenfbyrd wants to merge 1 commit into
mainfrom
harden/pin-action-shas
Open

ci: pin GitHub Actions to commit SHAs + add Dependabot#1
allenfbyrd wants to merge 1 commit into
mainfrom
harden/pin-action-shas

Conversation

@allenfbyrd

Copy link
Copy Markdown
Contributor

What

Pin all GitHub Actions in this repo to immutable commit SHAs (with # vX comments) and add/extend a github-actions Dependabot config.

Why

Tag refs like @v4 are mutable: a compromised or re-pointed tag silently changes what runs in CI (the top GitHub Actions supply-chain vector). Pinning to an immutable commit SHA removes that risk; Dependabot keeps the pins current via reviewed update PRs. Part of an org-wide move toward enabling sha_pinning_required.

Pin actions to immutable commit SHAs (with # vX comments) to defend against
mutable-tag supply-chain attacks; add/extend a github-actions Dependabot
config so the pins still receive reviewed update PRs.
allenfbyrd added a commit that referenced this pull request Jun 29, 2026
…lution + fold-in #6 stderr surfacing at the gate seam

Fold-in #1 (Resolve-PythonExe):
  Hard `& python3` breaks Windows hosts — the Windows Python installer provides `python`
  not `python3`. Resolve-PythonExe probes python3 first (Linux/macOS), then python
  (Windows/cross-platform); throws fail-closed naming both if neither resolves.
  Defined in Invoke-Voidseal.ps1 (before Resolve-DeployProfile); BuilderVM.ps1 reuses
  it via the dot-source chain rather than duplicating it.

  Changed in Invoke-Voidseal.ps1 seam-#2 gate (line ~548):
    - was: `& python $readScript ...`
    + now: `$pyExe = Resolve-PythonExe; $pyOut = & $pyExe $readScript ...`

Fold-in #6 (stderr surfacing):
  The original `2>&1 | Out-Null` swallowed read_outbox.py diagnostics.  stderr is now
  captured and appended to the throw message on non-zero exit so the operator sees the
  actual OutboxError / parse-failure rather than a bare exit-code.

  Example (now visible in the InvokeVoidseal test WARNING line):
    "...releasing nothing. stderr: read_outbox: FAIL-CLOSED: OutboxError: sha256
     mismatch for '...' (tamper)"

  Cross-reference comments added at the seam listing the outbox container constants
  (MAGIC=VSOUTBX1, 24-byte header, 104-byte record) pointing to guest/outbox.py as
  the single source of truth (consistent with the existing reference in host/read_outbox.py).

Test floor: 564/566 Pester green (0 new failures, 2 pre-existing skips); 20/20 pytest.
allenfbyrd added a commit that referenced this pull request Jun 29, 2026
…image-hash match; fail-closed on mismatch/absence; deps.vhdx stays builder-owned)
allenfbyrd added a commit that referenced this pull request Jul 19, 2026
Closes the #1 onboarding gap: a newcomer previously had to reverse-
engineer profiles/ralph.psd1 or profiles/firefox.psd1 to author their
own workload. Modeled on CAPEv2's packages.rst — document the profile
interface contract, then ship one deliberately trivial skeleton.

- docs/authoring-a-workload-profile.md: the two-layer (tier profile vs
  workload profile) model, a full field-contract table derived from
  ProfileLoader.ps1 (including WorkloadMode/Inputs/InputFiles/DepsSpec/
  ScreenConfig/OutboxOutput — fields SCHEMA.md doesn't yet list), the
  five loader invariants, the INIT..DESTROYED lifecycle mapped to field
  effects, a synthetic Tier-0 worked walkthrough, and a "scaffold from
  firefox.psd1" fast-path note.
- profiles/example-skeleton.psd1: minimal valid offline Tier-0 Serial-
  mode profile, every editable field marked "<-- EDIT", carrying an
  explicit honesty note that this shape (unlike firefox's Disk-mode
  path) has not been live-run.
- tests/Profiles.Tests.ps1: pin that the skeleton loads clean through
  Import-WorkloadProfile, stays offline, and carries no secret-shaped
  mount (+6 tests). Profiles.Tests.ps1/ProfileLoader.Tests.ps1 don't
  enumerate profiles/, so the new file is safe to ship there.
- README.md / docs/operator-runbook.md: cross-link the new guide from
  the quickstart and the runbook intro.

Suite: Pester 764 -> 770 (768 passed, 0 failed, 2 skipped, unchanged)
— +6 are the new skeleton-validation tests. Docs/config only, no
engine change.
allenfbyrd added a commit that referenced this pull request Jul 19, 2026
New community-surface files (benchmark 'Community' lens): the repo is
built via Claude Code and already ships SKILL.md, so a root AGENTS.md
documenting the AI/human contributor workflow is a natural extension
(gVisor/CAPEv2-style convention), plus the universal-floor GitHub
templates.

- AGENTS.md: a thin map, not a restatement -- points at CONTRIBUTING.md
  (fake-must-match-real backend parity, the project's #1 bug class),
  SKILL.md, and docs/{authoring-a-workload-profile,tier-reference,
  threat-model}.md. States the 3 load-bearing rules (parity discipline,
  both suites green, honesty discipline) plus an AI-contribution norm:
  review AI output as your own, be transparent about substantial AI
  assistance. Explicitly scoped to NOT be a commit-attribution mandate
  -- that stays the maintainer's own personal choice, never imposed on
  contributors.
- .github/ISSUE_TEMPLATE/bug_report.md + feature_request.md + config.yml
  (routes security reports away from public issues, to SECURITY.md).
- .github/pull_request_template.md: checklist encoding the real bar
  (Pester green, pytest green if guest/host touched, fake!=real parity
  if HyperVBackend.ps1 touched, CHANGELOG + docs updated).
- CODE_OF_CONDUCT.md: stock Contributor Covenant v2.1. Enforcement
  contact routes to a GitHub issue or SECURITY.md's private channel --
  no invented personal email.

Explicitly skipped (cargo-cult for a solo-maintainer repo, per plan):
GOVERNANCE.md, CHARTER.md, MAINTAINERS.md, CODEOWNERS, PGP-canary infra.
Discussions left off.

Docs/config only, no engine change. Invoke-Pester -Path tests: 768/0/2
(770 total), unchanged from the pre-Q3 baseline.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant