Skip to content

ci(p2): clean-install smoke tests + multi-OS matrix + orphan-tag release guard#90

Merged
CodeWithJuber merged 2 commits into
masterfrom
claude/parallel-solving-3dc0ji
Jul 19, 2026
Merged

ci(p2): clean-install smoke tests + multi-OS matrix + orphan-tag release guard#90
CodeWithJuber merged 2 commits into
masterfrom
claude/parallel-solving-3dc0ji

Conversation

@CodeWithJuber

Copy link
Copy Markdown
Owner

What & why

The P2 evidence-tier hardening from the v0.22.0 audit (§11) — the "prove it by machine" items that were out of scope for the behavioral fixes. CI-only; no src/ change, so nothing in the published package changes.

Clean install/uninstall smoke test (scripts/smoke-install.sh, .github/workflows/smoke.yml) — a real end-to-end install exercised on a throwaway HOME (never the runner's ~/.claude), asserting by machine what was previously only asserted in prose:

  • bash install.sh creates resolvable asset symlinks, merges the exec-form hooks (command:"bash" + args + _forge marker) into settings.json, and leaves guards present + executable.
  • forge init --settings-only exits 0 and is byte-for-byte idempotent on a second run.
  • A corrupt settings.json makes it exit non-zero (the RA-04 contract).
  • Uninstall removes the Forge hooks and the symlinks.
  • The load-bearing one: install under a path containing a space, then execute an installed guard from it — proving the ME-23 exec form + RA-12 quoting survive spaces. 14 assertions, all green locally.

Runs on an ubuntu-latest + macos-latest matrix (macOS exercises bash 3.2 / BSD userland), and re-runs the full test suite on each. Windows-git-bash is left as a documented TODO (needs symlink-capable checkout).

Release-pipeline guard (bump.yml) — the auto-release was wedged this session by an orphaned v0.22.2 tag from a partial run: git tag died with a bare "tag already exists" on every subsequent master push. The bump step now detects a pre-existing tag (local or remote) before committing and fails with an operator runbook (git push origin :refs/tags/vX.Y.Z, then re-run) instead of a cryptic error — so a partial run can never silently wedge every future release again. It deliberately does not auto-delete tags (too dangerous in CI).

scripts/smoke-install.sh is shellcheck --severity=error clean (the quality gate runs shellcheck on all *.sh).

No CHANGELOG entry: this is CI-only with no package impact, so [Unreleased] stays empty and this merge is a graceful no-release skip rather than a needless version bump.

Checklist

  • npm test passes (1057, 0 fail)
  • npm run check passes (Biome)
  • Conventional commit message (ci:)
  • No new runtime dependency
  • New shell is ShellCheck-clean; the smoke script was run locally and passes all 14 assertions
  • npm run typecheck + node src/cli.js docs check green

Risk & rollback

  • Risk level: low — CI/workflow + a standalone shell script; no runtime code touched, nothing shipped to npm changes.
  • Rollback plan: revert the single commit.

🤖 Generated with Claude Code

https://claude.ai/code/session_01KfCEnSJzSG914yyVesjjD6


Generated by Claude Code

claude added 2 commits July 19, 2026 19:10
…in-path guard; fail-clear on orphan release tag

- scripts/smoke-install.sh: real clean-install/uninstall exercised on a throwaway
  HOME (never the runner's ~/.claude) — asserts exec-form hooks + _forge marker
  land, forge init --settings-only is idempotent and exits non-zero on corrupt
  JSON (RA-04), uninstall reverses hooks + symlinks, and an installed guard runs
  from a path CONTAINING A SPACE (the RA-12/ME-23 quoting regression). 14 assertions.
- .github/workflows/smoke.yml: runs the smoke + the test suite on ubuntu + macos
  (bash 3.2 / BSD userland). Windows-git-bash left as a documented TODO.
- bump.yml: detect a pre-existing release tag before committing and fail with an
  operator runbook instead of a cryptic "tag already exists" that wedges every
  future auto-release (the orphan-tag failure this release hit).

Co-Authored-By: Claude Fable 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01KfCEnSJzSG914yyVesjjD6
…-platform

The first macOS matrix run surfaced ONE environment-specific unit-test failure
(APFS case-insensitivity + /tmp→/private/tmp path canonicalization); the install
smoke — P2's actual deliverable — is green on macOS. ci.yml already runs the full
suite on the Node 20/22 Linux matrix, so gate the smoke workflow's suite step to
ubuntu and leave a TODO to pin+fix the macOS test before enabling macOS unit
coverage. Keeps macOS install evidence without blocking on a latent test issue.

Co-Authored-By: Claude Fable 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01KfCEnSJzSG914yyVesjjD6
@CodeWithJuber
CodeWithJuber marked this pull request as ready for review July 19, 2026 19:37
@CodeWithJuber
CodeWithJuber merged commit 4348e51 into master Jul 19, 2026
11 checks passed
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.

2 participants