Skip to content

[Task]: Add optimistic concurrency semantics to governance request storage #11

Description

@rian-be

Summary

Strengthen the governance request store contract so persistence providers can protect request updates with optimistic concurrency instead of blind upsert semantics.

Goal

Replace the current unrestricted Store(...) behavior with a contract that can reject stale writes and preserve governance lifecycle correctness.

Scope

What should be implemented?

  • Rework IMutationRequestStore so update semantics are explicit rather than blind overwrite
  • Decide between contracts such as Create, Update, TryUpdate, Save(expectedRevision), or TryTransition
  • Add request revision or equivalent persistence guard to the stored request model
  • Define store behavior when expected revision or expected status does not match
  • Update in-memory storage to follow the same contract
  • Add regression coverage for blind overwrite scenarios

Acceptance Criteria

  • Governance request storage no longer relies on unguarded upsert semantics for lifecycle updates
  • Providers can reject stale writes explicitly
  • The in-memory implementation follows the same concurrency contract as future real providers
  • Test coverage proves blind overwrite behavior is no longer accepted for guarded lifecycle updates
  • The change remains scoped to ModularityKit.Mutator.Governance

Notes

Implemented through:

  • IMutationRequestStore.Create(...)
  • IMutationRequestStore.TryStore(..., expectedRevision)
  • MutationRequest.Revision
  • MutationRequestAlreadyExistsException
  • MutationRequestConcurrencyException
  • updated InMemoryMutationRequestStore
  • regression coverage in MutationRequestStoreContractTests

The old blind overwrite characterization was replaced by guarded store tests that assert duplicate creates and stale writes are rejected.

Metadata

Metadata

Assignees

Labels

runtimeRuntime implementation and execution flow

Type

Fields

No fields configured for Task.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions