Why
PR #414 can ship an initial Dapr-backed blackboard store after the public API blockers are fixed, but the deeper distributed-write semantics need a separate hardening pass. Artifact/index atomicity, TTL exceptions, encrypted backend fallbacks, and ETag conflict retries should be explicit before users rely on Dapr as a shared blackboard backend.
Scope
- Define a Dapr blackboard guarantee matrix for transactional, TTL, encrypted, and non-transactional modes.
- Decide when artifact data and index updates can be committed in one
execute_state_transaction.
- Document and test the weaker TTL path where artifact metadata forces a separate
save_state.
- Implement ETag conflict retries by re-reading current state before retrying.
- Add failure-injection tests for partial writes, transaction failures, ETag conflict success/exhaustion, and reconciliation behavior.
- Update docs and examples so durability claims match implementation.
OpenSpec
Out of Scope
DaprStateSessionStore
- Dapr Pub/Sub, workflows, actors, bindings, or service invocation
- Broad replacement of the BlackboardStore contract
Acceptance Criteria
- Dapr docs include a clear guarantee matrix.
- Transactional no-TTL publish can commit artifact and indexes atomically, or the design documents why not.
- TTL/encrypted/non-transactional paths have tested and documented reconciliation semantics.
- ETag retry behavior is wired into real read-modify-write paths and tested for success and exhaustion.
Why
PR #414 can ship an initial Dapr-backed blackboard store after the public API blockers are fixed, but the deeper distributed-write semantics need a separate hardening pass. Artifact/index atomicity, TTL exceptions, encrypted backend fallbacks, and ETag conflict retries should be explicit before users rely on Dapr as a shared blackboard backend.
Scope
execute_state_transaction.save_state.OpenSpec
openspec/changes/harden-dapr-blackboard-atomicity/Out of Scope
DaprStateSessionStoreAcceptance Criteria