Fallout from bedb6d2, which unbroke main after e9ad692.
What happened
e9ad692 added Antigravity wiring, which needs jq to merge skills.json safely. install.sh treats jq as optional — every other target in it is dependency-free — so wire_antigravity warns and skips when jq is missing.
The runner has no jq. The three tests asserting merge behaviour did not know that, so they passed on koala and failed in CI on the same commit. Main was red from 06:59 until bedb6d2, and the tag job was skipped throughout, so nothing released.
bedb6d2 makes those three run only where jq exists and print a SKIP otherwise, plus adds a real test for the skip path via a new SKILLS_JQ seam.
The gap that leaves
CI now skips the assertions rather than running them:
SKIP jq absent — Antigravity merge behaviour not covered on this host (3 cases)
install: 10 passed, 0 failed, 3 skipped
So on the runner, three behaviours are unverified:
skills.json registers $AGENTS_DIR and not the raw checkout — the property that keeps Antigravity's skill set identical to every other harness (surfaces filtering, collision handling, multi-source merge).
Re-running does not duplicate the entry.
A hand-authored entry survives a re-run. json_configs.md documents that file as user-editable, so clobbering someone's personal skills dir is a real regression with a real victim.
Those are the only three assertions covering the one wiring target that writes a config file rather than a symlink — i.e. the one where a bug is hardest to notice and most annoying to undo.
Fix
Add jq to the act_runner image (mathias/infra, the runner's Containerfile/values). It is a few hundred KB and it is already assumed by plenty of shell in this estate.
Then revert the skip gate in tests/install_test.sh to a hard requirement — if the runner is guaranteed to have jq, a missing jq there should fail loudly rather than skip quietly.
Worth deciding at the same time
Whether jq should stay optional in install.sh at all. Two coherent positions:
Keep it optional. The script's promise is that it works on a bare host, and Antigravity is the only target needing more than coreutils. Cost: a silent capability gap on hosts without it.
Require it for Antigravity, and say so.doctor could then report "Antigravity configured but jq missing — its skills.json is stale" instead of the current silence.
I lean the second, because the present failure mode is invisible: a host without jq gets every other harness wired and Antigravity silently not, and nothing anywhere says so afterwards. The skip is logged at install time and then forgotten.
Definition of done
The runner has jq; tests/install_test.sh no longer needs the skip branch; CI actually exercises the merge, the idempotency and the preservation cases.
Fallout from `bedb6d2`, which unbroke main after `e9ad692`.
## What happened
`e9ad692` added Antigravity wiring, which needs `jq` to merge `skills.json` safely. `install.sh` treats jq as **optional** — every other target in it is dependency-free — so `wire_antigravity` warns and skips when jq is missing.
The runner has no jq. The three tests asserting merge behaviour did not know that, so they passed on koala and failed in CI on the same commit. Main was red from 06:59 until `bedb6d2`, and the `tag` job was skipped throughout, so nothing released.
`bedb6d2` makes those three run only where jq exists and print a SKIP otherwise, plus adds a real test for the skip path via a new `SKILLS_JQ` seam.
## The gap that leaves
CI now **skips** the assertions rather than running them:
```
SKIP jq absent — Antigravity merge behaviour not covered on this host (3 cases)
install: 10 passed, 0 failed, 3 skipped
```
So on the runner, three behaviours are unverified:
1. `skills.json` registers `$AGENTS_DIR` and not the raw checkout — the property that keeps Antigravity's skill set identical to every other harness (surfaces filtering, collision handling, multi-source merge).
2. Re-running does not duplicate the entry.
3. A hand-authored entry survives a re-run. `json_configs.md` documents that file as user-editable, so clobbering someone's personal skills dir is a real regression with a real victim.
Those are the only three assertions covering the one wiring target that writes a **config file** rather than a symlink — i.e. the one where a bug is hardest to notice and most annoying to undo.
## Fix
Add `jq` to the act_runner image (`mathias/infra`, the runner's Containerfile/values). It is a few hundred KB and it is already assumed by plenty of shell in this estate.
Then revert the skip gate in `tests/install_test.sh` to a hard requirement — if the runner is guaranteed to have jq, a missing jq there should fail loudly rather than skip quietly.
## Worth deciding at the same time
Whether `jq` should stay optional in `install.sh` at all. Two coherent positions:
- **Keep it optional.** The script's promise is that it works on a bare host, and Antigravity is the only target needing more than coreutils. Cost: a silent capability gap on hosts without it.
- **Require it for Antigravity, and say so.** `doctor` could then report "Antigravity configured but jq missing — its skills.json is stale" instead of the current silence.
I lean the second, because the present failure mode is invisible: a host without jq gets every other harness wired and Antigravity silently not, and nothing anywhere says so afterwards. The skip is logged at install time and then forgotten.
## Definition of done
The runner has jq; `tests/install_test.sh` no longer needs the skip branch; CI actually exercises the merge, the idempotency and the preservation cases.
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.
Fallout from
bedb6d2, which unbroke main aftere9ad692.What happened
e9ad692added Antigravity wiring, which needsjqto mergeskills.jsonsafely.install.shtreats jq as optional — every other target in it is dependency-free — sowire_antigravitywarns and skips when jq is missing.The runner has no jq. The three tests asserting merge behaviour did not know that, so they passed on koala and failed in CI on the same commit. Main was red from 06:59 until
bedb6d2, and thetagjob was skipped throughout, so nothing released.bedb6d2makes those three run only where jq exists and print a SKIP otherwise, plus adds a real test for the skip path via a newSKILLS_JQseam.The gap that leaves
CI now skips the assertions rather than running them:
So on the runner, three behaviours are unverified:
skills.jsonregisters$AGENTS_DIRand not the raw checkout — the property that keeps Antigravity's skill set identical to every other harness (surfaces filtering, collision handling, multi-source merge).json_configs.mddocuments that file as user-editable, so clobbering someone's personal skills dir is a real regression with a real victim.Those are the only three assertions covering the one wiring target that writes a config file rather than a symlink — i.e. the one where a bug is hardest to notice and most annoying to undo.
Fix
Add
jqto the act_runner image (mathias/infra, the runner's Containerfile/values). It is a few hundred KB and it is already assumed by plenty of shell in this estate.Then revert the skip gate in
tests/install_test.shto a hard requirement — if the runner is guaranteed to have jq, a missing jq there should fail loudly rather than skip quietly.Worth deciding at the same time
Whether
jqshould stay optional ininstall.shat all. Two coherent positions:doctorcould then report "Antigravity configured but jq missing — its skills.json is stale" instead of the current silence.I lean the second, because the present failure mode is invisible: a host without jq gets every other harness wired and Antigravity silently not, and nothing anywhere says so afterwards. The skip is logged at install time and then forgotten.
Definition of done
The runner has jq;
tests/install_test.shno longer needs the skip branch; CI actually exercises the merge, the idempotency and the preservation cases.