export interface Feature { readonly id: string; readonly category: "functional" | "visual" | "performance" | "security" | "ux"; readonly description: string; readonly priority: number; readonly steps: string[]; passes: boolean; passedAt?: string; failureNotes?: string; } export interface FeatureRegistrySnapshot { version: number; createdAt: string; updatedAt: string; features: Feature[]; } export interface FeatureRegistrySummary { total: number; passing: number; failing: number; byCategory: Record; } export type FeatureInit = Omit; export declare class FeatureRegistry { private readonly filePath; private readonly lockPath; constructor(path: string); /** * Initializer agent calls this once to populate the registry. * Throws if the file already exists — prevents accidental overwrites. */ initialize(features: FeatureInit[]): Promise; /** * Returns the next feature to work on: highest-priority feature that * is not yet passing. Returns null when all features pass. */ getNextFeature(): Promise; /** * Returns all features in the registry. */ getAll(): Promise; /** * Returns a summary: total, passing, failing, by category. */ getSummary(): Promise; /** * The ONLY mutation a coding agent may call. * Throws FeatureRegistryMutationError if any immutable field differs. * Throws FeatureNotFoundError if the feature ID doesn't exist. */ markResult(id: string, passes: boolean, failureNotes?: string): Promise; /** * Returns full snapshot for serialization into handoff artifacts. */ snapshot(): Promise; /** * Validates that a proposed update does not mutate immutable fields. * Exported for testing — agents should not call this directly. */ static validateMutation(existing: Feature, update: Partial): void; private readSnapshot; } //# sourceMappingURL=FeatureRegistry.d.ts.map