Skip to content

feat(cli,docs): generate provider-form workflows - #764

Merged
moncher-dev merged 7 commits into
mainfrom
feat/710-provider-workflow-generation
Aug 29, 2026
Merged

feat(cli,docs): generate provider-form workflows#764
moncher-dev merged 7 commits into
mainfrom
feat/710-provider-workflow-generation

Conversation

@moncher-dev

@moncher-dev moncher-dev commented Aug 29, 2026

Copy link
Copy Markdown
Collaborator

TL;DR

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.ts emits core lifecycle fields plus provider-form adapter configuration.
  • packages/cli/src/workflow/generate-reference-workflow.ts and the generated /gh-symphony schema teach the same layout.
  • docs/configuration.md records the actual reload boundary between persisted runtime binding and per-tick tracker policy.

Changes

  • Generate GitHub Project and Linear adapter settings beneath tracker.provider, while keeping core active_states and terminal_states at tracker level.
  • Preserve flat provider keys as parser-supported deprecated aliases, with normalized doctor migration output for GitHub and Linear.
  • Repair the generated /gh-symphony skill schema so its provider-form front matter parses; regression coverage parses the emitted example.
  • Document that lifecycle policy, 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.
  • Restore and test the labels-priority reference template; convert the worked Linear example and its prose to provider form.

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

  • Existing flat provider keys remain non-breaking aliases; new artifacts use the normalized layout.
  • Provider connection and initialized runtime binding still require repo init and a daemon restart; lifecycle policy is next-tick reloaded.
  • Roll back by reverting this PR. No watcher-driven reload implementation is introduced.

Changed files

  • Workflow, reference-workflow, and skill-schema generators plus CLI regression tests.
  • Provider deprecation diagnostics and the worked Linear workflow example.
  • README.md, packages/cli/README.md, and docs/configuration.md.
  • docs/adr/2026-08-29_tracker-provider-alias-deprecation.md.
  • .changeset/friendly-provider-workflows.md.

Post-merge / human validation

  • Run gh-symphony workflow init for GitHub Project and Linear repositories and inspect core lifecycle plus tracker.provider settings.
  • Confirm gh-symphony doctor supplies a copyable provider migration block for legacy GitHub and Linear workflows.

Issues — Closed #710

@github-actions

github-actions Bot commented Aug 29, 2026

Copy link
Copy Markdown
Contributor

Coverage Report

Status Category Percentage Covered / Total
🔵 Lines 40.6% 43507 / 107159
🔵 Statements 40.6% 43507 / 107159
🔵 Functions 72.41% 2139 / 2954
🔵 Branches 78.14% 9825 / 12573
File Coverage
File Stmts Branches Functions Lines Uncovered Lines
Changed Files
packages/cli/src/priority-diagnostics.ts 97.14% 89.55% 100% 97.14% 109, 129-130, 134-135, 145-146, 224
packages/cli/src/skills/templates/gh-symphony.ts 100% 100% 100% 100%
packages/cli/src/workflow/generate-reference-workflow.ts 98.13% 93.61% 100% 98.13% 457-464
packages/cli/src/workflow/generate-workflow-md.ts 95.66% 91.75% 100% 95.66% 199-200, 308-309, 312-313, 320-321, 348-352, 476
Generated in workflow #1126 for commit 40d682d by the Vitest Coverage Report Action

@moncher-dev
moncher-dev marked this pull request as ready for review August 29, 2026 10:21
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Aug 29, 2026

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review Completed 2026-08-29T10:25:30.113324Z 862eaf6 Draft marked ready
ℹ️ 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@moncher-dev
moncher-dev requested a review from hojinzs August 29, 2026 10:23

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment on lines +115 to +119
provider.active_states = input.lifecycle.activeStates;
}

if (input.lifecycle.terminalStates.length > 0) {
tracker.terminal_states = input.lifecycle.terminalStates;
provider.terminal_states = input.lifecycle.terminalStates;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment on lines +476 to +477
lines.push(`${padding}# source: labels`);
lines.push(`${padding}# P0: 0`);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

Comment thread docs/configuration.md Outdated
Comment on lines +39 to +42
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.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 hojinzs left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 ⚠️ yes, but with a regression (P1 below)
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 ⚠️ the generated file passes; the reference workflow's labels template does not (P1)

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-120active_states/terminal_states outside the migration key lists
4 P3 generate-reference-workflow.ts:419pnpm 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

Comment thread packages/cli/src/workflow/generate-reference-workflow.ts
Comment thread packages/cli/src/workflow/generate-reference-workflow.ts Outdated
Comment thread packages/cli/src/workflow/generate-reference-workflow.ts Outdated
Comment thread packages/cli/src/workflow/generate-workflow-md.ts
@hojinzs

hojinzs commented Aug 29, 2026

Copy link
Copy Markdown
Owner

리뷰 보완 (독립 검증) — 1회차 P1(generate-reference-workflow.ts:474-478에서 labels priority 템플릿의 # labels: 줄 누락 → 스킬 references/workflow-schema.md에 잘못된 예시 배포; 주석 해제 시 front matter 들여쓰기 오류, 들여쓰기 고치면 tracker.priority.P0 is not supported for source "labels"; main 형태는 통과, generate-workflow-md.ts와 불일치) 재현 확인 — 복원 + 테스트(generate-workflow-md.test.ts:215-227 패턴). 추가 should-fix: docs/examples/linear-WORKFLOW.md가 여전히 flat-key인데 README가 "complete example"로 지칭, 그리고 deprecation 진단이 GitHub 전용(priority-diagnostics.ts:59-61)이라 Linear flat key는 경고 없이 통과 → ADR/README의 "validate·doctor가 alias를 식별" 문구를 GitHub로 한정하거나 Linear 진단 추가. 정상 확인: github/linear workflow init provider-form 생성, validate/doctor 통과, flat-key GitHub에 deprecation 경고+provider 블록.

@hojinzs
hojinzs self-requested a review August 29, 2026 10:57

@hojinzs hojinzs left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

리뷰 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.mdtracker.active_states/terminal_states + tracker.provider.{project_id,state_field,priority,blocker_check_states,planning_states} 형태로 생성. workflow validate{"ok":true,"warnings":[]}. doctorRepository 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 validate ok, 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 keys warn + tracker.provider 블록 출력 (기존 동작 유지)
  • 테스트: @gh-symphony/cli 42 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:288 tracker.provider.active_states, :137 tracker.provider.terminal_states, README.md:759 tracker.provider.active_states — 이번 커밋에서 두 키를 core tracker.*로 옮겼는데 문서는 여전히 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)가 매 tick loadProjectWorkflow로 다시 읽은 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/endpointproject.tracker(config.json) 기반으로 초기화 고정입니다. Codex가 같은 지적(P2)을 남겼고 아직 미처리입니다. 문장에서 "tracker state settings"를 빼거나, lifecycle은 next-tick reload라고 명시해 주세요 — 이 섹션은 이 PR이 새로 추가한 내용이라 여기서 맞추는 게 맞습니다.

[nit, 비블로킹]

  • README.md:401 tracker.pickup_labelstracker.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

@moncher-dev
moncher-dev requested a review from hojinzs August 29, 2026 11:03

@hojinzs hojinzs left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

리뷰 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_statesprovider: 아래 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:759tracker.provider.active_states/terminal_states ✅ 셋 다 core tracker.*로 정정. 레포 전체 grep 결과 잔여 없음. :333의 flat 키 나열은 deprecated alias 목록이라 정상
Should-fix configuration.md:36-42 reload 절이 lifecycle을 init-bound로 오기재 ⚠️ 재작성했으나 반대 방향으로 틀림 — 아래 P1
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-servertracker.active_states/terminal_states는 core, tracker.provider.{endpoint,api_key,project_slug,blocker_check_states,planning_states}로 생성. LINEAR_API_KEY=… workflow validateok: true, warnings: []
  • 생성된 references/workflow-schema.md(= generateReferenceWorkflow 출력)에서 labels priority 템플릿 주석 해제workflow validate ok: true, warnings: [] — 1회차 P1 블랙박스 재확인
  • 생성된 SKILL.md의 "Supported Front Matter Fields" YAML 블록을 그대로 WORKFLOW.md로 만들어 validate → ok: true, warnings: [] — 2회차 블로킹 재확인
  • docs/examples/linear-WORKFLOW.mdok: 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마다 어댑터로 새로 넘어가는 건 workflowLifecycleworkflowTracker(= blockerCheckStates + terminalStates)뿐이고, project_id/project_slug·endpoint·priority·pickup_labels는 전부 repo init이 쓴 config.json 프로젝트 레코드에서 읽습니다. 2회차 문구는 안전한 방향(“전부 재시작 필요”)으로 틀렸는데 지금 문구는 위험한 방향으로 틀렸습니다 — 운영자가 project_idpriority를 고치고 다음 tick 반영을 기대하면 조용히 무시됩니다.

[Should-fix, 비블로킹] docs/examples/linear-WORKFLOW.md 산문이 front matter와 모순

front matter는 provider form으로 바뀌었는데 바로 아래 산문은 여전히 flat 키를 가르칩니다 (diff 밖 줄이라 인라인 불가):

  • :58 — "Use tracker.kind: linear with tracker.project_slug" → tracker.provider.project_slug
  • :62 — "tracker.pickup_labels only controls…" → tracker.provider.pickup_labels
  • :64 — "tracker.blocker_check_states defaults 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:401 tracker.pickup_labelstracker.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.md patch/minor — 작성자 판단에 맡깁니다
  • 커밋된 생성물 .codex/skills/gh-symphony/SKILL.md:73-77, .gh-symphony/reference-workflow.md:12-16 flat 잔존 — 선택

판단

요구사항(#710) 대비 범위는 여전히 정확하고 오버엔지니어링은 없습니다. 2회차 블로킹은 요청한 형태 그대로(수정 + 회귀 테스트) 해결됐고 빌드된 CLI로 확인했습니다. 남은 건 이번 PR이 새로 추가한 reload 절의 사실관계 한 문단뿐이며, 인라인 suggestion을 그대로 적용하면 끝나는 기계적 수정입니다.

이 P1 한 건만 반영되면 approve 하겠습니다 — 위 should-fix/nit은 approve를 막지 않고, 이후 재차 제기하지 않겠습니다.


Generated by Claude Code

Comment thread docs/configuration.md Outdated
@hojinzs

hojinzs commented Aug 29, 2026

Copy link
Copy Markdown
Owner

리뷰 보완 (독립 검증, 3회차 Request changes와 결론 일치) — 2회차 차단(SKILL.md 템플릿 들여쓰기)은 해결 확인(생성 블록 validate ok, 파싱 테스트 추가). 남은 should-fix 1건: docs/configuration.md:43-48가 반대 방향으로 과장 — endpoint/project ID·slug/pickup labels/priority가 다음 tick에 반영된다고 하지만, 코드상 tick 재로드는 Pick<…,"blockerCheckStates"|"terminalStates">(core/src/contracts/tracker-adapter.ts:180-183)와 active/planning states뿐이고, projectId/slug/endpoint/priority는 project.tracker(어댑터 :483-496, :793-822), pickup labels는 project.tracker.settings(pickup-labels.ts:29)에서 읽으며 project.ts:84-92start.ts:1076service.ts:358 readonly로 고정 → repo init+재시작 필요. main 원문이 맞았으니 그 문장으로 복원. 나머지 nit(README:401, flat-key CLI 문자열, changeset patch/minor, 커밋된 생성물)은 비차단.

@moncher-dev
moncher-dev requested a review from hojinzs August 29, 2026 11:18

@hojinzs hojinzs left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

리뷰 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:816dependencies.workflowTracker next tick
project_id / project_slug orchestrator-adapter.ts:483 / :818project.tracker init
endpoint tracker-github:490 project.tracker.apiUrl / tracker-linear:799 resolveLinearEndpoint(project.tracker) init
priority, priority_field_name tracker-github:493-497project.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-servertracker.active_states/terminal_states는 core, tracker.provider.{endpoint,api_key,project_slug,blocker_check_states,planning_states}로 생성. LINEAR_API_KEY=… workflow validate --jsonok: 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

Comment thread docs/configuration.md
Comment on lines +44 to +46
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

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[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"가 들어 있음 = flat tracker.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 목록으로 옮기면 됩니다.

Suggested change
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

@moncher-dev
moncher-dev force-pushed the feat/710-provider-workflow-generation branch from 1bf893a to 40d682d Compare August 29, 2026 11:29
@moncher-dev
moncher-dev merged commit 0e85d8a into main Aug 29, 2026
2 checks passed
@moncher-dev
moncher-dev deleted the feat/710-provider-workflow-generation branch August 29, 2026 11:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat(cli,docs): generate provider-form WORKFLOW.md (workflow init, skill templates), reload semantics for provider changes, configuration docs

2 participants