Closed (fixed)
Project:
MCP Sentinel
Version:
2.3.0
Component:
Code
Priority:
Normal
Category:
Task
Assigned:
Unassigned
Reporter:
Created:
13 Aug 2026 at 14:52 UTC
Updated:
28 Aug 2026 at 14:10 UTC
Jump to comment: Most recent
Content locks and preconditions protect some governed writes, but the invariant is not proven across every enabled write channel. A second channel must not bypass an active lock or silently overwrite a concurrent human or agent change.
Centralize lock and version-precondition enforcement at the source-of-record boundary used by every governed write path.
concurrent writes, and lock expiry/release.
All governed write results expose a consistent conflict/precondition failure contract.
Comments
Comment #2
jmcerdaPublic working mirror: GitHub #108.
Drupal.org remains the authority for this work item; implementation discussion and pull-request linkage may occur in the mirror.
Comment #3
jmcerdaMerged to 1.x: https://github.com/Wilkes-Liberty/mcp_sentinel/pull/120 (merge 7d27618). Ships in the next release.
Lock and version-precondition enforcement now lives at one boundary every governed write channel runs — JSON:API, GraphQL, the Tool plugins, and direct saves, covering relationship-only writes, translations, and deletes (bulk delete included, which previously skipped locks). An active lock held by a different server-resolved principal denies the write and the delete with a stable reason; the acting principal's own lock never blocks it. A save whose loaded copy is no longer the stored default revision is refused instead of overwriting the concurrent change, and every retry of a conflict fails identically without mutating anything. Validated seams get a 422; the unvalidated seam aborts after writing evidence that survives the storage rollback. Passing governed updates record an execution receipt (checked lock state, loaded revision, final target revision) on the audit row, which now writes only after the save commits. Ungoverned human traffic is never gated.
Coverage: twelve new kernel tests across the matrix (both seams, ownership, expiry/release, staleness with concurrent-edit survival, forward-draft continuation, relationship-only, translations, delete, ungoverned); full suite 553 tests / 5053 assertions green on Drupal 10.6 and 11.3 in CI.