@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.
- package/CHANGELOG.md +125 -0
- package/COMMANDS.md +69 -0
- package/LICENSE +21 -0
- package/README.md +842 -0
- package/README.ru.md +846 -0
- package/bin/ba-toolkit.js +468 -0
- package/package.json +49 -0
- package/skills/ac/SKILL.md +88 -0
- package/skills/analyze/SKILL.md +126 -0
- package/skills/apicontract/SKILL.md +113 -0
- package/skills/brief/SKILL.md +120 -0
- package/skills/clarify/SKILL.md +96 -0
- package/skills/datadict/SKILL.md +98 -0
- package/skills/estimate/SKILL.md +124 -0
- package/skills/export/SKILL.md +215 -0
- package/skills/glossary/SKILL.md +145 -0
- package/skills/handoff/SKILL.md +146 -0
- package/skills/nfr/SKILL.md +85 -0
- package/skills/principles/SKILL.md +182 -0
- package/skills/references/closing-message.md +33 -0
- package/skills/references/domains/ecommerce.md +209 -0
- package/skills/references/domains/fintech.md +180 -0
- package/skills/references/domains/healthcare.md +223 -0
- package/skills/references/domains/igaming.md +183 -0
- package/skills/references/domains/logistics.md +221 -0
- package/skills/references/domains/on-demand.md +231 -0
- package/skills/references/domains/real-estate.md +241 -0
- package/skills/references/domains/saas.md +185 -0
- package/skills/references/domains/social-media.md +234 -0
- package/skills/references/environment.md +57 -0
- package/skills/references/prerequisites.md +191 -0
- package/skills/references/templates/README.md +35 -0
- package/skills/references/templates/ac-template.md +58 -0
- package/skills/references/templates/analyze-template.md +65 -0
- package/skills/references/templates/apicontract-template.md +183 -0
- package/skills/references/templates/brief-template.md +51 -0
- package/skills/references/templates/datadict-template.md +75 -0
- package/skills/references/templates/export-template.md +112 -0
- package/skills/references/templates/handoff-template.md +102 -0
- package/skills/references/templates/nfr-template.md +97 -0
- package/skills/references/templates/principles-template.md +118 -0
- package/skills/references/templates/research-template.md +99 -0
- package/skills/references/templates/risk-template.md +188 -0
- package/skills/references/templates/scenarios-template.md +93 -0
- package/skills/references/templates/sprint-template.md +158 -0
- package/skills/references/templates/srs-template.md +90 -0
- package/skills/references/templates/stories-template.md +60 -0
- package/skills/references/templates/trace-template.md +59 -0
- package/skills/references/templates/usecases-template.md +51 -0
- package/skills/references/templates/wireframes-template.md +96 -0
- package/skills/research/SKILL.md +136 -0
- package/skills/risk/SKILL.md +163 -0
- package/skills/scenarios/SKILL.md +113 -0
- package/skills/sprint/SKILL.md +174 -0
- package/skills/srs/SKILL.md +124 -0
- package/skills/stories/SKILL.md +85 -0
- package/skills/trace/SKILL.md +85 -0
- package/skills/usecases/SKILL.md +91 -0
- 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 |
|