workflow-ai 1.0.67 → 1.1.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 (46) hide show
  1. package/configs/pipeline.yaml +6 -6
  2. package/package.json +10 -7
  3. package/src/lib/logger.mjs +19 -5
  4. package/src/lib/operations/plans.mjs +85 -0
  5. package/src/lib/operations/skills.mjs +124 -0
  6. package/src/lib/operations/tickets.mjs +332 -0
  7. package/src/scripts/get-next-id.js +39 -165
  8. package/src/scripts/move-ticket.js +68 -225
  9. package/src/scripts/pick-next-task.js +93 -759
  10. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/claude-sonnet/trial-1.md +4 -68
  11. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/claude-sonnet/trial-2.md +53 -58
  12. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/claude-sonnet/trial-3.md +48 -48
  13. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/judge.json +15 -15
  14. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/meta.json +16 -16
  15. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/claude-sonnet/trial-3.md +4 -76
  16. package/src/skills/coach/tests/cases/TC-COACH-001/current/meta.json +93 -93
  17. package/src/skills/coach/tests/cases/TC-COACH-002/current/meta.json +93 -93
  18. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/meta.json +113 -113
  19. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/meta.json +87 -87
  20. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/meta.json +87 -87
  21. package/src/skills/review-result/SKILL.md +1 -0
  22. package/src/skills/review-result/knowledge/baseline-snapshot-validation.md +67 -0
  23. package/src/skills/review-result/knowledge/dod-patterns.md +1 -0
  24. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/claude-sonnet/trial-1.md +2 -2
  25. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/claude-sonnet/trial-2.md +2 -2
  26. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/claude-sonnet/trial-3.md +2 -14
  27. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/judge.json +18 -18
  28. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/meta.json +20 -20
  29. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/claude-sonnet/trial-2.md +2 -34
  30. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/judge.json +19 -19
  31. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/meta.json +21 -21
  32. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/claude-sonnet/trial-1.md +36 -3
  33. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/claude-sonnet/trial-2.md +11 -3
  34. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/claude-sonnet/trial-3.md +3 -3
  35. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/judge.json +18 -18
  36. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/meta.json +20 -20
  37. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-004/current/claude-sonnet/trial-1.md +5 -0
  38. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-004/current/claude-sonnet/trial-2.md +5 -0
  39. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-004/current/claude-sonnet/trial-3.md +6 -0
  40. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-004/current/judge.json +46 -0
  41. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-004/current/meta.json +37 -0
  42. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-004-baseline-snapshot.yaml +50 -0
  43. package/src/skills/review-result/tests/fixtures/QA-905-baseline-regex-instead-of-snapshot/QA-905.md +62 -0
  44. package/src/skills/review-result/tests/fixtures/QA-905-baseline-regex-instead-of-snapshot/baseline.test.mjs +124 -0
  45. package/src/skills/review-result/tests/index.yaml +5 -0
  46. package/src/skills/review-result/tests/rubrics/baseline-snapshot.md +20 -0
@@ -1,69 +1,5 @@
1
- ## Анализ прогресса PLAN-001 — Верификация атрибуции QA-001
1
+ # TRIAL ERRORED
2
2
 
