33signals signal over noise
How we build and how you stay in control

Two ways to build the same system

Take a typical ten-person product team and a compact AI-assisted build team - sized to the engagement - both building the same system to the same engineering standard. Same principles, same stack, same pipeline. What differs is who executes, when the design happens and what is still holding the standard eighteen months in.

Anyone can generate a demo - AI has made them nearly free. It has made maintainable, provable, production software no easier at all. This page is about that gap and the framework that closes it.

What varies per engagement is the number of engineers and the build order. What does not vary is the set of gates.

This describes our standing approach; the specification for any engagement is agreed within it - and evolves there. Headlines give the shape - open any section for the mechanism and again for the engineering detail.

What is the same

Not vibe coding - engineering, evolved

If your experience of AI-built software is a demo that dazzled and then fell apart - or a codebase nobody can maintain because nobody quite wrote it - your scepticism is earned. That failure mode is real, it is everywhere and it has taught a generation of buyers to hear "AI-assisted" and think "corners cut".

This is the opposite construction. Every discipline below is the standard engineering canon, unchanged and ours drops nothing from the list. What changes is who executes it and what enforces it: in most teams the standard is held by people being careful; here it is held by the build itself. AI doesn't relax the engineering - it's the reason we can afford more of it.

C# on .NETSOLIDDesign patterns where they payTest-driven developmentUnit, integration, contract, property and mutation testingOWASP ASVS Level 2PostgreSQLReactTerraformGated CI/CDBlue/green deploys with automatic rollbackExternal penetration testClient sign-off on requirementsIndependent audit before acceptance

Traditional product team

  • Design emerges sprint by sprint; the architecture is whatever the first three months produced.
  • Standards are held by code review - by whoever is free, at whatever skill level they have that day.
  • Tests are written after the feature and are the first thing dropped when the date moves.
  • Knowledge lives in people. When they leave, it leaves.

AI-assisted build

  • Architecture, standards, threat model and per-module specifications are written and signed before code. Every rule has one home.
  • Standards are held by the build itself: analyzers, architecture tests, module checks, a mutation threshold. Review confirms; it does not enforce.
  • The machine writes the failing tests from the signed specification first, a person reviews them, then the machine implements until green.
  • Knowledge lives in the repository. The hundredth module is written from the same standards as the first.
The engagement approach

You are always looking at working software

Not wireframes, not decks, not a six-month planning phase. Every stage puts a running system with a database behind it in front of you - and the senior team you meet in the first session is the team that builds.

Stage 1

Understand it

From one or two working sessions - your brief, our conversations, nothing more - we return with a working prototype: your data flows, dependencies, roles, module structure and schema, running as software. Usually within days.

You have: a prototype that proves the shape
Stage 2

Prove it

Phase zero: a full end-to-end version on seeded data - your actual policies, sandboxed integrations. Its job is to surface what breaks, close every assumption and size the real volumes before anyone commits to timelines.

You have: the signed blueprint for the production build
Stage 3

Build it

The production system, written fresh to the blueprint under the seven gates. The highest-risk items are tackled first in design and analysis - phase zero exists to surface them - so that the build itself can run module by module in dependency order, each accepted before the next begins.

You have: a platform you own outright, in your own cloud account
Stage 4

Maintain it

Continuous monitoring, continuous point-in-time backup with weekly tested restores, versioned deployments with rollback, security patching against defined service levels, support under the support agreement.

You have: a system that is watched, drilled and maintained

The question every burnt buyer asks, answered before you ask it: if we part ways after phase zero, you own the working seeded system and the complete specification - enough for any competent team to continue. And one rule keeps the fast work honest: prototype code never reaches production. Production modules are written fresh from their specifications, under the gates. There is exactly one door between the two worlds and everything passing through it is rebuilt to standard.

The lifecycle

A loop versus a line

