Skip to content

v0.7.5

Choose a tag to compare

@github-actions github-actions released this 15 Oct 12:49
· 1271 commits to main since this release
Immutable release. Only release title and notes can be modified.
dd049c3

Fugaro v0.7.5

Install:

  • Homebrew: brew install dimipaun/tap/fugaro
  • Go: go install github.com/dimipaun/fugaro/cmd/fugaro@v0.7.5
  • Or download an archive below and verify it against checksums.txt (see docs/release.md).

Highlights

  • The base image is no longer copied into your registry: it is served through an Artifact Registry remote repository over ghcr.io, and fugaro init --base, fugaro image refresh and fugaro upgrade pin only an image whose release signature they have verified with cosign, which must now be on your PATH.
  • fugaro init --repo --retire retires what a fugaro.yaml change removes (a workflow variant, a named Claude account) without a hand-run terraform state rm: it shows the plan, asks you to type the project's name twice, and never deletes a secret or a secret version.
  • One global per-run cap now bounds every repository that has none of its own (fugaro budget set --global --per-run P), and fugaro budget show says where each cap comes from; it needs the new rules, deployed with fugaro init --firebase (see the operator steps).
  • Provider-routed models are priced from a catalog built into the binary (5 models, 91 endpoints, checked 2026-10-14) at the ZDR tier's cheapest end, printed by fugaro budget prices and charged at the dearest end once the file is 30 days old, while your own model_prices still win; the require_zdr and price_policy switches are refused in this release and arrive in a later one.
  • A secret can be stored once for the whole project with fugaro secrets set NAME --project-wide, and anthropic-api-key is no longer needed when every model of an enforcing agent.auth: api-key repository is served by a provider allow-listed for it.
  • Smaller: result.json records each stage's model cost, fugaro budget preview gives a worst-case ceiling for a batch (and a typical: line from your own runs), derived image builds no longer print mise's cache Permission denied warning, and the hidden fugaro ls pointer is gone (fugaro runs ls is unchanged).

For operators

  1. Upgrade the CLI (brew upgrade dimipaun/tap/fugaro, or this release's archive with its cosign check), and install cosign on your PATH (brew install cosign, or your distribution's package): fugaro init --base and fugaro image refresh refuse without it, and fugaro doctor names it on every run.
  2. If you use the budget backend, deploy its rules before any runner image moves: with the new CLI, fugaro init --firebase <firebase-project-id> (add --print-vars first to see what it writes; docs/gcp-setup.md's "Turning the shared budget on" section has the read-only check of what landed) writes the new per-run-cap rules as the last write of its database step. Also point Application Default Credentials at your installation's project — gcloud auth application-default set-quota-project <gcp-project>, with the Cloud Billing API enabled there — because init and doctor read billing through that quota project and name it when the API is off.
  3. Then fugaro upgrade in each checkout (its cloud step is fugaro image refresh): it now pins the release's base image through the installation's registry remote repository at the digest whose signature it verified, and rebuilds each workflow that is not yet on it. It asks before every billable build, and the base image must move before any repository's image does, which that command keeps in order.
  4. For project-wide secrets, in this order: (a) in the installation root, fugaro init with no --repo plans the project's secret containers as creates only — one per eligible name, no destroys, no replacements and no update to an unrelated resource — and applying it is your step, not something a repository's job can do; (b) then fugaro secrets set NAME --project-wide for each name stored once for the project (the value is read from stdin, and it takes no --repo; a value stored before (a) is adopted by that apply rather than conflicting); (c) for a repository that adopts a project-wide name while its own copy still has a version, that copy must be disabled before the repository uses the project's — gcloud secrets versions disable needs secretmanager.versions.disable, which is project-owner-only; (d) then fugaro init --repo in its checkout plans replacements of the per-repository IAM addresses, which Terraform's guard refuses until each removal is named with --allow-delete.
  5. If a plan ever tells you it would retire resources, use a binary built from this release: fugaro init --repo --plan-only first (it prints the predicted retirements and, when Terraform's prevent_destroy blocks the plan, refuses with "Rerun with --retire"), then fugaro init --repo --retire, as docs/gcp-setup.md's "Changing auth, or removing a workflow, secret or provider" section describes. An older binary keeps failing on prevent_destroy the way it does today and needs that page's manual terraform state rm route.

Two notes. checkout: clone is not usable in this release: the runner side is in the tree (the blobless --filter=blob:none clone, the mise install provision stage, the prefetch), but the switch that turns it on has not been flipped, so its job cannot exist at all — fugaro init --repo and fugaro image refresh refuse to deploy or move a clone workflow's job, and fugaro run refuses a clone launch on a job image with no release tag or one older than this release, telling you to use checkout: baked. checkout: baked workflows are unchanged, and the flip lands after its own live check. And the two items 0.7.0's notes left unverified have since been checked live on the sandbox installation: the runs bucket's launcher grants (Check 32) and the one base image's cold start (Check 41, ~10.5 s median against the old image's ~11.7 s).

Changelog

  • hardening: the verifier requires the tag-push trigger and repository claims (#388)
  • Config transitions: the retirement's call-site tests, and the docs at the union's real numbers (#383)
  • backend: the Cloud Batch fake and the seam's second backend, held to backendtest (compute-backend Task 2, C8) (#381)
  • Update workflow rules (#385)
  • init --repo --retire: the config-transitions retirement engine (Tasks 1 to 5) (#365)
  • backend: a per-backend name codec and a fail-closed "in the cloud" (compute-backend Task 1, C12) (#380)
  • pricing: an embedded provider price catalog with require_zdr and price_policy (Check 44) (#361)
  • Implement docs/plans/2026-10-14-registry-remote-repository.md (design d… (#362)
  • design: a Docker-capable execution backend on Compute Engine VMs (generic-tool Task 28) (#375)
  • images: sign the pushed base image by OCI digest (plan Task 1, staged in docs/pending-workflows/) (#377)
  • budget: the global per-run cap is the fallback for every repository (phase 0 item D6) (#373)
  • plan: a senior reviewer through a provider route, non-Claude now and Claude by opt-in (#359)
  • generic tool task 18: live check 38 and the setup skill offers checkout: clone (#360)
  • Phase 0: the no-cap refusals name real flags, and the Anthropic key is optional (#371)
  • fugaro.yaml: run limits 2h total, 90m per stage (#376)
  • Docs housekeeping: the cloud-loop lessons, and #318 marked partly superseded (#369)
  • plan (HELD until phase 5): the OAuth token for the senior-reviewer stage, with Check 47 (#363)
  • plan: restore generic-tool Task 28, the compute-instance backend (gen-2 cannot run Docker, so the VM fallback is the path) (#374)
  • Close six low review items with tests (ls exit code, stage cost, selftest, prefetch, project secrets, budget preview) (#368)
  • rename the next release from 0.7.1 to 0.7.5 (#370)
  • images: the legacy-base guard scans tracked files only, so stale worktrees stop failing it locally (#367)
  • design: project-centric Fugaro, the spec reconciled against the code with the owner's decisions (#364)
  • budget preview: the typical line, from the repository's own recorded runs (#357)
  • project-level secrets and provider keys: store once with --project-wide, shared by allow-list (#343)
  • design: retire the base image's registry copy with an Artifact Registry remote repository (#353)
  • checkout: clone: the job clones blobless at start, installs its mise tools, and the runner prefetches what reviews need (#342)
  • design: a built-in provider price catalog with ZDR and any-provider price ranges (#354)
  • selftest: ~/.cache/mise must be a fugaro-owned directory that fugaro can write (#352)
  • result.json records each stage's model cost (model_usd and model) (#348)
  • design: config transitions, retiring cloud resources a changed fugaro.yaml no longer describes (#344)
  • design: mixed credentials and a stronger senior reviewer in the cheap-coder loop (#349)
  • plan: drop generic-tool Tasks 26 to 28 (gen-2 has no Docker); Tasks 24, 25 and 29 may ship in 0.7.1 (#347)
  • fugaro budget preview: a rough worst-case ceiling for a batch against the caps (#351)
  • Delete the hidden fugaro ls tombstone (it is now an unknown command) (#350)
  • fugaro.yaml: raise agent.max_budget_usd to 150, since Claude Code's own estimate for DeepSeek is about 25x the gateway's charge and stopped two runs at 0.13 and 0.22 dollars (#345)
  • base image: create ~/.cache/mise as fugaro so a derived build's cache mount stays writable (#341)
  • fugaro.yaml: the cloud loop on api-key with DeepSeek (coder and reviewer through OpenRouter); drop the oauth-era budget block (#340)
  • live checklist: Check 41, the one base image's cold start (passed) (#339)
  • live checklist: Check 32 run on 2026-10-14 (passed) with its FACT lines and four corrections (#338)
  • fugaro.yaml: the go workflow drops base: go (Task 22 step 4: the repository runs on the one Fugaro base) (#336)

Base images

Published by the images workflow for this tag:

  • ghcr.io/dimipaun/fugaro-history:0.7.5 and ghcr.io/dimipaun/fugaro-history:0 (the sweeper and history job's image)
  • ghcr.io/dimipaun/fugaro-base:0.7.5 and ghcr.io/dimipaun/fugaro-base:0 (one index for linux/amd64 and linux/arm64; per-architecture tags 0.7.5-amd64 and 0.7.5-arm64)

The images workflow then pulls each one with no login and fails if it is not public or lacks linux/amd64 (and, for fugaro-base, linux/arm64); each image's digest is in that run's summary.

The Terraform modules, the schemas and the plugin are versioned by this same tag.