tenant-engine/pep-stance.yaml

51 lines
1.8 KiB
YAML
Raw Normal View History

# tenant-engine — PEP unreachable-engine stance map
#
# Framework: net-kingdom/canon/standards/security-layer-model_v0.7.md §6.4, §9.3
# Companion: net-kingdom/SECURITY-COMPANION.md v0.2 §5
# Named from: layer.yaml (pep_stance)
# Validate: tests/test_layer_conformance.py
#
# tenant-engine's protected side effect is a mutation of tenant-as-an-entity
# facts (create, grant, revoke, plan, lifecycle, grouping, guardrail).
# This is not ops-warden's per-zone fail-open map. A PIP that cannot ask
# the PDP does not guess; it refuses.
schema_version: "0.1"
framework: netkingdom-security-layer-model
standard_version: "0.7"
repository: tenant-engine
pep_shape: true
declared_by: decisions/decisions.md#TEN-DEC-2026-001
protected_action: "mutation of tenant-as-an-entity facts"
decision_engine: access-engine
scope: engine-reachability
# Total by construction. No implicit default — an unlisted value is a
# config error, not a permissive fallback. Every scope fails closed.
stance:
unset: fail_closed # TENANT_ENGINE_FLEX_AUTH_URL is not set
unreachable: fail_closed # transport, timeout, non-2xx, malformed body
non_allow: fail_closed # a decision was rendered, effect was not allow
unknown: fail_closed
on_apply:
recorded_fields:
- authorization_source # decision | stance
- authorization_decision_id
- authorization_request_digest
- authorization_effect
- authorization_stance
- authorization_reason
- action
- tenant_id
- actor
- allowed
written_to:
- "authz_records (every authorize attempt)"
- "events.payload (successful mutations only)"
never_recorded: "tokens, secrets, request bodies beyond the check digest"
# §6.4 obligation 2 — the verdict is never cached. Every write re-checks.
verdict_caching: none