/** 어댑터가 답하는 세 갈래. 비어 있으면 **말하지 않은 것**이고, `never` 가 아니다. */ export type RetryOutlook = 'again' | 'after-fix' | 'never'; export declare function isRetryOutlook(v: unknown): v is RetryOutlook; /** * `again` 의 물러섬 — 30초 · 2분 · 10분, 그다음 접는다. * * 첫 값이 일꾼의 주기와 같다(§`RULE_PERIOD_MS`). 새 박자를 만들지 않는다. */ export declare const AGAIN_BACKOFF_MS: readonly [30000, 120000, 600000]; /** * `after-fix` 는 **10분마다 계속** 본다 — 접지 않는다(머리말). * * 사람이 설정을 고치는 것을 기다리는 간격이다. 짧게 두면 헛되고, 길게 두면 고쳐 놓고 기다린다. */ export declare const AFTER_FIX_PERIOD_MS = 600000; /** 왜 집지 않는가 — 목록이 「고칠 것」과 「우리 쪽을 보지 말 것」을 갈라 보이게 한다. */ export type SkipReason = /** 종착이거나 넘길 수 없는 상태다. */ 'not-dispatchable' /** 아직 물러섬이 끝나지 않았다 — 다음 기회를 기다린다. */ | 'backing-off' /** 어댑터가 「영원히 안 된다」고 답했다 — 사람이 **새 조치**를 내야 한다. 우리 쪽에 고칠 것이 없다. */ | 'never' /** `again` 을 세 번 다 썼다 — 사람이 봐야 한다. */ | 'attempts-spent' /** 어댑터가 다시 될 일인지 말하지 않았다 — 모르는 것을 재시도로 밀지 않는다. */ | 'outlook-unknown' /** 재시도인데 커넥터가 멱등을 선언하지 않았다 — 두 건이 설 위험을 우리가 지지 않는다. */ | 'not-idempotent'; export interface RetryDecision { /** 지금 넘길 것인가. */ take: boolean; /** 안 넘기면 왜 — 목록이 그대로 보인다. */ skip?: SkipReason; /** 넘길 것이면 이번이 몇 번째 시도인가(첫 시도가 1). */ attempt?: number; /** 이번 시도가 실패하면 다음은 언제인가(ISO). 없으면 더 안 본다. */ nextAttemptAt?: string; } export interface RetryInput { /** 지금 상태 — `approved` 는 첫 시도, `failed` 는 재시도. */ state: string; /** 넘길 수 있는 상태인가 — 상태 기계가 답한다(`nextCommandState(state,'dispatch')`). */ dispatchable: boolean; /** 어댑터가 지난 실패에 답한 갈래. 첫 시도에는 없다. */ retry?: string; /** 지금까지 몇 번 넘겨 봤나. 없으면 0. */ attempts?: number; /** 다음에 볼 시각(ISO). 없으면 지금 봐도 된다. */ nextAttemptAt?: string; /** 이 커넥터가 두 번 보내도 지시가 하나인가 — **선언만 참으로 읽는다.** */ idempotent?: boolean; /** 지금(ms). */ nowMs: number; } /** * 이 조치를 지금 넘길 것인가. * * **모르면 넘기지 않는다.** 어댑터가 갈래를 말하지 않았거나 멱등을 선언하지 않았으면 재시도하지 * 않고 목록에 남긴다 — 오늘 커널의 다른 축에서 지킨 것과 같은 규율이다(정격 사용량·품질 계수기· * 조용한 시각: 모르면 단언하지 않는다). */ export declare function retryDecisionOf(input: RetryInput): RetryDecision;