Wave Summary
| Field | Value |
|---|---|
| purpose | replace the split-brain, host-coupled autonomous merge engine with a durable deterministic refinery; move standing control-plane infrastructure off the operator workstation and onto a dedicated Conductor VM |
| development window | August 7–9, 2026—from the redesign document through Conductor migration, three-lane proof, idempotent repository onboarding, and the self-explaining live refinery surface |
| triggering incidents | the “5385” page showed a completed green gate as a one-hour zero-pass run; sharded-suite state pollution mislabeled innocent branches; launchd KeepAlive made process-level pauses unsafe; control-plane services were still anchored to pompom |
| source baseline | 40a9622c before the redesign branch; activation began at 94e80a7b, the Conductor migration merged at d434f0aa, host portability reached 86b3dc46, and the final reviewed/deployed release is 4f5a183b |
| core redesign | refinery-reliability-ys-yes-x802, 25 commits through 3db9126b; merged by the normal eight-shard gate at 77d114f5 |
| redesign change surface | 69 files, 28,790 insertions, 1,959 deletions; 24 implementation Beads closed under yes-0f10 / ys-yes-x802 |
| activation hardening | secure capability token, PID-reuse fencing, observable provider cancellation, serial-in-shard MicroVM execution, provider-start evidence repair, and schema-init deadlock fixes through the 94e80a7b candidate |
| Conductor migration | refinery-conductor-qii1, 17 commits through 6597a7f5; merged by the deterministic refinery at d434f0aa; tracked by yes-1358 / ys-yes-qii1 |
| live topology | pompom is an operator client; seykhl is only the Proxmox hypervisor; VM 112 yesod-dispatch runs the standing control plane; dertog serves visualization/read surfaces; homestar stores immutable artifacts; AWS MicroVMs run the Yesod gate |
| production scope | three configured lanes: yesod through eight MicroVM shards with one pytest worker per shard; scr-wrap through one local serial gate; and yesod.work through the exact local npm ci, npm run check, npm run build profile; other projects remain explicitly outside active intake until reviewed |
| evidence | 277 targeted refinery acceptance tests; independent reviewer rechecks; repeated eight-MicroVM gates with zero failures or infrastructure errors; 53 focused fleet/API/browser/migration tests plus an eight-test tripwire follow-up; 59 focused onboarding/source/runtime tests plus two installed-CLI no-op replays; controller and supporting units active with zero restarts; public dashboard HTTP 200 and visually checked; Blob mount verified byte-for-byte; all nine yesod.work onboarding checks green; and sentinel ys-ysw-6kot reaching main, deleting its queue row, and closing ysw-p9l automatically |
| checkpoint type | final operational and source-code exit for the deterministic-refinery/Conductor migration; the factory is active on three reviewed lanes with the legacy supervisor absent |
| exit status | achieved: the migration is promoted, heartbeat/artifact/fleet visibility are live, the operator inbox is empty, host placement is explicit, a real third-lane terminal write-back completed, and new repositories now have one idempotent command plus a nine-invariant readiness check |
Wave 7 asked whether the factory could tell a coherent story. Wave 8 began when the refinery told a story that was coherent, current-looking, and false.
The Refineries page showed a MicroVM whose identifier ended in 5385 as roughly one hour old with zero passing tests. The actual remote job had already finished green: 5,845 passed, 26 skipped, zero failed, in 243.3 seconds. The page had joined fresh VM uptime, a stale pending gate row, and an idle merge pipeline as though they described one live execution.
That incident was not a display typo. It exposed a refinery whose lifecycle authority was distributed across queue labels, process memory, worker rows, merge locks, gate files, provider jobs, fleet snapshots, and several APIs. An LLM supervisor could react to symptoms, but it could not supply fencing, exactly-once effects, or a single answer to “what attempt owns this gate?”
Wave 8 replaced that arrangement and then moved the replacement onto the host where standing infrastructure belongs.
The Run Began With a Real Pause
The first operational decision was to stop the old refinery without damaging
the work already in flight. The supervisor was unloaded from launchd, not
merely killed or kickstarted. That distinction mattered because KeepAlive
can relaunch a killed process, while an unloaded job is absent from the
service manager and cannot fight the operator’s pause.
The pause was taken after the active gate completed. The merge lock was free,
no runner was building, and the one queue row labeled gating was proven to
be stale state with no live gate behind it. This established the boundary for
the redesign: no mid-merge interruption, no orphaned lock, and no new work
entering while the source of truth changed.
The flake evidence also narrowed the problem. Several innocent notes had been
escalated to rework because different full-suite runs failed different test
modules, while the same subsets passed locally and under isolated -n auto
runs. The failure was cross-worker xdist state pollution, not seven unrelated
product regressions. The new production Yesod profile therefore preserves
parallelism across machines while running one pytest worker inside each
MicroVM.
An Attempt Became the Unit of Truth
The redesign’s primary object is no longer a queue row or a supervisor cycle. It is one immutable merge attempt in one repository/target lane.
PostgreSQL now holds first-class records for:
- project lanes and their current attempt;
- immutable attempts, candidate SHAs, leases, fencing generations, and terminal outcomes;
- concrete local or MicroVM gate executions;
- append-only attempt events and external-effect evidence;
- bounded artifact metadata pointing into Yesod Blob; and
- an operator inbox for facts the controller cannot safely infer.
The normal lifecycle is monotonic:
requested → claimed → preparing → gating → gate_green → pushing
→ deploying → succeeded
Retries create successor attempts; they do not reopen terminal records. A worker must present the current owner and fencing token for every mutation. If its lease expires and another controller acquires a higher token, the old process can no longer record progress, terminal evidence, or artifacts.
A lane is repository identity plus target branch. One attempt may push within that lane, while unrelated lanes may prepare and gate concurrently. The global merge loop has become a bounded scheduler over independently serialized lanes.
External Effects Became Reconciled Facts
Git pushes and provider submissions are not database transactions. A process can receive success, lose the response, and die before recording it. Treating that as a normal retry risks a duplicate gate or a repeated push.
The new brokers therefore separate intent, observation, and completion:
- persist an idempotent external-effect intent;
- perform the provider or Git operation outside the database transaction;
- observe the real external state;
- record confirmed-applied, confirmed-not-applied, or outcome-unknown; and
- reconcile unknown outcomes by stable identity instead of repeating them blindly.
Local and MicroVM gates implement the same provider contract: submit, find by idempotency key, observe, cancel, and fetch immutable artifacts. A lost submit response can be recovered from the deterministic provider job identifier. A green gate authorizes only the exact candidate SHA it tested; if the target branch moves first, the controller must construct and gate a new candidate.
Review Found Two Missing Invariants
The first implementation passed its focused broker, scheduler, runtime, and UI suite, but review exercised two cases the tests had not actually proved.
First, a provider that still reported running one second past the configured
deadline left the gate pending=true forever. The earlier test covered only a
provider job missing at deadline. The fix preserves the final running
observation, requests cancellation when supported, observes the cancellation
outcome, and then settles the execution under the bounded lost policy. A
remote provider cannot extend the controller’s reconciliation deadline merely
by continuing to say “running.”
Second, gate idempotency was global over candidate SHA and profile. Two different project lanes with the same SHA/profile could collide, causing the second lane to reuse or reject the first lane’s execution. The identity now includes repository/target lane identity, so equal candidates in independent projects produce independent gates and provider jobs.
Those fixes landed as c58994e4 and a91dfa86; 3db9126b recorded them in
the acceptance matrix. The final targeted acceptance run reported 277 passing
tests.
Activation Required More Than Green Tests
The reviewer approved merge but withheld activation until three operational boundaries were hardened.
| Boundary | Hardening |
|---|---|
| active capability | the token must be a regular mode-0600 file, owned by the service identity, with one hard link and exact reviewed contents |
| local process ownership | the controller records and checks process identity rather than trusting a reusable PID after a crash |
| overdue provider work | cancellation is an explicit external effect whose observed outcome is retained; “marked lost” is not treated as equivalent to “provider stopped” |
The activation branch also changed the Yesod MicroVM profile from nested xdist
to eight machines with -n 1 inside each guest. Parallelism remains eight-wide
at the infrastructure level, where each shard has isolated process and
database state. The old shared-process pollution channel disappears.
Later sentinel work corrected two more activation findings. Provider binding
had written receipt acceptance time into started_at, conflicting
milliseconds later with the provider’s real start time. Schema initialization
could also deadlock when legacy intake and a newer process raced through
migrations. Both were repaired before the reviewed 94e80a7b controller
candidate was activated.
The Gate Is Remote; the Controller Is Not the Test Host
“Deterministic refinery” describes control semantics, not local execution.
The standing controller runs on yesod-dispatch, but the Yesod gate runs on
eight disposable AWS Lambda MicroVMs. Each guest receives the exact candidate,
runs one serial pytest worker against its isolated in-image PostgreSQL, and
reports a provider observation. The controller aggregates those observations
into one durable gate execution.
This is the performance and reliability compromise the flake evidence called for:
- parallel across eight isolated machines;
- serial inside each machine;
- no workstation CPU contention;
- no cross-worker process state;
- no silent local fallback when the remote provider is unavailable; and
- a durable deadline and cancellation path when a remote job does not settle.
The scr-wrap lane remains a one-shard local serial gate because its reviewed
profile is small. Local is a provider choice per lane, not a global fallback
for Yesod.
The Workstation Stopped Being the Server Room
The initial activation still left a structural contradiction: the new
controller and its support jobs were launch agents on pompom. The Mac Studio
is a client workstation. Login state, GUI sessions, battery/workstation
maintenance, and user experiments should not decide whether the software
factory can merge.
The Conductor migration, tracked by ys-yes-qii1 / yes-1358, established a
dedicated placement model:
| Place | Authority and responsibility |
|---|---|
pompom |
interactive operator client: source checkouts, the Yesod CLI, interactive credentials, and preserved-but-disabled rollback plists; no standing Yesod, sjbis-gog, refinery, or OpenCode service |
seykhl |
Proxmox hypervisor only; owns VM 112 configuration and storage, but runs no Yesod application process directly |
yesod-dispatch |
VM 112, the Conductor; owns deterministic refinery control, gate proxying, fleet telemetry, factory dispatch, maintenance timers, status reporting, and human/question bridges |
dertog |
visualization and read surface: Yesod HTTP/API, live-viz WebSocket, public Refineries page, and the human-facing sjbis daemon; it does not claim or merge work |
homestar |
Synology NFS artifact store at /volume1/yesod-blobs, mounted by the Conductor at /mnt/nas/yesod-blobs |
| AWS Lambda MicroVMs | disposable gate workers; no durable authority survives an instance |
On pompom, sixteen com.yesod.*, com.sjbis.gog, and
ai.opencode.server launch-agent plists remain available for deliberate
rollback, but every label is unloaded and persistently disabled. The stale
sjbis bridge PID file was removed only after its PID was proven absent. A
login or reboot can no longer resurrect the old refinery through KeepAlive.
On seykhl, VM 112 is configured with two cores, 4 GiB RAM, a 20 GiB
local-lvm disk, onboot=1, and startup order 20. The application boundary
is the guest: /etc/pve/nodes/seykhl/qemu-server/112.conf describes the VM;
it is not a Yesod deployment directory.
The Conductor Has an Explicit Filesystem Contract
Inside yesod-dispatch, immutable code and mutable authority are separated:
| Path | Purpose |
|---|---|
/srv/yesod/releases/<commit> |
immutable source plus locked environment for one reviewed commit |
/srv/yesod/current |
controller/proxy/dispatcher release; final reviewed release 4f5a183b |
/srv/yesod/ops-current |
independently pinned auxiliary-service release; live at 233e00b8 for this checkpoint |
/var/lib/yesod |
mutable repositories, controller workspaces, caches, evidence, gogcli state, SSH/AWS identity, and the yesod-control home |
/var/lib/yesod/repos/yesod-aicoe |
canonical checkout for the Yesod lane |
/var/lib/yesod/repos/scr-wrap |
canonical checkout for the scr-wrap lane |
/var/lib/yesod/repos/yesod.work |
canonical checkout for the yesod.work lane |
/var/lib/yesod/dev5/{yesod-aicoe,scr-wrap,yesod.work} |
manifested Beads mutation workspaces with canonical project identities |
/var/yesod-workdir |
recoverable dispatcher worktrees and run transcripts |
/etc/yesod |
root-controlled manifests, secrets, and explicit service-enable capabilities |
/opt/yesod |
pinned Node 22.23.2 and bd 1.1.0 host runtimes |
/usr/local/bin |
managed bd symlink plus reviewed static sjbis, gog, and sjbis-gog executables |
/usr/local/libexec/yesod |
host-level fleet telemetry helper |
/mnt/nas/yesod-blobs |
persistent content-addressed evidence mounted from homestar |
The non-login yesod-control account runs the controller and most supporting
services. The codefactory dispatcher deliberately remains under the existing
stephen runner identity because its model credentials and worktree ownership
were already scoped there. Secrets were copied only into root- or
service-owned mode-0600 files; no credential entered Git.
Two release symlinks prevent an operational hardening branch from becoming an
unreviewed merge controller. ops-current can stage an exact auxiliary commit
needed for cutover, while current remains pinned to reviewed main until a
promotion decision.
Standing Services Moved as a Set
The migration moved more than the controller. The active systemd set on
yesod-dispatch is:
yesod-refinery-controller.service;yesod-gate-pool-proxy-8100.service;yesod-gate-fleet-poller.service;yesod-codefactory-dispatch.service;yesod-beads-collect.timer;yesod-archive-sweep.timer;yesod-status-push.timer;yesod-bridge-sjbis.timer;yesod-sjbis-gog.service; andmnt-nas-yesod\x2dblobs.mount.
The units use systemd sandboxing, explicit enable files, immutable entry points, and bounded writable paths. The controller additionally requires the separate active capability; installing or enabling its unit alone does not grant merge authority. The legacy supervisor unit is absent.
The Beads collector was changed to read server-backed readiness directly from
SQL. Later terminal-projection acceptance added separate, manifested
repository-local .beads control workspaces under /var/lib/yesod/dev5; those
exist for mutation identity, while claimability collection intentionally
remains PostgreSQL-authoritative. Label collection was reduced to bounded
server-native queries. Auxiliary one-shots were pointed at ops-current, while
the long-lived merge processes remain on current.
Status reporting now probes Linux systemd state rather than workstation PID
files. Its snapshots identify yesod-dispatch, allowing the old pompom
status rows and readiness-stale warnings to be retired instead of blended into
one fictitious host.
Human Communication Became Standing Infrastructure Too
Two easily confused bridges now have explicit ownership:
yesod-bridge-sjbis.timeris the Yesod human-authority mail bridge. It consumes the human channel and asks the sjbis daemon ondertog.yesod-sjbis-gog.servicepolls Gmail and Google Chat, classifies genuine questions, submits them through sjbis, and routes approved answers back.
The Conductor runs static, checksummed Linux builds of sjbis and
sjbis-gog, plus official gogcli 0.34.1. Minimal OAuth/keyring material lives
under /var/lib/yesod/.config/gogcli; the Fireworks key, keyring settings, and
explicit gog account selector live in /etc/yesod/sjbis-gog.env. Gmail and
Chat read-only preflight passed as yesod-control before the Mac singleton was
stopped.
No standing OpenCode server was moved to the Conductor. Durable Yesod mail is
PostgreSQL-backed and host-independent, but OpenCode wakeups and live session
transport remain runtime-local. Centralizing one OpenCode server would only
move the coupling. The host-neutral wakeup/adaptor problem remains documented
in ys-yes-53ok.
One separate sjbis privacy issue also remains: message details are passed to a
child sjbis ask process in its argument vector, making them locally visible
to process inspection. That bug is tracked as ys-sjb-bhgx; it does not
change refinery correctness, but it is part of the security boundary this
wave made visible.
Cutover State Was Reconciled, Not Waved Away
The activation audit found fifteen awaiting_merge notes outside active v2
intake.
- One Yesod branch was already an ancestor of main. Its exact commit was backfilled and its note completed.
- Seven verified Yesod branches had their metadata repaired, known pre-cutover flaky counters cleared where appropriate, temporary holds removed, and deterministic v2 attempts created.
- Seven branches for other projects were verified on origin but kept under
explicit holds pending reviewed v2 lanes. Their old “cutover in progress”
labels were replaced with the true reason: production intake currently
covers only
yesodandscr-wrap.
This is an important definition of “empty.” An empty v2 queue means no work is waiting in configured lanes. It does not mean every project in the catalog has been onboarded.
The resumed Yesod lane then proved real production behavior. A gate for
ys-yes-6bdu ran across eight MicroVMs, reported 6,164 tests with zero
failures, pushed the candidate, and completed the note. Subsequent re-gates
continued from the reconciled queue without reviving the old launchd
supervisor.
Two Final Alerts Improved the Design
The live dashboard initially reported attempt_heartbeat_stale even though
the controller was healthy. The lease lasted 1,200 seconds and renewed 360
seconds before expiry, so the scheduler updated the attempt heartbeat only
about every 840 seconds. The projection’s freshness threshold was 60 seconds.
Both components were internally consistent and jointly wrong.
Commit 5bddfd9d added a fenced heartbeat-only update on every owned scheduler
tick. It does not extend the lease expiry. The regression test advances time
past 65 seconds and proves the heartbeat remains fresh, the lease deadline is
unchanged, and the projection does not invent a stale attempt. The Conductor
branch merged at d434f0aa, and the fix is live; subsequent gates showed a
fresh advancing heartbeat without extending their lease deadlines.
The second alert was real. Two successful gates could not persist
provider-status.json because yesod-dispatch inherited the Linux default
/mnt/nas/yesod-blobs, but the NAS was not mounted. Gate verdicts remained
valid by design and two gate_artifact_persistence_failed operator items
opened.
The correction installed the NFS client, enabled a persistent systemd mount
for 192.168.0.123:/volume1/yesod-blobs, proved that the path was actually
NFS, and performed write, checksum, atomic-rename, and byte-for-byte read-back
probes. The provider still retained both terminal reports. They were fetched,
written to content-addressed Blob storage, read back, and referenced in the
audited operator resolutions. The inbox returned to zero open items.
A Third Lane Proved the Whole Terminal Boundary
Onboarding yesod.work turned the last abstract invariant into a production
test. Its tool prefix is ysw, so new notes are ys-ysw-* and linked root
Beads are ysw-*; three earlier provisional ys-yes-* notes were superseded
by correctly identified replacements. The reviewed lane is
lane-v1-574981bc0bca351706b28b89, uses Node 22.23.2 on yesod-dispatch, and
runs exactly:
npm ci
npm run check
npm run build
The first green sentinel exposed why “gate green” is not the factory’s terminal
boundary. Its candidate reached main, but the root Bead remained open. The
investigation found three independent host-boundary bugs:
- terminal note projection committed before attempting Bead synchronization, but the synchronization result was discarded;
- the service identity lacked a manifested
yesod.workmutation workspace with the database’s canonicalproject_id; and yesod-dispatchstill ran bd 1.0.4, whose dependency query was incompatible with the current shared Dolt schema even though bounded reads succeeded.
The fixes landed in stages. aacbbf4d moved root-Bead synchronization after
the terminal database commit. 032e1372 added the manifested yesod.work
workspace, contained host-path failures at the adapter boundary, and documented
service-identity provisioning. The canonical workspace control files were
installed mode 0600 under mode-0700 .beads directories, and bd was upgraded
to v1.1.0. A checksum-pinned installer now owns that runtime at
/opt/yesod/beads-v1.1.0-linux_amd64.
The final sentinel was ys-ysw-6kot / ysw-p9l. Candidate 321a7275 passed
the local lane, reached yesod.work main, projected the note to done, removed
the legacy queue row, and closed the root Bead automatically. This proved task
identity, gate execution, push, terminal projection, and cross-host Beads
mutation as one chain.
One final portability pass then changed shared workspace persistence from raw
host paths to ~/dev5/..., including migration of existing manifested rows.
That prevents a Linux service registration from overwriting a Mac client’s
workspace with /var/lib/yesod/..., or the reverse. The same pass records the
canonical metadata.json.project_id as durable database identity rather than
disposable machine state.
The refinery itself enforced the final correction. The first portability
candidate went red because two MicroVM assertions still encoded absolute host
paths; its failing shard otherwise reported 760 passes. After those assertions
were corrected and existing manifested rows gained automatic migration, the
successor candidate 86b3dc46 ran on eight distinct MicroVMs. The provider
reported 6,258 tests collected, 6,231 executed, zero failures, zero retries,
and zero infrastructure errors, then pushed the exact green candidate to
main.
Promotion used the durable admission fence: revision 22 paused to 23, the
immutable release was installed and verified, /srv/yesod/current advanced
atomically, and admissions resumed at revision 24. The proxy, controller, and
dispatcher all returned active with zero restarts; the active scheduler then
reported a fresh heartbeat, zero tick errors, three idle lanes, an empty
queue, and no operator items.
Onboarding Became an Idempotent Command
The successful third lane still depended on an operator remembering every place a repository had to exist. That was not a real onboarding procedure. A repository could have a catalog entry but no runner workspace, a workspace but the wrong note namespace, or a lane row that the active controller did not own.
Wave 8 therefore ended with two explicit commands:
yesod onboard --github https://github.com/OWNER/REPOSITORY
yesod onboard REPO_STUB status
The mutation converges catalog identity, note prefix, runner-workspace
declaration, gate profile, controller manifest, PostgreSQL lane, runner
provisioning, Conductor checkout, and active controller ownership. It takes
its own exact-revision admission pause for lane registration. Repeating the
real yesod.work command returned changed=false, converged=true, and eight
unchanged steps; it did not duplicate any tool, workspace, profile, lane,
checkout, or scheduler ownership.
Status proves nine named invariants: catalog identity, note namespace,
workspace declaration, Beads workspace, dispatch-runner coverage, runtime
lane declaration, refinery lane, controller ownership, and terminal
acceptance. yesod.work returned both verified=true and
dispatch_ready=true; all three runners resolved the same canonical server
project identity, and the expected prefix remained ysw.
Two implementation defects were found by exercising the installed command,
not its source-tree tests. First, a partially initialized Beads schema could
return a fresh UUID without a metadata table in which to persist it. Empty
workspace identity now requires both the issues and metadata tables before a
canonical identity is minted. Second, a VCS/uv-tool installation looked for
source-controlled manifests relative to site-packages. Release e9a39099
made manifest discovery prefer the invoking source checkout or an explicit
YESOD_SOURCE_ROOT, and mutating onboarding now refuses to write outside a
reviewable checkout.
The completion audit found two more fail-closed gaps before the command was
declared finished. The readiness model now requires the runtime declaration
directly rather than relying on controller ownership to fail indirectly. Both
runner provisioning and read-only status retry one transient routed Beads read
once; a second failure remains visible. Convergence JSON now separates
changed from converged, and an incomplete non-dry-run exits one. Release
4f5a183b passed 59 focused tests and an eight-MicroVM gate with 6,330
collected, 6,302 executed, zero failed, and 551.8 seconds of provider time.
The durable procedure is documented in repository onboarding.
The Refineries Page Became Self-Explaining
The redesigned page was authoritative but still assumed the operator knew its vocabulary. It also showed how many provider instance identities were linked to a gate without saying how many MicroVMs AWS actually reported running. Those are different facts: assignment is exact historical gate identity; fleet liveness is a separately timestamped provider observation.
Release 2d61e8f5 added the Conductor fleet poller’s singleton PostgreSQL row
to the same repeatable-read projection as lanes and schedulers. The browser
still fetches only /api/refineries/v2; it does not race a legacy fleet
endpoint or infer liveness from shard assignments. A prominent seventh summary
card now says MicroVMs running, names AWS as the source, and shows
observation age and freshness. Per-attempt rows instead say “N MicroVMs
assigned to this gate.”
Small keyboard-focusable question-mark controls now accompany summary metrics, scheduler policy, lane and attempt state, gate progress, assignment identity, freshness, and attempt-detail sections. Every explanation gives four things: meaning, what it blocks, authoritative source, and expected operator action. Escape, outside click, focus return, responsive placement, and complete-script parsing are covered by the browser contract.
The first production gate made the distinction visible in real time. The gate
had eight assigned instance IDs while the first AWS fleet snapshot reported
seven RUNNING; the next observation reported eight. Candidate 2d61e8f5
then completed green across eight distinct MicroVMs with 6,316 collected,
6,288 executed, zero failed, and a 537.8-second provider execution. The fleet
returned to zero after push.
A post-deploy audit found one final inconsistency: the poller did not store the
legacy endpoint’s derived launch-storm tripwire, so v2 initially rendered an
empty tripwire object. Follow-up b1ec256c derives the configured threshold
from the authoritative running count itself. Its regression proves that 17
running instances trip the default threshold of 16 and degrade the page. That
follow-up also passed an eight-MicroVM gate: 6,317 collected, 6,289 executed,
zero failed, and 523.5 seconds.
The publish path produced one useful operational trap. Calling
deploy-dertog.sh by absolute filename is insufficient because its payload
paths are relative to the current working directory. Post-deploy API checks
caught an initial no-op/stale publish. The correction ran the script from
inside a fresh clone whose HEAD was the reviewed main SHA. Future promotions
must preserve that working-directory invariant and verify a new API field, not
only HTTP 200.
The final state is main and deployed release 4f5a183b, admissions active at
revision 38, a fresh zero-error controller heartbeat, a fresh fleet snapshot
with zero running instances and a healthy threshold-16 tripwire, two idle
dertog services, and all Conductor services active with zero restarts. The
global operator CLI is pinned to the same release.
What Is Live
The live deployment is healthy and active:
| Fact | Evidence |
|---|---|
| admissions | active at revision 38 after exact fenced promotion |
| controller | active on yesod-dispatch, zero restarts |
| old supervisor | unloaded and absent from launchd |
| merge ownership | lanes and attempts authoritative in PostgreSQL; merge lock free outside pushes |
| gate execution | Yesod remote eight-by-one; scr-wrap local one-by-one; yesod.work local exact npm check/build profile |
| operator inbox | zero open items after artifact recovery |
| artifact storage | active NFSv4 mount plus verified Blob round trip |
| visualization | public Refineries dashboard on dertog returns HTTP 200; contextual help and the fresh AWS RUNNING count are live |
| workstation | sixteen rollback plists preserved, zero relevant labels loaded, all persistently disabled |
The source and deployment boundaries now agree. The Conductor migration,
per-tick heartbeat, Blob inventory, third-lane profile, terminal write-back,
workspace portability, idempotent onboarding, authoritative fleet visibility,
and pinned host runtimes are all represented on main at 4f5a183b.
Promotion remains explicit—merging never silently retargets
/srv/yesod/current—but the reviewed immutable release was advanced under the
same admission fence and single-controller procedure used for activation.
The Exit Criterion Was Met
Wave 8 has already crossed the operational threshold that justified it: the factory no longer depends on a logged-in workstation or an LLM supervisor to interpret refinery state. A durable attempt owns every active gate, a stale worker cannot write past its fence, and the test workload runs on isolated machines rather than the client Mac.
The final code exit was deliberately narrow and is now satisfied:
refinery-conductor-qii1passed its normal gate and landed atd434f0aa;yesod-dispatchpromoted the merged controller, and per-tick heartbeat evidence stays fresh without extending lease expiry;- ordinary terminal gates persist evidence through the mounted Blob path;
- the production boundary is explicitly three lanes, with other projects admitted only through the idempotent onboarding/status contract;
- terminal acceptance now includes automatic root-Bead closure, not merely a green gate and Git push;
- the Refineries page distinguishes actual AWS fleet liveness from gate assignment identity and explains its operational vocabulary in place; and
- main, the Conductor release, dertog API/UI, and the globally installed CLI
converge on
4f5a183b.
The sjbis argument-vector exposure and host-neutral OpenCode wakeup gap remain visible follow-ups. They do not weaken the refinery exit, and they were not allowed to disappear into its success story.
The durable lesson is that determinism is not synonymous with centralization or serialization. The controller is deterministic because identity, authority, deadlines, and effects are explicit. The gate is fast because execution is parallel across isolated MicroVMs. The host map is safe because standing services live on a boot-managed Conductor, visualization lives on a read-oriented box, artifacts live on durable storage, and the workstation is free to be a workstation again.