The shipped Codex review wrappers require bash, git, jq, codex, and a provider CLI (tea for Gitea or gh for GitHub). Gitea review posting also uses python3 through shared login helpers. BusyBox/coreutils commands used are awk, sed, grep, head, cat, cp, rm, mktemp, and wc.
The hermetic regression test requires bash, git, and jq through the real wrapper preflight; tea and codex are stubbed. Node, pnpm, and Turbo provide the CI runner invocation.
Decision
Path A. jq is a genuine shipped runtime dependency, not test-only parsing convenience: both review wrappers call check_jq, validate Codex JSON with jq empty, and common.sh uses jq to format findings and select review actions.
Change
add only jq to the Dockerfile.ci Alpine package set
update the adjacent toolset comment
Runtime parity: the host-side shipped wrapper README already declares jq, the operational Mosaic host has jq, and the dedicated codex-review Woodpecker template installs jq and git. Gateway/appservice runtime images do not ship or execute these host-side framework review tools.
Evidence
Pipeline 1893 is the red-first reproducer: git fixture setup passes, then both wrapper paths stop at check_jq because ci-base lacks jq.
After merge, ci-image.yml must publish a successful descendant ci-base:latest before PR #815 is rebased again.
## Dependency audit
The shipped Codex review wrappers require bash, git, jq, codex, and a provider CLI (tea for Gitea or gh for GitHub). Gitea review posting also uses python3 through shared login helpers. BusyBox/coreutils commands used are awk, sed, grep, head, cat, cp, rm, mktemp, and wc.
The hermetic regression test requires bash, git, and jq through the real wrapper preflight; tea and codex are stubbed. Node, pnpm, and Turbo provide the CI runner invocation.
## Decision
Path A. jq is a genuine shipped runtime dependency, not test-only parsing convenience: both review wrappers call check_jq, validate Codex JSON with jq empty, and common.sh uses jq to format findings and select review actions.
## Change
- add only jq to the Dockerfile.ci Alpine package set
- update the adjacent toolset comment
Runtime parity: the host-side shipped wrapper README already declares jq, the operational Mosaic host has jq, and the dedicated codex-review Woodpecker template installs jq and git. Gateway/appservice runtime images do not ship or execute these host-side framework review tools.
## Evidence
Pipeline 1893 is the red-first reproducer: git fixture setup passes, then both wrapper paths stop at check_jq because ci-base lacks jq.
After merge, ci-image.yml must publish a successful descendant ci-base:latest before PR #815 is rebased again.
Related to #795; does not close it.
Exact head SHA reviewed:d8dc09608345d6c69f817c48a81853b7ea969c85 (branch fix/795-ci-base-jq) Merge-base / sole parent:cabf02e7b9310f7ae57ad67c1db66959ffaf1bc9 (current main)
Head's sole parent is the current main tip, so this is a trivial fast-forward — the true prospective merge tree is identical to the head tree. I reviewed that tree directly (no synthetic merge required).
Verdict: APPROVE
Independent verification performed
Diff re-fetched and confirmed exact.Dockerfile.ci is the only file changed (+4/-4). The change adds jq to the existing apk add --no-cache layer:
before: apk add --no-cache python3 make g++ postgresql-client bash git
after: apk add --no-cache python3 make g++ postgresql-client bash git jq git is preserved, not dropped. The accompanying comment update accurately describes that bash/git/jq are baked in for framework shell tests and the shipped Codex review wrappers, avoiding per-run installation in ci.yml. No other lines, files, secrets, or tokens are touched.
Merge-base confirmed.GET /repos/mosaicstack/stack/git/commits/d8dc0960... returns a single parent: cabf02e7b9310f7ae57ad67c1db66959ffaf1bc9, matching current main. Fast-forward confirmed independently.
Exact-head CI confirmed green. Woodpecker pipeline 1894 (commit d8dc0960..., ref refs/pull/821/head): overall status: success. All workflow steps green: clone, ci-postgres (service), install, sanitization, upgrade-guard, typecheck, lint, format, test — each state: success, exit_code: 0. changed_files: ["Dockerfile.ci"] only.
Substance review:
Scope: CI base image only (Dockerfile.ci), low blast radius.
No secrets/tokens/credentials introduced.
No regression: python3 make g++ postgresql-client bash git all remain in the apk line; only jq is additive.
Comment accurately reflects the change and its purpose.
Acknowledged out-of-scope note: runtime/agent-image jq parity (needed for the shipped Codex review wrappers to work outside the CI image) is a known, separately-documented pre-existing gap. It is deliberately out of scope for this CI-image-only PR and is not a basis for REQUEST CHANGES here.
Lane attestation
Author lane = homelab (coordinator). Reviewer lane = independent reviewer-of-record, operating under a single Gitea account (jason.woltje) — author≠reviewer is process/lane-attested per the delegated independent-review protocol, not enforced via separate Gitea identities.
Do not merge
This comment is a review record only; no merge action was taken as part of this review.
## Independent Review-of-Record — PR #821
**Exact head SHA reviewed:** `d8dc09608345d6c69f817c48a81853b7ea969c85` (branch `fix/795-ci-base-jq`)
**Merge-base / sole parent:** `cabf02e7b9310f7ae57ad67c1db66959ffaf1bc9` (current `main`)
Head's sole parent is the current main tip, so this is a trivial fast-forward — the true prospective merge tree is identical to the head tree. I reviewed that tree directly (no synthetic merge required).
### Verdict: **APPROVE**
### Independent verification performed
1. **Diff re-fetched and confirmed exact.** `Dockerfile.ci` is the only file changed (+4/-4). The change adds `jq` to the existing `apk add --no-cache` layer:
- before: `apk add --no-cache python3 make g++ postgresql-client bash git`
- after: `apk add --no-cache python3 make g++ postgresql-client bash git jq`
`git` is **preserved**, not dropped. The accompanying comment update accurately describes that bash/git/jq are baked in for framework shell tests and the shipped Codex review wrappers, avoiding per-run installation in `ci.yml`. No other lines, files, secrets, or tokens are touched.
2. **Merge-base confirmed.** `GET /repos/mosaicstack/stack/git/commits/d8dc0960...` returns a single parent: `cabf02e7b9310f7ae57ad67c1db66959ffaf1bc9`, matching current main. Fast-forward confirmed independently.
3. **Exact-head CI confirmed green.** Woodpecker pipeline 1894 (commit `d8dc0960...`, ref `refs/pull/821/head`): overall `status: success`. All workflow steps green: clone, ci-postgres (service), install, sanitization, upgrade-guard, typecheck, lint, format, test — each `state: success`, `exit_code: 0`. `changed_files: ["Dockerfile.ci"]` only.
4. **Substance review:**
- Scope: CI base image only (`Dockerfile.ci`), low blast radius.
- No secrets/tokens/credentials introduced.
- No regression: `python3 make g++ postgresql-client bash git` all remain in the apk line; only `jq` is additive.
- Comment accurately reflects the change and its purpose.
- **Acknowledged out-of-scope note:** runtime/agent-image `jq` parity (needed for the shipped Codex review wrappers to work outside the CI image) is a known, separately-documented pre-existing gap. It is deliberately out of scope for this CI-image-only PR and is not a basis for REQUEST CHANGES here.
### Lane attestation
Author lane = homelab (coordinator). Reviewer lane = independent reviewer-of-record, operating under a single Gitea account (`jason.woltje`) — author≠reviewer is process/lane-attested per the delegated independent-review protocol, not enforced via separate Gitea identities.
### Do not merge
This comment is a review record only; no merge action was taken as part of this review.
—
Independent reviewer-of-record (MS-LEAD-delegated)
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.
Dependency audit
The shipped Codex review wrappers require bash, git, jq, codex, and a provider CLI (tea for Gitea or gh for GitHub). Gitea review posting also uses python3 through shared login helpers. BusyBox/coreutils commands used are awk, sed, grep, head, cat, cp, rm, mktemp, and wc.
The hermetic regression test requires bash, git, and jq through the real wrapper preflight; tea and codex are stubbed. Node, pnpm, and Turbo provide the CI runner invocation.
Decision
Path A. jq is a genuine shipped runtime dependency, not test-only parsing convenience: both review wrappers call check_jq, validate Codex JSON with jq empty, and common.sh uses jq to format findings and select review actions.
Change
Runtime parity: the host-side shipped wrapper README already declares jq, the operational Mosaic host has jq, and the dedicated codex-review Woodpecker template installs jq and git. Gateway/appservice runtime images do not ship or execute these host-side framework review tools.
Evidence
Pipeline 1893 is the red-first reproducer: git fixture setup passes, then both wrapper paths stop at check_jq because ci-base lacks jq.
After merge, ci-image.yml must publish a successful descendant ci-base:latest before PR #815 is rebased again.
Related to #795; does not close it.
Independent Review-of-Record — PR #821
Exact head SHA reviewed:
d8dc09608345d6c69f817c48a81853b7ea969c85(branchfix/795-ci-base-jq)Merge-base / sole parent:
cabf02e7b9310f7ae57ad67c1db66959ffaf1bc9(currentmain)Head's sole parent is the current main tip, so this is a trivial fast-forward — the true prospective merge tree is identical to the head tree. I reviewed that tree directly (no synthetic merge required).
Verdict: APPROVE
Independent verification performed
Diff re-fetched and confirmed exact.
Dockerfile.ciis the only file changed (+4/-4). The change addsjqto the existingapk add --no-cachelayer:apk add --no-cache python3 make g++ postgresql-client bash gitapk add --no-cache python3 make g++ postgresql-client bash git jqgitis preserved, not dropped. The accompanying comment update accurately describes that bash/git/jq are baked in for framework shell tests and the shipped Codex review wrappers, avoiding per-run installation inci.yml. No other lines, files, secrets, or tokens are touched.Merge-base confirmed.
GET /repos/mosaicstack/stack/git/commits/d8dc0960...returns a single parent:cabf02e7b9310f7ae57ad67c1db66959ffaf1bc9, matching current main. Fast-forward confirmed independently.Exact-head CI confirmed green. Woodpecker pipeline 1894 (commit
d8dc0960..., refrefs/pull/821/head): overallstatus: success. All workflow steps green: clone, ci-postgres (service), install, sanitization, upgrade-guard, typecheck, lint, format, test — eachstate: success,exit_code: 0.changed_files: ["Dockerfile.ci"]only.Substance review:
Dockerfile.ci), low blast radius.python3 make g++ postgresql-client bash gitall remain in the apk line; onlyjqis additive.jqparity (needed for the shipped Codex review wrappers to work outside the CI image) is a known, separately-documented pre-existing gap. It is deliberately out of scope for this CI-image-only PR and is not a basis for REQUEST CHANGES here.Lane attestation
Author lane = homelab (coordinator). Reviewer lane = independent reviewer-of-record, operating under a single Gitea account (
jason.woltje) — author≠reviewer is process/lane-attested per the delegated independent-review protocol, not enforced via separate Gitea identities.Do not merge
This comment is a review record only; no merge action was taken as part of this review.
—
Independent reviewer-of-record (MS-LEAD-delegated)