@mmerterden/multi-agent-pipeline 16.21.0 → 16.24.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 (47) hide show
  1. package/CHANGELOG.md +230 -103
  2. package/README.md +5 -7
  3. package/README.tr.md +5 -7
  4. package/docs/architecture.md +3 -3
  5. package/docs/ecosystem.md +5 -5
  6. package/install/templates/copilot-instructions.md +17 -2
  7. package/package.json +1 -1
  8. package/pipeline/commands/multi-agent/SKILL.md +0 -5
  9. package/pipeline/commands/multi-agent/help/SKILL.md +0 -10
  10. package/pipeline/commands/multi-agent/ios-coding-standard/SKILL.md +2 -2
  11. package/pipeline/commands/multi-agent/local-autopilot/SKILL.md +1 -1
  12. package/pipeline/commands/multi-agent/resume-local/SKILL.md +2 -2
  13. package/pipeline/commands/multi-agent/sync/SKILL.md +13 -13
  14. package/pipeline/multi-agent-refs/channels/jira.md +7 -0
  15. package/pipeline/multi-agent-refs/channels/pr.md +16 -3
  16. package/pipeline/multi-agent-refs/cross-cli-contract.md +10 -12
  17. package/pipeline/multi-agent-refs/features/visual-evidence.md +172 -0
  18. package/pipeline/multi-agent-refs/generate-issue.md +3 -3
  19. package/pipeline/multi-agent-refs/phases/modes.md +1 -1
  20. package/pipeline/multi-agent-refs/phases/phase-0-init.md +9 -2
  21. package/pipeline/multi-agent-refs/phases/phase-3-dev.md +5 -1
  22. package/pipeline/multi-agent-refs/phases/phase-5-test.md +1 -0
  23. package/pipeline/multi-agent-refs/phases/phase-6-commit.md +1 -1
  24. package/pipeline/multi-agent-refs/phases/phase-7-report.md +8 -1
  25. package/pipeline/multi-agent-refs/tracker-contract.md +46 -0
  26. package/pipeline/schemas/agent-state.schema.json +269 -42
  27. package/pipeline/schemas/prefs.schema.json +45 -19
  28. package/pipeline/schemas/token-budget.json +3 -3
  29. package/pipeline/scripts/capture-evidence.sh +187 -0
  30. package/pipeline/scripts/jira-attach.sh +85 -0
  31. package/pipeline/scripts/phase-tracker.sh +245 -3
  32. package/pipeline/skills/.skill-manifest.json +8 -24
  33. package/pipeline/skills/.skills-index.json +2 -46
  34. package/pipeline/skills/shared/README.md +4 -8
  35. package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +0 -8
  36. package/pipeline/skills/shared/core/multi-agent-ios-coding-standard/SKILL.md +1 -1
  37. package/pipeline/skills/shared/core/multi-agent-resume-local/SKILL.md +1 -1
  38. package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +12 -12
  39. package/pipeline/skills/skills-index.md +2 -6
  40. package/pipeline/commands/multi-agent/dev/SKILL.md +0 -17
  41. package/pipeline/commands/multi-agent/dev-autopilot/SKILL.md +0 -23
  42. package/pipeline/commands/multi-agent/dev-local/SKILL.md +0 -17
  43. package/pipeline/commands/multi-agent/dev-local-autopilot/SKILL.md +0 -21
  44. package/pipeline/skills/shared/core/multi-agent-dev/SKILL.md +0 -19
  45. package/pipeline/skills/shared/core/multi-agent-dev-autopilot/SKILL.md +0 -25
  46. package/pipeline/skills/shared/core/multi-agent-dev-local/SKILL.md +0 -19
  47. package/pipeline/skills/shared/core/multi-agent-dev-local-autopilot/SKILL.md +0 -23
package/README.md CHANGED
@@ -89,7 +89,7 @@ Depth, autopilot and `--local` are the only knobs on the run itself; everything
89
89
 
90
90
  ## Commands
91
91
 
92
- `/multi-agent` plus 55 sub-commands. `/multi-agent:help` renders the same catalog in your terminal, in your `outputLanguage`.
92
+ `/multi-agent` plus 51 sub-commands. `/multi-agent:help` renders the same catalog in your terminal, in your `outputLanguage`.
93
93
 
94
94
  ### Pipeline entries
95
95
 
@@ -187,8 +187,6 @@ Depth, autopilot and `--local` are the only knobs on the run itself; everything
187
187
  | `/multi-agent:uninstall` | Remove the pipeline from every CLI. Keychain tokens always left intact |
188
188
  | `/multi-agent:help` | This catalog, in the terminal, in your `outputLanguage` |
189
189
 
190
- Four names are kept only as redirects: `:dev` and `:dev-local` point at `/multi-agent` and `:local` answered Short, and `:dev-autopilot` / `:dev-local-autopilot` have no equivalent - "fast plus unattended" was removed in v16.0.0.
191
-
192
190
  ### Subagents
193
191
 
194
192
  Eight are installed alongside the commands and dispatched by the phases: `explorer` and `task-clarifier` (Phase 0-1), `ios-architect` / `android-architect` / `backend-architect` (Phase 2), `dev-critic` (Phase 3), `code-reviewer` and `security-auditor` (Phase 4).
@@ -209,17 +207,17 @@ This enables the matching plugin (+ the shared `ai-common` plugin) in the repo's
209
207
 
210
208
  ## Tool support
211
209
 
212
- The pipeline runs natively on **Claude Code**, **Copilot CLI** and **Codex CLI** - all three install from the same `pipeline/` source and get the same 55 commands.
210
+ The pipeline runs natively on **Claude Code**, **Copilot CLI** and **Codex CLI** - all three install from the same `pipeline/` source and get the same 51 commands.
213
211
 
214
212
  | Tool | Flag | What it installs |
215
213
  |---|---|---|
216
214
  | Claude Code | `--claude` (default) | slash commands + skills + agents + three `PreToolUse` hooks (secret scan, agent-guard, read-size gate) |
217
- | Copilot CLI | `--copilot` | instructions + 55 sub-command skills + scripts |
218
- | Codex CLI | `--codex` | one router skill + 55 specs as refs + 8 agent TOML + `AGENTS.md` block + `codex mcp add` |
215
+ | Copilot CLI | `--copilot` | instructions + 51 sub-command skills + scripts |
216
+ | Codex CLI | `--codex` | one router skill + 51 specs as refs + 8 agent TOML + `AGENTS.md` block + `codex mcp add` |
219
217
 
220
218
  Filter skills by stack with `--platform=ios\|android\|all`.
221
219
 
