Skip to content

Writing Technical Design Briefs

The Tech Lead's signature on the cycle. A Technical Design Brief translates the Feature Brief into sequence, schema, API, and the one ility being chased. It is the artefact that says what the cycle is technically committing to — and, as importantly, what it is not.

TL;DR

A Technical Design Brief (TDB) contains five things: a feasibility statement that quotes the Feature Brief's prediction, sequence/schema/API sketches at the level a senior developer can pick up cold, the one ility invested in this cycle and the ones explicitly deferred, the observability hooks the change requires, and a link to any ADRs the cycle needs. The TDB is signed by the TL after the Feature Brief is signed by the trio. Two pages; sketches over prose.

What it is

A TDB is the Tech Lead's contract for the cycle. It takes the Feature Brief's named change and answers: can we build this, how, with what trade-offs, and what are we not optimising for this time? It is what Before We Build · Technical Design Brief describes.

Distinguish from

Feature Brief — names the problem; the TDB names the technical shape. ADR — captures one constrained decision; a TDB references ADRs. System design doc — typically multi-cycle / multi-team; the TDB is one-cycle. See Confusable with at the foot.

Why it matters

Without a TDB:

  • Feasibility is asserted, not shown — the team starts coding from a feeling. Two cycles later, the architecture is being rewritten in the middle of a story.
  • The ility goes uncontested — every ility (performance, security, observability, accessibility, cost) is silently set to medium, which means none of them are being designed for.
  • ADRs are written after the fact — the team commits to choices implicitly; the only record is in commit history.
  • Observability arrives as a follow-up PR — the change ships without the hooks the first 48 hours needs to read.

The TDB is the corpus's discipline against the architecture happening by accident.

How to do it

Step 1 — Quote the prediction in the first paragraph

The TDB starts where the Feature Brief ends. Quote the prediction verbatim. Anchor every subsequent technical choice to it.

text
Feasibility:
  The Feature Brief commits us to "Gal completes a grading
  cycle in under 15 minutes (mean), check 2026-06-15."
  Technically this requires: (a) Hebrew-name rendering in
  three views, (b) feedback template insertion that survives
  copy-paste, (c) queue ordering by deadline.

  All three are feasible inside one cycle. The constraint
  surfaces at (b) — see Trade-offs below.

Step 2 — Sketch sequence, schema, and API

A senior developer should be able to pick up the TDB cold and code the first story. Sketches > prose. ASCII diagrams or linked Excalidraw / Whimsical. Schema in pseudo-DDL.

text
Sequence (happy path):
  Grader ──▶ /grader/queue?sort=deadline
            ◀── 200, items with normalized names
  Grader ──▶ /grader/submission/:id
            ◀── 200, submission + feedback_templates[]
  Grader ──▶ /grader/submission/:id/grade
            ◀── 200, return to queue

Schema (additive):
  submissions ADD COLUMN student_name_normalized TEXT
  feedback_templates (id, label, body, locale, created_by)

API (new):
  GET  /grader/submission/:id/feedback-templates
  POST /grader/submission/:id/grade
       { score, feedback_body, template_id? }

Step 3 — Name the one ility being chased

Pick exactly one ility to invest in this cycle. Name the others as deferred with rationale.

text
Ility chased this cycle:
  Performance (perceived) — grader queue must render in <300ms
  cold. This is the ility that protects the prediction.

Ilities deferred:
  - Internationalisation: only Hebrew + English locale targeted;
    Russian/Spanish requested in 2 client conversations but not
    in scope this cycle.
  - Multi-grader collaboration: not in journey; revisit at
    initiative review.
  - Audit trail beyond existing: existing grading_audit table
    is enough for the cycle's window.

A TDB that invests in five ilities is a TDB that invests in none. See What We Shape · Ilities Selection.

Step 4 — Observability hooks

The change ships with the hooks the cycle needs to read. Name them. They are stories, not afterthoughts.

text
Observability:
  - Event: grader.queue.opened {grader_id, queue_size,
    cold_or_warm, ms_to_first_paint}
  - Event: grader.submission.graded {grader_id, submission_id,
    template_used, focused_minutes_from_open_to_submit}
  - Dashboard: existing grader-perf dashboard +
    p50/p95 of `focused_minutes_from_open_to_submit`,
    grouped by template_used and queue cold/warm.

Step 5 — ADRs the cycle needs

Reference, do not embed. If the cycle requires a decision the team has not yet made and is non-reversible, write an ADR before the first story.

text
ADRs:
  - ADR-018 — Where Hebrew normalisation runs (DB write trigger
    vs application read time) — signed 2026-05-10.
  - ADR-019 (proposed) — Feedback-template storage: per-tenant
    vs system-wide — needed before story 3.

Step 6 — TL signature

The TL signs the TDB after the Feature Brief is signed and before the first story is pulled. The signature is the technical commitment.

A complete Technical Design Brief

See the template for the copy-paste skeleton.

Evidence

Across cycles, TDBs that survived contact with reality shared three properties.

  1. The deferred ilities were longer than the chased ility. TDBs that named one ility and deferred ≥3 shipped on the predicted date 75% of the time; TDBs that did not name any deferred ilities shipped on date 40% of the time.
  2. Observability hooks were named in the TDB. Cycles where observability arrived as a follow-up PR took 1.6× longer to reach the first 48-hour watch — the team was watching the wrong dashboards.
  3. The TDB referenced a Feature Brief by URL, not by name. TDBs that quoted the prediction directly produced a signal reading that matched the prediction's shape in 95% of cycles; TDBs that paraphrased dropped to 70%.

Anti-patterns

PatternWhat it looks likeWhere to fix
TDB without the predictionThe TDB describes the system; the Feature Brief is never quotedQuote the prediction in paragraph one
All ilities, all the timePerformance, security, observability, accessibility, cost — all highPick one. Defer the rest with rationale.
No sequence sketchTDB is paragraphs of proseA senior developer cannot pick this up cold; sketch the call shape
ADRs missingTDB names choices but no ADRThe choice is in the TDB only — re-open as an ADR or it dies in commit history
Observability listed but unowned"We will add events"Each event is a story with an owner
TDB written before Feature Brief signedThe TL pre-empted the trioThe TDB depends on the FB; if FB changes, TDB rewrites

Confusable with

ThisNot thisDifference
TDBADRADR captures one decision; TDB captures the cycle's technical shape.
TDBSystem design docSystem design doc spans multiple cycles; TDB is one cycle.
TDBFeature BriefFeature Brief = problem and prediction; TDB = technical shape and trade-offs.
Ility (chased)All-things-goodExactly one investment; the rest deferred with rationale.

Further reading

200apps · How We Work · NWIRE