@kudusov.takhir/ba-toolkit 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/CHANGELOG.md +125 -0
  2. package/COMMANDS.md +69 -0
  3. package/LICENSE +21 -0
  4. package/README.md +842 -0
  5. package/README.ru.md +846 -0
  6. package/bin/ba-toolkit.js +468 -0
  7. package/package.json +49 -0
  8. package/skills/ac/SKILL.md +88 -0
  9. package/skills/analyze/SKILL.md +126 -0
  10. package/skills/apicontract/SKILL.md +113 -0
  11. package/skills/brief/SKILL.md +120 -0
  12. package/skills/clarify/SKILL.md +96 -0
  13. package/skills/datadict/SKILL.md +98 -0
  14. package/skills/estimate/SKILL.md +124 -0
  15. package/skills/export/SKILL.md +215 -0
  16. package/skills/glossary/SKILL.md +145 -0
  17. package/skills/handoff/SKILL.md +146 -0
  18. package/skills/nfr/SKILL.md +85 -0
  19. package/skills/principles/SKILL.md +182 -0
  20. package/skills/references/closing-message.md +33 -0
  21. package/skills/references/domains/ecommerce.md +209 -0
  22. package/skills/references/domains/fintech.md +180 -0
  23. package/skills/references/domains/healthcare.md +223 -0
  24. package/skills/references/domains/igaming.md +183 -0
  25. package/skills/references/domains/logistics.md +221 -0
  26. package/skills/references/domains/on-demand.md +231 -0
  27. package/skills/references/domains/real-estate.md +241 -0
  28. package/skills/references/domains/saas.md +185 -0
  29. package/skills/references/domains/social-media.md +234 -0
  30. package/skills/references/environment.md +57 -0
  31. package/skills/references/prerequisites.md +191 -0
  32. package/skills/references/templates/README.md +35 -0
  33. package/skills/references/templates/ac-template.md +58 -0
  34. package/skills/references/templates/analyze-template.md +65 -0
  35. package/skills/references/templates/apicontract-template.md +183 -0
  36. package/skills/references/templates/brief-template.md +51 -0
  37. package/skills/references/templates/datadict-template.md +75 -0
  38. package/skills/references/templates/export-template.md +112 -0
  39. package/skills/references/templates/handoff-template.md +102 -0
  40. package/skills/references/templates/nfr-template.md +97 -0
  41. package/skills/references/templates/principles-template.md +118 -0
  42. package/skills/references/templates/research-template.md +99 -0
  43. package/skills/references/templates/risk-template.md +188 -0
  44. package/skills/references/templates/scenarios-template.md +93 -0
  45. package/skills/references/templates/sprint-template.md +158 -0
  46. package/skills/references/templates/srs-template.md +90 -0
  47. package/skills/references/templates/stories-template.md +60 -0
  48. package/skills/references/templates/trace-template.md +59 -0
  49. package/skills/references/templates/usecases-template.md +51 -0
  50. package/skills/references/templates/wireframes-template.md +96 -0
  51. package/skills/research/SKILL.md +136 -0
  52. package/skills/risk/SKILL.md +163 -0
  53. package/skills/scenarios/SKILL.md +113 -0
  54. package/skills/sprint/SKILL.md +174 -0
  55. package/skills/srs/SKILL.md +124 -0
  56. package/skills/stories/SKILL.md +85 -0
  57. package/skills/trace/SKILL.md +85 -0
  58. package/skills/usecases/SKILL.md +91 -0
  59. package/skills/wireframes/SKILL.md +107 -0
