Repository navigation
feat(renderer): --verify-model for a per-pass reflection model - #2
Conversation
|
Warning Review limit reachedNext included review available in 26 minutes. View limit detailsLimit details: You’ve used the included review currently available. Your 60 included PR review attempts over the past 7 days set your current allowance at 1 review per hour. Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. Review configuration: ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Essentials Run ID: 📒 Files selected for processing (6)
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Essentials Run ID: 📒 Files selected for processing (2)
Included review availability: 0 reviews are currently available. Your included PR review attempts over the past 7 days set your current allowance at 1 review per hour. 📝 WalkthroughWalkthrough렌더러에 Changes검증 모델 선택 및 실행
Estimated code review effort: 2 (Simple) | ~10 minutes Merge Risk: ⚪ Minimal · up to This adds an optional verification-pass model while preserving the primary model as the default and removing the switch when verification is disabled. The supplied validation covers the supported render modes, with no current merge-blocking risk identified. Sequence Diagram(s)sequenceDiagram
participant Renderer as scripts/render.py
participant Workflow as GitHub workflow
participant Config as Goose config.yaml
participant Goose
Renderer->>Workflow: __GOOSE_VERIFY_MODEL__ 치환
Workflow->>Config: 검증 모델 설정 기록
Workflow->>Goose: 검증 및 재시도 호출
Goose->>Config: 검증 모델 사용
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
Full details: Docstring CoverageExplanation Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 1 functions across 1 files. (1 skipped: 1 unsupported.) ✨ Finishing Touches 💡 1📝 Generate docstrings 💡
Comment |
- templates/github.workflow.yml: inside the #[verify:begin/end] region, the reflection pass rewrites ~/.config/goose/config.yaml with GOOSE_MODEL: __GOOSE_VERIFY_MODEL__ before its first goose invocation - render.py: new --verify-model option (default: --model, preserving the single-model behavior); placeholder __GOOSE_VERIFY_MODEL__ substituted - verified: verify.py PASS for on/shadow/off renders; diff-model render shows review=deepseek-v4-flash-vision-exp / reflection=glm-5p3-flash
c240a64 to
7a0f3e2
Compare
…tion model
- new optional string parameter goose_verify_model (default "" = reuse
goose_model for both passes — unchanged behavior)
- renderer invocation documents --verify-model {{ goose_verify_model }} with
explicit prompt guidance: when the user leaves it empty, do NOT pass the
flag (single-model behavior preserved)
- deeplinks regenerated (README.md, README.ko.md, docs/launch.html);
update_deeplinks.py --check reports all up to date
There was a problem hiding this comment.
Summary
이 PR은 렌더러에 --verify-model 옵션을 추가해 검증(reflection) 패스가 리뷰 패스와 다른 모델을 사용하도록 하고, render.py가 __GOOSE_VERIFY_MODEL__을 치환하도록 한 후 GitHub 워크플로 템플릿의 #[verify:begin] 영역에서 reflection 전에 ~/.config/goose/config.yaml을 재작성하는 방식으로 구현한다. 기본 동작(단일 모델)은 args.verify_model or args.model로 깔끔하게 보존되며 모델 스위치를 verify 영역 내에 둔 덕분에 --verification off에서 잔여 코드도 없다. 다만 이 기능이 GitHub 템플릿 하나에만 배선되어 나머지 3개 플랫폼에서는 조용히 무력화된다는 실질적 결함이 있다.
- [검증] 3건 유지 / 0건 강등 / 0건 제외 — 제외된 파인딩 상세는 CI 로그를 확인하세요.
🔴 Blocking Issues
발견 사항 없음.
🟡 Warnings
scripts/render.py:247[P2]:--verify-model로 치환되는__GOOSE_VERIFY_MODEL__을 실제로 소비하는 템플릿은templates/github.workflow.yml(templates/github.workflow.yml:163-167의GOOSE_MODEL: __GOOSE_VERIFY_MODEL__heredoc)가 유일하다.templates/gitlab.ci.yml,templates/gitea.workflow.yml,templates/teamcity.settings.kts는 모두 reflection 패스가 여전히__GOOSE_MODEL__기반 config를 그대로 사용하므로, GitLab/Gitea/TeamCity로 렌더링할 때 사용자가--verify-model과 recipe의goose_verify_model을 지정해도 검증 패스는 리뷰 모델로 계속 실행된다. 사용자에게 어떤 피드백도 없이(오류도, 로그도) 조용히 무시되는 것이므로 이 PR의 핵심 기능이 4개 플랫폼 중 3곳에서 무력화된다. 나머지 플랫폼 템플릿에도 동일한 config 재작성 블록을 넣거나, 지원하지 않는 플랫폼에서는--verify-model을 명시적으로 거부(에러)하도록 해야 한다.
🟢 Suggestions
codegoose-setup.yaml:143[P3]: 렌더 명령에--verify-model {{ goose_verify_model }} \이 무조건 포함되어 있는 반면, 동일 프롬프트의 Step 4 지시(codegoose-setup.yaml:169-171)는 값이 비면 "DO NOT pass --verify-model"이라고 안내한다. 지시가 충돌하므로, LLM이 명령 템플릿을 그대로 따라 값이 빈 채--verify-model을 전달하면--style등 다음 옵션을 값으로 삼아 파싱이 깨진다. 값이 비면 플래그 자체를 생략하는 예시로 명령 템플릿을 조건부 표기하도록 정리하는 것이 안전하다. (render.py의or args.model처리가 빈 문자열은 우회해주지만 셸 인자 파싱 문제는 막지 못함.)scripts/verify.py:58[P3]: 결정론적 검증기의PLACEHOLDERS튜플에__GOOSE_VERIFY_MODEL__이 추가되지 않았다. 현재는 render.py가 항상 치환하므로 남는 일이 없지만, 향후 다른 템플릿에 이 플레이스홀더를 사용하면서 치환을 빼먹는 회귀가 발생해도 verify.py가 잡아내지 못한다. 신규 플레이스홀더를 화이트리스트에 추가하는 것이 계약을 지키는 잔여 토큰 검사와 일관된다.
✅ Highlights
render.py:247의args.verify_model or args.model기본값 처리로 별도 분기 없이 단일 모델 동작이 정확히 보존되고,--verify-model미지정 시 기존 동작이 그대로 유지되는 점이 깔끔하다.- 모델 스위치(heredoc)가
#[verify:begin]영역 안에 배치되어--verification off렌더 시 자동으로 제거되며, 리뷰 패스goose run이후에만 적용되어 마지막 goose 호출(reflection + retry)에만 영향을 주는 위치 선정이 정확하다. - 보안 관점에서 config 재작성이 API 키 바인딩(
__API_KEY_NAME__env, 1회)을 늘리지 않고keyring: false를 유지하며 프롬프트 인젝션 경로(GH_TOKEN 등)에 새로운 키를 노출하지 않도록 설계되었다.
Verdict
APPROVE - 검증을 통과한 파인딩에 차단 이슈가 없습니다.
Not anchored to the diff
(the following findings could not be pinned to a diff line, so no inline comment was created for them)
- [SUGGESTION]
scripts/verify.py:58(file not in diff)scripts/verify.py:58[P3]: 결정론적 검증기의PLACEHOLDERS튜플에__GOOSE_VERIFY_MODEL__이 추가되지 않았다. 현재는 render.py가 항상 치환하므로 남는 일이 없지만, 향후 다른 템플릿에 이 플레이스홀더를 사용하면서 치환을 …
| ("__RECIPES_BASE__", release_base()), | ||
| ("__PROVIDER__", provider), | ||
| ("__GOOSE_MODEL__", args.model), | ||
| ("__GOOSE_VERIFY_MODEL__", args.verify_model or args.model), |
There was a problem hiding this comment.
🟡 WARNING — scripts/render.py:247 [P2]: --verify-model로 치환되는 __GOOSE_VERIFY_MODEL__을 실제로 소비하는 템플릿은 templates/github.workflow.yml(templates/github.workflow.yml:163-167의 GOOSE_MODEL: __GOOSE_VERIFY_MODEL__ heredoc)가 유일하다. templates/gitlab.ci.yml, templates/gitea.workflow.yml, templates/teamcity.settings.kts는 모두 reflection 패스가 여전히 __GOOSE_MODEL__ 기반 config를 그대로 사용하므로, GitLab/Gitea/TeamCity로 렌더링할 때 사용자가 --verify-model과 recipe의 goose_verify_model을 지정해도 검증 패스는 리뷰 모델로 계속 실행된다. 사용자에게 어떤 피드백도 없이(오류도, 로그도) 조용히 무시되는 것이므로 이 PR의 핵심 기능이 4개 플랫폼 중 3곳에서 무력화된다. 나머지 플랫폼 템플릿에도 동일한 config 재작성 블록을 넣거나, 지원하지 않는 플랫폼에서는 --verify-model을 명시적으로 거부(에러)하도록 해야 한다.
There was a problem hiding this comment.
Applied — 4538348 (guard 방식 채택, 템플릿 포팅은 보류):
- 사실 확인: 정확합니다.
grep -c GOOSE_VERIFY_MODEL로 재검증한 결과 gitlab.ci.yml / gitea.workflow.yml / teamcity.settings.kts는 모두 0건이고, 세 템플릿의 reflection 패스(gitlab L109, gitea L151, teamcity L120)는 리뷰 모델 config를 그대로 사용합니다.--verify-model이 조용히 무시되는 상태였습니다. - 채택한 수정:
render.py가--verify-model을 github 외 플랫폼에서 exit 2로 명시적 거부하도록 했습니다 (실패 시FAIL: --verify-model is only supported on the github platform). 조용한 무효화보다 요청 시점에 실패하는 것이 계약적으로 정확합니다. - 보류한 부분(템플릿 3종 포팅): reflection config 재작성 블록은 플랫폼별로 들여쓰기/스텝 구조(main.yml은 10-space verify-region 마커 규칙, TeamCity는 Kotlin DSL 문자열)가 달라, 검증 없이 동일 PR에 패치하면 설치 4천 곳의 CI가 깨질 수 있습니다. 별도 이슈로 추적하고 이 PR은 fail-loud로 마무리합니다.
| python3 /tmp/render.py {{ ci_platform }} \ | ||
| --provider {{ ci_provider }} \ | ||
| --model {{ goose_model }} \ | ||
| --verify-model {{ goose_verify_model }} \ |
There was a problem hiding this comment.
🟢 SUGGESTION — codegoose-setup.yaml:143 [P3]: 렌더 명령에 --verify-model {{ goose_verify_model }} \이 무조건 포함되어 있는 반면, 동일 프롬프트의 Step 4 지시(codegoose-setup.yaml:169-171)는 값이 비면 "DO NOT pass --verify-model"이라고 안내한다. 지시가 충돌하므로, LLM이 명령 템플릿을 그대로 따라 값이 빈 채 --verify-model을 전달하면 --style 등 다음 옵션을 값으로 삼아 파싱이 깨진다. 값이 비면 플래그 자체를 생략하는 예시로 명령 템플릿을 조건부 표기하도록 정리하는 것이 안전하다. (render.py의 or args.model 처리가 빈 문자열은 우회해주지만 셸 인자 파싱 문제는 막지 못함.)
There was a problem hiding this comment.
Applied — 4538348:
- 사실 확인: 맞습니다. Step 2 명령 블록이
--verify-model {{ goose_verify_model }} \\\\을 무조건 포함한 반면 Step 4는 빈 값일 때 플래그를 생략하라고 했어서, 에이전트가 명령 템플릿을 문자 그대로 따라가면 빈 값이--style을 삼켜 파싱이 깨졌습니다. (render.py의args.verify_model or args.model폴백은 "빈 문자열" 인자가 도착하지 않는 경우에만 유효합니다.) - 반영: Step 2 명령 블록에서
--verify-model라인을 제거해 기본(빈 값) 경로가 플래그 없이 안전해졌고, Step 4 가이드를 "값이 있으면 Step 2 명령의--model다음 줄에--verify-model {{ goose_verify_model }} \\\\(trailing backslash 유지)을 추가"하도록 정리했습니다. 빈 값을 넘기는 경로 자체를 제거했습니다. - 검증:
goose recipe validatePASS, 딥링크 4종 재생성 후--check일치, 가드 동작 확인(비-github +--verify-model→ exit 2, github +--verify-model→ 정상 렌더, verify.py PASS).
…+ recipe de-conflict CodeGoose PR #2 AI review dispositions: - P2 applied (guard): the __GOOSE_VERIFY_MODEL__ switch only exists in the GitHub workflow template; on gitlab/gitea/teamcity the flag silently no-oped and the reflection pass kept the review model. render.py now rejects --verify-model with exit 2 on non-github platforms (ported templates are a tracked follow-up, not a rushed same-PR patch). - P3 applied (recipe): the Step 2 command embedded --verify-model {{ goose_verify_model }} unconditionally while Step 4 said to omit the flag when empty — an agent following the literal command with an empty default would make --style the flag value. The command block now matches the no-flag default and Step 4 instructs ADDING the line only when set. - deeplinks regenerated; recipe validate PASS; verify.py PASS; diff-model render still yields review/reflection split.
There was a problem hiding this comment.
Summary
이 PR은 렌더러(scripts/render.py)에 --verify-model 옵션을 추가하고 GitHub 워크플로 템플릿의 검증(reflection) 패스가 실행 직전에 ~/.config/goose/config.yaml을 재작성해 리뷰 패스와 다른 모델을 쓸 수 있게 한다. 기본값(--verify-model 미지정)은 기존 단일 모델 동작을 유지하고, 비-GitHub 플랫폼에서는 디플래그를 명시적으로 거부하며, --verification off 시 관련 영역 전체가 제거되어 죽은 코드가 남지 않는다. 전반적으로 설계가 견실하며 방어적 처리가 잘 되어 있어 큰 결함은 발견되지 않았다.
- [검증] 4건 유지 / 0건 강등 / 0건 제외 — 제외된 파인딩 상세는 CI 로그를 확인하세요.
🔴 Blocking Issues
발견 사항 없음
🟡 Warnings
codegoose-setup.yaml:172[P2] 레시피가 Step 2 명령에--verify-model {{ goose_verify_model }}을 추가하라고 지시하는데, 이 지시가 플랫폼 구분 없이 공통으로 기술되어 있다. 그러나scripts/render.py:219는--verify-model을 GitHub에서만 허용하고 나머지(GitLab/Gitea/TeamCity)에서는return 2로 실패시킨다. 따라서 해당 플랫폼을 선택하면서 검증 모델을 입력한 사용자는 레시피 지시를 그대로 따르다가 렌더 단계에서 반드시 실패한다. 실패는 명시적(소리 내며 fail)이라 조용한 오류는 아니지만, 레시피 프롬프트는 "GitHub에서만 유효"라는 비고를 추가해 비-GitHub 사용자의 동작 경로를 문서화할 필요가 있다(레시피는 렌더러 제약의 Source of Truth여야 하므로).
🟢 Suggestions
templates/github.workflow.yml:163-167[P3]cat <<'VEOF' > ~/.config/goose/config.yaml재작성이findings.json이 비어 있을 때(검증할 파인딩 없음)와 shadow 모드에서도 무조건 실행된다. 기본 단일 모델에서는 동일 내용을 재작성하는 중복 I/O일 뿐이라 기능상 문제는 없지만, 실제 파인딩 존재 여부(findings.json) 확인 뒤로 이동하거나 불필요 시 건너뛰도록 하면 낭비를 줄일 수 있다.scripts/render.py:255[P3]args.verify_model or args.model을 그대로 치환할 뿐, 검증 모델이 리뷰 프로바이더와 다른 프로바이더의 모델인지는 검증하지 않는다. 재작성된 config의GOOSE_PROVIDER: __PROVIDER__는 리뷰 프로바이더로 고정되므로, 다른 공급자의 모델을 지정하면 런타임에 프로바이더/모델 불일치로 실패한다. 사용자 오류 범위라 차단 수준은 아니지만 옵션 도움말/레시피에 "동일 provider 내 모델만 지정"을 명시하면 좋겠다.scripts/render.py:196[nit]--verify-model이 GitHub 전용임을 show-help 문구에만 적고 있고,--verification off를 함께 주면 값이 조용히 무시된다. GitHub+off 조합에서도 디플래그가 무시될 수 있음을 커맨드라인 도움말에 한 줄 짚어주면 혼란을 줄일 수 있다.
✅ Highlights
scripts/render.py:219-223비-GitHub 플랫폼에서--verify-model을 조용히 무시하지 않고 명시적으로FAIL+return 2로 거부하는 "fail loud" 처리가 잘 되어 있다.- 기본 동작 보존이 깔끔하다.
args.verify_model or args.model로 기본값을 리뷰 모델로 퇴보(fallback)시켜--verify-model미지정 시 두 패스가 동일 모델을 쓰는 기존 동작을 해치지 않는다. templates/github.workflow.yml:163새 heredoc 종결자로VEOF를 도입해 기존guard_values의EOF화이트리스트와 충돌하지 않고,#[verify:end]가 "off"에서 영역 전체(모델 스위치 포함)를 제거해 죽은 코드/쓸데없는 치환이 남지 않는다. 파인딩이 존재할 때만 reflection+retry가 실행되며 config 재작성이 첫goose run(리뷰 패스) 이후에 배치되어 순서도 올바르다.
Verdict
APPROVE - 검증을 통과한 파인딩에 차단 이슈가 없습니다.
| written (both passes then use GOOSE_MODEL; never pass an empty --verify- | ||
| model value — it would swallow the next flag). If set, ADD one line into | ||
| the Step 2 command right after --model: | ||
| --verify-model {{ goose_verify_model }} \\ |
There was a problem hiding this comment.
🟡 WARNING — codegoose-setup.yaml:172 [P2] 레시피가 Step 2 명령에 --verify-model {{ goose_verify_model }}을 추가하라고 지시하는데, 이 지시가 플랫폼 구분 없이 공통으로 기술되어 있다. 그러나 scripts/render.py:219는 --verify-model을 GitHub에서만 허용하고 나머지(GitLab/Gitea/TeamCity)에서는 return 2로 실패시킨다. 따라서 해당 플랫폼을 선택하면서 검증 모델을 입력한 사용자는 레시피 지시를 그대로 따르다가 렌더 단계에서 반드시 실패한다. 실패는 명시적(소리 내며 fail)이라 조용한 오류는 아니지만, 레시피 프롬프트는 "GitHub에서만 유효"라는 비고를 추가해 비-GitHub 사용자의 동작 경로를 문서화할 필요가 있다(레시피는 렌더러 제약의 Source of Truth여야 하므로).
There was a problem hiding this comment.
Applied — a294437: Step 4 가이드에 GITHUB ONLY 제약을 명시했습니다 — 비-github 플랫폼에서 검증 모델이 설정되면 렌더러가 exit 2로 거부함을 레시피가 먼저 알려주고, 행동 경로도 제시합니다("제약을 보고하고 플래그 없이 재실행"). 레시피가 렌더러 제약의 source of truth 역할을 하도록 정렬했습니다.
| cat <<'VEOF' > ~/.config/goose/config.yaml | ||
| GOOSE_PROVIDER: __PROVIDER__ | ||
| GOOSE_MODEL: __GOOSE_VERIFY_MODEL__ | ||
| keyring: false | ||
| VEOF |
There was a problem hiding this comment.
🟢 SUGGESTION — templates/github.workflow.yml:163-167 [P3] cat <<'VEOF' > ~/.config/goose/config.yaml 재작성이 findings.json이 비어 있을 때(검증할 파인딩 없음)와 shadow 모드에서도 무조건 실행된다. 기본 단일 모델에서는 동일 내용을 재작성하는 중복 I/O일 뿐이라 기능상 문제는 없지만, 실제 파인딩 존재 여부(findings.json) 확인 뒤로 이동하거나 불필요 시 건너뛰도록 하면 낭비를 줄일 수 있다.
There was a problem hiding this comment.
Applied — a294437: config 재작성 블록을 findings-exist + head-unchanged 가드 이후(첫 reflection goose run 직전)로 이동했습니다. 파인딩이 비었거나 단일 모델 사용 시 config 재작성 I/O가 아예 발생하지 않고, reflection + retry는 여전히 재작성된 config를 읽습니다. 검증: 렌더 결과 L158 가드 → L169 스위치 → L178 reflection 순서, verify.py PASS.
| ("__RECIPES_BASE__", release_base()), | ||
| ("__PROVIDER__", provider), | ||
| ("__GOOSE_MODEL__", args.model), | ||
| ("__GOOSE_VERIFY_MODEL__", args.verify_model or args.model), |
There was a problem hiding this comment.
🟢 SUGGESTION — scripts/render.py:255 [P3] args.verify_model or args.model을 그대로 치환할 뿐, 검증 모델이 리뷰 프로바이더와 다른 프로바이더의 모델인지는 검증하지 않는다. 재작성된 config의 GOOSE_PROVIDER: __PROVIDER__는 리뷰 프로바이더로 고정되므로, 다른 공급자의 모델을 지정하면 런타임에 프로바이더/모델 불일치로 실패한다. 사용자 오류 범위라 차단 수준은 아니지만 옵션 도움말/레시피에 "동일 provider 내 모델만 지정"을 명시하면 좋겠다.
There was a problem hiding this comment.
Applied — a294437 (문서화): 재작성된 config가 리뷰 provider를 유지하므로 "동일 provider의 모델만 지정" 요건을 레시피 Step 4 가이드에 명시했습니다. 프로바이더 간 모델 검증은 렌더러가 모델 카탈로그를 갖고 있지 않아 정적 검증이 불가능하므로, 사용자 오류 시 런타임 실패 + 문서화로 대응하는 게 적절하다고 판단했습니다.
| ap.add_argument("platform", choices=list(SOURCES)) | ||
| ap.add_argument("--provider", required=True) | ||
| ap.add_argument("--model", required=True) | ||
| ap.add_argument("--verify-model", default=None, |
There was a problem hiding this comment.
🟢 SUGGESTION — scripts/render.py:196 [nit] --verify-model이 GitHub 전용임을 show-help 문구에만 적고 있고, --verification off를 함께 주면 값이 조용히 무시된다. GitHub+off 조합에서도 디플래그가 무시될 수 있음을 커맨드라인 도움말에 한 줄 짚어주면 혼란을 줄일 수 있다.
There was a problem hiding this comment.
Applied — a294437: 두 층위에서 반영했습니다. ① argparse help에 "With --verification off the value is unused" 추가, ② 렌더러가 github + --verify-model + --verification off 조합에서 WARN을 출력하도록 했습니다(fail은 아님 — 렌더 자체는 유효하고 값이 no-op 입력일 뿐). 실측: WARN 메시지 출력 + 출력물에 스위치 0건 확인.
…rm/provider docs - P2 applied (recipe): Step 4 guidance now states the GITHUB ONLY constraint explicitly — on gitlab/gitea/teamcity a set verify model means re-run WITHOUT the flag (the renderer rejects it with exit 2), so non-github users have a documented action path instead of a guaranteed render failure. - P3 applied (template): the __GOOSE_VERIFY_MODEL__ config rewrite moved after the findings-exist + head-unchanged guards — empty findings or single-model usage no longer performs a pointless config write. Reflection + retry still read the rewritten config. - P3 applied (render.py): --verify-model + --verification off now prints a WARN (the switch is stripped with the verify region, so the value is dead input); help text documents both constraints (github-only, unused with off). - P3 acknowledged (same-provider note): the rewritten config keeps the review provider — same-provider requirement documented in the recipe guidance. - deeplinks regenerated; recipe validate PASS; verify.py PASS; guard matrix re-tested (gitlab+vm=FAIL, github+vm+off=WARN, github+vm+on=dual model).
There was a problem hiding this comment.
Summary
이 PR은 render.py에 --verify-model 옵션을 추가해 반성(reflection) 검증 패스를 리뷰 패스와 다른 모델로 실행할 수 있게 하고, GitHub 워크플로 템플릿의 #[verify:begin]/#[verify:end] 영역 안에서 reflection 실행 직전에 ~/.config/goose/config.yaml을 재작성하도록 한다. 기본(단일 모델) 동작은 기존과 동일하고, 비-GitHub 플랫폼의 --verify-model은 명시적으로 실패 처리하며, --verification off일 때는 플레이스홀더가 남지 않는다. 주요 경로는 안전하며 블로킹 결함은 없으나, provider-모델 일치 미검증과 주석/동작 불일치 같은 사소한 문제가 있다.
- [검증] 3건 유지 / 0건 강등 / 0건 제외 — 제외된 파인딩 상세는 CI 로그를 확인하세요.
🔴 Blocking Issues
- 발견 사항 없음.
🟡 Warnings
scripts/render.py:220-230[P2]:if args.verify_model and args.platform != "github"검증은 플랫폼과--verification off조합만 확인하고,--verify-model값이--provider와 같은 provider의 모델인지는 전혀 검증하지 않는다.--verify-model치환은scripts/render.py:261의args.verify_model or args.model그대로 들어가며, 사용자가 review provider와 다른 provider의 모델을 넣으면 강제되지 않는다. 이 경우 워크플로는 핵심 binding 하나(__API_KEY_NAME__)만 env로 가진 상태에서 reflectiongoose run(templates/github.workflow.yml:181)이 인증 실패 →reflect-parse실패 → 1회 재시도 → fail-open(D-2)으로 이어져, CI는 초록인 채 검증 게이트가 조용히 무력화된다. 최소한 prefix 기반 휴리스틱이라도 render 시 WARN으로 출력하거나, 모델 식별자를 'provider::model' 형태로 요구하는 검증을 추가하길 권장한다.
🟢 Suggestions
templates/github.workflow.yml:174-175[P3]: 주석이 "findings exist and the PR head is unchanged. Empty findings or single-model usage skips the rewrite entirely (no wasted I/O)"라지만 실제로는 (a) 이 블록에는 PR head 변경 검사가 없고(head 가드는Post review to PR스텝templates/github.workflow.yml:261-267에만 있음), (b) 단일 모델 사용 시에도scripts/render.py:261이args.model로 치환하므로 rewrite는 항상 실행되어 동일 config를 재작성한다. 코드가 제공하지 않는 동작을 주석이 약속하고 있어, 주석을 실제 동작(모델값 재작성은 항상 수행)에 맞게 수정하거나 조건에 단일-모델 스킵을 실제로 반영한다.templates/github.workflow.yml:176-180[P3]: verify-model 스위치가Configure goose스텝(templates/github.workflow.yml:63-67)의 config 쓰기와 동일한 3줄 config를 중복 재작성한다. 현재 3개 키만으론 문제없지만, 향후 config에 기본으로 들어가는 키(커스텀 엔드포인트, provider 옵션 등)가 추가되면 이 재작성 블록이 그것을 조용히 유실시켜 review 패스와 reflection 패스가 분기될 수 있다. 모델 한 줄만sed로 교체하거나 단일 source로부터 두 모델을 한 번에 쓰는 방식이 더 견고하다.
✅ Highlights
- 비-GitHub 플랫폼에서
--verify-model을 주면scripts/render.py:220-224에서 조용히 no-op 처리하는 대신 명시적으로 exit 2로 실패시켜 "silent degradation"을 방지한 점이 우수하다. --verification off시strip_verify_region(keep=False)이__GOOSE_VERIFY_MODEL__포함 전체 영역을 제거해 dead placeholder가 남지 않음을 확인했다.- 기본(단일 모델) 경로는
__GOOSE_VERIFY_MODEL__이--model로 치환되어 기존 동작을 정확히 보존하며, API 키 binding은 여전히 1개로 유지된다(리뷰/반성 모두 동일 provider·env 키 사용).
Verdict
APPROVE - 검증을 통과한 파인딩에 차단 이슈가 없습니다.
| if args.verify_model and args.platform != "github": | ||
| # The __GOOSE_VERIFY_MODEL__ switch only exists in the GitHub workflow | ||
| # template; on other platforms the flag would silently no-op and the | ||
| # reflection pass would keep the review model. Fail loud instead. | ||
| print("FAIL: --verify-model is only supported on the github platform") | ||
| return 2 | ||
| if args.verify_model and args.verification == "off": | ||
| # --verification off strips the whole verify region including the | ||
| # model switch, so --verify-model would be dead input. Warn (not | ||
| # fail): the render is still valid, the user just gave a no-op value. | ||
| print("WARN: --verify-model has no effect with --verification off") |
There was a problem hiding this comment.
🟡 WARNING — scripts/render.py:220-230 [P2]: if args.verify_model and args.platform != "github" 검증은 플랫폼과 --verification off 조합만 확인하고, --verify-model 값이 --provider와 같은 provider의 모델인지는 전혀 검증하지 않는다. --verify-model 치환은 scripts/render.py:261의 args.verify_model or args.model 그대로 들어가며, 사용자가 review provider와 다른 provider의 모델을 넣으면 강제되지 않는다. 이 경우 워크플로는 핵심 binding 하나(__API_KEY_NAME__)만 env로 가진 상태에서 reflection goose run(templates/github.workflow.yml:181)이 인증 실패 → reflect-parse 실패 → 1회 재시도 → fail-open(D-2)으로 이어져, CI는 초록인 채 검증 게이트가 조용히 무력화된다. 최소한 prefix 기반 휴리스틱이라도 render 시 WARN으로 출력하거나, 모델 식별자를 'provider::model' 형태로 요구하는 검증을 추가하길 권장한다.
There was a problem hiding this comment.
Applied — 224acdd (WARN 휴리스틱 채택): 제안대로 prefix 기반 경고를 render 시점에 추가했습니다. accounts/fireworks/models/, gpt-/o1/o3, claude- 등 알려진 provider별 prefix가 선택된 provider와 어긋나면 WARN: --verify-model looks like a <provider> model but the config keeps provider <provider>를 출력합니다. 치명적 포인트를 정확히 짚어주셨습니다 — 이 실패 체인(reflection auth fail → reflect-parse fail → retry → fail-open)은 CI가 초록인 채 게이트만 무력화되므로 render 시점 경고가 최소 비용의 가시성입니다. 카탈로그가 아니라 휴리스틱이라는 점(미지 prefix는 통과)도 코드 주석에 명시했습니다. 실측: claude 모델 + fireworks provider → WARN 출력, 동일 provider → WARN 없음.
| # findings exist and the PR head is unchanged. Empty findings or | ||
| # single-model usage skips the rewrite entirely (no wasted I/O). |
There was a problem hiding this comment.
🟢 SUGGESTION — templates/github.workflow.yml:174-175 [P3]: 주석이 "findings exist and the PR head is unchanged. Empty findings or single-model usage skips the rewrite entirely (no wasted I/O)"라지만 실제로는 (a) 이 블록에는 PR head 변경 검사가 없고(head 가드는 Post review to PR 스텝 templates/github.workflow.yml:261-267에만 있음), (b) 단일 모델 사용 시에도 scripts/render.py:261이 args.model로 치환하므로 rewrite는 항상 실행되어 동일 config를 재작성한다. 코드가 제공하지 않는 동작을 주석이 약속하고 있어, 주석을 실제 동작(모델값 재작성은 항상 수행)에 맞게 수정하거나 조건에 단일-모델 스킵을 실제로 반영한다.
There was a problem hiding this comment.
Applied — 224acdd: 주석이 실제 동작을 과대 약속한 것이 맞습니다. (a) 이 블록에는 head 가드가 없음(가드는 post step의 live check), (b) 단일 모델에서도 치환값이 review model이라 재작성이 항상 실행(value no-op). 주석을 실제 동작대로 고쳤습니다: "findings가 있을 때만 실행", "head 이동은 post step live guard가 허용", "--verify-model 미지정 시 sed는 value no-op".
| cat <<'VEOF' > ~/.config/goose/config.yaml | ||
| GOOSE_PROVIDER: __PROVIDER__ | ||
| GOOSE_MODEL: __GOOSE_VERIFY_MODEL__ | ||
| keyring: false | ||
| VEOF |
There was a problem hiding this comment.
🟢 SUGGESTION — templates/github.workflow.yml:176-180 [P3]: verify-model 스위치가 Configure goose 스텝(templates/github.workflow.yml:63-67)의 config 쓰기와 동일한 3줄 config를 중복 재작성한다. 현재 3개 키만으론 문제없지만, 향후 config에 기본으로 들어가는 키(커스텀 엔드포인트, provider 옵션 등)가 추가되면 이 재작성 블록이 그것을 조용히 유실시켜 review 패스와 reflection 패스가 분기될 수 있다. 모델 한 줄만 sed로 교체하거나 단일 source로부터 두 모델을 한 번에 쓰는 방식이 더 견고하다.
There was a problem hiding this comment.
Applied — 224acdd (sed 단일 라인 교체 채택): heredoc 전면 재작성을 sed 's|^GOOSE_MODEL: .*|GOOSE_MODEL: <verify model>|'로 교체해 Configure goose의 다른 키가 미래에 추가돼도 reflection 패스로 보존되도록 했습니다. 구현 전 실제 config 형식을 검증했습니다 — YAML block scalar가 공통 인덴트를 제거하므로 config 키는 bare(GOOSE_MODEL:, leading space 없음)이고, sed 앵커가 정확히 매칭됩니다. end-to-end 테스트: sed 실행 후 GOOSE_PROVIDER/keyring 보존, GOOSE_MODEL만 교체 확인.
…odel swap - P2 applied (render.py): cheap prefix heuristic WARN when --verify-model looks like another provider model (accounts/fireworks/models/ vs claude-/ gpt-/o1/o3) while the rewritten config keeps the review provider — the failure mode (reflection auth fail → parse fail → retry → fail-open with green CI) is silent, so a render-time warning is the cheapest visibility. Heuristic, not a catalog: unknown prefixes pass. - P3 applied (template): comment now matches reality — the swap runs only when findings exist; a head-move after that point is tolerated by the post step live guard; single-model renders perform a value no-op sed (not a skip). - P3 applied (template): full-file heredoc rewrite replaced with sed on the GOOSE_MODEL line only — keys added to Configure goose by future releases survive into the reflection pass. Verified against the real config format (YAML block-scalar strips the indent; keys are bare). - verify.py PASS; cross-provider WARN confirmed (claude model on fireworks provider); same-provider render produces no warning.
There was a problem hiding this comment.
Summary
본 PR은 렌더러에 --verify-model 플래그를 추가하여 GitHub 워크플로에서 리뷰(reflection 검증) 패스가 리뷰 패스와 다른 모델을 사용하도록 지원한다. render.py가 __GOOSE_VERIFY_MODEL__을 치환하고, 템플릿의 #[verify:begin] 영역에서 reflection goose run 직전에 sed로 ~/.config/goose/config.yaml의 GOOSE_MODEL 라인을 재작성하는 방식이다. 기본값(미지정) 시 기존 단일 모델 동작을 정확히 보존하고, 비-GitHub 플랫폼에서는 명시적으로 거부(exit 2)하는 등 fail-loud 설계가 일관되게 지켜졌다. 전반적으로 설계가 타당하며 렌더·문서·딥링크까지 일관되게 갱신된 양호한 변경이다.
- [검증] 3건 유지 / 0건 강등 / 0건 제외 — 제외된 파인딩 상세는 CI 로그를 확인하세요.
🔴 Blocking Issues
발견 사항 없음 — 치명적 정확성 버그·보안·데이터 손실 위험은 확인되지 않았다.
🟡 Warnings
-
templates/github.workflow.yml:180[P2]sed 's|^GOOSE_MODEL: .*|GOOSE_MODEL: __GOOSE_VERIFY_MODEL__|'은 매칭 라인이 없어도 exit 0으로 성공한다(무소음 no-op). 현재Configure goose스텝(templates/github.workflow.yml:63-66)이 정확히GOOSE_MODEL: <model>형식으로 쓰고 있어 동작하지만, 향후 해당 키 포맷이 변경되면(예:GOOSE_MODEL=또는 들여쓰기 추가) 사용자가 명시한--verify-model이 아무 신호 없이 무시되고 reflection 패스가 리뷰 모델로 실행된다. 이 저장소의 "fail loud / silent error 금지" 원칙에 비춰, 재작성 전후 값을 비교하거나grep -q '^GOOSE_MODEL:' && sed ...형태로 매칭 실패 시 명시 실패하도록 가드를 추가하는 것을 권장한다. -
scripts/render.py:236-246[P2] 확인/검증 모델의 프로바이더 경계 강제가 휴리스틱 경고뿐인데, 생성된 워크플로는GOOSE_PROVIDER를 리뷰 프로바이더로 유지한다(templates/github.workflow.yml:64). 서로 다른 프로바이더의 verify model을 넘기면 런타임 인증 실패가 발생하고, 코드 주석이 스스로 밝히듯 reflection 게이트는 fail-open(리뷰는 그대로 게시)이라 "검증 없이 게시"되는 결과를 낳는다. 콘솔 경고만 의존하기보다 주요 프로바이더는 불일치를 하드 에러로 처리하거나, 적어도 워크플로 렌더 결과에 리스크를 명시하는 방안 검토를 권한다.
🟢 Suggestions
templates/github.workflow.yml:180[P3] 런타임 사이드이펙트로 공용~/.config/goose/config.yaml을sed로 변경하는 방식은 이후Configure goose의 키 추가·변경 시 취약하다. reflection 전용goose run호출에 모델 파라미터를 전달하는 방식(현재 파이프라인 구조상 제약이 있지만)으로 전환하거나, 아니면values-are-preserved순수 sed 방식이 아닌 원자적 재작성 헬퍼로 위험을 국소화하는 편이 견고하다.
✅ Highlights
--verify-model을 비-GitHub 플랫폼에서exit 2로 명시 거부하고(scripts/render.py:220-224),--verification off시 사전에 경고(render.py:226-229)하는 fail-loud 처리와, 미지정 시 치환값이--model과 같아져 동작을 완전히 보존하는 설계가 일관성이 높다.- 프로바이더 API 키 바인딩이 여전히 1개로 유지되고, 모델 스위치를
#[verify:begin]영역 안에 두어off렌더 시 데드 코드가 남지 않는 점도 우수하다. sed가 아닌 부분 재작성(요소 보존)을 의도하고 주석으로 명시해 미래 키 추가에도 tolerant하도록 한 점, 그리고 JSON 결과가 없는 경우 reflection 블록 자체를 건너뛰어 쓸데없는 리소스 소모를 피한 점이 좋다.
Verdict
APPROVE - 검증을 통과한 파인딩에 차단 이슈가 없습니다.
| # review model and this sed is a value no-op. sed (not a full | ||
| # rewrite) so keys added to Configure goose by future releases | ||
| # survive into the reflection pass. | ||
| sed -i.bak 's|^GOOSE_MODEL: .*|GOOSE_MODEL: __GOOSE_VERIFY_MODEL__|' ~/.config/goose/config.yaml && rm -f ~/.config/goose/config.yaml.bak |
There was a problem hiding this comment.
🟡 WARNING — templates/github.workflow.yml:180 [P2] sed 's|^GOOSE_MODEL: .*|GOOSE_MODEL: __GOOSE_VERIFY_MODEL__|'은 매칭 라인이 없어도 exit 0으로 성공한다(무소음 no-op). 현재 Configure goose 스텝(templates/github.workflow.yml:63-66)이 정확히 GOOSE_MODEL: <model> 형식으로 쓰고 있어 동작하지만, 향후 해당 키 포맷이 변경되면(예: GOOSE_MODEL= 또는 들여쓰기 추가) 사용자가 명시한 --verify-model이 아무 신호 없이 무시되고 reflection 패스가 리뷰 모델로 실행된다. 이 저장소의 "fail loud / silent error 금지" 원칙에 비춰, 재작성 전후 값을 비교하거나 grep -q '^GOOSE_MODEL:' && sed ... 형태로 매칭 실패 시 명시 실패하도록 가드를 추가하는 것을 권장한다.
| if args.verify_model and args.verify_model != args.model: | ||
| _pfx = {"fireworks-ai": "accounts/fireworks/models/", | ||
| "openai": ["gpt-", "o1", "o3", "chatgpt"], | ||
| "anthropic": ["claude-"], | ||
| "openrouter": [], | ||
| "ollama_cloud": []} | ||
| _own = _pfx.get(provider, []) | ||
| _own_list = _own if isinstance(_own, list) else [_own] | ||
| if _own_list and not any(args.verify_model.startswith(p) for p in _own_list): | ||
| _foreign = [name for name, pfx in _pfx.items() | ||
| if name != provider and any(args.verify_model.startswith(p) for p in (pfx if isinstance(pfx, list) else [pfx]))] |
There was a problem hiding this comment.
🟡 WARNING — scripts/render.py:236-246 [P2] 확인/검증 모델의 프로바이더 경계 강제가 휴리스틱 경고뿐인데, 생성된 워크플로는 GOOSE_PROVIDER를 리뷰 프로바이더로 유지한다(templates/github.workflow.yml:64). 서로 다른 프로바이더의 verify model을 넘기면 런타임 인증 실패가 발생하고, 코드 주석이 스스로 밝히듯 reflection 게이트는 fail-open(리뷰는 그대로 게시)이라 "검증 없이 게시"되는 결과를 낳는다. 콘솔 경고만 의존하기보다 주요 프로바이더는 불일치를 하드 에러로 처리하거나, 적어도 워크플로 렌더 결과에 리스크를 명시하는 방안 검토를 권한다.
| # review model and this sed is a value no-op. sed (not a full | ||
| # rewrite) so keys added to Configure goose by future releases | ||
| # survive into the reflection pass. | ||
| sed -i.bak 's|^GOOSE_MODEL: .*|GOOSE_MODEL: __GOOSE_VERIFY_MODEL__|' ~/.config/goose/config.yaml && rm -f ~/.config/goose/config.yaml.bak |
There was a problem hiding this comment.
🟢 SUGGESTION — templates/github.workflow.yml:180 [P3] 런타임 사이드이펙트로 공용 ~/.config/goose/config.yaml을 sed로 변경하는 방식은 이후 Configure goose의 키 추가·변경 시 취약하다. reflection 전용 goose run 호출에 모델 파라미터를 전달하는 방식(현재 파이프라인 구조상 제약이 있지만)으로 전환하거나, 아니면 values-are-preserved 순수 sed 방식이 아닌 원자적 재작성 헬퍼로 위험을 국소화하는 편이 견고하다.
Summary
Adds per-pass model selection so the verification (reflection) goose can run a different model than the review goose.
render.py --verify-model <model>substitutes__GOOSE_VERIFY_MODEL__#[verify:begin]/#[verify:end]region, the reflection pass rewrites~/.config/goose/config.yamlwith the verify model before its firstgoose run(retry pass included — same step)--verify-model) keeps the exact current behavior: single config, both passes on--model--verification offstrips the whole region including the model switch (no dead code)Verification
verify.pyPASS for on/shadow/off rendersdeepseek-v4-flash-vision-exp, reflection=glm-5p3-flash(2 config blocks, distinct models)accounts/fireworks/models/glm-5p3-flashlanded as commit01f78109(PR #142)Summary by CodeRabbit
새로운 기능
--verify-model옵션으로 검증 모델을 재정의할 수 있습니다.문서