/**
 * Assemble one gate's row from its cells.
 *
 * Separated from the report's own module because the two do different work:
 * that one reads the world, this one shapes what was read. Everything here is
 * pure — the same inputs give the same row, which is what makes the byte-
 * identical property testable without touching a filesystem.
 * @module cli/gate-report-assemble
 */
import { type CellContext } from "./gate-report-cells.js";
import type { GateRegistryModule, ResolvedGate } from "./gate-report-registry.js";
import type { GateReportRow } from "./gate-report-types.js";
/** One moment's resolution, in axis order. */
export interface ResolvedMoment {
    /** The moment, `:environment` suffix included. */
    readonly moment: string;
    /** `resolveMoment(..., includeOff: true)` keyed by gate id, or null. */
    readonly resolved: Map<string, ResolvedGate> | null;
    /** Why `resolved` is null, when it is. */
    readonly failure: string | null;
}
/**
 * Invert the static job table so a gate can name its CI job.
 * @param registry - The shipped registry
 * @returns Gate id -> job id
 */
export declare function invertJobTable(registry: GateRegistryModule): Map<string, string>;
/**
 * Build one gate's row.
 * @param context - Report-wide cell inputs
 * @param moments - Per-moment resolution results, in axis order
 * @param id - Gate id
 * @param jobForGate - Gate id -> `quality.yml` job
 * @returns The row
 */
export declare function buildRow(context: CellContext, moments: readonly ResolvedMoment[], id: string, jobForGate: ReadonlyMap<string, string>): GateReportRow;
//# sourceMappingURL=gate-report-assemble.d.ts.map