ReadonlyemptyHOW MANY TRACKS ARE KNOWN EMPTY — tracks whose TakeTrack.frames is 0.
A strip whose input port carries no buffer is skipped by the RT walk above the capture line,
so its ring is armed and never written: the file is a header and nothing else, and xrun is
honestly false because nothing was ever lost. Emptiness and xrun are two facts and neither
implies the other, so the library reports both or reports a take it cannot describe.
ReadonlyidThe take's id — the folder's name, the row's address, and what /vsc's takeId is set to.
ReadonlylengthFrames per track at rate. With it, the take's duration.
ReadonlynameThe operator's label. What a picker shows and what a rename moves.
ReadonlyrateThe rate the capture ran at. ON THE HEADER because a load REFUSES on a mismatch (§5: the VSC path has no resampler by design), so a picker that could not show it would offer takes the desk is about to turn down with no way for the operator to see why beforehand.
ReadonlyrecordedEpoch milliseconds at the start of capture — the library's order, newest first.
ReadonlytapsWHICH TAP POINTS this take actually holds, in the catalogue's signal order.
A channel contributes several tracks now (§0.3), so the tap set is what says what a take can
be USED for: only an input tap can be replayed into the strip head, and a take of nothing but
post-fader tracks cannot drive a soundcheck at all. Derived by filtering
import('./session.js').RECORD_TAP_POINTS, so the order is the catalogue's and never a
string sort — tap-points.ts refuses any other order for a reason that holds here too.
ReadonlytrackHow many track files the take holds — tracks.length, derived, never a stored count.
ReadonlyunlinkedHOW MANY CHANNELS THIS TAKE LEFT OUT — the length of SavedTake.unlinked.
A channel dropped from the arm set in silence is found at soundcheck, on a strip playing nothing. The count rides the header for emptyTrackCount's reason: a picker exists so an operator can CHOOSE a take, and the names belong where the take is opened.
A take carrying no unlinked key reads 0 — it was written before the recorder answered
the question, and unmeasuredTrackCount === trackCount is the field that already says so.
ReadonlyunmeasuredHOW MANY TRACKS THE CONSOLE CANNOT SPEAK FOR — tracks with no TakeTrack.frames.
Separate from emptyTrackCount because absence is not zero. A take written before the
recorder carried a frame count has every track unmeasured and none known empty; folded into
one number it would read as a clean take. unmeasuredTrackCount === trackCount is "this take
predates the measurement", which is a different sentence and earns different words on a
picker. Anything that must know for certain measures the file.
ReadonlyunsealedHOW MANY TRACKS CARRY A HEADER THAT CANNOT BE BELIEVED — the take.unsealed state
(R-074, recording-vsc §2.1, operator ruling 2026-09-17).
An unsealed track's audio is ON THE PLATTER and plays; its header claims a different length,
because a capture's finalize never ran or the file was cut short after it did. The desk's own
2026-09-01 take is one: data size 0, ninety minutes behind it.
ON THE HEADER for emptyTrackCount's exact reason — a picker exists so an operator can CHOOSE a take, and a take the console cannot fully vouch for must say so in the list rather than only once opened.
A THIRD FACT, not a spelling of SavedTake.tracks' xrun or of emptiness. xrun is
"frames were lost during capture", empty is "nothing was ever written", unsealed is "the bytes
are there and the header does not admit it" — and only the last one is repaired by the
recorder's next start.
MEASURED, NEVER STORED (R-049). The sidecar carries no seal flag: one would go stale the
instant the recorder sealed the header, and the file is the only thing that can answer the
question. So this count is not derivable from a SavedTake and is passed IN — see
takeSummary. undefined in, 0 out, and unmeasuredTrackCount === trackCount is
already the field that says the console has not measured this take's files.
ReadonlyxrunWhether ANY track in this take dropped frames. Capture is best-effort by design — the recording is sacrificed before the live audio ever is (§5) — so the flaw belongs where the take is CHOSEN, not only where it is opened.
ONE TAKE AS THE LIBRARY PUBLISHES IT — the header
/takesand/takes/{id}answer.A HEADER, NOT THE DOCUMENT, for the reason import('./session.js').SessionSummary is one of import('./session.js').SavedSession: the library rows exist so an operator can PICK a take, and the body is used through the doors that consume it —
/vsc'stakeIdload and/takes/{id}/render— never read field by field off the wire. Publishing SavedTake whole would put every track (a channel contributes up to three, §0.3) and every rendered band of every take into one frame that re-streams to every open surface on every change.EVERY FIELD IS ON THE RECORD OR DERIVED FROM IT — nothing here is measured, guessed or defaulted, because a picker that shows a fabricated number is one an operator cannot check. That is why there is no
bytes: the store keeps no size,lengthFrames × rate × tracksis the float32 arithmetic and NOT what is on the disk (RF64 headers, and a rendered file beside each original once/takes/{id}/renderhas run), so a byte count here would be a measurement the console never took. It is also whysessionIdandrenderare absent: both are honestly carried, neither has a reader, and a column with no reader is a comment.