v1.8.0: Arbor’s seatbelts, not its steering wheel

Released 2026-07-23. A deliberate raid on somebody else’s research framework for the four disciplines a deterministic pipeline can actually use, and a written refusal of the three it cannot.

What we were trying to fix

This is the fifth of six releases cut on 2026-07-23, and the second of two reviews run against the same tree. v1.6.0 had tripled the kit’s skill count that morning, from two to six, and added over three thousand lines with them; v1.7.0 answered the coherence review of it. This release answers the other one, filed the same day under a different lens: given a research framework built for a genuinely different problem, which of its disciplines belong in a pipeline that already knows what it is doing?

The framework was Arbor, which explores a tree of hypotheses looking for a good one. The kit does not explore. It runs seven phases in order, from assessment to verified production, and the answer at the end is not supposed to be a surprise. So most of Arbor does not transfer at all. Four things did, and each of them named something the pipeline was missing:

  • An interrupted /migrate had no way back in. You started over, from phase 1, on a repository the run had already half changed.
  • The phase 4 remediation loop had no convergence guard. Two passes that fix nothing look exactly like two passes that are about to fix something, and the loop could not tell the difference.
  • The kit’s headline number, the one on the front of the README, was a human with a watch. Nothing in the tooling measured the pipeline it was advertising.
  • Lessons from a completed migration wave lived in whoever had run it. Feeding them back into the kit was a culture, and cultures do not survive a session ending.

What we decided

Take the guardrails, refuse the steering. The reviewer’s own line for it was that Arbor is searching for its path while the kit already knows where it is going, so borrow its seatbelts and never its wheel.

Resume came first. /migrate now detects an existing migration/ directory and reads the gate commits, whose messages already name the phase they closed, announces where it is resuming, and re-enters at the phase after the last green gate. A green phase is never replayed. That last clause is the whole design: resume is only safe because the gate commits were already a durable record of what had passed, so nothing new had to be trusted.

Rule 9 gave phase 4 its convergence guard. Two consecutive remediation passes that do not reduce the error count stop the run, return to the last green gate, and record the blockage in the report with the remaining diagnostics grouped by id. The decision then belongs to the owner. A remediation loop that cannot stop itself is not automation, it is a way to spend an afternoon.

The timeline stopped being a claim. migration/report.json now carries a phases[] array with a start, an end and a duration for each phase, and the important part is where those numbers come from: they are derived from the gate commits in the migration branch’s git log, not from a timer somebody started. The README’s measured pipeline time became a generated fact. The dashboard renders it as a card, and the golden test was extended to cover it.

And backpropagation became a contract rather than a habit. Phase 7 now closes with a lessons entry in report.json: either a reference to the change this wave caused in the kit, or an explicit “nothing to learn from this wave”. A wave with neither is incomplete. Forcing the explicit null is the part that works, because “we learned nothing” is a claim somebody has to make on the record instead of a box quietly left empty.

The one finding that changed no code was the portfolio audit’s fan-out. Multi-app /migrate-audit now documents the pattern it should already have been using: one sub-agent per application, since the inventories are independent by construction, with the orchestrator keeping only the portfolio synthesis. Nothing needed to be built for that, which is why nothing was.

What got cut

Three of Arbor’s central ideas were refused outright: the hypothesis tree, the interaction modes, and novelty search. The justification is the same for all three and it is not that they are bad ideas. A deterministic pipeline is not exploratory research. A tool whose value is that it produces the same verified outcome every time gains nothing from a mechanism designed to produce a different outcome each run.

What matters more than the refusal is where it was written down. Each rejection went into docs/backlog.md under closed decisions, with its reasoning and, deliberately, a condition under which it would be reopened. A refusal that lives only in a session transcript is not a decision, it is a conversation, and it gets re-proposed the following month by somebody who was not there.

Those three refusals are the ones you can now read as docs/adr/0008, 0009 and 0010. They were not ADRs on the day. The ADR files were written on 2026-08-31, when create-issue learned to search prior rejections through AdrMcp, and back-dated to this release’s date because that is when the decision was actually made. The mechanism changed twice; the decision has not moved since.

What bit us

The timeline finding is the one worth keeping. The obvious implementation is a stopwatch: have the pipeline record a start time and an end time as it goes. It would have worked, and it would have been a second source of truth about what the pipeline did, disagreeing with the git history the moment a run was resumed or a phase was replayed. Deriving the numbers from the gate commits was more work to write and is the only version that cannot drift, because there is nothing separate for it to drift from.

The other thing to note about this release is its shape. Six findings, all six resolved, one commit, one tag. That was the pattern for four of the day’s six releases, this one and v1.9.0 after it included: a review was run, every finding in it was implemented, and the release was cut. The other two, v1.4.1 and v1.5.0, came from using the tool rather than from reviewing it. The discipline is real, and the cost of it is visible here, because two reviews of the same tree shipped as two separate releases minutes apart when they could as easily have been one.