import { type ProbeId, type ProbeResult } from './integration-probes.ts'; import { type StagePath } from './stage-path.ts'; import { type FeedKind, type TargetProfile } from './integration-target-profile.ts'; /** 호출자가 모아 오는 사실. 전부 `null` 이 「모른다」다 — 0 이나 false 로 채우지 않는다. */ export interface SuiteFacts { /** 이 트윈이 무엇인가. 시뮬은 원천에서 받는 것이 없다(라이브 프로브는 해당 없음). */ subject: 'live' | 'sim' | 'stopped' | 'unknown'; /** 레퍼런스(원천 어댑터)에서 왔나. 템플릿으로 세운 트윈은 옮겨 온 마스터가 없다. */ fromReference: boolean; /** `capabilitiesOf(adapter)` — 선언∩구현. */ adapterCapabilities: readonly string[]; connectOk: boolean | null; siteCount: number | null; locationCount: number | null; itemCount: number | null; /** 마지막 동기의 못 옮긴 값 수(`TwinReference.lastWarningCount`). */ lastWarningCount: number | null; /** 저널 누적 — 재시작에도 남는다(인메모리 계기와 다르다). */ journalTotal: number | null; /** 저널의 `action='DELETE'` 수 — **반출 관측**. 승격 전 행은 세어지지 않으므로 `null` 이 정직하다. */ removalsJournaled: number | null; specCoverage: { declared: number; total: number; } | null; forecastRan: boolean | null; feed: FeedKind; } export interface SuiteAssessment { results: ProbeResult[]; profile: TargetProfile; path: StagePath; notApplicable: { id: ProbeId; detail?: string; }[]; forbiddenClaims: string[]; /** 다음에 돌릴 프로브 — 쓰기 동의 없이는 쓰기 프로브가 빠진다. */ planned: ProbeId[]; } export declare function assessSuite(f: SuiteFacts, opts?: { allowWrites?: boolean; }): SuiteAssessment; /** 시퀀스 명세 — 화면이 회색 칸의 이유(해당 없음·미실행)를 나란히 보이도록 함께 낸다. */ export declare const SUITE_SPEC: readonly import("./integration-probes.ts").ProbeSpec[];