# 034 — The recorder nobody enumerated

**Landed 2026-08-29.** PLN, on learning why CosmicFest's tracklist had to be recovered
with DSP at all: *"what gig-log didnt run that night? HOW COME? 😁 glad we have belt and
suspenders from that cosmicfest, but thats sad and needs proper tech debt payment! We cant
afford to miss that"*.

He is right, and the answer is not a crash.

## The cause

`gig-log.service` was installed **2026-07-29** and left `disabled`. And
`tools/rig_units.py` — the one authored inventory that log 030 created precisely so this
class of thing could not happen — mentioned it **zero times**.

So `--ensure` could not enable it. `gig-up.sh`, which gates on the inventory, never
asserted it. It ran only when somebody remembered to start it by hand, and the sessions
that survive, through 2026-08-20, are exactly those manual runs.

Two failure shapes already named in this repo, stacked:

The unit lived **only in `$HOME`**, never in the repo. That is log 030 again — the two
reconcilers rescued from a home directory after five orbits reached no Ardour track. A
file that exists in one home directory is not infrastructure, it is a habit.

And it was **missing from the one authored list**. An inventory only prevents the class of
bug it actually enumerates. gig-log was left off, so it inherited none of the protection.

## What was actually lost

Not just thermals and xruns. The gig log records a `track` event per evaluation and
coalesces the MIDI CC stream — so it holds both the tracklist and a fingerprint of which
controls each loaded track touched. Recovering the set afterwards took two DSP lenses,
thirty reference renders, three attempts at a tempo estimator, and still left two
mislabels and five ghosts. One always-on 1 Hz recorder costing 0.4% of a core would have
made all of it unnecessary.

The HUD's `eval-events.jsonl` missed the set too, which is why "belt and suspenders" did
not save us: 21 events on 2026-08-23 from 18:31 to 18:59 (prep at home — `rose_eternelle`,
`quand_on_decolle`, `because_its_there`, `sept1`), then a **3h15m hole** across the gig,
then four `pluie` evals at 22:14 with zero orbits. Pulsar was running, so the likely cause
is the lazy-activation trap, but that is a hypothesis and is recorded as one.

## Paid in three places

* `tools/gig-log.service` — versioned in the repo, symlinked into `~/.config/systemd/user`
* `gig-log` in `rig_units.py` SERVICES, so `--ensure` enables it and the generated
  `parvagues-rig.target` Wants it. **Seven units, zero problems.**
* a **HARD** gate in `gig-up.sh`

## The gate does not ask whether the unit is green

A green unit is not a recording — the process can be up while the writer is wedged. So it
asserts the property that matters: a session file whose mtime is within the last 20
seconds, i.e. it is writing *now*.

And it was verified to be capable of failing, because this repo already has a log titled
"the checks that could not fail": stopped the recorder, waited 25 s, gate failed at age
25 s; restarted, age 1 s, passed.

## A footnote on how the fix nearly shipped incomplete

The commit that explains this fix and the commit that performs it were briefly different
commits, and only one existed. `30fceb4`'s message said the debt was *"paid in three
places"* and contained a single file; the inventory entry, the regenerated target and the
gate sat in the working tree until the pre-compact tree check caught them. Second
occurrence in one session of a message written from intent rather than from
`git show --stat`.
