Problem
The durable SQLite session backend can support protected records with a 4 MiB plaintext ceiling plus 64 KiB of envelope/framing reserve, but the consensus profile cannot truthfully advertise that capacity end to end:
CONSENSUS_MAX_RPC_PAYLOAD_BYTES is 2 MiB, so a larger CAS command is rejected before Raft proposal.
- Consumer batch response admission budgets four JSON bytes per stored payload byte under an 8 MiB aggregate ceiling, so raising the consensus value capability would reject every Get/CAS batch slot.
- Network frames remain independently bounded and must stay consistent with both request and response ceilings.
This is a generic session-consensus transport/capability gap. Product-specific code must not bypass it or invent a local store/transport substitute.
Required scope
- Define one explicit maximum protected session value supported by consensus, including command, replication, snapshot, restore, and consumer response framing.
- Make
ConsensusSessionStore::capabilities().max_value_bytes truthful for that complete path.
- Admit a protected 4 MiB plaintext record plus bounded envelope/framing overhead through a real multi-node proposal and exact readback.
- Preserve bounded allocation, batching, cancellation, redaction, and fail-closed oversize behavior.
- Keep point operations usable without making small Get/CAS batches unconditionally fail merely because the backend supports a larger value.
- Reject exact one-over request/response/replication boundaries before mutation.
Evidence
- Unit boundary tests for consensus codec/RPC and consumer response admission.
- Exact-at-limit and one-over proposal tests.
- Multi-node encrypted CAS/readback/restore proof.
- Mutation proving that lowering any required transport or response fence makes the acceptance test RED.
Refs #663.
Problem
The durable SQLite session backend can support protected records with a 4 MiB plaintext ceiling plus 64 KiB of envelope/framing reserve, but the consensus profile cannot truthfully advertise that capacity end to end:
CONSENSUS_MAX_RPC_PAYLOAD_BYTESis 2 MiB, so a larger CAS command is rejected before Raft proposal.This is a generic session-consensus transport/capability gap. Product-specific code must not bypass it or invent a local store/transport substitute.
Required scope
ConsensusSessionStore::capabilities().max_value_bytestruthful for that complete path.Evidence
Refs #663.