222
- **Why Codex gets one skill and not 55.** Codex assembles every discovered skill's name
220
+ **Why Codex gets one skill and not 51.** Codex assembles every discovered skill's name
223
221
  and description into a single prompt block and drops entries when it overflows, with no
224
222
  error. Measured on 0.145: installing one plugin that declares 142 skills surfaced only
225
223
  75 of them and evicted an unrelated user skill. So on Codex the pipeline ships a single
package/README.tr.md CHANGED
@@ -89,7 +89,7 @@ Koşunun kendisinde ayarlanabilen tek şey derinlik, autopilot ve `--local`; ger
89
89
 
90
90
  ## Komutlar
91
91
 
92
- `/multi-agent` ve 55 alt komut. `/multi-agent:help` aynı katalogu terminalde, `outputLanguage` ayarına göre gösterir.
92
+ `/multi-agent` ve 51 alt komut. `/multi-agent:help` aynı katalogu terminalde, `outputLanguage` ayarına göre gösterir.
93
93
 
94
94
  ### Pipeline girişleri
95
95
 
@@ -187,8 +187,6 @@ Koşunun kendisinde ayarlanabilen tek şey derinlik, autopilot ve `--local`; ger
187
187
  | `/multi-agent:uninstall` | Pipeline'ı her CLI'dan kaldırır. Keychain token'larına hiç dokunmaz |
188
188
  | `/multi-agent:help` | Bu katalog, terminalde, `outputLanguage`'ine göre |
189
189
 
190
- Dört ad yalnızca yönlendirme olarak duruyor: `:dev` ve `:dev-local` sırasıyla `/multi-agent` ve `:local` çalıştırıp Short seçmeye yönlendirir, `:dev-autopilot` ile `:dev-local-autopilot` ise karşılıksız - "hızlı artı gözetimsiz" v16.0.0'da kaldırıldı.
191
-
192
190
  ### Alt agent'lar
193
191
 
194
192
  Komutlarla birlikte sekiz agent kurulur ve fazlar bunları çağırır: `explorer` ve `task-clarifier` (Faz 0-1), `ios-architect` / `android-architect` / `backend-architect` (Faz 2), `dev-critic` (Faz 3), `code-reviewer` ve `security-auditor` (Faz 4).
@@ -209,17 +207,17 @@ Bu, ilgili plugin'i (+ ortak `ai-common` plugin'ini) repo'nun `.claude/settings.
209
207
 
210
208
  ## Araç desteği
211
209
 
212
- Pipeline **Claude Code**, **Copilot CLI** ve **Codex CLI** üzerinde native çalışır - üçü de aynı `pipeline/` kaynağından kurulur ve aynı 55 komutu alır.
210
+ Pipeline **Claude Code**, **Copilot CLI** ve **Codex CLI** üzerinde native çalışır - üçü de aynı `pipeline/` kaynağından kurulur ve aynı 51 komutu alır.
213
211
 
214
212
  | Araç | Bayrak | Ne kurar |
215
213
  |---|---|---|
216
214
  | Claude Code | `--claude` (varsayılan) | slash komutları + skill'ler + agent'lar + üç `PreToolUse` hook'u (secret scan, agent-guard, okuma-boyutu geçidi) |
217
- | Copilot CLI | `--copilot` | talimatlar + 55 alt-komut skill'i + script'ler |
218
- | Codex CLI | `--codex` | bir router skill + ref olarak 55 spec + 8 agent TOML + `AGENTS.md` bloğu + `codex mcp add` |
215
+ | Copilot CLI | `--copilot` | talimatlar + 51 alt-komut skill'i + script'ler |
216
+ | Codex CLI | `--codex` | bir router skill + ref olarak 51 spec + 8 agent TOML + `AGENTS.md` bloğu + `codex mcp add` |
219
217
 
220
218
  Skill'leri stack'e göre filtrele: `--platform=ios\|android\|all`.
221
219
 
222
- **Codex neden 55 değil de tek bir skill alıyor.** Codex, keşfettiği her skill'in adını
220
+ **Codex neden 51 değil de tek bir skill alıyor.** Codex, keşfettiği her skill'in adını
223
221
  ve açıklamasını tek bir prompt bloğuna toplar ve blok taştığında girdileri hatasızca
224
222
  düşürür. 0.145 üzerinde ölçüldü: 142 skill deklare eden bir plugin kurulduğunda sadece
225
223
  75'i yüzeye çıktı ve alakasız bir kullanıcı skill'i tahliye edildi. Bu yüzden Codex'te
@@ -117,7 +117,7 @@ graph TB
117
117
  end
118
118
 
119
119
  subgraph "Pipeline Specs"
120
- CMD[commands/<br/>55 command files]
120
+ CMD[commands/<br/>51 command files]
121
121
  AGT[agents/<br/>8 agent personas]
122
122
  RUL[rules/<br/>12 domain rules]
123
123
  PHS[multi-agent-refs/phases/<br/>phase specs + contracts]