The traditional lifecycle is a loop: build, test, find, fix, repeat - with a hand-off at every turn. Ours is a straight line, because the specification is the hand-off and every gate is a check the pipeline runs rather than a meeting someone must hold. A defect in ours fails a gate on the pull request that introduced it; it never re-enters a loop.

Two lifecycles: a traditional sprint loop with rework arrows and a straight-line AI-assisted flow. TRADITIONAL - THE LOOP Discovery Design sprint loop, repeated 15 to 20 times - each defect crosses two hand-offs Plan Develop Test Rework Hardeningtests catch up here UAT and release AI-ASSISTED - THE LINE Design setpeople, once per platform SPEC signedper module, by people Tests firstmachine writes, person reviews Implement to greenmachine, inside the guardrails Automated gatesthe seven, every change Auditindependent Shipauto-rollback armed Filled boxes are human decisions or automated gates. Outlined boxes are machine-executed under the standards. A defect fails a gate on the pull request that introduced it - it never travels back through hand-offs.
Planning
Analysis
Design
Development
Testing
Release
Maintenance
Discovery by buildingWorking prototype from session one
Phase zeroSeeded build closes every assumption
Architecture firstBoundaries, patterns, data design - locked before a line is written
Governed executionEngineers architect; the machine executes inside the guardrails
Tests before codeWritten from the SPEC; locked; re-run at every gate
Gated pipelineSeven gates; a failure stops the release
Run and proveMonitored, drilled - evidence accrues daily

The design is done once, by people: architecture decision records, coding and security standards, a threat model with named controls, a testing standard and a specification template. The scaffold - the modular monolith's kernel, test kit and pipeline - is generated once. Every module after that is the same shape, built from its own signed specification and proven by the same layers, which is why the tenth module costs no more than the second:

Proof layer, in orderWhat it checksWho produces it
Unit tests, TDDPure domain behaviour, written failing from the SPECMachine writes, person reviews first
Property testsHundreds of generated cases per ruleMachine
Control and handler testsAccess denial, row-level security, exactly-once processingMachine
Contract and event testsModule schemas agree - the boundary holdsMachine
Migration testsEvery schema change runs against empty and prior statesMachine
Endpoint tests + negative matrixEvery route, including everything that must be refusedGenerated, complete coverage
Mutation testingDeliberate faults injected; the tests must catch them or the build breaksPipeline enforces
Performance smokeLoad thresholds per non-functional targetPipeline enforces
Evidence and auditThe full record, signed at a specific commitPeople sign
Every test carries a traceability tag naming the specification line it proves - and a test without one fails the build. Human code review, per module, is done by an engineer who did not write it.
The seven gates

Nothing ships unless seven questions answer green

Our pipeline holds every release against seven dimensions. Select a gate for what it means for you - and the engineering checks that enforce it.

GreenEvery check passed. Ships without discussion.
AmberShips only under a written waiver with a named owner and an expiry date - which re-blocks automatically.
RedBlocked. No human override, ever. The only way past red is to fix the code. Data and Security have no amber at all.

Behind the gates: our senior engineers define the architecture, the standards and what correct means for your business. The machine executes inside those guardrails - constrained, measured per commit, verified at every step. The machine turns the lights green; a named human ships it.

Coordination

The cost nobody talks about

A team of ten has forty-five pairs of people who may need to agree. Every stand-up, refinement and "quick question" is that graph being walked - and the result is a week spent working on the work rather than moving it forward: meetings about the work, status on the status, alignment about alignment. It is why adding people to a late project makes it later. Ours is a hub: a central build team holds the design - a few senior engineers, each owning modules in a parallel stream - the machine executes it and the client's signatories and an independent auditor sit on the rim. Each path is a signed document rather than a meeting.

And more paths carry less signal, not more. Every conversational hop is an interpretation - by the time a requirement reaches a keyboard it has passed through two or three retellings and each person on the mesh holds a slightly different version of the truth. A signed specification is one signal, read identically by every person and by the machine. It's in the name.

