sam

Software Architecture Manifest (SAM)

A producer-signed, machine-readable declaration of what software was designed to do and the operational envelope it was designed for.

SBOM tells you what’s inside the software. SLSA tells you how it was built. OpenSSF Scorecard tells you whether good practices were followed. SAM tells you what the producer designed it to be.

A nutrition label for architecture, signed by the maintainer, shipped on every artifact.

SAM is an architectural visibility framework, not a compliance framework. Consumers under specific regimes (EU DORA, NIS2, SOC 2, HIPAA, ISO/IEC 27036, NIST SP 800-161, FedRAMP, etc.) use SAM’s structured surface to populate their own compliance artifacts. SAM does not fulfill any of those regimes on its own; it makes the producer’s architectural claims machine-readable so the consumer’s compliance work has a stable upstream input. The line is intentional: scope creep into compliance form-filling would compromise the primary value — describing what the software is, regardless of who is reading.

Working draft — not adoption-ready. SAM is a v0 working proposal. Breaking changes are still possible (per SPECIFICATION.md §6.1); the stable target is v1. We are publishing this draft to gather technical review and contributors, not to declare a finished standard. If you operate SAMs in production today, you are early — please file feedback. What we’re asking for: technical review of the schema and spec from supply-chain, security, and procurement practitioners; real-world authoring feedback (what’s hard, what’s missing); citations and registry contributions; implementations of the spec-aware validator surface (§5.1.6, §5.1.7, §5.1.9, §5.1.11). See CONTRIBUTING.md, ROADMAP.md, and the issue templates.

The current version is v0.2. See v0.2/SPECIFICATION.md. v0.1 is frozen and remains valid at its URIs per SPECIFICATION.md §6.3 (same-MAJOR backward compatibility). Future versions land alongside (v0.3, v0.4, …) at frozen URIs.

Normative reference. The SPECIFICATION.md document is the normative source for what a conforming SAM is and means. The JSON Schema in this repo is the syntactic form; the specification defines what conformance to that form requires. §§1–10 are written: Scope, Terminology, Conformance language, Threat model, Definition of a conforming SAM, Versioning, Extensibility, Stability, SAM Levels (L0–L3), and a Definitions appendix that reproduces every ISO/IEC 25010:2023 characteristic and sub-characteristic in CC-BY-4.0 wording so SAM is fully usable without ISO access. Authoring guide, verification guide, and lifecycle policy are deferred.

