/** * The complete status vocabulary. Closed set — if a value is not here, it is * not a status, and normalizeStatus decides what to do about it. */ export declare const ISSUE_STATUSES: readonly ["open", "in_progress", "blocked", "closed", "wontfix"]; export type IssueStatus = (typeof ISSUE_STATUSES)[number]; /** Statuses meaning "no longer needs work". Everything else is live. */ export declare const TERMINAL_STATUSES: ReadonlySet; export declare function isTerminal(status: IssueStatus): boolean; export declare function isLive(status: IssueStatus): boolean; export interface NormalizedStatus { status: IssueStatus; /** Set when the raw value was not already canonical. */ normalizedFrom?: string; /** * True when the raw value matched nothing and the fallback was used. The * caller decides whether that is a warning or a hard error; the model will * not invent a meaning for a value it does not recognize. */ unrecognized?: boolean; } /** * Map any on-disk status to the canonical vocabulary. * * Missing status defaults to `open` — that matches the previous reader's * behaviour and is the safe direction: a record wrongly shown as open gets * triaged, whereas one wrongly shown as closed disappears. */ export declare function normalizeStatus(raw: unknown): NormalizedStatus; export declare const ISSUE_SEVERITIES: readonly ["low", "med", "high", "critical"]; export type IssueSeverity = (typeof ISSUE_SEVERITIES)[number]; export declare const ISSUE_PRIORITIES: readonly ["low", "medium", "high", "critical"]; export type IssuePriority = (typeof ISSUE_PRIORITIES)[number]; export { newUid, isUid } from './uid.js'; /** * One issue, as the rest of the system should think about it. * * Deliberately absent: file path, file format, frontmatter layout, and the * `**Status:**` line that markdown records carry in their body. That line is a * rendering of `status`, not a second copy of it — treating it as data is what * let sixteen records drift into saying `open` while the tools read them as * closed. The codec regenerates it on write; nothing else may touch it. */ export interface Issue { /** Stable identity. Optional only until the backfill completes. */ uid?: string; /** Human-facing label, e.g. ISS-0112. Renumberable; not identity. */ id: string; title: string; status: IssueStatus; severity?: IssueSeverity; priority?: IssuePriority; tags?: string[]; epicId?: string; project?: string; /** * Who is working on this — EPIC-0040. A prefixed identity: `user:`, * `agent:` or `human:`. Never a team, and never a display name. * * Singular on purpose. Assigning to a group is what `team` expresses, and * keeping this one person is what keeps a team a lens rather than an owner * (ADR-0011). */ assignee?: string; /** * Which team the work belongs to — EPIC-0040. Always `team:`, minted * by HQ. Not a slug: a slug would have to be migrated to a uuid later, and * migrating identity is what this whole design exists to avoid. * * A lens, not a wall. Nothing is hidden from anyone by virtue of this field; * it groups, filters and routes. */ team?: string; /** Prose body: the markdown after the header block, or `description:`. */ details?: string; resolution?: string; created_at?: string; updated_at?: string; closed_at?: string; } //# sourceMappingURL=issue.d.ts.map