@@ -0,0 +1,183 @@
1
+ # API Contract: [PROJECT_NAME]
2
+
3
+ **Domain:** [DOMAIN]
4
+ **Date:** [DATE]
5
+ **Slug:** [SLUG]
6
+ **API Style:** REST | GraphQL | gRPC
7
+ **Base URL:** `https://api.[domain].com/v1`
8
+ **Auth:** Bearer JWT | API Key | OAuth 2.0
9
+ **References:** `02_srs_[SLUG].md`, `07_datadict_[SLUG].md`
10
+
11
+ ---
12
+
13
+ ## Authentication
14
+
15
+ ```
16
+ Authorization: Bearer <token>
17
+ ```
18
+
19
+ Token obtained via `POST /auth/token`. Expires in [N] minutes. Refresh via `POST /auth/refresh`.
20
+
21
+ ---
22
+
23
+ ## Conventions
24
+
25
+ - Dates: ISO 8601 (`2026-04-07T10:00:00Z`)
26
+ - IDs: UUID v4
27
+ - Pagination: cursor-based — `?cursor=[cursor]&limit=[N]`
28
+ - Errors: `{ "error": { "code": "ERROR_CODE", "message": "Human-readable message" } }`
29
+ - Amounts: stored and returned in minor units (e.g. cents)
30
+
31
+ ---
32
+
33
+ ## Endpoints
34
+
35
+ ### POST /[resource]
36
+
37
+ **Description:** [What this endpoint does.]
38
+ **Auth required:** Yes | No
39
+ **Linked FR:** FR-[NNN] | **Linked Story:** US-[NNN]
40
+
41
+ **Request body:**
42
+
43
+ ```json
44
+ {
45
+ "[field]": "[type — description]",
46
+ "[field]": "[type — description]"
47
+ }
48
+ ```
49
+
50
+ **Response `201 Created`:**
51
+
52
+ ```json
53
+ {
54
+ "id": "uuid",
55
+ "[field]": "[value]"
56
+ }
57
+ ```
58
+
59
+ **Error responses:**
60
+
61
+ | Code | Error Code | Description |
62
+ |------|-----------|-------------|
63
+ | 400 | VALIDATION_ERROR | [Which fields, which rule] |
64
+ | 401 | UNAUTHORIZED | Missing or invalid token |
65
+ | 409 | [CONFLICT_CODE] | [Conflict condition] |
66
+
67
+ ---
68
+
69
+ ### GET /[resource]
70
+
71
+ **Description:** [What this endpoint returns.]
72
+ **Auth required:** Yes | No
73
+ **Query parameters:**
74
+
75
+ | Parameter | Type | Required | Description |
76
+ |-----------|------|----------|-------------|
77
+ | cursor | String | No | Pagination cursor |
78
+ | limit | Int | No | Max items (default 20, max 100) |
79
+ | [filter] | [type] | No | [Description] |
80
+
81
+ **Response `200 OK`:**
82
+
83
+ ```json
84
+ {
85
+ "data": [
86
+ {
87
+ "id": "uuid",
88
+ "[field]": "[value]"
89
+ }
90
+ ],
91
+ "pagination": {
92
+ "next_cursor": "[cursor or null]",
93
+ "has_more": true
94
+ }
95
+ }
96
+ ```
97
+
98
+ ---
99
+
100
+ ### GET /[resource]/:id
101
+
102
+ **Description:** [What this endpoint returns.]
103
+ **Auth required:** Yes | No
104
+
105
+ **Response `200 OK`:**
106
+
107
+ ```json
108
+ {
109
+ "id": "uuid",
110
+ "[field]": "[value]"
111
+ }
112
+ ```
113
+
114
+ **Error responses:**
115
+
116
+ | Code | Error Code | Description |
117
+ |------|-----------|-------------|
118
+ | 404 | NOT_FOUND | Resource does not exist |
119
+
120
+ ---
121
+
122
+ ### PATCH /[resource]/:id
123
+
124
+ **Description:** [What this endpoint updates.]
125
+ **Auth required:** Yes
126
+ **Linked FR:** FR-[NNN]
127
+
128
+ **Request body** (all fields optional):
129
+
130
+ ```json
131
+ {
132
+ "[field]": "[new value]"
133
+ }
134
+ ```
135
+
136
+ **Response `200 OK`:** Updated resource object.
137
+
138
+ ---
139
+
140
+ ### DELETE /[resource]/:id
141
+
142
+ **Description:** [Soft or hard delete — specify.]
143
+ **Auth required:** Yes
144
+
145
+ **Response `204 No Content`**
146
+
147
+ <!-- Repeat endpoint blocks as needed. Group by resource. -->
148
+
149
+ ---
150
+
151
+ ## Webhooks
152
+
153
+ ### [event.name]
154
+
155
+ **Trigger:** [When this event fires]
156
+ **Payload:**
157
+
158
+ ```json
159
+ {
160
+ "event": "[event.name]",
161
+ "timestamp": "2026-04-07T10:00:00Z",
162
+ "data": {
163
+ "[field]": "[value]"
164
+ }
165
+ }
166
+ ```
167
+
168
+ **Retry policy:** [N] retries with exponential backoff. Delivery considered failed after [N] hours.
169
+
170
+ ---
171
+
172
+ ## Error Code Reference
173
+
174
+ | HTTP Code | Error Code | Meaning |
175
+ |-----------|-----------|---------|
176
+ | 400 | VALIDATION_ERROR | Request body or params fail validation |
177
+ | 401 | UNAUTHORIZED | Missing, expired, or invalid token |
178
+ | 403 | FORBIDDEN | Authenticated but insufficient permissions |
179
+ | 404 | NOT_FOUND | Resource does not exist |
180
+ | 409 | CONFLICT | State conflict (duplicate, wrong status) |
181
+ | 422 | BUSINESS_RULE_ERROR | Request is valid but violates a business rule |
182
+ | 429 | RATE_LIMITED | Too many requests |
183
+ | 500 | INTERNAL_ERROR | Unexpected server error |
@@ -0,0 +1,51 @@
1
+ # Project Brief: [PROJECT_NAME]
2
+
3
+ **Domain:** [DOMAIN]
4
+ **Date:** [DATE]
5
+ **Slug:** [SLUG]
6
+
7
+ ## 1. Project Summary
8
+
9
+ [One paragraph describing what is being built, for whom, and why.]
10
+
11
+ ## 2. Business Goals and Success Metrics
12
+
13
+ | # | Goal | Success Metric |
14
+ |---|------|---------------|
15
+ | 1 | [goal] | [measurable metric] |
16
+
17
+ ## 3. Target Audience
18
+
19
+ | Segment | Description | Geography |
20
+ |---------|-------------|-----------|
21
+ | [segment] | [description] | [region] |
22
+
23
+ ## 4. High-Level Functionality Overview
24
+
25
+ [2–4 paragraphs or bullet list of the main functional areas. No technical detail — what the system does, not how.]
26
+
27
+ ## 5. Stakeholders and Roles
28
+
29
+ | Role | Responsibility | Interest |
30
+ |------|---------------|---------|
31
+ | [role] | [what they do] | [what they care about] |
32
+
33
+ ## 6. Constraints and Assumptions
34
+
35
+ **Constraints:**
36
+ - [constraint]
37
+
38
+ **Assumptions:**
39
+ - [assumption]
40
+
41
+ ## 7. Risks
42
+
43
+ | # | Risk | Probability | Impact | Mitigation |
44
+ |---|------|-------------|--------|-----------|
45
+ | 1 | [risk] | High/Med/Low | High/Med/Low | [mitigation] |
46
+
47
+ ## 8. Glossary
48
+
49
+ | Term | Definition |
50
+ |------|-----------|
51
+ | [term] | [definition] |
@@ -0,0 +1,75 @@
1
+ # Data Dictionary: [PROJECT_NAME]
2
+
3
+ **Domain:** [DOMAIN]
4
+ **Date:** [DATE]
5
+ **Slug:** [SLUG]
6
+ **References:** `02_srs_[SLUG].md`, `03_stories_[SLUG].md`
7
+
8
+ ---
9
+
10
+ ## Entity: [EntityName]
11
+
12
+ **Description:** [What this entity represents in the domain.]
13
+ **Table / Collection:** `[table_name]`
14
+ **Linked FR:** FR-[NNN]
15
+
16
+ | Field | Type | Required | Default | Description | Constraints |
17
+ |-------|------|----------|---------|-------------|------------|
18
+ | id | UUID | Yes | auto | Primary key | Unique |
19
+ | [field] | [String \| Int \| Boolean \| Timestamp \| Decimal \| Enum \| FK] | Yes/No | [value or —] | [description] | [constraints, e.g. max 255, ≥ 0] |
20
+ | created_at | Timestamp | Yes | now() | Record creation time | |
21
+ | updated_at | Timestamp | Yes | now() | Last update time | |
22
+
23
+ **Relationships:**
24
+ - `[EntityName]` belongs to `[OtherEntity]` via `[field]` (many-to-one)
25
+ - `[EntityName]` has many `[OtherEntity]` (one-to-many)
26
+
27
+ **Indexes:**
28
+ - `[field]` — for [reason, e.g. lookup by email]
29
+
30
+ **Soft delete:** Yes — `deleted_at` field / No — hard delete
31
+ **Notes:** [Business rules, state machine, or special handling.]
32
+
33
+ ---
34
+
35
+ ## Entity: [EntityName2]
36
+
37
+ **Description:** [What this entity represents in the domain.]
38
+ **Table / Collection:** `[table_name]`
39
+ **Linked FR:** FR-[NNN]
40
+
41
+ | Field | Type | Required | Default | Description | Constraints |
42
+ |-------|------|----------|---------|-------------|------------|
43
+ | id | UUID | Yes | auto | Primary key | Unique |
44
+ | [field] | [type] | Yes/No | [value] | [description] | [constraints] |
45
+ | created_at | Timestamp | Yes | now() | Record creation time | |
46
+ | updated_at | Timestamp | Yes | now() | Last update time | |
47
+
48
+ **Relationships:**
49
+ - [relationship description]
50
+
51
+ **Soft delete:** Yes / No
52
+ **Notes:** [Special handling.]
53
+
54
+ <!-- Repeat Entity block for each domain entity. -->
55
+
56
+ ---
57
+
58
+ ## Enum Definitions
59
+
60
+ ### [EnumName]
61
+
62
+ | Value | Label | Description |
63
+ |-------|-------|-------------|
64
+ | [VALUE] | [Display label] | [When this value applies] |
65
+
66
+ ---
67
+
68
+ ## Entity Relationship Overview
69
+
70
+ ```
71
+ [EntityName] ──< [EntityName2]
72
+ [EntityName2] >── [EntityName3]
73
+ ```
74
+
75
+ _Full ERD: generated separately by the development team._
@@ -0,0 +1,112 @@
1
+ # Export Template
2
+
3
+ Template showing the structure of `/export` output files for each supported format.
4
+ Actual values are filled in by the skill based on the project's artifacts.
5
+
6
+ ---
7
+
8
+ ## Jira JSON — `export_{slug}_jira.json`
9
+
10
+ ```json
11
+ {
12
+ "projects": [
13
+ {
14
+ "key": "PROJ",
15
+ "issues": [
16
+ {
17
+ "summary": "US-001: User can register with email and password",
18
+ "description": {
19
+ "type": "doc",
20
+ "version": 1,
21
+ "content": [
22
+ {
23
+ "type": "paragraph",
24
+ "content": [{ "type": "text", "text": "As a visitor, I want to register with my email and password, so that I can access my personal account." }]
25
+ },
26
+ {
27
+ "type": "heading",
28
+ "attrs": { "level": 3 },
29
+ "content": [{ "type": "text", "text": "Acceptance Criteria" }]
30
+ },
31
+ {
32
+ "type": "bulletList",
33
+ "content": [
34
+ { "type": "listItem", "content": [{ "type": "paragraph", "content": [{ "type": "text", "text": "Given I am on the registration page, When I submit a valid email and password, Then my account is created and I am redirected to the dashboard." }] }] },
35
+ { "type": "listItem", "content": [{ "type": "paragraph", "content": [{ "type": "text", "text": "Given I submit an email that already exists, When the form is submitted, Then I see an error message 'Email already in use'." }] }] }
36
+ ]
37
+ }
38
+ ]
39
+ },
40
+ "issuetype": { "name": "Story" },
41
+ "priority": { "name": "High" },
42
+ "labels": ["dragon-fortune", "E-01"],
43
+ "customfield_10016": 3,
44
+ "customfield_10014": null
45
+ }
46
+ ]
47
+ }
48
+ ]
49
+ }
50
+ ```
51
+
52
+ **Import:** Jira → Project Settings → Issue Import → JSON Import, or `jira import --file export_{slug}_jira.json`
53
+
54
+ ---
55
+
56
+ ## GitHub Issues JSON — `export_{slug}_github.json`
57
+
58
+ ```json
59
+ [
60
+ {
61
+ "title": "US-001: User can register with email and password",
62
+ "body": "## User Story\n\nAs a **visitor**, I want to **register with my email and password**, so that **I can access my personal account**.\n\n---\n\n## Acceptance Criteria\n\n**Scenario 1 — Successful registration**\n- Given I am on the registration page\n- When I submit a valid email and password\n- Then my account is created and I am redirected to the dashboard\n\n**Scenario 2 — Duplicate email**\n- Given I submit an email that already exists\n- When the form is submitted\n- Then I see an error message 'Email already in use'\n\n---\n\n**FR Reference:** FR-001\n**Priority:** Must\n**Estimate:** 3 SP",
63
+ "labels": ["epic:E-01", "user-story", "priority:must"],
64
+ "milestone": "MVP"
65
+ }
66
+ ]
67
+ ```
68
+
69
+ **Import via `gh` CLI:**
70
+ ```bash
71
+ cat export_{slug}_github.json | jq -c '.[]' | while read issue; do
72
+ title=$(echo "$issue" | jq -r '.title')
73
+ body=$(echo "$issue" | jq -r '.body')
74
+ labels=$(echo "$issue" | jq -r '.labels | join(",")')
75
+ gh issue create --repo owner/repo --title "$title" --body "$body" --label "$labels"
76
+ done
77
+ ```
78
+
79
+ ---
80
+
81
+ ## Linear JSON — `export_{slug}_linear.json`
82
+
83
+ ```json
84
+ {
85
+ "issues": [
86
+ {
87
+ "title": "US-001: User can register with email and password",
88
+ "description": "**As a** visitor, **I want to** register with my email and password, **so that** I can access my personal account.\n\n### Acceptance Criteria\n\n**Scenario 1 — Successful registration**\nGiven I am on the registration page, When I submit a valid email and password, Then my account is created and I am redirected to the dashboard.\n\n**Scenario 2 — Duplicate email**\nGiven I submit an email that already exists, When the form is submitted, Then I see an error message 'Email already in use'.",
89
+ "priority": 2,
90
+ "estimate": 3,
91
+ "labelNames": ["E-01", "user-story"],
92
+ "stateName": "Backlog"
93
+ }
94
+ ]
95
+ }
96
+ ```
97
+
98
+ **Priority values:** `1` = Urgent · `2` = High · `3` = Medium · `4` = Low · `0` = No priority
99
+
100
+ **Import:** Use the Linear API (`POST https://api.linear.app/graphql` with `issueCreate` mutation per issue) or the Linear SDK.
101
+
102
+ ---
103
+
104
+ ## CSV — `export_{slug}_stories.csv`
105
+
106
+ ```
107
+ ID,Title,Epic,Role,Action,Benefit,Priority,Estimate,FR Reference,AC Summary
108
+ US-001,"User can register with email and password",E-01,"visitor","register with my email and password","access my personal account",Must,3 SP,FR-001,"Given valid email+password → account created; Given duplicate email → error shown"
109
+ US-002,"User can log in with existing credentials",E-01,"registered user","log in with email and password","access my account without re-registering",Must,2 SP,FR-002,"Given valid credentials → redirected to dashboard; Given wrong password → error shown"
110
+ ```
111
+
112
+ Compatible with: Jira CSV Import · Trello · Asana · Monday.com · Google Sheets
@@ -0,0 +1,102 @@
1
+ # Development Handoff Package: [PROJECT_NAME]
2
+
3
+ **Domain:** [DOMAIN]
4
+ **Date:** [DATE]
5
+ **Slug:** [SLUG]
6
+ **Prepared by:** BA Toolkit `/handoff`
7
+ **References:** All pipeline artifacts
8
+
9
+ ---
10
+
11
+ ## Artifact Inventory
12
+
13
+ | Artifact | File | Status | Last Updated |
14
+ |---------|------|--------|-------------|
15
+ | Principles | `00_principles_[SLUG].md` | ✅ Complete | [DATE] |
16
+ | Project Brief | `01_brief_[SLUG].md` | ✅ Complete | [DATE] |
17
+ | SRS | `02_srs_[SLUG].md` | ✅ Complete | [DATE] |
18
+ | User Stories | `03_stories_[SLUG].md` | ✅ Complete | [DATE] |
19
+ | Use Cases | `04_usecases_[SLUG].md` | ✅ Complete | [DATE] |
20
+ | Acceptance Criteria | `05_ac_[SLUG].md` | ✅ Complete | [DATE] |
21
+ | NFR | `06_nfr_[SLUG].md` | ✅ Complete | [DATE] |
22
+ | Data Dictionary | `07_datadict_[SLUG].md` | ✅ Complete | [DATE] |
23
+ | Research / ADRs | `07a_research_[SLUG].md` | ✅ Complete | [DATE] |
24
+ | API Contract | `08_apicontract_[SLUG].md` | ✅ Complete | [DATE] |
25
+ | Wireframes | `09_wireframes_[SLUG].md` | ✅ Complete | [DATE] |
26
+ | Validation Scenarios | `10_scenarios_[SLUG].md` | ✅ Complete | [DATE] |
27
+
28
+ ---
29
+
30
+ ## MVP Scope
31
+
32
+ **In scope for MVP:**
33
+
34
+ | ID | Title | Type | Priority |
35
+ |----|-------|------|---------|
36
+ | FR-[NNN] | [Title] | Functional | Must |
37
+ | US-[NNN] | [Story title] | Story | Must |
38
+
39
+ **Explicitly out of scope (deferred to v2):**
40
+
41
+ | ID | Title | Reason |
42
+ |----|-------|--------|
43
+ | FR-[NNN] | [Title] | [Reason — e.g. "dependency on third-party integration not available at launch"] |
44
+
45
+ ---
46
+
47
+ ## Traceability Coverage
48
+
49
+ | Link | Coverage | Gap |
50
+ |------|---------|-----|
51
+ | FR → US | [N]% | [N orphaned FRs] |
52
+ | US → AC | [N]% | [N stories without AC] |
53
+ | FR → API | [N]% | [N FRs without endpoint] |
54
+ | US → WF | [N]% | [N stories without wireframe] |
55
+
56
+ ---
57
+
58
+ ## Open Items
59
+
60
+ | # | Type | Description | Owner | Priority |
61
+ |---|------|-------------|-------|---------|
62
+ | 1 | [Decision \| Clarification \| Dependency] | [Description] | [Role] | P1 / P2 / P3 |
63
+
64
+ ---
65
+
66
+ ## Top Risks for Development
67
+
68
+ | # | Risk | Probability | Impact | Mitigation |
69
+ |---|------|-------------|--------|-----------|
70
+ | 1 | [Risk] | High / Med / Low | High / Med / Low | [Mitigation] |
71
+
72
+ ---
73
+
74
+ ## Recommended Development Sequence
75
+
76
+ 1. **[Phase / Sprint 1]** — [What to build first and why]
77
+ 2. **[Phase / Sprint 2]** — [Next priority]
78
+ 3. **[Phase / Sprint 3]** — [Following priority]
79
+
80
+ _Rationale: [Why this sequencing — dependencies, risk, user value.]_
81
+
82
+ ---
83
+
84
+ ## Artifact Files Reference
85
+
86
+ ```
87
+ output/[SLUG]/
88
+ ├── 00_principles_[SLUG].md
89
+ ├── 00_analyze_[SLUG].md
90
+ ├── 01_brief_[SLUG].md
91
+ ├── 02_srs_[SLUG].md
92
+ ├── 03_stories_[SLUG].md
93
+ ├── 04_usecases_[SLUG].md
94
+ ├── 05_ac_[SLUG].md
95
+ ├── 06_nfr_[SLUG].md
96
+ ├── 07_datadict_[SLUG].md
97
+ ├── 07a_research_[SLUG].md
98
+ ├── 08_apicontract_[SLUG].md
99
+ ├── 09_wireframes_[SLUG].md
100
+ ├── 10_scenarios_[SLUG].md
101
+ └── 11_handoff_[SLUG].md ← this document
102
+ ```
@@ -0,0 +1,97 @@
1
+ # Non-functional Requirements: [PROJECT_NAME]
2
+
3
+ **Domain:** [DOMAIN]
4
+ **Date:** [DATE]
5
+ **Slug:** [SLUG]
6
+ **References:** `02_srs_[SLUG].md`, `00_principles_[SLUG].md`
7
+
8
+ ---
9
+
10
+ ## NFR-001: Performance
11
+
12
+ | Attribute | Requirement | Measurement Method |
13
+ |-----------|------------|-------------------|
14
+ | [Page / operation] | [Target, e.g. < 2s p95] | [Lighthouse / load test / APM] |
15
+
16
+ **Rationale:** [Why this target matters for this project.]
17
+
18
+ ---
19
+
20
+ ## NFR-002: Scalability
21
+
22
+ | Attribute | Requirement | Measurement Method |
23
+ |-----------|------------|-------------------|
24
+ | Concurrent users | [N at peak] | [Load test scenario] |
25
+ | Data volume | [N records, N GB] | [Capacity model] |
26
+
27
+ **Rationale:** [Expected growth, peak events.]
28
+
29
+ ---
30
+
31
+ ## NFR-003: Availability & Reliability
32
+
33
+ | Service | SLA | Maintenance Window |
34
+ |---------|-----|--------------------|
35
+ | [Service name] | 99.9% | [Sun 02:00–04:00 UTC] |
36
+
37
+ **RTO:** [Recovery Time Objective, e.g. < 4h]
38
+ **RPO:** [Recovery Point Objective, e.g. < 1h]
39
+
40
+ ---
41
+
42
+ ## NFR-004: Security
43
+
44
+ | Control | Requirement |
45
+ |---------|-------------|
46
+ | Authentication | [e.g. JWT, OAuth 2.0, MFA for admin] |
47
+ | Authorisation | [e.g. RBAC, row-level security] |
48
+ | Data in transit | [TLS 1.2+] |
49
+ | Data at rest | [AES-256] |
50
+ | [Other control] | [requirement] |
51
+
52
+ **Compliance standard:** [PCI DSS / HIPAA / GDPR / none]
53
+
54
+ ---
55
+
56
+ ## NFR-005: Maintainability
57
+
58
+ | Attribute | Requirement |
59
+ |-----------|-------------|
60
+ | Code coverage | [≥ 80% unit test coverage] |
61
+ | Deployment | [CI/CD, zero-downtime deployments] |
62
+ | Logging | [Structured JSON logs, retained N days] |
63
+ | Alerting | [P1 alert → on-call within 5 min] |
64
+
65
+ ---
66
+
67
+ ## NFR-006: Usability & Accessibility
68
+
69
+ | Attribute | Requirement |
70
+ |-----------|-------------|
71
+ | Accessibility | [WCAG 2.1 AA] |
72
+ | Browser support | [Chrome, Safari, Firefox — latest 2 versions] |
73
+ | Mobile | [Responsive, iOS 15+, Android 10+] |
74
+ | Language | [EN / RU / other] |
75
+
76
+ ---
77
+
78
+ ## NFR-007: [Additional Category]
79
+
80
+ | Attribute | Requirement | Measurement Method |
81
+ |-----------|------------|-------------------|
82
+ | [attribute] | [requirement] | [method] |
83
+
84
+ <!-- Add or remove NFR sections based on project needs. Numbering: NFR-001, NFR-002, ... -->
85
+
86
+ ---
87
+
88
+ ## Priority Summary
89
+
90
+ | ID | Category | Priority |
91
+ |----|----------|---------|
92
+ | NFR-001 | Performance | Must |
93
+ | NFR-002 | Scalability | Should |
94
+ | NFR-003 | Availability | Must |
95
+ | NFR-004 | Security | Must |
96
+ | NFR-005 | Maintainability | Should |
97
+ | NFR-006 | Usability | Should |