@@ -169,8 +169,8 @@ revisions of this diagram - Codex CLI and the two independently-shipped repos
169
169
  ```mermaid
170
170
  graph TD
171
171
  CC["Claude Code<br/>(source of truth)"]
172
- COP["Copilot CLI<br/>(instructions + 55 skills)"]
173
- COD["Codex CLI<br/>(1 router skill + 55 refs)"]
172
+ COP["Copilot CLI<br/>(instructions + 51 skills)"]
173
+ COD["Codex CLI<br/>(1 router skill + 51 refs)"]
174
174
  REPO["Pipeline Repo<br/>(npm package)"]
175
175
  WEB["Website"]
176
176
  PLUGREPO["multi-agent-plugins<br/>(5 stack plugins, own repo)"]
package/docs/ecosystem.md CHANGED
@@ -5,7 +5,7 @@ separately, wired together at install time and at run time:
5
5
 
6
6
  | Repo | What it owns | Ships as |
7
7
  |---|---|---|
8
- | **`multi-agent-pipeline`** (this repo) | Orchestration: the 8-phase flow, the 55 slash commands, quality gates, review/triage, cross-CLI parity | npm package (`@mmerterden/multi-agent-pipeline`), installs itself onto Claude Code / Copilot CLI / Codex CLI |
8
+ | **`multi-agent-pipeline`** (this repo) | Orchestration: the 8-phase flow, the 51 slash commands, quality gates, review/triage, cross-CLI parity | npm package (`@mmerterden/multi-agent-pipeline`), installs itself onto Claude Code / Copilot CLI / Codex CLI |
9
9
  | **`multi-agent-plugins`** | Stack knowledge: per-platform component/lifecycle skills (iOS, Android, Frontend, Backend) + shared knowledge | Claude Code marketplace, 5 independently-versioned plugins |
10
10
  | **`multi-agent-toolkit-mcp`** | The pipeline's hands on devices and browsers: 80 MCP tools across 6 categories (simulator/emulator control, accessibility audit, store compliance, web automation, Figma-vs-mock design audit, an agent-DSL batch runner) | npm package, registered as a standard stdio MCP server on every host |
11
11
 
@@ -18,7 +18,7 @@ Either can be swapped or removed without touching the other two's source.
18
18
  graph LR
19
19
  subgraph PIPE ["multi-agent-pipeline (orchestrator)"]
20
20
  direction TB
21
- PHASES["8 phases · 55 commands"]
21
+ PHASES["8 phases · 51 commands"]
22
22
  GATES["deterministic gates + review triage"]
23
23
  end
24
24
 
@@ -64,8 +64,8 @@ only those:
64
64
  graph TD
65
65
  CC["Claude Code<br/>~/.claude/commands/multi-agent/<br/>(source of truth)"]
66
66
 
67
- CC -->|"Step 2: copy + reformat<br/>55 sub-command skills"| COP["Copilot CLI<br/>~/.copilot/skills/"]
68
- CC -->|"Step 2b: transform<br/>(install.js --codex)"| COD["Codex CLI<br/>1 router skill + 55 refs<br/>+ 8 agent TOML"]
67
+ CC -->|"Step 2: copy + reformat<br/>51 sub-command skills"| COP["Copilot CLI<br/>~/.copilot/skills/"]
68
+ CC -->|"Step 2b: transform<br/>(install.js --codex)"| COD["Codex CLI<br/>1 router skill + 51 refs<br/>+ 8 agent TOML"]
69
69
  CC -->|"Step 3: genericize<br/>(strip personal data)"| REPO["multi-agent-pipeline repo<br/>pipeline/"]
70
70
  CC -->|"Step 4: version + feature sync"| WEB["Website<br/>projects.ts / i18n.tsx"]
71
71
 
@@ -153,7 +153,7 @@ measurements behind this table):
153
153
 
154
154
  | | Claude Code | Copilot CLI | Codex CLI |
155
155
  |---|---|---|---|
156
- | **Pipeline commands** | 55 slash-command skills, native | 55 skills, `multi-agent-{cmd}` naming, copied in | 1 router skill (`multi-agent`) + 55 command specs as reference files - Codex silently truncates its skills block past a few dozen entries, so sub-commands are not peer skills here |
156
+ | **Pipeline commands** | 51 slash-command skills, native | 51 skills, `multi-agent-{cmd}` naming, copied in | 1 router skill (`multi-agent`) + 51 command specs as reference files - Codex silently truncates its skills block past a few dozen entries, so sub-commands are not peer skills here |
157
157
  | **Stack plugins** | Marketplace plugin, loaded natively, resolved by `.claude/settings.json` enabled-list | Enabled plugin's authored skills copied flat into `~/.copilot/skills/`; `knowledge/` **not** re-copied (already delivered via `shared/external`) | Copied as reference files under `~/.codex/multi-agent-refs/skills/`, plugin-prefixed on name clash (e.g. `architecture` → `ai-ios-toolkit-architecture`) |
158
158
  | **Component dispatch (Phase 3)** | Marketplace plugin's `create-component`/`create-screen` skill via the Skill tool | No plugin loader - the enabled stack plugin's authored skills (incl. `create-component`) are copied flat into `~/.copilot/skills/` at install time (the old frozen `figma-*` copies are pruned, they were never a fallback) | Not part of the enforced parity axis; classification + state-shape must match, skill *inventory* does not |
159
159
  | **multi-agent-toolkit-mcp** | `claude mcp add multi-agent-toolkit -- npx -y @mmerterden/multi-agent-toolkit-mcp` | `copilot mcp add multi-agent-toolkit -- npx -y @mmerterden/multi-agent-toolkit-mcp` | `codex mcp add multi-agent-toolkit -- npx -y @mmerterden/multi-agent-toolkit-mcp` (skipped with a warning if `codex` isn't on `PATH`) |
@@ -32,7 +32,7 @@
32
32
 
33
33
  Depth is the question, not a command: Full runs all 8 phases, Short is
34
34
  Init -> Dev(Opus) -> Review -> Test -> Commit -> Report. Review is never
35
- skipped either way. The multi-agent-dev* names were removed in v16.0.0.
35
+ skipped either way.
36
36
 
37
37
  ## Language axes (en/tr)
38
38
 
@@ -111,7 +111,11 @@ or, on machines with Claude Code also installed:
111
111
  ## Progress Tracking - required
112
112
 
113
113
  Every phase boundary MUST call the cross-CLI tracker. The tracker is the single source of truth
114
- for user-visible phase progress on Copilot CLI (no TaskCreate native UI here). Banner is optional flair.
114
+ for user-visible phase progress on Copilot CLI (no native task widget here). Banner is optional flair.
115
+
116
+ Copilot CLI has no TaskCreate equivalent, so the bordered card IS the widget - and Copilot
117
+ collapses tool output, so a card left in stdout never reaches the user. **Reprint the card
118
+ inside your reply at every phase boundary.** `phase-tracker.sh tiles` says so and prints it.
115
119
 
116
120
  ```bash
117
121
  # Bootstrap once at Phase 0 start - initialize all 8 phase tiles:
@@ -119,6 +123,7 @@ bash ~/.copilot/scripts/phase-tracker.sh init "$TASK_ID"
119
123
  for p in 0:Init 1:Analysis 2:Planning 3:Dev 4:Review 5:Test 6:Commit 7:Report; do
120
124
  bash ~/.copilot/scripts/phase-tracker.sh add "${p%%:*}" "${p#*:}"
121
125
  done
126
+ bash ~/.copilot/scripts/phase-tracker.sh tiles
122
127
 
123
128
  # At each phase boundary - update status. Tracker stamps started_at on first
124
129
  # transition to in_progress, completed_at on terminal status (completed/failed/skipped).
@@ -129,6 +134,16 @@ done
129
134
  bash ~/.copilot/scripts/phase-tracker.sh update <N> in_progress
130
135
  bash ~/.copilot/scripts/phase-tracker.sh update <N> completed # or failed / skipped
131
136
 
137
+ # `update <N> completed` EXITS 3 for phases 1-4 when no tokens were recorded for
138
+ # that phase: record model + tokens first, then re-run the same update. A phase
139
+ # that genuinely ran no LLM call completes with `--no-llm`. Each update prints a
140
+ # `-- NEXT (required) --` block naming what to reprint and the narration line.
141
+
142
+ # At the end of the run, print the closing report (per-phase elapsed, tokens,
143
+ # model, USD, totals) next to the work summary, and reprint both in your reply:
144
+ bash ~/.copilot/scripts/phase-tracker.sh report
145
+ bash ~/.copilot/scripts/render-work-summary.sh "$TASK_ID"
146
+
132
147
  # After every LLM dispatch, record its token cost against the active phase (v5.5.0):
