Skip to content

feat(renderer): --verify-model for a per-pass reflection model - #2

Merged
soolmuk merged 5 commits into
mainfrom
feat/verify-model
Sep 5, 2026
Merged

soolmuk merged 5 commits into
mainfrom
feat/verify-model

Conversation

@soolmuk

@soolmuk soolmuk commented Sep 5, 2026 •

Copy link
Copy Markdown
Owner

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__
  • Template: inside the #[verify:begin]/#[verify:end] region, the reflection pass rewrites ~/.config/goose/config.yaml with the verify model before its first goose run (retry pass included — same step)
  • Default (no --verify-model) keeps the exact current behavior: single config, both passes on --model
  • --verification off strips the whole region including the model switch (no dead code)

Verification

  • verify.py PASS for on/shadow/off renders
  • Diff-model render: review=deepseek-v4-flash-vision-exp, reflection=glm-5p3-flash (2 config blocks, distinct models)
  • Consumer re-render (kai-cameo-mcp) with both passes on accounts/fireworks/models/glm-5p3-flash landed as commit 01f78109 (PR #142)

Summary by CodeRabbit

  • 새로운 기능

    • 렌더러의 검증 단계에 사용할 모델을 별도로 지정할 수 있습니다.
    • 기본적으로 리뷰 모델을 사용하며, --verify-model 옵션으로 검증 모델을 재정의할 수 있습니다.
    • GitHub 워크플로에서 검증 및 재시도 호출에 지정된 모델 설정이 적용됩니다.
  • 문서

    • 검증 모델 옵션과 기본 동작에 대한 도움말 및 템플릿 안내가 추가되었습니다.

@coderabbitai

coderabbitai Bot commented Sep 5, 2026 •

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

Next included review available in 26 minutes.

Check out review usage here.

View limit details

Limit 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.
You're only billed for reviews past your plan's rate limits ($0.25/file).

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Essentials

Run ID: 3f1201ac-e100-409d-b72a-7b91c3733ec1

📥 Commits

Reviewing files that changed from the base of the PR and between c240a64 and 224acdd.

📒 Files selected for processing (6)
  • README.ko.md
  • README.md
  • codegoose-setup.yaml
  • docs/launch.html
  • scripts/render.py
  • templates/github.workflow.yml

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Essentials

Run ID: 1e792c91-d7cf-4ae1-a37b-589496bc7ff7

📥 Commits

Reviewing files that changed from the base of the PR and between 8215c9a and c240a64.

📒 Files selected for processing (2)
  • scripts/render.py
  • templates/github.workflow.yml

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.


📝 Walkthrough

Walkthrough

렌더러에 --verify-model 인자를 추가했습니다. 지정하지 않으면 주 모델을 사용합니다. GitHub workflow는 검증 및 재시도 전에 검증 모델을 Goose 전역 설정에 기록합니다.

Changes

검증 모델 선택 및 실행

Layer / File(s) Summary
검증 모델 인자 및 템플릿 치환
scripts/render.py
--verify-model 인자를 추가했습니다. 값이 없으면 --model을 사용합니다. 템플릿의 __GOOSE_VERIFY_MODEL__을 선택한 모델로 치환합니다.
검증 workflow 설정 갱신
templates/github.workflow.yml
검증 및 재시도 호출 전에 공급자와 __GOOSE_VERIFY_MODEL__을 Goose 전역 설정에 기록합니다.

Estimated code review effort: 2 (Simple) | ~10 minutes

Merge Risk: ⚪ Minimal · up to c240a

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: 검증 모델 사용
Loading
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning 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 … Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 제목은 --verify-model을 통한 렌더러의 패스별 reflection 모델 선택 기능을 정확하게 설명합니다. 변경 사항의 주요 목적과 일치하며 간결합니다.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Full details: Docstring Coverage

Explanation

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 💡
  • Create stacked PR
  • Commit on current branch

Comment @coderabbitai help to get the list of available commands.

- 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
…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

@github-actions github-actions 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.

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가 항상 치환하므로 남는 일이 없지만, 향후 다른 템플릿에 이 플레이스홀더를 사용하면서 치환을 …

Comment thread scripts/render.py
("__RECIPES_BASE__", release_base()),
("__PROVIDER__", provider),
("__GOOSE_MODEL__", args.model),
("__GOOSE_VERIFY_MODEL__", args.verify_model or args.model),

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟡 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을 명시적으로 거부(에러)하도록 해야 한다.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

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로 마무리합니다.

Comment thread codegoose-setup.yaml Outdated
python3 /tmp/render.py {{ ci_platform }} \
--provider {{ ci_provider }} \
--model {{ goose_model }} \
--verify-model {{ goose_verify_model }} \

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟢 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 처리가 빈 문자열은 우회해주지만 셸 인자 파싱 문제는 막지 못함.)

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

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 validate PASS, 딥링크 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.

@github-actions github-actions 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.

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 - 검증을 통과한 파인딩에 차단 이슈가 없습니다.

Comment thread codegoose-setup.yaml
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 }} \\

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟡 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여야 하므로).

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Applied — a294437: Step 4 가이드에 GITHUB ONLY 제약을 명시했습니다 — 비-github 플랫폼에서 검증 모델이 설정되면 렌더러가 exit 2로 거부함을 레시피가 먼저 알려주고, 행동 경로도 제시합니다("제약을 보고하고 플래그 없이 재실행"). 레시피가 렌더러 제약의 source of truth 역할을 하도록 정렬했습니다.

