feat(cli,docs): generate provider-form workflows - #764
Conversation
Coverage Report
File Coverage
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 862eaf6ef5
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| provider.active_states = input.lifecycle.activeStates; | ||
| } | ||
|
|
||
| if (input.lifecycle.terminalStates.length > 0) { | ||
| tracker.terminal_states = input.lifecycle.terminalStates; | ||
| provider.terminal_states = input.lifecycle.terminalStates; |
There was a problem hiding this comment.
Keep core lifecycle states at tracker level
When this generated workflow is consumed by a spec-conformant Symphony implementation, its custom lifecycle can be ignored because docs/symphony-spec.md:611-615 defines active_states and terminal_states as core tracker.* fields, while tracker.provider contains adapter-owned settings. The local parser accepts these nested fields as an extension, masking the incompatibility in the round-trip tests; emit these two fields directly under tracker and reserve provider for adapter-specific configuration.
AGENTS.md reference: AGENTS.md:L29-L32
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Resolved in 5ee5c90. active_states and terminal_states now remain core tracker fields in every generated GitHub and Linear workflow; tracker.provider is reserved for adapter-owned settings. Regression coverage asserts that neither lifecycle field is emitted in the provider block.
| lines.push(`${padding}# source: labels`); | ||
| lines.push(`${padding}# P0: 0`); |
There was a problem hiding this comment.
Restore the labels key in the optional mapping
When priority is disabled and a user follows this generated reference to enable the optional labels source, uncommenting the example produces source: labels followed directly by the over-indented P0 and P1 entries. The removed labels: mapping makes the example invalid YAML rather than a usable priority configuration, so the template needs a commented labels: line between the source and label values.
Useful? React with 👍 / 👎.
| adapter kind, GitHub Project ID or Linear project slug, endpoint, resolved | ||
| provider path, pickup labels, priority mapping, and tracker state settings. | ||
| Editing the corresponding `tracker.provider` values in `WORKFLOW.md` does not | ||
| reconfigure an already-running daemon or rewrite that runtime configuration. |
There was a problem hiding this comment.
Treat lifecycle settings as live-reloaded
This initialization-bound list incorrectly includes tracker state settings: on every reconciliation, OrchestratorService.resolveCandidateTrackerDependencies() passes the freshly loaded workflowLifecycle and workflowTracker to the adapter, and candidate eligibility also uses that current lifecycle. Consequently, edits to active, terminal, blocker-check, or planning states take effect on the next tick without rebuilding the runtime; an operator relying on this text could unintentionally activate new dispatch states before the planned restart.
Useful? React with 👍 / 👎.
hojinzs
left a comment
There was a problem hiding this comment.
Review 1/6 — REQUEST_CHANGES
Requirements vs. #710
| #710 scope | Status |
|---|---|
workflow init emits tracker.provider |
✅ generate-workflow-md.ts |
generate-reference-workflow.ts emits provider form |
|
Skill template (workflow-schema.ts / gh-symphony.ts) teaches provider form |
✅ |
docs/configuration.md records the C10 initialization-bound boundary |
✅ new "Tracker provider changes are initialization-bound" section |
README / packages/cli/README.md converted, flat keys marked deprecated + #679 |
✅ all 7 tracker blocks converted |
| ADR: alias retention + removal notice | ✅ docs/adr/2026-08-29_tracker-provider-alias-deprecation.md |
완료 기준: newly generated WORKFLOW.md passes workflow validate |
No over-engineering or unrequested scope found — the change is tightly bounded, and the large docs/configuration.md table churn is just Prettier re-padding after one cell widened. Nothing to object to there.
Verification performed
Fresh install + build on 862eaf6, then:
| Check | Result |
|---|---|
pnpm lint |
✅ pass |
pnpm test |
✅ 592 CLI tests, all suites pass |
pnpm typecheck |
✅ pass |
pnpm build |
✅ pass |
pnpm format |
❌ fails on generate-reference-workflow.ts:419 |
Smoke test — ran generateReferenceWorkflow directly and inspected the emitted front matter. The provider block is well-formed and correctly nested:
tracker:
kind: github-project
provider:
project_id: PVT_abc123
state_field: Status
priority:
source: disabled
active_states:
- Todo
- In Progress
terminal_states:
- Done
blocker_check_states:
- Todo
planning_states: []The commented Linear example and the project-field priority template are also correct. Then I uncommented the labels priority template and fed it to the parser — it fails. That is the P1.
Findings
| ID | Severity | Where |
|---|---|---|
| 1 | P1 | generate-reference-workflow.ts:474-478 — # labels: dropped; uncommented template is invalid YAML (regression vs. main) |
| 2 | P2 | docs/examples/linear-WORKFLOW.md still on flat keys (below) |
| 3 | P3 | generate-workflow-md.ts:114-120 — active_states/terminal_states outside the migration key lists |
| 4 | P3 | generate-reference-workflow.ts:419 — pnpm format failure |
| 5 | nit | generate-reference-workflow.ts:412,424 — dead indent = 2 defaults |
Inline comments carry the detail for 1, 3, 4, 5.
P2 — docs/examples/linear-WORKFLOW.md was missed
packages/cli/README.md:223 — a file this PR edits — points operators at it: "see docs/examples/linear-WORKFLOW.md in the repository for a complete example". That example is still entirely flat:
tracker:
kind: linear
endpoint: https://api.linear.app/graphql
api_key: $LINEAR_API_KEY
project_slug: symphony-0c79b11b75ea
active_states:
...
pickup_labels:
...So the one complete, worked Linear example teaches the deprecated form, three lines after the README tells the reader the form is deprecated. The ADR's Consequences claim "Documentation consistently labels flat keys as deprecated and directs new configuration to tracker.provider" is not met until this file is converted. It is a small mechanical re-indent under provider:.
For the record, the following were checked and are correctly out of scope — no action wanted: historical ADRs (2026-05-18_explicit-dispatch-priority-mappings.md) are records and should keep their original form; this repo's own WORKFLOW.md and e2e/seed/WORKFLOW.md exercise the alias path and are #679's concern. .codex/skills/gh-symphony/SKILL.md and .gh-symphony/reference-workflow.md are committed generator output that now drifts from its source — regenerating is optional here since nothing asserts on them.
Verdict
The design is right and the parser support is already in place, so this is close. Blocking on finding 1 only — it is a one-line fix plus the missing regression test. Findings 2-5 are worth doing in the same push but I would not hold the PR on them alone.
Generated by Claude Code
|
리뷰 보완 (독립 검증) — 1회차 P1( |
hojinzs
left a comment
There was a problem hiding this comment.
리뷰 2회차 — Request changes
대상: 5ee5c90 (1회차 862eaf6 이후 커밋 1개, fix(cli): align provider workflow templates). 격리된 워크트리에서 pnpm install && pnpm -r build 후 빌드된 CLI(packages/cli/dist/index.js)로 검증했습니다.
1회차 지적사항 처리 결과
| # | 지적 | 결과 |
|---|---|---|
| P1 | generate-reference-workflow.ts labels priority 템플릿 # labels: 누락 |
✅ 해결. :480에 복원, generate-reference-workflow.test.ts:219-245에 uncomment→parse 회귀 테스트 추가. 실제 생성물(references/workflow-schema.md)에서 주석 해제 → workflow validate ok, core 파서 결과 { source: "labels", labels: { P0: 0, P1: 1 } } 확인 |
| P2 | docs/examples/linear-WORKFLOW.md flat-key |
✅ provider form으로 전환. LINEAR_API_KEY=x workflow validate --file docs/examples/linear-WORKFLOW.md → ok, warnings 없음 |
| P2 | deprecation 진단 GitHub 전용 (priority-diagnostics.ts:59-61) |
✅ kind 가드 제거. 862eaf6 시점의 flat Linear 예시를 validate하면 Deprecated tracker provider keys: project_slug, api_key, endpoint, pickup_labels, blocker_check_states, planning_states 경고 + 복붙용 provider 블록 출력됨 |
| P3 | active_states/terminal_states가 provider 안에 생성됨 |
✅ Codex 지적대로 core tracker.*로 이동 (generate-workflow-md.ts:113-121, reference/skill 템플릿 동일). spec 기준으로 올바른 방향입니다 |
| P3 | Prettier (:419) |
✅ PR 변경 파일 전체 prettier --check 통과 (레포 전체 pnpm format은 worker 패키지/pnpm-lock.yaml 등 86개 기존 파일로 실패 — 이 PR과 무관) |
| nit | dead indent = 2 기본값 |
✅ 필수 인자로 변경 |
| nit | README.md:401 tracker.pickup_labels, CLI 문자열의 flat key, changeset patch/minor |
➖ 미반영 (아래 새 지적 nit 참조, 블로킹 아님) |
검증한 것 (CLI 실행)
격리 환경: HOME/GH_SYMPHONY_CONFIG_DIR을 스크래치 디렉터리로, 4680 포트 미사용.
workflow init --non-interactive --tracker github-project --project PVT_… --runtime codex-app-server(실제 Project 컬럼 읽기 전용 조회) →WORKFLOW.md가tracker.active_states/terminal_states+tracker.provider.{project_id,state_field,priority,blocker_check_states,planning_states}형태로 생성.workflow validate→{"ok":true,"warnings":[]}.doctor→Repository WORKFLOW.md pass,Priority mapping pass, deprecation 경고 없음 (Managed project selection 실패는 격리 config에repo init등록이 없어서이며 환경 요인)workflow init --tracker linear --linear-project-slug …→ 동일한 provider form 생성,LINEAR_API_KEY=x workflow validateok,doctor의 WORKFLOW.md/Runtime/Priority 체크 pass- 생성된
.agent/skills/gh-symphony/references/workflow-schema.md에서 labels priority 템플릿 주석 해제 → validate ok (위 P1) - 레포 자체
WORKFLOW.md(flat GitHub) → validate/doctor 모두Deprecated tracker provider keyswarn +tracker.provider블록 출력 (기존 동작 유지) - 테스트:
@gh-symphony/cli42 files / 594 passed,core,tracker-*전부 pass.pnpm typecheck✅,pnpm lint✅,pnpm -r build✅ - CI (5ee5c90): Test ✅, Container Smoke ✅. mergeable: true / clean vs 현재
origin/main(50e7313)
새 지적사항
[Blocking] packages/cli/src/skills/templates/gh-symphony.ts:118-120 — /gh-symphony SKILL.md의 "Supported Front Matter Fields" YAML이 깨짐
P3 재정렬 과정에서 active_states/terminal_states만 2칸으로 올리고 바로 다음 줄의 blocker_check_states는 4칸 그대로 남았습니다. 생성된 SKILL.md:
tracker:
kind: github-project
provider:
project_id: PVT_xxx
state_field: Status
active_states: [Todo, In Progress]
terminal_states: [Done, Cancelled]
blocker_check_states: [Blocked] # <- 스칼라 값 아래에 4칸 들여쓰기이 블록을 그대로 front matter로 넣어 빌드된 CLI에 통과시키면:
front_matter: Invalid workflow front matter indentation near "blocker_check_states: [Blocked]".
1회차 P1과 정확히 같은 성격입니다 — 에이전트가 WORKFLOW.md를 작성할 때 읽는 스킬 문서가 잘못된 예시를 가르치게 됩니다 (blocker_check_states는 provider 키이므로 provider: 아래로 내려가야 함). gh-symphony.test.ts에는 이 블록을 파싱하는 테스트가 없어 594개 테스트가 모두 통과한 채 회귀했습니다. 수정 예:
lines.push(" provider:");
lines.push(" project_id: PVT_xxx");
lines.push(" state_field: Status");
lines.push(" blocker_check_states: [Blocked]");
lines.push(" active_states: [Todo, In Progress]");
lines.push(" terminal_states: [Done, Cancelled]");그리고 gh-symphony.test.ts에 ```yaml 블록을 추출해 parseWorkflowMarkdown에 넣는 테스트를 하나 추가해 주세요 (1회차의 `generate-reference-workflow.test.ts:219` 패턴).
[Should-fix] 문서가 head의 core/provider 경계와 어긋남
docs/configuration.md:288tracker.provider.active_states,:137tracker.provider.terminal_states,README.md:759tracker.provider.active_states— 이번 커밋에서 두 키를 coretracker.*로 옮겼는데 문서는 여전히 provider 경로로 안내합니다. 같은 파일의 예시 블록(docs/configuration.md:313-328)과 상충합니다.docs/configuration.md:36-42"Tracker provider changes are initialization-bound"에서 "tracker state settings"를 초기화 시점 고정 항목으로 열거하는데, 실제로는OrchestratorService.resolveCandidateTrackerDependencies(packages/orchestrator/src/service.ts:2273-2290)가 매 tickloadProjectWorkflow로 다시 읽은resolution.lifecycle을 어댑터에 넘기고, GitHub 어댑터는lifecycle: dependencies.workflowLifecycle/blockerCheckStates: dependencies.workflowTracker?.blockerCheckStates(packages/tracker-github/src/orchestrator-adapter.ts:499-502)를 사용합니다. 즉 active/terminal/blocker-check 상태는 다음 tick에 반영되고,project_id/priority/endpoint만project.tracker(config.json) 기반으로 초기화 고정입니다. Codex가 같은 지적(P2)을 남겼고 아직 미처리입니다. 문장에서 "tracker state settings"를 빼거나, lifecycle은 next-tick reload라고 명시해 주세요 — 이 섹션은 이 PR이 새로 추가한 내용이라 여기서 맞추는 게 맞습니다.
[nit, 비블로킹]
README.md:401tracker.pickup_labels→tracker.provider.pickup_labels.- CLI 사용자 문자열의 flat key:
commands/project.ts:104,132(tracker.pickup_labels),repo-runtime.ts:238(tracker.api_key),commands/doctor.ts:810(tracker.project_slug),commands/workflow.ts:767,773,skills/templates/gh-symphony-references/workflow-schema.ts:23,26. 별도 PR로 미뤄도 됩니다. .changeset/friendly-provider-workflows.md— 생성물 형태가 바뀌는 사용자 가시 변경이라minor가 더 맞아 보이지만 판단에 맡깁니다.- 커밋된 생성물
.codex/skills/gh-symphony/SKILL.md:76-78,.gh-symphony/reference-workflow.md:16-18이 여전히 flat 형태 — 1회차와 같이 선택 사항.
판단
1회차 블로킹(P1)과 should-fix(P2 두 건)는 모두 제대로 해결됐고 실제 CLI로 확인했습니다. 다만 P3 대응(active_states/terminal_states를 core로 이동)이 동일한 유형의 새 회귀를 만들었습니다 — 스킬 템플릿의 YAML 예시가 파서에서 실패합니다. 이 한 건만 고치고(테스트 포함) 문서 두 곳을 맞추면 approve 하겠습니다.
Generated by Claude Code
hojinzs
left a comment
There was a problem hiding this comment.
리뷰 3회차 — Request changes (마지막 블로킹 1건)
대상: 96c3f87 (2회차 5ee5c90 이후 커밋 1개, fix(cli): correct provider template reload docs). 워크스페이스에서 pnpm install --frozen-lockfile && pnpm -r build 후 빌드된 CLI(packages/cli/dist/index.js)로 블랙박스 검증했습니다.
2회차 지적사항 처리 결과
| # | 지적 | 결과 |
|---|---|---|
| Blocking | skills/templates/gh-symphony.ts:118-120 — SKILL.md front matter YAML 깨짐 |
✅ 해결. blocker_check_states가 provider: 아래 4칸으로 이동. 실제 생성물(.agent/skills/gh-symphony/SKILL.md)에서 ```yaml 블록을 그대로 뽑아 workflow validate → `ok: true, warnings: []`. `gh-symphony.test.ts:90-102`에 추출→`parseWorkflowMarkdown` 회귀 테스트 추가됨 (요청한 패턴 그대로) |
| Should-fix | docs/configuration.md:288, :137, README.md:759의 tracker.provider.active_states/terminal_states |
✅ 셋 다 core tracker.*로 정정. 레포 전체 grep 결과 잔여 없음. :333의 flat 키 나열은 deprecated alias 목록이라 정상 |
| Should-fix | configuration.md:36-42 reload 절이 lifecycle을 init-bound로 오기재 |
|
| nit | README.md:401 tracker.pickup_labels, CLI 문자열 flat key, changeset patch/minor, 커밋된 생성물 |
➖ 미반영 (비블로킹, 아래) |
검증한 것
격리 HOME/--config 스크래치 디렉터리, 빌드된 CLI로 실행:
workflow init --non-interactive --tracker linear --linear-project-slug demo-abc123 --runtime codex-app-server→tracker.active_states/terminal_states는 core,tracker.provider.{endpoint,api_key,project_slug,blocker_check_states,planning_states}로 생성.LINEAR_API_KEY=… workflow validate→ok: true, warnings: []- 생성된
references/workflow-schema.md(=generateReferenceWorkflow출력)에서 labels priority 템플릿 주석 해제 →workflow validateok: true, warnings: []— 1회차 P1 블랙박스 재확인 - 생성된
SKILL.md의 "Supported Front Matter Fields" YAML 블록을 그대로 WORKFLOW.md로 만들어 validate →ok: true, warnings: []— 2회차 블로킹 재확인 docs/examples/linear-WORKFLOW.md→ok: true, warnings: [](provider form 전환 확인)- 같은 워크플로를 flat 키로 되돌려 validate →
Deprecated tracker provider keys: project_slug, api_key, endpoint, blocker_check_states, planning_states경고 + 복붙용tracker.provider블록 출력.active_states/terminal_states는 core라 목록에서 제외 — 일관됨 pnpm lint✅ /pnpm typecheck✅ /pnpm -r build✅ /pnpm test✅ (cli 42 files 595 passed, 2회차 594에서 +1). PR 변경 파일 전체prettier --check✅- CI(96c3f87): Container Smoke ✅, Test는 리뷰 시점 in_progress
새 지적사항
[P1, 블로킹] docs/configuration.md:43-49 — reload 경계가 이번엔 반대 방향으로 틀렸습니다
인라인 코멘트에 근거 표와 suggestion 블록을 달았습니다. 요약하면 tick마다 어댑터로 새로 넘어가는 건 workflowLifecycle과 workflowTracker(= blockerCheckStates + terminalStates)뿐이고, project_id/project_slug·endpoint·priority·pickup_labels는 전부 repo init이 쓴 config.json 프로젝트 레코드에서 읽습니다. 2회차 문구는 안전한 방향(“전부 재시작 필요”)으로 틀렸는데 지금 문구는 위험한 방향으로 틀렸습니다 — 운영자가 project_id나 priority를 고치고 다음 tick 반영을 기대하면 조용히 무시됩니다.
[Should-fix, 비블로킹] docs/examples/linear-WORKFLOW.md 산문이 front matter와 모순
front matter는 provider form으로 바뀌었는데 바로 아래 산문은 여전히 flat 키를 가르칩니다 (diff 밖 줄이라 인라인 불가):
:58— "Usetracker.kind: linearwithtracker.project_slug" →tracker.provider.project_slug:62— "tracker.pickup_labelsonly controls…" →tracker.provider.pickup_labels:64— "tracker.blocker_check_statesdefaults to…" →tracker.provider.blocker_check_states
같은 파일 안에서 3줄 위 예시와 어긋나고, ADR Consequences의 "Documentation consistently labels flat keys as deprecated and directs new configuration to tracker.provider"를 아직 만족하지 못합니다. P1 고치실 때 같이 넣어주시면 좋겠지만 이것만으로 붙잡지는 않겠습니다.
[nit, 비블로킹 — 재차 제기하지 않겠습니다]
README.md:401tracker.pickup_labels→tracker.provider.pickup_labels- CLI 사용자 문자열의 flat key (
commands/project.ts:104,132,repo-runtime.ts:238,commands/doctor.ts:810,commands/workflow.ts:767,773) — 별도 PR .changeset/friendly-provider-workflows.mdpatch/minor — 작성자 판단에 맡깁니다- 커밋된 생성물
.codex/skills/gh-symphony/SKILL.md:73-77,.gh-symphony/reference-workflow.md:12-16flat 잔존 — 선택
판단
요구사항(#710) 대비 범위는 여전히 정확하고 오버엔지니어링은 없습니다. 2회차 블로킹은 요청한 형태 그대로(수정 + 회귀 테스트) 해결됐고 빌드된 CLI로 확인했습니다. 남은 건 이번 PR이 새로 추가한 reload 절의 사실관계 한 문단뿐이며, 인라인 suggestion을 그대로 적용하면 끝나는 기계적 수정입니다.
이 P1 한 건만 반영되면 approve 하겠습니다 — 위 should-fix/nit은 approve를 막지 않고, 이후 재차 제기하지 않겠습니다.
Generated by Claude Code
|
리뷰 보완 (독립 검증, 3회차 Request changes와 결론 일치) — 2회차 차단(SKILL.md 템플릿 들여쓰기)은 해결 확인(생성 블록 validate ok, 파싱 테스트 추가). 남은 should-fix 1건: |
hojinzs
left a comment
There was a problem hiding this comment.
리뷰 4회차 — Approve
대상: 1bf893a (3회차 96c3f87 이후 커밋 1개, docs(cli): clarify provider reload boundary). 워크스페이스에서 pnpm install --frozen-lockfile && pnpm -r build 후 빌드된 CLI(packages/cli/dist/index.js)로 블랙박스 검증했습니다.
3회차 지적사항 처리 결과
| # | 지적 | 결과 |
|---|---|---|
| P1 (블로킹) | docs/configuration.md:43-49 reload 경계가 반대 방향으로 오기재 |
✅ 해결. 제안한 suggestion 블록이 그대로 적용됨 (:43-53) |
| Should-fix | docs/examples/linear-WORKFLOW.md 산문이 front matter와 모순 (:58, :62, :64) |
✅ 세 줄 모두 tracker.provider.*로 정정. blocker_check_states: []/planning_states 언급도 provider 경로로 통일 |
| nit | README.md:401, CLI 문자열 flat key, changeset patch/minor, 커밋된 생성물 |
➖ 미반영 — 3회차에서 재차 제기하지 않겠다고 한 항목이라 그대로 둡니다 |
reload 문단 사실 검증 (head 기준)
적용된 문단의 분류를 코드로 재확인했습니다. tick마다 어댑터에 새로 넘어가는 건 resolveCandidateTrackerDependencies (packages/orchestrator/src/service.ts:2281-2290)의 workflowLifecycle / workflowTracker 둘뿐이고, 나머지는 project.tracker(= repo init이 쓴 config.json 레코드)에서 읽습니다:
| 설정 | 소스 | 반영 |
|---|---|---|
active/terminal/planning_states, state_field |
WorkflowLifecycleConfig (core/src/workflow/lifecycle.ts:1-8) ← dependencies.workflowLifecycle |
next tick |
blocker_check_states |
tracker-github/src/orchestrator-adapter.ts:499, tracker-linear/src/orchestrator-adapter.ts:816 ← dependencies.workflowTracker |
next tick |
project_id / project_slug |
orchestrator-adapter.ts:483 / :818 ← project.tracker |
init |
endpoint |
tracker-github:490 project.tracker.apiUrl / tracker-linear:799 resolveLinearEndpoint(project.tracker) |
init |
priority, priority_field_name |
tracker-github:493-497 ← project.tracker |
init |
pickup_labels |
core/src/workflow/pickup-labels.ts:29 project.tracker.settings?.pickupLabels |
init |
문단의 타이밍 주장은 전부 맞습니다. state_field의 core/provider 분류 한 군데만 어긋나는데, 그건 제 3회차 제안문에서 비롯된 것이라 인라인에 nit으로 남겼습니다 (블로킹 아님).
Smoke test (빌드된 CLI, 격리 HOME)
workflow init --non-interactive --tracker linear --linear-project-slug demo-abc123 --runtime codex-app-server→tracker.active_states/terminal_states는 core,tracker.provider.{endpoint,api_key,project_slug,blocker_check_states,planning_states}로 생성.LINEAR_API_KEY=… workflow validate --json→ok: true, warnings: []- 생성된
SKILL.md의 "Supported Front Matter Fields" ```yaml 블록을 그대로 뽑아 WORKFLOW.md로 만들어 validate →ok: true, warnings: []. 들여쓰기도 정상 (`provider:` 아래 `project_id`/`state_field`/`blocker_check_states` 4칸, `active_states`/`terminal_states` 2칸) — 2회차 블로킹 블랙박스 재확인 - 생성된
references/workflow-schema.md의 labels priority 템플릿에# labels:존재 확인 — 1회차 P1 재확인 - 같은 워크플로를 flat 키로 되돌려 validate →
Deprecated tracker provider keys: project_slug, api_key, endpoint, blocker_check_states, planning_states경고 + 복붙용tracker.provider블록 출력 (Linear 경로 정상 동작) pnpm lint✅ /pnpm typecheck✅ /pnpm test✅ (cli 42 files 595 passed, orchestrator 361 passed, 전 스위트 통과) /pnpm -r build✅- PR 변경 파일 16개 전체
prettier --check✅ - CI (
1bf893a): Test ✅ success, Container Smoke ✅ success
요구사항(#710) 대비
| #710 범위 | 상태 |
|---|---|
workflow init / generate-reference-workflow.ts / 스킬 템플릿이 tracker.provider 형식 생성 |
✅ 셋 다 생성물로 확인 |
provider 변경의 live 반영 범위를 docs/configuration.md reload 절에 기록 |
✅ init-bound / next-tick 경계가 코드와 일치 |
README / packages/cli/README.md provider 형식 + flat 키 deprecated(#679) 표기 |
✅ |
| ADR: alias 유지 + 제거 예고 | ✅ docs/adr/2026-08-29_tracker-provider-alias-deprecation.md |
완료 기준: 새로 생성된 WORKFLOW.md가 workflow validate 통과 |
✅ GitHub·Linear 양쪽, 스킬/레퍼런스 생성물까지 통과 |
오버엔지니어링이나 요구사항 밖 임의 결정사항은 4회차에 걸쳐 발견되지 않았습니다. 범위는 처음부터 #710에 정확히 묶여 있었고, 4회차 커밋도 문서 2개 파일에만 손댔습니다.
판단
Approve. 3회차 블로킹은 요청한 형태 그대로 적용됐고 빌드된 CLI로 재확인했습니다. 1~3회차 블로킹 3건(labels 템플릿 회귀, SKILL.md YAML 회귀, reload 경계 오기재) 모두 회귀 테스트와 함께 해소되었고, 남은 인라인 nit 1건은 제 제안문의 오류에서 비롯된 한 줄짜리 분류 수정이라 머지를 막지 않습니다.
Generated by Claude Code
| every reconciliation tick: core `tracker.active_states`, | ||
| `tracker.terminal_states`, `tracker.state_field`, and the provider-owned | ||
| `blocker_check_states` and `planning_states` apply on the next tick. The |
There was a problem hiding this comment.
[nit, 비블로킹 — 제 3회차 제안문의 오류입니다] state_field를 core로 분류한 건 제가 틀렸습니다. 그대로 적용해 주신 건 맞고, 문장 안의 분류만 어긋납니다.
state_field는 provider 소유 키입니다:
- 생성기 3곳 모두
provider:아래 4칸으로 emit —generate-workflow-md.ts:106(provider.state_field = input.stateFieldName),generate-reference-workflow.ts:89,skills/templates/gh-symphony.ts:117 DEPRECATED_TRACKER_PROVIDER_KEYS(packages/core/src/workflow/parser.ts:459)에"state_field"가 들어 있음 = flattracker.state_field가 deprecated alias- 같은 파일
:336-337이 이미tracker.state_field를 flat alias 목록에 올려두어, 지금:45와 한 파일 안에서 상충합니다
reload 타이밍(next tick) 자체는 맞습니다 — dependencies.workflowLifecycle.stateFieldName으로 매 tick 넘어가는 것 확인했습니다. provider 소유이면서 tick마다 리로드되는 blocker_check_states/planning_states와 같은 부류이므로, 문장에서 core 목록이 아니라 provider-owned 목록으로 옮기면 됩니다.
| every reconciliation tick: core `tracker.active_states`, | |
| `tracker.terminal_states`, `tracker.state_field`, and the provider-owned | |
| `blocker_check_states` and `planning_states` apply on the next tick. The | |
| every reconciliation tick: core `tracker.active_states` and | |
| `tracker.terminal_states`, plus the provider-owned `state_field`, | |
| `blocker_check_states`, and `planning_states` apply on the next tick. The |
approve를 막지 않습니다. 머지 전에 한 줄만 적용해 주시면 되고, 넘어가셔도 재차 제기하지 않겠습니다.
Generated by Claude Code
1bf893a to
40d682d
Compare
TL;DR
WORKFLOW.mdfiles usetracker.providerfor adapter-owned GitHub Project and Linear settings.tracker.*; flat provider aliases stay supported until the next major release (chore(core): remove deprecated flat tracker keys (next major) — do not start until removal is signed off #679).Change-point diagram
workflow init/ reference workflow / skill schema→ core lifecycle + provider-owned adapter blocks
→ parser normalization and doctor migration diagnostics
→ validated GitHub and Linear workflow artifacts
Start here
packages/cli/src/workflow/generate-workflow-md.tsemits core lifecycle fields plus provider-form adapter configuration.packages/cli/src/workflow/generate-reference-workflow.tsand the generated/gh-symphonyschema teach the same layout.docs/configuration.mdrecords the actual reload boundary between persisted runtime binding and per-tick tracker policy.Changes
tracker.provider, while keeping coreactive_statesandterminal_statesattrackerlevel./gh-symphonyskill schema so its provider-form front matter parses; regression coverage parses the emitted example.state_field, blocker checks, and planning states apply on the next reconciliation tick; provider connection, project binding, priority, and pickup-label settings require re-initialization and restart.Evidence
pnpm exec prettier --check docs/configuration.md docs/examples/linear-WORKFLOW.md— passed.pnpm lint— passed.pnpm test— passed across all workspace suites.pnpm typecheck— passed.pnpm build— passed.LINEAR_API_KEY=validation-token node packages/cli/dist/index.js workflow validate --file docs/examples/linear-WORKFLOW.md— passed.Risks & rollback
repo initand a daemon restart; lifecycle policy is next-tick reloaded.Changed files
README.md,packages/cli/README.md, anddocs/configuration.md.docs/adr/2026-08-29_tracker-provider-alias-deprecation.md..changeset/friendly-provider-workflows.md.Post-merge / human validation
gh-symphony workflow initfor GitHub Project and Linear repositories and inspect core lifecycle plustracker.providersettings.gh-symphony doctorsupplies a copyable provider migration block for legacy GitHub and Linear workflows.Issues — Closed #710