An engine for modelling and managing decisions.
Find a file
tegwick f67e7a3566 Return the v0.8 text review gate-house asked for
Reviews security-layer-model v0.8 as text (net-kingdom@66eeaba), completing the
round this repo promised after sending only one finding and explicitly telling
gate-house to treat it as one finding rather than an assent.

Three findings. The substantive one is that §6.4 announces "Four obligations"
and lists five: v0.7 had four, v0.8 added obligation 5 and left the count. That
obligation is the one carrying correspondence-by-identity, the PIP/PDP
separation and the replay-identity property -- the whole GH-DEC-2026-003/005/008
chain, and the rule that binds this engine at issue time. A consumer
implementing "the four obligations of §6.4" can omit precisely the one governing
how it compares an approval to a decision. It has already propagated into
gate-house's own correspondence.

Second, §17 states four artifacts are required and owned by Taxonomy while its
body removes two from Taxonomy, then calls three artifacts' ownership "still
proposed" and settles one of them in the same sentence. Two are genuinely
unsettled. §15 claims §17's stale ownership paragraph was corrected; the
correction did not reach the count sentence or the closing status.

Third and minor, the §18-to-§20 numbering hole is explained only in a late §16
bullet.

The record is marked as a derived, dated artifact naming its source commit, per
§12's own rule -- the rule this repo proposed and asked to own none of.

Also records what was read and what was not, what was found sound, and two
candidate findings dropped after checking, since a finding count means nothing
without the count checked and discarded.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PM5HnEAhokxdfcPqBNpT7D

Assistant: claude-code
Assistant-Model: opus
Assistant-Process: 715850@bnt-lap001
Assistant-Session: eb557e93-7cb1-45d0-9e57-7d15b3edc60e
2026-09-07 00:19:40 +02:00
approval_engine Set the approval store tenant to exact tenant:platform 2026-09-06 22:33:50 +02:00
deploy Pin published approval-engine release candidate 2026-09-06 23:32:19 +02:00
docs Return the v0.8 text review gate-house asked for 2026-09-07 00:19:40 +02:00
examples Implement GH-DEC-2026-008: declared PDP-path intent, enforced at issue 2026-09-06 14:51:23 +02:00
history Align to security layer model v0.7 and open the engine spine 2026-08-29 11:58:28 +02:00
intakes Record GH-DEC-2026-005; strike the spent G3 revisit trigger 2026-09-06 01:36:03 +02:00
schemas Name the execute-time digest target; record the tenant collision 2026-09-06 20:35:59 +02:00
tests Set the approval store tenant to exact tenant:platform 2026-09-06 22:33:50 +02:00
workplans Pin published approval-engine release candidate 2026-09-06 23:32:19 +02:00
.custodian-brief.md chore(consistency): sync task status from DB [auto] 2026-09-06 01:09:55 +02:00
.gitignore Implement the engine spine: claim, outbox, machine, API 2026-08-29 12:52:49 +02:00
.repo-classification.yaml Add repo classification to close C-24/C-35 2026-08-29 14:43:52 +02:00
AGENTS.md Finish approval engine spine 2026-09-01 23:45:48 +02:00
cadence.yaml Finish approval engine spine 2026-09-01 23:45:48 +02:00
Containerfile Adopt Alpine as the sanctioned base; release candidate scans clean 2026-09-06 23:01:41 +02:00
INTENT.md Finish approval engine spine 2026-09-01 23:45:48 +02:00
layer.yaml Implement the engine spine: claim, outbox, machine, API 2026-08-29 12:52:49 +02:00
Makefile Adopt Alpine as the sanctioned base; release candidate scans clean 2026-09-06 23:01:41 +02:00
pyproject.toml State pdp_digest explicitly; decline to publish a vocabulary mapping 2026-09-06 09:32:11 +02:00
README.md Harden the PEP harness and KeyCape registration request 2026-09-02 15:46:06 +02:00
SCOPE.md Harden the PEP harness and KeyCape registration request 2026-09-02 15:46:06 +02:00
WORK-RECORDS.md chore(consistency): record decision id for GH-DEC-2026-005 2026-09-06 08:05:00 +02:00

approval-engine

The approval as a durable, authenticated, consumable object — issued before an action, verified at the moment of use, and provably not replayable.

An Engine, role PIP, in the NetKingdom security layer model (statute v0.7, accepted; operative form net-kingdom/SECURITY-COMPANION.md). It answers one question, totally and decidably:

Is this approval valid right now — for this exact action, target, actor, and purpose — and has it already been used?

It does not decide whether the action is permitted. That is access-engine, which stays NetKingdom's only policy decision point. An approval is one input to that decision.

Deliberately small, boring, and strict: atomic supersession and single consumption are what make Canon test T-06 — Approval Replay passable. Flexibility here would be a defect. Graded, evidence-based progression belongs to maturity-engine; the two engines are deliberate opposites.

See INTENT.md and SCOPE.md. Declaration: layer.yaml. Claim: docs/approval-claim.md. Consume: docs/approval-consumption.md. Caller auth: docs/caller-authentication.md. PEP sequence: docs/pep-integration.md. Origin: flex-auth FLEX-DEC-2026-001, raised while assenting to the security layer model.

make test
approval-engine migrate --db approvals.sqlite
approval-engine verify --db approvals.sqlite
approval-engine serve --db approvals.sqlite \
  --jwt-issuer https://auth.netkingdom.local \
  --jwt-audience approval-engine \
  --jwks-url http://key-cape.sso.svc.cluster.local:8080/jwks

POST /v1/approvals/{id}/consume implements GH-DEC-2026-003: the PEP atomically spends the approval before the protected side effect. Same-digest retries are idempotent; a different digest conflicts.

Production operations, caller scopes, audit delivery, and PEP sequencing are documented in docs/storage-operations.md, docs/caller-authentication.md, docs/outbox-contract.md, and docs/pep-integration.md. The checked-in StatefulSet deliberately refuses production startup without a migrated persistent store, KeyCape JWT verification, and authenticated audit delivery.