You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
P1 (codex on 5e27f2d line 1804): §7.1 Phase 2 step 7 quiescence barrier blocked engine.Propose globally before submitting the cutover entry, but step 3 of the same sequence is itself an engine.Propose call -- so the literal implementation would reject its own cutover proposal and leave the cluster stuck in a write-rejecting barrier forever. Specify a per-call source tag: USER proposals from coordinators are blocked, but the encryption-admin path (cutover proposals + RegisterEncryptionWriter triggered by ConfChangeAddLearner mid-cutover) bypasses with source = "encryption_admin".
P2 (codex on 5e27f2d line 1317): §6.1 RPC schema used uint32 for local_epoch but the §4.1 nonce field reserves only 16 bits. Without explicit decode-side validation, a corrupted/malicious response carrying a value > 0xFFFF would silently truncate when copied into the nonce field, breaking the monotonicity invariant the round-18 ErrLocalEpochRollback was added to enforce. Added explicit "value <= 0xFFFF or ErrLocalEpochOutOfRange" rule applied symmetrically to CapabilityReport.local_epoch and every value in SidecarStateReport.writer_registry_for_caller. New ErrLocalEpochOutOfRange added to §9.1 startup refusal list (and applies on every RPC decode site).
Copy file name to clipboardExpand all lines: docs/design/2026_04_29_proposed_data_at_rest_encryption.md
+47-7Lines changed: 47 additions & 7 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1314,7 +1314,7 @@ pre-conditions and idempotency rules are different.
1314
1314
string build_sha = 2;
1315
1315
bool sidecar_present = 3;
1316
1316
uint64 full_node_id = 4; // for §5.6 batch registry
1317
-
uint32 local_epoch = 5; // for §5.6 batch registry
1317
+
uint32 local_epoch = 5; // 16-bit value -- see decode rule
1318
1318
}
1319
1319
message SidecarStateReport {
1320
1320
map<uint32, bytes> wrapped_deks_by_id = 1; // every unretired DEK
@@ -1323,12 +1323,26 @@ pre-conditions and idempotency rules are different.
1323
1323
bool storage_envelope_active = 4;
1324
1324
uint64 raft_envelope_cutover_index = 5;
1325
1325
uint64 latest_applied_index = 6;
1326
-
map<uint32, uint32> writer_registry_for_caller = 7; // dek_id → last_seen_local_epoch for caller's uint16(node_id), used by §5.5 to forbid local_epoch rollback after resync
1326
+
map<uint32, uint32> writer_registry_for_caller = 7; // dek_id → last_seen_local_epoch for caller's uint16(node_id), 16-bit value
0 commit comments