Skip to content

Commit df22cec

Browse files
avrabeclaude
andauthored
docs: audit STPA + compliance honesty (#96)
Closes 3 findings from the 2026-04-30 audit: L-3 — soften phantom DO-178C/26262 trace claims; clarify what IS traced L-4 — add implementation-status field; populate sample of design-only SC/CCs L-6 — note Dockerfile.bytehound is outside the flake hermeticity guarantee Trace: skip Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 8670d3c commit df22cec

7 files changed

Lines changed: 100 additions & 0 deletions

File tree

AGENTS.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,3 +329,8 @@ bazel build //src/cli:wasmsign_cli
329329
- `wasm-signing.yml` - End-to-end signing demonstration
330330
- `fuzz.yml` - Fuzz testing
331331
- `memory.yml` - Memory profiling
332+
333+
> **Memory profiling reproducibility note:** Memory profiling via
334+
> `Dockerfile.bytehound` is **not in the hermetic build path**. The
335+
> bytehound image clones upstream and builds with `cargo +nightly`, so
336+
> reproducibility is best-effort, not bit-exact (unlike the Nix flake).

Dockerfile.bytehound

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,19 @@
1+
# =============================================================================
2+
# NOTE: This image is intentionally OUTSIDE the Nix flake's hermeticity
3+
# guarantee. It uses `cargo +nightly` and clones bytehound from upstream
4+
# (a moving HEAD), and pulls a debian:bookworm rust toolchain image whose
5+
# apt-package set is not pinned. Reproducibility is best-effort, not
6+
# bit-exact.
7+
#
8+
# This is acceptable because the image is used only for memory profiling
9+
# (developer-facing diagnostics), never for producing release artifacts
10+
# or signing material. Anything that ships to users goes through the
11+
# `flake.nix` hermetic build path.
12+
#
13+
# If you need a reproducible memory-profiling environment, pin both the
14+
# base image digest and the bytehound git revision below.
15+
# =============================================================================
16+
117
FROM rust:1.90-bookworm
218

319
# Install dependencies

SECURITY.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -656,6 +656,31 @@ For automotive (ISO/SAE 21434) and industrial IoT (IEC 62443) deployments, see:
656656
- [docs/KEY_LIFECYCLE.md](docs/KEY_LIFECYCLE.md) - Key management procedures (covers [[CD-1]] through [[CD-9]])
657657
- [docs/INCIDENT_RESPONSE.md](docs/INCIDENT_RESPONSE.md) - Security incident runbook
658658

659+
### Scope of Compliance Mapping
660+
661+
The following compliance frames **ARE** modelled in the artifact graph
662+
(under `artifacts/cybersecurity/` and `artifacts/stpa/`) with traceable
663+
links from threats to goals to requirements to designs and verifications:
664+
665+
- **ISO/SAE 21434** (Road vehicle cybersecurity engineering) — TARA, CAL ratings, Annex H attack-feasibility scoring.
666+
- **IEC 62443** (Industrial automation and control systems security) — referenced for SL3+ gaps in HSM integration and OCSP/CRL revocation.
667+
- **EU Cyber Resilience Act (CRA)** and **UNECE R155 / R156** (vehicle type-approval cybersecurity / software updates) — see [docs/automotive-regulatory-compliance.md](docs/automotive-regulatory-compliance.md).
668+
669+
The following compliance frames are **RELEVANT TARGETS** for sigil's
670+
roadmap but are **NOT YET modelled** in the artifact graph — no
671+
artifact carries a `do-178c-objective:` or `iso-26262-table:` field, and
672+
no traceability rule cross-references their objective tables:
673+
674+
- **DO-178C** (Software considerations in airborne systems and equipment certification, civil aviation).
675+
- **ISO 26262** (Road vehicles — functional safety).
676+
677+
These two standards are mentioned in passing in design discussions
678+
(see `artifacts/dev/features.yaml` for the Lean4/Coq proof-pipeline
679+
roadmap) but **do not yet have artifact-graph trace coverage**. Adding
680+
that mapping is tracked as a follow-up; until then, any claim of
681+
DO-178C / ISO 26262 alignment in this repository should be read as
682+
"potential mapping; not yet modelled in `artifacts/`."
683+
659684
---
660685

661686
## Reporting Security Issues

artifacts/cybersecurity/goals-and-requirements.yaml

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1466,6 +1466,10 @@ artifacts:
14661466
verification-criteria: >
14671467
Verification rejects modules with only classical or only PQC
14681468
signature when hybrid mode is configured.
1469+
# Honesty marker: Phase 3 PQC roadmap; hybrid Ed25519+SLH-DSA
1470+
# verification pipeline (CD-24) is still in draft. No hybrid
1471+
# verifier code path exists in src/lib yet.
1472+
implementation-status: design-only
14691473
links:
14701474
- type: derives-from
14711475
target: CG-1
@@ -1484,6 +1488,11 @@ artifacts:
14841488
verification-criteria: >
14851489
Cache lookup returns miss for entries whose signing key has been
14861490
revoked; revocation triggers immediate cache invalidation.
1491+
# Honesty marker: revocation-aware proof cache is design-only.
1492+
# No code exists today that wires key-revocation events to the
1493+
# proof cache; CR-20 has neither cybersecurity-design nor
1494+
# cybersecurity-verification linked.
1495+
implementation-status: design-only
14871496
links:
14881497
- type: derives-from
14891498
target: CG-8
@@ -1502,6 +1511,10 @@ artifacts:
15021511
verification-criteria: >
15031512
Verification rejects Fulcio certificates missing SCTs or containing
15041513
SCTs from untrusted CT logs.
1514+
# Honesty marker: paired with SC-26. Cryptographic verification of
1515+
# SCT signatures against trusted CT log keys is design-only — see
1516+
# the SC-26 entry in artifacts/stpa/losses-and-hazards.yaml.
1517+
implementation-status: design-only
15051518
links:
15061519
- type: derives-from
15071520
target: CG-7
@@ -1520,6 +1533,9 @@ artifacts:
15201533
verification-criteria: >
15211534
Checkpoint writes are atomic; partial writes do not corrupt existing
15221535
checkpoints; integrity check detects tampered checkpoints on load.
1536+
# Honesty marker: atomic checkpoint store (SC-28) is design-only.
1537+
# No write-then-rename checkpoint persistence exists in code today.
1538+
implementation-status: design-only
15231539
links:
15241540
- type: derives-from
15251541
target: CG-8
@@ -1556,6 +1572,11 @@ artifacts:
15561572
verification-criteria: >
15571573
Verification enforces configured threshold; rejects envelopes with
15581574
fewer valid signatures than the threshold requires.
1575+
# Honesty marker: configurable N-of-M threshold policy is design-only.
1576+
# `src/lib/src/dsse.rs` exists but does not yet expose a runtime
1577+
# threshold-policy configuration surface; CR-24 has no
1578+
# cybersecurity-design or cybersecurity-verification artifact yet.
1579+
implementation-status: design-only
15591580
links:
15601581
- type: derives-from
15611582
target: CG-1

artifacts/stpa/losses-and-hazards.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -958,6 +958,12 @@ artifacts:
958958
Signed Certificate Timestamp signatures MUST be verified against
959959
a trusted set of CT log public keys, rejecting SCTs signed by
960960
unknown or untrusted logs.
961+
fields:
962+
# Honesty marker (see schemas/stpa-sec.yaml note on implementation-status):
963+
# SC-26 is named in the 2026-04-30 audit as the canonical example of
964+
# an approved-design constraint that has not yet landed in code.
965+
# The cryptographic SCT-against-trusted-log-keys check is design-only.
966+
implementation-status: design-only
961967
links:
962968
- type: prevents
963969
target: H-27

artifacts/stpa/ucas.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -496,6 +496,10 @@ artifacts:
496496
expected provider before requesting identity tokens.
497497
fields:
498498
constraint: "Pipeline signing workflows must validate OIDC issuer URL matches expected provider before requesting identity tokens"
499+
# Honesty marker: status `approved` covers the design intent only.
500+
# The CI workflow does not yet inspect the OIDC issuer URL before
501+
# requesting tokens; CTRL-7 (CI pipeline) implementation is design-only.
502+
implementation-status: design-only
499503
links:
500504
- type: constrains-controller
501505
target: CTRL-7

schemas/stpa-sec.yaml

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,29 @@ schema:
4343
Adds data flows, threat agents, security properties, and attack
4444
scenarios to the base STPA control structure model.
4545
46+
# ──────────────────────────────────────────────────────────────────────────
47+
# Convention: optional `implementation-status` field on constraints/reqs
48+
# ──────────────────────────────────────────────────────────────────────────
49+
#
50+
# Across system-constraint, controller-constraint, and cybersecurity-req
51+
# artifacts, an optional `implementation-status` field MAY be set under
52+
# `fields:` to disambiguate `status: approved` (design vetted) from actual
53+
# code-landing state. Allowed values:
54+
#
55+
# design-only The constraint is approved as design but no code,
56+
# test, or other implementation evidence exists yet.
57+
# in-progress Implementation has begun (a PR or branch exists)
58+
# but is not merged or not feature-complete.
59+
# implemented Code lands on main and is exercised; verification
60+
# evidence may or may not yet exist.
61+
# verified Implementation lands AND a verification artifact
62+
# (test, fuzz target, formal proof) demonstrates it.
63+
#
64+
# This field is informational only — rivet does not enforce its values.
65+
# It exists to surface the audit-honesty distinction the bare `status:`
66+
# field cannot make. Untagged entries should be assumed `unknown`; do
67+
# not infer `implemented` from their absence of the marker.
68+
4669
# ──────────────────────────────────────────────────────────────────────────
4770
# Artifact types
4871
# ──────────────────────────────────────────────────────────────────────────

0 commit comments

Comments
 (0)