@mmerterden/multi-agent-pipeline 16.4.0 → 16.6.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 +46 -0
- package/docs/features.md +1 -1
- package/install/_mcp-register.mjs +48 -6
- package/package.json +1 -1
- package/pipeline/commands/multi-agent/analysis/SKILL.md +18 -5
- package/pipeline/commands/multi-agent/sync/SKILL.md +8 -9
- package/pipeline/multi-agent-refs/analysis/intake.md +30 -1
- package/pipeline/multi-agent-refs/analysis/locked.md +11 -6
- package/pipeline/multi-agent-refs/analysis/render.md +20 -5
- package/pipeline/multi-agent-refs/analysis/synthesis.md +1 -1
- package/pipeline/multi-agent-refs/analysis-template-corporate.md +436 -0
- package/pipeline/multi-agent-refs/analysis-template.md +31 -13
- package/pipeline/multi-agent-refs/phases/phase-0-init.md +2 -2
- package/pipeline/multi-agent-refs/website-deploy.md +87 -0
- package/pipeline/schemas/analysis-spec.schema.json +21 -1
- package/pipeline/schemas/prefs.schema.json +43 -2
- package/pipeline/scripts/build-references.mjs +368 -0
- package/pipeline/scripts/validate-analysis-doc.mjs +130 -9
- package/pipeline/scripts/website-deploy-commit.sh +97 -0
- package/pipeline/skills/shared/core/multi-agent-analysis/SKILL.md +18 -2
- package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +6 -5
|
@@ -0,0 +1,436 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Corporate profile template for /multi-agent:analysis. Requirements-first BA document: IG / UC / FG spine, three traceability matrices, current-to-target state with impact analysis, then Technical Analysis and Development Analysis. Selected at Phase 0 Step 1b when profile = corporate."
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Analysis Template - Corporate Profile
|
|
6
|
+
|
|
7
|
+
The corporate profile renders a **requirements document**, not a development brief. Its spine is `IG -> UC -> FG`: a business requirement is realised by a use case, which is satisfied by functional requirements, which are served by services. Three matrices prove the chain closes.
|
|
8
|
+
|
|
9
|
+
This is a sibling of `analysis-template.md` (the global profile), not a replacement. Both read the same `state.analysisSpec.evidence.*`; only the projection differs. Phase 0 Step 1b picks one (Locked 32).
|
|
10
|
+
|
|
11
|
+
> **Language**: This file is read as a system prompt, so its prose stays English. Section headings carry TR / EN scaffolds; the renderer picks the column matching `prefs.global.outputLanguage`.
|
|
12
|
+
|
|
13
|
+
> **Punctuation**: Locked 7 applies unchanged. No em-dash, en-dash, ellipsis, curly quotes, or section sign in emitted text.
|
|
14
|
+
|
|
15
|
+
## What the corporate profile changes
|
|
16
|
+
|
|
17
|
+
| Concern | Global profile | Corporate profile |
|
|
18
|
+
|---|---|---|
|
|
19
|
+
| Requirement spine | `BR-<slug>-NN` business rules with Gherkin acceptance criteria | `IG-NN` -> `UC-00N` -> `FG-NN`, plus three cross matrices |
|
|
20
|
+
| Altitude | What to build and how | What is required and why; the how follows in Parts B and C |
|
|
21
|
+
| Current state | Legacy findings are blockquotes inside forward-looking sections (Locked 4) | Section 2.1 is a first-class current-state analysis, and 2.3 is the diff between 2.1 and 2.2 |
|
|
22
|
+
| Empty section | Dropped entirely (Locked 2) | Backbone sections always render, with `N/A` or `EKLENECEK` (Locked 33) |
|
|
23
|
+
| Version history | Section 22 Changelog at the bottom | `DOKÜMAN TARİHÇESİ` table at the top |
|
|
24
|
+
| Use cases | Gherkin scenarios in Section 4 | UC tables with Aktör / Ön Koşul / Ana Akış / Alternatif Akış |
|
|
25
|
+
|
|
26
|
+
Everything else is shared: citation discipline (Locked 3), forward-looking spec for Part B and C (Locked 4), the Figma 3-tier chain (Locked 12), Pass B footnotes (Locked 24), and References at the bottom (Locked 21).
|
|
27
|
+
|
|
28
|
+
## Section map
|
|
29
|
+
|
|
30
|
+
Numbering is fixed for Parts A and B and does not re-flow, because the corporate backbone never drops (Locked 33). Section 5 sub-numbering shifts with the use-case count, exactly as the source documents do.
|
|
31
|
+
|
|
32
|
+
| Layer | Sections | Carries |
|
|
33
|
+
|---|---|---|
|
|
34
|
+
| header | `DOKÜMAN TARİHÇESİ` | version, date, author, change summary |
|
|
35
|
+
| `# Bölüm A - Analiz` | 1 - 9 | the requirement document |
|
|
36
|
+
| `# Bölüm B - Teknik Analiz` | 10 - 16 | what is technically true: design binding, tokens, keys, events, contracts |
|
|
37
|
+
| `# Bölüm C - Geliştirme Analizi` | 17 - 19 | how to build it: architecture, files, tests |
|
|
38
|
+
| footer | 20 - 21 | open questions, references |
|
|
39
|
+
|
|
40
|
+
**Boundary rule** (inherited from the global template): remove a row, and ask what becomes unclear. Part A carries no technology name. Part C carries no business rationale. A row unclear in two layers at once is two rows.
|
|
41
|
+
|
|
42
|
+
**Part C drops when no repo is selected** (Locked 35). Parts A and B always render.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
# Header - DOKÜMAN TARİHÇESİ
|
|
47
|
+
|
|
48
|
+
Never omitted. Renders above Section 1, before the Part A heading.
|
|
49
|
+
|
|
50
|
+
```markdown
|
|
51
|
+
Tarih: <DD.MM.YYYY>
|
|
52
|
+
|
|
53
|
+
Versiyon: <n.n>
|
|
54
|
+
|
|
55
|
+
# DOKÜMAN TARİHÇESİ <!-- TR -->
|
|
56
|
+
# DOCUMENT HISTORY <!-- EN -->
|
|
57
|
+
|
|
58
|
+
| Versiyon | Tarih | Hazırlayan | Açıklama |
|
|
59
|
+
|---|---|---|---|
|
|
60
|
+
| 1.0 | <DD.MM.YYYY> | <identity.name> | İlk sürüm |
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
On a revision, add a row rather than editing the last one, and raise the header `Versiyon`. A content correction takes a minor bump; a scope change takes a major one.
|
|
64
|
+
|
|
65
|
+
**A cancelled requirement is never deleted.** Strike it through and state the decision beside it, in every place it appears: the requirement section, the FG table, and the traceability matrix. Losing the decision history is worse than a longer document.
|
|
66
|
+
|
|
67
|
+
```markdown
|
|
68
|
+
~~<eski gereksinim metni>~~ (<karar mercii> kararıyla iptal edildi)
|
|
69
|
+
|
|
70
|
+
<yerine geçen gereksinim metni>
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
# Bölüm A - Analiz / Part A - Analysis
|
|
76
|
+
|
|
77
|
+
## 1. Amaç ve Kapsam / Purpose and Scope
|
|
78
|
+
|
|
79
|
+
Never omitted.
|
|
80
|
+
|
|
81
|
+
```markdown
|
|
82
|
+
## 1. Amaç ve Kapsam <!-- TR -->
|
|
83
|
+
## 1. Purpose and Scope <!-- EN -->
|
|
84
|
+
|
|
85
|
+
### 1.1 İşin Amacı
|
|
86
|
+
|
|
87
|
+
<2-3 paragraphs: what problem this solves and why it is being done now. Business
|
|
88
|
+
language only. No class name, no endpoint, no framework.>
|
|
89
|
+
|
|
90
|
+
### 1.2 Çözüm Kapsamı
|
|
91
|
+
|
|
92
|
+
<What is in scope, stated as a list of capabilities. Then what is explicitly out
|
|
93
|
+
of scope, each naming what is excluded rather than a vague "out of scope".>
|
|
94
|
+
|
|
95
|
+
| Kısaltma | Açıklama |
|
|
96
|
+
|---|---|
|
|
97
|
+
| <ABBR> | <expansion> |
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
The abbreviation table renders only when the document uses a term a new reader would not know. Terms are defined once here rather than repeated inline.
|
|
101
|
+
|
|
102
|
+
## 2. İş Analizi / Business Analysis
|
|
103
|
+
|
|
104
|
+
Never omitted. This section is what separates a requirements document from a feature brief: it states where the product is now, where it is going, and what the difference costs.
|
|
105
|
+
|
|
106
|
+
```markdown
|
|
107
|
+
## 2. İş Analizi <!-- TR -->
|
|
108
|
+
## 2. Business Analysis <!-- EN -->
|
|
109
|
+
|
|
110
|
+
### 2.1 Mevcut Durum Analizi
|
|
111
|
+
|
|
112
|
+
<What exists today, per channel. Sourced from the running product and from repo
|
|
113
|
+
evidence, cited file:line. This is the ONE place where legacy is the subject
|
|
114
|
+
rather than a footnote.>
|
|
115
|
+
|
|
116
|
+
#### Mevcut Web / Mobil Web Fonksiyonları
|
|
117
|
+
|
|
118
|
+
<numbered list of what the current surface does>
|
|
119
|
+
|
|
120
|
+
#### Mevcut App Fonksiyonları
|
|
121
|
+
|
|
122
|
+
<numbered list, or "Desktop ile aynı" plus the differences only>
|
|
123
|
+
|
|
124
|
+
#### Sekme/İşlev Bazlı Matris
|
|
125
|
+
|
|
126
|
+
| # | İşlev | Mevcut Destek | Açıklama |
|
|
127
|
+
|---|---|---|---|
|
|
128
|
+
| 1 | <capability> | Var / Yok / Kısmi | <detail> |
|
|
129
|
+
|
|
130
|
+
### 2.2 Hedeflenen Durum Analizi
|
|
131
|
+
|
|
132
|
+
<What the product will do once this work ships. Sourced from the design and the
|
|
133
|
+
scope document, cited by Figma node id (Locked 12) or Confluence page and
|
|
134
|
+
heading (Locked 3).>
|
|
135
|
+
|
|
136
|
+
#### Desktop
|
|
137
|
+
#### Mobile Web
|
|
138
|
+
#### App
|
|
139
|
+
|
|
140
|
+
<Per channel. When a channel is identical to another, say so in one line and
|
|
141
|
+
list only the differences. Repeating an identical flow three times hides the
|
|
142
|
+
one line that actually differs.>
|
|
143
|
+
|
|
144
|
+
### 2.3 Değişiklik Etki Analizi
|
|
145
|
+
|
|
146
|
+
<The diff between 2.1 and 2.2, and what it touches. This section is the whole
|
|
147
|
+
reason 2.1 and 2.2 are separate; if it is empty, one of them was not done.>
|
|
148
|
+
|
|
149
|
+
| Etkilenen Alan | Mevcut Davranış | Hedeflenen Davranış | Etki |
|
|
150
|
+
|---|---|---|---|
|
|
151
|
+
| <area> | <from 2.1> | <from 2.2> | <what has to change> |
|
|
152
|
+
|
|
153
|
+
### 2.4 Kısıtlar, Varsayımlar, Bağımlılıklar
|
|
154
|
+
|
|
155
|
+
| Tür | Madde | Kaynak |
|
|
156
|
+
|---|---|---|
|
|
157
|
+
| Kısıt | <constraint> | <citation> |
|
|
158
|
+
| Varsayım | <assumption> | <citation or "doğrulanmadı"> |
|
|
159
|
+
| Bağımlılık | <dependency> | <citation> |
|
|
160
|
+
|
|
161
|
+
<An unverified assumption also emits a Section 20 row. An assumption nobody
|
|
162
|
+
checked is a risk wearing a different hat.>
|
|
163
|
+
|
|
164
|
+
### 2.5 Kullanıcılar ve Rolleri
|
|
165
|
+
|
|
166
|
+
| Rol | Tanım | Bu akıştaki yetkisi |
|
|
167
|
+
|---|---|---|
|
|
168
|
+
| <role> | <who they are> | <what they may do here> |
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
## 3. İş Gereksinimleri / Business Requirements
|
|
172
|
+
|
|
173
|
+
Never omitted. The `IG` half of the spine.
|
|
174
|
+
|
|
175
|
+
```markdown
|
|
176
|
+
## 3. İş Gereksinimleri <!-- TR -->
|
|
177
|
+
## 3. Business Requirements <!-- EN -->
|
|
178
|
+
|
|
179
|
+
| No | İş Gereksinimi | İlgili UC |
|
|
180
|
+
|---|---|---|
|
|
181
|
+
| IG-01 | <what the business requires, one sentence, no solution wording> | UC-001, UC-002 |
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
Rules the renderer enforces:
|
|
185
|
+
|
|
186
|
+
- An `IG` states a requirement, not a screen. "Üye şifresini sıfırlayabilmelidir" is an IG; "Şifre sıfırlama ekranında Devam butonu bulunur" is an FG.
|
|
187
|
+
- Every `IG` carries at least one `UC` in `İlgili UC`. An IG no use case realises is either a missing UC or an IG that does not belong.
|
|
188
|
+
- Ids are stable across revisions. A cancelled IG keeps its number and is struck through; numbers are never reused.
|
|
189
|
+
|
|
190
|
+
## 4. Yapay Zeka Gereksinimleri / AI Requirements
|
|
191
|
+
|
|
192
|
+
Renders `N/A` when the feature has no model-backed behaviour (Locked 33). When it does, each row states the decision the model makes, the input it sees, and the fallback when it is unavailable.
|
|
193
|
+
|
|
194
|
+
```markdown
|
|
195
|
+
## 4. Yapay Zeka Gereksinimleri <!-- TR -->
|
|
196
|
+
## 4. AI Requirements <!-- EN -->
|
|
197
|
+
|
|
198
|
+
| No | Gereksinim | Girdi | Model / Servis | Belirsizlik davranışı |
|
|
199
|
+
|---|---|---|---|---|
|
|
200
|
+
| YZ-01 | <what it decides> | <inputs> | <service> | <fallback when unavailable or low confidence> |
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
## 5. Kullanım Senaryoları / Use Cases
|
|
204
|
+
|
|
205
|
+
Never omitted. The `UC` and `FG` halves of the spine, plus the service binding and the three matrices.
|
|
206
|
+
|
|
207
|
+
Sub-numbering shifts with the use-case count. For `N` use cases:
|
|
208
|
+
|
|
209
|
+
```
|
|
210
|
+
5.1 .. 5.N UC-001 .. UC-00N (each with an Ekranlar sub-block)
|
|
211
|
+
5.(N+1) Kullanım Senaryosu Diyagramları
|
|
212
|
+
5.(N+2) Kullanım Senaryosu - İş Gereksinimi Eşleştirme
|
|
213
|
+
5.(N+3) Fonksiyonel Gereksinimler
|
|
214
|
+
5.(N+4) Servis Detayları
|
|
215
|
+
5.(N+5) Servis - Fonksiyonel Gereksinim Eşleştirmesi
|
|
216
|
+
5.(N+6) Gereksinim İzlenebilirlik Matrisi
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
### Use-case table (5.1 .. 5.N)
|
|
220
|
+
|
|
221
|
+
```markdown
|
|
222
|
+
## 5.<i> UC-00<i>: <Senaryo Adı>
|
|
223
|
+
|
|
224
|
+
| No | UC-00<i> |
|
|
225
|
+
|---|---|
|
|
226
|
+
| **Kullanım Senaryosu Adı** | <name> |
|
|
227
|
+
| **Aktör** | <role from 2.5> |
|
|
228
|
+
| **Kısa Açıklama** | <one or two sentences> |
|
|
229
|
+
| **Ön Koşul** | <what must be true before the flow starts> |
|
|
230
|
+
| **Kullanım Sıklığı** | <how often> |
|
|
231
|
+
| **Ana Akış** | 1. <step> 2. <step> 3. <step> |
|
|
232
|
+
| **Alternatif Akış** | 2a. <alternative to step 2> 4a. <alternative to step 4> |
|
|
233
|
+
| **İş Kuralları / Referans** | IG-01, IG-03 |
|
|
234
|
+
|
|
235
|
+
### Ekranlar
|
|
236
|
+
|
|
237
|
+
| Kanal | Tasarım |
|
|
238
|
+
|---|---|
|
|
239
|
+
| Desktop | [Tasarım Linki](<figma url with node-id>) |
|
|
240
|
+
| Mobile Web | [Tasarım Linki](<figma url with node-id>) |
|
|
241
|
+
| App | [Tasarım Linki](<figma url with node-id>) |
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
Rules the renderer enforces:
|
|
245
|
+
|
|
246
|
+
- **Ana Akış is numbered and single-directional.** A nested option takes a second-level number under its step.
|
|
247
|
+
- **Alternatif Akış always binds to a main-flow step**: `2a.`, `2b.`, `4a.`. A free-floating alternative sentence is rejected, because a reader cannot tell which step it replaces.
|
|
248
|
+
- **Concrete limits appear only when a source states them.** A threshold nobody wrote down is invented (Locked 3), and an invented threshold in a requirements document reaches production as a bug.
|
|
249
|
+
- **FG references inside main-flow steps are optional but must be consistent.** Either every use case cites them or none does; half a document doing it reads as an omission.
|
|
250
|
+
|
|
251
|
+
### 5.(N+1) Kullanım Senaryosu Diyagramları
|
|
252
|
+
|
|
253
|
+
One mermaid diagram per use case, under a `### UC-00<i>: <name>` heading. The diagram shows the flow, including the alternative branches named in the table.
|
|
254
|
+
|
|
255
|
+
### 5.(N+2) Kullanım Senaryosu - İş Gereksinimi Eşleştirme
|
|
256
|
+
|
|
257
|
+
```markdown
|
|
258
|
+
| Kullanım Senaryosu | İlgili İş Gereksinimleri |
|
|
259
|
+
|---|---|
|
|
260
|
+
| UC-001: <name> | IG-01, IG-02 |
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
### 5.(N+3) Fonksiyonel Gereksinimler
|
|
264
|
+
|
|
265
|
+
```markdown
|
|
266
|
+
| No | Fonksiyonel Gereksinim | Kaynak UC | Kaynak IG |
|
|
267
|
+
|---|---|---|---|
|
|
268
|
+
| FG-01 | Sistem, <what the system does>. | UC-001 | IG-01 |
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
Every `FG` sentence starts with `Sistem,` in Turkish output and `The system shall` in English output. This is not a style preference: it forces the requirement to name a system behaviour rather than a user wish, which is what makes it testable.
|
|
272
|
+
|
|
273
|
+
Every `FG` carries both a source `UC` and a source `IG`. An FG with no source IG is either an unrecorded business requirement or an invented feature; both are findings, not rows.
|
|
274
|
+
|
|
275
|
+
### 5.(N+4) Servis Detayları
|
|
276
|
+
|
|
277
|
+
One table per service. Contracts come from the live specification, never from prose (Locked 17: every status code the endpoint returns is listed, with an example body).
|
|
278
|
+
|
|
279
|
+
```markdown
|
|
280
|
+
| **Name** | <operation name> |
|
|
281
|
+
|---|---|
|
|
282
|
+
| **Path** | [<path>](<spec url>) |
|
|
283
|
+
| **Method** | GET / POST / PUT / DELETE |
|
|
284
|
+
| **Description** | <what it does> |
|
|
285
|
+
| **Success and error codes** | **200** <meaning> **401** <meaning> **403** <meaning> |
|
|
286
|
+
| **Request** | <example body, fenced> |
|
|
287
|
+
| **Response** | <example body, fenced> |
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
A session-bound service states its token requirement in the `Request` cell. A service that does not exist yet is named with an explicit note rather than a guessed path.
|
|
291
|
+
|
|
292
|
+
### 5.(N+5) Servis - Fonksiyonel Gereksinim Eşleştirmesi
|
|
293
|
+
|
|
294
|
+
```markdown
|
|
295
|
+
| Servis | Karşıladığı FG |
|
|
296
|
+
|---|---|
|
|
297
|
+
| <operation name> | FG-01, FG-04 |
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
### 5.(N+6) Gereksinim İzlenebilirlik Matrisi
|
|
301
|
+
|
|
302
|
+
```markdown
|
|
303
|
+
| İş Gereksinimi | Kullanım Senaryosu | Fonksiyonel Gereksinim | Servis |
|
|
304
|
+
|---|---|---|---|
|
|
305
|
+
| IG-01 | UC-001 | FG-01, FG-02 | <operation name> |
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
**This matrix is the most expensive thing in the document to get wrong**, because every downstream reader trusts it instead of re-deriving the chain.
|
|
309
|
+
|
|
310
|
+
`validate-analysis-doc.mjs` enforces one half of that mechanically, and it blocks dispatch: **every `IG`, `UC` and `FG` id defined anywhere in the document appears in the matrix, and every id in the matrix is defined somewhere else.** A row invented in the matrix and a requirement quietly missing from it both fail.
|
|
311
|
+
|
|
312
|
+
The rest is the renderer's obligation, checked by reading rather than by a script. State it as an instruction, not as a guarantee:
|
|
313
|
+
|
|
314
|
+
- every `IG` appears in at least one `UC`, and every `UC` cites at least one `IG`
|
|
315
|
+
- every `FG` names a source `UC` and a source `IG` that exist
|
|
316
|
+
- a struck-through requirement is struck through in all four places it appears
|
|
317
|
+
|
|
318
|
+
## 6. Donanım ve Altyapı / Hardware and Infrastructure
|
|
319
|
+
|
|
320
|
+
```markdown
|
|
321
|
+
## 6. Donanım ve Altyapı <!-- TR -->
|
|
322
|
+
## 6. Hardware and Infrastructure <!-- EN -->
|
|
323
|
+
|
|
324
|
+
### 6.1 Donanım Gereksinimleri
|
|
325
|
+
### 6.2 Altyapı Gereksinimleri
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
Both render `N/A` when the feature adds no hardware or infrastructure need, which is the common case for a UI feature.
|
|
329
|
+
|
|
330
|
+
## 7. Kalite Gereksinimleri / Quality Requirements
|
|
331
|
+
|
|
332
|
+
Requirement altitude, not implementation. The implementation of these lives in Part B.
|
|
333
|
+
|
|
334
|
+
```markdown
|
|
335
|
+
## 7. Kalite Gereksinimleri <!-- TR -->
|
|
336
|
+
## 7. Quality Requirements <!-- EN -->
|
|
337
|
+
|
|
338
|
+
### 7.1 Erişilebilirlik Gereksinimleri
|
|
339
|
+
### 7.2 Performans Gereksinimleri
|
|
340
|
+
### 7.3 Güvenlik Gereksinimleri
|
|
341
|
+
### 7.4 Uyumluluk Gereksinimleri
|
|
342
|
+
### 7.5 Bakım Gereksinimleri
|
|
343
|
+
### 7.6 Entegrasyon Gereksinimleri
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
Each renders a measurable statement or `N/A`. "Sayfa hızlı açılmalıdır" is not a performance requirement; a stated budget is.
|
|
347
|
+
|
|
348
|
+
## 8. Regülasyonel Gereksinimler / Regulatory Requirements
|
|
349
|
+
|
|
350
|
+
```markdown
|
|
351
|
+
## 8. Regülasyonel Gereksinimler <!-- TR -->
|
|
352
|
+
## 8. Regulatory Requirements <!-- EN -->
|
|
353
|
+
|
|
354
|
+
### 8.1 Mevzuat Gereksinimleri
|
|
355
|
+
### 8.2 Yasal Gereksinimler
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
A regulatory claim carries its source. An uncited regulatory sentence is worse than an omission, because it will be believed.
|
|
359
|
+
|
|
360
|
+
## 9. İçerik Gereksinimleri / Content Requirements
|
|
361
|
+
|
|
362
|
+
Which user-facing copy this feature needs, who owns it, and where it comes from. The key-level detail belongs to Part B Section 12; this section is the ownership statement.
|
|
363
|
+
|
|
364
|
+
```markdown
|
|
365
|
+
## 9. İçerik Gereksinimleri <!-- TR -->
|
|
366
|
+
## 9. Content Requirements <!-- EN -->
|
|
367
|
+
|
|
368
|
+
| İçerik | Kanal | Sahibi | Kaynak | Durum |
|
|
369
|
+
|---|---|---|---|---|
|
|
370
|
+
| <copy item> | Desktop / Mobile Web / App | <owner> | CMS / repo / Figma annotation | hazır / EKLENECEK |
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
---
|
|
374
|
+
|
|
375
|
+
# Bölüm B - Teknik Analiz / Part B - Technical Analysis
|
|
376
|
+
|
|
377
|
+
Part B carries what is technically true. It reuses the global template's scaffolds verbatim, renumbered. Read `analysis-template.md` for each one; only the number changes.
|
|
378
|
+
|
|
379
|
+
| Corporate | Global | Section |
|
|
380
|
+
|---|---|---|
|
|
381
|
+
| 10 | 5 + 6 | Tasarım Referansı ve Bileşen Envanteri / Design Reference and Component Inventory |
|
|
382
|
+
| 11 | 7 + 8 | Tasarım Token'ları ve Asset Envanteri / Design Tokens and Asset Inventory |
|
|
383
|
+
| 12 | 10 | Lokalizasyon Anahtarları / Localization Keys |
|
|
384
|
+
| 13 | 11 | Analytics |
|
|
385
|
+
| 14 | 12 | Deeplink ve Push Notification / Deeplink and Push |
|
|
386
|
+
| 15 | 16 | Erişilebilirlik Uygulaması / Accessibility Implementation |
|
|
387
|
+
| 16 | 17 | Güvenlik ve Gizlilik Uygulaması / Security and Privacy Implementation |
|
|
388
|
+
|
|
389
|
+
**API contracts are not repeated here.** They live in Section 5.(N+4), bound to the functional requirements they serve. The global template's Section 9 has no corporate counterpart for that reason.
|
|
390
|
+
|
|
391
|
+
Sections 15 and 16 are the implementation of the requirements stated in 7.1 and 7.3. State the requirement once, in Part A, and the implementation once, here. A sentence that appears in both is a sentence one of the two sections did not need.
|
|
392
|
+
|
|
393
|
+
Part B follows the global omission table: a section with zero evidence drops. The corporate backbone guarantee (Locked 33) covers Part A and the References section, not Part B.
|
|
394
|
+
|
|
395
|
+
---
|
|
396
|
+
|
|
397
|
+
# Bölüm C - Geliştirme Analizi / Part C - Development Analysis
|
|
398
|
+
|
|
399
|
+
Identical to the global template's Sections 13, 14 and 15, renumbered:
|
|
400
|
+
|
|
401
|
+
| Corporate | Global | Section |
|
|
402
|
+
|---|---|---|
|
|
403
|
+
| 17 | 13 | Mimari Plan / Architecture Plan |
|
|
404
|
+
| 18 | 14 | Eklenecek Dosyalar / Files to Add |
|
|
405
|
+
| 19 | 15 | Test Planı / Test Plan |
|
|
406
|
+
|
|
407
|
+
Part C is written against the conventions extracted at Phase 1c, and every projected cell carries its Pass B footnote (Locked 24).
|
|
408
|
+
|
|
409
|
+
**Part C drops entirely when no repo was selected** (Locked 35). The document then ends after Part B, and Section 20 carries a row stating that the development analysis awaits a repo selection. Parts A and B are complete on their own; a requirements document does not need a target repository to be useful.
|
|
410
|
+
|
|
411
|
+
**Traceability into Part C.** The `FG` ids are the join. Section 19's unit-test rows cite the `FG` they cover, the same way the global profile's rows cite `BR-` ids (Locked 31). An `FG` with no test row in Full mode fails the dispatch gate.
|
|
412
|
+
|
|
413
|
+
---
|
|
414
|
+
|
|
415
|
+
# Footer
|
|
416
|
+
|
|
417
|
+
## 20. Riskler ve Açık Sorular / Risks and Open Questions
|
|
418
|
+
|
|
419
|
+
Never omitted.
|
|
420
|
+
|
|
421
|
+
```markdown
|
|
422
|
+
## 20. Riskler ve Açık Sorular <!-- TR -->
|
|
423
|
+
## 20. Risks and Open Questions <!-- EN -->
|
|
424
|
+
|
|
425
|
+
| # | Konu | Neden açık | Kime sorulacak | Etkilediği bölüm |
|
|
426
|
+
|---|---|---|---|---|
|
|
427
|
+
| 1 | <question> | <what evidence is missing> | <role or team> | 2.3 |
|
|
428
|
+
```
|
|
429
|
+
|
|
430
|
+
The source corporate documents keep open questions out of the page and raise them in conversation instead. This profile keeps them in the document deliberately: an `EKLENECEK` with no matching row here is an unanswered question nobody owns. Every `EKLENECEK` and every unverified assumption in 2.4 emits a row (Locked 33).
|
|
431
|
+
|
|
432
|
+
## 21. Referanslar / References
|
|
433
|
+
|
|
434
|
+
Never omitted. Built deterministically by `~/.claude/scripts/build-references.mjs` from `state.analysisSpec.evidence.*`; the model does not hand-write this table. Shared with the global profile, where it is Section 21 as well.
|
|
435
|
+
|
|
436
|
+
See `analysis-template.md` Section 21 for the column contract and the coverage gate.
|
|
@@ -42,7 +42,8 @@ Every per-platform file starts with this YAML block:
|
|
|
42
42
|
```yaml
|
|
43
43
|
---
|
|
44
44
|
feature: <FeatureName>
|
|
45
|
-
platform: ios | android | backend | frontend
|
|
45
|
+
platform: ios | android | backend | frontend | none
|
|
46
|
+
profile: global | corporate
|
|
46
47
|
language: tr | en
|
|
47
48
|
mode: full | lite
|
|
48
49
|
ui_tests: true | false
|
|
@@ -63,6 +64,8 @@ template_version: v3
|
|
|
63
64
|
|
|
64
65
|
`ui_tests` and `a11y_depth` record the Phase 0 Step 5a opt-ins (defaults `false` / `basic`) so the coverage choice is auditable and the pre-dispatch validator can enforce it: `ui_tests: true` requires Section 15.6, `a11y_depth: full` requires the Section 16.2 walkthrough.
|
|
65
66
|
|
|
67
|
+
`profile` names the template the document was rendered against (Locked 32) and `platform: none` marks the stack-optional render (Locked 35). Both are read by `validate-analysis-doc.mjs`, which applies a different contract per profile: without the key a corporate document would be judged against the global rules and its backbone would read as a pile of Locked 2 violations.
|
|
68
|
+
|
|
66
69
|
Phase 1 compares `evidence_digest` against an existing document to decide whether to reuse it (Locked 27). Phase 3 reads `platform` to verify file match, `mode` to know which section set to expect, and both `evidence_digest` and `base_commit` to judge freshness: the digest says the evidence changed, `base_commit` says the repo moved. Phase 2 parses the block but gates only on `template_version`.
|
|
67
70
|
|
|
68
71
|
## Layer headings (A / B / C)
|
|
@@ -912,25 +915,40 @@ Auto-populated rows (Locked 11, 23): repo-evidence direct-match candidates that
|
|
|
912
915
|
|
|
913
916
|
## 21. Referanslar / References
|
|
914
917
|
|
|
915
|
-
Never omitted
|
|
918
|
+
Never omitted (Locked 21 - at the bottom, not at the top). Shared verbatim by both profiles.
|
|
919
|
+
|
|
920
|
+
**Built deterministically, not written by the model.** `~/.claude/scripts/build-references.mjs` reads `state.analysisSpec.evidence.*` and emits this table. A hand-written references table drifts from what the run actually read: it lists what the author remembers consulting, which is a different set from what the evidence gathering fetched. Every row here is a source the run touched.
|
|
916
921
|
|
|
917
922
|
```markdown
|
|
918
923
|
## 21. Referanslar <!-- TR -->
|
|
919
924
|
## 21. References <!-- EN -->
|
|
920
925
|
|
|
921
|
-
| Tür / Type | Kaynak / Source | URL
|
|
922
|
-
|
|
923
|
-
|
|
|
924
|
-
|
|
|
925
|
-
|
|
|
926
|
-
|
|
|
927
|
-
|
|
|
928
|
-
|
|
|
929
|
-
|
|
|
930
|
-
|
|
|
931
|
-
|
|
|
926
|
+
| Tür / Type | Kaynak / Source | URL / Yol | Sürüm / Ref | Rol / Role | Erişim / Access | Notlar / Notes |
|
|
927
|
+
|---|---|---|---|---|---|---|
|
|
928
|
+
| Figma | <design name> | <url> | node-id=<nodeId> | UI design | ok (Tier <n>) | <n frames> |
|
|
929
|
+
| Confluence | <spec name> | <url> | pageId=<id> v<n> | feature spec | ok | - |
|
|
930
|
+
| Confluence | <api contract> | <url> | pageId=<id> v<n> | API contract | ok | <endpoint summary> |
|
|
931
|
+
| Jira | <ticket id> | <url> | - | ticket | ok | <summary> |
|
|
932
|
+
| Swagger | <api name> | <url> | <spec version> | API contract | ok | <n endpoints> |
|
|
933
|
+
| Repo | <module> | <repo path> | <commit sha> | existing implementation | ok | <reuse summary> |
|
|
934
|
+
| Standards | <name> | <url or path> | <version> | binding | ok | <kind> |
|
|
935
|
+
| Firebase | events | <console url> | - | reference only | erişilemedi (auth) | <n events> |
|
|
936
|
+
| Doküman | <file name> | <local path> | <format> | scope document | ok | - |
|
|
937
|
+
| Dış kaynak | <name> | <url> | <citation> | referans | ok | <claim> |
|
|
938
|
+
| Serbest metin | kullanıcı notu | - | - | <what it settled> | - | "<verbatim quote>" |
|
|
939
|
+
| Confluence | <unreachable page> | <url> | - | getirilemedi | erişilemedi (403) | - |
|
|
932
940
|
```
|
|
933
941
|
|
|
942
|
+
These row types are exactly what `build-references.mjs` emits, and the example is kept in step with it deliberately: a shape shown here but never produced would send a reader hand-checking against a table that cannot exist. A wiki source arrives as a `Standards` row carrying `wiki` in its `kind` cell, and a generated OpenAPI client arrives as the `Repo` row of the module that holds it; neither has a row type of its own.
|
|
943
|
+
|
|
944
|
+
**Column contract.**
|
|
945
|
+
|
|
946
|
+
- **Sürüm / Ref** is the precision anchor: the node id for a Figma frame, `pageId` plus page version for Confluence, the commit SHA the repo was read at, the spec version for Swagger. Without it a reference points at a moving target, and a reader six weeks later cannot tell whether the document described what they are looking at.
|
|
947
|
+
- **Erişim / Access** is `ok` or `erişilemedi (<reason>)`. A source that was declared but could not be fetched still gets a row. Dropping it hides the gap: the reader sees a document that never mentions the API contract and assumes there was none, rather than knowing it was unreachable.
|
|
948
|
+
- **Serbest metin** rows carry what the user stated in conversation that no fetched source contains, quoted verbatim, with the decision it settled in the `Rol` column. Scope decisions made in chat are evidence; leaving them out is how a document loses the reason it excluded something.
|
|
949
|
+
|
|
950
|
+
**Coverage gate (Locked 34).** Before the document is emitted, the validator compares this table against the evidence record. Every entry in `evidence.figma[]`, `evidence.confluence[]`, `evidence.jira[]`, `evidence.swagger[]`, `evidence.repo[]`, `evidence.standards[]`, `evidence.firebase[]`, `evidence.documents[]`, `evidence.outside[]`, `evidence.freeText[]` and every entry in `evidence.fetchErrors[]` must appear as a row. A source that shaped the document but is missing from References fails the dispatch gate, and a row with no matching evidence entry fails it too - an invented reference is worse than a missing one.
|
|
951
|
+
|
|
934
952
|
## 22. Sözlük / Glossary
|
|
935
953
|
|
|
936
954
|
Footer. Optional in Lite mode. Alphabetical.
|
|
@@ -118,8 +118,8 @@ Run `bash $HOME/.claude/scripts/update-check.sh` (cached per `updateCheck.ttlHou
|
|
|
118
118
|
|
|
119
119
|
**Advisory branch (never blocks).**
|
|
120
120
|
|
|
121
|
-
- **Interactive**:
|
|
122
|
-
- **Autopilot**: never ask (zero-interaction contract).
|
|
121
|
+
- **Interactive**: `updateCheck.autoUpdate` defaults to `true`, so do not ask - run the `/multi-agent:update` flow, log `→ updated to v<latest>`, continue (docs already loaded finish this run on the old version; full effect next run). Only `autoUpdate: false` makes it a question: log `→ update available: v<local> -> v<latest>`, ask ONE AskUserQuestion - **Update now** (recommended) / **Continue without updating**; on *Continue*, no re-ask until the TTL expires.
|
|
122
|
+
- **Autopilot**: never ask (zero-interaction contract). On the default it updates first, logging `→ updated to v<latest>`; on `autoUpdate: false` it is log-only and continues.
|
|
123
123
|
|
|
124
124
|
Both branches must run BEFORE Step 6 (worktree creation) so an accepted or forced update cannot mutate `~/.claude` under a mid-phase run.
|
|
125
125
|
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# Website deploy: why the commit author decides whether the site updates
|
|
2
|
+
|
|
3
|
+
Loaded by `/multi-agent:sync` Step 4. Read it when a website sync pushed cleanly
|
|
4
|
+
and the live site did not change.
|
|
5
|
+
|
|
6
|
+
## The failure
|
|
7
|
+
|
|
8
|
+
The deploy platform builds a commit only when its author is a contributor on the
|
|
9
|
+
project. A commit carrying any other identity is accepted by `git push` and then
|
|
10
|
+
never built:
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
vercel ls -> Status UNKNOWN Duration ? Builds: . [0ms]
|
|
14
|
+
API -> readyState: "BLOCKED"
|
|
15
|
+
readyStateReason: "The Deployment was blocked because the commit
|
|
16
|
+
author does not have contributing access ..."
|
|
17
|
+
seatBlock: { blockCode: "TEAM_ACCESS_REQUIRED", gitProvider: "github" }
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Nothing in the push output says so, the deployment exists, and the site keeps
|
|
21
|
+
serving the previous version. Pipeline v16.4.0 and v16.5.0 were both pushed this
|
|
22
|
+
way; neither was ever built, and both syncs reported the website as done.
|
|
23
|
+
|
|
24
|
+
## The rule
|
|
25
|
+
|
|
26
|
+
The identity is the one `prefs.global.identities[]` routes to the website owner
|
|
27
|
+
through `platformIdentityRouting`, which is not always the account the current run
|
|
28
|
+
is working under. A run driven from a work account, or an exported
|
|
29
|
+
`GIT_AUTHOR_EMAIL`, is exactly how the wrong author gets recorded.
|
|
30
|
+
|
|
31
|
+
`$HOME/.claude/scripts/website-deploy-commit.sh` applies the rule:
|
|
32
|
+
|
|
33
|
+
1. Read the clone's own `user.name` / `user.email` and write only on a mismatch.
|
|
34
|
+
The website clone is usually already configured correctly; overwriting it with
|
|
35
|
+
the caller's identity is the defect, not the fix.
|
|
36
|
+
2. Commit only when something is staged.
|
|
37
|
+
3. Read the author back off the commit with `git log -1 --format=%ae`. Setting
|
|
38
|
+
`git config` is not proof: an exported `GIT_AUTHOR_EMAIL` outranks it. On a
|
|
39
|
+
mismatch the script halts before pushing, so the bad commit stays local.
|
|
40
|
+
4. Push, then wait for a Ready production build. A push is not a deploy.
|
|
41
|
+
|
|
42
|
+
Exit codes: `0` committed and pushed (or nothing to do), `1` wrong author and
|
|
43
|
+
nothing pushed, `2` usage or environment, `3` pushed but no Ready build.
|
|
44
|
+
|
|
45
|
+
Env: `WEBSITE_SYNC_NO_PUSH=1` (local only), `WEBSITE_SYNC_NO_VERIFY=1` (skip the
|
|
46
|
+
deployment check), `WEBSITE_SYNC_WAIT=<sec>` (default 45).
|
|
47
|
+
|
|
48
|
+
## Recovery when a deployment is already blocked
|
|
49
|
+
|
|
50
|
+
History does not need rewriting, and `main` is never force-pushed. The platform
|
|
51
|
+
checks the HEAD commit of each new deployment, so a fresh commit under the right
|
|
52
|
+
identity is enough:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
git commit --allow-empty -m "chore(site): redeploy under the maintainer identity"
|
|
56
|
+
git push origin main
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Or deploy from the CLI, which attaches no rejected author:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
cd "$WEBSITE_DIR" && vercel --prod --yes
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Blocked deployments can be left in place; they hold no alias.
|
|
66
|
+
|
|
67
|
+
## Diagnosing
|
|
68
|
+
|
|
69
|
+
The CLI prints `UNKNOWN` and hides the reason; the API gives it:
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
GET https://api.vercel.com/v13/deployments/<dpl_id>?teamId=<team_id>
|
|
73
|
+
-> readyState, readyStateReason, seatBlock
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Read the CLI token out of its own auth file into a variable. Never into argv, a
|
|
77
|
+
log or a reply.
|
|
78
|
+
|
|
79
|
+
## Verifying the live site
|
|
80
|
+
|
|
81
|
+
- The repo directory name is not the domain. Check the domain the project
|
|
82
|
+
actually serves, not `$HOME/{website-host}`.
|
|
83
|
+
- Version strings and counts are server-rendered and appear in the initial HTML.
|
|
84
|
+
Feature prose and lazily-loaded components do not: grep the JS chunks for those.
|
|
85
|
+
- A `curl` on the HTML can return 403 bot mitigation (`x-vercel-mitigated:
|
|
86
|
+
challenge`) rather than the page, which reads like content that never shipped.
|
|
87
|
+
Static assets are not challenged.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "https://github.com/{owner}/multi-agent-pipeline/pipeline/schemas/analysis-spec.schema.json",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.3.0",
|
|
5
5
|
"title": "Multi-Agent Pipeline - /multi-agent:analysis spec output (v3 template)",
|
|
6
6
|
"description": "Contract for the feature-spec analysis document generated by /multi-agent:analysis. Platform-agnostic concept layer + Pass B per-platform render with repo-driven conventions. 23 sections in Full mode; 8 of them in Lite mode. Sections may be absent - omission is the policy when no evidence exists.",
|
|
7
7
|
"type": "object",
|
|
@@ -49,6 +49,12 @@
|
|
|
49
49
|
"default": "v3",
|
|
50
50
|
"description": "Template version emitted. v3 is the platform-agnostic + Pass B render template (Locked 22)."
|
|
51
51
|
},
|
|
52
|
+
"profile": {
|
|
53
|
+
"type": "string",
|
|
54
|
+
"enum": ["global", "corporate"],
|
|
55
|
+
"default": "global",
|
|
56
|
+
"description": "Analysis profile chosen at Phase 0 Step 1b (Locked 32). 'global' renders analysis-template.md (23-section development handoff); 'corporate' renders analysis-template-corporate.md (IG/UC/FG requirements document). Both read the same evidence; only the projection differs."
|
|
57
|
+
},
|
|
52
58
|
"options": {
|
|
53
59
|
"type": "object",
|
|
54
60
|
"additionalProperties": false,
|
|
@@ -523,6 +529,20 @@
|
|
|
523
529
|
}
|
|
524
530
|
}
|
|
525
531
|
},
|
|
532
|
+
"freeText": {
|
|
533
|
+
"type": "array",
|
|
534
|
+
"description": "User statements made in conversation that no fetched source carries, recorded so Section 21 can cite the decisions they settled (Locked 34).",
|
|
535
|
+
"items": {
|
|
536
|
+
"type": "object",
|
|
537
|
+
"additionalProperties": false,
|
|
538
|
+
"required": ["text"],
|
|
539
|
+
"properties": {
|
|
540
|
+
"label": { "type": "string" },
|
|
541
|
+
"text": { "type": "string" },
|
|
542
|
+
"role": { "type": "string" }
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
},
|
|
526
546
|
"fetchErrors": {
|
|
527
547
|
"type": "array",
|
|
528
548
|
"description": "Phase 1 access failures (401/403/login-redirect). Surfaced as warnings, not blockers.",
|