sam

SAM Roadmap

This roadmap is feedback-driven, not predetermined. Everything below shifts in response to issues filed, real-world authoring experience, and review from supply-chain / security / procurement practitioners. Items are ordered by current confidence, not by guaranteed delivery.

The stable target is v1. The path there is incremental minor releases that close gaps surfaced by real use.

Current release: v0.3

Live at https://software-architecture-spec.github.io/sam/v0.3/.

v0.1 and v0.2 frozen at their URIs per §6.3 same-MAJOR compatibility.

Shipped in v0.2

These were the v0.2 candidates carried forward from the v0.1 review and now in the schema:

Shipped in v0.3

Drawn from a review of canonical systems-design literature (Release It! / DDIA / Fowler PEAA / SRE Book / Newman / Richards & Ford / Ousterhout) — each named a vocabulary producers and consumers commonly use that SAM had no slot for. All landed in v0.3; the descriptions below record the design.

architecturalStyle (declarative)

Shipped as a single-value hard enum on intent:

monolith | modular_monolith | microservices | serverless | event_driven | actor | hybrid

Producers scope their claims; consumers match the style against their target architecture. Distinct from subject.layer (granularity of this manifest) and from subject.components[] (composition). Design-context, not a graded claim (§5.5).

intent.architecturalPatterns[] + registry/patterns.json

Shipped as an open string array on intent — a flat list of pattern IDs the software implements:

"architecturalPatterns": ["circuit_breaker", "cqrs", "cache_aside"]

Companion registry/patterns.json (same shape as tensions.json) seeds 15 canonical IDs from Release It! (circuit_breaker, bulkhead, timeout, fail_fast, retry_with_backoff, fallback), DDIA (event_sourcing, cqrs, saga, outbox), Fowler PEAA (unit_of_work, repository), and caching literature (cache_aside, write_through, write_back). Advisory (open string, not a hard enum — like tensionsDeclared.tension); an unregistered, non-x:-prefixed ID is schema-valid-but-spec-nonconforming. Each registry entry’s applies_to maps the pattern to the qualityAttributes sub-characteristic it serves — the pattern’s evidentiary weight lives there, not on the pattern (§5.5).

Closes the gap that producers couldn’t name “this implements circuit-breaker” or “this is event-sourced” — vocabulary every senior engineer expects.

Storage architecture detail

Extended envelope.persistence (was just required + stores[]) with four hard enums: replication (single / primary_replica / multi_primary / sharded), consistency (strong / read_after_write / eventual), backup (none / snapshot / continuous), encryption (none / at_rest / in_flight / both).

Concurrency-model detail

Extended envelope.instantiation (was just mode + coordinationDependency) with three hard enums: ordering (none / per_key / total), idempotency (none / keyed / global), conflictResolution (last_write_wins / crdt / application_defined / none).

§10 → authoring reference

Expand §10 from definitions into a per-characteristic SAM lens — for each characteristic, ~3 lines of SAM-specific authoring guidance ISO structurally cannot have: how you declare it (typical status values, what a verified claim requires here, which industryRefs[] anchor it, whether the concept also lives in envelope/extensions) and what an honest claim looks like (when not_applicable is the truthful call). Evens out the thin entries (e.g. compatibility.coExistence, several performanceEfficiency subs) that still read close to a restatement, seeds the deferred Authoring Guide inline, and makes §10 decisively non-derivative of ISO. (Substantially done — §10.2–10.8 now carry the SAM lens, grounded on the delivery-form taxonomy below; §10.1 (correctness fleshed) and §10.9 (safety, already domain-specific) were adequately concrete.)

intent.deliveryForm — shipped in v0.3

Closed the §10 orphaned-guidance gap: §10.2–10.8 depend on this axis, and it is now a declarable field.

A hard enum for how the software is delivered and who operates it — saas / self_hosted_service / library / cli_tool / desktop_app / mobile_app / browser_extension / infrastructure / appliance (9 forms; the client-side family cli_tool/desktop_app/mobile_app/browser_extension was completed during implementation), documented in registry/delivery-forms.json. The same quality key asserts a measured SLO for producer-operated software and a default-plus-sizing-guidance for consumer-operated software; the field lets consumers filter and tooling apply the right reading automatically. Source model (proprietary / open_source / source_available) remains an orthogonal candidate field, not part of this enum (deferred to v0.4).

The envelope.dependencies[].type split shipped alongside it: type (a single enum that mixed delivery form with functional role) was replaced by deliveryForm (the shared vocabulary above) + role (identity_provider, payment_provider, data_provider, communication_provider, observability_provider, ml_model_provider, other) — the one breaking change in v0.3 (§6.6). One delivery-form vocabulary now serves both subject and dependency.

Chosen as a hard enum (consistent with intent.audience and the former dependencies[].type), so an unknown value is invalid rather than advisory. Conformance: pass-with-deliveryform, fail-14-bad-deliveryform, pass-with-dependency-role, fail-17-dependency-legacy-type.

Near-term — v0.4 candidates

Gradability for architecturalStyle / architecturalPatterns — resolved in v0.3 (§5.5)

Surfaced by the v0.3 review: unlike qualityAttributes (which carry status / evidence[]), these two fields were bare self-assertions an AI agent might over-trust. Resolved in v0.3 via a spec patch (§5.5), deliberately not an evidence ladder — architecture resists direct evidence (no artifact proves “this is microservices” the way a load test proves a latency claim), so a status / evidence shape would manufacture assurance that does not exist. §5.5 scopes intent.architecturalStyle / architecturalPatterns[] as declarative design-context (not graded), states that a pattern’s verifiable effect lives in the qualityAttributes sub-characteristic it serves (registry applies_to gives the mapping), and notes they are layer-sensitive (declare where true; a product composes from components[]). deliveryForm was already exempt (verifiable-by-consequence).

serverless_function delivery form

The review flagged FaaS (Lambda-style code the consumer deploys but a cloud operator runs) as not mapping cleanly onto saas or self_hosted_service. Partly covered today by intent.architecturalStyle: serverless, so it is a defensible omission — revisit if authoring feedback shows the delivery/operation split matters for FaaS.

intent.sourceModel

Deferred from v0.3: the orthogonal proprietary / open_source / source_available axis that governs the maintainability reading (§10.7). Candidate as a separate optional enum on intent.

Spec content deferred from v0.2

Carried forward unchanged into v0.3+:

These are prose-heavy and depend on observed authoring patterns. They’ll land once we have enough real manifests to learn from.

Tooling

Registries

Long-horizon

Open questions

These came out of consumer-side review and design-pattern coverage analysis. Each is either resolved (above/below), still open, or out-of-scope (below) — listed here so the reasoning is visible.

Resolved in v0.2:

Resolved in v0.3:

Open / no decision yet:

Explicitly out of scope (carried forward):

Explicitly out of scope

SAM is an architectural visibility framework, not a compliance framework. The line below isn’t a refusal of compliance use cases — it’s a refusal of letting compliance use cases dictate the shape of the architectural surface. Consumers under any specific regime read SAM to populate their own compliance artifacts; SAM’s job is the architectural input layer that survives every regime simultaneously.

These are real concerns adjacent to SAM but not SAM’s job:

How to influence the roadmap

File an issue. The real-world-feedback template surfaces what’s blocking actual use; the schema-change-proposal template proposes specific shape. Roadmap reordering happens in response to that input, not in advance of it.