/**
 * Branded ID types — nominal typing for entity identifiers.
 *
 * All entity IDs use branded types to prevent accidental misuse.
 * A `TaskId` cannot be passed where a `RunId` is expected, even
 * though both are strings at runtime.
 *
 * Constructor functions validate format and return `Result<T, E>` —
 * parse-don't-validate at the boundary, then pass branded values
 * through the pipeline.
 *
 * The `Brand` utility and `Result` type are defined here as the
 * foundation. Existing branded types in the codebase (`ReportId`,
 * `ISOTimestamp`) use inline branding — those will be migrated to
 * use this utility in Phase 7.
 *
 * @see docs/design-docs/architecture-overhaul/domain-model.md (canonical)
 * @see docs/design-docs/parse-dont-validate.md (design principle)
 */
/** Unique symbol for nominal type branding */
declare const __brand: unique symbol;
/**
 * Brand a base type `T` with a nominal tag `B`.
 *
 * At runtime, branded values are identical to their base type.
 * At compile time, `Brand<string, "TaskId">` is incompatible with
 * `Brand<string, "RunId">` — preventing accidental ID swaps.
 */
export type Brand<T, B extends string> = T & {
    readonly [__brand]: B;
};
/** Unique identifier for a grader judgment (D0052 granular). */
export type JudgmentId = Brand<string, "JudgmentId">;
/** Unique identifier for an evaluation task */
export type TaskId = Brand<string, "TaskId">;
/** URL-safe slug for a task (derived from title) */
export type TaskSlug = Brand<string, "TaskSlug">;
/** Unique identifier for an evaluation suite */
export type SuiteId = Brand<string, "SuiteId">;
/** Unique identifier for an evaluation run */
export type RunId = Brand<string, "RunId">;
/** Content-addressable fingerprint for a run's inputs */
export type RunFingerprint = Brand<string, "RunFingerprint">;
/** Unique identifier for a single task × provider result */
export type ResultId = Brand<string, "ResultId">;
/** Unique identifier for a trace (observability record) */
export type TraceId = Brand<string, "TraceId">;
/**
 * Unique identifier for a published report (UUID v7).
 *
 * Note: An existing `ReportId` branded type is defined in
 * `packages/core/src/types/index.ts` using inline branding.
 * This definition uses the `Brand` utility for consistency.
 * Phase 7 will unify them.
 */
export type NewReportId = Brand<string, "ReportId">;
/** Unique identifier for a provider (LLM, MCP server, agent harness) */
export type ProviderId = Brand<string, "ProviderId">;
/** Unique identifier for a prompt template */
export type PromptId = Brand<string, "PromptId">;
/** Unique identifier for a rubric scoring template */
export type RubricId = Brand<string, "RubricId">;
/** Unique identifier for a fixture (test data) */
export type FixtureId = Brand<string, "FixtureId">;
/** Unique identifier for a build artifact */
export type ArtifactId = Brand<string, "ArtifactId">;
/**
 * The dimensions an artifact is evidence about. Axes determine where the
 * artifact lives, how its entry key is shaped, and — at module load — whether
 * its declared layout is allowed.
 *
 * Unbounded axes (`task`, `model`, `trial`) force `layout: "per-entry"` at the
 * registry invariant; the other axes are finite enough that bulk is acceptable.
 *
 * `category` identifies a classification bucket for artifacts that partition
 * per-mode (e.g. `failureModes`, one entry per classified failure category —
 * D0033 M7, W0051 Slice 2).
 */
export type AssociationAxis = "run" | "mode" | "task" | "model" | "grader" | "trial" | "category" | "report";
/**
 * The sanitized, filename-safe identifier for a single per-entry artifact
 * object. Produced by `ArtifactDescriptor.formatEntryKey` and parsed by
 * `parseEntryKey`; not a free-form string at runtime.
 */
export type EntryKey = Brand<string, "EntryKey">;
/**
 * The subset of `AssociationAxis` values an artifact carries at write time.
 * Used on the writer API (`emit(type, association, payload)`) and on manifest
 * entries so the axes that identify the entry are self-describing in storage.
 *
 * Canonical axes are strongly-keyed. Descriptors whose per-entry layout is
 * discriminated by a name that isn't a pipeline axis (e.g. `sinkResults` by
 * sink name, `callbackRequest` by callback target) read that identifier from
 * the `name` slot. Keep ad-hoc keys out of the canonical axis list so the
 * module-load invariant (unbounded-axis ⇒ per-entry) stays crisp.
 */
export type AssociationValues = Partial<Record<AssociationAxis, string | number>> & {
    readonly name?: string;
};
/**
 * A success result containing a value.
 */
export interface Ok<T> {
    readonly ok: true;
    readonly value: T;
}
/**
 * A failure result containing an error.
 */
export interface Err<E> {
    readonly ok: false;
    readonly error: E;
}
/** Discriminated union for parse results — parse-don't-validate pattern */
export type Result<T, E> = Ok<T> | Err<E>;
/** Construct a success result */
export declare function ok<T>(value: T): Ok<T>;
/** Construct a failure result */
export declare function err<E>(error: E): Err<E>;
/** Error returned when an ID string fails format validation */
export interface IdValidationError {
    /** Error code identifying the specific validation failure */
    code: string;
    /** The raw input that failed validation */
    raw: string;
    /** Human-readable error message */
    message: string;
}
/**
 * Parse a raw string into a `TaskId`.
 *
 * Valid format: alphanumeric + hyphens, 1–128 characters.
 * Examples: `"groq-projection-basics"`, `"mcp-server-tools-list"`
 */
export declare function taskId(raw: string): Result<TaskId, IdValidationError>;
/**
 * Parse a raw string into a `RunId`.
 *
 * Accepts the canonical `run_YYYYMMDDTHHMMSSZ_<8 base36>` shape (D0035)
 * and the legacy `run_<32 hex>` UUIDv7 shape for back-compat with runs
 * generated before the scheme change.
 */
export declare function runId(raw: string): Result<RunId, IdValidationError>;
/**
 * Generate a new `RunId` with a human-readable UTC timestamp plus a
 * random suffix (D0035). Shape: `run_YYYYMMDDTHHMMSSZ_<8 base36>`.
 *
 * Lexicographic ordering matches creation time. One generator call per
 * pipeline invocation; every step reads the resulting id from
 * `AppContext.runId`.
 */
export declare function generateRunId(): RunId;
/**
 * Parse a raw string into a `SuiteId`.
 *
 * Valid format: `suite_` prefix followed by alphanumeric characters.
 */
export declare function suiteId(raw: string): Result<SuiteId, IdValidationError>;
/**
 * Parse a raw string into a `ResultId`.
 *
 * Valid format: `res_` prefix followed by alphanumeric characters.
 */
export declare function resultId(raw: string): Result<ResultId, IdValidationError>;
/**
 * Parse a raw string into a `TraceId`.
 *
 * Valid format: `trace_` prefix followed by alphanumeric characters.
 */
export declare function traceId(raw: string): Result<TraceId, IdValidationError>;
/**
 * Parse a raw string into a `ProviderId`.
 *
 * Valid format: colon-separated segments (e.g., `"openai:chat:gpt-4o"`).
 */
export declare function providerId(raw: string): Result<ProviderId, IdValidationError>;
/**
 * Parse a raw string into a `FixtureId`.
 *
 * Valid format: alphanumeric + hyphens, 1–128 characters.
 */
export declare function fixtureId(raw: string): Result<FixtureId, IdValidationError>;
/**
 * Parse a raw string into a `JudgmentId`.
 *
 * See `JUDGMENT_ID_RE` for the accepted formats.
 */
export declare function judgmentId(raw: string): Result<JudgmentId, IdValidationError>;
/**
 * Generate a deterministic `JudgmentId` for a synthesized fall-back
 * judgment. Salting with `runId` (when supplied) makes the id unique
 * per-run so consumers' `(taskId, modelId, dimension)` dedup key
 * doesn't collide across re-runs of the same task — every run writes
 * fresh ids that still encode the natural composite key.
 *
 * When `runId` is absent the salt collapses to `nosalt`, preserving the
 * legacy "deterministic across runs" shape for callers that explicitly
 * want it (e.g. unit tests that assert the exact id string).
 */
export declare function generateJudgmentId(input: {
    taskId: string;
    modelId: string;
    dimension: string;
    runId?: RunId | string;
}): JudgmentId;
export {};
