history Last updated

A solution architecture document (SAD) describes a system at the level where changing your mind is still cheap: components, boundaries, data flows, and the quality attributes that drove them. If it reads like a description of the code, it will be obsolete in a month and nobody will update it.

When to use it

  • New systems, or significant re-platforming of existing ones.
  • When more than one team must build against the same structure.
  • Before a procurement or security review that needs a system-level view.

What it must answer

  • What are the components, and what is each one responsible for?
  • Where are the trust and ownership boundaries?
  • How does data flow, and where does it rest?
  • Which quality attributes drove the structure, and what did we trade away?

Template

Solution Architecture: <System>

FieldValue
Version / date
Architect
StatusDraft / Reviewed / Approved
RelatedCharter, SRS, ADRs

1. Context

Business purpose in five sentences. Who uses it, what it replaces.

2. Drivers and constraints

#Driver / constraintTypeSourceArchitectural consequence

3. Quality attribute scenarios

AttributeStimulusResponseMeasure

4. Logical view

Components and responsibilities. One diagram plus a table — the table is what
people actually read.

ComponentResponsibilityOwnerTechnologyNotes

5. Data view

Entities, stores, classification, retention, residency.

6. Integration and interfaces

Inbound and outbound, protocols, contracts, failure behaviour.

7. Deployment view

Environments, regions, network zones, scaling model.

8. Cross-cutting concerns

Identity and access, secrets, observability, error handling, tenancy,
configuration.

9. Availability and recovery

SLO, failure modes, RPO/RTO, degraded operation.

10. Security

Trust boundaries, threat summary, controls, residual risk.

11. Alternatives considered

OptionWhy rejected

12. Risks and open decisions

#ItemOwnerNeeded by
  # Solution Architecture: <System>

| Field | Value |
|---|---|
| Version / date | |
| Architect | |
| Status | Draft / Reviewed / Approved |
| Related | Charter, SRS, ADRs |


## 1. Context
Business purpose in five sentences. Who uses it, what it replaces.

## 2. Drivers and constraints
| # | Driver / constraint | Type | Source | Architectural consequence |
|---|---|---|---|---|


## 3. Quality attribute scenarios
| Attribute | Stimulus | Response | Measure |
|---|---|---|---|


## 4. Logical view
Components and responsibilities. One diagram plus a table — the table is what
people actually read.

| Component | Responsibility | Owner | Technology | Notes |
|---|---|---|---|---|


## 5. Data view
Entities, stores, classification, retention, residency.

## 6. Integration and interfaces
Inbound and outbound, protocols, contracts, failure behaviour.

## 7. Deployment view
Environments, regions, network zones, scaling model.

## 8. Cross-cutting concerns
Identity and access, secrets, observability, error handling, tenancy,
configuration.

## 9. Availability and recovery
SLO, failure modes, RPO/RTO, degraded operation.

## 10. Security
Trust boundaries, threat summary, controls, residual risk.

## 11. Alternatives considered
| Option | Why rejected |
|---|---|


## 12. Risks and open decisions
| # | Item | Owner | Needed by |
|---|---|---|---|
  

Worked example

Solution Architecture: Access Provisioning Service (extract)

2. Drivers and constraints

#Driver / constraintTypeSourceConsequence
D1Every entitlement change must be attributable for 7 yearsComplianceAudit finding 2025-11Append-only audit store, separate from the operational database, written before the grant is considered successful
D2HR system is read-only and cannot be replacedConstraintBRD §7Event-driven ingest with local projection; no writes back to HR
D3Two of eleven targets have no modern APIConstraintDiscoveryAdapter layer with a batch adapter for the legacy ERP; provisioning latency for those targets is inherently nightly
D4People Ops must change bundles without a releaseBusinessBR-04Bundle definitions are data, versioned in the database, not code
D5No new identity licences before FY2027BudgetBRD §7Reuse existing identity platform for SCIM; no third-party IGA product

3. Quality attribute scenarios

AttributeStimulusResponseMeasure
LatencyJoiner event arrivesEntitlements applied and auditedp95 <= 30 min, excluding batch targets
AvailabilityOne target system unavailableOther entitlements still applied; failed one queued and ticketedNo cascading failure; partial state visible
AuditabilityAuditor asks who granted X to Y on date ZAnswer from the audit store< 5 minutes, without engineer involvement
Elasticity500 joiners in one day (graduate intake)Processed within the working dayNo manual intervention

4. Logical view

ComponentResponsibilityOwnerTechnologyNotes
IngestReceive, deduplicate and validate HR eventsPlatformGo serviceIdempotent on HR event ID
Bundle resolverMap job code to entitlement setPlatformGo + PostgresBundles are versioned rows; resolution pins a bundle version onto the request
ApprovalState machine for non-standard entitlementsPlatformGoStates: DRAFT, AWAITING_BUNDLE, AWAITING_APPROVAL, APPROVED, APPLYING, COMPLETE, PARTIAL, REJECTED
Adapters (11)Talk to each target systemPlatformSCIM client; SFTP batch for ERPOne adapter per target, uniform interface, per-adapter retry policy
Audit sinkAppend-only record of grants and revocationsSecurityObject storage, daily signed exportWrite precedes success; failure to write fails the grant
Admin UIBundle maintenance for People OpsPlatformServer-renderedChanges are reviewed by a second People Ops user before taking effect

8. Cross-cutting concerns

  • Identity: the service authenticates to targets with per-target service
      credentials from the secrets manager, rotated every 90 days. It never holds
      end-user credentials.
  • Observability: correlation ID minted at ingest, propagated to every
      adapter call and written to the audit record. Golden signals per adapter.
  • Error handling: adapters are the only place that retries; the core state
      machine treats every adapter outcome as final for that attempt.