3
- ---
4
-
5
- ## Executive Summary
6
-
7
- Проведена верификация finding из REPORT-002 по логу пайплайна итерации от 2026-04-06. Root cause пропуска тикета QA-001 в REPORT-002 атрибутирован ошибочно: указан `check-conditions.js`, тогда как лог однозначно показывает, что `check-conditions` завершился с `conditions_ok`. Решение о пропуске приняла стадия `check-relevance` (Step 314, `decision=irrelevant`, `reason=dependencies_inactive`). Помимо некорректной атрибуции, лог выявляет внутреннее противоречие между показаниями двух стейджей по зависимостям — это самостоятельная проблема, требующая внимания.
8
-
9
- ---
10
-
11
- ## Верификация по логу — пошаговая
12
-
13
- | Step | Стейдж | Компонент | Результат по логу | Вывод REPORT-002 |
14
- |------|--------|-----------|-------------------|-----------------|
15
- | 312 | `pick-next-task` | `script-pick` | QA-001 выбран, `status=ready` | — |
16
- | 313 | `check-conditions` | `check-conditions.js` | `conditions_ok` (dependencies.resolved: **true**, prerequisites.met: true, blocking_tickets: []) | ❌ атрибутирован как root cause |
17
- | 314 | `check-relevance` | `check-relevance.js` | `irrelevant`, `reason=dependencies_inactive` | ❌ не упомянут |
18
- | 315 | `skip-ticket` | `script-skip` | QA-001 → skipped, reason из check-relevance: `dependencies_inactive` | — |
19
-
20
- **Вывод `[HIGH]`:** `check-conditions.js` на Step 313 явно вернул `conditions_ok` и не является причиной пропуска. Решение о `skip` принято исключительно стейджем `check-relevance` на Step 314.
21
-
22
- ---
23
-
24
- ## Findings
25
-
26
- ### Finding 1 — Некорректная атрибуция root cause в REPORT-002 `[HIGH]`
27
-
28
- **Факт:** REPORT-002 указывает `check-conditions.js` как компонент, передавший тикет дальше без обработки. Лог опровергает это: Step 313 завершён со статусом `conditions_ok`, все три проверки условий пройдены.
29
-
30
- **Корректная атрибуция:** `check-relevance.js` (Step 314) — именно этот скрипт принял решение `decision=irrelevant` и выставил `reason=dependencies_inactive`, что и повлекло переход к `skip-ticket`.
31
-
32
- **Некорректная рекомендация в REPORT-002:** «Пересмотреть пороги `check-conditions.js`» — не релевантна, так как этот компонент отработал корректно.
33
-
34
- ---
35
-
36
- ### Finding 2 — Внутреннее противоречие между стейджами по зависимостям `[HIGH]`
37
-
38
- **Факт:** Два стейджа дают взаимоисключающие данные о зависимостях QA-001:
39
-
40
- | Стейдж | Поле | Значение |
41
- |--------|------|----------|
42
- | `check-conditions` (Step 313) | `dependencies.resolved` | `true` |
43
- | `check-relevance` (Step 314) | `dependencies.status` | `inactive` |
44
-
45
- **Интерпретация `[MEDIUM]`:** Вероятно, стейджи проверяют разные аспекты зависимостей — `check-conditions` проверяет блокирующие тикеты (есть ли незакрытые зависимости в трекере), `check-relevance` проверяет активность зависимых фич/компонентов в продукте. Это семантически разные проверки, но их терминология пересекается и создаёт риск будущих ошибок атрибуции.
46
-
47
- ---
48
-
49
- ## Скорректированные рекомендации
50
-
51
- | # | Действие | Приоритет | Обоснование | Ожидаемый результат |
52
- |---|----------|-----------|-------------|---------------------|
53
- | 1 | Исправить root cause в REPORT-002: заменить `check-conditions.js` на `check-relevance.js` | HIGH | Лог Step 313 доказывает, что `check-conditions` вернул `conditions_ok` | Корректная история инцидента, правильный вектор исправления |
54
- | 2 | Изучить логику `check-relevance.js`: почему `dependencies.status=inactive` при `dependencies.resolved=true` | HIGH | Противоречие между стейджами может скрывать баг или неконсистентное определение «зависимости» | Понимание реального сбоя, устранение потенциального источника ложных пропусков |
55
- | 3 | Переименовать поля: `check-conditions` → `blocking_deps_resolved`, `check-relevance` → `feature_deps_active` | MEDIUM | Текущая терминология (`dependencies.*`) в обоих стейджах неотличима при анализе логов | Снижение риска ошибок атрибуции в будущих отчётах |
56
-
57
- ---
58
-
59
- ## За пределами скоупа
60
-
61
- Остальные 5 тикетов итерации упомянуты в REPORT-002 без деталей — их статусы не верифицировались в рамках данного анализа (лог содержит только шаги 312–315).
62
-
63
- ---
64
-
65
- ---RESULT---
66
- status: has_gaps
67
- report_id: REPORT-002
68
- gaps: "Некорректная атрибуция root cause QA-001 (check-conditions.js вместо check-relevance.js); внутреннее противоречие между стейджами по статусу зависимостей требует расследования check-relevance.js."
69
- ---RESULT---
3
+ agent: claude-sonnet
4
+ trial: 1
5
+ error: Agent exited with code 143
@@ -4,100 +4,95 @@
4
4
 
5
5
  ## Executive Summary
6
6
 
7
- Отчёт REPORT-002 содержит **некорректную атрибуцию root cause** для пропуска тикета QA-001. По данным лога пайплайна, стейдж `check-conditions` (файл `check-conditions.js`) отработал корректно и вернул `conditions_ok`. Решение о пропуске принял следующий стейдж `check-relevance` (`check-relevance.js`), выставив статус `irrelevant` по причине `dependencies_inactive`. Рекомендация из REPORT-002 направлена на исправление не того компонента, что делает её недействительной и потенциально опасной.
7
+ Верификация по логу `pipeline-2026-04-06_qa-001-skip.log` выявила **критическую ошибку атрибуции** в REPORT-002. `check-conditions.js` отработал корректно и вернул `conditions_ok` — атрибуция в предыдущем отчёте неверна. Решение о пропуске QA-001 принял стейдж `check-relevance` (строка 29 лога, `decision=irrelevant, reason=dependencies_inactive`). Дополнительно обнаружено противоречие между двумя стейджами в оценке зависимостей, что указывает на системную проблему в пайплайне.
8
8
 
9
9
  ---
10
10
 
11
- ## Верификация findings по логу пайплайна
11
+ ## Верификация findings по логу
12
12
 
13
- ### Трассировка шагов QA-001
13
+ ### Finding 1 — Поведение `check-conditions` (Steps 312–313)
14
14
 
