Visitar URL original
fix(install): trust the microsandbox-acq dependency before brew install by wz-gsa · Pull Request #534 · GSA-TTS/agentic-coding-quickstart · GitHub
Skip to content

fix(install): trust the microsandbox-acq dependency before brew install - #534

Merged
mogul merged 1 commit into
mainfrom
fix/brew-trust-microsandbox-dependency
Oct 2, 2026
Merged

mogul merged 1 commit into
mainfrom
fix/brew-trust-microsandbox-dependency

Conversation

@wz-gsa

@wz-gsa wz-gsa commented Oct 2, 2026

Copy link
Copy Markdown
Contributor

Summary

Fixes #523. Every new user following the documented quickstart install hit:

Error: Refusing to load formula gsa-tts/tap/microsandbox-acq from untrusted tap gsa-tts/tap.

Root cause

Confirmed live (fresh brew state, real GSA-TTS/tap, exact command from the issue): Homebrew (since 6.0.0) requires explicit trust before loading a formula from a non-official tap. Installing a fully-qualified name — what install.sh's $BREW_FORMULA ("GSA-TTS/tap/acq") already is — auto-trusts only that one formula, not the whole tap and not any other formula in the same tap it depends on. acq.rb declares depends_on "GSA-TTS/tap/microsandbox-acq", a second formula from the same tap, which Homebrew does not auto-trust just because acq itself was.

Fix

Explicitly trust the known dependency by name before the install call, rather than trusting the whole tap (narrower — future formulae added to the tap stay untrusted until a user opts in directly) or asking users to run a documented workaround by hand.

Verified live, before this commit: brew trust --formula is safe to call even before the tap has been cloned — it only records the trust decision, with no tap-clone or install side effect — and the subsequent brew install then tap-clones as normal and finds the dependency already trusted.

Verification

  • Reproduced the exact failure on a clean brew state with the real tap and the real command from the issue.
  • Applied the fix and confirmed --dry-run shows both the trust and install calls in the correct order.
  • Ran a real (non-dry-run) install attempt with the fix; Homebrew's own output confirms the trust call takes effect before the tap-clone/install sequence runs. (A second, unrelated, pre-existing conflict on this specific host — microsandbox-acq vs. an already-installed superradcompany/tap/microsandbox — surfaced during that run; it is not introduced by this change and is out of scope for this fix.)
  • Added a new bats test (test/bats/05-install.bats) mirroring the existing superradcompany/tap-ordering test's pattern: asserts install_via_brew() calls brew trust --formula GSA-TTS/tap/microsandbox-acq before brew install GSA-TTS/tap/acq, so a future refactor can't silently reorder or drop the trust call.
  • ./scripts/test-acq-bats test/bats/05-install.bats: 15/15 passing, including the new test. (Root-caused and fixed a local sandbox issue that initially made bats appear non-functional: a user-local env shim earlier on PATH than /usr/bin/env was silently no-op'ing any env VAR=val CMD invocation, which is exactly how bats-core's own launcher re-execs itself — so bats never actually started, for any invocation, independent of this change. Worked around locally by putting /usr/bin first on PATH; the shim itself is a separate, pre-existing host issue, being investigated separately.)
  • shellcheck --severity=warning install.sh: clean.
  • Pre-commit hooks: all passed (gitleaks, trailing-whitespace, EOF-newline, shellcheck on both the script and bats suite, bats offline suite).

An independent adversarial review (security + accuracy focus) ran against this change before commit: confirmed the new trust call does not widen the script's existing trust model (same per-formula, hardcoded-name pattern already used for $BREW_FORMULA itself), confirmed no attacker-controlled input reaches the new line, and confirmed --dry-run/npm/clone paths are unaffected.

AI-assisted change (OpenCode).

Co-authored-by: OpenCode Agent agent@gsa.gov

Fixes #523.

Every new user following the documented quickstart install hit:

  Error: Refusing to load formula gsa-tts/tap/microsandbox-acq from
  untrusted tap gsa-tts/tap.

