/** * [ref] —— **世代账**([ref] §2 世代账,codex 设计审 F4)。 * * 身份标 = 上游 `EffectiveConfig.version`,**刻意不造跨进程 epoch**(codex F4 语义不变): * · 同版本幂等重放(etag 未推进的下一拍)不该伪增世代; * · 双副本对账「是不是同一代」必须能跨进程判 —— 同 source version = 同一代。 * * 🔴 [ref](test [ref],[ref] 阻断裁定):**序轴与身份标分离**。source version 在 * `CONFIG_PROVIDER=local` 下是 registry-core file-store 的内容哈希(u53,上游契约只承诺 * 「同 files ⇒ 同 number」,从未承诺序)——把它当序数消费,哈希更小的合法新代会被永久 * 静默忽略且本账双盲(target/applied 都不动)。修后:**推进判断吃收货处铸的进程内单调 * ordinal**(config-center `generationOf`;等版本重放沿用同 ordinal=幂等语义保留), * `version` 只做对账身份标——configTargetVersion 语义从「max(见过)」变为「**最后**见过的 * 源代」(remote 单调腿二者等价;local 腿这才是真相)。 * * 读面两个:`/health` 的三键(target / applied / 失败持续时长;[ref] 起 additive 补 * targetOrdinal/appliedOrdinal 两键=推进/停滞的机器判据)给编排器判「这个副本要不要摘」; * 诊断端点的 `configApply` 段给运维看**按组**的细节(哪一组停在哪一代、上一次为什么被拒)。 * * 🔴 原子承诺的**域**是单进程(§2):本账记的是「本副本的收敛状态」,不是 fleet 的。fleet 级判据 = 各副本 * /health 的 applied == target,拉齐工具归运维面。 */ /** 一组的收敛状态(批1 只有 limitsHttp 组;后续批次按组追加,读面形不变)。 */ export interface ConfigApplyGroupState { /** 本组最后一次**真的落地**的源版本(身份标)。 */ readonly appliedVersion: number; /** 被判定为「只能重启生效」的键 + 铸因(热路径拒了,但拒因是姿态而不是坏值)。 */ readonly deferredKeys?: ReadonlyArray<{ readonly key: string; readonly reason: string; }>; /** 上一次整批被拒(消毒:键名 + 判据文案 + 版本 + 时刻;**绝不含值**)。 */ readonly lastRejected?: { readonly keys: readonly string[]; readonly reason: string; readonly version: number; readonly at: number; }; } export interface ConfigApplyLedgerView { /** 本副本**最后**见到的源版本(身份标;拉到即算,哪怕候选被整拒)。 */ readonly configTargetVersion: number; /** 最后一次成功 commit 的源版本(身份标)。 */ readonly configAppliedVersion: number; /** [ref]:target 的收货序数(进程内单调)——「见过多少代」的推进判据,哈希方向免疫。 */ readonly configTargetOrdinal: number; /** [ref]:applied 的收货序数。targetOrdinal 推进而这里停滞 = 「改了没生效」的机器判据。 */ readonly configAppliedOrdinal: number; /** target≠applied 的**持续**时长(ms);收敛时键缺席(健康面不制造噪音)。 */ readonly configApplyStaleMs?: number; readonly groups: Readonly>; } /** applyEffective 的 post-commit 报告(见 apply-effective.ts `ApplyReport`)。 */ export interface ConfigApplyReport { readonly version: number; /** [ref]:本候选的收货序数(applyEffective opts.generation 原样带回;缺席=version 兼容臂)。 */ readonly ordinal?: number; readonly limits: { readonly applied: readonly string[]; readonly deferred?: ReadonlyArray<{ readonly key: string; readonly reason: string; }>; readonly rejected?: { readonly keys: readonly string[]; readonly reason: string; readonly restartReason?: string; }; }; readonly fullyApplied?: boolean; } export interface ConfigApplyLedger { /** 拉到一个候选(无论后续是否应用)。ordinal=收货序数,version=身份标。 */ seenTarget(ordinal: number, version: number): void; /** 一个候选整体 commit 成功。 */ applied(ordinal: number, version: number): void; /** 消费 applyEffective 的报告(按组记账)。 */ recordApply(report: ConfigApplyReport): void; view(): ConfigApplyLedgerView; } export declare function createConfigApplyLedger(now?: () => number): ConfigApplyLedger; //# sourceMappingURL=apply-ledger.d.ts.map