15
- | Step | Стейдж | Скрипт | Результат | Верификация |
16
- |------|--------|--------|-----------|-------------|
17
- | 312 | `pick-next-task` | `script-pick` | ticket=QA-001, status=picked | ✅ Лог строка 4: `Selected ticket: QA-001 (plan PLAN-001, status=ready)` |
18
- | 313 | `check-conditions` | `check-conditions.js` | `conditions_ok` | ✅ Лог строки 13–18: все три проверки прошли, result=conditions_ok |
19
- | 314 | `check-relevance` | `check-relevance.js` | `irrelevant`, reason=`dependencies_inactive` | ✅ Лог строка 29: `COMPLETE ... status="irrelevant" reason="dependencies_inactive"` |
20
- | 315 | `skip-ticket` | `script-skip` | QA-001 → skipped/ | ✅ Лог строка 31: `Moving QA-001 → skipped/ (reason from check-relevance: dependencies_inactive)` |
15
+ | Параметр | Значение из лога |
16
+ |---|---|
17
+ | Stage | `check-conditions` |
18
+ | Script | `check-conditions.js` |
19
+ | `dependencies.resolved` | `true` |
20
+ | `prerequisites.met` | `true` |
21
+ | `blocking_tickets` | `[]` |
22
+ | Итоговый статус | `conditions_ok` |
21
23
 
22
- ### Детальный анализ стейджа check-conditions (Step 313)
24
+ **Вердикт `[HIGH]`:** `check-conditions.js` отработал корректно. Стейдж определил все условия как выполненные и передал тикет дальше. Атрибуция root cause в REPORT-002 (`check-conditions.js` неверно определил условия) — **ОШИБОЧНА**.
23
25
 
24
- ```
25
- [check-conditions] dependencies.resolved: true ← зависимости разрешены
26
- [check-conditions] prerequisites.met: true ← предусловия выполнены
27
- [check-conditions] blocking_tickets: [] ← блокеров нет
28
- [check-conditions] Result: conditions_ok
29
- ```
26
+ ---
30
27
 
31
- **Вывод `[HIGH]`:** `check-conditions.js` принял корректное решение. Атрибуция root cause в REPORT-002 на этот компонент — **ошибочна**.
28
+ ### Finding 2 — Поведение `check-relevance` (Step 314)
32
29
 
33
- ### Детальный анализ стейджа check-relevance (Step 314)
30
+ | Параметр | Значение из лога |
31
+ |---|---|
32
+ | Stage | `check-relevance` |
33
+ | Script | `check-relevance.js` |
34
+ | `dependencies.status` | `inactive` |
35
+ | `decision` | `irrelevant` |
36
+ | `reason` | `dependencies_inactive` |
37
+ | Итоговый статус | `irrelevant` |
34
38
 
35
- ```
36
- [check-relevance] dependencies.status: inactive
37
- [check-relevance] decision: irrelevant (dependencies inactive)
38
- [check-relevance] COMPLETE status="irrelevant" reason="dependencies_inactive"
39
- ```
40
-
41
- **Вывод `[HIGH]`:** Именно `check-relevance.js` принял решение о нерелевантности тикета. Причина — `dependencies.status: inactive`, тогда как на предыдущем стейдже `check-conditions` те же зависимости были оценены как `resolved: true`.
39
+ **Вердикт `[HIGH]`:** Именно `check-relevance.js` принял решение о нерелевантности тикета и инициировал его пропуск. Root cause находится здесь.
42
40
 
43
41
  ---
44
42
 
45
- ## Корневая причина (скорректированная)
43
+ ### Finding 3 — Противоречие между стейджами `[HIGH]`
46
44
 
47
- ### Противоречие между стейджами `[HIGH]`
45
+ Два последовательных стейджа дают **противоречивые оценки зависимостей** одного тикета:
48
46
 
49
- | Стейдж | Компонент | Оценка зависимостей | Решение |
50
- |--------|-----------|---------------------|---------|
51
- | `check-conditions` (Step 313) | `check-conditions.js` | `dependencies.resolved: true` | `conditions_ok` — пропускает дальше |
52
- | `check-relevance` (Step 314) | `check-relevance.js` | `dependencies.status: inactive` | `irrelevant` → skip |
47
+ | Стейдж | Оценка зависимостей |
48
+ |---|---|
49
+ | `check-conditions` (Step 313) | `dependencies.resolved: true` |
50
+ | `check-relevance` (Step 314) | `dependencies.status: inactive` |
53
51
 
54
- Два стейджа оценивают зависимости одного и того же тикета QA-001 **противоположно**: один видит их как resolved, другойкак inactive. Это указывает на одну из следующих причин:
52
+ Это указывает либо на то, что стейджи проверяют **разные аспекты** зависимостей (resolved active), либо на **несогласованность** между скриптами. Данный паттерн более серьёзная проблема, чем ошибочная атрибуция: пайплайн может систематически пропускать тикеты, у которых зависимости формально resolved, но неактивны.
55
53
 
