{"id":33557,"date":"2026-09-19T07:48:30","date_gmt":"2026-09-19T07:48:30","guid":{"rendered":"https:\/\/writegenic.ai\/content\/?p=33557"},"modified":"2026-09-19T07:48:32","modified_gmt":"2026-09-19T07:48:32","slug":"technical-design-specification-template","status":"publish","type":"post","link":"https:\/\/writegenic.ai\/content\/technical-design-specification-template\/","title":{"rendered":"Technical Design Specification (TDS): How to Write One, With a Template"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><strong>Quick answer:<\/strong> A <a href=\"https:\/\/writegenic.ai\/content\/technical-design-specification\/\">technical design specification<\/a> says how a system will be built. It comes after the functional spec, which says what the system does. The TDS is where the data models, APIs, architecture decisions, and error handling live \u2014 the detail engineers build from and nobody else needs to read.<\/p>\n\n\n\n<div class=\"wp-block-rank-math-toc-block\" id=\"rank-math-toc\"><h2>Table of Contents<\/h2><nav><ol><li><a href=\"#what-is-a-technical-design-specification\">What Is a Technical Design Specification?<\/a><\/li><li><a href=\"#design-specification-vs-technical-specification\">Design Specification vs Technical Specification<\/a><\/li><li><a href=\"#where-does-the-tds-sit-urs-\u2192-fds-\u2192-tds\">Where Does the TDS Sit? URS \u2192 FDS \u2192 TDS<\/a><\/li><li><a href=\"#what-belongs-in-a-tds-and-what-doesnt\">What Belongs in a TDS, and What Doesn&#8217;t?<\/a><\/li><li><a href=\"#what-are-the-12-sections-of-a-technical-design-specification\">What Are the 12 Sections of a Technical Design Specification?<\/a><\/li><li><a href=\"#technical-design-specification-template\">Technical Design Specification Template<\/a><\/li><li><a href=\"#technical-design-specification-example\">Technical Design Specification Example<\/a><\/li><li><a href=\"#how-does-an-engineering-tds-differ\">How Does an Engineering TDS Differ?<\/a><\/li><li><a href=\"#tds-vs-adr-vs-rfc\">TDS vs ADR vs RFC<\/a><\/li><li><a href=\"#how-does-a-tds-trace-back-to-the-fds\">How Does a TDS Trace Back to the FDS?<\/a><\/li><li><a href=\"#who-should-review-and-sign-off-a-tds\">Who Should Review and Sign Off a TDS?<\/a><\/li><li><a href=\"#where-can-i-find-free-templates-for-technical-design-specifications\">Where Can I Find Free Templates for Technical Design Specifications?<\/a><\/li><li><a href=\"#what-are-the-best-software-tools-for-creating-technical-design-specifications\">What Are the Best Software Tools for Creating Technical Design Specifications?<\/a><\/li><li><a href=\"#which-mistakes-ruin-a-tds\">Which Mistakes Ruin a TDS?<\/a><\/li><li><a href=\"#tds-checklist\">TDS Checklist<\/a><\/li><li><a href=\"#how-writegenic-ai-fits-in\">How Writegenic AI Fits In<\/a><\/li><li><a href=\"#frequently-asked-questions\">Frequently Asked Questions About Technical Design Specification Template<\/a><\/li><\/ol><\/nav><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>One thing worth saying up front:<\/strong> a lot of articles about technical specifications contain no technical content at all. The examples below are actual schemas, endpoints, and decisions \u2014 because a guide to writing technical documents should show you technical documents.<\/p>\n\n\n\n<h2 id=\"what-is-a-technical-design-specification\" class=\"wp-block-heading\">What Is a Technical Design Specification?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>A technical design specification is the document that describes how a system will be built.<\/strong> It turns agreed behaviour into build detail: data structures, interfaces, components, algorithms, error handling, and the decisions behind each.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It has one reader \u2014 the people building it. A TDS is not written for the customer, the product owner, or the board. That&#8217;s what makes it different from almost every other project document.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>The TDS answers<\/th><th>It does not answer<\/th><\/tr><\/thead><tbody><tr><td>What are the data structures?<\/td><td>What does the business need?<\/td><\/tr><tr><td>What are the interfaces and contracts?<\/td><td>What does the system do for a user?<\/td><\/tr><tr><td>How are components arranged?<\/td><td>Is this the right feature to build?<\/td><\/tr><tr><td>What happens when things fail?<\/td><td>When will it be delivered?<\/td><\/tr><tr><td>Why was this approach chosen over alternatives?<\/td><td>How much does it cost?<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>The test for whether something belongs in a TDS:<\/strong> would an engineer need it to build the thing correctly? If yes, it belongs. If it&#8217;s there so a stakeholder feels informed, it belongs somewhere else.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You&#8217;ll see the same document called a <strong>technical design document (TDD)<\/strong>, a <strong><a href=\"https:\/\/plcprogramming.io\/glossary\/detailed-design-specification\" target=\"_blank\" rel=\"noopener\">detailed design specification<\/a> (DDS)<\/strong>, a <strong>software design document (SDD)<\/strong>, or just a <strong>design doc<\/strong>. The names vary by industry and house style. The job doesn&#8217;t.<\/p>\n\n\n\n<h2 id=\"design-specification-vs-technical-specification\" class=\"wp-block-heading\">Design Specification vs Technical Specification<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This confuses people constantly, and the honest answer is that it&#8217;s mostly a naming problem, not a real difference.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>In most organisations, &#8220;design specification&#8221; and &#8220;technical specification&#8221; describe the same document.<\/strong> Both mean the detailed how-it-works document that engineers build from.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Where a genuine distinction exists, it usually runs like this:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Term<\/th><th>Typical scope<\/th><\/tr><\/thead><tbody><tr><td><strong>Functional specification<\/strong><\/td><td>What the system does \u2014 behaviour, in plain language<\/td><\/tr><tr><td><strong>Design specification<\/strong><\/td><td>How it&#8217;s structured \u2014 components, interfaces, data<\/td><\/tr><tr><td><strong>Technical specification<\/strong><\/td><td>Often used interchangeably with design specification; sometimes narrower, covering platform, versions, and environment<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>The practical advice:<\/strong> don&#8217;t spend time arguing about which is which. Decide what your organisation calls it, write it down in your documentation standard, and be consistent. Trouble starts when two teams use the same word for different documents, not from picking the &#8220;wrong&#8221; name.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What does matter is the split between functional and technical.<\/strong> The functional document says the valve closes, or the alert sends. The technical document says which service closes it, over which interface, and what happens if it fails. Keep those in separate documents, because different people read them, at different times.<\/p>\n\n\n\n<h2 id=\"where-does-the-tds-sit-urs-\u2192-fds-\u2192-tds\" class=\"wp-block-heading\">Where Does the TDS Sit? URS \u2192 FDS \u2192 TDS<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A TDS makes sense only in relation to the documents around it.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Document<\/th><th>Question<\/th><th>Written by<\/th><th>Read by<\/th><\/tr><\/thead><tbody><tr><td><strong>URS<\/strong> \u2014 User Requirements Specification<\/td><td>What do I need?<\/td><td>Customer or end user<\/td><td>Everyone<\/td><\/tr><tr><td><strong>FDS<\/strong> \u2014 Functional Design Specification<\/td><td>What will the system do?<\/td><td>Supplier or product team<\/td><td>Customer, engineers, QA<\/td><\/tr><tr><td><strong>TDS<\/strong> \u2014 Technical Design Specification<\/td><td>How will it be built?<\/td><td>Engineering team<\/td><td>Engineers<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>One requirement, traced through all three:<\/strong><\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>URS-014:<\/strong> &#8220;Users should be told when new results match a search they care about.&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>FR-032 (FDS):<\/strong> &#8220;A user may save a search. When new results match a saved search, the system shall send that user an email within 30 minutes. A user may save up to 20 searches.&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>TDS:<\/strong> &#8220;Saved searches are stored in <code>saved_search<\/code>. A scheduled worker runs every 10 minutes, executes each active search against the index, and compares result IDs against <code>last_seen_ids<\/code>. New IDs enqueue an <code>AlertEmail<\/code> job on the notification queue. The 20-search limit is enforced by a database constraint and validated at the API layer.&#8221;<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Same requirement, three levels. <strong>The customer signs the FDS. Engineers build from the TDS.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Our guide to the <a href=\"https:\/\/writegenic.ai\/content\/functional-design-specification\/\">functional design specification<\/a> covers the middle document in detail, including how it drives testing.<\/p>\n\n\n\n<h2 id=\"what-belongs-in-a-tds-and-what-doesnt\" class=\"wp-block-heading\">What Belongs in a TDS, and What Doesn&#8217;t?<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Belongs in the TDS<\/th><th>Belongs elsewhere<\/th><\/tr><\/thead><tbody><tr><td>Data models, schemas, field types<\/td><td>Business justification \u2192 business case<\/td><\/tr><tr><td>API contracts and interface definitions<\/td><td>User-facing behaviour \u2192 FDS<\/td><\/tr><tr><td>Component and service boundaries<\/td><td>Dates and milestones \u2192 project schedule<\/td><\/tr><tr><td>Algorithms and processing logic<\/td><td>Cost estimates \u2192 budget<\/td><\/tr><tr><td>Error handling and failure modes<\/td><td>Test cases \u2192 test plan<\/td><\/tr><tr><td>Architecture decisions and rejected alternatives<\/td><td>Marketing positioning \u2192 anywhere else<\/td><\/tr><tr><td>Security, authentication, authorisation<\/td><td>Training materials \u2192 user documentation<\/td><\/tr><tr><td>Performance targets and limits<\/td><td><\/td><\/tr><tr><td>Migration and rollback plans<\/td><td><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>The most common padding is project management content.<\/strong> Timelines, budgets, and stakeholder lists creep into technical specs because someone wants a single document. They make the TDS longer, go stale faster, and less likely to be read by the only people who need it.<\/p>\n\n\n\n<h2 id=\"what-are-the-12-sections-of-a-technical-design-specification\" class=\"wp-block-heading\">What Are the 12 Sections of a Technical Design Specification?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>1. Document control.<\/strong> Version, author, reviewers, approval date, revision history.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>2. Overview.<\/strong> What&#8217;s being built, in three or four sentences. A new engineer should get their bearings here.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>3. Scope and non-goals.<\/strong> What this design covers, and explicitly what it doesn&#8217;t. <strong>Non-goals are the most valuable line in most design docs<\/strong> \u2014 they stop the review turning into a debate about a different problem.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>4. Background and context.<\/strong> What exists today, what&#8217;s changing, and why. Links to the FDS or requirements this answers.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>5. Architecture.<\/strong> Components, services, and how they relate. A diagram plus a short narrative.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>6. Data design.<\/strong> Schemas, field types, constraints, indexes, retention. This is usually the section engineers read first.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>7. Interfaces and APIs.<\/strong> Endpoints, request and response shapes, status codes, versioning, rate limits.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>8. Processing logic.<\/strong> The algorithms, sequences, and state transitions that aren&#8217;t obvious from the schema.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>9. Error handling and failure modes.<\/strong> What fails, what happens, what the user sees, what gets logged.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>10. Security and access control.<\/strong> Authentication, authorisation, data classification, encryption, audit.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>11. Performance and scale.<\/strong> Expected load, targets, limits, and what happens at the edges.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>12. Decisions and alternatives considered.<\/strong> What you chose, what you rejected, and why. <strong>This is the section future engineers will thank you for<\/strong> \u2014 it stops people re-opening a decision three years later with none of the context.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Optional but often useful:<\/strong> migration plan, rollback plan, observability and metrics, open questions.<\/p>\n\n\n\n<h2 id=\"technical-design-specification-template\" class=\"wp-block-heading\">Technical Design Specification Template<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Copy this. Nothing gated.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>TECHNICAL DESIGN SPECIFICATION\nTitle:              ________________\nDocument ID:        ________  Version: ____\nAuthor:             ________  Date: ________\nReviewers:          ________________\nApproved by:        ________  Date: ________\nRelated documents:  FDS ref ________  URS ref ________\n\nREVISION HISTORY\nVer | Date | Author | Change\n\n1. OVERVIEW\n   &#91;3\u20134 sentences: what this builds and why]\n\n2. SCOPE\n2.1 In scope\n2.2 Non-goals\n2.3 Assumptions and constraints\n\n3. BACKGROUND\n3.1 Current state\n3.2 What is changing\n3.3 Requirements this answers (FDS references)\n\n4. ARCHITECTURE\n4.1 Component diagram\n4.2 Component responsibilities\n    Component | Responsibility | Owner\n4.3 External dependencies\n    Dependency | Purpose | Failure impact\n\n5. DATA DESIGN\n5.1 Schema\n    Table\/entity | Field | Type | Null? | Constraint | Notes\n5.2 Indexes\n5.3 Data retention and deletion\n5.4 Migration approach\n\n6. INTERFACES AND APIs\n   For each endpoint:\n   Method | Path | Auth | Request | Response | Status codes | Rate limit\n\n7. PROCESSING LOGIC\n7.1 &#91;Process name]\n    Trigger:\n    Steps:\n    Outputs:\n    Idempotency:\n\n8. ERROR HANDLING\n   Condition | Detection | System behaviour | User-visible result | Logged as\n\n9. SECURITY\n9.1 Authentication\n9.2 Authorisation model\n9.3 Data classification\n9.4 Encryption in transit and at rest\n9.5 Audit requirements\n\n10. PERFORMANCE AND SCALE\n    Metric | Expected | Target | Limit | Behaviour at limit\n\n11. OBSERVABILITY\n11.1 Metrics\n11.2 Logs\n11.3 Alerts\n\n12. DECISIONS AND ALTERNATIVES\n    Decision:\n    Options considered:\n    Chosen:\n    Rationale:\n    Trade-offs accepted:\n\nAPPENDIX \u2014 OPEN QUESTIONS\n    Question | Owner | Needed by\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Two notes.<\/strong> Fill section 12 as you go, not at the end \u2014 the reasoning is fresh while you decide and gone a week later. And write section 3&#8217;s non-goals early; they shape every review conversation that follows.<\/p>\n\n\n\n<h2 id=\"technical-design-specification-example\" class=\"wp-block-heading\">Technical Design Specification Example<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Here is the saved-search alerts feature from earlier, written out. <strong>Real artifacts, not descriptions of artifacts.<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Overview<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Users can save a search and receive an email when new results match it. Saved searches are evaluated by a scheduled worker; matches enqueue an email job. This answers FR-032 in the FDS.<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">Scope and non-goals<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>In scope:<\/strong> saving, listing and deleting searches; scheduled evaluation; email alerts.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Non-goals:<\/strong> in-app notifications, SMS, push, real-time alerts under 10 minutes, shared or team-level saved searches. These may follow; they are not in this design.<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">Data design<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Table: <code>saved_search<\/code><\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Field<\/th><th>Type<\/th><th>Null<\/th><th>Constraint<\/th><th>Notes<\/th><\/tr><\/thead><tbody><tr><td><code>id<\/code><\/td><td>uuid<\/td><td>no<\/td><td>PK<\/td><td><\/td><\/tr><tr><td><code>user_id<\/code><\/td><td>uuid<\/td><td>no<\/td><td>FK \u2192 <code>users.id<\/code>, indexed<\/td><td><\/td><\/tr><tr><td><code>name<\/code><\/td><td>varchar(100)<\/td><td>no<\/td><td><\/td><td>User-supplied label<\/td><\/tr><tr><td><code>query<\/code><\/td><td>jsonb<\/td><td>no<\/td><td><\/td><td>Serialised filter object<\/td><\/tr><tr><td><code>is_active<\/code><\/td><td>boolean<\/td><td>no<\/td><td>default true<\/td><td>Paused searches skip evaluation<\/td><\/tr><tr><td><code>last_run_at<\/code><\/td><td>timestamptz<\/td><td>yes<\/td><td><\/td><td>Null until first run<\/td><\/tr><tr><td><code>last_seen_ids<\/code><\/td><td>uuid[]<\/td><td>no<\/td><td>default &#8216;{}&#8217;<\/td><td>Result IDs from the previous run<\/td><\/tr><tr><td><code>created_at<\/code><\/td><td>timestamptz<\/td><td>no<\/td><td>default now()<\/td><td><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Constraint:<\/strong> <code>UNIQUE (user_id, name)<\/code> \u2014 prevents duplicate labels. <strong>Constraint:<\/strong> maximum 20 rows per <code>user_id<\/code>, enforced by trigger and validated at the API layer. <strong>Index:<\/strong> <code>(is_active, last_run_at)<\/code> \u2014 the worker&#8217;s selection query.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Retention:<\/strong> rows are deleted on user account deletion via cascade. <code>last_seen_ids<\/code> is capped at the most recent 500 IDs to bound row size.<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">Interfaces<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Method<\/th><th>Path<\/th><th>Auth<\/th><th>Request<\/th><th>Success<\/th><th>Errors<\/th><\/tr><\/thead><tbody><tr><td>POST<\/td><td><code>\/v1\/saved-searches<\/code><\/td><td>Bearer<\/td><td><code>{name, query}<\/code><\/td><td><code>201<\/code> + object<\/td><td><code>400<\/code> invalid query \u00b7 <code>409<\/code> duplicate name \u00b7 <code>422<\/code> limit reached<\/td><\/tr><tr><td>GET<\/td><td><code>\/v1\/saved-searches<\/code><\/td><td>Bearer<\/td><td>\u2014<\/td><td><code>200<\/code> + array<\/td><td>\u2014<\/td><\/tr><tr><td>PATCH<\/td><td><code>\/v1\/saved-searches\/{id}<\/code><\/td><td>Bearer<\/td><td><code>{name?, is_active?}<\/code><\/td><td><code>200<\/code> + object<\/td><td><code>404<\/code> \u00b7 <code>409<\/code> duplicate name<\/td><\/tr><tr><td>DELETE<\/td><td><code>\/v1\/saved-searches\/{id}<\/code><\/td><td>Bearer<\/td><td>\u2014<\/td><td><code>204<\/code><\/td><td><code>404<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Rate limit:<\/strong> 60 requests per minute per user across all four endpoints. <strong>Versioning:<\/strong> breaking changes ship as <code>\/v2<\/code>. <code>\/v1<\/code> is supported for 12 months after <code>\/v2<\/code> release.<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">Processing logic<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Saved search evaluation<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Trigger:<\/strong> scheduled every 10 minutes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Steps:<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Select active searches where <code>last_run_at<\/code> is null or older than 10 minutes, ordered by <code>last_run_at<\/code>, limit 500 per run.<\/li>\n\n\n\n<li>For each: execute <code>query<\/code> against the search index, capped at 100 results.<\/li>\n\n\n\n<li>Compute new IDs as result IDs not present in <code>last_seen_ids<\/code>.<\/li>\n\n\n\n<li>If new IDs exist, enqueue one <code>AlertEmail<\/code> job carrying the search ID and the new IDs.<\/li>\n\n\n\n<li>Update <code>last_seen_ids<\/code> (capped at 500) and set <code>last_run_at<\/code>.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Idempotency:<\/strong> steps 3\u20135 run in one transaction. A worker crash before commit means the run repeats; because <code>last_seen_ids<\/code> is unchanged, no duplicate alert is sent.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Output:<\/strong> zero or one email job per saved search per run.<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">Error handling<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Condition<\/th><th>Detection<\/th><th>System behaviour<\/th><th>User sees<\/th><th>Logged as<\/th><\/tr><\/thead><tbody><tr><td>Search index unavailable<\/td><td>Query timeout &gt;5s<\/td><td>Skip this search, retry next cycle<\/td><td>Nothing<\/td><td><code>WARN search_index_timeout<\/code><\/td><\/tr><tr><td>Malformed stored query<\/td><td>Parse failure<\/td><td>Set <code>is_active = false<\/code>, notify user once<\/td><td>&#8220;A saved search was paused&#8221; email<\/td><td><code>ERROR saved_search_invalid<\/code><\/td><\/tr><tr><td>Email provider rejects<\/td><td>Non-2xx from provider<\/td><td>Retry 3\u00d7 with backoff, then drop<\/td><td>Nothing<\/td><td><code>ERROR alert_email_failed<\/code><\/td><\/tr><tr><td>User over 20 searches<\/td><td>API validation<\/td><td>Reject with <code>422<\/code><\/td><td>&#8220;You&#8217;ve reached 20 saved searches&#8221;<\/td><td><code>INFO saved_search_limit<\/code><\/td><\/tr><tr><td>Worker run exceeds 10 min<\/td><td>Run duration metric<\/td><td>Next run skipped; alert on-call<\/td><td>Delayed alerts<\/td><td><code>ERROR worker_overrun<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">Decision record<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Decision:<\/strong> scheduled polling rather than event-driven evaluation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Options considered:<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Poll on a schedule<\/li>\n\n\n\n<li>Evaluate every saved search on each content-publish event<\/li>\n\n\n\n<li>Maintain a reverse index of queries and match at write time<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Chosen:<\/strong> option 1.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Rationale:<\/strong> the FDS commits to 30 minutes, so a 10-minute cycle has comfortable headroom. Option 2 scales with publish volume \u00d7 saved searches and would run roughly 40,000 evaluations per hour at current volumes. Option 3 is the right long-term answer but needs a query-matching engine we don&#8217;t have.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Trade-offs accepted:<\/strong> alerts are not real-time. If saved searches exceed roughly 50,000, the 10-minute cycle will need re-examining \u2014 this is noted as a scaling trigger in section 10.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Notice what makes this a technical specification:<\/strong> field types, constraints, status codes, retry counts, timeouts, transaction boundaries, and a rejected-alternatives record with the arithmetic behind it. Not a description of what a technical specification would contain.<\/p>\n\n\n\n<h2 id=\"how-does-an-engineering-tds-differ\" class=\"wp-block-heading\">How Does an Engineering TDS Differ?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The structure above is software-shaped. In controls, process, and equipment engineering, a TDS covers the same idea with different content.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Section<\/th><th>Software TDS<\/th><th>Engineering TDS<\/th><\/tr><\/thead><tbody><tr><td>Architecture<\/td><td>Services and components<\/td><td>Panel layout, network topology, system architecture drawing<\/td><\/tr><tr><td>Data design<\/td><td>Database schema<\/td><td>I\/O list, tag database, tag naming convention<\/td><\/tr><tr><td>Interfaces<\/td><td>API contracts<\/td><td>Protocol, addressing, register maps, comms specification<\/td><\/tr><tr><td>Processing logic<\/td><td>Algorithms, sequences<\/td><td>Control narratives, PID loop configuration, sequence logic<\/td><\/tr><tr><td>Error handling<\/td><td>Exception handling, retries<\/td><td>Failure modes, fail-safe positions, redundancy scheme<\/td><\/tr><tr><td>Performance<\/td><td>Latency, throughput<\/td><td>Scan rate, loop response time, redundancy switchover time<\/td><\/tr><tr><td>Decisions<\/td><td>ADRs<\/td><td>Hardware selection rationale, protocol choice<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>The common structure holds.<\/strong> Overview, scope, architecture, data, interfaces, logic, failure, performance, decisions. Only the content type changes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>In regulated manufacturing<\/strong>, the TDS is a formal deliverable and pairs with <strong>Installation Qualification (IQ)<\/strong> on the V-model \u2014 IQ proves the system was built and installed as the design specification says. That makes traceability from FDS to TDS to IQ a compliance requirement, not just good practice.<\/p>\n\n\n\n<h2 id=\"tds-vs-adr-vs-rfc\" class=\"wp-block-heading\">TDS vs ADR vs RFC<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Modern software teams increasingly use lighter formats. They&#8217;re not replacements so much as different tools.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Format<\/th><th>Scope<\/th><th>Length<\/th><th>Lifespan<\/th><\/tr><\/thead><tbody><tr><td><strong>TDS \/ design doc<\/strong><\/td><td>One feature or system, fully specified<\/td><td>5\u201330 pages<\/td><td>Maintained alongside the system<\/td><\/tr><tr><td><strong>ADR<\/strong> \u2014 Architecture Decision Record<\/td><td><strong>One decision<\/strong>, with context and consequences<\/td><td>1 page<\/td><td>Immutable \u2014 superseded, never edited<\/td><\/tr><tr><td><strong>RFC<\/strong> \u2014 Request for Comments<\/td><td>A proposal circulated for feedback before commitment<\/td><td>2\u201310 pages<\/td><td>Becomes a decision, then archived<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>How they fit together in practice:<\/strong> an RFC proposes an approach and gathers dissent. Once agreed, a TDS specifies the build. Significant choices inside it get their own ADRs so the reasoning survives independently of the document.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Which to use:<\/strong> a one-page ADR for a single reversible decision. An RFC when you need buy-in before designing. A full TDS when the thing is large enough that several people build from it, or when a regulator or client requires one.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>The mistake is using a TDS for everything.<\/strong> A 20-page design doc for a two-day change is how documentation gets a bad name \u2014 and how teams stop writing it at all.<\/p>\n\n\n\n<h2 id=\"how-does-a-tds-trace-back-to-the-fds\" class=\"wp-block-heading\">How Does a TDS Trace Back to the FDS?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Every TDS section should trace to something someone asked for.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>FDS ref<\/th><th>Functional requirement<\/th><th>TDS section<\/th><th>Verified by<\/th><\/tr><\/thead><tbody><tr><td>FR-032<\/td><td>Email within 30 minutes of a match<\/td><td>\u00a77.1, \u00a75.1<\/td><td>IQ-008<\/td><\/tr><tr><td>FR-033<\/td><td>Maximum 20 saved searches per user<\/td><td>\u00a75.1 constraint, \u00a76 <code>422<\/code><\/td><td>IQ-009<\/td><\/tr><tr><td>FR-034<\/td><td>User can pause a saved search<\/td><td>\u00a76 PATCH, \u00a75.1 <code>is_active<\/code><\/td><td>IQ-010<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Two jobs, same as on the functional side.<\/strong> It proves nothing was missed \u2014 every functional requirement has a design answer. And it proves nothing was invented \u2014 a TDS section with no FDS reference is either scope you&#8217;re building unasked, or a genuine gap in the FDS that needs raising.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>That second case is common and worth naming.<\/strong> Writing a TDS routinely exposes questions the functional spec never answered. Don&#8217;t quietly decide them in the technical document \u2014 send them back, get the FDS updated, then reference it.<\/p>\n\n\n\n<h2 id=\"who-should-review-and-sign-off-a-tds\" class=\"wp-block-heading\">Who Should Review and Sign Off a TDS?<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Reviewer<\/th><th>Checking<\/th><\/tr><\/thead><tbody><tr><td><strong>Engineers who will build it<\/strong><\/td><td>Is this buildable, and is anything missing?<\/td><\/tr><tr><td><strong>A senior engineer outside the team<\/strong><\/td><td>Is the approach sound? Were alternatives considered honestly?<\/td><\/tr><tr><td><strong>Security<\/strong><\/td><td>Auth, data handling, exposure<\/td><\/tr><tr><td><strong>Operations \/ SRE<\/strong><\/td><td>Can this be run, monitored, and recovered?<\/td><\/tr><tr><td><strong>QA<\/strong><\/td><td>Can this be tested as written?<\/td><\/tr><tr><td><strong>Architect or tech lead<\/strong><\/td><td>Does it fit the wider system?<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Three things that make reviews useful:<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ask a specific question.<\/strong> &#8220;Please review&#8221; gets skimmed. &#8220;Does the idempotency argument in 7.1 hold if the worker is killed mid-transaction?&#8221; gets read.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Review the decisions section hardest.<\/strong> If the rejected alternatives look like straw men, the decision probably wasn&#8217;t examined properly.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Freeze it, then version it.<\/strong> Post-approval changes get a revision number. A design doc that drifts silently is worse than none \u2014 people build from different versions believing they agree.<\/p>\n\n\n\n<h2 id=\"where-can-i-find-free-templates-for-technical-design-specifications\" class=\"wp-block-heading\">Where Can I Find Free Templates for Technical Design Specifications?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Four sources, in order of usefulness.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>1. The template above.<\/strong> Complete, free, and not behind a signup form. The worked example shows what a filled-in version looks like, which matters more than the headings.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>2. Your own past design docs.<\/strong> Almost always the best source, because they already match your stack, your habits, and how your team reviews. Search your repository or wiki for a recent well-reviewed one and copy its shape.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>3. Open-source projects and public RFC repositories.<\/strong> Many large open-source projects publish design documents and RFCs openly. Reading real ones from a project you respect teaches more than any template \u2014 you see how much detail is really enough.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>4. Your organisation&#8217;s documentation standard.<\/strong> If one exists, it wins. Ask before you write anything; rewriting a finished design doc into someone else&#8217;s structure is a day you won&#8217;t get back.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Two cautions about template hunting.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Most free templates are empty headings.<\/strong> They give you a table of contents, not a specification. The hard part isn&#8217;t knowing that a &#8220;data design&#8221; section exists \u2014 it&#8217;s knowing what belongs in it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Watch for templates gated behind a product signup.<\/strong> Several of the most-linked &#8220;technical specification templates&#8221; require an account with a documentation vendor. The structure isn&#8217;t proprietary, and you shouldn&#8217;t have to trade an email for it.<\/p>\n\n\n\n<h2 id=\"what-are-the-best-software-tools-for-creating-technical-design-specifications\" class=\"wp-block-heading\">What Are the Best Software Tools for Creating Technical Design Specifications?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Two separate jobs, and most articles conflate them.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Job<\/th><th>What you need<\/th><\/tr><\/thead><tbody><tr><td><strong>Writing the document<\/strong><\/td><td>A collaborative editor with version history and inline comments<\/td><\/tr><tr><td><strong>Producing the artifacts<\/strong><\/td><td>Diagramming, schema, and API definition tools<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>For writing:<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Tool<\/th><th>Best for<\/th><th>Trade-off<\/th><\/tr><\/thead><tbody><tr><td><strong>Markdown in the repository<\/strong><\/td><td>Keeping the design next to the code it describes<\/td><td>Weak commenting, poor for non-engineer reviewers<\/td><\/tr><tr><td><strong>Confluence \/ Notion<\/strong><\/td><td>Cross-functional review, searchable knowledge base<\/td><td>Drifts from the code; version history less visible<\/td><\/tr><tr><td><strong>Google Docs<\/strong><\/td><td>Fast review cycles, excellent inline commenting<\/td><td>No structure enforcement; hard to find later<\/td><\/tr><tr><td><strong>Document generators<\/strong><\/td><td>Consistent structure across many specs<\/td><td>Still needs the engineering content<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>For the artifacts:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Diagrams:<\/strong> Mermaid or PlantUML are text-based, so they version alongside the document. Excalidraw and Lucidchart for anything hand-drawn.<\/li>\n\n\n\n<li><strong>API contracts:<\/strong> OpenAPI is the standard. Write the spec, generate the documentation.<\/li>\n\n\n\n<li><strong>Schemas:<\/strong> your migration tool is the source of truth \u2014 reference it rather than transcribing, or the two drift apart within a month.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>The recommendation that matters more than the tool:<\/strong> <strong>keep the design document close to what it describes.<\/strong> A design doc in a wiki nobody opens goes wrong within weeks. Markdown in the repository stays closer to the truth because it shows up in code review.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>And for diagrams, prefer text-based formats.<\/strong> A PNG of an architecture diagram cannot be diffed, cannot be updated by the next engineer, and is invisible to search. A Mermaid block is all three.<\/p>\n\n\n\n<h2 id=\"which-mistakes-ruin-a-tds\" class=\"wp-block-heading\">Which Mistakes Ruin a TDS?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>1. Writing it for stakeholders.<\/strong> The audience is engineers. Executive summaries and business justification belong elsewhere.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>2. No non-goals.<\/strong> Without them, every review becomes a debate about a different problem.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>3. Skipping the alternatives.<\/strong> A decision with no rejected options looks unexamined \u2014 and gets re-litigated later without the context.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>4. Describing artifacts instead of showing them.<\/strong> &#8220;The API will expose endpoints for managing saved searches&#8221; is not an interface definition.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>5. Project management content.<\/strong> Timelines, budgets, and stakeholder lists make the document longer and staler.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>6. Writing it after the code.<\/strong> A design doc written just to tick a box is theatre. Write it while decisions are still open.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>7. A 20-page doc for a two-day change.<\/strong> Use an ADR. Over-documenting small work is how teams stop writing docs at all.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>8. Letting it drift after approval.<\/strong> Version it, or people build from documents that no longer agree.<\/p>\n\n\n\n<h2 id=\"tds-checklist\" class=\"wp-block-heading\">TDS Checklist<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>[ ] Document control complete with version and approvers<\/li>\n\n\n\n<li>[ ] Overview readable in under a minute<\/li>\n\n\n\n<li>[ ] <strong>Non-goals stated explicitly<\/strong><\/li>\n\n\n\n<li>[ ] Every section traces to an FDS or requirement reference<\/li>\n\n\n\n<li>[ ] Data design shows actual fields, types, and constraints<\/li>\n\n\n\n<li>[ ] Interfaces show actual paths, payloads, and status codes<\/li>\n\n\n\n<li>[ ] Processing logic covers idempotency and retry behaviour<\/li>\n\n\n\n<li>[ ] Error handling covers detection, behaviour, user impact, and logging<\/li>\n\n\n\n<li>[ ] Security covers auth, authorisation, and data classification<\/li>\n\n\n\n<li>[ ] Performance targets have numbers and a stated behaviour at the limit<\/li>\n\n\n\n<li>[ ] <strong>Alternatives considered are genuine, with trade-offs named<\/strong><\/li>\n\n\n\n<li>[ ] Diagrams are text-based and version with the document<\/li>\n\n\n\n<li>[ ] Reviewed by a senior engineer outside the team<\/li>\n\n\n\n<li>[ ] Reviewed by security and operations<\/li>\n\n\n\n<li>[ ] Open questions listed with owners<\/li>\n\n\n\n<li>[ ] Frozen at approval; changes go through versioning<\/li>\n<\/ul>\n\n\n\n<h2 id=\"how-writegenic-ai-fits-in\" class=\"wp-block-heading\">How Writegenic AI Fits In<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The engineering decisions take a whiteboard session. Turning them into a complete, consistently structured, reviewable document is where the hours go \u2014 and it&#8217;s the part that gets skipped under deadline.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/writegenic.ai\/\">Writegenic AI<\/a> is an AI writing platform with 300+ templates and support for 120+ languages, including a set for technical and project documentation:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><a href=\"https:\/\/writegenic.ai\/content\/ai-generators\/ai-for-project-management\/\">AI for Project Management<\/a><\/strong> \u2014 drafting technical and project documents from structured inputs<\/li>\n\n\n\n<li><strong><a href=\"https:\/\/writegenic.ai\/content\/requirements-management-plan\/\">Requirements management plan<\/a><\/strong> \u2014 the requirements process your design answers to<\/li>\n\n\n\n<li><strong><a href=\"https:\/\/writegenic.ai\/content\/project-management-tools\/\">Project management tools<\/a><\/strong> \u2014 templates for the surrounding deliverables<\/li>\n\n\n\n<li><strong><a href=\"https:\/\/writegenic.ai\/content\/prompt-generator\/\">AI Prompt Generator<\/a><\/strong> \u2014 one reusable prompt encoding your section structure, so every design doc in the team comes out the same shape<\/li>\n\n\n\n<li><strong>120+ languages<\/strong> \u2014 for distributed teams reviewing in their own language<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Where the line sits, clearly.<\/strong> A writing tool produces the structure, keeps ten design docs consistent, and drafts the prose around your artifacts. It cannot choose your data model, judge whether polling beats event-driven for your load, or know that your email provider has a rate limit you discovered the hard way. Those are engineering judgements, and they&#8217;re the content that makes the document worth reading.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Draft the document with the tool. Keep the engineering.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/writegenic.ai\/register\">Start with Writegenic AI free<\/a>.<\/p>\n\n\n\n<h2 id=\"frequently-asked-questions\" class=\"wp-block-heading\">Frequently Asked Questions About Technical Design Specification Template<\/h2>\n\n\n<div id=\"rank-math-faq\" class=\"rank-math-block\">\n<div class=\"rank-math-list \">\n<div id=\"faq-question-1789803203913\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \"><strong>What is a technical design specification document?<\/strong><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>A document describing how a system will be built \u2014 data models, interfaces, components, algorithms, error handling, and the decisions behind them. It is written for engineers, and it comes after the functional specification, which describes what the system does.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1789803207084\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \"><strong>What is the difference between a design specification and a technical specification?<\/strong><\/h3>\n<div class=\"rank-math-answer \">\n\n<p> In most organisations they&#8217;re the same document. Where a distinction is drawn, &#8220;design specification&#8221; tends to cover structure and components while &#8220;technical specification&#8221; covers platform, versions, and environment. The distinction that actually matters is functional versus technical \u2014 what it does versus how it&#8217;s built.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1789803208171\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \"><strong>What is the difference between an FDS and a TDS?<\/strong><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>The FDS says what the system does, in language a customer can review and sign. The TDS says how it&#8217;s built, in detail only engineers need. The FDS is the question; the TDS is the answer.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1789803209523\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \"><strong>What should a technical design specification include?<\/strong><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Twelve sections: document control, overview, scope and non-goals, background, architecture, data design, interfaces, processing logic, error handling, security, performance, and decisions with alternatives considered.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1789803210840\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \"><strong>Who writes the technical design specification?<\/strong><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>The engineering team building the system \u2014 usually a senior engineer or tech lead, with input from whoever will implement it. It&#8217;s reviewed by engineers, a senior reviewer outside the team, security, operations, and QA.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1789803212164\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \"><strong>How long should a technical design specification be?<\/strong><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>As long as the work requires and no longer. A moderate feature runs 5 to 15 pages; a platform component can run to 30. For a change small enough that one person builds it in days, use a one-page architecture decision record instead.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1789803213482\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \"><strong>What is the difference between a TDS and an ADR?<\/strong><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>A TDS specifies an entire feature or system. An ADR captures one decision with its context and consequences, in about a page, and is never edited \u2014 it&#8217;s superseded instead. Large designs often contain several ADRs.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1789803453591\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \"><strong>Do agile teams write technical design specifications?<\/strong><\/h3>\n<div class=\"rank-math-answer \">\n\n<p> Many do, in lighter form \u2014 a short design doc or RFC circulated before a substantial piece of work. The trigger is usually size and reversibility rather than methodology: if several people will build from it, or the decision is expensive to undo, write it down.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1789803454719\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \"><strong>Where can I find free templates for technical design specifications?<\/strong><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>The template in this article is complete and ungated. Beyond that, your own past design docs are usually the best source, and public open-source RFC repositories show real examples at realistic detail. Be wary of templates gated behind a documentation vendor&#8217;s signup \u2014 the structure isn&#8217;t proprietary.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1789803558957\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \"><strong>What tools are best for writing technical design specifications?<\/strong><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Markdown in the repository keeps the design closest to the code. Confluence or Notion suit cross-functional review. Google Docs has the best commenting for fast review cycles. For artifacts, use Mermaid or PlantUML for diagrams and OpenAPI for interface definitions \u2014 all text-based, so they version with the document.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1789803560142\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \"><strong>How does a TDS relate to testing?<\/strong><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>On the V-model, the technical design specification pairs with Installation Qualification \u2014 IQ proves the system was built and installed as the design says. In regulated industries, traceability from FDS to TDS to IQ is a compliance requirement.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1789803561168\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \"><strong>Should the TDS include timelines and budgets?<\/strong><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>No. Schedule and cost belong in the project plan. Keeping them out makes the design document shorter, slower to go stale, and more likely to be read by the engineers who need it.<\/p>\n\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\"><strong>Related reading:<\/strong> <a href=\"https:\/\/writegenic.ai\/content\/functional-design-specification\/\">Functional Design Specification<\/a> \u00b7 <a href=\"https:\/\/writegenic.ai\/content\/requirements-management-plan\/\">Requirements Management Plan<\/a> \u00b7 <a href=\"https:\/\/writegenic.ai\/content\/project-planning-and-scheduling-manual\/\">Project Planning and Scheduling<\/a> \u00b7 <a href=\"https:\/\/writegenic.ai\/content\/risk-assessment-plan-template\/\">Risk Assessment Plan Template<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>A technical design specification says how a system gets built. Get the full TDS template, 12 sections, and a worked example with real schemas and API contracts.<\/p>\n","protected":false},"author":4,"featured_media":33650,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[97],"tags":[],"class_list":["post-33557","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-project-management-guide"],"authors":[],"_links":{"self":[{"href":"https:\/\/writegenic.ai\/content\/wp-json\/wp\/v2\/posts\/33557","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/writegenic.ai\/content\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/writegenic.ai\/content\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/writegenic.ai\/content\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/writegenic.ai\/content\/wp-json\/wp\/v2\/comments?post=33557"}],"version-history":[{"count":1,"href":"https:\/\/writegenic.ai\/content\/wp-json\/wp\/v2\/posts\/33557\/revisions"}],"predecessor-version":[{"id":33651,"href":"https:\/\/writegenic.ai\/content\/wp-json\/wp\/v2\/posts\/33557\/revisions\/33651"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/writegenic.ai\/content\/wp-json\/wp\/v2\/media\/33650"}],"wp:attachment":[{"href":"https:\/\/writegenic.ai\/content\/wp-json\/wp\/v2\/media?parent=33557"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/writegenic.ai\/content\/wp-json\/wp\/v2\/categories?post=33557"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/writegenic.ai\/content\/wp-json\/wp\/v2\/tags?post=33557"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}<!-- This website is optimized by Airlift. Learn more: https://airlift.net. Template:, Cached Timestamp: 2026-09-22 22:01:33 UTC -->