Skip to content

[Epic] Upstream Symphony spec 동기화 — 2026-08 SPEC drift 해소 #651

Description

@moncher-dev

개요

로컬 스펙 사본 docs/symphony-spec.md(bc694f3, 2026-03-09)와 upstream openai/symphony SPEC.md(8001b52, 2026-08-12) 사이에 5개월치 변경이 쌓였다. 리서치 리포트 docs/reports/2026-08-28-upstream-spec-drift-research.md (PR #650)가 구현(5b25655)을 새 스펙에 대조해 Drift 19건(A), 처음부터 미구현 24건(B), 라벨 안 된 divergence 13건(C), 문서 오류 8건(D), **버그/dead code 11건(E)**을 path:line 증거와 함께 정리했다. 이 Epic은 그 항목들을 PR 단위 하위 이슈로 묶어 추적한다.

한 문장: 스펙은 tracker-agnostic 계약으로 바뀌었고, 우리 구현은 아직 Linear 시대 계약 위에 GitHub 확장을 얹은 모양이다.

upstream 변경 요약

영역 새 규칙
tracker 설정 tracker.kind + 불투명 tracker.provider 객체, required_labels(ALL-of, 대소문자 무시), active/terminal states는 어댑터 프로필이 기본값을 문서화하지 않으면 REQUIRED
Issue 모델 dispatchable(REQUIRED, 어댑터 파생), native_ref, assignee_id; 라벨 trim/lowercase/dedupe; 타임스탬프 RFC 3339 파싱
적격성 오케스트레이터는 dispatchable + required_labels만 적용; provider blocker/board 의미론으로 분기 금지
어댑터 연산 fetch_issues_by_states + fetch_issues_by_ids(전체 스냅샷); 빈 입력 → provider 호출 없이 빈 결과
Retry / Reconcile 단일 ID refresh; terminal → cleanup+release; refresh 실패 → requeue; 슬롯 부족 → requeue; routable 아님 → cleanup 없이 종료
Workspace key sanitize로 바뀐 identifier는 64-bit 해시 suffix
검증 integer-only; hooks.timeout_ms/max_turns 무효값은 검증 실패
런타임 turn_timeout_ms는 silence interval; 툴은 host-side 실행, 트래커 시크릿은 child에 미상속, secret_environment_names()
문서 어댑터별 compact profile(§11.2), 툴 계약 문서, implementation-defined 동작은 MUST document

워크스트림과 하위 이슈

W0 스펙 동기화

W1 정확성 핫픽스 — 모델 변경 없음, 병렬 가능

W2 Tracker-agnostic 모델 — 순차

W3 설정 계층

W4 시크릿·툴 격리

W5 문서·관측

B20(Claude 런타임 토큰 집계)은 #645 Epic의 첫 하위 항목으로 그쪽에서 발행한다.

순서

Critical path: S9 → S13 → S21, S15 → S17 → S22. 나머지 16개는 즉시 착수 가능. blocked-by 관계는 실제 기술 의존에만 걸었고, 권장 착수 순서는 W1 → W2 → W3 → W4 → W5.

결정 사항 (2026-08-28 확정)

# 결정 반영 이슈
1 툴 격리: (a) host-side 실행 — 트랜지션 전략(2026-08-28 확정): Phase 1a(#672, raw 토큰 제거·기능 손실 없음) → Phase 2(#673, 두 런타임 host-side 툴) → Phase 1b(#700, MCP 비활성화·Git 대행·HOME 격리, #673과 같은 릴리스에서만 병합). 최종 도달점은 ADR 그대로 #671 (ADR) → #672#673#700
2 priority 정렬: (b) ADR 2026-05-18 supersede — 숫자 오름차순 유지를 documented different mapping으로 기록, Linear 0null #660
3 flat 트래커 키: (a) deprecated alias 유지 (non-breaking), doctor가 변환된 provider 블록 출력, 다음 major에서 제거 #669, 제거 트래킹 #679 (사인 전 착수 금지)
4 워크스페이스 키: (a) legacy 키 병행 조회, 디스크 rename 없음, repo status에 legacy 표시 #666
5 approval 정책: never 외 값은 설정 검증에서 거부 (핸들러 미구현) #658
6 blocker_check_states: tracker.provider로 이동 (폐기 아님) #663
7 Docker E2E 동시 실행 충돌 임시 완화: max_concurrent_agents: 10 유지(2026-08-28). 근본 수정은 #692; #693이 한 번 더 거절되면 하향(1–2) 재검토 #692
8 WIP 상한 8 (Ready + In progress + In review 합산, 2026-08-28): 병합 시 rebase·충돌 해소·재검증 공수를 줄이기 위함. 상한 초과 시 PR 없는 Ready부터 Backlog로 내리고, 신규 픽업은 총 WIP < 8일 때만 보드 운영
9 Land = 에이전트 병합 트리거 (2026-08-28 확인): Land 이동 시 에이전트가 approve된 PR을 squash-merge하고 Done 처리. 보드 쓰기는 반드시 직전에 현재 상태·이슈 open 여부를 재확인(가드)하고 닫힌/Done 항목은 건드리지 않음 — stale 스냅샷 쓰기로 #687/#665가 Done→Land로 회귀했던 사고의 재발 방지 보드 운영

범위 외

  • Appendix A SSH worker extension (OPTIONAL) — docs/architecture.md에 범위 외로 한 줄 표기 (S23)
  • 새 스펙이 MAY로 둔 fallback prompt (A20)

완료 기준

  • 위 하위 이슈 전부 close
  • docs/symphony-spec.md가 upstream 8001b52와 일치하고 docs/README.md의 "Draft v1" 표기 갱신
  • 리포트의 A/B 항목이 코드 또는 문서화된 divergence로 각각 해소되어 2026-08-28-upstream-spec-drift-research.md 헤더 status가 갱신됨
  • 새 §17 conformance 행에 대응하는 테스트가 pnpm test에 포함

Metadata

Metadata

Assignees

No one assigned

    Labels

    epicTracking issue grouping multiple sub-issuesspec-gapSymphony spec compliance gap

    Projects

    Status
    Backlog

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions