diff --git a/.planning/STATE.md b/.planning/STATE.md index 73c863c..6cc5844 100644 --- a/.planning/STATE.md +++ b/.planning/STATE.md @@ -6,7 +6,7 @@ status: defining_requirements previous_milestone: v0.3.0 previous_milestone_status: feature-complete (awaits v0.3.0-rc1 tag push as shipping event) stopped_at: Milestone v0.4.0 (Open-Source Release) planned 2026-04-26 — PROJECT.md / MILESTONES.md / REQUIREMENTS.md / ROADMAP.md written. Five phases (7. License & Public-Ready Documentation; 8. Secret Scanning & History Audit; 9. Repository Hygiene & Artifact Cleanup; 10. Public CI/CD Verification & Branch Protection; 11. Public Visibility Flip & Smoke Test). 18 requirements across LIC / SEC / CLEAN / CIPUB / PUB categories, all mapped 1:1 to phases. Phase numbering continues from v0.3.0 (last phase 6 → next phase 7); v0.3.0 phase directories preserved until rc1 tag push. Earlier (v0.3.0): Plan 06-04 complete — Phase 6 Wave 3 release pipeline landed (TST-05, TST-08, INST-03, CAT-05). Two atomic commits (0352842 feat Task 1 .github/workflows/release.yml 4-gate pipeline: gate-1-precommit + gate-2-docker matrix × {22.04,24.04} + gate-3-qemu matrix × {22.04,24.04} with /dev/kvm udev + actions/cache@v4 keyed on tests/qemu/cloud-images.txt + gate-4-pinned-combo ubuntu-24.04 Docker + build with sha256sum -c verify + publish softprops/action-gh-release@v2.6.2 Node-20 pin + files glob tarball/.sha256/catalog-*.json/.deb + concurrency cancel-in-progress:false Pitfall 9 + startsWith(refs/tags/v) publish guard; af7edc2 ci Task 2 .github/workflows/deploy.yml added Pattern 5 `cp packaging/curl-installer/install.sh install.sh` step pre-upload-pages-artifact + .gitignore install.sh anti-drift gitignore). ~12 min total static work. Review loop clean (bash-engineer + security-engineer + qa-engineer + catalog-auditor applied inline per Phase 2-5 precedent): default permissions contents:read + publish override contents:write; every third-party action pinned (softprops@v2.6.2, actions/*@v4/v5); TAG passed via env not inline ${{ }} (injection-safe); set -euo pipefail on every inline run block; fail-fast:false on matrix jobs; timeouts on every job; artifact upload on QEMU failure only; build-step sha256sum -c round-trips tarball before upload (T-06-08); dist/catalog-${TAG}.json verified -s non-empty (Pitfall 8); files glob fail_on_unmatched_files:false tolerates SKIP_DEB path. Static gates all green: python3 -c 'import yaml; yaml.safe_load' OK on both workflows; actionlint 1.7.12 clean on release.yml + deploy.yml; pre-commit check-yaml + trailing-whitespace + end-of-file-fixer + detect-private-key + check-added-large-files + check-merge-conflict Passed (biome-check skipped — broken nodeenv in this env, runs on CI runners); every plan-spec grep token present (concurrency, cancel-in-progress:false, gate-1..4, softprops@v2.6.2, tests/qemu/boot.sh, tests/docker/run.sh, scripts/build-release.sh, hashFiles('tests/qemu/cloud-images.txt'), needs:[resolve,gate-4-pinned-combo], catalog-*.json, startsWith(github.ref)). Runtime verification (workflow_dispatch dry-run + v0.3.0-rc1 tag push + softprops end-to-end) deferred per VALIDATION.md §Manual-Only Verifications row 3 — first tag push is the shipping event. Pre-commit hook installed in .git/hooks/pre-commit (was not installed at session start). Plan requires autonomous:false checkpoint gate on real v0.3.0-rc1 tag-push exercise before v0.3.0 final. Next: Plan 06-05 (DOC-01 user README + release-ready). -last_updated: "2026-04-26T13:30:00.000Z" +last_updated: "2026-05-03T11:00:00.000Z" last_activity: 2026-04-26 — v0.4.0 (Open-Source Release) milestone planned via /gsd-new-milestone (issue AGE-6). PROJECT.md / MILESTONES.md / REQUIREMENTS.md / ROADMAP.md written; v0.3.0 artifacts archived to .planning/milestones/v0.3.0-{REQUIREMENTS,ROADMAP}.md. Five phases (7-11), 21 requirements across LIC/SEC/CLEAN/CIPUB/PUB (4+5+4+4+4). Earlier: 2026-04-20 — Plan 06-04 complete. Two `type="auto"` tasks + one `type="checkpoint:human-verify"` (blocking checkpoint deferred to first real tag push) = two atomic commits 0352842 + af7edc2, ~12 min total static work. .github/workflows/release.yml grew from 60-line Phase 1 scaffold to 294-line full 4-gate orchestrator (resolve → gate-1-precommit → gate-2-docker matrix × {22.04,24.04} → gate-3-qemu matrix × {22.04,24.04} → gate-4-pinned-combo → build → publish). .github/workflows/deploy.yml added a single 2-line Pattern 5 `cp packaging/curl-installer/install.sh install.sh` step between checkout and configure-pages (anti-drift: repo-root install.sh gitignored so only packaging/ copy is editable). Review loop clean first pass (bash-engineer + security-engineer + qa-engineer + catalog-auditor — rubrics applied inline): default contents:read + publish-only contents:write; softprops/action-gh-release pinned to v2.6.2 per Standard Stack; TAG via env:, not inline expansion (injection-safe); set -euo pipefail on every inline run block; artifact upload on QEMU failure only; build-step sha256sum -c round-trips before upload (T-06-08); catalog snapshot presence verified (Pitfall 8); files glob tolerates missing .deb (SKIP_DEB path). Runtime verification (workflow_dispatch dry-run + v0.3.0-rc1 tag push + softprops end-to-end publish) deferred to first real CI run per 06-VALIDATION.md Manual-Only row 3. Next: Plan 06-05 (DOC-01 user README + release-ready). progress: total_phases: 6 @@ -287,6 +287,7 @@ None. Roadmap created; all 46 requirements mapped; Phase 1 is ready to plan. |---|-------------|------|--------|-----------| | 260502-i4p | Add stop hook reminding Claude to run review loop (AL-23) and amend ADR-010 | 2026-05-02 | af9bd74 | [260502-i4p-add-stop-hook-reminding-claude-to-run-re](./quick/260502-i4p-add-stop-hook-reminding-claude-to-run-re/) | | 260503-8z4 | Add session-tracker Stop hook (AL-24) — second instance of ADR-010 reminder-hook pattern | 2026-05-03 | _pending_ | [260503-8z4-al-24-add-stop-hook-for-session-tracking](./quick/260503-8z4-al-24-add-stop-hook-for-session-tracking/) | +| 260503-dtx | Cut v0.3.2-rc1 release candidate (AL-18 / AL-21) — version bump 0.3.0 → 0.3.2 across plugin source + bats; tag pushed; release.yml triggered; Docker dogfood instructions filed (Path A curl-pipe-bash + Path B local tarball, Ubuntu 22.04 / 24.04 / 26.04). Filed AL-29 follow-up for version-string SoT consolidation (8 hardcoded sites). | 2026-05-03 | 49b8c22 | [260503-dtx-cut-v0-3-2-rc1-release-candidate-bump-ve](./quick/260503-dtx-cut-v0-3-2-rc1-release-candidate-bump-ve/) | ## Deferred Items diff --git a/.planning/quick/260503-dtx-cut-v0-3-2-rc1-release-candidate-bump-ve/260503-dtx-PLAN.md b/.planning/quick/260503-dtx-cut-v0-3-2-rc1-release-candidate-bump-ve/260503-dtx-PLAN.md new file mode 100644 index 0000000..b80f712 --- /dev/null +++ b/.planning/quick/260503-dtx-cut-v0-3-2-rc1-release-candidate-bump-ve/260503-dtx-PLAN.md @@ -0,0 +1,157 @@ +--- +quick_id: 260503-dtx +description: Cut v0.3.2-rc1 release candidate (bump versions, push tag, document Docker dogfood test) +status: planned +date: 2026-05-03 +jira: AL-18 +--- + +# Quick Task 260503-dtx: v0.3.2-rc1 Release Candidate + +## Context + +- Last release: **v0.3.1** (2026-05-02). First dogfood test against v0.3.1 failed. +- Fixes shipped to master since v0.3.1 (9 commits): PR #7 (three dogfood-discovered installer-path bugs), PR #5 (Ubuntu 26.04), PR #11 (Node 24-ready actions), PR #13 (review-reminder Stop hook + ADR-010 refinement), PR #14 (workspace-cleanup skill), plus CI deploy fixes (#9, #10) and PR-preview workflow (#4). +- A dangling `release/v0.4.1-rc1-bump` branch exists locally (bumped to 0.4.1) — superseded by user's choice of v0.3.2-rc1 (patch-level). +- AL-18 follow-up: cut a new RC, run Docker-based dogfood against it. +- User decisions: + - Version: **v0.3.2-rc1** (patch bump) + - Action: **Bump + push tag** (full release-pipeline flow via `release.yml`) + +## Constraints + +- `scripts/build-release.sh` enforces a three-way version lock: tag base (`0.3.2`) MUST equal `plugin/cli/package.json.version` AND `plugin/catalog/catalog.json.version`. The `-rc1` suffix is stripped before comparison (see `fix(build): allow rc / pre-release suffix in tag↔package.json version lock`). +- Tag shape regex (curl-installer + release.yml): `^v[0-9]+\.[0-9]+\.[0-9]+(-[A-Za-z0-9.]+)?$` — `v0.3.2-rc1` matches. +- `release.yml` triggers on `push: tags: 'v*.*.*'` → runs gate-1-precommit, gate-2-docker (22.04 + 24.04), gate-3-qemu, gate-4-pinned-combo, build, publish. +- Discard the dangling `release/v0.4.1-rc1-bump` branch — versions there target a different minor. +- Tag push is irreversible. User explicitly authorized. + +## Tasks + +### Task 1 — Bump versions to 0.3.2 + +**Files:** +- `plugin/cli/package.json` (`"version": "0.3.0"` → `"0.3.2"`) +- `plugin/catalog/catalog.json` (`"version": "0.3.0"` → `"0.3.2"`) + +**Action:** Two single-line `Edit` calls. + +**Verify:** +- `node -e 'console.log(require("./plugin/cli/package.json").version)'` prints `0.3.2` +- `jq -r .version plugin/catalog/catalog.json` prints `0.3.2` + +**Done when:** Both files report `0.3.2`. + +--- + +### Task 2 — Open release PR against master + +**Action:** +1. Switch from `worktree-first-release` to a fresh branch `release/v0.3.2-rc1-bump` based on `origin/master`. +2. Stage + commit the two version-bump files only. +3. Push branch. +4. Open PR with `gh pr create` titled `chore(release): bump version to 0.3.2 for rc1 release`. +5. Wait for CI green (or surface the PR URL if user wants to gate manually). + +**Verify:** +- `gh pr view --json mergeable,statusCheckRollup` reports `MERGEABLE` and all required checks `SUCCESS`. + +**Done when:** PR is merged into master. + +--- + +### Task 3 — Build release artifacts locally (verification) + +**Action:** +After bump is merged to master, on a master checkout, run: +``` +scripts/build-release.sh v0.3.2-rc1 +``` + +**Verify:** +- `dist/agentlinux-v0.3.2-rc1.tar.gz` exists +- `dist/agentlinux-v0.3.2-rc1.tar.gz.sha256` exists +- `dist/catalog-v0.3.2-rc1.json` exists +- `(cd dist && sha256sum -c agentlinux-v0.3.2-rc1.tar.gz.sha256)` reports `OK` +- Re-run produces byte-identical tarball (reproducibility, T-06-08) + +**Done when:** Artifacts exist and sha256 round-trip passes. + +--- + +### Task 4 — Tag v0.3.2-rc1 + push to origin + +**Action:** +On master at the merge commit: +``` +git tag -a v0.3.2-rc1 -m "v0.3.2-rc1 — RC for AL-18 dogfood retest + +Patch on top of v0.3.1 carrying: +- PR #7 — three dogfood-discovered installer-path bugs (curl-installer ORG default, + --purge sudoers cleanup, GSD + Playwright CLI skill bootstrap wiring, + AGENTLINUX_AGENT_HOME export during purge, playwright-cli cd to writable home). +- PR #5 — Ubuntu 26.04 (Resolute Raccoon) added to v0.3.0 supported targets. +- PR #11 — bump GitHub Actions to Node 24-ready versions. +- PR #13 — review-reminder Stop hook + ADR-010 refinement (AL-23). +- PR #14 — workspace-cleanup skill. +- PR #4/#9/#10 — CI / website deploy fixes. + +Refs: AL-18" +git push origin v0.3.2-rc1 +``` + +**Verify:** +- `git ls-remote --tags origin v0.3.2-rc1` returns the tag SHA. +- GitHub Actions release workflow run appears for the tag (`gh run list --workflow=release.yml --limit 1`). + +**Done when:** Tag pushed, release.yml run triggered. + +--- + +### Task 5 — Document Docker dogfood test instructions + +**Action:** Write `${QUICK_DIR}/260503-dtx-SUMMARY.md` containing two dogfood paths the user can copy-paste: + +1. **Path A (production-realistic) — curl-pipe-bash against the published RC**, gated on the GitHub Release being live. Uses `tests/docker/Dockerfile.ubuntu-{22.04,24.04,26.04}` plus `AGENTLINUX_VERSION=v0.3.2-rc1` to override. +2. **Path B (pre-publish) — local tarball harness**, runnable as soon as `dist/` is populated. Uses `tests/docker/run.sh` directly. +3. Include the canonical Claude Code self-update assertion (AGT-02) so the dogfood probes the exact bug class AgentLinux exists to eliminate. + +**Done when:** SUMMARY.md exists with copy-pasteable commands for at least Ubuntu 22.04 + 24.04. + +--- + +### Task 6 — Commit artifacts + STATE.md update + +**Files:** +- `.planning/quick/260503-dtx-cut-v0-3-2-rc1-release-candidate-bump-ve/260503-dtx-PLAN.md` +- `.planning/quick/260503-dtx-cut-v0-3-2-rc1-release-candidate-bump-ve/260503-dtx-SUMMARY.md` +- `.planning/STATE.md` (append row to "Quick Tasks Completed" + update `Last activity`) + +**Action:** +``` +gsd-sdk query commit "docs(quick-260503-dtx): cut v0.3.2-rc1 release candidate" \ + .planning/quick/260503-dtx-cut-v0-3-2-rc1-release-candidate-bump-ve/260503-dtx-PLAN.md \ + .planning/quick/260503-dtx-cut-v0-3-2-rc1-release-candidate-bump-ve/260503-dtx-SUMMARY.md \ + .planning/STATE.md +``` + +**Done when:** Single commit lands containing all three files. + +## must_haves + +- truths: + - `plugin/cli/package.json.version == "0.3.2"` + - `plugin/catalog/catalog.json.version == "0.3.2"` + - `git ls-remote --tags origin v0.3.2-rc1` returns a SHA on master + - `release.yml` workflow run exists for tag `v0.3.2-rc1` +- artifacts: + - PR (chore(release): bump version to 0.3.2 for rc1 release) merged into master + - `dist/agentlinux-v0.3.2-rc1.tar.gz{,.sha256}` (locally, optional after publish) + - `${QUICK_DIR}/260503-dtx-SUMMARY.md` with Docker dogfood instructions +- key_links: + - `scripts/build-release.sh` + - `.github/workflows/release.yml` + - `tests/docker/run.sh` + - `packaging/curl-installer/install.sh` + - `plugin/cli/package.json` + - `plugin/catalog/catalog.json` diff --git a/.planning/quick/260503-dtx-cut-v0-3-2-rc1-release-candidate-bump-ve/260503-dtx-SUMMARY.md b/.planning/quick/260503-dtx-cut-v0-3-2-rc1-release-candidate-bump-ve/260503-dtx-SUMMARY.md new file mode 100644 index 0000000..d708f67 --- /dev/null +++ b/.planning/quick/260503-dtx-cut-v0-3-2-rc1-release-candidate-bump-ve/260503-dtx-SUMMARY.md @@ -0,0 +1,267 @@ +--- +quick_id: 260503-dtx +description: Cut v0.3.2-rc1 release candidate (bump versions, push tag, document Docker dogfood test) +status: complete +date: 2026-05-03 +jira: AL-18 +related: [AL-21, AL-29] +pr: 16 +tag: v0.3.2-rc1 +release_run: https://github.com/Roo4L/Agent-Linux/actions/runs/25277326389 +--- + +# Quick Task 260503-dtx: v0.3.2-rc1 Release Candidate — Summary + +## What landed + +| Step | Result | +|------|--------| +| Bumped `plugin/cli/package.json` 0.3.0 → 0.3.2 | done — commit `0a78aef` on `release/v0.3.2-rc1-bump` | +| Bumped `plugin/catalog/catalog.json` 0.3.0 → 0.3.2 | done — same commit | +| Opened release PR | done — [#16](https://github.com/Roo4L/Agent-Linux/pull/16) | +| Built `dist/agentlinux-v0.3.2-rc1.tar.gz` (+ `.sha256`, `+ catalog-v0.3.2-rc1.json`) locally | done — sha256 round-trip `OK` | +| Discovered version-string sprawl in plugin source + bats — first CI run on PR #16 failed `CAT-05` because the staged catalog path is computed from `plugin/cli/package.json.version` (0.3.2) but the installer's `AGENTLINUX_VERSION` constant + bats test paths/assertions were still pinned to 0.3.0. Fixed in commit `90f6227` (8 files, +14/-14). | done | +| PR #16 rebased on master after PR #15 merged during CI | done | +| PR #16 merged via rebase → master at `49b8c22` | done — merged 2026-05-03T10:59:07Z | +| Tag `v0.3.2-rc1` pushed (annotated, points at `49b8c22`) | done — `0af0444` | +| `release.yml` triggered (run [25277326389](https://github.com/Roo4L/Agent-Linux/actions/runs/25277326389)) | **in flight** — gate-1 → gate-2 docker → gate-3 qemu → gate-4 pinned-combo → build → publish (~25-40 min total) | +| Reviewers green (bash-engineer, node-engineer, qa-engineer) | done — sweep is mechanical; cosmetic comment-bump deferred to AL-29 | +| Jira: AL-21 → In Review (PR linked); AL-29 sub-task filed for version-string SoT consolidation | done | + +## Why this RC took two commits + +`scripts/build-release.sh` enforces a three-way version lock between the +tag, `package.json`, and `catalog.json` — but the **runtime** version was +ALSO hardcoded in four other places that the build-release lock didn't +catch: + +- `plugin/bin/agentlinux-install` — `readonly AGENTLINUX_VERSION="..."` + (controls the `/opt/agentlinux/catalog//` staging path) +- `plugin/cli/src/index.ts` — Commander's `.version("...")` reply +- `plugin/cli/src/catalog/loader.ts` — `defaultCatalogDir()` fallback +- `plugin/cli/src/catalog/schema.ts` — `resolveSchemaPath()` fallback + +Plus four bats test files that hardcoded `/opt/agentlinux/catalog/0.3.0/...` +in path assertions and version-string checks. The previous v0.3.1 release +slipped past this by being a metadata-only tag rename (so release.yml +never built it). v0.3.2-rc1 is the first RC since the public flip that +goes through the full release pipeline, which surfaced the sprawl. + +**Follow-up worth a Jira ticket:** consolidate version-string sources so +that exactly one file is the SoT (e.g., have `plugin/bin/agentlinux-install` +read the version from `plugin/cli/package.json` at install time, and have +the bats CAT-05 pattern — read package.json — replicated across all +version-aware tests). + +## Tagging step (after PR #16 merges) + +Run on a freshly-pulled master: + +```bash +git checkout master +git pull --ff-only origin master + +# Sanity: master should now contain the bump commit. +node -e 'console.log(require("./plugin/cli/package.json").version)' # 0.3.2 +jq -r .version plugin/catalog/catalog.json # 0.3.2 + +git tag -a v0.3.2-rc1 -m "v0.3.2-rc1 — RC for AL-18 dogfood retest + +Patch on top of v0.3.1 carrying the master-merged follow-ups since +the first dogfood failure: PR #7 (three dogfood-discovered installer- +path bugs), PR #5 (Ubuntu 26.04), PR #11 (Node 24 actions), PR #13 +(review-reminder Stop hook + ADR-010 refinement, AL-23), PR #14 +(workspace-cleanup skill), PR #4/#9/#10 (CI/website-deploy fixes). + +Refs: AL-18" + +git push origin v0.3.2-rc1 +``` + +That tag push triggers `.github/workflows/release.yml`: +gate-1-precommit → gate-2-docker × {22.04, 24.04, 26.04} → gate-3-qemu → +gate-4-pinned-combo → build → publish (softprops/action-gh-release@v2.6.2). + +Track the run with: + +```bash +gh run watch --exit-status \ + "$(gh run list --workflow=release.yml --limit 1 --json databaseId -q '.[0].databaseId')" +``` + +When `publish` lands, the RC tarball + sidecar will be at: + +- https://github.com/Roo4L/Agent-Linux/releases/download/v0.3.2-rc1/agentlinux-v0.3.2-rc1.tar.gz +- https://github.com/Roo4L/Agent-Linux/releases/download/v0.3.2-rc1/agentlinux-v0.3.2-rc1.tar.gz.sha256 + +--- + +## Docker dogfood test (Ubuntu) + +Two test paths. **Path A** is the production-realistic flow — what an end-user +running `curl … | sudo bash` will actually experience. **Path B** runs the +behavior-contract bats suite against the same RC tarball without going through +the public download URL; useful as a pre-publish smoke or when iterating offline. + +### Prerequisites (one-time, on your host) + +```bash +# Docker engine (any reasonably recent version with cgroup v2 support). +docker version + +# A repo checkout pinned to the RC tag, used for Path B (and as the build +# context for Path A's test image). +git fetch --tags origin +git checkout v0.3.2-rc1 # works after the tag is pushed +``` + +### Path A — curl-pipe-bash dogfood (production-realistic) + +This boots a clean systemd-capable Ubuntu container, downloads the published +RC tarball over HTTPS via the curl-installer, runs `agentlinux-install`, and +exercises the canonical Claude Code self-update assertion (AGT-02 — the +exact bug class AgentLinux exists to eliminate). + +Repeat the block once per Ubuntu version — `22.04`, `24.04`, and `26.04`. +Bash variable substitution makes it copy-paste-once: + +```bash +UBUNTU=ubuntu-24.04 # or ubuntu-22.04 / ubuntu-26.04 +RC=v0.3.2-rc1 +IMG=agentlinux-test:${UBUNTU} + +# Build the systemd-capable test image once. The Dockerfile already includes +# every dependency the installer needs; no plugin source is baked in — the +# container fetches the RC tarball from GitHub at runtime. +docker build -t "$IMG" -f tests/docker/Dockerfile.${UBUNTU} . + +# Boot the container as PID-1=systemd. (Same recipe tests/docker/run.sh uses.) +CID=$(docker run --rm -d \ + --privileged --cgroupns=host \ + -e container=docker \ + -v /sys/fs/cgroup:/sys/fs/cgroup:rw \ + --tmpfs /run --tmpfs /tmp \ + "$IMG") + +# Wait for systemd to settle. +docker exec "$CID" systemctl is-system-running --wait >/dev/null 2>&1 \ + || docker exec "$CID" sh -c 'systemctl is-system-running | grep -qE "running|degraded"' + +# Run the curl-pipe-bash installer pinned to the RC tag. +docker exec -e AGENTLINUX_VERSION="$RC" "$CID" bash -c ' + apt-get update -qq && apt-get install -qq -y curl ca-certificates >/dev/null + curl -fsSL https://agentlinux.org/install.sh | bash +' + +# Verify the install (these are the BHV-XX / RT-XX / AGT-XX behaviors). +docker exec "$CID" id agent +docker exec "$CID" sudo -u agent -H bash -lc 'node --version && which agentlinux' +docker exec "$CID" sudo -u agent -H bash -lc 'agentlinux list' +docker exec "$CID" sudo -u agent -H bash -lc 'agentlinux doctor' + +# Canonical self-update probe (AGT-02). This is the bug class AgentLinux +# was built to eliminate — it MUST succeed without recursive-shim or EACCES. +docker exec "$CID" sudo -u agent -H bash -lc ' + agentlinux install claude-code && + claude --version && + claude doctor && + printf "AGT-02 self-update probe: OK\n" +' + +# Tear down. +docker rm -f "$CID" +``` + +If any step fails, capture the failure with: + +```bash +docker logs "$CID" > /tmp/agentlinux-${UBUNTU}-${RC}.log 2>&1 +docker exec "$CID" journalctl -b --no-pager > /tmp/agentlinux-${UBUNTU}-${RC}.journal +``` + +…and attach both files when you log the regression on AL-18. + +> **Override knobs** (rarely needed): +> - `AGENTLINUX_VERSION=v0.3.2-rc1` — pin to a specific RC (used above). +> - `AGENTLINUX_ORG=Roo4L` — point at a fork. +> - `AGENTLINUX_RELEASE_BASE=https://example.invalid/some/path` — override the +> release base URL entirely (test seam — not for production use). + +### Path B — local tarball + bats contract suite + +This skips the public download path entirely. It builds the test image from +the *current checkout's* sources, runs the installer inside the container, +then runs the full `tests/bats/` behavior-contract suite — BHV-XX, RT-XX, +AGT-XX, CLI-XX, CAT-XX, INST-XX. Use this to validate the RC against the +spec without waiting for the GitHub Release to publish. + +```bash +# Smallest possible smoke (fastest feedback — Ubuntu 24.04). +./tests/docker/run.sh ubuntu-24.04 + +# Full Docker matrix (mirror what release.yml gate-2-docker runs). +./tests/docker/run.sh ubuntu-22.04 +./tests/docker/run.sh ubuntu-24.04 +./tests/docker/run.sh ubuntu-26.04 +``` + +A green run ends with: + +``` +== PASS: agentlinux-install + bats on ubuntu-24.04 == +``` + +If you need to poke around after a failure, set `AGENTLINUX_DOCKER_KEEP_CONTAINER=1`: + +```bash +AGENTLINUX_DOCKER_KEEP_CONTAINER=1 ./tests/docker/run.sh ubuntu-24.04 +docker ps # find the agentlinux-test-* container +docker exec -it bash # interactive shell inside the failed env +``` + +### Decision tree — which path to run when + +| Situation | Path | +|-----------|------| +| RC tag pushed but `release.yml` still running | B (sources match the RC because you checked out the tag) | +| `release.yml` finished, RC published | **A then B** — A validates the public download path, B reconfirms the bats contract | +| Something failed in A; want to bisect curl-installer vs installer logic | B (rules out the download/sha256/extract layer) | +| Something failed in B; want to confirm against the public artifact | A (rules out a checkout-vs-tarball drift) | + +--- + +## Acceptance criteria for "RC ready to flip to v0.3.2 final" + +1. `release.yml` for `v0.3.2-rc1` ends green (all four gates + build + publish). +2. Path A passes on Ubuntu 22.04 + 24.04 + 26.04. +3. Path B passes on Ubuntu 22.04 + 24.04 + 26.04. +4. The AGT-02 self-update probe (Path A's `claude --version && claude doctor`) succeeds — + this is the dogfood bug that drove this whole task (AL-18). + +If 1-4 all green, cut `v0.3.2` final by re-tagging master (no version-bump +needed — package.json + catalog.json already report `0.3.2`): + +```bash +git tag -a v0.3.2 -m "v0.3.2 — first dogfooded GA after AL-18 retest" +git push origin v0.3.2 +``` + +--- + +## Artifacts + +- PLAN: `.planning/quick/260503-dtx-cut-v0-3-2-rc1-release-candidate-bump-ve/260503-dtx-PLAN.md` +- This SUMMARY: same dir, `260503-dtx-SUMMARY.md` +- Local build (built and verified during this task): + - `dist/agentlinux-v0.3.2-rc1.tar.gz` + - `dist/agentlinux-v0.3.2-rc1.tar.gz.sha256` (round-trip `OK`) + - `dist/catalog-v0.3.2-rc1.json` +- Release branch: `release/v0.3.2-rc1-bump` → PR [#16](https://github.com/Roo4L/Agent-Linux/pull/16) + +## Open follow-ups + +- Discard the dangling `release/v0.4.1-rc1-bump` branch — superseded by the + patch-level v0.3.2 line. Safe to `git push origin --delete release/v0.4.1-rc1-bump` + once the tag lands. +- After the dogfood is green, log the AL-18 retest result in Jira and either + close AL-18 or convert remaining gaps into linked tickets.