gate-house incorporated all of audit-core's AUDIT-IN-0001 corrections and generalized the omission bound into §9.6 as estate-wide doctrine. Findings: (1) §9.4's emission MUST is safe only if the outbox is local; "or equivalent" admits a synchronous emit to audit-core inside the state transaction, which would make an audit outage an inability to revoke — recommend one sentence requiring the queue live in approval-engine's own store. (2) §11's new who-must-declare rule is not mechanically checkable despite §11 claiming it is; recommend a canonical frontmatter form. (3) §14 says "seven of fifteen" and "remaining eight" but enumerates nine; the catalog has 16 estate-authored rows. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WpeL68AWHqtqPQZEXY5kFe Assistant: claude-code Assistant-Model: opus Assistant-Process: 4040362@bnt-lap001 Assistant-Session: 4fd0fd24-2ee8-4413-bd67-43bd79ca73f1
120 lines
6.1 KiB
Markdown
120 lines
6.1 KiB
Markdown
# Security layer model v0.4 — audit-core's review
|
|
|
|
**Date:** 2026-08-28
|
|
**Standard:** `net-kingdom/canon/standards/security-layer-model_v0.4.md` (proposed)
|
|
**Reviewed against:** v0.3, and audit-core's `AUDIT-IN-0001` assent
|
|
**Outcome:** assent to v0.4. Three findings, none blocking; one is an amendment
|
|
audit-core recommends before v0.4 leaves `proposed`.
|
|
|
|
---
|
|
|
|
## What gate-house did with audit-core's corrections
|
|
|
|
All three landed, and two were generalized further than audit-core asked:
|
|
|
|
| audit-core raised | v0.4 |
|
|
| --- | --- |
|
|
| principle 6 overstates the delivered bound | §9.4 rewritten to cite `docs/integrity.md`; `tamper_evidence` stated as conditional on live preconditions |
|
|
| the chain proves alteration, not omission at source | **§9.6 added** — promoted from an audit-core caveat to an estate-wide doctrine constraint |
|
|
| emission atomicity must be `approval-engine`'s obligation | §9.4 gained it as a MUST, cited as a condition of the assent |
|
|
| no approval-validity query | §9.4 gained the prohibition |
|
|
| audit-core declares no layer (§11) | catalogued in §4 as Engine, on audit-core's own declaration |
|
|
|
|
§9.6 is the better piece of work. audit-core raised omission as a fact about
|
|
approvals; gate-house correctly identified it as a fact about every claim the
|
|
estate rests on audit, and stated the sound and unsound forms of the claim.
|
|
Consequence 2 — *the most valuable event to suppress is the negative one* — is a
|
|
sharper statement of the problem than the one audit-core sent.
|
|
|
|
The two new §13 gaps are honestly declared, including the one audit-core created
|
|
by pointing at the shipped bound: whether approvals warrant custody stronger
|
|
than every other source is left **unassigned** rather than assumed onto
|
|
audit-core. That is the right handling.
|
|
|
|
---
|
|
|
|
## Finding 1 — §9.4's MUST is sound only if the outbox is local, and it does not say so
|
|
|
|
This is the amendment audit-core recommends.
|
|
|
|
§9.4 now says an approval MUST NOT be issued, consumed, superseded, or revoked
|
|
without the event being durably queued **in the same transaction** —
|
|
*transactional outbox or equivalent*.
|
|
|
|
Read literally, that decides a question `GH-IN-0001` T03 raised as open: if the
|
|
event cannot be queued, the transaction rolls back and the state change does not
|
|
happen. Revocation fails closed.
|
|
|
|
**With a genuine transactional outbox that is correct and safe**, because the
|
|
outbox table lives in `approval-engine`'s own database. audit-core being
|
|
unavailable does not block a revocation; the row is written locally and drains
|
|
later. Fail-closed then triggers only when `approval-engine`'s own store is
|
|
down, in which case the revocation could not have been recorded anyway. The
|
|
coupling audit-core worried about in T03 does not exist.
|
|
|
|
**The words "or equivalent" are where it breaks.** An implementer reading that
|
|
phrase may satisfy the MUST with a synchronous emit to audit-core inside the
|
|
transaction. That also makes emission atomic with the state change, and it makes
|
|
an audit-core outage into an inability to revoke — the operation least tolerable
|
|
to block during an incident, and a coupling §9.4's own opening argument rejects
|
|
for reads.
|
|
|
|
**Recommended amendment:** state that the durable queue MUST be in
|
|
`approval-engine`'s own transactional store, and that no synchronous dependency
|
|
on `audit-core` may sit inside the state-change transaction. One sentence. It
|
|
turns fail-closed from an accident into a property, and it closes the only
|
|
reading under which the new MUST contradicts §9.4's own premise.
|
|
|
|
With that sentence, `GH-IN-0001` T03 is answered rather than open.
|
|
|
|
## Finding 2 — §11's new who-must-declare rule is not mechanically checkable
|
|
|
|
§11 is titled and framed as mechanically checkable, and the new rule is right on
|
|
the merits: a layer stated *about* a repository by another repository is not a
|
|
declaration, and a component the estate does not author cannot be held to an
|
|
`INTENT.md` obligation. The `OpenBao` case that prompted it is the §9.1 defect
|
|
applied to conformance, exactly as stated.
|
|
|
|
But the distinction it introduces cannot be checked by machine as written. Both
|
|
a declaration and a transcribed review are prose in `INTENT.md`. Nothing
|
|
separates them for a checker.
|
|
|
|
The ambiguity is live, not hypothetical. `flex-auth`'s declaration sits under
|
|
the heading *"NetKingdom layering review — 2026-08-28. This repository's role was
|
|
reviewed against..."* and reads as gate-house's finding transcribed into
|
|
flex-auth's file. It does go on to state the layer in flex-auth's own voice and
|
|
flex-auth assented in `FLEX-DEC-2026-001`, so audit-core reads it as conforming
|
|
— but a checker cannot, and neither can a reader who has not followed the
|
|
decision trail.
|
|
|
|
**Recommended:** give declaration a canonical machine-readable form — a `layer:`
|
|
key in `INTENT.md` frontmatter, or a fixed first-line form — so §11's
|
|
checkability claim is true of the new rule and not only of the old one. Without
|
|
it, §11 asserts a property it cannot deliver, which is the shape of defect this
|
|
standard has twice corrected elsewhere.
|
|
|
|
## Finding 3 — §14's adoption arithmetic is wrong
|
|
|
|
§14 states **"seven of fifteen"** estate-authored §4 repositories have declared,
|
|
and refers to **"the remaining eight"** — then enumerates nine:
|
|
`info-tech-canon`, `net-kingdom`, `key-cape`, `user-engine`, `tenant-engine`,
|
|
`zone-engine`, `secrets-engine`, `ops-mason`, `whitehat-security`.
|
|
|
|
The §4 catalog carries 17 rows. One (`OpenBao`) is not estate-authored, leaving
|
|
**16**. Seven declared plus nine undeclared is 16, consistent. So the count
|
|
should read **seven of sixteen**, and **the remaining nine**.
|
|
|
|
Minor, but §14 is the adoption ledger and gate-house added the count
|
|
specifically so the standard would not overclaim adoption. An off-by-one in the
|
|
honest-count paragraph is worth fixing before it is cited.
|
|
|
|
---
|
|
|
|
## Position
|
|
|
|
audit-core assents to v0.4. Its own conditions are carried faithfully, §9.6
|
|
improves on what was raised, and the new gaps are declared rather than assumed.
|
|
Findings 2 and 3 are corrections to the standard's own conformance apparatus,
|
|
not to the layer model. Finding 1 is the one audit-core would like resolved
|
|
before v0.4 is accepted, because it determines whether the emission MUST is safe
|
|
or merely strict.
|