Problem/Motivation

An installed module or opaque UI configuration does not prove that a particular governed policy is active. Sentinel needs a portable signed artifact, local verification/evaluation, active-revision attestation, and safe disconnected/recovery behavior.

Proposed resolution

Implement the Drupal enforcement leg of the portable policy lifecycle: validate/simulate, verify a signed immutable bundle, activate and attest its revision, cite it in decisions, and support emergency deny, revocation, and rollback.

Acceptance criteria

  • The policy artifact has a versioned portable schema and immutable digest.
  • Local verification rejects invalid, revoked, expired, or unauthorized signatures.
  • Simulation evaluates a hypothetical action without execution against the candidate policy.
  • Activation is atomic and attests the exact active revision.
  • Every governed decision cites the active policy digest.
  • Upstream allow cannot widen local deny.
  • Emergency deny, revocation, rollback, and bounded last-known-good behavior are tested.
  • Disconnected operation never mints new authority or grants.
  • The contract remains provider-neutral and does not require a second system-of-record adapter.

API changes

Adds versioned policy-bundle, simulation, activation-attestation, revocation, and rollback contracts.

Comments

jmcerda created an issue. See original summary.

jmcerda’s picture

Public working mirror: GitHub #113.

Drupal.org remains the authority for this work item; implementation discussion and pull-request linkage may occur in the mirror.

  • jmcerda committed a9340d6b on feature/3616536-portable-policy-bundles
    Issue #3616536: restack onto 1.x after dashboard evidence (#145).
    
    Keep...

  • jmcerda committed 1f44be25 on feature/3616536-portable-policy-bundles
    Issue #3616536: restack onto 1.x after DLP classification.
    
    Resolve...

  • jmcerda committed 52c34d84 on 1.x
    Issue #3616536: restack cite-digest onto portable policy bundles after #...

  • jmcerda committed 9b4a5755 on 1.x
    Issue #3616536: capitalize the logAlways test doc comment.
    
    Drupal....

  • jmcerda committed 985210b0 on 1.x
    Issue #3616536: restack onto 1.x after anomaly signals (#146).
    
    Keep...

  • jmcerda committed e0d7a7ac on 1.x
    Issue #3616536: restack cite-digest onto portable policy bundles after #...

  • jmcerda committed a9340d6b on 1.x
    Issue #3616536: restack onto 1.x after dashboard evidence (#145).
    
    Keep...

  • jmcerda committed 64f4a7b5 on 1.x
    Issue #3616536: cite the active policy-bundle digest on every audit row...

  • jmcerda committed 1f44be25 on 1.x
    Issue #3616536: restack onto 1.x after DLP classification.
    
    Resolve...

  • jmcerda committed 4fca951d on 1.x
    Issue #3616536: satisfy PHPStan on in-memory bundle state
    

  • jmcerda committed 0759ac02 on 1.x
    Issue #3616536: add signed portable policy bundles
    
    Versioned digest-...

  • jmcerda committed 52c34d84 on feature/3616536-cite-digest
    Issue #3616536: restack cite-digest onto portable policy bundles after #...

  • jmcerda committed 9b4a5755 on feature/3616536-cite-digest
    Issue #3616536: capitalize the logAlways test doc comment.
    
    Drupal....

  • jmcerda committed 985210b0 on feature/3616536-cite-digest
    Issue #3616536: restack onto 1.x after anomaly signals (#146).
    
    Keep...

  • jmcerda committed 985210b0 on feature/3616536-portable-policy-bundles
    Issue #3616536: restack onto 1.x after anomaly signals (#146).
    
    Keep...
jmcerda’s picture

Version: 2.3.0 » 2.13.0
Status: Active » Fixed

Released in 2.11.0 (commit 8177ec0 on 1.x) and 2.12.0 (live deny, #3617702). Marking Fixed — the work shipped but the status was never moved.

Every audit row cites the attested digest as policy_bundle_digest when a bundle is active. Live JSON:API AccessResult reasons stay the stable code policy_bundle_denied so the digest is not repeated to clients in meta.omitted.

https://www.drupal.org/project/mcp_sentinel/releases/2.13.0

Now that this issue is closed, review the contribution record.

As a contributor, attribute any organization that helped you, or if you volunteered your own time.

Maintainers, credit people who helped resolve this issue.

Status: Fixed » Closed (fixed)

Automatically closed - issue fixed for 2 weeks with no activity.