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