56
- 1. **`[MEDIUM]`** `check-relevance.js` использует иной источник данных или иную семантику поля `dependencies` — без доступа к исходному коду не верифицируемо.
57
- 2. **`[MEDIUM]`** Между стейджами 313 и 314 произошло изменение состояния зависимостей — маловероятно при timestamps с разницей < 1 секунды.
58
- 3. **`[LOW]`** Оба стейджа смотрят на один источник, но интерпретируют разные поля (`resolved` vs `status`) — логическая несогласованность в дизайне.
54
+ ---
59
55
 
60
- **Реальный root cause:** `check-relevance.js` единственный компонент, принявший решение о пропуске QA-001.
56
+ ### Finding 4 `skip-ticket` (Step 315)
61
57
 
62
- ---
58
+ Стейдж `skip-ticket` явно указывает источник решения:
63
59
 
64
- ## Findings: исправленная атрибуция
60
+ ```
61
+ Moving QA-001 → skipped/ (reason from check-relevance: dependencies_inactive)
62
+ ```
65
63
 
66
- ### Finding 1Некорректный skip QA-001
64
+ **Вердикт `[HIGH]`:** Прямое подтверждение из лога решение о skip пришло от `check-relevance`, не от `check-conditions`.
67
65
 
68
- - **Статус в итерации:** skipped
69
- - **Root cause (REPORT-002):** `check-conditions.js` — **НЕВЕРНО** `[HIGH]`
70
- - **Root cause (скорректированный):** `check-relevance.js` — стейдж вернул `irrelevant` с reason=`dependencies_inactive`, несмотря на то что `check-conditions` подтвердил `conditions_ok` `[HIGH]`
71
- - **Затронутый компонент:** `.workflow/src/scripts/check-relevance.js`
72
- - **Приоритет:** HIGH
66
+ ---
73
67
 
74
- ### Finding 2 — Противоречивая семантика зависимостей между стейджами
68
+ ## Корректная атрибуция
75
69
 
76
- - **Описание:** `check-conditions.js` и `check-relevance.js` используют несогласованные метрики/источники для оценки зависимостей одного тикета `[MEDIUM]`
77
- - **Риск:** любой тикет с «частично разрешёнными» зависимостями может быть ошибочно пропущен
78
- - **Приоритет:** HIGH
70
+ | Атрибут | REPORT-002 (некорректно) | Корректно (по логу) |
71
+ |---|---|---|
72
+ | Root cause компонент | `check-conditions.js` | `check-relevance.js` |
73
+ | Причина skip | неверно определил условия запуска | `decision=irrelevant, reason=dependencies_inactive` |
74
+ | Статус `check-conditions` | — | `conditions_ok` (отработал верно) |
75
+ | Предложенное действие | исправить логику зависимостей в `check-conditions.js` | исследовать логику `check-relevance.js` и устранить противоречие с `check-conditions.js` |
79
76
 
80
77
  ---
81
78
 
82
79
  ## Рекомендации
83
80
 
84
- | # | Действие | Компонент | Приоритет | Ожидаемый результат |
85
- |---|----------|-----------|-----------|---------------------|
86
- | 1 | Исправить логику оценки зависимостей в `check-relevance.js`: привести семантику `dependencies.status` в соответствие с `check-conditions.js` | `check-relevance.js` | **HIGH** | Устранение ложных срабатываний `irrelevant` при корректных зависимостях |
87
- | 2 | Добавить cross-check: если `check-conditions` вернул `conditions_ok`, `check-relevance` не должен принимать решение на основе `dependencies` без явного изменения их состояния | Архитектура пайплайна | **HIGH** | Устранение класса противоречий между стейджами |
88
- | 3 | Отозвать рекомендацию из REPORT-002 («пересмотреть пороги `check-conditions.js`») она основана на ошибочной атрибуции и может привести к регрессии | REPORT-002 | **MEDIUM** | Предотвращение ненужных изменений в корректно работающем компоненте |
89
- | 4 | Добавить интеграционный тест: сценарий, где `check-conditions` → `conditions_ok`, а `check-relevance` → `irrelevant`, должен логировать предупреждение или требовать явного объяснения | Тест-сьют | **MEDIUM** | Детектирование аналогичных противоречий в будущих итерациях |
81
+ | # | Действие | Компонент | Приоритет |
82
+ |---|---|---|---|
83
+ | 1 | Исследовать `check-relevance.js`: почему `dependencies.status=inactive` при `dependencies.resolved=true` в том же прогоне | `check-relevance.js` | **CRITICAL** |
84
+ | 2 | Определить семантическое различие между `resolved` (check-conditions) и `active` (check-relevance) если различие легитимно, задокументировать; если нет устранить дублирование | оба скрипта | **HIGH** |
85
+ | 3 | Добавить в REPORT-002 корригирующую запись с исправленной атрибуцией | документация | **MEDIUM** |
86
+ | 4 | Добавить в пайплайн assertion: если `check-conditions=conditions_ok`, а `check-relevance=irrelevant`, логировать явное предупреждение о противоречии | `PipelineRunner` | **MEDIUM** |
90
87
 