Root cause, confirmed live (fresh brew state, real `GSA-TTS/tap`, exact
command from the issue): Homebrew (since 6.0.0) requires explicit trust
before loading a formula from a non-official tap. Installing a
FULLY-QUALIFIED name — what install.sh's $BREW_FORMULA ("GSA-TTS/tap/acq")
already is — auto-trusts only that one formula, not the whole tap and not
any other formula in the same tap it depends on. acq.rb declares
`depends_on "GSA-TTS/tap/microsandbox-acq"`, a second formula from the same
tap, which Homebrew does not auto-trust just because acq itself was.

Fix: explicitly trust the known dependency by name before the install call,
rather than trusting the whole tap (narrower — future formulae added to the
tap stay untrusted until a user opts in directly) or asking users to run a
documented workaround by hand. Verified live, before this commit:
`brew trust --formula` is safe to call even before the tap has been cloned —
it only records the trust decision, with no tap-clone or install side
effect — and the subsequent `brew install` then tap-clones as normal and
finds the dependency already trusted.

Verification:
- Reproduced the exact failure on a clean brew state with the real tap and
  the real command from the issue.
- Applied the fix and confirmed --dry-run shows both the trust and install
  calls in the correct order.
- Ran a real (non-dry-run) install attempt with the fix; Homebrew's own
  output confirms the trust call takes effect before the tap-clone/install
  sequence runs. (A second, unrelated, pre-existing conflict on this
  specific host — `microsandbox-acq` vs. an already-installed
  `superradcompany/tap/microsandbox` — surfaced during that run; it is not
  introduced by this change and is out of scope for this fix.)
- Added a new bats test (`test/bats/05-install.bats`) mirroring the
  existing `superradcompany/tap`-ordering test's pattern: asserts
  `install_via_brew()` calls `brew trust --formula
  GSA-TTS/tap/microsandbox-acq` before `brew install GSA-TTS/tap/acq`, so a
  future refactor can't silently reorder or drop the trust call.
- `./scripts/test-acq-bats test/bats/05-install.bats`: 15/15 passing,
  including the new test. (Root-caused and fixed a local sandbox issue
  that initially made bats appear non-functional: a user-local `env` shim
  earlier on PATH than `/usr/bin/env` was silently no-op'ing any `env
  VAR=val CMD` invocation, which is exactly how bats-core's own launcher
  re-execs itself — so bats never actually started, for any invocation,
  independent of this change. Worked around locally by putting `/usr/bin`
  first on PATH; the shim itself is a separate, pre-existing host issue.)
- `shellcheck --severity=warning install.sh`: clean.

An independent adversarial review (security + accuracy focus) ran against
this change before commit: confirmed the new trust call does not widen the
script's existing trust model (same per-formula, hardcoded-name pattern
already used for $BREW_FORMULA itself), confirmed no attacker-controlled
input reaches the new line, and confirmed --dry-run/npm/clone paths are
unaffected.

Co-authored-by: OpenCode Agent <agent@gsa.gov>
@wz-gsa
wz-gsa requested a review from a team as a code owner October 2, 2026 15:54
@mogul
mogul merged commit ffac0fa into main Oct 2, 2026
5 checks passed
@mogul
mogul deleted the fix/brew-trust-microsandbox-dependency branch October 2, 2026 16:35
mogul added a commit that referenced this pull request Oct 6, 2026
🤖 I have created a release *beep* *boop*
---


##
[4.0.0](v3.1.0...v4.0.0)
(2026-10-06)


### ⚠ BREAKING CHANGES

* **kits:** acq no longer installs podman/OCI tooling by default. Users who need docker, docker compose, or rootless podman when the base image doesn't provide it must opt into the oci-engine kit with `acq configure`, `--kit`, or `ACQ_EXTRA_KITS`.
* **kits:** acq no longer performs native OpenCode npm fallback installation. OpenCode is supplied by the pinned opencode agent kit from agentic-coding-patterns v1.12.0, currently delivering OpenCode v2.0.22. If the kit is unavailable or invalid, acq fails closed instead of installing opencode-ai from npm.
* **kits:** existing acq sandboxes with adapter-installed podman are not migrated in place. Recreate affected sandboxes or add the oci-engine kit before relying on OCI behavior after stop/start.

### Features

* **acq:** choose the host port per sandbox, and let --publish pin it
([#526](#526))
([410f332](410f332))
* **acq:** export ACQ_WORKSPACE and ACQ_CLONE into the guest on both
backends
([#457](#457))
([e0b9a3b](e0b9a3b))
* **acq:** interactive `acq configure` UI for extra kits + token-scoping
defaults
([#500](#500))
([13d9d3a](13d9d3a))
* **kits:** adopt pinned agent and capability kits
([#474](#474))
([6a67063](6a67063))
* **secrets:** add Windows-native DPAPI secret backend
([#464](#464))
([907f404](907f404))
* **windows:** add acq preview install path
([#463](#463))
([d6d76f4](d6d76f4))


### Bug Fixes

* **acq:** use sandbox workspace for github scoping
([#476](#476))
([1610835](1610835))
* **ci:** bump js-yaml to 4.3.2 to clear a high-severity CPU-DoS
advisory
([#454](#454))
([3217b49](3217b49))
* **ci:** bump smol-toml to 1.7.1 to clear an infinite-loop DoS advisory
([#459](#459))
([c2291bf](c2291bf))
* **ci:** centralize markdownlint coverage
([#548](#548))
([a27c31e](a27c31e))
* **ci:** pin markdownlint-cli2 once, clear GHSA-253c, unify file
selection
([#527](#527))
([e712685](e712685))
* **ci:** unblock unrelated PRs from the bash32 required-check deadlock
([#513](#513))
([187aa57](187aa57))
* **install:** keep curl | sh stdin intact and tap msb formula first
([#462](#462))
([c808d74](c808d74))
* **install:** trust the microsandbox-acq dependency before brew install
([#534](#534))
([ffac0fa](ffac0fa))
* **kits:** land collapsed kit stack implementation
([#549](#549))
([bcd5b9c](bcd5b9c))
* **msb:** allow Playwright browser downloads
([#477](#477))
([0c399c5](0c399c5))
* **msb:** block unsafe 0.7 migration versions
([#510](#510))
([3634046](3634046))
* **msb:** carry every origin URL, keep the scratch private, fail closed
on a copy miss
([#488](#488))
([babcd49](babcd49))
* **msb:** carry the source checkout's git identity into the --clone
scratch
([#443](#443))
([320d784](320d784))
* **msb:** follow the host resolvers and disable DNS rebind protection
in the guest
([#444](#444))
([d2f4bdc](d2f4bdc))
* **msb:** point the --clone scratch's origin at the source checkout's
remote
([#455](#455))
([7f48b94](7f48b94))
* **msb:** refresh ssh authorization for port publish
([#446](#446))
([72a6bd5](72a6bd5))
* **msb:** session parity for exec/attach/shell (cwd, terminal identity,
login shell)
([#427](#427))
([6261eda](6261eda))
* **msb:** skip the recursive home chown when the image baked the agent
user
([#432](#432))
([d8f66a4](d8f66a4))
* **msb:** thread the merged kit env onto kit lifecycle commands
([#519](#519))
([2248a92](2248a92))
* **msb:** translate kit wildcard network rules
([#451](#451))
([e22bbc3](e22bbc3))
* **msb:** verify post-hoc port forward listener
([#530](#530))
([8ca50e1](8ca50e1))
* **msb:** warn on broadened kit wildcard rules
([#460](#460))
([6ded3ce](6ded3ce))
* **msb:** warn when ssh-agent route is missing
([#448](#448))
([3a767a4](3a767a4))
* **sbx:** emit valid setup.install shape for the git-identity mixin
([#492](#492))
([8e6160c](8e6160c))
* **sbx:** raise the version floor to 0.39.0, where sbx create --env
first exists
([#491](#491))
([30f9ecf](30f9ecf))
* **sbx:** wait for startup barrier before attach
([#512](#512))
([33c83c5](33c83c5))
* **secret:** reject multiline test secret values
([#447](#447))
([f2da950](f2da950))
* **secrets:** propagate rotation across backends
([#509](#509))
([9641958](9641958))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Bret Mogilefsky <bret.mogilefsky@gsa.gov>
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.

[Bug] Error: Refusing to load formula gsa-tts/tap/microsandbox-acq from untrusted tap gsa-tts/tap.

2 participants