kings-guard/layer.yaml
tegwick 72c2a42d67 Declare layer machine-readably (§11); adopt v0.6 corrections
The standard moved v0.4 -> v0.6. All four findings from our v0.4 review
were adopted in v0.5, and v0.6 went further on two of them.

§11 now requires a machine-readable declaration — prose cannot
distinguish a declaration from a transcribed review. We had none.
Added layer.yaml (form adapted from ops-warden's reference
implementation), scripts/check_layer_conformance.py, and
tests/test_layer_conformance.py.

The check makes our central claim mechanical rather than asserted: no
direct Tooling client in src/. The test exercises the negative case on a
synthetic tree, so it fails if the checker goes blind. pyyaml is added as
a DEV dependency only — `dependencies = []` is load-bearing for the §5
claim and stays empty.

Adopted from v0.6:
- containment is no longer ours (§9.2). Actuation is an Engine concept,
  unowned and held at zero; kings-guard proposes containment and never
  performs it. The register row is now a dependency, not our gap.
- observation is scoped to Staff-reachable sources, with identity and
  secret observation pending — our finding 1, adopted near-verbatim.
- access-engine DECLINED the authentication-evidence gap; owner is now
  the identity layer plus audit-core, reproposed and unassented.
- §11 blocked-clean recorded, with the rule that it must not rank below
  conforming — our finding 2.

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

Assistant: claude-code
Assistant-Model: opus
Assistant-Process: 4014379@bnt-lap001
Assistant-Session: 4af9e20f-1768-4afc-951b-b507784e382b
2026-08-29 10:20:39 +02:00

108 lines
4.4 KiB
YAML

# kings-guard — NetKingdom security layer declaration
#
# Framework: net-kingdom/canon/standards/security-layer-model_v0.6.md
# Assent: decisions/decisions.md KG-DEC-2026-001 (kings-guard's own voice, §11)
# Validate: python3 scripts/check_layer_conformance.py
#
# §11 (v0.6) requires a machine-readable declaration: prose cannot distinguish a
# declaration from a transcribed review. Form adapted from ops-warden's
# reference implementation, offered under §11.
#
# kings-guard's position is unusual and this file is shaped to state it exactly:
# there are NO Tooling contacts. Not a narrow one, not a read-only one. The
# capabilities that would need them sit at zero instead. Under §11 that is
# BLOCKED-CLEAN, which MUST NOT rank below conforming.
schema_version: "0.1"
framework: netkingdom-security-layer-model
standard_version: "0.6"
repository: kings-guard
layer: staff
declared_by: decisions/decisions.md#KG-DEC-2026-001
declared_at: "2026-08-29"
# §4 catalog entry, transcribed so drift between the catalog and this file is
# visible. The standard is authoritative for the row; this records what we
# understand ourselves to have been assigned.
catalog_entry:
owns:
- adaptive defence and judgment
- observation of Staff-reachable sources
pending:
- identity observation
- secret observation
proposes_but_does_not_own:
# §9.2 — actuation is an Engine concept held at zero. kings-guard proposes
# containment and never performs it. This is not our gap to close.
- containment
# §5 / §11: every direct contact with a Tooling-layer system (a §4 Tooling row),
# one entry each. Empty is a claim, and scripts/check_layer_conformance.py is
# what makes it checkable rather than asserted.
tooling_contacts: []
# §11 requires non-Tooling clients to be recorded "so the check is total".
non_tooling_clients:
- id: state-hub-work-records
target: state-hub
layer: not-catalogued
operation: "HTTP to the Custodian State Hub for work records and progress events"
write: true
note: >-
Outside §5 by the v0.5 scope rule: "Tooling-layer system" means a §4
Tooling row, and state-hub is not one. Recorded, not policed. Carries no
security authority and no secret payload.
# §11 blocked-clean. These are NOT §5.3 declared gaps: there is no contact to
# declare. Fields follow the §5.3 shape so one register can hold both kinds
# (§13 now carries the state column that keeps them distinct — raised by
# kings-guard against v0.4).
unowned_capabilities:
- id: authentication-assurance-evidence
state: unowned-capability
capability: >-
Token assurance, attestation outcomes and authentication anomalies exposed
as an engine surface, for identity-drift posture.
intended_owner: "identity layer + audit-core"
owner_status: "access-engine declined (v0.6 §13); reproposed, not assented"
blocked_on: >-
No engine exposes authentication evidence. key-cape is Tooling, so §5
forbids the direct route, and the capability stays at zero rather than
being taken locally.
review: "2026-11-28"
consequence: "identity-drift posture lane stays fixture-driven"
- id: secret-use-evidence
state: unowned-capability
capability: >-
Lease, revocation, mount and rotation metadata exposed as an engine
surface, for secret-abuse posture.
intended_owner: secrets-engine
owner_status: proposed
blocked_on: >-
No engine exposes secret-use evidence. OpenBao is Tooling; same reasoning
as above.
review: "2026-11-28"
consequence: "secret-abuse posture lane stays fixture-driven"
- id: actuation-surface
state: unowned-capability
capability: >-
Reduce authority, require step-up, isolate a workload — as a deterministic
engine API carrying a decision record.
intended_owner: "access-engine + runtime PEPs"
owner_status: "proposed; access-engine has not reviewed (FLEX-DEC-2026-002)"
blocked_on: >-
Ruled in v0.6 §9.2 to be an Engine concept, unowned and held at zero.
kings-guard proposes containment and does not own it, so this row is
recorded here as a dependency, not as a kings-guard gap to close.
review: "2026-11-28"
consequence: "no containment is possible anywhere in the estate"
# §5.1 read-only diagnostic observation of Tooling: none declared, none taken.
# §5.2 conduit: none. kings-guard runs no tool under a caller's identity.
declared_shapes:
"5.1": []
"5.2": []
"5.3": []