91
88
  ---
92
89
 
93
90
  ## За пределами скоупа
94
91
 
95
- Остальные 4 тикета итерации не анализировалисьданных по ним в предоставленных артефактах нет.
96
-
97
- ---
92
+ Общий прогресс PLAN-001 (остальные 4 тикета итерации) не верифицировалсязадача ограничена атрибуцией QA-001.
98
93
 
99
94
  ---RESULT---
100
95
  status: has_gaps
101
96
  report_id: REPORT-002
102
- gaps: "Некорректная атрибуция root cause в REPORT-002: `check-conditions.js` не причастен к пропуску QA-001 — решение принял `check-relevance.js` (reason=dependencies_inactive). Рекомендация из REPORT-002 направлена на неверный компонент; требуется исправление `check-relevance.js` и согласование семантики зависимостей между стейджами."
97
+ gaps: "Ошибочная атрибуция root cause QA-001: REPORT-002 указывает check-conditions.js, лог подтверждает check-relevance.js (decision=irrelevant, reason=dependencies_inactive). Обнаружено противоречие зависимостей между стейджами, требует исследования check-relevance.js."
103
98
  ---RESULT---
@@ -1,79 +1,77 @@
1
1
  ## Анализ прогресса PLAN-001 — Верификация атрибуции QA-001
2
2
 
3
- **Дата анализа:** 2026-04-20
4
- **Источники:** REPORT-002-incorrect-attribution.md, pipeline-2026-04-06_qa-001-skip.log
3
+ **Дата:** 2026-04-25
4
+ **Тикет:** ANL (PROGRESS)
5
+ **Источник:** REPORT-002-incorrect-attribution.md + pipeline-2026-04-06_qa-001-skip.log
5
6
 
6
7
  ---
7
8
 
8
9
  ## Executive Summary
9
10
 
10
- Верификация по логу пайплайна показала, что root cause в REPORT-002 атрибутирован **некорректно**. Стейдж `check-conditions` (шаг 313) вернул `conditions_ok` QA-001 прошёл все проверки условий. Решение о skip принял стейдж `check-relevance` (шаг 314, строка с `decision=irrelevant, reason=dependencies_inactive`). REPORT-002 содержит ошибочное указание на `check-conditions.js` как источник проблемы, что ведёт к некорректной рекомендации. QA-001 остаётся невыполненнымплан имеет пробел.
11
+ Предыдущий отчёт REPORT-002 содержит **некорректную атрибуцию root cause** для пропущенного тикета QA-001. Лог пайплайна однозначно показывает: `check-conditions.js` вернул `conditions_ok` (условия выполнены), а решение о skip принял стейдж `check-relevance` (`decision=irrelevant`, `reason=dependencies_inactive`). Рекомендации из REPORT-002, направленные на исправление `check-conditions.js`, не адресуют реальную проблему. Дополнительно выявлено противоречие в данных между двумя стейджами: `check-conditions` сообщает `dependencies.resolved: true`, а `check-relevance` `dependencies.status: inactive`.
11
12
 
12
13
  ---
13
14
 
14
15
  ## Верификация findings по логу
15
16
 
16
- ### Трассировка обработки QA-001
17
+ ### Трассировка пайплайна QA-001
17
18
 
18
- | Шаг | Стейдж | Компонент | Результат | Атрибуция проблемы |
19
- |-----|--------|-----------|-----------|-------------------|
20
- | 312 | `pick-next-task` | `script-pick` | `status=picked` — QA-001 выбран | |
21
- | 313 | `check-conditions` | `check-conditions.js` | `conditions_ok` все условия пройдены | **Ложная атрибуция в REPORT-002** |
22
- | 314 | `check-relevance` | `check-relevance.js` | `status=irrelevant`, `reason=dependencies_inactive` | **Реальный источник skip** |
23
- | 315 | `skip-ticket` | `script-skip` | QA-001 → skipped/, причина из `check-relevance` | Следствие шага 314 |
19
+ | Step | Stage | Компонент | Результат | Верифицировано |
20
+ |------|-------|-----------|-----------|----------------|
21
+ | 312 | `pick-next-task` | `script-pick` | QA-001 выбран, status=ready | |
22
+ | 313 | `check-conditions` | `check-conditions.js` | **conditions_ok** (все условия выполнены) | |
23
+ | 314 | `check-relevance` | `check-relevance.js` | **irrelevant**, reason=dependencies_inactive | решение о skip здесь |
24
+ | 315 | `skip-ticket` | `script-skip` | QA-001 → skipped/, reason из check-relevance | |
24
25
 
25
- ### Детали шага 313 — `check-conditions` (лог)
26
+ ### Детальный анализ стейджа check-conditions (Step 313)
26
27
 