Comment thread templates/github.workflow.yml Outdated
Comment on lines +163 to +167
cat <<'VEOF' > ~/.config/goose/config.yaml
GOOSE_PROVIDER: __PROVIDER__
GOOSE_MODEL: __GOOSE_VERIFY_MODEL__
keyring: false
VEOF

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟢 SUGGESTION — templates/github.workflow.yml:163-167 [P3] cat <<'VEOF' > ~/.config/goose/config.yaml 재작성이 findings.json이 비어 있을 때(검증할 파인딩 없음)와 shadow 모드에서도 무조건 실행된다. 기본 단일 모델에서는 동일 내용을 재작성하는 중복 I/O일 뿐이라 기능상 문제는 없지만, 실제 파인딩 존재 여부(findings.json) 확인 뒤로 이동하거나 불필요 시 건너뛰도록 하면 낭비를 줄일 수 있다.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Applied — a294437: config 재작성 블록을 findings-exist + head-unchanged 가드 이후(첫 reflection goose run 직전)로 이동했습니다. 파인딩이 비었거나 단일 모델 사용 시 config 재작성 I/O가 아예 발생하지 않고, reflection + retry는 여전히 재작성된 config를 읽습니다. 검증: 렌더 결과 L158 가드 → L169 스위치 → L178 reflection 순서, verify.py PASS.

Comment thread scripts/render.py
("__RECIPES_BASE__", release_base()),
("__PROVIDER__", provider),
("__GOOSE_MODEL__", args.model),
("__GOOSE_VERIFY_MODEL__", args.verify_model or args.model),

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟢 SUGGESTION — scripts/render.py:255 [P3] args.verify_model or args.model을 그대로 치환할 뿐, 검증 모델이 리뷰 프로바이더와 다른 프로바이더의 모델인지는 검증하지 않는다. 재작성된 config의 GOOSE_PROVIDER: __PROVIDER__는 리뷰 프로바이더로 고정되므로, 다른 공급자의 모델을 지정하면 런타임에 프로바이더/모델 불일치로 실패한다. 사용자 오류 범위라 차단 수준은 아니지만 옵션 도움말/레시피에 "동일 provider 내 모델만 지정"을 명시하면 좋겠다.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Applied — a294437 (문서화): 재작성된 config가 리뷰 provider를 유지하므로 "동일 provider의 모델만 지정" 요건을 레시피 Step 4 가이드에 명시했습니다. 프로바이더 간 모델 검증은 렌더러가 모델 카탈로그를 갖고 있지 않아 정적 검증이 불가능하므로, 사용자 오류 시 런타임 실패 + 문서화로 대응하는 게 적절하다고 판단했습니다.

Comment thread scripts/render.py
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,

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟢 SUGGESTION — scripts/render.py:196 [nit] --verify-model이 GitHub 전용임을 show-help 문구에만 적고 있고, --verification off를 함께 주면 값이 조용히 무시된다. GitHub+off 조합에서도 디플래그가 무시될 수 있음을 커맨드라인 도움말에 한 줄 짚어주면 혼란을 줄일 수 있다.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

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).

@github-actions github-actions 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.

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로 가진 상태에서 reflection goose 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 - 검증을 통과한 파인딩에 차단 이슈가 없습니다.

Comment thread scripts/render.py
Comment on lines +220 to +230
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")

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟡 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' 형태로 요구하는 검증을 추가하길 권장한다.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

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 없음.

Comment thread templates/github.workflow.yml Outdated
Comment on lines +174 to +175
# findings exist and the PR head is unchanged. Empty findings or
# single-model usage skips the rewrite entirely (no wasted I/O).

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟢 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를 재작성한다. 코드가 제공하지 않는 동작을 주석이 약속하고 있어, 주석을 실제 동작(모델값 재작성은 항상 수행)에 맞게 수정하거나 조건에 단일-모델 스킵을 실제로 반영한다.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

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

Comment thread templates/github.workflow.yml Outdated
Comment on lines +176 to +180
cat <<'VEOF' > ~/.config/goose/config.yaml
GOOSE_PROVIDER: __PROVIDER__
GOOSE_MODEL: __GOOSE_VERIFY_MODEL__
keyring: false
VEOF

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟢 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로부터 두 모델을 한 번에 쓰는 방식이 더 견고하다.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

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.
@soolmuk
soolmuk merged commit 0b1ae08 into main Sep 5, 2026
2 checks passed

@github-actions github-actions 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.

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

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟡 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 ... 형태로 매칭 실패 시 명시 실패하도록 가드를 추가하는 것을 권장한다.

Comment thread scripts/render.py
Comment on lines +236 to +246
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]))]

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟡 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

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟢 SUGGESTION — templates/github.workflow.yml:180 [P3] 런타임 사이드이펙트로 공용 ~/.config/goose/config.yaml을 sed로 변경하는 방식은 이후 Configure goose의 키 추가·변경 시 취약하다. reflection 전용 goose run 호출에 모델 파라미터를 전달하는 방식(현재 파이프라인 구조상 제약이 있지만)으로 전환하거나, 아니면 values-are-preserved 순수 sed 방식이 아닌 원자적 재작성 헬퍼로 위험을 국소화하는 편이 견고하다.

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.

1 participant