Skip to content

wp3: land four small contributor changes and the missing feedback-callback test - #4053

Merged
lidge-jun merged 6 commits into
devfrom
codex/260909-wp3-small-prs
Sep 8, 2026
Merged

wp3: land four small contributor changes and the missing feedback-callback test#4053
lidge-jun merged 6 commits into
devfrom
codex/260909-wp3-small-prs

Conversation

@lidge-jun

@lidge-jun lidge-jun commented Sep 8, 2026

Copy link
Copy Markdown
Owner

Summary

Third sequential integration branch of the 2.49.0 backlog closeout. Four small contributor changes plus the regression test one of them was missing, carried as squash commits that each keep a Co-authored-by trailer. Stacked on dev after #4051.

The sponsor pair #3914/#3915 is intentionally not in this branch; it stays deferred until the sponsorship is settled.

Closes #3894

GUI change

#3984 touches gui/src/pages/Models.tsx only to change a callback's identity — no markup, styling,
copy, or layout changes, so the Models page renders exactly as before. The screenshot below is the
one @yansigit captured for the original PR and it ships in this branch at
docs-site/public/pr-screenshots/3984-model-feedback.png (moved there from the new top-level directory the original PR introduced, so it sits with the other nineteen):

Models page feedback banner, unchanged by the callback fix

Verification

  • bun x tsc --noEmit — exit 0.
  • bun test on the three changed test files — 56 pass / 0 fail / 292 expect().
  • bun test tests/test-layout.test.ts tests/test-layout-tooling.test.ts tests/gui/models-feedback-callback.test.ts — 19 pass / 0 fail.
  • New test proven non-vacuous: with gui/src/pages/Models.tsx reverted to dev it reports 0 pass / 2 fail; restored, 2 pass.
  • bun run privacy:scan — passed. bun run skill:surface:check — current.
  • Each of the four applied onto the previous with git merge --squash, no conflicts.
  • Not run locally: full bun run test (hosted CI covers Linux, Windows, macOS).

Checklist

  • Scope stays focused and avoids unrelated cleanup.
  • Docs or release notes were updated when needed.
  • Security-sensitive changes were reviewed for secrets, auth, and unsafe defaults.

t and others added 5 commits September 9, 2026 03:22
Carried from #3980 (author yansigit) for maintainer-side CI and sequential integration.

Co-authored-by: yansigit <44089734+yansigit@users.noreply.github.com>
Carried from #3897 (author parkjs101) for maintainer-side CI and sequential integration.
Closes #3894

Co-authored-by: parkjs101 <93533648+parkjs101@users.noreply.github.com>
Carried from #3963 (author luvs01) for maintainer-side CI and sequential integration.

Co-authored-by: luvs01 <27862058+luvs01@users.noreply.github.com>
Carried from #3984 (author yansigit) for maintainer-side CI and sequential integration.

Co-authored-by: yansigit <44089734+yansigit@users.noreply.github.com>
#3984 changes publishFeedback to a useCallback and adds it to saveDisplayName's
dependency array, but shipped without coverage, so the hygiene gate flags
missing_regression_test. This source-oracle test asserts both halves and fails
on dev without the fix (0 pass / 2 fail), so the suppression cannot come back
unnoticed.

Co-authored-by: yansigit <44089734+yansigit@users.noreply.github.com>
@lidge-jun
lidge-jun requested a review from Ingwannu as a code owner September 8, 2026 18:24
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 8, 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-09-08T18:27:48.640902Z c60a382 PR opened
ℹ️ 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.

@github-actions

github-actions Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

Deterministic PR hygiene checks passed.

@github-actions github-actions Bot added the documentation Improvements or additions to documentation label Sep 8, 2026
@github-actions

github-actions Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

✅ READY

  • all PR quality gates passed.

Hygiene

Deterministic PR hygiene checks passed.

@github-actions
github-actions Bot marked this pull request as draft September 8, 2026 18:24
@coderabbitai

coderabbitai Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

Review Change StackReview Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Advanced

Run ID: c8c32ff2-6cc3-416f-a26a-11bb7668e734

📥 Commits

Reviewing files that changed from the base of the PR and between 9587750 and c60a382.

