Skip to content

feat(gui): add guarded routed model picker drag ordering - #3887

Merged
lidge-jun merged 3 commits into
devfrom
codex/260907-e-picker-order
Sep 7, 2026
Merged

feat(gui): add guarded routed model picker drag ordering#3887
lidge-jun merged 3 commits into
devfrom
codex/260907-e-picker-order

Conversation

@lidge-jun

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

Copy link
Copy Markdown
Owner

Summary

  • Add Custom routed ordering to the Models page, with drag handles and model-specific keyboard controls. Featured routed rows retain their effective rank; existing complete orders containing native IDs remain protected until an explicit preset/reset is accepted.
  • Bind editing and saving to fresh settings and model identity snapshots. Keep drafts on request failure or concurrent changes, preserve accepted saves when catalog convergence is pending, and avoid republishing stale roster metadata. LAN HTTP dragging is supported.
  • Include helper, component and page regression cases, nine locale strings, and the routed-order guide. This is the requested routed slice of [Feature] Allow visual drag-and-drop reordering for modelPickerOrder in Web GUI #3774; native/featured full-picker repositioning remains open.

Verification

  • Current head 3fb08ec9d5cb2bbee33995fc8f1d21f80f2c6707, based on dev@74089fdc3539677f5086ba05d7aea92a8c16e60d.
  • Central Cross-platform CI: run 34124333662, lane=all, all 16 required per-chain jobs SUCCESS at this exact head. Prior run 34123021525 failed GUI lint and was cancelled; it is not passing evidence.
  • Independent Astra reviews: original candidate Harvey PASS, blockers 0; focused lifecycle repair Ohm PASS, blocking_issues: []. The repair moves state reconciliation out of synchronous effects, keeps cancellation/ownership guards, and adds pre-start unmount coverage. No lint rule or existing assertion was weakened. Source reviews are not runtime evidence.
  • Follow-up GUI test fixture repair: run 34123695607 passed lint but failed three existing status fixtures after post-save revalidation. Distinct old/new GET records and per-origin PUT→GET state now mirror server behavior; cache assertions run before and after fresh revalidation. Production guards and all original assertions remain. Independent Ohm source review: PASS, blockers 0.
  • Local suite, typecheck, build, install and privacy scan: NOT RUN by instruction. Source diff checks passed.
  • Actual page render verified from artifact dashboard-preview-3fb08ec9d5cb2bbee33995fc8f1d21f80f2c6707. Both build-commit.txt and GUI tree 832ddd9acb48dc79c7275f38f8506ae53f027188 match the current source. Browser checks used local fixture APIs only: real drag, keyboard movement, save/reload, failed-save draft retention, native-order lock, and 390px Korean layout without horizontal overflow. No local build/install/suite was run.

Actual Models page after drag and keyboard reorder, desktop 1440x913

Korean mobile view (390x844)

Actual Models page, Korean mobile

- Required per-chain checks: Linux 4 shards, macOS 2 shards, gates/storage/api/keyring/npm/docker. Windows 6 shards and macOS control are excluded under the explicit owner policy and handled at final train verification. - D's pricing.override and usage.range keys were preserved in all nine locales when resolving append conflicts; E adds its 15 picker keys per locale. Existing price-editor page integration remains in place.

Manual chain (stack: null):

Layer Branch Base Scope
1 (standalone) codex/260907-e-picker-order dev Routed drag ordering for #3774

All commits use [skip ci]. Final required-head checks, policy gates and the actual screenshot are required before LANDABLE. Do not close #3774 for this slice.

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 (no backend authorization, credential or transport change).

Co-authored-by: leonclab 26379556+leonclab@users.noreply.github.com


Maintainer integration decision (MAINTAINERS.md, dev-only admin integration): @lidge-jun integrates #3887 (#3774 slice, carry with Co-authored-by: leonclab) into dev. Exact-head evidence at 3fb08ec9d: Cross-platform CI run 34124333662 — Linux test 1/4–4/4, macOS 1/2, 2/2, gates (GUI tests/lint/typecheck/build), storage policy, api usage, keyring ×3, npm-global ×3, docker smoke = success; Windows/macos control deferred to the final train head. Prospective merge tree of origin/dev@74089fdc3 + head = 139cade3f = tested tree. Screenshots from this run's dashboard-preview artifact. Independent source review PASS. Local suites NOT RUN. Maintainer integration, not self-approval.

@coderabbitai

coderabbitai Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Important

Draft PR not reviewed

Draft PRs are not automatically reviewed by default.

  • Trigger a manual review

To automatically review draft PRs, update your CodeRabbit configuration:

reviews:
  auto_review:
    drafts: true

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.

@github-actions github-actions Bot added the enhancement New feature or request label Sep 7, 2026
@github-actions

github-actions Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Deterministic PR hygiene checks passed.

@github-actions

github-actions Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

✅ READY

  • all PR quality gates passed.

Hygiene

Deterministic PR hygiene checks passed.