133
148
  bash ~/.copilot/scripts/phase-tracker.sh tokens <N> <input_tokens> <output_tokens>
134
149
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mmerterden/multi-agent-pipeline",
3
- "version": "16.21.0",
3
+ "version": "16.24.0",
4
4
  "description": "8-phase AI development pipeline with full orchestration on Claude Code, Copilot CLI and Codex CLI. Analysis, planning, TDD, CLI-aware parallel review with consensus surfacing + Fable triage, default-FAIL evidence gates, secret + intent guards, per-phase cost ledger, persistent learnings memory, wiki generation, commit automation. Token-preserving uninstall.",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -91,7 +91,6 @@ Lib scripts (`~/.claude/lib/`):
91
91
  | `language [en\|tr]` | Show or set the assistant `outputLanguage` (explanations and chat replies). `promptLanguage` is locked to `en` and is not toggleable. No arg = show current `outputLanguage`. With `en` or `tr` = set and persist `outputLanguage`. External payloads (commits, PR bodies, Jira) stay English. |
92
92
  | `setup` | Keychain token + Git Identity onboarding |
93
93
  | `--local` | No worktree - works directly on local branch |
94
- | `--dev` and `dev-*` | **Removed in v16.0.0.** Depth is the Phase 0 Step 7.5 question, not a flag. Print the redirect and continue at `/multi-agent` (or `:local`) with Short selected; for the two autopilot names there is no equivalent, so print the stub's two options and stop. |
95
94
  | `autopilot` | Skip user confirmations, auto commit/PR |
96
95
  | No args / `help` | Show usage guide |
97
96
 
@@ -124,10 +123,6 @@ This command uses lazy loading for token efficiency. Read the relevant sub-file
124
123
  | `build-optimize` | `$HOME/.claude/commands/multi-agent/build-optimize/SKILL.md` |
125
124
  | `local` | `$HOME/.claude/commands/multi-agent/local/SKILL.md` |
126
125
  | `local-autopilot` | `$HOME/.claude/commands/multi-agent/local-autopilot/SKILL.md` |
127
- | `dev` | `$HOME/.claude/commands/multi-agent/dev/SKILL.md` |
128
- | `dev-autopilot` | `$HOME/.claude/commands/multi-agent/dev-autopilot/SKILL.md` |
129
- | `dev-local` | `$HOME/.claude/commands/multi-agent/dev-local/SKILL.md` |
130
- | `dev-local-autopilot` | `$HOME/.claude/commands/multi-agent/dev-local-autopilot/SKILL.md` |
131
126
  | `create-jira` | `$HOME/.claude/commands/multi-agent/create-jira/SKILL.md` (loads `$HOME/.claude/multi-agent-refs/generate-issue.md`) |
132
127
  | `stack` | `$HOME/.claude/commands/multi-agent/stack/SKILL.md` |
133
128
  | `language` | Handled inline - set/show prompt language in preferences |
@@ -95,11 +95,6 @@ Four pipeline entries:
95
95
 
96
96
  /multi-agent:resume-local [jira-id] [autopilot] Continue already-done LOCAL work: Review → Build+Test → PR → Jira analysis + test scenarios (no dev)
97
97
 
98
- Removed in v16.0.0:
99
- :dev -> /multi-agent + Short · :dev-local -> :local + Short
100
- :dev-autopilot and :dev-local-autopilot have no equivalent - fast plus
101
- unattended is gone; pick unattended-and-Full or fast-and-attended.
102
-
103
98
  ------------------------------------------------------------
104
99
 
105
100
  Status & Resume:
@@ -372,11 +367,6 @@ Dört pipeline girişi:
372
367
 
373
368
  /multi-agent:resume-local [jira-id] [autopilot] Lokalde biten işi sürdür: Review → Build+Test → PR → Jira teknik analiz + test senaryoları (dev yok)
374
369
 
375
- v16.0.0'da kaldırılanlar:
376
- :dev -> /multi-agent + Kısa · :dev-local -> :local + Kısa
377
- :dev-autopilot ve :dev-local-autopilot'un karşılığı yok - hızlı+gözetimsiz
378
- bitti; ya gözetimsiz-ve-Tam ya hızlı-ve-insan-başında seçilir.
379
-
380
370
  ------------------------------------------------------------
381
371
 
382
372
  Status & Resume:
@@ -1,6 +1,6 @@
1
1
  ---
2
- description: "Audit an iOS module against the shared coding-standard registry (99 stable-ID rules), produce a remediation plan, then hand off to dev/dev-local. Use for a standards pass on a module, or when a review needs rule IDs rather than opinions."
3
- description-tr: "Bir iOS modulunu paylasilan kodlama-standardi registry'sine (99 sabit-ID kural) gore denetler, duzeltme plani cikarir, sonra dev/dev-local'e devreder. Bir modulde standart gecisi icin, ya da bir review'un gorus yerine kural ID'si istedigi durumda kullan."
2
+ description: "Audit an iOS module against the shared coding-standard registry (99 stable-ID rules), produce a remediation plan, then hand off to /multi-agent or :local. Use for a standards pass on a module, or when a review needs rule IDs rather than opinions."
3
+ description-tr: "Bir iOS modulunu paylasilan kodlama-standardi registry'sine (99 sabit-ID kural) gore denetler, duzeltme plani cikarir, sonra /multi-agent veya :local'e devreder. Bir modulde standart gecisi icin, ya da bir review'un gorus yerine kural ID'si istedigi durumda kullan."
4
4
  argument-hint: "[module name or path]"
5
5
  allowed-tools: Skill, Bash, Read, Edit, Write, AskUserQuestion
6
6
  ---
@@ -67,7 +67,7 @@ Depth is a separate axis, asked at Phase 0 Step 7.5 rather than encoded in the c
67
67
 
68
68
  ## Delegation
69
69
 
70
- Orchestrator routing: the routing table in `$HOME/.claude/commands/multi-agent/SKILL.md` resolves `local-autopilot` as the union of the `dev-local` + `autopilot` mode mixins. Contract details: `$HOME/.claude/multi-agent-refs/phases/phase-0-init.md` Step 6 (local branch) + `$HOME/.claude/multi-agent-refs/phases/phase-2-planning.md` Step 5 (autopilot gate skip + safety classifier).
70
+ Orchestrator routing: the routing table in `$HOME/.claude/commands/multi-agent/SKILL.md` resolves `local-autopilot` as the union of the `local` + `autopilot` mode mixins. Contract details: `$HOME/.claude/multi-agent-refs/phases/phase-0-init.md` Step 6 (local branch) + `$HOME/.claude/multi-agent-refs/phases/phase-2-planning.md` Step 5 (autopilot gate skip + safety classifier).
71
71
  ## Required: outward-facing payload contracts
