Implement the engine spine: claim, outbox, machine, API
Contracts first (T02–T04): approval claim schema with issuer, freshness,
and binding digest; local transactional outbox wire; load-bearing cadence
as heartbeat or reconciliation (layer.yaml declared).
Then the object (T06–T08): SQLite closed state machine, CAS supersession,
distinct-approver fail-closed, revocation without holder cooperation,
outbox insert in the same transaction. Tests fail the mutation when
emission fails, and revoke while the drain sink is down.
Introspection GET /v1/approvals/{id}/claim is a PIP fact, not a decision.
No public consume (T05 waits on GH-WP-0002-T06). Canon T-06 coverage for
wrong binding, expiry, revoke, and supersede.
FLEX-WP-0017 T03 is unblocked on this object; T05 remains blocked only on
consumption ordering.
Assistant: grok
Assistant-Session: 01a04ceb-2057-7e20-b0f9-c282964d5dd9
2026-08-29 12:52:49 +02:00
|
|
|
# Handoff for `access-engine` / `FLEX-WP-0017`
|
|
|
|
|
|
|
|
|
|
`FLEX-WP-0017` T03 waited on a durable object that was not the State Hub
|
|
|
|
|
`/decisions/{uuid}` shape. That object is this engine.
|
|
|
|
|
|
|
|
|
|
## What exists
|
|
|
|
|
|
|
|
|
|
- Claim contract: [`approval-claim.md`](approval-claim.md)
|
|
|
|
|
- Introspection: `GET /v1/approvals/{id}/claim`
|
|
|
|
|
- Object: `POST /v1/approvals`, entries, revoke, supersede
|
2026-09-01 23:45:48 +02:00
|
|
|
- Consumption: `POST /v1/approvals/{id}/consume`, called by the PEP before the
|
|
|
|
|
protected side effect under `GH-DEC-2026-003`
|
Implement the engine spine: claim, outbox, machine, API
Contracts first (T02–T04): approval claim schema with issuer, freshness,
and binding digest; local transactional outbox wire; load-bearing cadence
as heartbeat or reconciliation (layer.yaml declared).
Then the object (T06–T08): SQLite closed state machine, CAS supersession,
distinct-approver fail-closed, revocation without holder cooperation,
outbox insert in the same transaction. Tests fail the mutation when
emission fails, and revoke while the drain sink is down.
Introspection GET /v1/approvals/{id}/claim is a PIP fact, not a decision.
No public consume (T05 waits on GH-WP-0002-T06). Canon T-06 coverage for
wrong binding, expiry, revoke, and supersede.
FLEX-WP-0017 T03 is unblocked on this object; T05 remains blocked only on
consumption ordering.
Assistant: grok
Assistant-Session: 01a04ceb-2057-7e20-b0f9-c282964d5dd9
2026-08-29 12:52:49 +02:00
|
|
|
- Native `binding.digest` plus optional `binding.pdp_digest` for
|
|
|
|
|
`NewDecisionBinding.request_digest`
|
|
|
|
|
|
|
|
|
|
T03 is unblocked on the **object**, not on a hub substitute. Validate the
|
|
|
|
|
claim before privileged production actions. Fail closed if this engine is
|
|
|
|
|
unreachable.
|
|
|
|
|
|
2026-09-01 23:45:48 +02:00
|
|
|
## Consumption contract
|
Implement the engine spine: claim, outbox, machine, API
Contracts first (T02–T04): approval claim schema with issuer, freshness,
and binding digest; local transactional outbox wire; load-bearing cadence
as heartbeat or reconciliation (layer.yaml declared).
Then the object (T06–T08): SQLite closed state machine, CAS supersession,
distinct-approver fail-closed, revocation without holder cooperation,
outbox insert in the same transaction. Tests fail the mutation when
emission fails, and revoke while the drain sink is down.
Introspection GET /v1/approvals/{id}/claim is a PIP fact, not a decision.
No public consume (T05 waits on GH-WP-0002-T06). Canon T-06 coverage for
wrong binding, expiry, revoke, and supersede.
FLEX-WP-0017 T03 is unblocked on this object; T05 remains blocked only on
consumption ordering.
Assistant: grok
Assistant-Session: 01a04ceb-2057-7e20-b0f9-c282964d5dd9
2026-08-29 12:52:49 +02:00
|
|
|
|
2026-09-01 23:45:48 +02:00
|
|
|
Gate House settled ordering in `GH-DEC-2026-003` and
|
|
|
|
|
`docs/contracts/approval-consumption.md`. The PEP presents the decision
|
|
|
|
|
binding's `request_digest` and consumes by CAS before the protected side
|
|
|
|
|
effect. A same-digest retry is idempotent success; a different digest conflicts;
|
|
|
|
|
there is no unconsume. `access-engine` remains read-only and never calls this
|
|
|
|
|
mutation.
|
Implement the engine spine: claim, outbox, machine, API
Contracts first (T02–T04): approval claim schema with issuer, freshness,
and binding digest; local transactional outbox wire; load-bearing cadence
as heartbeat or reconciliation (layer.yaml declared).
Then the object (T06–T08): SQLite closed state machine, CAS supersession,
distinct-approver fail-closed, revocation without holder cooperation,
outbox insert in the same transaction. Tests fail the mutation when
emission fails, and revoke while the drain sink is down.
Introspection GET /v1/approvals/{id}/claim is a PIP fact, not a decision.
No public consume (T05 waits on GH-WP-0002-T06). Canon T-06 coverage for
wrong binding, expiry, revoke, and supersede.
FLEX-WP-0017 T03 is unblocked on this object; T05 remains blocked only on
consumption ordering.
Assistant: grok
Assistant-Session: 01a04ceb-2057-7e20-b0f9-c282964d5dd9
2026-08-29 12:52:49 +02:00
|
|
|
|
|
|
|
|
Canon T-06 against this implementation: `tests/test_t06_replay.py` (wrong
|
2026-09-01 23:45:48 +02:00
|
|
|
target, wrong action, later time, revoked, superseded, same-digest retry, and
|
|
|
|
|
different-digest consume replay).
|