openmixer — generated API reference
    Preparing search index...

    Interface ChannelFactDecl

    interface ChannelFactDecl {
        clipboard?:
            | "trim"
            | "mix"
            | "label"
            | "comp"
            | "eq"
            | "gate"
            | "drive"
            | "delay"
            | "reverb"
            | "order"
            | "chain"
            | "sends";
        control?: FactControl;
        intendedHarmonics?: boolean;
        kinds: ReadonlySet<
            | "input"
            | "fxReturn"
            | "aux"
            | "mix"
            | "matrix"
            | "cue"
            | "main"
            | "fxSend"
            | "dca"
            | "muteGroup"
            | "mixMinus",
        >;
        laws?: readonly ContractLaw[];
        needsAnalyser?: true;
        onAbsent?: FactAbsenceRule;
        owner: OwnershipRule;
        persisted: boolean;
        presents?: FactSurface
        | null;
        range?: RangeSource;
        servedAs?: string;
    }
    Index
    clipboard?:
        | "trim"
        | "mix"
        | "label"
        | "comp"
        | "eq"
        | "gate"
        | "drive"
        | "delay"
        | "reverb"
        | "order"
        | "chain"
        | "sends"

    The clipboard part this fact belongs to, if copyable (#57's allowlist). Absent means the allowlist deliberately excludes it — a physical/identity/transient fact, or a genuine gap.

    control?: FactControl

    What KIND of control carries this fact, in ProcessorParam's own words (number / toggle / enum, plus text for a scribble string). Declared so that "has no declared travel" can be told apart from "has no travel to declare": a mute is a toggle and will never own a min/max, while a pan is a number that simply has not been pointed at its declaration yet. Without this, boundsOf's ledger of unsourced facts can never reach zero, and a ledger that cannot converge stops being read.

    readout is a NUMBER NOBODY WRITES — a meter, an analyser bin. It has a display scale but no allowed values, because there is no door to send one through (meter is owner: { kind: 'none' }). Calling it number would demand a travel that guards nothing; calling it toggle would be a lie about its shape. It is exempt from the provenance ledger for the same reason a mute is: there is no operator input to bound.

    ABSENT means unclassified, not "structured" — a fact whose value is a sub-object or a collection is classified by its RANGE instead: how many sends, members or inserts may exist is declared by the SESSION's allocation (range: { kind: 'allocation' }), which is a provenance answer and not an exemption. A fact nobody has adjudicated yet also reads as absent, and the two are separated by classifying, one fact at a time.

    intendedHarmonics?: boolean

    THIS FACT'S STAGE ADDS HARMONIC CONTENT ON PURPOSE.

    Declared by drive and by nothing else (2026-09-14-native-drive-stage.md §8). The console also RUNS an analysis that hunts unusually strong harmonic components and drives EQ and dynamics to tame them (HRP), and without this column the two would fight: HRP would chase the colour the operator just dialled in, and the operator would hear their drive being un-done by something they never armed.

    It is a column and not a rule about lane ORDER because the strip's step list is REORDERABLE. The default order puts drive after the EQ and the dynamics, so HRP's insert point and its actuators both sit ahead of it — but an operator may legitimately move it, and a rule that lived only in the default order would silently stop being true. An analysis row excludes a fact declaring this BY CONSTRUCTION, whatever the order says.

    Absent is the ordinary answer and means what it says: this fact's stage does not deliberately generate harmonics, so an analyser has nothing to exclude.

    kinds: ReadonlySet<
        | "input"
        | "fxReturn"
        | "aux"
        | "mix"
        | "matrix"
        | "cue"
        | "main"
        | "fxSend"
        | "dca"
        | "muteGroup"
        | "mixMinus",
    >

    Which kinds carry this fact. The ONE place kind appears.

    laws?: readonly ContractLaw[]

    THE MACHINE-READABLE LAWS THIS FACT'S NATIVE STAGE HOLDS — the closed operator-facing vocabulary ContractLaw/LAW_KINDS declares (fact-declaration.ts, R-056), one declaration feeding three consumers, operator ruling 2026-09-17: the generated omx_contract_limits.h the C postconditions read (never a hardcoded literal the header also declares), the manual's generated "what this stage guarantees" block, and the UI help entry's rendered sentence (LAW_SENTENCE_KEY, i18n en/ca/es).

    Declared only on the six native processing facts (eq, gate, dynamics, delay, reverb, drive) and the two routing facts whose coefficient feeds a summing bus (pan, toMain) — every other fact carries no C postcondition an operator needs a sentence for and leaves the column absent, same "absent means not yet classified, not refused" reading control already carries. sends rides toMain's linear-sum law by the SAME routing-fact reasoning servedAs already applies (sends/toMain are one row family), so it is not repeated on sends itself.

    needsAnalyser?: true

    THIS FACT'S MACHINE READS THE CHANNEL'S ANALYSER LANE — it cannot work without a spectrum of the channel it is armed on (demand gate, Amendment 2026-09-17, ruled item 2).

    Declared HERE and nowhere else, because it is what the RTA arming vocabulary is DERIVED from: RTA_ARMING_HOLDERS (rta-arming.ts) is selected + explicit + every fact carrying this column + room, so a new detector fact joins the holder set by declaring its column and by nothing else. A hand list beside the vocabulary is exactly the defect this contract exists to delete, and it is the one the 2026-09-17 ruling names outright ("declared once, in core, never a hand list beside the vocabulary it names").

    true or ABSENT, deliberately — a MARK, not a boolean: false would be a second way of spelling the ordinary answer, and the literal type is also what lets AnalyserChannelFact derive the union at compile time rather than restate it.

    room is NOT here and cannot be: the room analysis is not a per-channel fact of the mic it arms (it is the console's own measurement, pointed at a mic it does not own), so it stays a server-side holder name — argued in the amendment, ruled item 2.

    onAbsent?: FactAbsenceRule

    Absence semantics on whole-state restore (FactAbsenceRule) — REQUIRED exactly on persisted rows and forbidden on transients (a transient has no file to be absent from); the pairing is ratcheted.

    Who actuates a write. See OwnershipRule.

    persisted: boolean

    Rides ChannelSnapshotJson (or a sibling per-kind snapshot — DCA/muteGroup membership). false for transients: solo, meter, rta's derived readouts, recall-safe (a live show decision, never written into a session — channel-recall-safe.ts's own ruling).

    presents?: FactSurface | null

    WHERE THIS FACT IS PRESENTED TO AN OPERATOR — the help entries that teach it and the manual heading that documents it (FactSurface; spec revision 6, ruled 2026-09-17).

    null is an ANSWER and the only permitted emptiness: nothing on any surface presents this fact, adjudicated. An absent key is not — every row states the column, because a fact nobody joined and a fact nobody could join are the silence servedAs was added to break, one column over. presents-conformance.test.ts refuses a row that has not decided, checks both declared halves against the surfaces themselves, and holds the reverse direction: a help id belongs to at most one fact, and the ids no fact claims stand in its shrink-only orphan ledger.

    The two OWED columns — i18n and surface — are named in the spec and are not here.

    range?: RangeSource

    Presentation limits come from the capability, not a constant (#66). TODO for phase 3 except where the precedent already exists.

    servedAs?: string

    The path template that SERVES this fact, where it is not /channel/{kind}/{index}/{fact}.

    Absent means the fact's own name IS its sub-path — the default this table's header claims, true for 29 of the 37 facts. The eight that declare a value are served under another name, and BEFORE this column that was indistinguishable from being served nowhere: sourceStereo read as forgotten while its whole value round-trips through the width row, and a gate could not tell the two apart (the 2026-09-01 audit's axis 1, issue #666).

    The value is the MOLD, {kind} and all. Two facts may name the same one — sends and toMain are both instances of the send row, separated by their destination, and parents rides its sibling's members row — so a consumer asking what an ADDRESS may carry takes the UNION of the facts that name it, never one fact's kinds alone.

    It says WHERE, never HOW the row spells the value: the session's own spelling is SNAPSHOT_FIELDS_OF_FACT's concern, and one column answering both would be two questions with one answer.