⛔ Files ignored due to path filters (29)
  • assets/pr-screenshots/model-feedback-review.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/011_sidebar_footer_after.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/011_star_in_update_dialog.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/021_dashboard_after.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/021_startup_autostart_row.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/031_models_after.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/031_models_disclosures_open.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/041_integrations_after.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/051_codex_set_after.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/051_codex_set_more_open.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/061_usage_after.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/071_startup_after.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/081_subagents_after.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/codex-set_1440.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/dashboard_1440.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/dashboard_models_1440.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/dashboard_providers_1440.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/integrations_1440.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/logs_1440.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/logs_debug_1440.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/models_1440.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/models_combos_1440.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/models_compatibility_1440.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/models_routing_1440.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/providers_1440.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/startup_1440.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/storage_1440.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/subagents_1440.png is excluded by !**/*.png
  • devlog/_plan/260904_dashboard_minimal/assets/usage_1440.png is excluded by !**/*.png
📒 Files selected for processing (45)
  • devlog/_plan/260904_dashboard_minimal/000_inventory.md
  • devlog/_plan/260904_dashboard_minimal/001_subagent_opinions.md
  • devlog/_plan/260904_dashboard_minimal/assets/codex-set_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/codex-set_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/dashboard_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/dashboard_models_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/dashboard_models_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/dashboard_providers_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/dashboard_providers_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/dashboard_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/integrations_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/integrations_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/logs_debug_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/logs_debug_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/logs_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/logs_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/models_combos_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/models_combos_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/models_compatibility_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/models_compatibility_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/models_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/models_routing_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/models_routing_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/models_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/providers_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/providers_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/startup_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/startup_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/storage_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/storage_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/subagents_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/subagents_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/usage_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/usage_text.txt
  • devlog/_plan/260907_router_selection_capture/010_implementation.md
  • gui/src/pages/Models.tsx
  • scripts/test-layout/layout.json
  • src/providers/api-key-selection-capture.ts
  • src/providers/api-key-selection.ts
  • src/router.ts
  • structure/01_runtime.md
  • tests/cli/cli-status-json.test.ts
  • tests/fixtures/test-layout-expected.json
  • tests/gui/models-feedback-callback.test.ts
  • tests/providers/api-key-selection-capture.test.ts
💤 Files with no reviewable changes (32)
  • devlog/_plan/260904_dashboard_minimal/assets/usage_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/integrations_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/codex-set_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/models_combos_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/startup_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/models_compatibility_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/usage_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/logs_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/storage_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/dashboard_models_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/logs_debug_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/providers_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/dashboard_providers_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/codex-set_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/models_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/logs_debug_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/dashboard_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/dashboard_models_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/dashboard_providers_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/logs_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/dashboard_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/models_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/subagents_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/startup_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/models_combos_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/integrations_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/providers_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/models_routing_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/storage_text.txt
  • devlog/_plan/260904_dashboard_minimal/assets/models_compatibility_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/models_routing_interactive.txt
  • devlog/_plan/260904_dashboard_minimal/assets/subagents_text.txt

Included review availability: Your plan provides up to 10 included reviews per hour; 7 remain after this review.


📝 Walkthrough

Walkthrough

The change removes dashboard evidence assets, extracts API-key selection capture from the stateful provider module, stabilizes a GUI feedback callback, and updates CLI status tests to allocate isolated ephemeral ports.

Changes

Dashboard evidence cleanup

Layer / File(s) Summary
Inventory and asset removal
devlog/_plan/260904_dashboard_minimal/...
The inventory now records removed captures and no longer includes screenshot data. Temporary dashboard text and interaction assets were deleted.

Router selection capture extraction

Layer / File(s) Summary
Capture module and router wiring
src/providers/api-key-selection-capture.ts, src/providers/api-key-selection.ts, src/router.ts, structure/01_runtime.md, devlog/_plan/260907_router_selection_capture/010_implementation.md
captureProviderApiKeySelection now resides in a dependency-neutral module. The legacy export remains available, and the router imports the new module.
Capture boundary validation
tests/providers/api-key-selection-capture.test.ts, scripts/test-layout/layout.json, tests/fixtures/test-layout-expected.json
Tests cover snapshot behavior, compatibility exports, and runtime dependency boundaries. Test layout mappings include the new provider test.

