Skip to content

v0.8.5

Choose a tag to compare

@github-actions github-actions released this 18 Oct 20:32
· 669 commits to main since this release
Immutable release. Only release title and notes can be modified.
01d2e05

Fugaro v0.8.5

Install:

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

Highlights

  • A project can now be managed: fugaro init --create-project --gcp-project ID --managed --budget N --budget-currency CCC --billing-account ID creates one in which a coding agent's Terraform is applied by fugaro managed apply with no prompt, because a deterministic gate over the saved plan (a resource-type allowlist, the plan's cost-bearing attributes, the exact delete list you write with fugaro allow-delete, and a recorded budget) decides what may change, and the apply runs as a dedicated deployer account, never as you.
  • fugaro restore NEW_PROJECT_ID ROOT rebuilds a lost managed project from zero into a fresh project ID through the same gate; it is owner-run, asks for the project name at a terminal, and refuses a coding agent's session.
  • A managed project's budget (1 to 10,000,000 whole units in a three-letter currency) is recorded in a marker that no credential a run or the deployer holds can write, and its billing-account budget sends 50%, 90% and 100% alerts that only notify.
  • A project's policy can define job profiles, fugaro init deploys one shared Cloud Run job per profile and provider (GitHub only: a Bitbucket profile gets no job), and a workflow selects one with job_profile: (fugaro validate checks the name's form), but checkout: clone stays refused, so no run completes on a shared job yet.
  • fugaro run --title TEXT names a run in fugaro watch, fugaro runs ls and the pull request it opens (unless the agent writes its own pr.md), where the first line of the task named it before.
  • The desktop console ships as its own signed, notarised macOS release, console-vX.Y.Z: it reads an installed fugaro, opens on the installation you pick, shows a reduced view with a banner when that fugaro is outside the 0.7 and 0.8 minors it was built for, refuses to draw its dashboard below 0.6.0, is read-only, and does not update itself; the CLI also gains fugaro config list, fugaro plan graph and a files-changed record per run in fugaro runs ls.

Terraform 1.9 or newer is now required, and fugaro init and fugaro managed apply check for it (see the first operator step).

For operators

  1. Upgrade Terraform to 1.9 or newer wherever fugaro init runs (terraform version). The floor is new in this release: the project module this release adds validates one variable against another, which Terraform allows only from 1.9, while 0.8.0 and 0.8.1 declared >= 1.7.0 with no such validation, so an installation on 1.7 or 1.8 first meets the requirement here.
  2. Upgrade the CLI everywhere (brew upgrade dimipaun/tap/fugaro, or this release's archive with its cosign check), including CI pins and teammates.
  3. Run fugaro init once per installation, in your own terminal. Its plan adds the managed-project pieces to every installation, managed or not: the fugaro-deployer account with its two custom roles, a custom Cloud Asset reader role, and the Cloud Asset API. Read the plan and type the project name.
  4. In each checkout run fugaro upgrade (its cloud step is fugaro image refresh) so each job runs a runner image built from 0.8.5; this also pins the plugin, which carries the updated setup skill.
  5. Run fugaro doctor. An installation that published a project policy under 0.8.0 or 0.8.1 gets policy-older-than-binary, and until it is fixed fugaro run refuses that project's launches: run fugaro project policy publish --delete, then fugaro project policy publish, after step 4 (an older runner refuses a version-2 policy).
  6. Run the owner-run live checks for managed projects (67 and 68) against a real sandbox project, after the release: neither has been run before the tag, and neither has its steps in docs/gcp-live-checklist.md yet (what each must assert is in docs/plans/2026-10-16-managed-projects.md), so writing them comes first.

fugaro init --firebase is not needed for 0.8.5: no managed or project-policy change touches the database rules. The rules on main also carry a mailbox for the mobile app, as generation 2, still undeployed. Installations whose marker is generation 1 get a policy-rules-skew warning from fugaro doctor in the meantime; it is not a failure: a generation-1 installation still reads and enforces its published policy and can still publish another. Run fugaro init --firebase only when you want that warning to go away, or the mailbox, with a 0.8.5 binary and in your own terminal.

The console's own owner steps — the first signed build and its Gatekeeper verification (Check 59a) — belong to the console's release, console-vX.Y.Z, and not to this one. The console has no auto-update, and the round trip that would check one (Check 59b) needs a published update feed, so it is a later task and not a step of this release.

Known limits

  • An existing project cannot be made managed. There is no command for it in this release (planned for 0.9.0): a managed project is created fresh with --create-project --gcp-project ID --managed --budget N --budget-currency CCC --billing-account ID, and init on a project that already exists warns that the flag was not applied.
  • The project inventory and the created-resources fallback are not wired into managed apply. The inventory is built and tested, but the apply takes no inventory, so a resource created outside Fugaro in a managed project is not detected, and in a coding agent's session a plan the allowlist admits applies without a confirmation. The plan gate, the exact delete list, the budget gate and the plan-hash re-check still apply; wiring the inventory is unscheduled, with flagging existing projects in 0.9.0.
  • The marker and the delete list stop the accident, not an agent that goes around the program. A coding agent shares the session's user and its credentials, so it can write fugaro/managed.json or the delete list itself, or apply directly; what the marker, the delete list and the gate stop is a session that goes through fugaro managed apply.
  • There is no billing hard stop. The budget alerts only notify, the marker's amount is the alert amount, and nothing stops spending.
  • The delete list holds resource addresses, not identities. An address stays approved after the delete it approved has been applied: nothing prunes the list (unscheduled).
  • A shared project job cannot run a clone checkout. checkout: clone is refused for it in this release.
  • Compute-module IAM grants stay refused, and compute network types are excluded from managed plans.
  • The Cloud Batch job-name check is a latent fail-safe in this release, since the Compute Engine/Cloud Batch backend is not shipped.

Changelog

  • docs/releases/v0.8.5: shared project jobs are GitHub-only (6816c0a)
  • docs test: rule 9 of the console plan names every SECURITY-SENSITIVE heading
  • website W3.2: Google Analytics 4 behind the consent gate, with a pinned minimal CSP (#610)
  • doctor review: pin the model-level fixes to policySince, the version table's other side
  • projectpolicy review: every too-new refusal names the release that introduced the node's version
  • projectpolicy review: failing tests for the version table beside projectpolicy.Version
  • website P5: the homepage's promise and first command above the fold, Getting Started opens with its commands (#603)
  • project jobs: say where the Bitbucket token is refused, now that a profile is skipped
  • project jobs: a Bitbucket profile gets no job, and no launch is sent to one
  • console: accept runview.Row's title key from fugaro run --title
  • managed apply: a plan may grant a role to a configured budget admin
  • restore: the base images of the lost project's registry go too
  • website: the changelog page renders a release file's Known limits section (#607)
  • projectpolicy: clone_urls refuses one repository named twice
  • docs/plans: keep console's "2.0, 3.3, 4.1" run with main's 2.4 in rule 9
  • Measure a run's workflow changes between the commit it was cut from and its base branch (#593)
  • release gate review: every non-green shape, the CLI checks, the matrix derivation, the main-only precondition
  • doctor: the too-new policy fix names the introducing release
  • policy skew: a too-new policy version names the release that introduced it
  • website: the README's pending-workflows claim holds with the console's kept copies
  • mobile P6.2 review: the package README names confirm's two siblings
  • mobile P6.2 review: the README states P6.1's phrase and P6.3's record
  • mobile P6.2 review: mutation-proof patterns follow the renamed target kinds
  • mobile P6.2 review: confirm with P6.1's phrase, authorise P6.3's action record
  • mobile P6.2 review: failing tests for P6.1's phrase, P6.3's action record and invisible characters
  • scope: revert the console app and unrelated doc edits out of the Task 4.6 PR
  • shared: mailbox-schema guard count is 78 with the direction
  • shared/mailbox-schema: bind the direction into the tagged bytes
  • website redesign P6 + P3 + P7: copy buttons, two-level menu with mobile drawer, homepage run animation (#575)
  • shared: the mailbox-schema guard count is 72 after the review fixes
  • shared/mailbox-schema: review fixes to canonicalBytes, refusal vectors, compat and Go notes
  • console: activate, the picker's removal seam, and three stale maps
  • console redaction, version skew and the two preload boundaries
  • website: cut page text, gate provenance phrases and word ceilings, summarise long pages (#572)
  • mobile P6.1 review: recognise a punctuated wake word, refuse invisible characters
  • console spawn: a spawn that never started is a decided end, and the flags and --pr guards hold
  • mobile P6.1 review: failing tests for punctuated wake words and invisible characters
  • console docs: runs ls's title is task-derived and unsanitised
  • fake gh: fail closed on a check name it has no arm for
  • gate test: exercise the cancelled-run coexistence rule
  • task, cli: a stored title must be in its sanitised form; the gate names an inherited title
  • console: a failed build and an ended watch are read again, and a late report is not drawn
  • shared/mailbox-schema: the README's test count too (40, not 37)
  • website redesign P8: How It Works rebuilt as a four-step flow, and put on the homepage (#574)
  • website: stage the preview and promote workflows for the owner to copy (#566)
  • shared: the docs for the tag's own file, the code-point order, and two gaps
  • console: the screen specs read their own mount, not the entry's dashboard
  • shared/mailbox-schema: the absent-field refusal says why, and a guard needs that
  • shared/mailbox-schema: the tag moves out of the entry point, and the sort is by code point
  • release gate test: name each console leg case after the derived check
  • console v2 reads: a test that config list and plan graph write nothing
  • console v2 reads: bound the changed-file set on read, cap the graph artifact, review fixes
  • release gate tests: the fake gh answers for the console matrix legs
  • mobile P6.2: say exactly what INPUT_REFUSALS is
  • run --title: pin the gate on follow-ups, on a retry, and on invisible-only titles
  • mobile P3.1: serialise the store's mutations, close every open account, fence the imports
  • run --title: the review's five fixes to the gate, the queued rows and the docs
  • release gate: require both console matrix check runs (console plan Task 4.6)
  • shared/mailbox-sim: the README's three stale claims about P6.3
  • console: the two specs that read the dashboard document's own markup
  • mobile P6.1: the router's contract, written down
  • mobile P6.1: the router's copy guard, and the mutation proof
  • console: follow runview.Row's new changed_files key (schema, contract, test)
  • mobile P6.2: document the machine, and list it where the package lists its modules
  • mobile P6.1: the wake-word router and the app-command grammar
  • shared/mailbox-schema: pin the merge's target and head SHA in the vectors
  • console: the console stops the child it started before the process leaves
  • shared/mailbox-schema: the README for what P6.3 added
  • mobile P6.2: a target with no kind is missing a field, and the tests say so
  • shared/mailbox-schema: fix four stale mutation patterns
  • mobile P6.2: an unresolved target has one owner, not two
  • console: a read that arrives while the console is switching joins the build
  • shared/mailbox-schema: the agents' field set, an unsigned heartbeat, and the mutation proof for every P6.3 guard
  • mobile P6.2: mutation-prove the confirmation guards
  • shared/mailbox-schema: prove the deep copy, and pin the float refusal
  • mobile P6.2: the spoken-confirmation state machine (D169, D162, D128)
  • mobile P6.2: the spoken-confirmation tests and vectors, before the machine
  • console: the dashboard document ships nothing for the entry to draw over
  • shared: carry the required mac in the consumer fixtures, and document the new codes
  • shared/mailbox-schema: the P6.3 fields (agent, kind, options, reply_to, action) and the required MAC
  • website redesign P1 + P2: the status correction, and the accent the logo actually is (#568)
  • console: a build that lands after the installation was removed binds nothing
  • run --title: the batch and review launches name themselves too
  • mobile P3.1: closeCurrent's tests, and the invariants it shares with switchTo
  • mobile P3.1: the settings word list was judging the owner's own account id
  • console: a read that fails to answer is a sentence, not a rejection nobody caught
  • mobile P3.1: forget() must not gate a delete on a read, or it orphans credentials
  • build(deps): Bump goreleaser/goreleaser-action from 7.2.3 to 7.3.0
  • build(deps): Bump actions/setup-java from 6.0.1 to 6.1.0
  • console: a screen a read landed late for does not replace the one on screen
  • console: the entry spec is held to injecting no code into its window
  • mobile P3.1: D111's item names live in one list, not three
  • mobile P3.1: the app's own gitignore, before the first install
  • run --title: the clone workflow's half of the gate, and its proof
  • console: the navigation marks the view on screen from the first paint
  • mobile P3.1: the shell, the config, and the scan that names the writers
  • console: the e2e reads the log for the two spawns a healthy console makes
  • mobile P3.1: the two device ports, and the one decision the Keychain one makes
  • run --title: pin the two surfaces that read it in the job itself
  • mobile P3.1: two fences that could not fail, and one that would have bitten
  • run --title: pin the store, the validation and the sanitisation
  • mobile P3.1: the account store, its switch order and its isolation property
  • console: the in-flight case holds a read open after the poll has started
  • console: the wiring is driven in a unit suite, and a run's record is not guessed
  • mobile P3.1: the installation tuple, the two items, and where each may live
  • task: an explicit job title in the spec, with the one rule that reads it
  • shared P1.5: the lease's skew rule and the ledger's ack, exercised through the harness
  • console: one fake document for both entry suites
  • mobile P3.1: the app skeleton, its glob test script and its red step
  • console: the stub fugaro answers the dashboard's reads, and refuses the rest
  • console: the entry mounts the screens the gate would draw, and polls the feed
  • console: the main process binds a real CliSource to the active installation (Task 3.4c)
  • console: the two reads said in the design, where the record is described (V2.1.2)
  • console: the changed paths read once the run's commits are final (V2.1.2)
  • console: changed_files in the record schema, and the two goldens re-recorded (V2.1.2)
  • console: the changed-file record written down, and the fields it may not carry (V2.1.2)
  • console: every e2e launch gets a fresh profile, and a console that opens no window says so (Task 3.4b)
  • console: the files a run changed, recorded by the run itself (V2.1.2)
  • console: the handshake reads the active installation and no other, and the picker's review round (Task 3.4b)
  • console: the graph schema written down, and the contract that names it (V2.1.1, V2.2.1)
  • console: the plan graph, read and refused (V2.2.1, V2.2.2)
  • console: the v2 decisions pinned, and the check-number re-read recorded (V2.0.1, V2.0.2)
  • console: fugaro config list --json, the installations as a document (V2.1.1)
  • console: the first-run picker's dismissal is read from its close event, and cannot quit the console (Task 3.4b)
  • console: a picker closed while it loads is dismissed, not a reason to quit (Task 3.4b)
  • Add console release workflow
  • console: build.files ships the bundle and the preload, and the run spec counts its own mount (Task 3.4a)
  • resync #533: fix the tests the merged tree broke, keep the setup skill's pinned phrases
  • website: regenerate the CLI reference after the resync (managed, managed apply, restore)
  • managed: the apply-time budget read, the block, and the opening of the apply gate (Task 4.4) (#555)
  • console: two more stale counts, in the files this task added
  • console: the plan's status is one fact in five places, and its guards grow (Task 3.4a)
  • console: the reduced console's live refusal, pinned to the sentence it is (Task 3.4a)
  • console: the view's own doc says the sanitizer draws, not the view
  • console: the picker draws through the display layer's one door
  • console: the reduced console's live read is refused by the source, named (Task 3.4a)
  • console: the review's nine, and the picker that actually picks
  • console: the four entries build.files must gain when #540 lands (Task 3.4a)
  • console: the entry, in a real window, over real IPC (Task 3.4a, step 5)
  • console: the comments the #541 review found stale, made true (Task 3.4a)
  • restore: fugaro restore, a from-zero apply into a fresh project ID (Task 5.2) (#545)
  • console: the signing and notarisation pipeline, staged (plan Task 4.2) (#548)
  • console: two test-source defects a compile would have caught
  • console: the preload on the dashboard only, and the surface only after a handshake (Task 3.4a, steps 1-3)
  • console: the macOS bundle, its entitlements and its fuses (Task 4.1) (#540)
  • console: the picker's document, its bundle seam, and the build.files handoff
  • console: the renderer bundle, the served root, and the script the document loads (Task 3.4a, step 4)
  • console: fold in the two Lows from the #541 review (Task 3.4b)
  • console: the installation store, its validation, and the picker window (Task 3.4b, part 1)
  • Implement TASK 4.2 of docs/plans/2026-10-16-managed-projects.md: "The b… (#542)
  • cli: the managed refusals, their names and their exit codes (Task 3.2) (#544)
  • plan: Task 3.4, the renderer entry (preload, handlers, installation picker), proposed (#554)
  • tf: the supported Terraform floor is 1.9, not 1.7 (#553)
  • console: the startup handshake, and the mode told to the renderer (Task 3.3) (#541)
  • Follow-up: the reviewers' non-blocking items on the mailbox rules (#532) and the mailbox module (#537) (#552)
  • shared P1.5: the four findings the review raised
  • mobile P2.1 + P2.2: the mailbox subtree, its read grants, the golden and the generation bump (#532)
  • shared P1.5: the README says which values the harness hands over
  • shared P1.5: the survivors the mutation proof found, and the tests that kill them
  • shared P1.5: the simulator's README, its mutation proof, and the module list
  • shared P1.5: the deterministic mailbox simulator
  • shared P1.5 (red step): the mailbox simulator's tests, before the simulator
  • Task 4.3 of the managed-projects plan (docs), and the review fix to the project-job account axis (#517)
  • README: link the live website, fugaro.dev (#549)
  • shared P1.1: the mailbox's state machine, dedupe ledger and replay window (#537)
  • website: the secondary domain is struck — there is one domain (owner ruling 2026-10-17) (#546)
  • Add console workflow
  • website W1.12: the consent banner, and an analytics gate that loads nothing before consent (#543)
  • website W2.2: the canonical URL, the redirect, and checks 69a/69b in the register (#535)
  • cli: fugaro managed apply, the apply of an agent-authored root as the deployer (Task 3.1, D55/D76) — SECURITY-SENSITIVE, independent opus review (#527)
  • website: the FAQ is approved, so the pending-review notice goes (D103) (#539)
  • managed: a listed delete is admitted only if the resource is inside the allowlist (#520)
  • tf: the Cloud Asset read role is a custom role holding only searchAllResources (#519)
  • plan: Task 3.3, the console version handshake wired at startup (MVP release gate) (#534)
  • feat(shared): the consumer lease, in the shape of runstore.Claim (mobile P1.2) (#526)
  • console: the version skew handshake (Task 3.2) (#514)
  • feat(shared): the digest, the severity rule and the redactor (mobile P1.3) (#524)
  • feat(shared): the staleness and offline rule (mobile P1.4) (#521)
  • website W1.11: the gates (links, anchors, accessibility, origins, byte budget) (#530)
  • shared P0.3: the URL validator, written once (#525)
  • Mobile P0.2: the message schema and its validation (#522)
  • website: brand assets from the logo, icons + manifest, and an owner-run deploy script (#531)
  • config: raise agent.max_budget_usd to 500 (#529)
  • website: the global base styles and the page chrome (the tokens were never applied)
  • feat(website): the FAQ with provenance, and a community page that links rather than restates (#500)
  • fix(console): person knob wording says off by default, this session only, not remembered; comments scoped to reachable until
  • feat(shared): the skeleton's module, which turns the red step green (mobile P0.1)
  • feat(shared): the shared package's skeleton and its glob test script (mobile P0.1)
  • console: the spend controls' review fixes -- a scoped gap assertion, and no overclaim
  • console: wire the spend screen's range and breakdown controls through the allow-listed report read
  • console: the spend controls' tests, before the wiring (Task 2.4's red step)
  • tf: the deployer's roles are held by the deployer alone, and the deployer holds nothing else
  • console: ambiguous escape sequences read every way per sequence, the union redacted; line breaks end a sequence; whole markers; O(log n) burn history
  • run: the OAuth refusal reads the resolved auth, and says only what it knows
  • tf: pin the same-named resource at another module path with real plans, note the nested-module provider refusal
  • tf: the installation golden is pinned to carry the deployer, and the scheduler-account fixture names the scheduler's account
  • tf: a resource's unknown project is admitted only when it leaves project to its provider
  • managed: terraform fmt of deployer.tf, and the state-bucket test passes the options markCreated now reads
  • run: the OAuth refusal's tests assert the budget token on an enforcing installation
  • console: one linear scanner strips terminal sequences in all three layers, ambiguous CSI read both ways, gap stamped on the CLI clock, now refused when unparseable
  • run: refuse an OAuth launch onto a shared project job before it starts
  • feat(website): the console section, as a placeholder that renders no link (W1.6) (#495)
  • tf: a managed provider block's project is admitted written out only
  • run: the OAuth refusal's tests, red (plan task 3.4a)
  • managed: Verdict.Flags, service scaling cost rules, consistent type refusals, pinned classes
  • tf: resolve a provider block's project through module calls, and fail closed
  • website W1.9: the changelog page, rendered from the release notes (#498)
  • console: stale rebuilds draw each sample once, refusal screen sanitizes again, ANSI sequences stripped before the credential rules
  • website W1.5: getting started, and the caps-and-costs guide (#496)
  • tf: the round-2 review's fixtures, red against the provider project rule
  • website W1.7: the docs hub, linking the guides and rendering the generated CLI reference (#499)
  • managed: the cost list's blocks are enforced in the gate's verdict; the flag-only path is tested
  • managed: the deployer's grants, checked at the type the plan is about (PR review 1-3)
  • tf: the cost list reads only properties a plan actually states
  • tf: read the project a provider block lands in, and the billing account before the type
  • tf: the review's three fixtures, red against the cover they found
  • managed: the marker scan reads Task 1.5's literal roles and its one fenced write
  • tf: pin the job's min-instances path against the golden plan's nesting
  • init: --create-project --managed on an existing project warns it was not applied
  • tf: state each cost class as one value, not a name beside a set
  • managed marker read: unknown version really tested, v1 budget refused twice, negative amount row; symbol citations
  • managed: the managed creation sets up D77's state bucket and binds the deployer to it
  • tf: the cost-bearing attributes, flagged and blocked, never estimated
  • tf: the managed plan's attribute checks, re-derived and closed
  • feat(website): the hero, the terminal and the architecture diagram, from the repository's own words (#502)
  • managed: the deployer account, its two custom roles, and the impersonation the apply assumes
  • tf: the managed plan's attribute fixtures, red against a cover that checks none
  • managed: D77's dedicated state bucket, created and bound by the managed creation
  • managed: the deployer account the apply assumes, and its three refusals
  • console: goldens are per platform, and the staged CI is green without them
  • console: an optional boolean is refused by name, and the degraded screen draws warnings[]
  • console: a slash-free slug and the two 'every repository' values are drawn, not n/a
  • console: the refusal door, the recorder and the display layer redact the same credentials
  • managed cover: refuse irreversible retention locks; update fixtures per rule family (PR #483 review 6)
  • console: a one-shot read's indented document is read whole, not line by line
  • feat(website): the security page, rendered from SECURITY.md and nothing else (W1.8) (#497)
  • cli: the marker tests assert absence in a bucket that exists (PR #488 review, finding 7)
  • managed inventory: a null listing element falls back; tests kill the paging and matching mutations (#489)
  • secrets: MISSING checks the names the repository's jobs mount (review round 2)
  • fix(website): YAML quote and comment rules, sitemap read from the config, unknown keys refused in nested maps
  • console: the review's second batch, and the shapes it says were untested
  • console: the refused sentence has one door, and the sidecar owns no log
  • managed cover tests: the inert plan keys and an empty unknown object, each carrying something
  • plan: Task 4.4 must ignore GCP-created assets by type; Check 67a's ADC quota project (#489 review 4, 6)
  • managed: the whole-project read is bounded in pages, assets and time (#489 review 3)
  • managed: an empty listing falls back, and an accounted entry matches type and whole path (#489 review 1, 2)
  • allow-delete: the review's four fixes
  • fix(website): README pending-workflows list true and pinned, Regenerate-column flags checked, Node claim states what was verified
  • managed cover: provider settings, actions, deferred changes and ephemeral references refused; standard repositories only
  • fix(website): read an inline YAML comment as a comment, and refuse what the reader has not been taught
  • console: the four conditions, drawn under the console's own CSP
  • console: the ways round the screen-literal scan, closed
  • skill: the setup skill does not read the MISSING signal off doctor
  • feat(website): design tokens and three palettes, each passing contrast in a test (W1.2) (#491)
  • console: the console's own states, and what it refuses to invent
  • fix(website): make the README's pending-workflows claims true, pin them, and check literal CLI flags
  • plan: the owner's go of 2026-10-17, recorded at the approval gate
  • managed: the role asserted from the module, and the detail's own service
  • terraform: the installation grants the inventory's read role, and the gate names it
  • feat(website): the base layout, a content pipeline that fails loudly, and the reduced-motion base
  • skill: the setup skill keeps the sentences its tests pin
  • fix(website): hold the README to the tests its gate selects, and to the two kinds of generated file
  • fix(website): the tsconfig comment about strictNullChecks was backwards
  • init: a managed creation requires the budget amount, and records it
  • managed cover: refuse what runs at apply, local sources and paths in names
  • skill: the setup skill reads the new column, within its byte budget
  • managed: the creation fact records the amount a managed creation chose
  • init: the tests for a managed project's required budget amount, red
  • secrets: ls says when the repository's own half of "required" was not read
  • managed: the inventory's no-read case reads as two cases, not a loop
  • secrets: the MISSING column's tests, and the row for an empty container
  • terraform: the installation enables the Cloud Asset API the inventory reads through
  • managed: the whole-project inventory, and the fallback to confirmations
  • managed: the whole-project inventory's red step — a read that cannot be made is not a clean project
  • secrets: ls says which required secret is missing, and still never reads a value
  • feat(website): the Astro shell, a pinned toolchain, and a build that needs no network
  • console: the replay ring is bounded in bytes, kept by its caller, and says its export is raw
  • console: the person-class test typechecks under noUncheckedIndexedAccess
  • console: the log window keeps the newest lines, and a CRLF line is not one character long
  • website W0.2: the site's facts, the boundary test, and the console-link rule (#480)
  • console: every person field is held to the person class by a test
  • console: the screen-literals scan sees every way to the screen, not only literal(
  • managed: delete-list tests for a failed bucket read and a nil client
  • console: a cap row's slug reaches its attribute only through the sanitizer
  • console: the Projects e2e tells enrolled from seen
  • console: the replay export uses the fixture writer's serializer
  • console: the Run detail log window has a producer
  • managed: delete-list tests for the mutations that survived
  • console: no screen hands literal a string it did not write
  • console: the review's four -- a panel with two documents, a compute that is not free, and a ring held in stamp order
  • managed: refuse every computed name, account and member; pin actions, imports, OIDC
  • console: the two screens' goldens, and a run id the sanitizer will draw
  • console: the Run detail screen -- the ledger, the stages, and the replay scrub
  • console: the Projects screen, where every panel names its source
  • console: the replay buffer, bounded twice and exported as a fixture body
  • console: spend goldens land under spend/, out-of-range rows are not plotted, the inert controls are named
  • console: the spend screen's limits where the CLI puts them, and no dead gap
  • console: review round of Task 2.2 -- the mutation proofs, the gap legend, and one extra test
  • console: the spend screen in a real window, with a golden per theme
  • console: the spend screen, with the three accounts kept apart
  • console: the spend screen's three accounts and its caps panel, red
  • console: test the Live screen's own guard for a burn that is not known
  • console: review round 2 of Task 2.1 -- a missing golden fails, own-key health lookup, explicit unknown flags
  • Implement TASK 6 of the compute backend (docs/design/compute-backend.md… (#424)
  • managed: review round 2 — roles/viewer refused, and the rules no test reached
  • docs, cli: say which runs work on a shared job today; warn on a secret-bearing profile with no allow_repos (stack review 3-6)
  • console: review round 1 of Task 2.1 -- the golden's update mode, a null age, and the bars
  • cli: init-level test that a project job's delete is refused whatever --allow-delete names (stack review 2)
  • cli: a repository on another provider than the profile's stays on its own job (stack review 1)
  • console: the live screen in a real window, with a golden per theme
  • console: the live screen, dense and honest (Task 2.1)
  • console: the live screen's row model and flags, red
  • console: review round 5 of Task 2.0 -- punycode never throws, webhook paths normalised
  • managed: the review's findings — assertions that could not fail, and guards nothing reached
  • console: review round 4 of Task 2.0 -- the URL host, entropy after a dot, webhooks, mutation gaps
  • cli: logs and diagnose refuse a gone execution; refusals no longer name the other run (#460 review D1, D2)
  • console: review round 3 of Task 2.0 -- a credential in a URL, the NFKC bound, read to close
  • runner: a project job refuses a checkout it did not make (review C5)
  • tf: the managed project's resource allowlist, one justification per entry
  • tf: the managed allowlist's fixtures, red against the inherited list
  • runner: hold a per-repository remote to exactly the provider's host (review C3)
  • runner: refuse an unclaimed cloud process with no execution (review C2)
  • projectpolicy: bump the policy Version to 2 for the profile gate (review C1)
  • console: the host class draws every machine name as the placeholder (Task 2.0)
  • console: pin the entropy threshold from below, and replace a tautological assertion (Task 2.0)
  • console: a closed spawn log stays closed, and verifyCandidate closes the log it opened (Task 2.0)
  • console: runs --since is bounded in magnitude exactly as time.ParseDuration bounds it (Task 2.0)
  • console: assertSpawnSurface holds takesProject and dirFlag to rules 3 and 5 (Task 2.0)
  • console: notices get the recording's people, and an unterminated last frame is kept (Task 2.0)
  • managed: the plan gate fails closed on a guard error, and the review's tests
  • console: the header says which part of the two copies is held equal how (Task 2.0)
  • managed: the read's error names the project whose plan could not be read
  • console: a commit digest is not a label, so the entropy net stops eating it (Task 2.0)
  • managed: the plan's path through the guard and the cover, and what a refusal does
  • console: the README counts what the scan found, and the deep-nesting test is green (Task 2.0)
  • console: the display layer re-runs the recorder's pattern classes, and the claim that it did is now a test that can fail (Task 2.0)
  • project jobs: fix round of the #447 review
  • managed: the marker scan reads the project module's grants
  • console: the closed record shape lists every key runview.Row writes, and stops reading a cost key that does not exist (Task 2.0)
  • console: the fixture writer serialises with a stack, so a deep line refuses instead of crashing (Task 2.0)
  • managed: the property covers the stage loop's agent gate, and every agent site of init has a case
  • projectpolicy, runner: fix-round items B2-B6 of the #407 review
  • console: the README counts the literals the hygiene test found, not estimates them (Task 2.0)
  • console: no line of this repository carries a secret-shaped string (Task 2.0)
  • console: the README says what the five states, the eleven classes and the two shapes are (Task 2.0)
  • console: both document shapes, and nothing else (Task 2.0)
  • console: the text path, and the fake secrets its tests need (Task 2.0)
  • console: the sign is decided after rounding, so a small negative is not -$0.00
  • managed: the property's oracles are written by hand and it runs the real paths
  • cli: the outcome comment names the marker-warnings test that exists
  • managed, cli: allow-delete writes nothing after a failed read, and only over the list it read
  • console: every number carries its state (Task 2.0)
  • skill: the delete list's writer is a speed bump, not a boundary
  • tf, managed: the guard approves a whole address, never a prefix or part of one
  • managed: the one-project create flow writes the marker, and only once
  • cli: a removal refusal that names no flag fugaro allow-delete lacks, and the marker's warnings in the result
  • clidoc: one main for both generators, and regenerate the CLI reference (#477)
  • managed: the property runs over the apply path's own seam, not only the rule
  • managed: the property test that a non-managed project never skips a confirmation
  • managed: the property test's red step — a non-managed project never skips a confirmation
  • managed: what the delete list is not, the strict read, and the removal it asks about
  • website: the install facts (website/data/install.yaml) and the test that pins them to the repository (W0.1) (#471)
  • feat(stats): fugaro stats runs, the owner-run aggregation (website W0.3) (#470)
  • website W0.4: the CLI reference, generated from the command tree (#468)
  • managed: the object read's failure surface, and the marker's exact shape
  • skill: the deletes paragraph as the object, its writer and its read
  • managed: the write holds the read's cap, and the read holds the whole body
  • console: pin the contract-field exemption and the per-string NFKC bound against their mutants (Task 1.4)
  • managed: pin that the read is about the GCP project, not the name
  • console: the README says how the redactor now matches people and what it refuses (Task 1.4)
  • console: match people after the pattern rules, in linear time, to a fixed point (Task 1.4)
  • managed: the refusal names the owner's list, not a flag
  • managed: the marker read, project-number-checked and failing closed
  • skill: a managed project's deletes, and the room to say it
  • cli: fugaro allow-delete, the owner's writer of the delete list
  • managed: the owner-written delete list, and the guard's allow-list read from it
  • managed: the delete list's tests, before the reader (red step)
  • managed: the run-account scan is an allowlist, and reads what it cannot parse as a finding
  • managed: pin the AddFirebase branch of --create-project as marking nothing
  • console: the README and the redactor's header say what the redactor now does (Task 1.4)
  • console: the redactor's tests and comments use invented names, not the owner's (Task 1.4)
  • console: pin the redactor's caps and its person audit against their mutants (Task 1.4)
  • console: the recorder bounds a line by the redactor's cap and folds look-alikes before the belong check (Task 1.4)
  • console: the redactor runs in linear time, caps its input, and closes the third review's holes (Task 1.4)
  • managed: the scan's own blind spots, and the no-op test's vacuous rows
  • console: the README says what the redactor and the recorder now do (Task 1.4)
  • console: the recorder writes safely and tells the redactor the GCP names (Task 1.4)
  • console: close the redaction holes the security review found (Task 1.4)
  • fugaro: uncommitted work at finalize
  • managed: the module scan reads every IAM shape, not one of them
  • managed: the gate at the call site, and the two silent skips beside it
  • console: the header's project is the marker, synthetic or not
  • console: audit the fixture header too, and stop the note tripping a rule
  • console: the redactor the review broke, and the tests that hold it (Task 1.4)
  • cli and backend: every job-naming caller on project jobs
  • console: recorded, redacted fixtures and the recorder that makes them
  • managed: the creation fact, recorded where a run cannot write it
  • console: drain the child's stderr, and let a recording land (Task 1.4)
  • managed: the creation fact's object, its one writer, and what may not write it
  • console: the recorder, and the refusals that keep it honest (Task 1.4)
  • console: the fixture format, its loader and the replay (Task 1.4)
  • console: the redactor a recording has to pass (Task 1.4)
  • cli, gcpfake: the project-job tests, red
  • console: bring the README in line with this round (Task 1.3)
  • console: ignore relative PATH entries, and make the spawn tests portable to macOS (Task 1.3)
  • console: check the private working directory instead of trusting mkdir (Task 1.3)
  • console: cap the live feeds a source keeps, evicting the least recently used (Task 1.3)
  • console: give every one-shot read a deadline and a size cap, and bound the feed (Task 1.3)
  • console: close the Task 1.2 reply and sender-gate gaps in ipc.ts (Task 1.3)
  • console: relate the spawn table to Task 1.2's runSince kind, and make the two guards agree (Task 1.3)
  • console: repair the broken merge in ipc.ts and ipc.test.ts (Task 1.3)
  • fugaro: uncommitted work at finalize
  • console: keep the preload table's literal types, so rule 5's surface is closed at compile time (Task 1.2)
  • console: check who sent an IPC message, and bound what a handler may say (Task 1.2)
  • console: four stop paths and one pairing the surface could still express
  • console: the tests that hold the live subscription's idempotency
  • console: the follow-up round's four findings, and the live feed that was not a subscription
  • cli, projectpolicy: the readers the allow-list edit skipped
  • infra: a project job on Vertex carries Vertex's project and region
  • runner, projectpolicy: a refused remote path and a star in the subject
  • runner: one blank line between openCheckout's two paragraphs
  • projectpolicy: the clone_urls tests, and the node's own spelling in the fixture
  • projectpolicy: the clone_urls block as the node can hold it
  • repourl: the clone URL's one answer, in a package of its own
  • infra: hold the deployed job's account to the runner's recomputation
  • backend: the execution name's own tests — an empty job, and JobOf
  • runner: the project job's whole-run tests — the ordering, the remote, the admission
  • runner: compute and match the job identity, and bind the slug to it
  • runner: the job-identity tests, failing until the decision exists
  • console: the third 'six words', in the alphabet's own comment
  • review: bound the widened grant by module, not by the account's name
  • console: the review's two mutation rows, and the mapping the README now names
  • console: the four review findings, and the guard that would have caught the high one
  • console: one window kind per command, because the two --since are two grammars (Task 1.2)
  • console: what the one child process is allowed to do, in the README
  • console: the two fixes the mutation pass needed, and a table test that does not read the table
  • console: the spawn contract, its tests, and the fake CLI they run against
  • console: say characters, not bytes, on the repository bound (Task 1.2)
  • console: FugaroSource, and the v1 implementation over the child process
  • console: the argv table, the built environment, and the spawn log
  • console: document the allow-list, and make the unknown-name test un-collidable (Task 1.2)
  • console: an IPC allow-list, not a bridge, and the table of things it cannot reach (Task 1.2)
  • tf, infra: cite Check 52's U4 where the SA-count assertion is, and U3's absence
  • tf: one project job and job service account per (profile, provider, account)
  • tf: the project job's golden test, failing until the module exists
  • console: pin the openExternal handover, and put the e2e harness back in one worker (Task 1.1)
  • console: the activate path, and a probe that can see connect-src 'self' (Task 1.1)
  • console: read the post-denial document from inside the page (Task 1.1)
  • console: fix what tsc and vitest found once a Node runtime was available
  • console: pin section 10's twenty answer cells as a table (Task 5.0 review)
  • console: the README's Task 1.1 section, and the mutations it names
  • console: assert the script commands, and drop two stale counts
  • console: the tests that try to leave the hardened window (Task 1.1)
  • console: the hardened window and the app:// document it draws (Task 1.1)
  • console: the design, at the owner's decisions (Task 5.0)
  • console: typecheck the root config, pin the Node, and fix two stale claims
  • console: pin electron-updater, and fix three claims the tests did not hold
  • merge origin/next-0.9 into the profiles branch
  • console: keep Playwright's run artifacts out of the tree
  • console: the toolchain, pinned exactly, with the pinning rule as a test
  • projectpolicy, config, docs: the review's four doc-accuracy findings
  • projectpolicy, docs: the profile's admission gates are task 3.3's
  • localcfg: a shared file never carries the project's profiles
  • runner: a workflow whose job profile the policy lacks stops the run
  • projectpolicy, config, localcfg: a profile's allow_repos and its provider
  • merge origin/next into the profiles branch
  • cli: a publish refuses a profile's explicitly empty allow_repos
  • config, projectpolicy: the review's three fixes to the profile gate
  • projectpolicy: the review's four findings on profiles
  • schemas: the workflow's job_profile key
  • cli: say when a publish drops the profiles the node carried
  • cli, docs: publish the profiles, and print the job each maps to
  • localcfg: profiles, the operator's half of a policy's profiles
  • projectpolicy: profiles, and a workflow's selection of one
  • projectpolicy: profiles, and a workflow's selection of one (red step)

Base images

Published by the images workflow for this tag:

  • ghcr.io/dimipaun/fugaro-history:0.8.5 and ghcr.io/dimipaun/fugaro-history:0 (the sweeper and history job's image)
  • ghcr.io/dimipaun/fugaro-base:0.8.5 and ghcr.io/dimipaun/fugaro-base:0 (one index for linux/amd64 and linux/arm64; per-architecture tags 0.8.5-amd64 and 0.8.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.