27
28
  ```
28
- - dependencies.resolved: true
29
- - prerequisites.met: true
30
- - blocking_tickets: []
31
- Result: conditions_ok
29
+ dependencies.resolved: true ← зависимости РАЗРЕШЕНЫ
30
+ prerequisites.met: true ← пресквизиты ВЫПОЛНЕНЫ
31
+ blocking_tickets: [] ← блокеров НЕТ
32
+ Result: conditions_ok ← стейдж ПРОПУСТИЛ тикет дальше
32
33
  ```
33
34
 
34
- **Вывод [HIGH]:** `check-conditions.js` выполнил проверку корректно. Зависимости резолвлены, пререквизиты выполнены, блокирующих тикетов нет. Компонент не является источником проблемы.
35
+ `check-conditions.js` отработал корректно и не принимал решения о skip. `[HIGH]`
35
36
 
36
- ### Детали шага 314 — `check-relevance` (лог)
37
+ ### Детальный анализ стейджа check-relevance (Step 314)
37
38
 
38
39
  ```
39
- - dependencies.status: inactive
40
- - decision: irrelevant (dependencies inactive)
41
- COMPLETE status="irrelevant" reason="dependencies_inactive"
40
+ dependencies.status: inactive ← зависимости НЕАКТИВНЫ
41
+ decision: irrelevant тикет признан нерелевантным
42
+ reason: dependencies_inactive ← причина — неактивные зависимости
43
+ COMPLETE status="irrelevant" ← статус передан в skip-ticket
42
44
  ```
43
45
 
44
- **Вывод [HIGH]:** Стейдж `check-relevance` получил `dependencies.status: inactive` и принял решение `irrelevant`, инициировав skip. Это противоречит результату шага 313, где `dependencies.resolved: true`.
46
+ Именно `check-relevance.js` принял решение о нерелевантности и инициировал skip. `[HIGH]`
45
47
 
46
48
  ---
47
49
 
48
- ## Ключевые находки
50
+ ## Корректная атрибуция root cause
49
51
 
50
- ### F1 Некорректная атрибуция root cause в REPORT-002 [HIGH]
52
+ | Атрибут | REPORT-002 (некорректно) | Фактически (по логу) |
53
+ |---------|--------------------------|----------------------|
54
+ | **Компонент** | `check-conditions.js` | `check-relevance.js` |
55
+ | **Причина** | «неверно определил условия запуска» | `dependencies.status: inactive` → `decision=irrelevant` |
56
+ | **Результат компонента** | (не указан) | `status="irrelevant"` → передано в `skip-ticket` |
57
+ | **Инициатор skip** | `check-conditions.js` | `skip-ticket` по результату `check-relevance` |
51
58
 
52
- - **Факт:** REPORT-002 указывает `check-conditions.js` как причину skip QA-001
53
- - **Опровержение по логу:** `check-conditions.js` вернул `conditions_ok` на шаге 313
54
- - **Реальная причина:** `check-relevance.js` на шаге 314 вернул `irrelevant` по `dependencies_inactive`
55
- - **Следствие:** Рекомендация из REPORT-002 («пересмотреть пороги `check-conditions.js`») — **неверная**; применение этой рекомендации не устранит проблему
56
-
57
- ### F2 — Противоречие между `check-conditions` и `check-relevance` [HIGH]
59
+ ---
58
60
 
59
- - **Факт:** Шаг 313 — `dependencies.resolved: true`; Шаг 314 — `dependencies.status: inactive`
60
- - **Интерпретация [MEDIUM]:** Два стейджа используют разные источники или разную семантику поля `dependencies`. Либо `check-conditions` проверяет факт наличия зависимостей (есть/нет), а `check-relevance` — их активность (active/inactive). Либо рассинхронизация данных между шагами.
61
- - **Следствие:** Тикет QA-001 прошёл conditions-проверку, но был отклонён по relevance на основании состояния, которое conditions-проверка не охватывает
61
+ ## Дополнительный finding: противоречие между стейджами
62
62
 
63
- ### F3 QA-001 не выполнен, план имеет пробел [HIGH]
63
+ **`[HIGH]`** Обнаружено противоречие в данных:
64
64
 
65
- - **Факт:** QA-001 находится в `skipped/`, задача не выполнена
66
- - **Следствие для PLAN-001:** Итерация закрыта без выполнения QA-001; прогресс по плану неполный
65
+ - `check-conditions.js` (Step 313): `dependencies.resolved: true`
66
+ - `check-relevance.js` (Step 314): `dependencies.status: inactive`
67
67
 
68
- ---
68
+ Два стейджа получили **взаимоисключающие результаты** по зависимостям одного тикета QA-001 в рамках одной итерации пайплайна. Возможные причины:
69
69
 
70
- ## Скорректированная атрибуция
70
+ 1. Стейджи используют **разные источники данных** или разные поля для оценки зависимостей
71
+ 2. **Семантическое расхождение**: `resolved` (зависимости определены/найдены) vs `inactive` (зависимости не активны/не выполнены)
72
+ 3. Ошибка в одном из скриптов при чтении состояния зависимостей
71
73
 
