keep framework shell fixtures self-contained without per-run package installation
Why
PR #815 now runs a hermetic git fixture from the Woodpecker test step. Pipeline 1889 proved ci-base:latest includes bash but not git, causing the test to fail before fixture setup.
Delivery sequence
Merge this prerequisite PR.
Allow ci-image.yml to rebuild ci-base:latest from the main push.
Rebase PR #815 onto that main commit and rerun exact-head CI.
Related to #795. This PR intentionally does not close the issue.
## Summary
- add git to the Dockerfile.ci Alpine package set
- keep framework shell fixtures self-contained without per-run package installation
## Why
PR #815 now runs a hermetic git fixture from the Woodpecker test step. Pipeline 1889 proved ci-base:latest includes bash but not git, causing the test to fail before fixture setup.
## Delivery sequence
1. Merge this prerequisite PR.
2. Allow ci-image.yml to rebuild ci-base:latest from the main push.
3. Rebase PR #815 onto that main commit and rerun exact-head CI.
Related to #795. This PR intentionally does not close the issue.
Reviewer-of-Record — PR #819 (issue #795 prerequisite — bake git into ci-base) @ fa5fc3cd — APPROVE (merge-gated on CI + coordinator GO)
Independent exact-head review. Author lane: ms-795 (Codex). Reviewer lane: MS Team Lead independent Opus reviewer. author≠reviewer PROCESS/LANE-attested (single provider acct jason.woltje).
Scope CLEAN — 1 file, Dockerfile.ci +3/-3. Adds git to the pre-baked apk set (python3 make g++ postgresql-client bash git) and truthfully rewrites the adjacent comment (bash and git are baked here too — framework shell tests require both without paying for per-run package installation in ci.yml). No folded changes, no .mosaic/, no secret.
Prospective tree. base.sha 9ddc6fbd == current main head (verified) · merge-base = current main · mergeable=True. No other open PR (#818/#815/#789) touches Dockerfile.ci → zero concurrent-modify risk; prospective squash tree = main + this single hunk.
Adversarial checks (PASS):
Purely additive apk package; git is a valid Alpine package; unpinned, consistent with sibling packages here. No toolchain/version conflict.
Comment truthful and consistent with the file's documented bake-over-per-run convention: bash is used by the sanitization step; git is required by test-pr-diff-context.sh (framework shell test wired in #815).
Bootstrapping correct: this PR's CI runs on the CURRENT (git-less) ci-base, but test-pr-diff-context.sh is NOT yet wired on main (only in unmerged #815) → pnpm test does not invoke it → this PR is expected green without git.
No secret / .mosaic/ / live mutation. ci-base rebuilds only via the .woodpecker/ci-image.yml pipeline post-merge (no manual image push).
Merge gate: terminal-green PR CI (pipeline 1891, currently pending) + coordinator (Mos) GO. Post-merge (Mos-mandated): require terminal-SUCCESS ci-image.yml descendant build publishing ci-base:latest WITH git BEFORE #815 rebase; #815 then gets a new exact head + fresh CI + fresh RoR, zero evidence transfer. Head must not move to add evidence.
## Reviewer-of-Record — PR #819 (issue #795 prerequisite — bake git into ci-base) @ `fa5fc3cd` — **APPROVE** (merge-gated on CI + coordinator GO)
Independent exact-head review. Author lane: ms-795 (Codex). Reviewer lane: MS Team Lead independent Opus reviewer. author≠reviewer PROCESS/LANE-attested (single provider acct `jason.woltje`).
**Scope CLEAN — 1 file, `Dockerfile.ci` +3/-3.** Adds `git` to the pre-baked apk set (`python3 make g++ postgresql-client bash git`) and truthfully rewrites the adjacent comment (`bash` and `git` are baked here too — framework shell tests require both without paying for per-run package installation in ci.yml). No folded changes, no `.mosaic/`, no secret.
**Prospective tree.** base.sha `9ddc6fbd` == current main head (verified) · merge-base = current main · mergeable=True. No other open PR (#818/#815/#789) touches `Dockerfile.ci` → zero concurrent-modify risk; prospective squash tree = main + this single hunk.
**Adversarial checks (PASS):**
1. Purely additive apk package; `git` is a valid Alpine package; unpinned, consistent with sibling packages here. No toolchain/version conflict.
2. Comment truthful and consistent with the file's documented bake-over-per-run convention: `bash` is used by the sanitization step; `git` is required by `test-pr-diff-context.sh` (framework shell test wired in #815).
3. Bootstrapping correct: this PR's CI runs on the CURRENT (git-less) ci-base, but `test-pr-diff-context.sh` is NOT yet wired on main (only in unmerged #815) → `pnpm test` does not invoke it → this PR is expected green without git.
4. No secret / `.mosaic/` / live mutation. ci-base rebuilds only via the `.woodpecker/ci-image.yml` pipeline post-merge (no manual image push).
**Merge gate:** terminal-green PR CI (pipeline 1891, currently pending) + coordinator (Mos) GO. **Post-merge (Mos-mandated):** require terminal-SUCCESS `ci-image.yml` descendant build publishing `ci-base:latest` WITH git BEFORE #815 rebase; #815 then gets a new exact head + fresh CI + fresh RoR, zero evidence transfer. Head must not move to add evidence.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
Why
PR #815 now runs a hermetic git fixture from the Woodpecker test step. Pipeline 1889 proved ci-base:latest includes bash but not git, causing the test to fail before fixture setup.
Delivery sequence
Related to #795. This PR intentionally does not close the issue.
Reviewer-of-Record — PR #819 (issue #795 prerequisite — bake git into ci-base) @
fa5fc3cd— APPROVE (merge-gated on CI + coordinator GO)Independent exact-head review. Author lane: ms-795 (Codex). Reviewer lane: MS Team Lead independent Opus reviewer. author≠reviewer PROCESS/LANE-attested (single provider acct
jason.woltje).Scope CLEAN — 1 file,
Dockerfile.ci+3/-3. Addsgitto the pre-baked apk set (python3 make g++ postgresql-client bash git) and truthfully rewrites the adjacent comment (bashandgitare baked here too — framework shell tests require both without paying for per-run package installation in ci.yml). No folded changes, no.mosaic/, no secret.Prospective tree. base.sha
9ddc6fbd== current main head (verified) · merge-base = current main · mergeable=True. No other open PR (#818/#815/#789) touchesDockerfile.ci→ zero concurrent-modify risk; prospective squash tree = main + this single hunk.Adversarial checks (PASS):
gitis a valid Alpine package; unpinned, consistent with sibling packages here. No toolchain/version conflict.bashis used by the sanitization step;gitis required bytest-pr-diff-context.sh(framework shell test wired in #815).test-pr-diff-context.shis NOT yet wired on main (only in unmerged #815) →pnpm testdoes not invoke it → this PR is expected green without git..mosaic// live mutation. ci-base rebuilds only via the.woodpecker/ci-image.ymlpipeline post-merge (no manual image push).Merge gate: terminal-green PR CI (pipeline 1891, currently pending) + coordinator (Mos) GO. Post-merge (Mos-mandated): require terminal-SUCCESS
ci-image.ymldescendant build publishingci-base:latestWITH git BEFORE #815 rebase; #815 then gets a new exact head + fresh CI + fresh RoR, zero evidence transfer. Head must not move to add evidence.