Foundry: A Practical Methodology for Turning System Design into Engineering Decisions
Most senior engineers can sketch a distributed system on a whiteboard. Fewer can reliably turn that sketch into decisions a team can execute under real constraints.
That gap is where projects slip: architecture decks look coherent, but implementation work reveals missing assumptions, hidden costs, and unclear trade-offs. Teams then make local fixes in tickets and pull requests, while the original design intent slowly dissolves.
Foundry is a methodology for closing that gap.
It is not a new database pattern or an opinionated cloud stack. It is a workflow for moving from design intent to operating system behavior, with explicit checkpoints that force clarity before scale.
Foundry has five stages:
- Foundation
- Design
- Validation
- Decision
- Delivery
At a high level:
Foundation -> Design -> Validation -> Decision -> Delivery
^ |
|---------------------------------------------|
(feedback loop when constraints change)
The purpose is simple: make system design a repeatable engineering process instead of a one-time architecture event.
Architecture is easy to discuss. Architecture that survives production is harder.
Why Another Framework?
Because many systems fail in predictable ways: vague boundaries, tool-first architecture, unvalidated assumptions, and rollout plans that appear after implementation starts.
Foundry addresses these failure modes by making each stage produce testable artifacts.
A familiar story
You start with a clean architecture doc. Two sprints later, real constraints change the implementation path. By sprint six, retry behavior, migration order, and rollback logic are buried in tickets instead of design.
The system still ships. But it no longer matches the architecture that was approved.
How Foundry differs from existing approaches
Foundry is not a replacement for the frameworks and practices most teams already use. It sits above them as a decision workflow.
Common references and what they solve well:
- DDD (Domain-Driven Design): strong domain boundaries and language alignment.
- C4 model: clear architecture communication at multiple abstraction levels.
- ADR (Architecture Decision Records): durable capture of key decisions.
- AWS Well-Architected / reliability checklists: operational and risk-oriented best practices.
- arc42 / classic architecture templates: structured architecture documentation.
These are all useful, but they usually answer different parts of the problem:
- DDD helps you model.
- C4 helps you explain.
- ADR helps you record.
- Well-Architected helps you review.
What is still often missing is the end-to-end loop that forces teams to move from assumptions to measured decisions and then into rollout-safe delivery.
That is the gap Foundry targets:
Model -> Validate -> Decide -> Deliver
In short, Foundry is less about what diagram to draw and more about how to make architecture decisions survive production reality.
Before the stages
Foundry is strict at stage handoffs. Each handoff forces a quality question:
- Foundation -> Design: Did we define the right constraints?
- Design -> Validation: Did we make assumptions testable?
- Validation -> Decision: Do we have evidence, not confidence?
- Decision -> Delivery: Can this be rolled out and operated safely?
Stage 1: Foundation
Foundation is where you define purpose and boundaries. This stage is often rushed because teams want to “start designing,” but most downstream rework comes from missing clarity here.
Intent
Intent is the reason the system should exist. It should be specific enough to evaluate later.
Bad intent:
- “Build a scalable event platform.”
Good intent:
- “Provide internal services with a reliable async event transport that supports retry semantics and auditable delivery status.”
Intent is not implementation. It is a falsifiable statement of value.
Field note: If intent cannot be tested after launch, it is probably a slogan.
Functional requirements
Functional requirements describe what the system must do in externally visible terms.
Examples:
- Publish an event with schema validation.
- Consume events with at-least-once processing.
- Query delivery state by event ID.
Each requirement should be written so an integration test can verify it.
Non-functional requirements
Non-functional requirements define quality targets.
Examples:
- p99 publish latency < 80ms under normal load.
- Durability target: no acknowledged event loss for single-node failure.
- Availability target: 99.95% API uptime.
If this section says “high performance” or “resilient” without numbers, Foundation is incomplete.
Constraints
Constraints force realism. Typical constraints include:
- Existing runtime and language standards.
- Regulatory requirements.
- Team size and expertise.
- Deployment environment and budget envelopes.
Constraints are design inputs.
Capacity targets
Capacity turns abstract architecture into concrete pressure.
Define expected and peak characteristics:
- Requests per second.
- Event payload sizes.
- Fan-out behavior.
- Storage growth rate.
- Retention horizon.
Capacity mistakes produce architecture mistakes.
No capacity envelope -> no credible load strategy
No load strategy -> no credible reliability claim
Security constraints
Security should not appear first in incident postmortems. It must exist in Foundation.
Capture:
- Data classification.
- Access model.
- Encryption requirements (in transit and at rest).
- Auditability expectations.
- Secret management boundaries.
A practical Foundation output can look like this:
Intent: Reliable internal event transport with auditable delivery
Functional: publish, consume, query status
NFR: p99 < 80ms, 99.95% availability, no acknowledged loss
Constraints: k8s-only, existing Go services, fixed cloud budget
Capacity: 15k avg EPS, 60k peak EPS, 2KB median payload
Security: service identity auth, encrypted transport, 90-day audit trail
If this section is weak, every stage after this will compensate with guesswork.
Stage 2: Design
Design takes Foundation inputs and produces candidate system models.
This is not where you pick tools by habit. It is where you map requirements and constraints into architecture options.
Domain model
Start by defining core entities and invariants. Without a domain model, API and storage decisions drift.
Questions to resolve:
- What are the first-class entities?
- Which transitions are valid?
- Which invariants must hold under concurrency and failure?
A minimal domain model reduces accidental complexity later.
APIs / interfaces
Interfaces are contracts between teams and services. They must encode behavior, not just payload format.
Define:
- Request/response shape.
- Error semantics.
- Idempotency expectations.
- Versioning strategy.
This is where many systems either gain or lose long-term adaptability.
Data flow
Map data movement explicitly:
Producer -> Ingress API -> Validation -> Durable store/queue -> Consumer
| |
+-> rejection path +-> retry path
Include failure paths in the primary flow model. If retries, dead-letter routing, or backpressure are not visible in diagrams, they are usually not real in implementation.
If failure handling is only in code comments, it is not design yet.
High-level architecture
High-level architecture should show:
- Service boundaries.
- State ownership.
- Failure domains.
- Observability points.
The purpose is not visual polish. The purpose is to expose coupling and blast radius early.
Consistency and availability posture
Every distributed system defines a consistency-availability posture, whether acknowledged or not.
Foundry requires this to be explicit:
- Which operations require strong consistency?
- Where is eventual consistency acceptable?
- What is the behavior under partition or dependency outage?
A useful pattern is to classify operations by business impact instead of technical preference.
Technology options
Only now should you evaluate technology options.
For each option, record:
- Strengths under your constraints.
- Failure behavior.
- Operational burden.
- Migration and lock-in implications.
Avoid “tool wars” by comparing options against Foundation artifacts.
A Design output should produce at least one viable candidate and one fallback candidate, each traceable to requirements.
Stage 3: Validation
This is the stage most teams skip or underinvest in. It is also where most bad designs could have been corrected cheaply.
System designs fail because assumptions are treated as facts.
Foundry treats assumptions as hypotheses.
This is the turning point of the framework. Before Validation, you have a proposal. After Validation, you have evidence.
Hypotheses
Write assumptions as testable statements.
Examples:
- “Option A can sustain 60k EPS with p99 under 100ms on target hardware.”
- “Consumer retry policy does not cause queue growth beyond safety thresholds.”
- “Schema evolution model remains backward compatible across two release windows.”
Ambiguous assumptions are expensive assumptions.
Proof of Concept (PoC)
A PoC should validate the highest-risk unknowns, not rebuild the final system.
Good PoC characteristics:
- Narrow scope.
- Representative load pattern.
- Realistic failure simulation.
- Measurable outputs.
PoCs are experiments.
Measurement
Measurement defines truth in Validation.
Capture:
- Latency distributions (not just averages).
- Throughput under steady and burst load.
- Error rates by class.
- Resource utilization.
- Recovery time after injected faults.
If measurement is weak, Decision becomes opinion.
Testing strategy
Validation requires layered testing:
- Contract tests for interface behavior.
- Load tests for capacity claims.
- Fault-injection tests for resilience claims.
- Migration tests for schema/data evolution.
You are testing architecture properties, not only code correctness.
Stats and change cost
Two concepts matter here:
- Statistical confidence in measured outcomes.
- Cost of changing direction if a hypothesis fails.
Teams frequently ignore the second. A design that looks good but is expensive to reverse should be held to a higher evidence threshold.
The core loop
At the center of Foundry is a simple loop:
Hypothesis -> Experiment -> Measure -> Learn -> (refine hypothesis)
This loop prevents architecture from becoming static ideology. It turns design into iterative engineering.
Teams that run this loop early usually make fewer irreversible mistakes.
Stage 4: Decision
Decision is where teams commit to architecture using evidence gathered in Validation.
This is where many organizations still rely on intuition, trend alignment, or “what worked last time.” Foundry explicitly rejects that.
Measured decision
A decision should reference concrete findings.
Example form:
- Chosen option: Candidate B.
- Why: Met p99 latency and recovery targets under peak-load simulation; lower operational overhead than Candidate C.
- Evidence: Validation run IDs, benchmark reports, fault test outcomes.
If a decision cannot point to evidence, it is not a design decision. It is a preference.
Trade-offs
Every architecture choice is a trade.
Document what you are accepting:
- Simpler operations vs. lower peak efficiency.
- Stronger consistency in critical paths vs. increased write latency.
- Faster short-term delivery vs. higher long-term migration cost.
Unwritten trade-offs become surprise outages or roadmap debt.
A good decision is not “no downside.” It is “known downside, accepted intentionally.”
Revisit triggers
No decision is permanent. Foundry requires explicit revisit triggers.
Examples:
- Throughput exceeds 70% of validated peak envelope for 30 consecutive days.
- p99 latency breaches target for two release cycles.
- Regulatory changes alter data residency constraints.
- Team topology changes make current ownership model ineffective.
Revisit triggers prevent both premature churn and dangerous inertia.
A concise decision record can be represented as:
Decision: Adopt architecture B
Evidence: benchmark-12, chaos-run-4, migration-test-2
Trade-offs: +operability, -raw peak throughput
Revisit triggers: sustained 70% load, p99 breach, compliance changes
Owner: Platform Architecture
Date: 2026-03-11
Stage 5: Delivery
Delivery translates the decision into a running system. This stage is often treated as “execution only,” but design quality is proven here.
Implementation scope
Break implementation into explicit slices:
- Core path required for first production traffic.
- Optional capabilities deferred by intent.
- Risk-heavy components isolated behind feature flags.
Scope discipline is how teams avoid building speculative infrastructure.
Rollout strategy
Rollout should be designed, not improvised.
Typical path:
- Internal canary traffic.
- Percentage rollout by tenant or region.
- Full rollout after SLO guardrails pass.
Define rollback criteria before rollout starts.
Migration planning
Most systems are built in context, not greenfield. Migration planning is therefore architecture, not project management.
Plan for:
- Dual-write windows.
- Read-path cutover steps.
- Data backfill strategy.
- Consistency checks between old and new paths.
Migration failures are often failures of design sequencing.
Operational considerations
A system is not delivered when endpoints respond. It is delivered when operators can run it predictably.
Required operational components:
- SLOs and alerting thresholds.
- Dashboards tied to known failure modes.
- Runbooks for top incident classes.
- Capacity review cadence.
- On-call ownership clarity.
Delivery without operational readiness is deferred failure.
If on-call cannot explain expected failure modes,
the design is incomplete.
The Philosophy Behind Foundry
Foundry is opinionated in a few important ways.
Architecture should be driven by constraints
Most architecture mistakes are not caused by lack of creativity. They are caused by ignoring constraints until late implementation.
Constraints are not limitations to “work around.” They are the frame that makes good design possible.
Great systems are not the least constrained. They are the most explicit about constraints.
Measurement is more valuable than intuition
Intuition matters for generating hypotheses. It is weak as a final decision mechanism.
When system behavior is uncertain, measurement is the only reliable tie-breaker.
Intuition is useful for proposing options. Measurement is required for selecting one.
Avoid premature scaling
Foundry treats scale as a validated requirement, not an aesthetic goal.
Premature scaling often increases complexity faster than it increases reliability. It also slows teams before load justifies the cost.
Design for expected scale, validate for near-future scale, and define clear triggers for the next step.
Design should remain adaptable
Foundry is not about producing a “final architecture.” It is about producing an architecture that can evolve under evidence.
Adaptability comes from:
- Explicit decisions and trade-offs.
- Revisit triggers.
- Clear ownership.
- Continuous validation loops.
In practice, adaptable systems are usually the ones with the strongest design discipline.
Applying Foundry in Real Teams
You can introduce Foundry without reorganizing the entire engineering process.
A practical end-to-end view:
[Foundation]
intent + reqs + constraints + capacity + security
|
v
[Design]
model + interfaces + dataflow + architecture options
|
v
[Validation]
hypotheses + experiments + measurements
|
v
[Decision]
selected option + trade-offs + revisit triggers
|
v
[Delivery]
rollout + migration + operations
Closing Thoughts
Foundry is not a silver bullet and it does not replace engineering judgment. It gives structure to the hardest transition point in system work: moving from architecture idea to production commitment.
If your team can design systems but struggles to turn designs into reliable outcomes, Foundry is immediately usable. It keeps architecture ambitious while forcing decisions to stay grounded in constraints, measurements, and delivery reality.
If there is one principle to keep, it is this:
Treat architecture like software. It should be testable, revisable, and accountable to production behavior.
Further Reading
- If you want the problem framing behind Foundry, read Why Another System Design Framework? The Real Gap Between Architecture and Delivery.
- If you want a concrete distributed systems example after the methodology, read Kafka: Start Simple, Then Scale the Idea.