Communication paths: a ten-person full mesh with forty-five links, against a hub with the central build team and the machine at the centre and six links per stream.
Communication paths, n(n-1)/2 - the worked example from the model below. Left: a ten-person product team, 45 paths, all carrying design intent by conversation. Right: a central build team - a few senior engineers, each owning the modules in their stream - with the machine at the centre; 6 paths per stream, each a signed document. The team scales as parallel streams under the same gates, not as a bigger mesh.
On the single point of failure: it sits on the left side of this diagram. In a traditional team, knowledge lives in ten heads; here there is nothing to lose that is not in the repository - the environment is infrastructure as code, the build is documented and locked from phase zero, standards are enforced by the pipeline and every behaviour has a signed specification line with a test that names it. A new engineer, or a new machine session, starts from the same files the last one did.
Effort and time

Where the human hours actually go

Nobody has ever shipped late because the typing took too long. The human hours concentrate on the half that was always the point - deciding what correct means and checking that the tests prove it; the machine takes the cheap half, typing out what has already been decided. The result is measured in effort and elapsed time, not headcount.

~100
person-months to go-live - a regulated lending platform at market shape: ten people at typical allocation, thirteen months
~25
person-months for the same build - the central build team: engineers, the product lead who scoped it and an analyst and reviewer; hours spent where judgement is needed
12-15 mo
elapsed time, traditional - the loop and the hand-offs set the pace
6-8 mo
elapsed time, AI-assisted, end to end - the client's decisions and third parties set the pace
2-6 wks
lead time for a small change, later - ticket, backlog, sprint, regression
Days
lead time for the same change - amend the SPEC lines, re-sign, gates re-run

This model is anchored to a live regulated lending build on our board: the central build team working parallel module streams, six to eight months end to end, against a ten-person team at typical allocation over thirteen months for the same scope. The defaults below are that build. Enter your own quote on the left; the right derives the same build at the anchored ratios.

The build as a traditional team would quote it

The same build, through this framework

The same build, derived:
Timeline: , end to end
On the build: the central build team - engineers in parallel module streams, the product lead who scoped it and an analyst and reviewer
Keeping it running: -

MeasureTraditionalThis frameworkRatio
Elapsed time to go-live
Human effort to go-live
Human effort per year to maintain
Effort, build plus three years
How this model works: the anchored ratios are from this build's plan, deliberately more conservative than the pace measured on our builds to date (the figures further down this page). Two judgements are left to you: parallel streams and how much slower than measured you care to assume - set the dial to double or triple and the shape of the answer does not change. Effort is human person-months; the machine's work is not part of that number. Maintenance, defined: run-mode only - monitoring response, security patches, dependency updates through the gates, restore drills and compliance updates; the machine executes, a person reviews and signs. Enhancements are new work, sized per change, delivered in days. The first weeks after go-live run heavier and settle to this rate - which follows the industry rule of thumb of fifteen to twenty percent of build effort per year and holds only while the standard holds; as a codebase decays, maintenance grows (the month-eighteen section below).
Commercials are discussed per engagement, sized from exactly these inputs.
Traditional team - 10 peopleThis framework - the central build team
Delivery manager (1) · Product owner / business analyst (1) · Solution architect (0.5) · Tech lead (1) · Developers, senior to junior (4) · QA engineers (1.5) · DevOps (1) A few senior engineers - every module owned by a named engineer, streams run in parallel · Embedded product lead - the person who scoped and sold the build · Analyst and reviewer - an engineer who did not write the module under review
The delivery manager, product owner and analyst are a translation layer: requirements cross two hand-offs before they reach a keyboard and design intent travels by meeting. The person who scoped and sold the build sits inside it, by design - requirements gaps close at the source and design intent travels as a signed specification.
Where the defaults come from: team size is people on the project; allocation reflects that specialists - the architect, DevOps, QA - are rarely dedicated to one build, so the effective effort is lower than the roster suggests. Our side has no such discount: everyone on it is on it. Market benchmarks for enterprise lending platforms run nine to fourteen months, with engineer counts of ten and above before management, QA and DevOps are counted - the ten-person default is the full team, deliberately at the lean end. Traditional maintenance is typically two to three named people at partial allocation.
Risk