72
72
 
73
73
  Before writing anything outward-facing - PR body, Jira comment, Confluence page, closing report - load `$HOME/.claude/multi-agent-refs/payload-contracts.md`. It names the canonical section set for each payload, the markup dialect per surface (PR body is Markdown, Jira is wiki markup - mixing them is a defect), and the token/duration numbers the closing report must carry. Improvising a payload shape from memory is the most common failure of the short modes.
@@ -12,7 +12,7 @@ You already did the work locally - wrote code on the current branch and maybe
12
12
 
13
13
  ## When to use it
14
14
 
15
- - You ran `dev-local` / `local` (which skip Review + Test) and now want the full quality tail on the same branch.
15
+ - You ran `:local` and answered Short (which skips Review + Test) and now want the full quality tail on the same branch.
16
16
  - You hand-coded or hand-tested a change and want review + build/test + PR + Jira write-up without re-running dev.
17
17
  - You want the "reviewed, built, tested, PR'd, documented on Jira" finish with a single command.
18
18
 
@@ -47,7 +47,7 @@ Phases 1-3 (Analysis / Planning / Dev) are skipped by design - `ship` treats t
47
47
  1. **Project + branch:** detect project (cwd), current branch (`git branch --show-current`). No worktree; work stays on the current branch.
48
48
  2. **Base + diff:** resolve base branch in order: `--base <arg>` → `figma-config.project.baseBranch` → `develop` → the branch's upstream/merge-base. The **work under review** is `git diff <base>...HEAD` PLUS uncommitted working-tree changes (`git status`). Abort with a clear message if the diff is empty (`ERR: no local work to finish on <branch> vs <base>`).
49
49
  3. **Task binding:** Jira id from the `--`/positional arg, else parse the branch name (`bugfix/PROJ-XXXX` / `feature/PROJ-XXXX`); `taskType` inferred from the diff (bugfix/feature/refactor/chore) for the report wording. GitHub issue `#N` from branch/arg when present.
50
- 4. **Prior state (optional):** if an `agent-state.json` / tracker-state exists for this branch (left by a prior `dev-local`/`local` run), load its analysis summary + Jira/issue binding to enrich the report; otherwise synthesize a minimal state over the diff. Never require a prior full-pipeline run.
50
+ 4. **Prior state (optional):** if an `agent-state.json` / tracker-state exists for this branch (left by a prior `:local` run), load its analysis summary + Jira/issue binding to enrich the report; otherwise synthesize a minimal state over the diff. Never require a prior full-pipeline run.
51
51
  5. Persist state under `.claude/logs/multi-agent/{project}/{taskId}/` (same as `--local`).
52
52
 
53
53
  ## Phase execution (reuse the existing phase contracts)
@@ -59,8 +59,8 @@ Run every step automatically:
59
59
  ```
60
60
  Step 1: PLATFORM Detect macOS / Linux / Windows (Git Bash / WSL); export PLATFORM env
61
61
  Step 1.5: DETECT Compare timestamps, find stale targets
62
- Step 2: COPILOT Claude Code -> Copilot CLI (instructions + 55 sub-command skills)
63
- Step 2b: CODEX Claude Code -> Codex CLI (1 router skill + 55 specs as refs + 8 agent TOML)
62
+ Step 2: COPILOT Claude Code -> Copilot CLI (instructions + 51 sub-command skills)
63
+ Step 2b: CODEX Claude Code -> Codex CLI (1 router skill + 51 specs as refs + 8 agent TOML)
64
64
  Step 3: REPO Claude Code -> pipeline repo (genericized, personal data scrub, bash -n on all sh)
65
65
  Step 3c: PLUGINS pipeline shared/external -> multi-agent-plugins marketplace (rebuild knowledge/,
66
66
  bump changed plugins' patch version, commit + push the plugins repo)
@@ -166,7 +166,7 @@ If nothing is stale → report "All targets up to date" and stop.
166
166
  Unlike the Copilot step, this one does **not** hand-copy files. The Codex tree is a
167
167
  *transform* of the Claude tree, not a mirror of it, and the transform is real work:
168
168
 
169
- - the 55 sub-command specs become reference files, because Codex silently truncates
169
+ - the 51 sub-command specs become reference files, because Codex silently truncates
170
170
  its skills block (see `cross-cli-contract.md` 2.6 for the measurement)
171
171
  - every `$HOME/.claude/...` reference to a CLI-owned tree is retargeted, with
172
172
  `agents/<persona>.md` becoming `.toml` and the dispatcher becoming the router skill
@@ -480,25 +480,25 @@ When invoked with the `release` argument:
480
480
  ## Sub-Command Sync (Claude Code <-> Copilot CLI Skills)
481
481
 
482
482
  This runs on the Claude <-> Copilot axis. Codex is NOT synced here: it receives the
483
- same 55 specs as reference files rather than as peer skills, via Step 2b - see
483
+ same 51 specs as reference files rather than as peer skills, via Step 2b - see
484
484
  `cross-cli-contract.md` 2.6 for why the parity axis differs per host.
485
485
 
486
486
  | Claude Code | Copilot CLI |
487
487
  |-------------|-------------|
488
488
  | `~/.claude/commands/multi-agent/{cmd}/SKILL.md` | `~/.copilot/skills/multi-agent-{cmd}/SKILL.md` |
489
489
 
490
- **55 commands are synced** (canonical inventory - must match `cross-cli-contract.md` section 1; drift = contract violation):
490
+ **51 commands are synced** (canonical inventory - must match `cross-cli-contract.md` section 1; drift = contract violation):
491
491
 
492
492
  ```
493
493
  analysis, analysis-resolve, autopilot, build-optimize, channels,
