PRD: Technical Requirements
Purpose
Capture the technical constraints and non-functional requirements the product must meet, so engineering can design against concrete targets and the product team can make trade-offs explicit before implementation.
This file is not a technical design or architecture document. It is the contract of constraints the design must satisfy.
Shared Operating Model
Use requirements-operating-model before writing when constraints depend on product shape, metrics, existing context, or Blueprint handoff. Keep architecture decisions in Blueprints.
When to Use
- A PRD is approaching engineering planning and lacks non-functional targets
- The team is debating "is this fast enough?" / "is this secure enough?" with no shared bar
- Compliance, accessibility, or platform constraints are implicit and need to be made explicit
Project Identifier
Before writing, determine the projectid:
- If the user has supplied one, use it verbatim.
- Otherwise, ask for it once. The
projectid should be a stable, kebab-case identifier for the product/initiative.
- Confirm the resolved path before writing:
.trogonai/project/{projectid}/prd/technical-requirements.prd.md.
If the file already exists, read it first and ask whether to replace or refine before overwriting.
Read Existing Context
Before discovery, read these files when they exist:
.trogonai/project/{projectid}/prd/product-description.prd.md
.trogonai/project/{projectid}/prd/success-metrics.prd.md
.trogonai/project/{projectid}/prd/personas.prd.md
Use them to ground constraints in user-facing surfaces, measurable goals, and persona contexts. If a technical target becomes an architecture decision, leave the constraint here and identify Blueprints as the owner for the design.
Discovery
Ask through each category. For every requirement, push for a number, a threshold, or a named standard, not adjectives.
- Performance
- Target latency (p50, p95, p99) for the primary user actions
- Throughput / requests per second or per minute
- Cold start, time-to-first-byte, time-to-interactive where relevant
- Scale
- Expected users / tenants / records / events at launch and at 12 months
- Peak vs steady-state ratios
- Growth assumptions and their source
- Reliability & availability
- SLO (e.g., 99.9% over rolling 30 days)
- Acceptable error budget burn
- Recovery objectives: RTO, RPO
- Graceful degradation expectations
- Security
- Authentication method(s)
- Authorization model (roles, scopes, tenancy)
- Data classification of inputs and outputs
- Threat model concerns specific to this product
- Privacy & compliance
- Regulatory regimes that apply (GDPR, HIPAA, SOC 2, PCI, regional data residency)
- PII / PHI / payment data handling
- Retention and deletion requirements
- Audit logging requirements
- Integrations
- Upstream systems consumed (APIs, events, files)
- Downstream systems produced for
- Sync vs async, contract ownership, failure semantics
- Platforms & environments
- Supported browsers / OS / device classes
- Minimum hardware / network assumptions
- Cloud / on-prem / hybrid constraints
- Offline / intermittent connectivity behavior
- Accessibility
- WCAG level (typically AA)
- Keyboard, screen reader, color contrast, motion expectations
- Localization & internationalization
- Languages at launch and in 12 months
- Right-to-left support
- Time zone, currency, date/number formatting
- Observability
- Logs, metrics, traces required from day one
- Dashboards and alerts that must exist before GA
- Cost constraints
- Unit economics targets (cost per user / request / event) if relevant
- Hard ceilings on infrastructure spend
For each category, the acceptable answer is either:
- A concrete requirement with a target, OR
- An explicit "Not a constraint for this product": which is itself useful information
Push back on:
- "Should be fast" → which action, what percentile, what number, on what hardware/network
- "Secure by default" → which standard, what threat
- "Globally available" → which regions, which latency target per region
Quality Bar
The file is complete when:
- Every category has either a concrete target or an explicit "not a constraint"
- Performance numbers are tied to specific user actions, not the system as a whole
- Reliability targets are stated as SLOs with measurement windows
- Compliance regimes are named, not implied
- Each requirement is testable: a reviewer could write a verification for it
Output
Write the complete file to .trogonai/project/{projectid}/prd/technical-requirements.prd.md using the template at assets/technical-requirements-template.md. Read it, substitute {projectid} and the date, and fill in each section from the discovery output. For any category that does not apply, record it under Explicit non-constraints rather than dropping the section.
Writing Guidance
Writing approach
- Number, threshold, or named standard per category. Every line is either a measurable target, a named regulation/standard, or an explicit non-constraint. Adjectives without numbers do not count.
- Per user action, not per system. "p95 < 200ms" only means something when paired with the action it covers. Latency budgets attach to user actions; SLOs attach to journeys.
- Explicit non-constraints are first-class. A category that does not apply is recorded under non-constraints with the reason. Silence is ambiguous; explicit absence is a decision.
- Defend the number. A target is more useful when paired with how it was chosen (benchmark, contract, regulatory minimum, user research). Numbers without provenance get re-negotiated under pressure.
Tone and language
- No adjectives without numbers. "Fast", "scalable", "secure", "globally available" are flags to push back on. Replace with a value, a percentile, and a condition.
- Name the standard. WCAG AA, SOC 2 Type II, PCI DSS v4, GDPR Art. 17: name the regime and the article/level when relevant. "Follows best practices" is not a requirement.
- Percentiles for latency, windows for SLOs. Single-number latency hides the worst experience; an SLO without a measurement window is not enforceable.
Scope
- Contract of constraints, not design. This file says what must be true, not how to satisfy it. Architecture, framework choice, and infrastructure topology belong in engineering design docs.
- Non-functional and platform. Performance, scale, reliability, security, privacy, integrations, platforms, accessibility, localization, observability, cost. Functional behavior belongs in FRDs.
- No invention. If a target is unknown, mark it as open with an owner and date: do not fabricate a number that will be treated as committed.
Good vs Bad Example
Good
## Performance
| User action | Metric | Target | Conditions |
|-------------|--------|--------|------------|
| Open Coaching Inbox | p95 latency | < 800 ms | desktop Chrome, fiber; US-East region |
| Save call note | p95 latency | < 1.5 s | mobile web, LTE; user already authenticated |
## Reliability & availability
- SLO: 99.9% availability for Save Call Note, measured over rolling 30 days.
- Error budget: 43.2 min / 30 days; freeze deploys on > 50% burn.
- RTO 30 min, RPO 5 min for Salesforce Bridge.
## Security
- Authentication: SSO via Okta OIDC; session 12h, refresh 30 days.
- Authorization: role-based: AE (own deals), Manager (team deals), Admin (org).
- Data classification: notes are Restricted (may contain customer PII).
## Privacy & compliance
- Regimes: SOC 2 Type II (annual), GDPR for EU tenants, CCPA for California users.
- Retention: call notes retained 7 years to match Salesforce; deletion request honored within 30 days per GDPR Art. 17.
## Explicit non-constraints
- Localization: English only at launch; not a constraint until EU expansion (Q3 2026).
- Offline behavior: not supported in v1; AE is online by job definition.
Bad
## Performance
- Should be fast.
## Reliability & availability
- Should be highly available.
## Security
- Should follow best practices.
## Privacy & compliance
- Should be compliant.
## Localization
- Should support multiple languages.
The bad version is unfalsifiable: engineering cannot design against any of it, and the team has no shared bar to evaluate the result. Every line is an adjective that means whatever the reader wants.
Anti-Patterns to Reject
- Adjectives without numbers ("fast", "scalable", "secure").
- One latency number for the whole system rather than per user action.
- SLOs without a measurement window.
- "Follows best practices" instead of naming the standard.
- Silently skipping a category: if it doesn't apply, say so explicitly.
Allowed Tools
- AskUserQuestion: drive discovery and resolve
projectid
- Read: load the existing file if it exists, to decide replace vs refine
- Write: write the file
1---2name: prd-technical-requirements3description: Draft the Technical Requirements of a PRD by capturing the technical constraints and requirements the product must meet. Drives discovery through performance, scale, reliability, security, privacy, compliance, integrations, platforms, accessibility, and localization. Writes to `.trogonai/project/{projectid}/prd/technical-requirements.prd.md`. Use when the user wants to capture the non-functional and platform constraints engineering will design against.4---56# PRD: Technical Requirements78## Purpose910Capture the technical constraints and non-functional requirements the product must meet, so engineering can design against concrete targets and the product team can make trade-offs explicit before implementation.1112This file is not a technical design or architecture document. It is the contract of constraints the design must satisfy.1314## Shared Operating Model1516Use `requirements-operating-model` before writing when constraints depend on product shape, metrics, existing context, or Blueprint handoff. Keep architecture decisions in Blueprints.1718## When to Use1920- A PRD is approaching engineering planning and lacks non-functional targets21- The team is debating "is this fast enough?" / "is this secure enough?" with no shared bar22- Compliance, accessibility, or platform constraints are implicit and need to be made explicit2324## Project Identifier2526Before writing, determine the `projectid`:27281. If the user has supplied one, use it verbatim.292. Otherwise, ask for it once. The `projectid` should be a stable, kebab-case identifier for the product/initiative.303. Confirm the resolved path before writing: `.trogonai/project/{projectid}/prd/technical-requirements.prd.md`.3132If the file already exists, read it first and ask whether to **replace** or **refine** before overwriting.3334## Read Existing Context3536Before discovery, read these files when they exist:3738- `.trogonai/project/{projectid}/prd/product-description.prd.md`39- `.trogonai/project/{projectid}/prd/success-metrics.prd.md`40- `.trogonai/project/{projectid}/prd/personas.prd.md`4142Use them to ground constraints in user-facing surfaces, measurable goals, and persona contexts. If a technical target becomes an architecture decision, leave the constraint here and identify Blueprints as the owner for the design.4344## Discovery4546Ask through each category. For every requirement, push for a **number, a threshold, or a named standard**, not adjectives.47481. **Performance**49 - Target latency (p50, p95, p99) for the primary user actions50 - Throughput / requests per second or per minute51 - Cold start, time-to-first-byte, time-to-interactive where relevant522. **Scale**53 - Expected users / tenants / records / events at launch and at 12 months54 - Peak vs steady-state ratios55 - Growth assumptions and their source563. **Reliability & availability**57 - SLO (e.g., 99.9% over rolling 30 days)58 - Acceptable error budget burn59 - Recovery objectives: RTO, RPO60 - Graceful degradation expectations614. **Security**62 - Authentication method(s)63 - Authorization model (roles, scopes, tenancy)64 - Data classification of inputs and outputs65 - Threat model concerns specific to this product665. **Privacy & compliance**67 - Regulatory regimes that apply (GDPR, HIPAA, SOC 2, PCI, regional data residency)68 - PII / PHI / payment data handling69 - Retention and deletion requirements70 - Audit logging requirements716. **Integrations**72 - Upstream systems consumed (APIs, events, files)73 - Downstream systems produced for74 - Sync vs async, contract ownership, failure semantics757. **Platforms & environments**76 - Supported browsers / OS / device classes77 - Minimum hardware / network assumptions78 - Cloud / on-prem / hybrid constraints79 - Offline / intermittent connectivity behavior808. **Accessibility**81 - WCAG level (typically AA)82 - Keyboard, screen reader, color contrast, motion expectations839. **Localization & internationalization**84 - Languages at launch and in 12 months85 - Right-to-left support86 - Time zone, currency, date/number formatting8710. **Observability**88 - Logs, metrics, traces required from day one89 - Dashboards and alerts that must exist before GA9011. **Cost constraints**91 - Unit economics targets (cost per user / request / event) if relevant92 - Hard ceilings on infrastructure spend9394For each category, the acceptable answer is either:9596- A concrete requirement with a target, OR97- An explicit "Not a constraint for this product": which is itself useful information9899Push back on:100101- "Should be fast" → which action, what percentile, what number, on what hardware/network102- "Secure by default" → which standard, what threat103- "Globally available" → which regions, which latency target per region104105## Quality Bar106107The file is complete when:108109- Every category has either a concrete target or an explicit "not a constraint"110- Performance numbers are tied to specific user actions, not the system as a whole111- Reliability targets are stated as SLOs with measurement windows112- Compliance regimes are named, not implied113- Each requirement is testable: a reviewer could write a verification for it114115## Output116117Write the complete file to `.trogonai/project/{projectid}/prd/technical-requirements.prd.md` using the template at `assets/technical-requirements-template.md`. Read it, substitute `{projectid}` and the date, and fill in each section from the discovery output. For any category that does not apply, record it under **Explicit non-constraints** rather than dropping the section.118119## Writing Guidance120121### Writing approach122- **Number, threshold, or named standard per category.** Every line is either a measurable target, a named regulation/standard, or an explicit non-constraint. Adjectives without numbers do not count.123- **Per user action, not per system.** "p95 < 200ms" only means something when paired with the action it covers. Latency budgets attach to user actions; SLOs attach to journeys.124- **Explicit non-constraints are first-class.** A category that does not apply is recorded under non-constraints with the reason. Silence is ambiguous; explicit absence is a decision.125- **Defend the number.** A target is more useful when paired with how it was chosen (benchmark, contract, regulatory minimum, user research). Numbers without provenance get re-negotiated under pressure.126127### Tone and language128- **No adjectives without numbers.** "Fast", "scalable", "secure", "globally available" are flags to push back on. Replace with a value, a percentile, and a condition.129- **Name the standard.** WCAG AA, SOC 2 Type II, PCI DSS v4, GDPR Art. 17: name the regime and the article/level when relevant. "Follows best practices" is not a requirement.130- **Percentiles for latency, windows for SLOs.** Single-number latency hides the worst experience; an SLO without a measurement window is not enforceable.131132### Scope133- **Contract of constraints, not design.** This file says *what* must be true, not *how* to satisfy it. Architecture, framework choice, and infrastructure topology belong in engineering design docs.134- **Non-functional and platform.** Performance, scale, reliability, security, privacy, integrations, platforms, accessibility, localization, observability, cost. Functional behavior belongs in FRDs.135- **No invention.** If a target is unknown, mark it as open with an owner and date: do not fabricate a number that will be treated as committed.136137## Good vs Bad Example138139**Good**140141```md142## Performance143| User action | Metric | Target | Conditions |144|-------------|--------|--------|------------|145| Open Coaching Inbox | p95 latency | < 800 ms | desktop Chrome, fiber; US-East region |146| Save call note | p95 latency | < 1.5 s | mobile web, LTE; user already authenticated |147148## Reliability & availability149- SLO: 99.9% availability for Save Call Note, measured over rolling 30 days.150- Error budget: 43.2 min / 30 days; freeze deploys on > 50% burn.151- RTO 30 min, RPO 5 min for Salesforce Bridge.152153## Security154- Authentication: SSO via Okta OIDC; session 12h, refresh 30 days.155- Authorization: role-based: AE (own deals), Manager (team deals), Admin (org).156- Data classification: notes are Restricted (may contain customer PII).157158## Privacy & compliance159- Regimes: SOC 2 Type II (annual), GDPR for EU tenants, CCPA for California users.160- Retention: call notes retained 7 years to match Salesforce; deletion request honored within 30 days per GDPR Art. 17.161162## Explicit non-constraints163- Localization: English only at launch; not a constraint until EU expansion (Q3 2026).164- Offline behavior: not supported in v1; AE is online by job definition.165```166167**Bad**168169```md170## Performance171- Should be fast.172173## Reliability & availability174- Should be highly available.175176## Security177- Should follow best practices.178179## Privacy & compliance180- Should be compliant.181182## Localization183- Should support multiple languages.184```185186The bad version is unfalsifiable: engineering cannot design against any of it, and the team has no shared bar to evaluate the result. Every line is an adjective that means whatever the reader wants.187188## Anti-Patterns to Reject189190- Adjectives without numbers ("fast", "scalable", "secure").191- One latency number for the whole system rather than per user action.192- SLOs without a measurement window.193- "Follows best practices" instead of naming the standard.194- Silently skipping a category: if it doesn't apply, say so explicitly.195196## Allowed Tools197198- **AskUserQuestion**: drive discovery and resolve `projectid`199- **Read**: load the existing file if it exists, to decide replace vs refine200- **Write**: write the file