@lidge-jun
lidge-jun force-pushed the codex/260907-e-picker-order branch from af7b8af to e6ddd95 Compare September 7, 2026 11:04
@lidge-jun

Copy link
Copy Markdown
Owner Author

리뷰 · 우선순위 52 / 80

이 PR은 Web GUI Models 페이지에 라우티드(커스텀) 모델 순서 드래그를 넣습니다. 이슈 #3774의 “라우티드 슬라이스”입니다. 지금 dev에는 gui/src/model-picker-order.ts와 Models 페이지 프리셋(alphabetical/provider/most-used)은 있지만, ModelPickerOrderEditor.tsx 같은 드래그 편집기는 아직 없습니다. Featured 라우티드 행 순위는 유지하고, 네이티브 ID가 들어 있는 기존 complete order는 사용자가 preset/reset을 받기 전까지 보호합니다. 설정·모델 identity 스냅샷에 묶어 저장 실패/동시 변경 시 드래프트를 남기고, 카탈로그 수렴 중에는 stale roster를 다시 뿌리지 않습니다. 9개 로케일 문자열과 guides/model-ordering.md도 포함합니다.

주의: 이 슬라이스만으로는 #3774를 닫으면 안 됩니다. 본문도 native/featured 풀 피커 재배치는 열어 둔다고 명시합니다. 베이스는 76436a3ee라 현재 tip 522ce5f8c(#3882/#3888)보다 뒤입니다. 스크린샷은 CI dashboard-preview 아티팩트를 기다리겠다고 했고, 로컬 스위트는 NOT RUN입니다.

gui/src/components/ModelPickerOrderEditor.tsx (신규) - dev에 없는 새 컴포넌트입니다. 키보드 컨트롤·드래그 핸들이 라우티드 행에만 걸리는지, featured 고정 행을 키보드로 밀어내지 않는지 머지 전 실제 프리뷰로 확인이 필요합니다.

gui/src/model-picker-order.ts / Models.tsx - 저장 계약이 기존 pickerOrder/pickerOrderMode와 맞는지, complete native order 보호가 “명시적 preset/reset” 없이는 깨지지 않는지가 핵심입니다. 동시 편집 시 드래프트 보존은 좋지만, 수락된 저장 직후 카탈로그가 바뀌면 UI에 옛 순위가 남는 느낌이 날 수 있습니다.

gui/tests/* - 테스트는 많이 있으나 실행 주장이 없습니다. 중앙 CI 슬롯을 기다리는 draft 상태와 맞습니다.

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

  • 스크린샷·필수 CI 없이 draft로 둘지, preview 아티팩트가 나온 뒤에만 LANDABLE로 올릴지
  • #3774를 이 PR에 부분 연결만 하고 이슈는 열어둘지(본문 권고와 동의)

너의 추천
#3774는 닫지 말고, tip 522ce5f8c에 리베이스한 뒤 CI·실제 Models 페이지 스크린샷이 나오면 머지하세요. 라우티드 슬라이스 범위는 명확하고 types/config 분할과도 무관합니다.

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

@lidge-jun
lidge-jun force-pushed the codex/260907-e-picker-order branch 2 times, most recently from 7b6ecb3 to 94df96b Compare September 7, 2026 12:32
Add Custom routed ordering with fixed featured rows, keyboard controls,
fresh settings snapshots and accepted-receipt recovery. Preserve native
complete orders until an explicit preset/reset is accepted. Include source
regressions and all nine locale strings; runtime checks await central CI.

Implements the routed slice requested in #3774; native/featured full-picker
placement remains open.

Co-authored-by: leonclab <26379556+leonclab@users.noreply.github.com>
@lidge-jun
lidge-jun force-pushed the codex/260907-e-picker-order branch from 94df96b to 8ecf91f Compare September 7, 2026 12:39
t and others added 2 commits September 7, 2026 21:46
…p ci]

Keep cancellation and stale-response fencing while separating render state
reconciliation from automatic transport startup. Preserve immediate user
actions and cover unmount before automatic request issuance.

Co-authored-by: leonclab <26379556+leonclab@users.noreply.github.com>
Keep stale and fresh GET resolvers distinct, assert cache integrity before
revalidation, and persist successful mock PUT state separately per origin.
Existing banner, deadline, duplicate-write and saved-order assertions stay.

Co-authored-by: leonclab <26379556+leonclab@users.noreply.github.com>
@lidge-jun
lidge-jun marked this pull request as ready for review September 7, 2026 13:07
@lidge-jun
lidge-jun requested a review from Ingwannu as a code owner September 7, 2026 13:07
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 7, 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-07T13:12:24.336467Z 3fb08ec 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.

@lidge-jun
lidge-jun merged commit 1e188b7 into dev Sep 7, 2026
29 of 41 checks passed
@lidge-jun
lidge-jun deleted the codex/260907-e-picker-order branch September 7, 2026 13:08
lidge-jun pushed a commit that referenced this pull request Sep 7, 2026
lidge-jun pushed a commit that referenced this pull request Sep 7, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant