Skip to content
All releases

Release

v1.2.30

What shipped, in numbers

126
PRs merged
170,792
Lines added
60,912
Code lines
Code
60,912
Tests
83,142
Docs
26,738
Sum · code + tests + docs
170,792

of 126 merged

  • bug 26 21%
  • feature 56 44%
  • polish 0 0%
  • docs 24 19%
  • groundwork 3 2%
  • unclassified 17 14%

since v1.2.29 · tagged

The letter

What shipped

Numbers that say what they know, and Waves that fills every free slot. 113 pull requests merged since 1.2.29. The Stats screen is rebuilt. It puts your hours at the desk beside the hours your sessions delivered, shows this month's AI cost with how many sessions that figure covers, gives your hours by project, and says when GitHub was last read. A day FlowForge could not read now says so instead of drawing a zero. Time that no work backs is no longer billed: a session a machine closed bills to its last real event plus two minutes, and a closed session can no longer record more time than its own span. A Waves run now refills its slots as workers finish, a waiting sprint shows its plan, and an epic opens its own board across every sprint. On a busy machine, workers now leave the CPU to you first. The roster grows to 53 with fft-lifecycle-marketer. What is not done yet is listed at the end, including the one 1.2.29 said this release would fix.

The Stats screen, rebuilt

  • 🔴 Your day, multiplied. The first card puts your wall-clock hours beside the hours delivered across your sessions, and the factor between them, for example This month · 11.2h wall-clock · 132.3h delivered · ×11.8 (#6098).
  • 🔴 AI cost, with what it covers. One line gives the month's cost and the population behind it: ◇ AI cost $412.80 this month · 61 of 902 sessions carry a cost (6.8%) · 14 calls unpriced. The figure never hides how few sessions it rests on (#6098).
  • Hours by project. p lists every project in the period with its delivered hours, each session credited to the project it started in, (no project) included (#6098).
  • When GitHub was last read. The totals end with GitHub fetched 14:32 · device data live, or say that a refresh failed and the last good read is kept, or that nothing could be read. The pointer ▸ open the desktop pane for the team view names where the team's numbers live (#6098).
  • A day not read says "not read", never zero. A day's merged pull requests read PRs not read yet until GitHub answers, and after a good read a day with no session is a measured 0 h. The first comparisons with the previous period are made at the same point in it (#7537).
  • At narrow widths the daily trends are bars that tell a missing day from a zero: ▁ is a measured zero and · a day not read. Hours per day draw there too, and the row they sit in, which never rendered before, now does (#7538).

Time that no work backs is no longer billed

  • 🔴 A session a machine closed bills to its last real event, plus two minutes. Before, a worker session nobody touched billed its whole span up to a later batch close. A timer you start and stop yourself still bills its whole span. Invoices read the same interval, so an invoice's charged total can drop by exactly that unbacked tail (#6946).
  • 🔴 A closed session can no longer record more time than its own span. The cockpit kept writing heartbeats onto sessions that had already closed. Those writes are now refused. On upgrade, your local store repairs every closed session above its span and keeps each row's original values in a ledger table, and the store itself clamps any later write. Charged hours do not move; disclosed agent-hours can go down (#5305).

Waves fills every free slot

  • 🔴 A run refills its slots as workers finish. A run could hold ready tickets beside free slots and fire none for hours. Now it fires them as slots free, a ticket already merged into the version line is never fired again, and a run that sits on free slots for 10 minutes says so once on ACE's rail (#8132).
  • 🔴 A waiting sprint is a real row. Its row shows its waves and tickets, enter opens its plan read-only with S start now, and b opens the board of the sprint under the cursor, not the running one (#8111).
  • The Waves board sorts rows by state. Running runs and runs that need you sit above the rule, waiting sprints below it in queue order, and finished runs live in History. A move places a sprint only among the waiting ones. Starting a sprint whose run stopped resumes that run, with its letter. Lowercase c on History clears only the done runs (#7978).
  • The waves line is a focus stop. With two runs or more, Tab reaches it; < > pick the run, ↑ ↓ walk the rows and enter opens it. Every live run that fits is shown (#7981).

An epic is its own scope

  • 🔴 enter on a ◉ epic row opens the epic's own board: every child across every sprint and those with no sprint, each card tagged with its sprint when the epic spans more than one. W shows its waves, and a child that waits on a ticket outside the epic is marked ◂ waits for #B. esc returns to the row you pressed (#6160).
  • An epic's critical path says PARTIAL when a member waits on a ticket outside the epic, and names it: PARTIAL — #18 waits on #40 outside this epic (#6162).
  • U asks for the epic's owner, who becomes its assignee and shows beside ◉ EPIC (#7174).
  • Groundwork for epics: a run records the epic it drives (#6161), the board and the start read one set of edges (#6159), and the roadmap has one typed open message (#7904).

Your machine stays yours while workers run

  • On macOS a worker's tools run in the background band; Claude itself does not, so a worker's own start is not slowed (#7542). The tmux server and the daemon start outside that band (#7554). On Linux the worker scope weighs CPU and disk toward you, or falls back to nice without systemd (#7556).
  • Go builds and tests share one host-wide budget: a go shim on every worker's path hands out ncpu − 2 tokens, review crews first (#7550, #7551).
  • One hook process per tool call instead of one per gate (#7546), every guard registered once (#7541), and a guard verb starts cheaper (#7547).
  • New worktrees live under one parent, ~/.flowforge/worktrees/. flowforge worktrees stale and the doctor row stale-temp-worktrees list old temporary worktrees and remove them only on your confirmation (#7555).
  • A review crew that waits for the test lock either fits its time or says so at once, and its wait no longer eats its review time (#7552, #7553).
  • The daemon now samples how busy your machine is, and only records it; nothing is refused on that reading yet (#7548).

The FlowForge Monthly and release letters

  • The FlowForge Monthly, a letter separate from these release letters, has its own page at flowforgesoft.com/newsletter, with a Portuguese twin: the promise, the next send date, the sign-up form and the archive (#7822, #8083, #8274, #8270). Signing up records your language and sends a confirmation e-mail at once; one press confirms (#7811, #7812, #7810, #7814, #7815, #7819). The box starts unticked and names the letter (#7818). The form is limited per address and checked for bots at no cost to a person (#7813). The unsubscribe page names both letters (#7823). The privacy page says what the letter keeps and who answers for it (#7816). Every issue has its own page, and each language has a feed (#7821, #7833).
  • No advertising tag fires for a visitor in the EU or the EEA, whatever the consent choice (#7825).
  • For a project that sends its own letters: a letter is named by a pack id with its kind (#7826). flowforge newsletter digest <YYYY-MM> counts a month (#7828). A release letter goes to accounts and an issue to subscribers as well (#7829). Every promote leaves a dated row that flowforge release promote audit prints (#7827). The agent pair and the "Did you know?" never repeat across both series (#7830). The gate and the preflight know a monthly issue (#7832, #7834), whose e-mail has a live-text masthead and a plain-text twin (#7831). The consent words come in both languages (#7817), a re-confirmation goes to accounts that never bought (#7837), bounces and complaints enter the delivery record (#7846), and the list's joins and leaves (#7835) and the visits from an issue (#7845) are read from their own sources, never guessed.
  • flowforge version bump advises and never tags. Release prep now names the cut and the one tag door, flowforge release tag (#7898).

Data components

  • One set of data components for the terminal, the site and the desktop app: the KPI card, delta chip, spark bars, progress bar and meter, bullet graph, status tiles, state strip and segmented tab header. Each one carries "unknown" as unknown, and all three checked against one shared contract (#7519, #7520, #7521, #7522, #7523, #7524, #7525, #7526, #7527, #7528, #7529, #7530, #7531, #7533, #7534, #7536). Their specimens, for the terminal (#7532) and the web (#7535), and their chapter in the TUI design manual (#7539).

Steadier under the hood

  • The spoken summary's highlighted word follows the voice, at each voice's measured pace, and starts only when the audio does (#7543).
  • A declared founder gate never resolves to nothing, on every merge door (#8012).
  • A worker whose pane is still painting is never reported unreadable (#7544).
  • A merge into another repository no longer down-merges into this checkout's lines (#7877).
  • Merged pull requests are counted once each in the cloud totals, by merge commit, with history recomputed (#5381). One machine is one identity in the cloud export, not one per launch (#5776).
  • Reference screenshots carry invented specimen figures, and a guard keeps real ones out (#8047).
  • Fixes carried down from main: the dependency audit's Go toolchain and a site claim's citation (#7936), and the site's roadmap page (#7959) (#7964, #7969, #7975).

Studies, records and groundwork

None of these change what you run. Each one is listed only as what it is.

  • The Stats screen's spec and contracts: the terminal screen specified (#6087), the snapshot and window data contract (#6088), the four read-only production queries (#6084) and the cost delivery record (#6086).
  • The data components' measurement brief (#7518).
  • The FlowForge Monthly, issue 1: the pack in English and Portuguese and its rounds (#7843, #8281, #8286), the month's digest and shipped items (#7842), the claims it may make (#7841), its science notes (#7839, #7840), the send-day checklist (#7844), the explainer draft and the channel posture (#7847), the list's schema brief and operation report (#7809, #7808), the switch-on (#7824), the mail DNS read (#7836), the standing grant for the confirmation mail (#7820), and the identity-link ceremony, which waits on two migrations (#5834).
  • The roadmap-page study, gate 1 (#7970).
  • These release notes and the letter (#8306).

Agents — 53: one added

  • Added fft-lifecycle-marketer — owns the e-mail programme under the marketing head: each newsletter issue assembled from the lanes that own its parts, the list's health read with the data analyst, the send-day checklist, journeys and deliverability. It briefs the words and never sends; you do. The marketing head and its other leaves now hand it the e-mail work (#7838).

One setup step

  • Quit and relaunch every open cockpit and FlowForge Desktop after you update, so the new Stats screen, the waves line and the epic board are the ones running.

Not yet

  • With many runs at once, a run can still wait for a slot that a finished worker holds, and a run started from the command line may not begin. The 1.2.29 notes said this would be fixed in 1.2.30. It is not yet: #8132 fixed one cause, and the rest is still open (#7916).
  • S and F on an epic's board do not start or fire the epic yet; they give the "nothing started" answer (#6160).
  • The machine-busy reading is recorded, not acted on (#7548).

Update

  • flowforge update on an existing install, or curl -fsSL https://get.flowforgesoft.com/install.sh | sh for a fresh one. Both write the same release binary to /usr/local/bin and ~/.flowforge/bin together. flowforge update --repair re-lays the installed assets without the network. Then quit and relaunch every open cockpit.

v1.2.30 — 126 PRs, 171k lines, made with FlowForge