/**
 * Faithful skeleton emitter — deterministic SpecVerseFacts to spec yaml
 * (engines 6.23.0+, plan: 2026-05-04-ANALYSE-VIA-FAITHFUL-SKELETON-AND-MICROCALLS).
 *
 * Architectural principle (user-articulated): the analyse phase must
 * produce a spec that is a FAITHFUL MIRROR of the codebase. If a query
 * method is not in source, the spec has no retrieve op. No defaults, no
 * fabrication. The existing inference engine (spv infer) is for
 * from-scratch authoring expansion; it is the wrong building block for
 * analyse output. A future spv enhance command (TODO #48) is where
 * default-filling lives.
 *
 * Forward-logging discipline: every emission records a provenance entry
 * mapping the emitted yaml line range to its source fact + emission
 * rule. The report assembler reads from the provenance ledger; no
 * backward parsing of the yaml is needed to know where each line came
 * from.
 */
import type { SpecVerseFacts } from '../analyse-prepass/index.js';
export interface SkeletonEmissionDecision {
    /** 1-based inclusive yaml line range produced by this emission. */
    lineRange: [number, number];
    /** Dotted yaml path the emission produced (best effort, advisory). */
    yamlPath: string;
    /** Emission rule that fired — see EMISSION_RULES below. */
    rule: SkeletonEmissionRule;
    /** Source fact reference. JSON-pointer-style into facts.json when possible. */
    sourceFactRef?: string;
    /** Source file + line range when the rule traces to a concrete code location. */
    sourceLocation?: {
        filePath: string;
        lineRange: [number, number];
    };
    /** Free-form note for human readers. */
    note?: string;
}
export type SkeletonEmissionRule = 'header-component-from-suggested' | 'header-component-default-when-none-suggested' | 'model-from-detected-entity' | 'model-attribute-from-detected-attribute' | 'model-relationship-from-detected-relationship' | 'model-lifecycle-from-detected-lifecycle' | 'model-lifecycle-transition-from-detected-transition' | 'controller-from-walked-class' | 'service-from-walked-class' | 'cured-op-from-level1-curved-method' | 'action-stub-from-business-method' | 'event-from-detected-emit' | 'view-from-react-component' | 'view-description-from-react-kind' | 'view-description-from-source-docstring' | 'view-description-from-humanized-name' | 'view-type-from-jsx-classifier' | 'view-uses-from-jsx-composition' | 'view-action-from-jsx-handler' | 'view-empty-state-from-jsx-conditional' | 'import-from-component-imports-graph' | 'import-from-non-library-subprocess' | 'import-from-non-library-service-client' | 'import-from-non-library-messaging' | 'import-from-non-library-managed-sdk' | 'comment-skeleton-marker';
export interface SkeletonProvenance {
    schemaVersion: '1.0';
    /** When the skeleton was emitted (ISO timestamp). */
    emittedAt: string;
    /** Total emission decisions recorded. */
    emissionCount: number;
    /** Per-rule emission count — quick diagnostic. */
    emissionsByRule: Record<string, number>;
    /** All emission decisions in source-yaml order. */
    emissions: SkeletonEmissionDecision[];
    /** Action stubs the emitter produced — entry points for the per-action
     *  micro-call orchestrator. Each stub knows where to look up the
     *  walker timeline that should drive its body. */
    actionStubs: Array<{
        componentName: string;
        ownerKind: 'controller' | 'service';
        ownerName: string;
        actionName: string;
        sourceLocation: {
            filePath: string;
            lineRange: [number, number];
        };
        /** Index into facts.candidateMethods[].methods[] for the timeline. */
        candidateMethodRef: {
            className: string;
            methodIndex: number;
        };
        /** yaml path where the action stub was emitted, for in-place body merge. */
        yamlPath: string;
    }>;
    /**
     * Single-home entity assignments — each detected entity mapped to
     * exactly one spec component. Forward-logged so the audit trail can
     * answer "why did entity X land in component Y" without re-deriving
     * from facts.json. Reason values: 'first-named-match' | 'fallback'.
     */
    entityHomeAssignments?: Array<{
        entityName: string;
        componentSpecName: string;
        reason: 'first-named-match' | 'fallback';
        matchedComponentSuggestedName?: string;
    }>;
}
/**
 * Faithfully emit a skeleton spec from prepass facts.
 *
 * The skeleton mirrors source: only what was detected gets emitted.
 * Action bodies are STUBS — name + parameters + return placeholder + a
 * pointer to the candidate-step timeline the per-action LLM micro-call
 * should consume. The orchestrator merges per-action LLM output back
 * into the skeleton afterward.
 */
export declare function emitFaithfulSkeleton(facts: SpecVerseFacts): {
    skeleton: string;
    provenance: SkeletonProvenance;
    /**
     * Side products from skeleton emission that downstream emitters
     * (deployment-emitter, future enhance pass) can reuse instead of
     * recomputing the attribution logic. Returned at engines 6.28.0+.
     */
    classesByComponent: Map<string, Array<{
        entityName: string;
        filePath: string;
    }>>;
    entityHome: Map<string, string>;
};
//# sourceMappingURL=skeleton-emitter.d.ts.map