@oss-autopilot/core - v3.7.0
    Preparing search index...

    Interface SearchCandidate

    One candidate row in SearchOutput/FeaturesOutput. Extracted so the features command can reuse the exact contract runSearch already publishes — keeping the two outputs structurally identical for everything except the bucket-specific horizon annotation.

    interface SearchCandidate {
        grade: { letter: "A" | "B" | "C" | "F"; reason: string };
        issue: {
            labels: string[];
            number: number;
            repo: string;
            repoUrl: string;
            title: string;
            url: string;
        };
        linkedPR?: CandidateLinkedPR;
        reasonsToApprove: string[];
        reasonsToSkip: string[];
        recommendation: "approve"
        | "skip"
        | "needs_review";
        repoScore?: {
            closedWithoutMergeCount: number;
            isResponsive: boolean;
            lastMergedAt?: string;
            mergedPRCount: number;
            score: number;
        };
        searchPriority: SearchPriority;
        viabilityScore: number;
    }
    Index

    Properties

    grade: { letter: "A" | "B" | "C" | "F"; reason: string }

    Letter grade (A/B/C/F) computed from the autopilot-tracked repoScore. Scout's search does not emit per-candidate projectHealth, so scout-side signals are treated as unknown; unscored repos grade 'F'. See #1043.

    issue: {
        labels: string[];
        number: number;
        repo: string;
        repoUrl: string;
        title: string;
        url: string;
    }

    First linked PR on the issue, when scout surfaced one. Optional — absent when no linked PR exists. isStalled flags revive opportunities (open PR + no updates for 30+ days, scout 0.9.0 #97).

    reasonsToApprove: string[]
    reasonsToSkip: string[]
    recommendation: "approve" | "skip" | "needs_review"
    repoScore?: {
        closedWithoutMergeCount: number;
        isResponsive: boolean;
        lastMergedAt?: string;
        mergedPRCount: number;
        score: number;
    }

    Type Declaration

    • closedWithoutMergeCount: number
    • isResponsive: boolean
    • OptionallastMergedAt?: string
    • mergedPRCount: number
    • score: number

      1-10 scale repository quality score

    searchPriority: SearchPriority
    viabilityScore: number

    0-100 scale composite viability score. Sanitized on the boundary (#1043): out-of-contract values are coerced to 0 and logged.