494
- complaint-analysis, create-jira, design-check, dev, dev-autopilot, dev-local,
495
- dev-local-autopilot, diff-explain, feedback, forget, garbage-collect,
496
- graph, help, ios-coding-standard, issue, jira, kill, language, local,
497
- local-autopilot, log, manual-test, prune-logs, prune-prompts, purge,
498
- refactor, resume, resume-local, review, review-analysis, review-issue,
499
- review-jira, routines, save, scan, search, setup, stack, status, steer,
500
- store-ready, sync, test, test-accessibility, test-dark-mode,
501
- test-dynamic-type, test-screenshots, testflight-validation, uninstall, update
494
+ complaint-analysis, create-jira, design-check, diff-explain, feedback,
495
+ forget, garbage-collect, graph, help, ios-coding-standard, issue, jira,
496
+ kill, language, local, local-autopilot, log, manual-test, prune-logs,
497
+ prune-prompts, purge, refactor, resume, resume-local, review,
498
+ review-analysis, review-issue, review-jira, routines, save, scan, search,
499
+ setup, stack, status, steer, store-ready, sync, test, test-accessibility,
500
+ test-dark-mode, test-dynamic-type, test-screenshots, testflight-validation,
501
+ uninstall, update
502
502
  ```
503
503
 
504
504
  **NOT synced**: `$HOME/.claude/multi-agent-refs/*` - lazy-load references, Claude Code specific
@@ -20,6 +20,13 @@ Every Jira comment posted by this adapter follows the same section order. Sectio
20
20
 
21
21
  **`summary`** - 2-5 sentences in `outputLanguage`. What changed, why, and the user-visible impact. No "we", no marketing tone. Past tense (the work is done at the time the comment goes up).
22
22
 
23
+ **Visual evidence inside these two sections.** When `state.visualEvidence` carries artefacts, they render INSIDE `summary` and `test_scenarios` - never as a fourth section, which the fixed section order forbids. Upload first (`jira-attach.sh <issue> <file>...`), then reference by the returned filename:
24
+
25
+ - `summary`, after its sentences: one line naming the pair in `outputLanguage` (`Düzeltme öncesi / Düzeltme sonrası`), then the thumbnails on the next line - `!<file>-before.png|thumbnail! !<file>-after.png|thumbnail!`.
26
+ - `test_scenarios`, under the scenario the recording demonstrates: `!<file>-flow.mp4!` plus one line stating the tier used.
27
+
28
+ A `gaps[]` entry prints its reason on the line where the artefact would have been (`Düzeltme öncesi: ticket'ta görsel yok`). Never an empty thumbnail, never a silent omission. Contract: `$HOME/.claude/multi-agent-refs/features/visual-evidence.md`.
29
+
23
30
  **`test_scenarios`** - Given/When/Then numbered list. One scenario per acceptance criterion. The heading and scenario text are rendered in `outputLanguage` at write-time; the template itself (this file) shows the English skeleton:
24
31
 
25
32
  ```markdown
@@ -14,9 +14,10 @@ The PR description targets code reviewers - it stays technical. Every adapter
14
14
  | 2 | `changes` | `## Değişiklikler` | `## Changes` | always |
15
15
  | 3 | `architecture` | `## Mimari Kararlar` | `## Architecture Decisions` | when a non-trivial design choice was made |
16
16
  | 4 | `verification` | `## Doğrulama` | `## Verification` | always |
17
- | 5 | `risk` | `## Risk ve Güvenlik` | `## Risk and Security` | when `state.diffRisk.signals` carries a high-stakes signal (`security_path`, `migration`, `public_api`, `no_test_change`, `test_lines_removed`) |
18
- | 6 | `dependencies` | `## Bağımlılıklar` | `## Dependencies` | when deps added/removed/bumped |
19
- | 7 | `related` | `## İlgili` | `## Related` | always (Jira/issue ref; never `Closes/Fixes`) |
17
+ | 5 | `visuals` | `## Görsel Kanıt` | `## Visual Evidence` | when `state.visualEvidence.required` |
18
+ | 6 | `risk` | `## Risk ve Güvenlik` | `## Risk and Security` | when `state.diffRisk.signals` carries a high-stakes signal (`security_path`, `migration`, `public_api`, `no_test_change`, `test_lines_removed`) |
19
+ | 7 | `dependencies` | `## Bağımlılıklar` | `## Dependencies` | when deps added/removed/bumped |
20
+ | 8 | `related` | `## İlgili` | `## Related` | always (Jira/issue ref; never `Closes/Fixes`) |
20
21
 
21
22
  ### Section content rules
22
23
 
@@ -62,6 +63,18 @@ Multi-repo PRs (one PR per repo) emit verification commands for that repo's stac
62
63
  - Rollback: feature flag <name> | git revert <sha> | none, and why
63
64
  ```
64
65
 
66
+ **`visuals`** - only when `state.visualEvidence.required`. The images live on the Jira issue as attachments; this section exists so a reviewer opening the PR knows they are there and what each one shows. Filenames, not raw URLs - a Jira attachment URL is auth-gated and renders as a broken image for anyone reading the PR outside a Jira session.
67
+
68
+ ```markdown
69
+ ## Visual Evidence
70
+
71
+ - Before: `<before-filename>` (attached to PROJ-XXXXX)
72
+ - After: `<after-filename>` (attached to PROJ-XXXXX)
73
+ - Flow video: `<flow-filename>`, tier <N> (attached to PROJ-XXXXX)
74
+ ```
75
+
76
+ Every `state.visualEvidence.gaps[]` entry becomes its own line with the reason instead of a filename (`- Before: none - the ticket carries no image attachment`). Phase 6 Step 3 blocks on a required artefact that is neither listed nor explained. Contract: `$HOME/.claude/multi-agent-refs/features/visual-evidence.md`.
77
+
65
78
  **`dependencies`** - only when `Package.swift` / `Podfile` / `build.gradle` / `package.json` changed. Each entry: `package@old → new - reason`.
66
79
 
67
80
  **`related`** - flat list, plain text. Examples:
@@ -6,18 +6,18 @@
6
6
 
7
7
  ---
8
8
 
9
- ## 1. Command Inventory (55 files, 51 live commands)
9
+ ## 1. Command Inventory (51 commands)
10
10
 
11
11
  ```
12
12
  analysis, analysis-resolve, autopilot, build-optimize, channels,
13
- complaint-analysis, create-jira, design-check, dev, dev-autopilot, dev-local,
14
- dev-local-autopilot, diff-explain, feedback, forget, garbage-collect,
15
- graph, help, ios-coding-standard, issue, jira, kill, language, local,
16
- local-autopilot, log, manual-test, prune-logs, prune-prompts, purge,
17
- refactor, resume, resume-local, review, review-analysis, review-issue,
18
- review-jira, routines, save, scan, search, setup, stack, status, steer,
19
- store-ready, sync, test, test-accessibility, test-dark-mode,
20
- test-dynamic-type, test-screenshots, testflight-validation, uninstall, update
13
+ complaint-analysis, create-jira, design-check, diff-explain, feedback,
14
+ forget, garbage-collect, graph, help, ios-coding-standard, issue, jira,
15
+ kill, language, local, local-autopilot, log, manual-test, prune-logs,
16
+ prune-prompts, purge, refactor, resume, resume-local, review,
17
+ review-analysis, review-issue, review-jira, routines, save, scan, search,
18
+ setup, stack, status, steer, store-ready, sync, test, test-accessibility,
19
+ test-dark-mode, test-dynamic-type, test-screenshots, testflight-validation,
20
+ uninstall, update
21
21
  ```
22
22
 
23
23
  Categories:
@@ -25,15 +25,12 @@ Categories:
25
25
  - **Interactive pickers** (single-purpose, not modes): `jira`, `issue`
26
26
  - **Issue generator** (one-shot, no worktree, asks type Task/Bug/Story, hard approval gate before create): `create-jira`
27
27
  - **Pipeline entries**: `autopilot`, `local`, `local-autopilot` (plus the bare `/multi-agent` in the dispatcher). Depth is not a command: `/multi-agent` and `local` ask Full or Short at Phase 0 Step 7.5; the two autopilot entries never ask and always run Full.
28
- - **Retired stubs** (v16.0.0, deleted next minor - they print a redirect and run no phase): `dev`, `dev-local` redirect to the picker entries with Short; `dev-autopilot`, `dev-local-autopilot` have no equivalent, because fast-plus-unattended no longer exists
29
28
  - **Tail modes** (run the pipeline tail over already-done local work): `resume-local`
30
29
  - **Ops commands** (one-shot, no worktree): `status`, `log`, `kill`, `steer`, `purge`, `uninstall`, `resume`, `review`, `review-jira`, `review-issue`, `analysis`, `analysis-resolve`, `complaint-analysis`, `build-optimize`, `channels`, `scan`, `search`, `diff-explain`, `garbage-collect`, `graph`, `prune-logs`, `prune-prompts`
31
30
  - **Local audits** (worktree only to build; no commit, push, PR or channels): `design-check`, `testflight-validation`, `ios-coding-standard`. `testflight-validation` additionally never invokes `altool --upload-app` - a validation run must not be able to ship a build by accident.
32
31
  - **Meta-ops**: `setup`, `sync`, `update`, `help`, `refactor`, `test`, `stack`, `manual-test`, `language`
33
32
  - **Routines** (user-defined routine registry; the routines they create are local-only and never synced): `save`, `routines`, `forget`
34
33
 
35
- The count is 55 files and 51 live commands until the four stubs are deleted, at which point both numbers become 51. A stub is still installed and still invocable, so counting it as absent would be wrong; counting it as a command would be worse.
36
-
37
34
  > **Inventory drift is a contract violation.** Adding a slash command under `pipeline/commands/multi-agent/` without updating this list + its counterpart Copilot dir (`pipeline/skills/shared/core/multi-agent-<cmd>/`) is a merge blocker. `smoke-commands-skills-parity.sh` enforces command ↔ skill directory parity; `smoke-cross-cli-behavior.sh` enforces behavior parity. This doc is the authoritative command list - bump the count + table together.
38
35
 
39
36
  ### 1.1 Figma / component work (plugin-based on Claude Code; NOT parity-enforced)
@@ -244,6 +241,7 @@ argument-hint: "<input hint>"
244
241
 
245
242
  | Concept | Claude Code | Copilot CLI | Codex CLI |
246
243
  |---|---|---|---|
244
+ | Print the registration calls | `phase-tracker.sh tiles` (emits the TaskCreate list) | `phase-tracker.sh tiles` (emits the reprint instruction) | `phase-tracker.sh tiles` (emits the update_plan payload) |
247
245
  | Register a phase | `TaskCreate` tool call with subject/description | `phase-tracker.sh add <N> <name>` | `update_plan` step, `status: pending` |
248
246
  | Mark a phase in-progress | `TaskUpdate` → `in_progress` | `phase-tracker.sh update <N> in_progress` | `update_plan` step → `in_progress` |
249
247
  | Mark a phase complete | `TaskUpdate` → `completed` | `phase-tracker.sh update <N> completed` | `update_plan` step → `completed` |
@@ -0,0 +1,172 @@
1
+ # Visual evidence - before/after screenshots and the UI flow video
2
+
3
+ A UI fix that reads as three changed files in a diff is not reviewable. The
4
+ reviewer cannot see what was wrong, and the tester cannot see what to look for.
5
+ This contract makes the pipeline carry the picture: the state the reporter saw,
6
+ the state the fix produces, and where possible a recording of the flow running.
7
+
8
+ The artefacts live as **Jira attachments** and are referenced from two places -
9
+ the Phase 7 Jira comment, where the picture belongs next to the work summary and
10
+ the test scenarios, and the PR body, which tells the reviewer they exist.
11
+
12
+ Consumers: Phase 3 (capture), Phase 5 (video, preferred host), Phase 6 (blocker),
13
+ `channels/jira.md` and `channels/pr.md` (render). Gate: `smoke-visual-evidence.sh`.
14
+
15
+ ## 1. When it is required
16
+
17
+ Decided mechanically from `taskType` plus the changed-file list, never from the
18
+ model's reading of the task. A file counts as UI by stack:
19
+
20
+ | Stack | UI file test |
21
+ |---|---|
22
+ | iOS | `.swift` declaring `: View`, `: ViewController`, or under a `Views/` path |
23
+ | Android | `.kt` with `@Composable`, or declaring `: Activity` / `: Fragment` |
24
+ | Web | `.tsx` / `.jsx` / `.vue` / `.svelte` |
25
+
26
+ | Case | Before | After | Video |
27
+ |---|---|---|---|
28
+ | `taskType` is `bugfix` AND a UI file changed | required | required | when a tier allows |
29
+ | Design work: `taskType` is `component`, or Figma was referenced, or a UI file was **added** | not applicable | required | when a tier allows |
30
+ | Anything else | - | - | - |
31
+
32
+ `state.visualEvidence.required` records the verdict and which rule produced it.
33
+ Nothing about this section is optional-by-omission: when it is required and an
34
+ artefact is absent, the absence is written down with its reason (section 5).
35
+
36
+ ## 2. Before - the reporter's screenshot, or nothing
37
+
38
+ **The pipeline does not build the old state to photograph it.** Reproducing a
39
+ pre-fix screen costs a second build and a second launch on every UI bug, to
40
+ recreate evidence the reporter has usually already attached.
41
+
42
+ So: Phase 0 already fetches the issue. Any image attachment on it (`.png`,
43
+ `.jpg`, `.jpeg`, `.gif`, `.heic`) is downloaded to `$WORKTREE/.pipeline/evidence/`
44
+ and recorded as `state.visualEvidence.before[]`. More than one is kept - a bug
45
+ reported on two platforms has two.
46
+
47
+ No image on the ticket means no "before". Record the gap
48
+ (`before_missing: "ticket carries no image attachment"`) and continue. The
49
+ section still renders, saying so.
50
+
51
+ ## 3. After - Phase 3, not Phase 5
52
+
53
+ Phase 5 is the natural home: the simulator is already up. It is also **dropped by
54
+ every `autopilot` and `--local` entry** (`phase-5-test.md` TLDR), so a capture
55
+ that lives only there produces nothing for unattended runs - which are exactly
56
+ the runs where nobody watched the screen.
57
+
58
+ The capture therefore happens in **Phase 3, after the build+test gate passes**,
59
+ which is in every mode's phase set. Phase 5 may add richer evidence on top; it is
60
+ never the only source.
61
+
62
+ ```bash
63
+ bash $HOME/.claude/scripts/capture-evidence.sh after \
64
+ --task "$TASK_ID" --platform "$PLATFORM" --label "<screen-slug>"
65
+ ```
66
+
67
+ The script boots the device if needed, launches the built app, cleans the status
68
+ bar (`ios_status_bar preset:clean` / the Android equivalent) so the frame carries
69
+ no clock, carrier or battery noise, captures at device resolution, downscales to
70
+ at most 1242px wide, and writes
71
+ `$WORKTREE/.pipeline/evidence/<TASK_ID>-<label>-after.png`.
72
+
73
+ A clean status bar is not cosmetic: without it two captures of the same screen
74
+ differ by the clock, which makes every "after" look like a change.
75
+
76
+ ## 4. Video - three tiers, resolved once per repo
77
+
78
+ The flow source, in order: a UI test flow written on the ticket wins; otherwise
79
+ the Phase 5 test scenarios are the flow. Human-written beats generated, the same
80
+ rule the "before" follows.
81
+
82
+ The tier is probed once and stored in `state.visualEvidence.videoTier`:
83
+
84
+ | Tier | Condition | Mechanism |
85
+ |---|---|---|
86
+ | 1 | The repo has a UI test target (XCUITest / Espresso) **and** it can be seeded with test data | Run that test, record the screen for its duration. Most faithful, and it is a test that already runs in CI |
87
+ | 2 | A runnable build exists | Drive the flow with `mcp__multi-agent-toolkit__agent_run_steps` and record with `ios_record_video` / `android_record_screen`. **No test target needed** |
88
+ | 3 | No runnable build (library / SPM package / backend) | Skip, with the reason recorded |
89
+
90
+ Tier 2 is why "can every repo do this" answers yes in practice: any app that can
91
+ be launched can be driven. A repo without a UI test target loses fidelity, not
92
+ the recording.
93
+
94
+ Preferred host is **Phase 5** - the device is already up and a human is present
95
+ to confirm the flow is the right one. In a mode without Phase 5, tier 2 runs at
96
+ the end of Phase 3 instead. Tier 1 always runs where the test runs.
97
+
98
+ Duration is capped by `visualEvidence.maxVideoSeconds` (default 60), read via
99
+ `capture-evidence.sh limits` so the number lives in one place rather than in two
100
+ documents. A flow that needs longer is not a review artefact, it is a debugging
101
+ session.
102
+
103
+ `visualEvidence.enabled` turns the whole feature off - capture, upload, both
104
+ render sections and the Phase 6 blocker with it.
105
+
106
+ ## 5. Size, and what happens when it does not fit
107
+
108
+ Jira's attachment ceiling is an instance setting, so it is a preference:
109
+ `visualEvidence.maxAttachmentMb` (default `10`).
110
+
111
+ Order of attempts, each one recorded:
112
+
113
+ 1. Upload as captured.
114
+ 2. On `413` or a local size overrun: re-encode. Video drops to 720p and a lower
115
+ bitrate; PNG converts to JPEG at quality 80. **Reducing quality is allowed;
116
+ dropping the artefact is not.**
117
+ 3. Still over: replace the video with a four-frame contact sheet (start, two
118
+ midpoints, end) as a single PNG, and say in the caption that the recording
119
+ exceeded the limit.
120
+
121
+ Never silently attach nothing.
122
+
123
+ ## 6. Rendering
124
+
125
+ ### Jira comment (`channels/jira.md`)
126
+
127
+ The comment's section order is fixed and nothing may be inserted between the
128
+ three sections. The evidence goes **inside** two of them:
129
+
130
+ - `summary` - after the summary sentences, the before/after pair as a Jira wiki
131
+ thumbnail row: `!<TASK>-<label>-before.png|thumbnail! !<TASK>-<label>-after.png|thumbnail!`
132
+ preceded by one line naming which is which in `outputLanguage`
133
+ (`Düzeltme öncesi / Düzeltme sonrası`).
134
+ - `test_scenarios` - the flow video attached under the scenario it demonstrates:
135
+ `!<TASK>-flow.mp4!`, one line stating the tier used.
136
+
137
+ Missing artefacts print their reason on the same line, never an empty frame.
138
+
139
+ ### PR body (`channels/pr.md`)
140
+
141
+ A `visuals` section whose job is to tell the reviewer the evidence exists and
142
+ where it lives - the images themselves stay on the ticket:
143
+
144
+ ```markdown
145
+ ## Görsel Kanıt
146
+
147
+ - Düzeltme öncesi: <before-filename> (PROJ-123 ekinde)
148
+ - Düzeltme sonrası: <after-filename> (PROJ-123 ekinde)
149
+ - Akış videosu: <flow-filename>, tier <N> (PROJ-123 ekinde)
150
+ ```
151
+
152
+ ## 7. Blocker
153
+
154
+ When section 1 says required and `state.visualEvidence` carries neither an
155
+ artefact nor a recorded reason for its absence, **Phase 6 Step 3 blocks** - the
156
+ same shape as the `risk` section blocker. A recorded reason is enough to pass:
157
+ the gate is against silence, not against an honest "no image on the ticket".
158
+
159
+ ## 8. State
160
+
161
+ ```json
162
+ "visualEvidence": {
163
+ "required": true,
164
+ "requiredBy": "bugfix + ui-file-changed",
165
+ "platform": "ios",
166
+ "before": [{"file": "...", "source": "ticket", "jiraFilename": "...", "url": "..."}],
167
+ "after": [{"file": "...", "capturedAt": "phase-3", "jiraFilename": "...", "url": "..."}],
168
+ "videoTier": 2,
169
+ "video": {"file": "...", "seconds": 41, "jiraFilename": "...", "url": "..."},
170
+ "gaps": [{"what": "before", "reason": "ticket carries no image attachment"}]
171
+ }
172
+ ```