[P0] DevPL v2 WBS path 회귀 — daemon/wbs_parser가 산출물을 못 찾아 sub-ticket 0건
의사결정
bulk_cancel_2026-05-09_pre_rebuild
내용
=== P0 사고 (priority=1, P0 tag) ===
어제 commit 54fd5a2 (14봇 페르소나 v2) 이후 오늘 DevPL이 산출물은 정상 생성하나
daemon이 못 찾아 sub-ticket DB INSERT 0건. BE/FE/QA 모두 실제 작업 0건.
=== 확정 증거 ===
1. v2 DevPL 페르소나 출력 경로:
.claude/agents/DevPL.md:556 → outputs/{ticket_id}/devpl/work_breakdown.json
2. daemon read 경로:
scripts/nexai_daemon.py:539 → outputs/{ext_id}/work_breakdown.json (devpl/ 없음)
3. wbs_parser read 경로:
scripts/wbs_parser.py:90 → OUTPUTS_DIR / parent_ext_id / "work_breakdown.json" (devpl/ 없음)
4. 실제 산출물 위치:
outputs/OPS-0507-CHAIN-DISPATCH-STAGE-TO-FIX/devpl/work_breakdown.json (정상, sub_tasks 2건)
outputs/OPS-0507-CHAIN-COORDINATOR-REGISTRY-FIX/devpl/work_breakdown.json (정상)
outputs/OPS-0507-ADDIN-PPTX-SLIDE-422-FIX/devpl/work_breakdown.json (정상)
5. daemon log 에러:
logs/system/daemon/2026-05-07.log 19:26 — devpl_no_wbs_json ticket=OPS-0507-CHAIN-DISPATCH-STAGE-TO-FIX
logs/system/daemon/2026-05-07.log 19:26 — devpl_no_wbs_json ticket=OPS-0507-CHAIN-COORDINATOR-REGISTRY-FIX
6. 결과: sub-ticket INSERT 0건 → BE/FE/QA dispatch 0건 → outputs/는 모두 devpl/ 디렉토리만
=== 부수 사고 (가설 검증) ===
H-A. 부모 티켓 DB 부재 — Ghost DevPL 호출
- OPS-0507-CHAIN-DISPATCH-STAGE-TO-FIX 등 9건의 부모 티켓이 tickets 테이블에 없음
- run_role.sh DevPL는 ticket_not_found 시 exit 1 — 다른 호출 경로 존재
- 후보: handoff queue 직접 spawn / cron / 수동 / DB INSERT 후 cleanup 삭제
- 검증: queues/handoff/_processed/20260507/ + journalctl 5월 7일 전수
H-B. WBS sub_tasks id 스키마 불일치 — 잠재 폭탄
- 페르소나 명세 (.claude/agents/DevPL.md:263-280): "id": "OPS-0427-002-S01" (full prefix)
- 실제 산출물: "id": "S01" (suffix only)
- wbs_parser.py:127: sub_ticket_id = str(uuid.uuid4())[:8] — id 필드 무시 후 uuid
- 현재는 우회되나 페르소나 ↔ 파서 일관성 깨짐 → 추후 회귀 위험
=== Scope ===
step_1 (P0 즉시 fix) — Path 통일:
옵션 (a) 권고: daemon/parser를 v2 페르소나에 맞춤
- scripts/nexai_daemon.py:539 → outputs/{ext_id}/devpl/work_breakdown.json
- scripts/wbs_parser.py:90 → OUTPUTS_DIR / parent_ext_id / "devpl" / "work_breakdown.json"
- 호환: 옛 경로(devpl/ 없음)도 fallback try 후 deprecate 예고 로그
옵션 (b) 비권고: 페르소나를 옛 경로로 후퇴 → v2 표준 망가짐
→ (a) 채택
step_2 — 적체 산출물 재처리:
outputs/OPS-0507-* 9건 대상
python3 scripts/wbs_parser.py <parent_ext_id> 수동 실행 → sub-ticket INSERT
부모 티켓이 DB에 있어야 함 — 없으면 step_3 결과 따라 처리
step_3 (H-A 검증) — Ghost DevPL 호출 출처:
- grep -rE "DevPL|devpl" /home/iaas/nexai/scripts /home/iaas/nexai/cron 모든 호출자 enum
- find /home/iaas/nexai/queues/handoff/_processed/20260507/ -name "*DevPL*" 또는 *devpl* 전수
- sudo journalctl -u nexai-daemon --since "2026-05-07 00:00" | grep -E "devpl_dispatched|run_role" 추적
- sudo journalctl _COMM=python3 --since "2026-05-07 00:00" | grep -E "DevPL.*ticket=" 전수
- outputs/OPS-0507-DEVPL-V2-WBS-PATH-REGRESSION/ghost_caller_trace.md 정리
- "ticket DB 없이도 호출 가능한 path" 발견 시 P1 별도 fix 대상
step_4 (H-B 정합성) — id 스키마:
- .claude/agents/DevPL.md:263-280 명세를 wbs_parser.py 실제 동작에 맞춤
- 권고: 페르소나 명세를 suffix-only "S01"로 명시 + parser는 그대로 (uuid 충돌 방지)
step_5 — 회귀 방지 테스트:
tests/test_devpl_wbs_pipeline.py
- test_wbs_at_devpl_subdir_is_found() ← path mismatch 회귀 차단
- test_wbs_at_legacy_root_path_fallback() ← fallback 동작
- test_wbs_no_sub_tasks_quarantines()
- test_wbs_sub_tasks_create_subtickets_in_db() ← end-to-end
=== Evidence Paths ===
outputs/OPS-0507-DEVPL-V2-WBS-PATH-REGRESSION/
├── path_mismatch_proof.txt # grep 3개 위치 + 실제 파일 ls
├── nexai_daemon.diff # step_1 (a) diff
├── wbs_parser.diff # step_1 (a) diff
├── reprocess_log.txt # step_2 9건 wbs_parser 수동 실행 결과
├── ghost_caller_trace.md # step_3 ghost DevPL 출처 분석
├── id_schema_alignment.diff # step_4 페르소나 또는 parser 수정
├── test_run.txt # pytest 출력
└── post_fix_e2e.md # 신규 dev 티켓 1건 만들어 BE까지 도달 확인
=== Acceptance Criteria ===
- nexai_daemon.py:539 + wbs_parser.py:90 둘 다 outputs/{ticket}/devpl/work_breakdown.json 우선 read (fallback 옛 path)
- 적체 9건 중 부모 티켓 존재하는 건 모두 sub-ticket INSERT 성공 (DB SELECT 검증)
- ghost_caller_trace.md에 ticket DB 없이 DevPL 호출 가능한 모든 경로 명시 (file:line)
- 신규 dev 티켓 1건 → DevPL → wbs_parser → BE sub-ticket dispatch까지 5분 내 도달 (post_fix_e2e.md)
- pytest tests/test_devpl_wbs_pipeline.py 4 케이스 pass
- daemon log devpl_no_wbs_json 24시간 0건
=== Caution ===
- step_1을 옵션 (b)(페르소나 후퇴)로 가지 말 것 — v2 표준 깨짐
- step_3 ghost caller 추적 전 step_2만 처리하면 재발
- 토큰/credential 평문 금지
- 페르소나 v2 자체 롤백 절대 금지 (다른 13봇 영향 → 새 회귀)
=== Why P0 (priority=1) ===
- 오늘 dev 작업 통째로 마비. outputs/만 쌓이고 BE/FE/QA 0건
- 매 5분 daemon log ERROR + 실패 텔레그램 1건씩 누적
- 어제 commit 회귀 직접 추적 가능한 단순 path 사고
- 6시간 이내 fix 추정
handoff_after_done: QA → reviewer (correctness + testing-reviewer 필수)
핸드오프 체인
1.
2026-05-09 07:35
ceo → system
"bulk_cancel — 미완료 전체 폐기 (시스템 재구축 전 청산)"
체이닝 타임라인
자동 체이닝 이력이 없습니다
산출물
아직 산출물이 없습니다
수정
관련 로그
관련 봇 로그 없음