When the risk is retired - and who holds what remains

Traditional builds carry their risk to the end: integration is discovered at hardening, tests catch up last and the slips live exactly where the time has run out. We sequence the other way: the highest-risk, least-known items are attacked first in design, analysis and phase zero - which exists precisely to retire assumptions before anyone commits to a date - so the build itself runs module by module with nothing unknown ahead of it. What remains on the critical path is the client's own decision loop and third parties and that is worth saying plainly: it puts the schedule in your hands, not ours.

Unretired risk over the engagement: traditional stays high until hardening; AI-assisted burns down through phase zero to a residual of client decisions and third parties. highlow startphase zero endsmid-buildgo-live unretired risk integration discovered at hardening traditional - risk retired last assumptions closed in phase zero AI-assisted - residual: client decisions and third parties, tracked from day one Illustrative shape, not a measurement. Third-party lead times - bank onboarding, bureau access, the external pen test - are the same in both approaches and no method can shorten them.
Risk classTraditional approachThis framework
Wrong thing builtDiscovered at UAT, months inRetired in phase zero - the seeded build is the requirements conversation
Integration surprisesLeft for hardening, where the slips liveProven against sandboxes in phase zero, shapes obtained early; a named risk register from day one
Quality decay under deadlineTests compressed, review waved throughStructurally impossible - the gates have no override on red
Key people leaveKnowledge leaves with themStandards and knowledge live in the repository, not in heads
Vendor disappearsClient stranded on tribal knowledgeOrdinary documented code, full specification, clean-machine deploy - independent from day one
Client decisions and third partiesThe same in bothThe same in both - named, scheduled and tracked jointly, because no method shortens a bank's onboarding
Month eighteen

Who is still holding the standard?

Any team can write clean code in month one. The question a buyer should ask is what the codebase looks like after the tech lead has moved on, two developers have been replaced and a regulator's deadline has passed through it. In a traditional team the standard is held by review - by people of varying skill, under varying pressure. It bends a little each time and it does not bend back. A standard enforced by the build cannot be waived on a Thursday. The machine reads the same standard for module forty as it did for module one.

Adherence to the engineering standard over twenty-four months: flat for the AI-assisted build, declining through ordinary events for the traditional team. 100%80%60%40% month 06121824 adherence to the standard AI-assisted - held by the build tech lead leaves deadline: "just this once" two juniors replace a senior tests skipped to hit a date traditional - held by review
Illustrative shape, not a measurement. The events are the ordinary life of a delivery team - not failures of the people involved; they are what happens when a standard depends on people. Each one costs the standard something it does not get back.

Traditional - enforced by people

  1. Pull-request reviewwhoever is free
  2. Linter and formatterstyle only
  3. Coding guidelines wikiread once
  4. Unit testswritten after, if time
  5. Definition of donenegotiable
  6. Architecture diagramdrawn in month two

AI-assisted - enforced by the build

  1. Engineering
  2. Banned symbols and analyzersrefuse at compile
  3. Architecture testsa boundary breach is a failing test
  4. Module check, dozens of named rulesevery pull request
  5. Testing
  6. Tests first, one PR each, before any codetests-only check enforced
  7. Mutation score thresholdbelow it, the build breaks
  8. Every test traced to a SPEC linean untraced test fails the build
  9. Negative matrix per routegenerated, complete
  10. Security
  11. Named security controls, each citedOWASP ASVS L2
  12. Audit
  13. Independent per-module auditsigned at a commit
  14. Evidence bundle per modulearchived, immutable