72
- | Компонент | Атрибуция в REPORT-002 | Корректная атрибуция | Обоснование |
73
- |-----------|----------------------|---------------------|-------------|
74
- | `check-conditions.js` | Root cause | Не причастен | Вернул `conditions_ok`, шаг 313 |
75
- | `check-relevance.js` | Не упомянут | **Root cause** | Вернул `irrelevant/dependencies_inactive`, шаг 314 |
76
- | `skip-ticket` | Не упомянут | Исполнитель skip | Выполнил skip по решению `check-relevance`, шаг 315 |
74
+ Это противоречие само по себе является самостоятельной проблемой, независимо от вопроса атрибуции skip.
77
75
 
78
76
  ---
79
77
 
@@ -81,19 +79,21 @@ COMPLETE status="irrelevant" reason="dependencies_inactive"
81
79
 
82
80
  | # | Действие | Приоритет | Ожидаемый результат |
83
81
  |---|----------|-----------|---------------------|
84
- | 1 | Исследовать `check-relevance.js`: почему `dependencies.status=inactive` при уже резолвленных `dependencies.resolved=true` | **CRITICAL** | Устранение реальной причины skip QA-001 |
85
- | 2 | Выявить семантическое расхождение между полями `dependencies.resolved` и `dependencies.status` в двух стейджах | **HIGH** | Устранение потенциальной системной ошибки классификации тикетов |
86
- | 3 | Переоткрыть QA-001 и выполнить в следующей итерации после устранения причины | **HIGH** | Закрытие пробела в PLAN-001 |
87
- | 4 | Обновить REPORT-002 с корректной атрибуцией (или создать REPORT-002-corrected) | **MEDIUM** | Устранение ложного следа для будущих ретроспектив |
82
+ | 1 | Исправить root cause в REPORT-002: заменить `check-conditions.js` `check-relevance.js`, скорректировать описание и рекомендации | **CRITICAL** | Отчёт содержит корректные данные; команда не тратит время на исправление не того компонента |
83
+ | 2 | Расследовать логику `check-relevance.js`: почему `dependencies.status=inactive` при `dependencies.resolved=true` из предыдущего стейджа | **HIGH** | Устранение реальной причины skip QA-001; понимание, действительно ли тикет был нерелевантен |
84
+ | 3 | Уточнить семантику полей `dependencies.resolved` и `dependencies.status` в документации пайплайна: разные ли это концепции или дублирующиеся проверки | **HIGH** | Предотвращение будущих противоречий и некорректных атрибуций |
85
+ | 4 | Добавить в пайплайн cross-validation: если `check-conditions` возвращает `conditions_ok`, а `check-relevance` возвращает `irrelevant` по зависимостям — логировать предупреждение | **MEDIUM** | Ранняя детектируемость аналогичных расхождений в будущем |
88
86
 
89
87
  ---
90
88
 
91
89
  ## За пределами скоупа
92
90
 
93
- Лог содержит только итерацию обработки QA-001 (шаги 312–315). Состояние остальных 4 тикетов итерации не верифицировано по логу — данных нет.
91
+ Остальные 4 тикета итерации (упомянуты в REPORT-002 без деталей) в данный анализ не включены исходные данные по ним отсутствуют.
92
+
93
+ ---
94
94
 
95
95
  ---RESULT---
96
96
  status: has_gaps
97
97
  report_id: REPORT-002
98
- gaps: "QA-001 не выполнен (skipped по некорректной причине в check-relevance.js); root cause атрибуция в REPORT-002 ошибочнатребуется исследование check-relevance.js и переоткрытие QA-001"
98
+ gaps: "Некорректная атрибуция root cause QA-001 (check-conditions.js вместо check-relevance.js); обнаружено противоречие между стейджами (dependencies.resolved=true vs dependencies.status=inactive) требует расследования check-relevance.js и пересмотра рекомендаций отчёта."
99
99
  ---RESULT---
@@ -87,77 +87,77 @@
87
87
  },
