net-kingdom/tools/service-identity
tegwick 4d70743252 NK-WP-0054-T04: keycape alias helper reads bao list's bare-array JSON
Founder dry run 2 (receipt 20261107T140929Z): session, mounts and envelope
checks passed; the role list failed with TypeError. Fake bao now prints the
real CLI shape. Read-only; no live change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Assistant: claude-code
Assistant-Model: opus
Assistant-Process: 149903@bnt-lap001
Assistant-Session: 4c20a536-1452-4a85-bc09-e1987d9817d6
2026-11-07 15:11:56 +01:00
..
declarations Service identity: shorten the approval:read note (schema maxLength) 2026-11-01 10:43:45 +01:00
fixtures NK-WP-0054-T03b: declarations and validator migrated to canon grants (draft-3) 2026-10-24 23:35:30 +02:00
tests NK-WP-0054-T04: keycape alias helper reads bao list's bare-array JSON 2026-11-07 15:11:56 +01:00
keycape-alias-disable.sh NK-WP-0054-T04: founder-run helper to disable the OpenBao auth/keycape alias 2026-11-07 14:50:59 +01:00
keycape_alias_disable.py NK-WP-0054-T04: keycape alias helper reads bao list's bare-array JSON 2026-11-07 15:11:56 +01:00
observe.py NK-WP-0054-T04: first live conformance run (OpenBao, PostgreSQL) 2026-11-07 14:32:19 +01:00
README.md NK-WP-0054-T02: Service Identity and Privilege standard ratified as v0.1 2026-10-25 00:03:24 +02:00
validate.py NK-WP-0056-T03 done: executor identity and authority ceiling, in source 2026-10-31 14:21:04 +01:00

Service Identity Declaration Validator

NK-WP-0054-T03. Offline and read-only. Checks declarations against canon/schemas/service-identity_v0.1.schema.json and evaluates the rules of the accepted Service Identity and Privilege standard that a declaration alone can decide. It was built against draft-1, before the founder's review, so a rule change in the standard changes this tool. It follows the accepted v0.1 text (draft-4).

make service-identity-test    # unit tests
make service-identity-check   # evaluate the checked-in declarations
uv run tools/service-identity/validate.py tools/service-identity/declarations/*.yaml --as-of 2026-10-24

Options: --as-of YYYY-MM-DD (evaluation date, so a run is reproducible and exceptions expire on a stated day), --json, --fail-on-findings (exit 2 when anything is non-conformant or unknown). Exit 1 means invalid input.

Results

Result Meaning
conformant Every checked rule holds on declared facts
non-conformant At least one rule is broken and not covered by a live exception, or an exception has expired
excepted Every broken rule has a live, time-boxed exception
unknown A fact nobody has established (unknown in the declaration). A finding, not a pass
planned A target identity that does not exist yet; never counted as conformant

Alongside the results, advisories report declarations not asserted complete by their owner, declarations not confirmed by the owning service, stale exceptions, more than one service-admin and more than one break-glass identity.

Model and rules decided here

Draft-3 of the standard is an estate profile of SecurityCanon. Each account declares an imported principal_type (HUMAN, SERVICE, WORKLOAD, AGENT, CONTROLLER, DEVICE), its authority as grants MODE @ SCOPE with activation and environments, and optional estate conventions (bind, service-admin). Break-glass is activation: BREAK_GLASS, not a kind of account. unknown is allowed where a fact is not established and is reported as a finding. Exceptions carry an elimination_path (DSM-EXC-004).

Decided from a declaration: SI-1, SI-2, SI-3 (including a credential shared by more than one service), SI-4 (a service-admin holds ADMINISTER, and GOVERN where the service has one admin tier, over one service only), SI-6 (SOVEREIGN is offline and break-glass in production), SI-7 (CONSTRUCT never in production), SI-8 (second factor; admin roles bind the assurance claim), SI-9, SI-11 (overdue legacy disposition), SI-12, SI-14 (an agent presents as an agent, tokens at most 3600 seconds) and naming. More than one service-admin account per service is an advisory. SI-5, SI-10, SI-13 and SI-15 are process rules. Observed state is the health check, NK-WP-0054-T04.

Declarations

declarations/ holds the first set, authored from docs/service-identity-inventory.md. Decided 2026-10-24: declarations start here and move to each service's repository as its owner confirms them. Every one says owner_confirmed: false: they describe what the repository establishes, not what the owning service has attested. Facts the repository cannot establish are unknown, never guessed.

Safety

A declaration holds no credential. Secret-shaped values are rejected, and schema messages are never printed because they can echo the rejected value; invalid input reports only a count.