Every rule on the right is a compiler error, a failing test or a pipeline gate - there is no item on it that a person could decide to skip. A test changes only in its own reviewed pull request and only when the written requirement changes - never alongside the code it tests. The pipeline enforces it.
What stays human

People decide; the machine types

The machine writes the parts where the answer is already known. Deciding what correct means is the work - done by people, with you and signed: where module boundaries fall, what blocks a release, the day-count conventions, reading the tests before code exists, reconciling the book to the cent with your finance function, the independent audit, user acceptance and every retention, jurisdiction and identity decision - the code has a slot for each; your people own the answer.

Ownership and continuity

Yours outright - and independent of us

The IP and source are yours, in a repository you control. Every release ships with current documentation, the living build register regenerated from the actual code and a machine-readable inventory of every component and license. Acceptance includes the clean-machine test: builds and runs from scratch with standard tooling, demonstrated. The full restaurant is yours - kitchen, recipes, methods. The appliances we bring when we cook are the only thing we take with us.

Measured, not promised

Figures from our own builds - counted, not claimed

File counts, test counts, mutation reports and the dates in git. Calendar days are elapsed time between first and last commit. Offered as observed pace, not as a guarantee.

The dates are in git: the design set took six days; the seeded five-module lending engine, under three; the harness that found the defects, two.

What we ranWhat it found
Mutation testing, every module - deliberate faults injected86-100% mutation score across modules, against a break threshold of 80
2,500+ tests - unit, control, handler, migration, endpoint, property - every one traced to a specification lineAll green; performance targets proven by load scenarios
The test harness, built after the engine by the same approach4 real defects - a drifted event catalogue, an unreachable guard, a mismatched status code - recorded as findings, not quietly patched
The clean-machine test at acceptanceBuilds and runs from scratch with standard tooling, demonstrated
The design set, written before code - architecture, standards, threat model, specifications34 decision records, 67 named security controls
Why the harness row matters: it found real defects in code written days earlier by the same approach. The regime is designed to catch its own mistakes and did.
Risk of machine-written codeWhat answers it - structurally, not procedurally
A test that passes without proving anythingMutation testing: deliberate faults are injected and the tests must catch them, or the build breaks. On its first run it exposed exactly this - and each gap became a named test.
Code that reaches outside its boundaryProject references, banned symbols and architecture tests: the wrong call is a compile error or a failing test, never a review comment.
A business rule quietly wrongThe specification precedes the test, a person reviews the failing tests before code exists and the pinned figures come from an oracle - your executed agreements, reconciled to the cent.
Tests edited to make code passA test changes only in its own reviewed pull request when the written requirement changes; the pipeline refuses a code change that edits the tests it must pass.
Nobody understands it laterEvery behaviour has a numbered line in a signed document and a test that names it; a new engineer starts from the same files the machine did.
Dependence on one supplierPlain .NET, PostgreSQL, Terraform, standard pipelines - free tooling throughout. The repository, configuration and all evidence transfer whole at sign-off, with no residual supplier rights.
A commitment on honesty

All-green does not mean nothing can ever go wrong. No serious engineer will promise you that - and you should be wary of any who does.

All-green means something narrower and stronger: every failure mode we can test for is proven absent - on every change, not once at sign-off. And anything unforeseen is designed to land four ways. Small - contained to one module. Visible - logged and alerted. Explainable - fully auditable, end to end. Recoverable - rollback and a proven restore. The four defects above are this commitment working in practice.

That is what provable quality means - a claim we can defend in front of any reviewer you choose and prefer to.

The same engineering, directed by the people whose judgement was always the expensive part - executed by a machine that never gets tired of the standard. Put this in front of your technical reviewers.

We welcome the interrogation - it's what the whole framework is built for. The full technical specification behind this page - architecture decision records, standards, threat model, testing standard and pipeline definition - is available for their review.