9. Availability and recovery

SLO 99.5% monthly during business hours. Degraded mode: events queue for up to
4 hours without loss. RPO 15 min (Postgres PITR), RTO 4 hours. A queued event
is never dropped; the queue is the durability boundary.

11. Alternatives considered

OptionWhy rejected
Commercial IGA productEUR 90k/yr recurring, exceeds FY2027 budget constraint D5; also requires works council review, adding ~6 weeks
Direct HR-to-target integrations, no serviceNo central audit point, which is the whole reason for the project (D1)
Synchronous provisioning at HR event timeCouples availability to eleven targets; one target’s outage would fail the joiner entirely

12. Risks and open decisions

#ItemOwnerNeeded by
1Legacy ERP revocation latency is 26h worst case, against a 1h requirementA. VogelBefore UAT — see RTM accepted gaps
2Bundle version pinning: do in-flight requests follow bundle edits? Decided no — see ADR-0012A. VogelClosed
  # Solution Architecture: Access Provisioning Service (extract)

## 2. Drivers and constraints
| # | Driver / constraint | Type | Source | Consequence |
|---|---|---|---|---|
| D1 | Every entitlement change must be attributable for 7 years | Compliance | Audit finding 2025-11 | Append-only audit store, separate from the operational database, written before the grant is considered successful |
| D2 | HR system is read-only and cannot be replaced | Constraint | BRD §7 | Event-driven ingest with local projection; no writes back to HR |
| D3 | Two of eleven targets have no modern API | Constraint | Discovery | Adapter layer with a batch adapter for the legacy ERP; provisioning latency for those targets is inherently nightly |
| D4 | People Ops must change bundles without a release | Business | BR-04 | Bundle definitions are data, versioned in the database, not code |
| D5 | No new identity licences before FY2027 | Budget | BRD §7 | Reuse existing identity platform for SCIM; no third-party IGA product |


## 3. Quality attribute scenarios
| Attribute | Stimulus | Response | Measure |
|---|---|---|---|
| Latency | Joiner event arrives | Entitlements applied and audited | p95 <= 30 min, excluding batch targets |
| Availability | One target system unavailable | Other entitlements still applied; failed one queued and ticketed | No cascading failure; partial state visible |
| Auditability | Auditor asks who granted X to Y on date Z | Answer from the audit store | < 5 minutes, without engineer involvement |
| Elasticity | 500 joiners in one day (graduate intake) | Processed within the working day | No manual intervention |


## 4. Logical view
| Component | Responsibility | Owner | Technology | Notes |
|---|---|---|---|---|
| Ingest | Receive, deduplicate and validate HR events | Platform | Go service | Idempotent on HR event ID |
| Bundle resolver | Map job code to entitlement set | Platform | Go + Postgres | Bundles are versioned rows; resolution pins a bundle version onto the request |
| Approval | State machine for non-standard entitlements | Platform | Go | States: DRAFT, AWAITING_BUNDLE, AWAITING_APPROVAL, APPROVED, APPLYING, COMPLETE, PARTIAL, REJECTED |
| Adapters (11) | Talk to each target system | Platform | SCIM client; SFTP batch for ERP | One adapter per target, uniform interface, per-adapter retry policy |
| Audit sink | Append-only record of grants and revocations | Security | Object storage, daily signed export | Write precedes success; failure to write fails the grant |
| Admin UI | Bundle maintenance for People Ops | Platform | Server-rendered | Changes are reviewed by a second People Ops user before taking effect |


## 8. Cross-cutting concerns
- **Identity:** the service authenticates to targets with per-target service
  credentials from the secrets manager, rotated every 90 days. It never holds
  end-user credentials.
- **Observability:** correlation ID minted at ingest, propagated to every
  adapter call and written to the audit record. Golden signals per adapter.
- **Error handling:** adapters are the only place that retries; the core state
  machine treats every adapter outcome as final for that attempt.

## 9. Availability and recovery
SLO 99.5% monthly during business hours. Degraded mode: events queue for up to
4 hours without loss. RPO 15 min (Postgres PITR), RTO 4 hours. A queued event
is never dropped; the queue is the durability boundary.

## 11. Alternatives considered
| Option | Why rejected |
|---|---|
| Commercial IGA product | EUR 90k/yr recurring, exceeds FY2027 budget constraint D5; also requires works council review, adding ~6 weeks |
| Direct HR-to-target integrations, no service | No central audit point, which is the whole reason for the project (D1) |
| Synchronous provisioning at HR event time | Couples availability to eleven targets; one target's outage would fail the joiner entirely |


## 12. Risks and open decisions
| # | Item | Owner | Needed by |
|---|---|---|---|
| 1 | Legacy ERP revocation latency is 26h worst case, against a 1h requirement | A. Vogel | Before UAT — see RTM accepted gaps |
| 2 | Bundle version pinning: do in-flight requests follow bundle edits? Decided no — see ADR-0012 | A. Vogel | Closed |
  

Common mistakes

  • Diagrams without a component table. Boxes and arrows do not say who owns a component or what it is responsible for; the table does, and it survives being pasted into a review document.
  • No drivers section. A structure with no stated drivers is indefensible and unmaintainable — the next person cannot tell which parts are load-bearing.
  • Missing alternatives. “Why not the obvious cheaper thing?” will be asked in every review. Answer it once, in writing.
  • Cross-cutting concerns left implicit. Identity, secrets, observability and error handling are where most production surprises come from.
  • Document versioned separately from the system. Keep it in the repository so a change to structure and a change to the document arrive in the same pull request.

Last updated 23 Aug 2026, 17:44 -0500. history