88
88
  "rubric_scores": [
89
89
  {
90
- "agentId": "claude-sonnet",
90
+ "agentId": "kilo-deepseek",
91
91
  "trial": 1,
92
92
  "score": 5,
93
93
  "errored": false
94
94
  },
95
95
  {
96
- "agentId": "claude-sonnet",
96
+ "agentId": "kilo-deepseek",
97
97
  "trial": 2,
98
98
  "score": 5,
99
99
  "errored": false
100
100
  },
101
101
  {
102
- "agentId": "claude-sonnet",
102
+ "agentId": "kilo-deepseek",
103
103
  "trial": 3,
104
104
  "score": 5,
105
105
  "errored": false
106
106
  },
107
107
  {
108
- "agentId": "kilo-deepseek",
108
+ "agentId": "kilo-glm",
109
109
  "trial": 1,
110
110
  "score": 5,
111
111
  "errored": false
112
112
  },
113
113
  {
114
- "agentId": "kilo-deepseek",
114
+ "agentId": "kilo-glm",
115
115
  "trial": 2,
116
116
  "score": 5,
117
117
  "errored": false
118
118
  },
119
119
  {
120
- "agentId": "kilo-deepseek",
120
+ "agentId": "kilo-glm",
121
121
  "trial": 3,
122
122
  "score": 5,
123
123
  "errored": false
124
124
  },
125
125
  {
126
- "agentId": "kilo-glm",
126
+ "agentId": "kilo-minimax",
127
127
  "trial": 1,
128
128
  "score": 5,
129
129
  "errored": false
130
130
  },
131
131
  {
132
- "agentId": "kilo-glm",
132
+ "agentId": "kilo-minimax",
133
133
  "trial": 2,
134
- "score": 5,
134
+ "score": 4,
135
135
  "errored": false
136
136
  },
137
137
  {
138
- "agentId": "kilo-glm",
138
+ "agentId": "kilo-minimax",
139
139
  "trial": 3,
140
140
  "score": 5,
141
141
  "errored": false
142
142
  },
143
143
  {
144
- "agentId": "kilo-minimax",
144
+ "agentId": "claude-sonnet",
145
145
  "trial": 1,
146
146
  "score": 5,
147
147
  "errored": false
148
148
  },
149
149
  {
150
- "agentId": "kilo-minimax",
150
+ "agentId": "claude-sonnet",
151
151
  "trial": 2,
152
- "score": 4,
152
+ "score": 5,
153
153
  "errored": false
154
154
  },
155
155
  {
156
- "agentId": "kilo-minimax",
156
+ "agentId": "claude-sonnet",
157
157
  "trial": 3,
158
158
  "score": 5,
159
159
  "errored": false
160
160
  }
161
161
  ],
162
- "timestamp": "2026-04-20T12:18:36.988Z"
162
+ "timestamp": "2026-04-25T10:23:46.985Z"
163
163
  }
@@ -1,8 +1,8 @@
1
1
  {
2
- "date": "2026-04-20T12:18:36.989Z",
2
+ "date": "2026-04-25T10:23:46.986Z",
3
3
  "skill_sha": "7d62ab4",
4
4
  "status": "passed",
5
- "duration_ms": 328729,
5
+ "duration_ms": 50868,
6
6
  "l1_skipped": true,
7
7
  "per_model": {
8
8
  "claude-sonnet": {
@@ -40,73 +40,73 @@
40
40
  },
41
41
  "rubric_scores": [
42
42
  {
43
- "agentId": "claude-sonnet",
43
+ "agentId": "kilo-deepseek",
44
44
  "trial": 1,
45
45
  "score": 5,
46
46
  "errored": false
47
47
  },
48
48
  {
49
- "agentId": "claude-sonnet",
49
+ "agentId": "kilo-deepseek",
50
50
  "trial": 2,
51
51
  "score": 5,
52
52
  "errored": false
53
53
  },
54
54
  {
55
- "agentId": "claude-sonnet",
55
+ "agentId": "kilo-deepseek",
56
56
  "trial": 3,
57
57
  "score": 5,
58
58
  "errored": false
59
59
  },
60
60
  {
61
- "agentId": "kilo-deepseek",
61
+ "agentId": "kilo-glm",
62
62
  "trial": 1,
63
63
  "score": 5,
64
64
  "errored": false
65
65
  },
66
66
  {
67
- "agentId": "kilo-deepseek",
67
+ "agentId": "kilo-glm",
68
68
  "trial": 2,
69
69
  "score": 5,
70
70
  "errored": false
71
71
  },
72
72
  {
73
- "agentId": "kilo-deepseek",
73
+ "agentId": "kilo-glm",
74
74
  "trial": 3,
75
75
  "score": 5,
76
76
  "errored": false
77
77
  },
78
78
  {
79
- "agentId": "kilo-glm",
79
+ "agentId": "kilo-minimax",
80
80
  "trial": 1,
81
81
  "score": 5,
82
82
  "errored": false
83
83
  },
84
84
  {
85
- "agentId": "kilo-glm",
85
+ "agentId": "kilo-minimax",
86
86
  "trial": 2,
87
- "score": 5,
87
+ "score": 4,
88
88
  "errored": false
89
89
  },
90
90
  {
91
- "agentId": "kilo-glm",
91
+ "agentId": "kilo-minimax",
92
92
  "trial": 3,
93
93
  "score": 5,
94
94
  "errored": false
95
95
  },
96
96
  {
97
- "agentId": "kilo-minimax",
97
+ "agentId": "claude-sonnet",
98
98
  "trial": 1,
99
99
  "score": 5,
100
100
  "errored": false
101
101
  },
102
102
  {
103
- "agentId": "kilo-minimax",
103
+ "agentId": "claude-sonnet",
104
104
  "trial": 2,
105
- "score": 4,
105
+ "score": 5,
106
106
  "errored": false
107
107
  },
108
108
  {
109
- "agentId": "kilo-minimax",
109
+ "agentId": "claude-sonnet",
110
110
  "trial": 3,
111
111
  "score": 5,
112
112
  "errored": false