Note on the namespace. The schema’s $id (https://software-architecture-spec.github.io/sam/v0.2/schema.json) is hosted on GitHub Pages. For SAM to become a useful cross-vendor standard, the namespace should eventually live with a neutral host (e.g., a CNCF / OpenSSF / IETF working group). The current host is appropriate for a working draft; URIs will redirect when the namespace moves.


Why

In the AI era, a vibe-coded weekend prototype and a hardened production service are visually indistinguishable: same React frontend, same Postgres, same Dockerfile, same deployment pipeline. The Access database on a shared drive used to advertise its own fragility. The modern equivalent does not.

SAM restores that signal. A manifest that honestly declares audience: single_user, scaling: none, observability: unspecified, tenancy: none is the modern .mdb file announcing what it is — without the ambiguity of inference from stack choices.

What SAM is — and what it isn’t

SAM is a producer-signed declaration of architectural facts about software: intent, operational envelope (including third-party operational dependencies), ISO/IEC 25010:2023 quality claims with industry-standard cross-references, and chosen postures on cross-attribute tensions. Audience: any consumer who needs to assess what software was designed to be — procurement, security, SRE, audit, AI agents, downstream developers.

SAM is not:

The full normative scope is in SPECIFICATION.md §1.


Layers — what a manifest describes

The same questions (“how does it scale”, “what privilege does it run with”, “is it multi-tenant”) get different answers at three different layers, read by three different audiences. A SAM declares its layer explicitly via subject.layer:

Layer Granularity Audience Notes
artifact one container image, binary, or package AI agents, build/SLSA, SBOM tooling The signing granularity. digest is required. Matches in-toto subject convention.
service a logical SLO-owning unit (1+ artifacts) SRE, on-call, ops Where SLOs and incident response actually live. digest optional; uses components[] to point at constituent artifact SAMs.
product the contractual / customer-facing surface Procurement, audit, customers What gets sold. components[] points at constituent service SAMs.

A small project may only need one SAM at the artifact layer. A real product typically has all three, with each layer’s manifest referencing its constituents via subject.components[]. Composition is explicit; nothing is inferred.

Levels — how much a manifest tells you

A SAM is either conforming or it isn’t. But producers and consumers also need a vocabulary for how much a SAM tells them. SAM Levels (SPECIFICATION.md §9) define four tiers:

Level Meaning Audience cost Compliance posture
L0 No SAM exists n/a Reverse-engineering required
L1 Conforming SAM (per §5.1) is signed and bound to its subject Moderate intake Initial evaluation possible
L2 L1 + every non-trivial claim has industryRefs[] Auditor automation Sufficient for many third-party-risk processes
L3 L2 + every verified claim has evidence[]; tensions are declared; validFor is current Maps to strict conformance Substantially substitutes for direct due-diligence in regulated contexts

Levels are about evaluability, not quality. An L3 manifest declaring “P95 latency is 30 seconds” is L3-conforming; whether 30 seconds is acceptable is a consumer judgment outside SAM’s scope.

Structure

manifest
├── manifestVersion          schema version (v0.2)
├── subject                  what this manifest describes
│   ├── layer                artifact | service | product (granularity declaration)
│   ├── name, version
│   ├── digest               required at layer=artifact, optional at service/product
│   ├── sbomRef              optional pointer to SBOM
│   └── components[]         lower-layer subjects (for service/product manifests)
├── intent                   purpose, audience, tenancy, out-of-scope
│   └── tenancy              model + isolationGuarantees + dataResidency[] (new in v0.2)
├── envelope                 operational design target (the "what was it built for")
│   ├── throughput           target/max RPS, latency SLOs, concurrency
│   ├── scaling              axis (horizontal/vertical/none), statefulness
│   ├── instantiation        singleton / multi_instance / leader_elected / sharded
│   ├── privilege            root_required / unprivileged / capability_scoped
│   ├── network              isolated / egress_only / ingress_only / bidirectional
│   ├── dependencies[]       third-party ICT services this software runs against (DORA / NIS2 / 27036 / 800-161)
│   ├── serviceLevels        SLA / SLO bucket — service/product layer only (new in v0.2)
│   └── persistence          required stores
├── qualityAttributes        ISO/IEC 25010:2023 — 9 characteristics + sub-characteristics
│                            (defined in our own words at SPECIFICATION.md §10)
├── extensions               quality concerns ISO 25010 doesn't cover cleanly
│   ├── observability        (folds awkwardly under maintainability.analysability)
│   ├── dataLifecycle        retention, deletion, archival
│   └── internationalization
├── tensionsDeclared         which side of CAP/observability-cost/etc. did you pick?
└── producer                 issuer + contact + issuedAt + validFor

industryRefs[] entries gain optional auditor / auditPeriod / dateAttested in v0.2.

x-* extension keys are permitted on:
  qualityAttributeClaim, qualityAttributes characteristic objects,
  tensionsDeclared[] items, industryRefs[] items, evidence[] items,
  producer, subject.components[] items.

Claim status

Every quality attribute claim has one of four statuses:

This three-track model (declared / verified / unspecified) mirrors how SBOM standards grew attestation lanes over time. v0.x is friendly to declared-only manifests; v1 will define stricter attestation requirements for the verified track. SAM Levels (§9) layer on top of these statuses to express how much of the manifest is anchored and evidenced.


Standards alignment

SAM uses two reference layers per claim:

Top-level standards

Layer Standard Where it lives
Software supply chain (contents) SBOM (CycloneDX / SPDX) subject.sbomRef
Build provenance SLSA / in-toto external attestation; SAM is a sibling predicate
Quality model spine ISO/IEC 25010:2023 qualityAttributes keys = the 9 characteristics
Operational third-party risk EU DORA Art. 28, NIS2, ISO/IEC 27036, NIST SP 800-161 envelope.dependencies[]

Per-section industry anchors (use as industryRefs[])

Section Recommended anchors
qualityAttributes.security.* NIST SP 800-218 (SSDF), OWASP ASVS L1/L2/L3, ISO/IEC 27001, SOC 2, NIST SP 800-53, CIS Benchmarks, NIST SP 800-190 (containers)
qualityAttributes.interactionCapability.inclusivity WCAG 2.2 (A / AA / AAA), EN 301 549, Section 508
qualityAttributes.compatibility.interoperability OpenAPI 3.x, AsyncAPI, SCIM, SAML, OAuth 2.x, OIDC
qualityAttributes.flexibility.installability OCI Image Spec, Helm chart schema
qualityAttributes.safety (domain-specific) ISO 26262 (automotive), IEC 62304 (medical), DO-178C (aviation), IEC 61508 (industrial)
qualityAttributes.functionalSuitability ISO/IEC 25010:2023 (correctness/completeness/appropriateness)
envelope.dependencies[] EU DORA Art. 28, NIS2, ISO/IEC 27036, NIST SP 800-161
extensions.observability OpenTelemetry semantic conventions
extensions.dataLifecycle ISO/IEC 25012, GDPR articles, CCPA, HIPAA, SOX §802, PCI DSS, NIST SP 800-88 Rev. 1 (deletion side)
extensions.internationalization Unicode CLDR, ICU MessageFormat, BCP 47
Build / supply chain (top-level) SLSA build level (L0–L3, where L0 = no claim), in-toto attestation, CycloneDX/SPDX

These are starting points, not an exhaustive list. Producers populate industryRefs[] with whatever standards their audit/procurement context actually recognizes. The schema does not constrain the standard field to an enum; the /registry/standards.json companion artifact provides canonical spellings as advisory guidance.

Why ISO 25010, but not only

ISO 25010:2023 was adopted as the canonical key set for qualityAttributes because it is the formal quality model that procurement, audits, and certifications already speak. Producers can populate the overall claim per characteristic for a coarse manifest, or drill into subCharacteristics for a granular one.

ISO 25010 has gaps. Observability has no first-class home (it folds under maintainability.analysability); data lifecycle and i18n have no formal home at all. These live in extensions.

The operational envelope (tenancy, instantiation mode, privilege, network posture, dependencies) is intentionally not part of qualityAttributes — these are deployment/operational signals, not quality claims. They answer “what was it designed for,” which the formal quality model treats as input rather than output.


Signing

The manifest is a predicate — the statement of intent. Signing wraps it in a DSSE envelope or a sigstore bundle, the same way SBOM and SLSA attestations are signed today.

{
  "_type": "https://in-toto.io/Statement/v1",
  "subject": [{ "name": "metrics-dashboard-api", "digest": { "sha256": "..." } }],
  "predicateType": "https://software-architecture-spec.github.io/sam/v0.1",
  "predicate": { ...the manifest body... }
}

This means cosign, sigstore, and any in-toto-aware tooling can sign and verify SAMs without inventing a new key system. Bind the manifest to the artifact via subject.digest.


Files

Versioned (v0.2/ — current)

Frozen prior versions

Future versions land alongside (v0.3/, v0.4/, …) and don’t disturb published URIs.

Companion registries (registry/ — versioned independently)

Validation

# Run all checks: schema metaschema, every version's examples, conformance corpus, registries.
python3 tools/validate.py

The validator (tools/validate.py) is the canonical entry point. It runs in:

For ad-hoc validation of a single example without the full corpus:

check-jsonschema --schemafile v0.2/schema.json v0.2/examples/saas.manifest.json

Status

v0.2 — current. Breaking changes still possible while MAJOR is 0 (per SPECIFICATION.md §6.1). The goal of v0 is to get the field set right, not to lock the format. v0.2 is additive over v0.1; v0.1 manifests remain conforming under their own URIs.

v0.2 conventions

Open questions

Planned beyond v0.2


License

This project is dual-licensed.

The intent of this repository is broad reuse with attribution.