spec-lite 1.5.2 → 1.7.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.
@@ -1,241 +0,0 @@
1
- ---
2
- name: spec-tsd
3
- description: Tạo tsd.md (Test Spec Document) trực tiếp tại feature level từ frd.md — mechanical derive Test Scenarios + Test Cases. KHÔNG cần integration, không cascade. Dùng cho brownfield onboarding (sau /spec-brownfield-feature) hoặc greenfield bootstrap khi feature đã có frd.md nhưng chưa có tsd.md.
4
- ---
5
-
6
- # spec-tsd
7
-
8
- ## Overview
9
-
10
- Tạo `.specs/main/feature/{F-XXX}-{slug}/tsd.md` trực tiếp từ frd.md của feature đó — **không qua integration**, không cascade.
11
-
12
- Skill này song hành với `/spec-prd` và `/spec-sad`: skill có acronym suffix (`prd`/`sad`/`tsd`) → tạo main artifact trực tiếp. Phân biệt với `/spec-test` — skill đó tạo `test.md` integration-level và cascade qua Changes blocks.
13
-
14
- ## When to Use
15
-
16
- - **Brownfield onboarding** — sau `/spec-brownfield-feature` đã sinh frd.md, cần bootstrap tsd.md để có test coverage tracking ngay từ đầu.
17
- - **Greenfield deferred** — feature có frd.md từ lâu nhưng tsd.md chưa được tạo (vd: test design bị defer).
18
- - **Ad-hoc rebuild** — tsd.md drift quá xa khỏi frd.md, muốn regenerate fresh.
19
-
20
- ## When NOT to Use
21
-
22
- - Có integration mới và muốn cascade thay đổi frd lên tsd hiện tại → dùng `/spec-test` (changeset patch giữ ID stable)
23
- - Chỉ muốn sửa vài TC → edit `tsd.md` trực tiếp
24
- - Feature chưa có frd.md → chạy `/spec-brownfield-feature` (brownfield) hoặc `/spec-new` (greenfield) trước
25
-
26
- ## Cảnh báo về ID stability
27
-
28
- `/spec-tsd` **regenerate IDs từ 001** mỗi lần chạy. Nếu tsd.md đã tồn tại và đang được reference (vd: test code có `// covers TC-F001-005`), rebuild sẽ làm vỡ những reference đó.
29
-
30
- Quy tắc:
31
- - **tsd.md chưa tồn tại** → an toàn, không có reference, regenerate fresh.
32
- - **tsd.md tồn tại** → skill hỏi confirm rõ ràng trước khi overwrite. Khuyến nghị: dùng `/spec-test` qua integration changeset để preserve ID stable.
33
-
34
- ---
35
-
36
- ## Process
37
-
38
- ### Bước 1: Xác định feature
39
-
40
- **Nếu có ARGUMENT:**
41
- - Parse argument: có thể là feature ID (`F-001`, `001`) hoặc slug (`F-001-auth`, `auth`)
42
- - Quét `.specs/main/feature/*/frd.md`, tìm feature khớp
43
- - Nếu không tìm thấy → báo lỗi:
44
- > Không tìm thấy feature khớp với "{argument}". Kiểm tra `.specs/main/feature/`.
45
-
46
- **Nếu không có ARGUMENT:**
47
-
48
- Quét `.specs/main/feature/`. Liệt kê **tất cả** features có `frd.md`, đánh dấu trạng thái tsd:
49
-
50
- ```
51
- Features có frd.md:
52
-
53
- [1] F-001 — auth spec✓ tsd✓
54
- [2] F-002 — checkout spec✓ tsd—
55
- [3] F-003 — refund spec✓ tsd— (frd có 5 Flow, 12 US, 8 VR, 3 FAC)
56
-
57
- Chọn số feature:
58
- ```
59
-
60
- Nếu không có feature nào có frd → thông báo:
61
- > Chưa có feature nào có frd.md. Hãy chạy `/spec-brownfield-feature` hoặc `/spec-new` trước.
62
-
63
- ---
64
-
65
- ### Bước 2: Gate check — frd.md tồn tại + warn nếu tsd.md đã có
66
-
67
- **Check 1 — frd.md tồn tại:**
68
-
69
- Nếu `.specs/main/feature/{F-XXX}-{slug}/frd.md` không tồn tại → dừng:
70
- > ⛔ `feature/{F-XXX}-{slug}/frd.md` không tồn tại. `/spec-tsd` cần frd làm input.
71
-
72
- **Check 2 — tsd.md đã tồn tại:**
73
-
74
- Nếu `.specs/main/feature/{F-XXX}-{slug}/tsd.md` đã tồn tại:
75
-
76
- > ⚠ `tsd.md` đã tồn tại cho feature **{F-XXX} — {slug}**.
77
- >
78
- > `/spec-tsd` regenerate IDs từ 001 — nếu có test code đang reference TC-{F_ID}-NNN hoặc TS-{F_ID}-NNN, references sẽ bị vỡ.
79
- >
80
- > Khuyến nghị: dùng `/spec-test` qua integration changeset để giữ ID stable.
81
- >
82
- > Tiếp tục overwrite? (yes / no — default no)
83
-
84
- Nếu user chọn no → dừng, suggest `/spec-test`.
85
- Nếu user chọn yes → backup tsd.md cũ thành `tsd.md.bak.{timestamp}` rồi proceed.
86
-
87
- ---
88
-
89
- ### Bước 3: Load context
90
-
91
- Load các file sau:
92
-
93
- - `.specs/main/feature/{F-XXX}-{slug}/frd.md` — **bắt buộc**, source của TC
94
- - `.specs/main/feature/{F-XXX}-{slug}/fdd.md` — optional, đọc nếu tồn tại để hint Components Used (cho Dependencies section của tsd)
95
-
96
- Tóm tắt context:
97
-
98
- ```
99
- TÔI HIỂU:
100
- - Feature: {F-XXX} — {slug}
101
- - Trong frd.md:
102
- - {N} Flows
103
- - {M} User Stories ({K} Acceptance Criteria)
104
- - {P} Verification Rules
105
- - {Q} Feature Acceptance Criteria
106
- - tsd.md hiện tại: {chưa có / sẽ overwrite — backup tại tsd.md.bak.{timestamp}}
107
- - fdd.md: {tồn tại — Components Used: C-XXX, C-YYY / chưa có}
108
- ```
109
-
110
- ---
111
-
112
- ### Bước 4: Auto-derive draft
113
-
114
- **Nguyên tắc:** mechanical derive 1:1 từ frd.md — same algorithm như `/spec-test` (xem [skills/spec-test/SKILL.md](../spec-test/SKILL.md) Bước 3.1-3.3). Tóm lại:
115
-
116
- #### 4.1 ID assignment
117
-
118
- - IDs bắt đầu từ `001` (vì tạo mới hoặc regenerate). TS và TC cùng feature ID `F{NNN}`, TC dùng chung sequence cho Functional / Validation / Feature AC.
119
- - ID sẽ stable kể từ thời điểm này — lần edit tiếp theo qua `/spec-test` integration phải preserve.
120
-
121
- #### 4.2 Derivation rules
122
-
123
- | frd item | tsd output |
124
- | --- | --- |
125
- | Mỗi `Flow {N}` trong User Flows | 1 Test Scenario `TS-F{NNN}-{seq}` |
126
- | Mỗi `AC-F{NNN}-{seq}` trong US | 1 Functional TC `TC-F{NNN}-{seq}` |
127
- | Mỗi `VR-F{NNN}-{seq}` | 1 positive + 1+ negative Validation TC |
128
- | Mỗi `FAC-F{NNN}-{seq}` | 1 Feature AC TC |
129
-
130
- Detail dịch G/W/T → Preconditions/Steps/Expected, infer negative VR branches từ rule text — xem `/spec-test` Bước 3.2.
131
-
132
- #### 4.3 Priority defaults
133
-
134
- | Source | Priority |
135
- | --- | --- |
136
- | TC cover US Must | P0 |
137
- | TC cover US Should | P1 |
138
- | TC cover US Could | P2 |
139
- | TC cover VR | inherit max priority của Refs (P1 default nếu Refs trống) |
140
- | TC cover FAC e2e | P0 |
141
- | TC cover FAC consistency | P1 |
142
- | TC cover FAC NFR security/data | P0 |
143
- | TC cover FAC NFR perf/a11y/i18n/browser | P1 |
144
- | TC cover FAC data & migration | P0 |
145
-
146
- #### 4.4 Traceability Matrix
147
-
148
- Row per frd item — Flow / US / Story AC / VR / FAC. Mọi item phải có cover ✅. Item không thể derive → ❌ + ghi lý do ở Gaps section.
149
-
150
- #### 4.5 Placeholders cần QC fill
151
-
152
- Agent **không suy đoán**:
153
-
154
- | Field | Placeholder |
155
- | --- | --- |
156
- | Environments table | Row mặc định `dev / staging / prod-like` với data set `TBD`, mục đích `TBD` |
157
- | Test Data table | Row `{TBD — fixture}` cho mỗi dataset thấy cần |
158
- | Out of Scope | Để trống với note `<!-- QC fill -->` |
159
- | Test Strategy > Approach | Bullet generic theo template gốc |
160
- | Overview | 2-3 câu mô tả feature scope từ frd Overview |
161
-
162
- #### 4.6 Dependencies section
163
-
164
- - **FRD reference**: path tới `frd.md` của feature này
165
- - **Components Used**: copy từ `frd.md > Components Used`. Nếu fdd.md tồn tại → cross-reference C-XXX để đảm bảo đúng.
166
-
167
- ---
168
-
169
- ### Bước 5: Review — xác nhận với QC
170
-
171
- Hiển thị draft đầy đủ — chưa ghi file.
172
-
173
- > Draft tsd.md trên đã đúng chưa? Check:
174
- >
175
- > 1. **Coverage** — Traceability Matrix có đủ row cho mỗi Flow / US / AC / VR / FAC trong frd?
176
- > 2. **Priority** — defaults theo bảng 4.3, có TC nào cần override?
177
- > 3. **Placeholders** — fill Environments / Test Data / Out of Scope / Strategy Approach.
178
- > 4. **Extra edge cases** — ngoài AC/VR có scenario QC muốn thêm?
179
- >
180
- > Confirm để ghi file. Reject để revise.
181
-
182
- ---
183
-
184
- ### Bước 6: Save
185
-
186
- Ghi `.specs/main/feature/{F-XXX}-{slug}/tsd.md` với status `draft` (feature-level artifact có lifecycle riêng, không phải `approved` — QC còn fill placeholders nên status `draft` cho đến khi đầy đủ). Frontmatter lấy `template_version` từ `tsd-template.md` (xem `conventions.md` §7).
187
-
188
- Nếu overwrite — file backup `tsd.md.bak.{timestamp}` đã tạo ở Bước 2.
189
-
190
- **Change History:** Append entry vào section `## Change History` cuối tsd.md (theo `conventions.md` §5.5):
191
-
192
- ```markdown
193
- ### {YYYY-MM-DD} — manual — create
194
-
195
- - **All sections**: initial scaffold qua /spec-tsd (mechanical derive từ frd.md — N TS, M Functional TC, P Validation TC, Q Feature AC TC)
196
- ```
197
-
198
- Nếu overwrite tsd.md cũ → entry vẫn dùng operation `create` (vì IDs regenerate fresh, không phải update), thêm note trong body: `- **Note**: overwrote previous tsd.md (backup tại tsd.md.bak.{timestamp}) — IDs regenerated từ 001`.
199
-
200
- Thông báo kết quả:
201
-
202
- ```
203
- ✓ .specs/main/feature/{F-XXX}-{slug}/tsd.md đã được tạo (status: draft)
204
- Coverage: N Flows → N TS, M US/AC → M Functional TC, P VR → ~2P Validation TC, Q FAC → Q Feature AC TC
205
- {nếu overwrite: backup tại tsd.md.bak.{timestamp}}
206
-
207
- Bước tiếp theo:
208
- - QC: fill remaining placeholders (Environments, Test Data, Out of Scope, Strategy)
209
- - Đổi status: draft → approved khi sẵn sàng
210
- - Sau này: nếu frd thay đổi → dùng /spec-test qua integration changeset để giữ ID stable
211
- ```
212
-
213
- ---
214
-
215
- ## Common Rationalizations
216
-
217
- | Rationalization | Reality |
218
- | --- | --- |
219
- | "Có frd rồi, viết tsd sau cũng được" | Test coverage không tracked = không biết feature đóng được chưa. tsd làm song song với frd, không sau. |
220
- | "Rebuild tsd nhanh hơn cập nhật manual" | Đúng cho lần đầu. Lần sau khi đã có test code reference → rebuild sẽ break references. Lúc đó dùng `/spec-test`. |
221
- | "Brownfield không cần tsd, đã có test code" | Test code là HOW. tsd là WHAT — declarative TC list để track coverage vs frd. Hai layer khác nhau. |
222
-
223
- ## Red Flags
224
-
225
- - Traceability Matrix có ❌ mà không có Gaps section giải thích
226
- - Priority hàng loạt P1 — chưa override theo defaults
227
- - Test Strategy / Test Data toàn `TBD` sau khi QC review xong
228
- - Overwrite tsd.md hiện có mà không cảnh báo về ID break
229
-
230
- ## Verification
231
-
232
- Trước khi ghi file:
233
-
234
- - [ ] Mỗi Flow trong frd có 1 TS
235
- - [ ] Mỗi US AC có TC Functional cover
236
- - [ ] Mỗi VR có ≥1 positive + ≥1 negative TC
237
- - [ ] Mỗi FAC có TC Feature AC cover
238
- - [ ] Priority deterministic theo bảng 4.3
239
- - [ ] Nếu overwrite: tsd.md.bak.{timestamp} đã được tạo
240
- - [ ] QC đã confirm draft
241
- - [ ] Frontmatter có `template_version` copy từ `tsd-template.md`
@@ -1,238 +0,0 @@
1
- ---
2
- id: tsd-{feature}
3
- type: tsd
4
- status: draft
5
- owner: "{QC}"
6
- feature_id: "{Feature ID — match frd.md}"
7
- frd_ref: "feature/{F-XXX}-{slug}/frd.md"
8
- template_version: 1
9
- migrations:
10
- - to: 1
11
- note: "baseline"
12
- referenced_by:
13
- - conventions.md > 3. Main Artifacts > 3.3 Feature level > tsd.md > Cấu trúc
14
- ---
15
-
16
- <!--
17
- Canonical format cho feature/{F-XXX}-{slug}/tsd.md.
18
- Sinh từ frd.md — mỗi AC / VR / Flow phải có ít nhất 1 test case cover.
19
- Traceability Matrix ở cuối là source of truth để kiểm tra coverage trước khi đóng feature.
20
-
21
- TSD chỉ tồn tại ở FEATURE level — không tách tsd riêng cho component.
22
- Component là internal building block; contract của component được verify gián tiếp qua TC ở đây
23
- và qua unit test trong code (không phải spec artifact).
24
- -->
25
-
26
- # Test Spec: {Feature Name}
27
-
28
- ## Overview
29
-
30
- {Phạm vi tsd này — feature gì, các luồng / AC / VR chính cần verify, trong 2-3 câu.}
31
-
32
- ## Test Strategy
33
-
34
- ### Approach
35
-
36
- - **Functional**: verify từng US / Story AC theo happy + edge.
37
- - **Validation**: derive 1:1 từ Verification Rules.
38
- - **Flow-based (E2E)**: chạy theo Mermaid flows trong frd.
39
- - **Feature AC**: cover các Feature AC — e2e liên story, cross-story consistency, NFR, data & migration.
40
-
41
- ### Environments
42
-
43
- | Env | Mục đích | Data set | Ghi chú |
44
- | --- | --- | --- | --- |
45
- | {dev / staging / prod-like} | {functional / E2E / load} | {seed / anonymized prod} | ... |
46
-
47
- ## Test Scenarios
48
-
49
- Mỗi scenario gắn với 1 flow trong `frd.md > User Flows`. Scenario mô tả end-to-end path; test case chi tiết liệt kê ở section bên dưới.
50
-
51
- TS ID format: `TS-F{NNN}-{seq}` — đánh số tăng dần toàn feature. ID **stable** — đã assign rồi giữ nguyên kể cả khi xóa (không tái sử dụng seq, không renumber).
52
-
53
- ### TS-{F_ID}-001: {Tên — match Flow 1 trong frd}
54
-
55
- - **Flow ref:** `frd.md > Flow 1: {tên}`
56
- - **Preconditions:** {state trước khi chạy}
57
- - **Postconditions:** {state sau khi pass}
58
- - **Paths:**
59
- - Happy: A → B → C(happy) → D → F
60
- - Edge: A → B → C(edge) → E → G
61
- - **Test cases:** `TC-{F_ID}-001`, `TC-{F_ID}-002`, ...
62
-
63
- ---
64
-
65
- ### TS-{F_ID}-002: {Tên — match Flow 2 nếu có}
66
-
67
- ...
68
-
69
- ## Functional Test Cases
70
-
71
- Cover User Stories và Acceptance Criteria trong frd.
72
-
73
- TC ID format: `TC-F{NNN}-{seq}` — đánh số tăng dần toàn feature. ID **stable** (không tái sử dụng seq khi xóa, không renumber). Nếu xóa TC → ID đó retire, seq mới tiếp tục tăng từ max.
74
-
75
- ### TC-{F_ID}-001: {Title ngắn — verb-first}
76
-
77
- | Field | Value |
78
- | --- | --- |
79
- | **Type** | Functional — positive / negative |
80
- | **Priority** | P0 / P1 / P2 |
81
- | **Covers** | `US-{F_ID}-001`, `AC-{F_ID}-001` |
82
- | **Scenario** | `TS-{F_ID}-001` |
83
- | **Preconditions** | ... |
84
-
85
- **Steps:**
86
-
87
- 1. {action}
88
- 2. {action}
89
- 3. {action}
90
-
91
- **Expected:**
92
-
93
- - {observable outcome 1}
94
- - {observable outcome 2}
95
-
96
- **Test data:** {ref Test Data section hoặc inline literal}
97
-
98
- ---
99
-
100
- ### TC-{F_ID}-002: ...
101
-
102
- ## Validation Test Cases
103
-
104
- Derive 1:1 từ Verification Rules trong frd. Mỗi `VR-F{NNN}-{seq}` cần ít nhất:
105
- - 1 positive (rule pass)
106
- - 1+ negative — mỗi nhánh fail là 1 case riêng (vd VR "email format" → 1 case cho missing `@`, 1 case cho missing domain, ...)
107
-
108
- Form bảng để dễ scan; case phức tạp có thể tách ra block riêng như Functional TC.
109
-
110
- | TC ID | Covers VR | Field | Input | Expected | Polarity |
111
- | --- | --- | --- | --- | --- | --- |
112
- | `TC-{F_ID}-010` | `VR-{F_ID}-001` | `email` | `"user@example.com"` | accept | positive |
113
- | `TC-{F_ID}-011` | `VR-{F_ID}-001` | `email` | `""` | reject — required | negative |
114
- | `TC-{F_ID}-012` | `VR-{F_ID}-001` | `email` | `"abc"` | reject — invalid format | negative |
115
-
116
- ## Feature AC Test Cases
117
-
118
- Cover Feature Acceptance Criteria (`FAC-*`) trong frd. Feature AC trong frd đã ở format G/W/T → TC ở đây dịch 1:1: Given → Preconditions, When → Steps, Then → Expected.
119
-
120
- ### TC-{F_ID}-040: {Title — e2e liên story}
121
-
122
- | Field | Value |
123
- | --- | --- |
124
- | **Type** | Feature AC — e2e |
125
- | **Priority** | P0 / P1 / P2 |
126
- | **Covers** | `FAC-{F_ID}-001` |
127
- | **Spans** | `US-{F_ID}-001`, `US-{F_ID}-002`, `US-{F_ID}-003` |
128
- | **Preconditions** | account mới chưa onboard |
129
-
130
- **Steps:**
131
-
132
- 1. Đăng ký account mới
133
- 2. Verify email qua link
134
- 3. Hoàn thành onboarding form
135
- 4. Thực hiện first transaction
136
-
137
- **Expected:**
138
-
139
- - Toàn bộ flow chạy trong 1 session, không cần support intervene
140
- - State persist đúng giữa các step (refresh không mất tiến độ)
141
-
142
- ---
143
-
144
- ### TC-{F_ID}-041: {Title — consistency}
145
-
146
- | Field | Value |
147
- | --- | --- |
148
- | **Type** | Feature AC — consistency |
149
- | **Priority** | P1 |
150
- | **Covers** | `FAC-{F_ID}-002` |
151
- | **Preconditions** | feature đã deploy lên test env, 3 màn Register / Profile / Admin Create accessible |
152
-
153
- **Steps:**
154
-
155
- 1. Trigger empty `email` validation ở Register
156
- 2. Trigger empty `email` validation ở Profile
157
- 3. Trigger empty `email` validation ở Admin Create
158
- 4. Trigger invalid format `"abc"` ở cả 3 màn
159
-
160
- **Expected:**
161
-
162
- - 3 message ở step 1-3 identical (cùng text, cùng style)
163
- - 3 message ở step 4 identical
164
-
165
- ---
166
-
167
- ### TC-{F_ID}-050: {Title — NFR perf}
168
-
169
- | Field | Value |
170
- | --- | --- |
171
- | **Type** | Feature AC — performance |
172
- | **Priority** | P0 |
173
- | **Covers** | `FAC-{F_ID}-003` |
174
- | **Preconditions** | env perf-test, dataset baseline đã load |
175
-
176
- **Steps:**
177
-
178
- 1. Chạy load test (k6 / JMeter) profile 100 RPS sustained 5 phút lên `/login`
179
- 2. Đọc p95 latency từ summary report
180
-
181
- **Expected:**
182
-
183
- - p95 ≤ 500ms
184
- - Error rate ≤ 0.1%
185
-
186
- ## Test Data
187
-
188
- | Data set | Mục đích | Nguồn | Refresh |
189
- | --- | --- | --- | --- |
190
- | `seed_users` | functional positive | fixture / factory | mỗi run |
191
- | `boundary_inputs` | validation edges | inline trong TC | n/a |
192
-
193
- ## Traceability Matrix
194
-
195
- **Source of truth** để verify coverage trước khi đóng feature. Mỗi item từ frd phải xuất hiện. Gap → đánh ❌ và mô tả rõ ở phần "Gaps" bên dưới.
196
-
197
- | FRD Item | Type | Covered by | Status |
198
- | --- | --- | --- | --- |
199
- | Flow 1 | Flow | `TS-{F_ID}-001` | ✅ |
200
- | `US-{F_ID}-001` | US | `TC-{F_ID}-001`, `TC-{F_ID}-002` | ✅ |
201
- | `AC-{F_ID}-001` | Story AC | `TC-{F_ID}-001` | ✅ |
202
- | `VR-{F_ID}-001` | VR | `TC-{F_ID}-010`, `TC-{F_ID}-011`, `TC-{F_ID}-012` | ✅ |
203
- | `FAC-{F_ID}-001` | Feature AC | `TC-{F_ID}-040` | ✅ |
204
- | `FAC-{F_ID}-002` | Feature AC | `TC-{F_ID}-041` | ✅ |
205
- | `FAC-{F_ID}-003` | Feature AC | `TC-{F_ID}-050` | ✅ |
206
- | `AC-{F_ID}-00X` | Story AC | — | ❌ chưa có TC |
207
-
208
- ### Gaps
209
-
210
- {Liệt kê item ❌ kèm lý do tạm hoãn / blocker — empty nếu coverage đầy đủ.}
211
-
212
- ## Out of Scope
213
-
214
- - {những gì tsd này KHÔNG cover — lý do (vd: thuộc layer khác như infra/security audit, đã verify ở môi trường khác, ...)}
215
-
216
- ## Dependencies
217
-
218
- ### FRD reference
219
-
220
- - `frd.md` của feature này — mọi ID (`US-`, `AC-`, `VR-`, Flow) phải match.
221
-
222
- ### Components Used (input only)
223
-
224
- Tham chiếu `frd.md > Components Used` để hiểu contract của các component được feature này dùng. Behavior của component được verify **gián tiếp** qua các TC ở đây — không tách tsd riêng cho component.
225
-
226
- ## Change History
227
-
228
- Append-only log của các thay đổi cascade lên artifact này. Quy ước xem `conventions.md` §5.5.
229
-
230
- <!-- Entry format:
231
- ### YYYY-MM-DD — [{id}-{slug}](../../../integrations/{id}-{slug}/test.md) — create|update|manual
232
-
233
- - **{Section name}**:
234
- - [NEW] {item} — {mô tả ngắn}
235
- - [MODIFY {field}] {item} — {old → new}
236
- - [REMOVE] {item} — {lý do}
237
- -->
238
-