12 March 2026 / Product specification

Build the searchable specification before the application gets expensive

When requirements are scattered across PDFs, email and meeting notes, implementation starts by repeatedly rediscovering the product. Consolidate the source material into a searchable specification and keep each decision linked to the evidence behind it.

A designer drawing a building by hand at a desk.
Photo: Ryan Ancill (opens in a new tab)

When requirements are scattered across PDFs, email and meeting notes, implementation starts by repeatedly rediscovering the product. Consolidate the source material into a searchable specification and keep each decision linked to the evidence behind it. This does not mean rewriting every document into one enormous requirements file. The useful artefact is an index of what the product is meant to do, how the parts relate and where each statement came from. It should let a developer, reviewer or agent answer a narrow question without reopening the full project archive. Collect the material that currently carries product decisions: signed or approved documents, change requests, diagrams, meeting records, data definitions and integration notes. Record the source title, date, owner, status and location before extracting requirements. Status matters. A draft proposal and an approved change can contain opposite instructions. Search systems will retrieve both if they are treated as equivalent. Mark superseded material and link it to the decision that replaced it rather than deleting it from history. Do not treat email volume as authority. A recent message may clarify one edge case without replacing an agreed rule. Define a simple order of precedence for the project and note exceptions where another source controls, such as an external API contract or legislation.

The inventory also exposes missing material. If everyone refers to "the import rules" but no source defines them, record the gap. Inventing a clean requirement would make the specification look complete while moving uncertainty into the build. A searchable paragraph can still be too vague to implement. Turn each material requirement into a statement with a subject, condition and expected behaviour. Instead of "managers can handle approvals", describe which manager role may approve which record, in which states, and what changes after approval. Keep display wording separate from the business rule. The copy may change while the transition and permission remain stable. Give every requirement a stable identifier. Attach its source references, current status, affected roles, data and interfaces. Add acceptance examples where the rule has important boundaries. Examples should clarify the requirement without quietly adding new obligations. Record unknowns as questions with owners. A question such as "Can a rejected submission be reopened by support?" is useful project state. A guessed answer embedded in a ticket is not. A compact requirement might contain:

  • identifier and plain-language statement;
  • source links and relevant excerpts;
  • roles and systems affected;
  • acceptance examples and known exceptions;
  • decision status, owner and review date;
  • relationships to other requirements.

That structure is enough for search and review without forcing every reader through a formal template. Projects rarely fail because no decision was made. More often, a decision is made in a meeting and never reaches the places that rely on it. Use a short decision record when the team resolves an ambiguity or changes an existing rule. Capture the question, options considered where relevant, decision, date, owner and affected requirement identifiers. Link back to the evidence that prompted it. Then update the current requirement rather than expecting implementers to reconcile a chain of comments. Preserve the previous version so later reviewers can understand why existing code behaves differently. This is particularly important for permissions, calculations and external integrations. A small wording change can alter who may act, how a result is produced or what another system receives. Search should return the current rule first and make history available deliberately. Avoid a separate decision log that has no connection to implementation. The value comes from being able to move from a screen, API or test to the requirement and then to the decision and source. Keyword search is a good starting point. Add semantic search if people ask the same question with different vocabulary, but keep filters for status, role, component, date and source authority.

Results should show the requirement, its current status and source links. If an AI assistant summarises several records, require citations for each material claim and show conflicting sources rather than smoothing them together. Chunking needs care. A paragraph about an exception can become misleading when separated from the rule it limits. Store enough hierarchy and identifiers to reconstruct the surrounding section. For tables or diagrams, extract the meaning into maintained text and link to the original artefact. Test search with questions taken from real implementation work, safely stripped of private details. Ask which role can perform an action, what field is sent to an integration, how a score is calculated and what happens after a failed transition. Check whether the first results lead to the current evidence. A system that retrieves many related documents but leaves the reader to determine which one controls has improved discovery, not specification. Connect work items to requirement identifiers. A coding task should state which behaviour it implements or changes. Pull requests can link the same identifiers, and acceptance tests can include them in names or metadata. This gives review a practical route. The reviewer compares the change with the current requirement and acceptance examples, then checks whether the implementation has exposed a missing rule. If it has, update the specification or record a question before expanding the code around an assumption.

Agents benefit from the same boundary. Give a coding agent the relevant requirements and sources rather than unrestricted access to the whole document archive. Ask it to report contradictions or missing decisions instead of choosing whichever passage sounds most specific. The specification also helps split work. Two tasks may look independent in a project board but touch the same permission or state transition. Shared requirement links make that overlap visible before parallel implementation begins. Assign owners to product areas, not to every sentence. At agreed points in delivery, review changed requirements, open questions and sources approaching a review date. Integrations and policy-driven rules may need more frequent checks than stable interface behaviour. Add a release check that every completed change points to a requirement, decision or explicit defect. Confirm that changed behaviour has current acceptance examples and that superseded sources no longer appear as the default search result. Start with one workflow that is already expensive to rediscover. Build its evidence inventory, write the current requirements, connect the open decisions and test five questions against search. If a new developer can follow the answers back to authoritative sources, extend the method to the next workflow.

Continue the thinking.

Comments are public and hosted in an open-source GitHub Discussions repository.

Loading comments connects your browser to GitHub. A GitHub account is required to post.

All blogs