GUI feedback callback stability

Layer / File(s) Summary
Feedback callback memoization
gui/src/pages/Models.tsx, tests/gui/models-feedback-callback.test.ts
publishFeedback is memoized with useCallback. saveDisplayName includes it in its dependency list. The test checks both source patterns.

CLI test port isolation

Layer / File(s) Summary
Fresh port allocation
tests/cli/cli-status-json.test.ts
CLI status tests allocate a fresh port before each test. The fallback test records a separate port after binding the occupied listener.

Priority: ⬇️ Low

Estimated code review effort: 3 (Moderate) | ~25 minutes

Merge Risk: ⚪ Minimal · up to c60a3

The change removes historical dashboard captures, makes CLI status tests use isolated ports, stabilizes feedback callbacks, and extracts API-key snapshot capture without changing its public export or selection behavior. No current merge-blocking risk remains.

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Out of Scope Changes check ⚠️ Warning The PR includes substantial changes unrelated to linked issue #3894: stale-port test changes in tests/cli/cli-status-json.test.ts, dashboard asset removals under `devlog/_plan/260904_dashboard_minim… Split the stale-port, dashboard-asset, and feedback-callback changes into separate pull requests with their relevant issue links, or link the corresponding issues to this PR. Keep this PR limited to the API-key selection extraction, compati…
Docstring Coverage ⚠️ Warning Docstring coverage is 25.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 4 functions across 7 files. (6 skipped: 6… Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check name Status Explanation
Linked Issues check ✅ Passed The changes satisfy issue #3894. src/providers/api-key-selection-capture.ts contains the dependency-neutral capture helper, src/router.ts imports it directly, and `src/providers/api-key-selection.…
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the pull request as a bundle of four contributor changes plus the missing feedback-callback regression test. It is concise and relevant to the stated objectives.
Full details: Out of Scope Changes check

Explanation

The PR includes substantial changes unrelated to linked issue #3894: stale-port test changes in tests/cli/cli-status-json.test.ts, dashboard asset removals under devlog/_plan/260904_dashboard_minimal/assets/, and the publishFeedback callback change plus tests/gui/models-feedback-callback.test.ts. These changes are described in the PR objectives, but no linked issues cover them.

Resolution

Split the stale-port, dashboard-asset, and feedback-callback changes into separate pull requests with their relevant issue links, or link the corresponding issues to this PR. Keep this PR limited to the API-key selection extraction, compatibility export, router import update, related documentation, and focused provider tests.

Full details: Docstring Coverage

Explanation

Docstring coverage is 25.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 4 functions across 7 files. (6 skipped: 6 unsupported.)

  • Fix all pre-merge checks with AI
✨ Finishing Touches 💡 2
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🛠️ Fix failing CI checks 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/260909-wp3-small-prs

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@lidge-jun

Copy link
Copy Markdown
Owner Author

리뷰 · 우선순위 70 / 80

이 PR은 지금 dev(HEAD 9587750ce, package 2.49.0, 직전 팁 #4051 wp2 일곱 버그픽스) 위에 이어 올리는 세 번째 메인테이너 랜딩 열차(wp3) 입니다. 기여자 세 명(#3980/#3984 @yansigit, #3897 @parkjs101, #3963 @luvs01)의 작은 변경 네 조각에, #3984가 빠뜨린 회귀 테스트를 메인테이너가 한 커밋으로 붙였습니다. 각각 squash + Co-authored-by로 순서대로 실렸고, 스폰서 쌍 #3914/#3915는 의도적으로 빼 두었습니다. 닫는 이슈는 #3894(라우터 ↔ API-key-selection 직접 import 순환)입니다. 지금 dev가 2.49.x 백로그를 닫는 중이라, 동작이 크게 바뀌는 버그픽스 열차(#4051)보다는 가볍지만 CI 안정·순환 제거·문서 자산 정리·React deps 정직화를 한 줄로 묶은 다음 칸이라 점수 70입니다. src/types.ts/config 분할 캠페인 파일은 건드리지 않아서 close-don't-rebase 대상이 아닙니다.

네 조각(+테스트)이 지금 체크아웃 경로에서 하는 일을 풀어서 쓰면 이렇습니다. 첫째는 tests/cli/cli-status-json.test.ts의 stale-port 픽스처입니다. 예전엔 beforeAll에서 ephemeral 포트를 미리 잡았다가 닫았고, 그 숫자를 “죽은 기록 포트”로 썼습니다. 그런데 그 포트는 이미 풀로 돌아간 뒤라, 나중에 테스트가 띄운 occupied 리스너가 같은 번호를 다시 잡을 수 있습니다. 그러면 “기록 포트는 거절되어야 한다”는 가정이 뒤집혀 간헐적으로 실패합니다. 이제는 allocateFreePort()beforeEach와 occupied bind 이후에 다시 호출해서, 기록 포트가 occupied와 다르다는 걸 그 자리에서 증명합니다. 제품 코드는 안 바뀌고 테스트만 고칩니다. 둘째는 #3894 순환입니다. src/router.ts./providers/api-key-selection을 가져오고, 그 모듈은 다시 routedProviderConfig를 위해 ../router를 가져갔습니다. 순수 스냅샷 함수 captureProviderApiKeySelection만 새 파일 src/providers/api-key-selection-capture.ts로 빼서 라우터는 그 리프만 보고, api-key-selection.ts는 호환 re-export를 남깁니다. 동작 변화 없이 import 경계만 자릅니다. structure/01_runtime.md에 한 줄 표가 추가됐고, tests/providers/api-key-selection-capture.test.ts가 스냅샷 의미·호환 export·Bun.Transpiler로 런타임 import 경계를 고정합니다. 셋째는 #3963: devlog/_plan/260904_dashboard_minimal/assets/ 아래 역사적 대시보드 캡처 팩(png/txt 약 60개)을 지우고, 000_inventory.md/001_subagent_opinions.md만 “캡처는 트리에서 제거됐고 결론 표는 남긴다”고 고칩니다. 넷째는 gui/src/pages/Models.tsxpublishFeedback입니다. 지금 dev에서는 일반 함수라 렌더마다 새 정체성이고, saveDisplayName의 deps에서 빠져 있습니다(라인 305·698 근처). PR은 useCallback(..., [])로 고정하고 deps에 publishFeedback을 넣습니다. setter만 쓰므로 빈 deps는 맞고, 의존성 배열도 정직해집니다. 마지막으로 메인테이너 커밋 tests/gui/models-feedback-callback.test.ts가 소스 오라클로 두 절반을 고정하고, scripts/test-layout/layout.jsontests/fixtures/test-layout-expected.jsonmodels-feedback-callback.test.ts/api-key-selection-capture.test.ts를 등록합니다. PR 본문대로 Models.tsx만 dev로 되돌리면 0 pass/2 fail이라 빈 테스트가 아닙니다.

검증 쪽은 본문 기준 bun x tsc --noEmit 통과, 변경 테스트 파일들 합쳐 56 pass, 레이아웃+피드백 테스트 19 pass, privacy/skill surface 통과입니다. 이 리뷰 시점에서 hygiene·react-doctor·changes 등은 pass인데 enforce-targetmissing UI screenshot으로 fail입니다. 브랜치에는 assets/pr-screenshots/model-feedback-review.png가 있지만 PR 본문에는 이미지가 없어서 게이트가 본문 스크린샷을 못 찾고, bot이 DRAFT 코멘트(UI screenshot required)를 남긴 상태입니다. 나머지 test/macos/docker/gates·CodeRabbit은 아직 pending입니다.

라인 711-798 / allocateFreePort - tests/cli/cli-status-json.test.ts: occupied bind 뒤에 기록 포트를 다시 잡는 순서가 핵심입니다. expect(recordedPort).not.toBe(occupiedPort)로 가정을 문서화한 점도 좋습니다. 다른 stale-port 케이스도 beforeEach의 freePort를 쓰므로, 포트 고갈이 심한 CI에서만 드물게 재시도가 필요할 수 있지만 지금 구조면 충분합니다.
경로 / capture 리프 - src/providers/api-key-selection-capture.ts + src/router.ts: 타입-only import만 있는 순수 리프라 순환이 끊깁니다. api-key-selection.ts가 로컬용 import와 export { ... } from re-export를 둘 다 두는 건 약간 장황하지만 동작상 문제 없고, 테스트가 legacyCapture === capture로 동일 참조를 고정합니다.
경로 / 캡처 팩 삭제 - devlog/_plan/260904_dashboard_minimal/assets/*: 트리에서 참조가 끊긴 자산 정리라 방향은 맞습니다. 플랜 md에 예전 파일명이 서술로 남는 건 의도된 이력 보존입니다. 삭제가 대부분이라 diff 줄 수는 크지만 런타임 위험은 없습니다.
라인 305-309 / 698 - gui/src/pages/Models.tsx: useCallback + deps 추가는 맞고, saveDisplayName만 고칩니다. 같은 파일의 다른 핸들러(alias/context/custom 등)는 여전히 매 렌더 새 함수를 쓰지만, 이번 범위는 “callback 안에서 쓰이면서 deps에서 빠진” 구멍만 막는 것이라 범위는 타당합니다.
경로 / 소스 오라클 - tests/gui/models-feedback-callback.test.ts: 문자열 슬라이스 검사는 포맷이 조금만 바뀌어도 깨집니다. 그게 목적이고, hygiene의 missing_regression_test를 막기 위한 핀이라 허용할 만합니다. 다만 선언부 주석/// 위치가 바뀌면 indexOf("\n //")가 어긋날 수 있으니, 나중에 Models 피드백 블록을 크게 손볼 때 이 테스트를 같이 보면 됩니다.
원본 PR 4개(#3980 #3897 #3963 #3984)와 이슈 #3894 - 전부 아직 OPEN입니다. 이 랜딩이 merge되면 원본에 Landed via #4053 at <commit> + landed-via-maintainer 후 close, #3894도 close 해야 열린 PR 수가 다시 부풀지 않습니다(#4051 때와 같은 하이진).
경로 / PR 게이트 - 본문에 스크린샷 마크다운이 없습니다. 파일만 커밋된 상태라 enforce-target이 fail/DRAFT로 막습니다. merge 전에 본문에 assets/pr-screenshots/model-feedback-review.png를 넣거나, 메인테이너가 gui-screenshot-waived를 붙여야 합니다.

메인테이너의 판단이 필요한 지점

  • Models.tsx 콜백 안정화가 “눈에 보이는 UI”인지: 본문에 스크린샷을 넣을지, 아니면 gui-screenshot-waived로 게이트만 열지
  • pending test/macos/docker/gates·CodeRabbit을 전부 green까지 기다릴지, hygiene+변경 테스트+스크린샷 게이트만 맞추고 merge할지
  • 원본 네 개 + #3894를 merge 직후 즉시 하이진 close할지(권장)
  • 스폰서 쌍 feat(sponsors): OrcaRouter placement, overview introduction and links #3914/#3915를 다음 wp로 미루는 타이밍을 그대로 둘지

너의 추천
PR 본문에 model-feedback-review.png를 넣고(또는 waived 라벨) enforce-target을 통과시킨 뒤, 남은 CI가 green이면 이 PR을 dev에 merge하세요. merge 직후 원본 #3980/#3897/#3963/#3984와 이슈 #3894에 Landed via #4053 at <merge-commit> 댓글(+PR에는 landed-via-maintainer)을 남기고 닫으세요. types/config 분할과 무관하고 #4051 다음 wp3라 충돌면이 작습니다.

이 댓글은 grok-bot이 작성했습니다

@github-actions
github-actions Bot marked this pull request as ready for review September 8, 2026 18:34
#3984 added its review screenshot under a new assets/pr-screenshots/ directory.
The repository's nineteen existing PR screenshots all live in
docs-site/public/pr-screenshots/, so this moves it there and keeps the new
top-level directory out of the tree.

Co-authored-by: yansigit <44089734+yansigit@users.noreply.github.com>
@lidge-jun

Copy link
Copy Markdown
Owner Author

Re-running the target gate: the two Enforce PR target branch runs at this head were both cancelled by superseding pushes, so the check has no verdict.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant