merge: integrate orchestration branch

This commit is contained in:
2026-06-15 19:48:59 +09:00
20 changed files with 1769 additions and 63 deletions
@@ -0,0 +1 @@
{"id":"orch-plan-20260615-063825-1","ticket_id":"00001KV4YAAVY","kind":"accepted_plan","accepted_plan":{"summary":"Accept single-Pod View text selection/copy work. Implement mouse drag selection, highlight, Esc clear, y copy+clear, deterministic multi-item extraction, and focused tests without changing Panel row selection semantics.","branch":"impl/00001KV4YAAVY-single-pod-text-selection","worktree":"/home/hare/Projects/yoi/.worktree/00001KV4YAAVY-single-pod-text-selection","role_plan":"Orchestrator creates dedicated implementation worktree and spawns Coder with write scope limited to that worktree. Reviewer will run read-only after implementation report. This single-Pod View work is source/logically disjoint from Panel composer work enough for parallel start."},"author":"yoi-orchestrator","at":"2026-06-15T06:38:25Z"}
+2 -2
View File
@@ -1,8 +1,8 @@
---
title: 'single-Pod View Item text をマウスドラッグで選択・コピーできるようにする'
state: 'queued'
state: 'done'
created_at: '2026-06-15T06:08:19Z'
updated_at: '2026-06-15T06:37:00Z'
updated_at: '2026-06-15T07:15:54Z'
assignee: null
readiness: 'implementation_ready'
risk_flags: ['tui', 'mouse-input', 'selection', 'clipboard', 'single-pod-view']
+250
View File
@@ -13,4 +13,254 @@ LocalTicketBackend によって作成されました。
Ticket を `workspace-panel` が queued にしました。
---
<!-- event: decision author: yoi-orchestrator at: 2026-06-15T06:38:25Z -->
## Decision
Routing decision: implementation_ready
Reason:
- Panel Queue により routing が明示的に許可され、Ticket は `queued`
- Ticket body / thread / relation / OrchestrationPlan / Orchestrator workspace state を確認した。blocking relation はなく、planning に戻す concrete missing information はない。
- 対象は single-Pod conversation View の text-like Item selection/copy に限定され、Panel row selection とは scope が分かれている。
- Tool/non-text Item と copy target は implementation-time decision として許容されており、binding invariants / acceptance criteria / escalation conditions が明確。
Evidence checked:
- Ticket body/thread: requirements、copy target、tool/non-text handling、acceptance criteria、non-goals、related work を確認。
- Ticket relations: `00001KV072V89``00001KV10SN02` は related のみで blocker ではない。
- OrchestrationPlan: 既存 record なし。
- Orchestrator workspace: `/home/hare/Projects/yoi/.worktree/orchestration` は clean、`f0de8413` 上。
- Visible Pods: implementation child Pod なし。Intake peer は routing blocker ではない。
- Bounded code map: `crates/tui/src/single_pod.rs`、copy/clipboard abstraction、mouse/selection/key handling tests。
IntentPacket:
Intent:
- single-Pod TUI conversation View で User/System/Assistant など text-like Item の表示テキストを mouse drag で選択し、`y` で copy、`Esc` で clear できるようにする。
Binding decisions / invariants:
- 対象は single-Pod View Item text。Panel Ticket/Pod row selection は変更しない。
- terminal-native text selection preservation は non-goal。View drag は Yoi text selection として扱う。
- selected/copy text、selection state、clipboard diagnostics は Pod history / model context / session log / Ticket records に残さない。
- composer input、scroll、rewind picker、modal/popup、normal key handling と衝突させない。
- bare Panel row mouse selection semantics は regress させない。
- Tool/non-text Item handling と copy target は実装報告または decision comment に明示する。
Requirements / acceptance criteria:
- UserItem / SystemItem / AssistantItem text を drag selection できる。
- drag start/update/release 後に selection state が残り、View 上で highlight される。
- `Esc` で selection clear。
- `y` で selected text を copy し、selection clear。
- text-like Item を跨いだ selection が deterministic separator で copy される。
- non-text/tool item handling decision が明示され、test で固定される。
- copy 成功/失敗が user-visible で、secret-like diagnostics を出さない。
- tests cover coordinate mapping、selection state、multi-item extraction、Esc、copy+clear、non-text/tool handling。
Implementation latitude:
- Existing clipboard abstraction があれば利用。なければ testable な最小 copy path を追加してよい。
- OSC52/system clipboard/internal copy buffer の選択は既存 TUI architecture に合わせる。
- rendering/highlight 表現、selection model の internal shape、separator は実装側判断。ただし deterministic にする。
Escalate if:
- terminal/crossterm event stream で必要な drag/release を識別できない。
- existing rendering model から text coordinate mapping を安全に取れない。
- copy target を追加すると secrets/history/model-context boundary に影響する。
- rewind/modal/composer key handling と共存できない大きな model change が必要。
Validation:
- focused `cargo test -p tui ...` for single_pod selection/copy。
- `cargo check -p tui --all-targets`
- `cargo fmt --check`
- `git diff --check`
- Panel row mouse selection regression test if related mouse plumbing is touched。
Critical risks / reviewer focus:
- selection/copy state の persistence leakage。
- mouse coordinate -> rendered text mapping correctness。
- multi-item extraction ordering/separator。
- composer/scroll/rewind/modal conflict。
- clipboard path safety and testability。
- Panel mouse behavior regression absence。
---
<!-- event: state_changed author: yoi-orchestrator at: 2026-06-15T06:39:16Z from: queued to: inprogress reason: orchestrator_acceptance field: state -->
## State changed
Routing decision と accepted implementation plan を記録済み。blocking relation / unresolved OrchestrationPlan blocker はなく、single-Pod View work は同時に開始する Panel composer work と主対象が異なるため、implementation side effects の前に `queued -> inprogress` acceptance を記録する。
---
<!-- event: implementation_report author: yoi-coder-00001KV4YAAVY at: 2026-06-15T07:02:42Z -->
## Implementation report
Implementation report from Coder Pod `yoi-coder-00001KV4YAAVY`:
Commit:
- `09f5e9d5 feat: add single-pod text selection`
Changed files:
- `crates/tui/src/text_selection.rs`
- New transient selection state, coordinate mapping, extraction, and focused tests.
- `crates/tui/src/app.rs`
- Local non-persistent selection state on `App`.
- `crates/tui/src/ui.rs`
- Selectable history row metadata, highlight rendering, snapshot wiring, selectable/non-text tests.
- `crates/tui/src/single_pod.rs`
- Drag mouse handling, `Esc` clear, `y` copy+clear, OSC52 copy, tests.
- `crates/tui/src/lib.rs`
- Module registration.
- `crates/tui/Cargo.toml`, `Cargo.lock`
- Added direct `base64` dependency for OSC52 clipboard payloads.
Behavior / implementation decisions:
- Selectable Items:
- `UserMessage`
- `SystemMessage`
- `AssistantText`
- Non-text/tool Items:
- tool calls, thinking, stats, greetings, alerts, turn headers, etc. are not selectable/copyable through this path.
- extraction skips non-selectable rows.
- Cross-item selection separator:
- copied text follows rendered row order and preserves selectable blank spacer rows, giving deterministic `\n\n` between adjacent text-like Items.
- Copy target:
- terminal clipboard via OSC52 (`ESC ] 52 ; c ; base64 BEL`), not OS clipboard APIs.
- avoids adding platform clipboard runtime behavior.
- Copy diagnostics:
- actionbar-only sanitized messages:
- success: `copied selected text to terminal clipboard`
- failure: `terminal clipboard write failed`
- no selected content appears in diagnostics.
- Selection persistence:
- selection state/copied text remains TUI-local only.
- not appended to Pod history, model context, session logs, Ticket records, memory, or durable state.
- Mouse tracking:
- single-Pod TUI now enables button-event drag tracking (`?1002h`) but not all-motion tracking (`?1003h`).
- Panel code was not changed.
Validation reported by coder:
- Passed: `cargo fmt --check`
- Passed: `cargo check -p tui --all-targets`
- Passed: `cargo test -p tui text_selection`
- Passed: `cargo test -p tui single_pod::tests`
- Passed: `cargo test -p tui ui::tests::history_rows_mark_text_items_selectable_and_non_text_unselectable`
- Passed: `git diff --check`
Repository status:
- Child implementation worktree clean after commit.
Residual risks / notes:
- OSC52 clipboard success means sequence written/flushed; actual clipboard acceptance depends on terminal/multiplexer policy.
- No real PTY/E2E validation was run; coverage is focused unit-level mouse/key/selection/render extraction behavior.
---
<!-- event: review author: yoi-reviewer-00001KV4YAAVY at: 2026-06-15T07:11:34Z status: approve -->
## Review: approve
Review result: approve
Evidence checked:
- Reviewed child worktree only:
- `/home/hare/Projects/yoi/.worktree/00001KV4YAAVY-single-pod-text-selection`
- diff `368249d6..09f5e9d5`
- Ticket record/thread in the child worktree
- Read-only validation:
- Passed: `git diff --check 368249d6..09f5e9d5`
Implementation review:
- TUI-local selection state was added in `crates/tui/src/text_selection.rs` and wired into single-Pod rendering/input.
- Mouse drag maps terminal coordinates through `HistoryViewport` into rendered history rows.
- Drag start/update/release are handled in `single_pod.rs`; selection remains active after release.
- `Esc` clears selection before normal composer handling.
- bare `y` copies only when a selection exists; otherwise composer input remains available.
- Highlighting is applied through `range_for_row` and `highlight_line_selection`.
- Selectable item boundary is explicit:
- selectable: `UserMessage`, `SystemMessage`, `AssistantText`
- non-selectable: tool calls, thinking, notices, stats, greetings, etc.
- Tool/non-text rows are marked unselectable and extraction skips unselectable rows.
- Cross-item extraction is deterministic, with documented newline/blank-line behavior.
- Copy uses OSC52; selected text is base64 encoded before writing the OSC52 sequence.
- Copy diagnostics are generic/actionbar-local and do not include selected content.
- Selection state lives in TUI-local `App.text_selection`; no path was found that appends selected/copied text to Pod history, model context, session log, Ticket records, memory, or durable state.
- Mouse capture changes are limited to single-Pod fullscreen setup and avoid all-motion `?1003h`; Panel/multi-pod mouse row selection code was not modified.
- Composer, scroll, rewind picker, completion/key routing, and normal key handling interactions were inspected and no blocker found.
Coverage reviewed:
- coordinate mapping
- drag update/release state
- multi-row / separator extraction
- non-selectable row skipping
- Esc clear
- copy helper + clear
- UI selectable/non-selectable marking
- mouse capture mode avoiding all-motion tracking
Non-blocking notes:
- No PTY/E2E validation was run; terminal-specific OSC52/mouse behavior still depends on real terminal behavior.
- OSC52 cannot acknowledge terminal clipboard acceptance; implementation can only report write/flush success/failure.
- There is no explicit byte-size cap on OSC52 payload, but selection is bounded by visible rendered viewport rather than arbitrary full history traversal. Future hard cap/error notice would be reasonable hardening.
- A full fixture test constructing an actual `Block::ToolCall` could strengthen coverage, but the non-text path is explicit and source-inspected.
Validation not rerun by reviewer:
- Cargo validation was not rerun because review scope was read-only and Cargo writes build artifacts. Coder-reported validation was inspected as evidence.
Conclusion:
- Approved. No blocker remains.
---
<!-- event: implementation_report author: yoi-orchestrator at: 2026-06-15T07:15:54Z -->
## Implementation report
Integration report:
Merged implementation branch into orchestration branch:
- branch: `impl/00001KV4YAAVY-single-pod-text-selection`
- implementation commit: `09f5e9d5 feat: add single-pod text selection`
- merge commit: `3fa52f2c merge: single-pod text selection`
Reviewer result:
- `approve` recorded from `yoi-reviewer-00001KV4YAAVY`.
Additional integration fix:
- Because the implementation added a direct `base64` dependency to `crates/tui/Cargo.toml` and updated `Cargo.lock`, `nix build .#yoi --no-link` first failed with stale `package.nix` `cargoHash`.
- Updated `package.nix` `cargoHash` to the new fixed-output vendor hash:
- `sha256-pIDYnbBs3U8Z3IndgH10rirv8/IdFv1WlgwpCbKXy+M=`
Validation in Orchestrator worktree `/home/hare/Projects/yoi/.worktree/orchestration`:
- Passed: `cargo fmt --check`
- Passed: `cargo check -p tui --all-targets`
- Passed: `cargo test -p tui text_selection`
- 4 passed
- Passed: `cargo test -p tui single_pod::tests`
- 38 passed
- Passed: `cargo test -p tui ui::tests::history_rows_mark_text_items_selectable_and_non_text_unselectable`
- 1 passed
- Passed: `git diff --check`
- Passed after hash update: `nix build .#yoi --no-link`
Notes:
- OSC52 clipboard acceptance remains terminal/multiplexer dependent; implementation reports write/flush success/failure only.
- No PTY/E2E validation was run for real terminal selection/copy behavior; focused unit coverage and reviewer inspection covered selection/copy state, extraction, and persistence boundaries.
- Orchestrator worktree is clean apart from the pending `package.nix`/Ticket integration commit at the time of recording.
Cleanup planned:
- Stop related coder/reviewer Pods.
- Remove only child implementation worktree/branch for this Ticket.
---
<!-- event: state_changed author: yoi-orchestrator at: 2026-06-15T07:15:54Z from: inprogress to: done reason: merged_validated field: state -->
## State changed
Reviewer approved, implementation branch merged into the orchestration branch, integration validation passed including Nix package hash refresh, and focused validation passed in the Orchestrator worktree. Marking Ticket done in the orchestration branch.
---
@@ -0,0 +1 @@
{"id":"orch-plan-20260615-063902-1","ticket_id":"00001KV4ZDMV1","kind":"accepted_plan","accepted_plan":{"summary":"Accept Panel Alt+Enter newline bugfix. Preserve bare Enter semantics and shared composer key handling while adding focused regression coverage.","branch":"impl/00001KV4ZDMV1-panel-alt-enter-newline","worktree":"/home/hare/Projects/yoi/.worktree/00001KV4ZDMV1-panel-alt-enter-newline","role_plan":"Orchestrator creates dedicated implementation worktree and spawns Coder with write scope limited to that worktree. Reviewer will run read-only after implementation report. Run in parallel with single-Pod selection work; defer Panel row hierarchy visual work to avoid overlapping Panel rendering edits."},"author":"yoi-orchestrator","at":"2026-06-15T06:39:02Z"}
+2 -2
View File
@@ -1,8 +1,8 @@
---
title: 'Panel composer で Alt+Enter 改行を SessionView と揃える'
state: 'queued'
state: 'done'
created_at: '2026-06-15T06:27:36Z'
updated_at: '2026-06-15T06:37:01Z'
updated_at: '2026-06-15T06:51:06Z'
assignee: null
readiness: 'implementation_ready'
risk_flags: ['tui-input', 'ux-consistency']
+194
View File
@@ -13,4 +13,198 @@ LocalTicketBackend によって作成されました。
Ticket を `workspace-panel` が queued にしました。
---
<!-- event: decision author: yoi-orchestrator at: 2026-06-15T06:39:02Z -->
## Decision
Routing decision: implementation_ready
Reason:
- Panel Queue により routing が明示的に許可され、Ticket は `queued`
- Ticket body / thread / relations / OrchestrationPlan / Orchestrator workspace state を確認した。blocking relation はなく、planning に戻す concrete missing information はない。
- 既存 shared composer key handling 方針があり、主な不確実性は Panel の Enter 分岐順序/修飾キー処理の local fix と regression coverage に閉じている。
- 同時 queued の `00001KV4YAAVY` は single-Pod View selection で主対象が異なるため並行開始可能。`00001KV4ZPAD3` は Panel row rendering surface と重なるため待機に回す。
Evidence checked:
- Ticket body/thread: Background、requirements、acceptance criteria、binding decisions、validation、related work を確認。
- Ticket relations: blocker なし。
- OrchestrationPlan: 既存 record なし。
- Orchestrator workspace: `/home/hare/Projects/yoi/.worktree/orchestration` は clean、`f0de8413` 上。
- Visible Pods: implementation child Pod なし。
- Bounded code map: `crates/tui/src/composer_keys.rs`, `crates/tui/src/multi_pod.rs`, relevant Panel composer tests。
IntentPacket:
Intent:
- Workspace Panel composer で `Alt+Enter` を SessionView / shared composer key handling と同じ改行挿入として扱い、submit/open/dispatch を起こさないようにする。
Binding decisions / invariants:
- `Alt+Enter` は composer editing key。Panel action key ではない。
- bare `Enter``Alt+Enter` の意味を明確に分離する。
- Panel composer は shared `composer_keys` 方針に従う。
- Panel row selection / Ticket action semantics、Companion / Ticket Intake target semantics は変更しない。
- bare letter shortcuts は復活させない。
Requirements / acceptance criteria:
- Panel composer に text がある状態で `Alt+Enter` が draft newline を挿入する。
- composer empty / row selected / Ticket action selected でも `Alt+Enter` は submit/open/dispatch しない。
- bare `Enter` の existing submit/open/dispatch behavior は維持される。
- SessionView 側の `Alt+Enter` newline behavior は壊さない。
- focused test で Panel `Alt+Enter` newline and no action を確認する。
Implementation latitude:
- `composer_edit_action(key)` を Enter action 分岐より前に適用するか、Enter 分岐で modifiers を除外するかは実装判断。
- Existing tests への追加または新規 focused regression test のどちらでもよい。
- UI hint update は必要なら最小限。
Escalate if:
- terminal/crossterm が対象環境で `Alt+Enter` を識別できない。
- edit-first 処理が completion / target switching / row action 前提と衝突する。
- SessionView 側にも同根の regression が見つかる。
Validation:
- `cargo test -p tui composer_keys`
- Panel focused tests / `cargo test -p tui multi_pod --lib` など変更箇所に応じた subset。
- `cargo fmt --check`
- `git diff --check`
Critical risks / reviewer focus:
- `Alt+Enter` が action dispatch に落ちないこと。
- bare `Enter` semantics の regression。
- shared composer key handling 方針から外れた ad-hoc 実装になっていないこと。
- Panel target / row selection action identity が変わらないこと。
---
<!-- event: state_changed author: yoi-orchestrator at: 2026-06-15T06:39:16Z from: queued to: inprogress reason: orchestrator_acceptance field: state -->
## State changed
Routing decision と accepted implementation plan を記録済み。blocking relation / unresolved OrchestrationPlan blocker はなく、Panel Alt+Enter bugfix は同時に開始する single-Pod View selection work と主対象が異なるため、implementation side effects の前に `queued -> inprogress` acceptance を記録する。Panel visual hierarchy work `00001KV4ZPAD3` は conflict/capacity 理由で queued のまま待機させる。
---
<!-- event: implementation_report author: yoi-coder-00001KV4ZDMV1 at: 2026-06-15T06:46:31Z -->
## Implementation report
Implementation report from Coder Pod `yoi-coder-00001KV4ZDMV1`:
Commit:
- `5c339177 fix: align panel alt-enter composer handling`
Changed files:
- `crates/tui/src/multi_pod.rs`
- Panel now resolves shared `composer_edit_action` modifier actions before Panel `Enter` actions.
- `Alt+Enter` is handled as `InsertNewline` and returns `MultiPodAction::None`, so it cannot open Pods, dispatch Ticket actions, launch Intake, or send Companion messages.
- Added focused Panel tests for:
- non-empty composer inserts newline without Companion send
- blank Pod row selection inserts newline without open
- blank Ticket action selection inserts newline without dispatch
- `crates/tui/src/composer_keys.rs`
- Added explicit shared-keymap coverage for `Alt+Enter -> InsertNewline`.
Validation reported by coder:
- Passed: `cargo test -p tui composer_keys`
- Passed: `cargo test -p tui multi_alt_enter --lib`
- Passed focused bare-Enter regression checks:
- `cargo test -p tui multi_empty_enter_uses_open_action --lib`
- `cargo test -p tui multi_non_empty_enter_reports_companion_unavailable --lib`
- `cargo test -p tui multi_ticket_intake_enter_builds_launch_request_not_direct_send --lib`
- Passed: `cargo fmt --check`
- Passed: `git diff --check`
Broader suite note:
- Attempted: `cargo test -p tui multi_pod --lib`
- Failed in existing unrelated test:
- `multi_pod::tests::orchestrator_launch_context_uses_orchestration_root_for_runtime_workspace`
- assertion mismatch: expected target/orchestration path vs `/repo/yoi`
- Coder assessed this as outside the Alt+Enter change path; focused Ticket tests pass.
Repository status:
- Child implementation worktree clean after commit.
---
<!-- event: review author: yoi-reviewer-00001KV4ZDMV1 at: 2026-06-15T06:50:25Z status: approve -->
## Review: approve
Review result: approve
Evidence checked:
- Implementation commit `5c339177` against base `368249d6` in child worktree.
- Diff limited to:
- `crates/tui/src/composer_keys.rs`
- `crates/tui/src/multi_pod.rs`
- Shared composer policy maps `Alt+Enter` to `ComposerEditAction::InsertNewline` through `composer_edit_action`.
- Panel `handle_key` consults `composer_edit_action(key)` before bare `Enter` routing and immediately applies modifier composer actions.
- This prevents `Alt+Enter` from falling through to open / dispatch / Intake launch / Companion send.
- Existing bare `Enter` routing remains structurally unchanged.
- Bare `Enter` remains excluded from shared composer editing.
- Focused Panel tests cover text composer, blank Pod row selection, and blank Ticket action selection.
- Existing bare-Enter regression tests remain present.
Validation performed by reviewer:
- Passed: `git diff --check 368249d6..5c339177`
- Passed: `cargo fmt --check`
- Worktree remained clean.
Validation not run by reviewer:
- Cargo tests were not rerun because review scope was read-only and tests write build artifacts. Coder-reported focused test results were reviewed as evidence.
Broader-suite failure assessment:
- The reported broader `cargo test -p tui multi_pod --lib` failure in an orchestration-root test appears unrelated based on diff scope. The implementation does not touch orchestration worktree/root logic.
Conclusion:
- Approved. No blocker remains.
---
<!-- event: implementation_report author: yoi-orchestrator at: 2026-06-15T06:51:06Z -->
## Implementation report
Integration report:
Merged implementation branch into orchestration branch:
- branch: `impl/00001KV4ZDMV1-panel-alt-enter-newline`
- implementation commit: `5c339177 fix: align panel alt-enter composer handling`
- merge commit: `0335cad9 merge: panel alt-enter newline`
Reviewer result:
- `approve` recorded from `yoi-reviewer-00001KV4ZDMV1`.
Validation in Orchestrator worktree `/home/hare/Projects/yoi/.worktree/orchestration`:
- Passed: `cargo test -p tui composer_keys`
- 4 passed
- Passed: `cargo test -p tui multi_alt_enter --lib`
- 3 passed
- Passed: `cargo test -p tui multi_empty_enter_uses_open_action --lib`
- 1 passed
- Passed: `cargo test -p tui multi_non_empty_enter_reports_companion_unavailable --lib`
- 1 passed
- Passed: `cargo test -p tui multi_ticket_intake_enter_builds_launch_request_not_direct_send --lib`
- 1 passed
- Passed: `cargo fmt --check`
- Passed: `git diff --check`
Notes:
- Broader `cargo test -p tui multi_pod --lib` was not used as a blocker because the known failure is an unrelated orchestration-root test outside the Alt+Enter change path.
- Orchestrator worktree is clean after validation.
Cleanup planned:
- Stop related coder/reviewer Pods.
- Remove only child implementation worktree/branch for this Ticket.
---
<!-- event: state_changed author: yoi-orchestrator at: 2026-06-15T06:51:06Z from: inprogress to: done reason: merged_validated field: state -->
## State changed
Reviewer approved, implementation branch merged into the orchestration branch, and focused validation passed in the Orchestrator worktree. Marking Ticket done in the orchestration branch.
---
@@ -0,0 +1,3 @@
{"id":"orch-plan-20260615-063902-1","ticket_id":"00001KV4ZPAD3","kind":"conflicts_with","related_ticket":"00001KV4ZDMV1","note":"Panel rendering/input surface (`crates/tui/src/multi_pod.rs` / Panel row selection/action display) が `00001KV4ZDMV1` と重なる可能性があるため、Alt+Enter Panel composer work の outcome 後に開始する。","author":"yoi-orchestrator","at":"2026-06-15T06:39:02Z"}
{"id":"orch-plan-20260615-063916-2","ticket_id":"00001KV4ZPAD3","kind":"waiting_capacity_note","note":"`00001KV4YAAVY` と `00001KV4ZDMV1` を並行開始する。`00001KV4ZPAD3` は implementation_ready だが、Panel rendering/input surface の conflict risk と review/integration capacity のため queued のまま待機する。","author":"yoi-orchestrator","at":"2026-06-15T06:39:16Z"}
{"id":"orch-plan-20260615-065209-3","ticket_id":"00001KV4ZPAD3","kind":"accepted_plan","accepted_plan":{"summary":"Accept Panel Ticket/Intake visual hierarchy improvement after Panel Alt+Enter integration. Improve primary/secondary row styling, child-row affordance, selection clarity, and bounded tests without changing lifecycle/registry/action semantics.","branch":"impl/00001KV4ZPAD3-panel-row-hierarchy","worktree":"/home/hare/Projects/yoi/.worktree/00001KV4ZPAD3-panel-row-hierarchy","role_plan":"Orchestrator creates dedicated implementation worktree and spawns Coder with write scope limited to that worktree. Reviewer will run read-only after implementation report. Prior conflict with `00001KV4ZDMV1` is resolved because Alt+Enter work is merged/validated/done."},"author":"yoi-orchestrator","at":"2026-06-15T06:52:09Z"}
+2 -2
View File
@@ -1,8 +1,8 @@
---
title: 'Panel Ticket / Intake Pod row の視覚階層を改善する'
state: 'queued'
state: 'done'
created_at: '2026-06-15T06:32:21Z'
updated_at: '2026-06-15T06:37:02Z'
updated_at: '2026-06-15T07:09:01Z'
assignee: null
readiness: 'implementation_ready'
risk_flags: ['panel-ux', 'tui-layout', 'accessibility', 'row-selection']
+250
View File
@@ -29,4 +29,254 @@ Intake で要件・受け入れ条件・binding decisions / invariants・impleme
Ticket を `workspace-panel` が queued にしました。
---
<!-- event: decision author: yoi-orchestrator at: 2026-06-15T06:39:02Z -->
## Decision
Routing decision: implementation_ready_but_waiting_conflict_capacity
Reason:
- Ticket body / thread / relations / OrchestrationPlan / Orchestrator workspace state を確認した。要件・受け入れ条件・invariants は実装可能な粒度で揃っており、planning に戻す concrete missing information はない。
- ただし同時に `00001KV4ZDMV1` を Panel composer key handling work として accept する。両者は `crates/tui/src/multi_pod.rs` / Panel rendering・input surface に触れる可能性があり、並行すると row rendering / selected row / action identity regression の確認が曖昧になる。
- `00001KV4YAAVY` は single-Pod View selection で並行開始するため、現時点では Panel visual hierarchy work を追加 spawn せず、先行 Panel composer work の outcome を待つ。
Evidence checked:
- Ticket body/thread: visual hierarchy/readability requirements、accessibility、row-selection invariants、validation を確認。
- Ticket relations: blocker なし。
- OrchestrationPlan: 既存 record なし。
- Orchestrator workspace: `/home/hare/Projects/yoi/.worktree/orchestration` は clean、`f0de8413` 上。
- Visible Pods: implementation child Pod なし。これから `00001KV4YAAVY``00001KV4ZDMV1` を acceptance 予定。
Next action:
- `00001KV4ZDMV1` の implementation/review/integration 後、Panel rendering surface を再確認し、unblocked なら `queued -> inprogress` acceptance へ進む。
- planning return ではなく queued のまま waiting とする。
---
<!-- event: decision author: yoi-orchestrator at: 2026-06-15T06:52:09Z -->
## Decision
Routing decision: implementation_ready
Reason:
- Prior waiting reason は `00001KV4ZDMV1` と Panel rendering/input surface が重なる conflict/capacity だった。
- `00001KV4ZDMV1` は reviewer approve、orchestration branch merge、focused validation、Ticket `done` まで完了したため、prior conflict は解消した。
- Ticket body / thread / relations / orchestration plan / current Orchestrator workspace を再確認した。blocking relation はなく、planning に戻す concrete missing information はない。
- 現在 active な `00001KV4YAAVY` は single-Pod View Item text selection/copy であり、Panel Ticket/Intake visual hierarchy と主対象が異なるため並行開始可能。
Evidence checked:
- Ticket body/thread: Ticket 2行 row、associated Intake Pod row、selection/group visibility、accessibility、bounded rendering、validation を確認。
- Ticket relations: blocker なし。
- OrchestrationPlan: prior `conflicts_with 00001KV4ZDMV1` と waiting_capacity_note を確認。`00001KV4ZDMV1` 完了により blocker は解消。
- Orchestrator workspace: `/home/hare/Projects/yoi/.worktree/orchestration` は clean、`1d21aae3` 上。
- Visible Pods: `yoi-coder-00001KV4YAAVY` running。source/logical surface は single-Pod View selection であり、本 Ticket と直接競合しない。
IntentPacket:
Intent:
- Workspace Panel の Ticket 2行 row と Ticket-associated Intake Pod row の visual hierarchy / readability を改善し、親子関係・primary/secondary 情報・選択対象が読み取りやすい表示にする。
Binding decisions / invariants:
- Ticket lifecycle state / relation gate semantics は変更しない。
- persisted `waiting` state や新しい Ticket schema は追加しない。
- local Pod assignment / Pod name / socket / claim state / runtime status を git-tracked Ticket metadata/frontmatter/thread に保存しない。
- automatic polling / automatic Intake spawn は追加しない。
- Ticket と Intake Pod の関係を 1:1 と仮定しない。
- selected arbitrary Pod direct-send UX を復活させない。
- 表示改善のために lifecycle action authority boundary を緩めない。
- 色だけに依存せず、indentation / marker / label 等で minimum relationship を示す。
Requirements / acceptance criteria:
- Ticket 2行 row で primary line と secondary line の強弱が確認できる。
- Ticket-associated Intake Pod row が隣接 Ticket の child/related row として認識できる。
- Intake Pod row が Ticket 本体や別 Ticket に見えない。
- selected Ticket row / selected Intake Pod row の見え方が明確で、操作対象が混同されない。
- `ready`, `planning`, `queued/inprogress`, `done/closed`, `ready+waiting` の Ticket row で readability が維持される。
- Intake Pod `live` / `restorable` / `stale` status が確認できる。
- pre-Ticket Intake Pod を特定 Ticket child row のように誤表示しない。
- mouse click / keyboard selection semantics を壊さない。
- Focused tests で row rendering contract または ViewModel/row ordering/selection contract を確認する。
Implementation latitude:
- dim / bold / color / prefix / indentation / separator / role chip / status chip 等は実装判断。
- `PanelRowKind::Ticket` / `PanelRowKind::TicketIntakePod` rendering 調整可。
- 必要なら shared row style helper を整理可。
- Very small terminal では primary state/title と action safety を優先して bounded rendering する。
Escalate if:
- Panel selection model / keyboard semantics の大幅変更が必要。
- Ticket row と Intake Pod row の action identity が曖昧になり誤操作リスクが出る。
- 色/装飾だけでは accessibility / terminal theme 上の問題を避けられない。
- Row rendering のために local role/session registry や Ticket schema 変更が必要。
- bounded row rendering を維持できず大量 Ticket/Pod で一覧が読みにくくなる。
Validation:
- `cargo test -p tui workspace_panel --lib`
- 関連箇所に応じて `cargo test -p tui multi_pod --lib` / `cargo test -p tui row_hit_testing --lib` / `cargo test -p tui mouse_click --lib`
- `cargo fmt --check`
- `git diff --check`
- 可能なら `yoi panel` / PTY 目視または既存 Panel E2E 更新。
Critical risks / reviewer focus:
- visual hierarchy improves readability without changing action identity。
- Ticket vs Intake child row distinction remains non-color-dependent。
- selection highlight and child grouping remain understandable。
- lifecycle authority and local role/session registry boundaries unchanged。
- bounded rendering/narrow terminal behavior。
- recently merged Alt+Enter and invalid Ticket placeholder behavior not regressed。
---
<!-- event: state_changed author: yoi-orchestrator at: 2026-06-15T06:52:19Z from: queued to: inprogress reason: orchestrator_acceptance_after_conflict_resolution field: state -->
## State changed
Routing decision と accepted implementation plan を記録済み。先行 `00001KV4ZDMV1` は merge/validation/done 済みで prior conflict/waiting reason は解消。blocking relation / unresolved orchestration-plan blocker はないため、implementation side effects の前に `queued -> inprogress` acceptance を記録する。
---
<!-- event: implementation_report author: yoi-coder-00001KV4ZPAD3 at: 2026-06-15T07:04:06Z -->
## Implementation report
Implementation report from Coder Pod `yoi-coder-00001KV4ZPAD3`:
Commit:
- `f3b435e7 fix: clarify panel ticket row hierarchy`
Changed files:
- `crates/tui/src/multi_pod.rs`
- `crates/tui/src/workspace_panel.rs`
Visual hierarchy decisions:
- Ticket rows now use a clearer two-line structure:
- primary line uses selected `▶ ` marker and carries state + title
- secondary line uses `meta` label and selected `│ ` marker, making id/gate/action information clearly secondary
- Ticket-associated Intake Pod rows now render as adjacent child rows:
- non-selected child marker: ` └ `
- selected child marker: ` ▶ `
- `live` / `restorable` / `stale` remains visible in status column
- title is `Intake Pod: <name>` without embedding tree glyphs in the ViewModel title
- Selected Intake Pod status line now says `selected Intake Pod ...` instead of generic selected Pod wording.
- No Ticket lifecycle, relation gate, action authority, persisted schema, polling, or spawn semantics were changed.
Focused tests added/updated:
- Ticket row rendering asserts primary vs secondary line structure.
- Intake child row rendering asserts single-line child indentation/marker/status/title placement.
- Selected Intake Pod target status asserts it is visually described as Intake-related, not generic Ticket or Pod.
Validation reported by coder:
- Passed: `cargo test -p tui workspace_panel --lib`
- Passed: `cargo test -p tui panel_ticket --lib`
- Passed: `cargo test -p tui selected_ticket_intake_child_status --lib`
- Passed: `cargo fmt --check`
- Passed: `git diff --check`
- Ran: `cargo test -p tui multi_pod --lib`
- Failed in pre-existing/unrelated workspace context tests:
- `tests::workspace_panel_spawns_orchestrator_with_workspace_context`
- `tests::workspace_panel_spawns_panel_orchestrator_with_workspace_context`
- Assertion mismatch concerns expected `/workspace` vs temp test workspace paths, not row rendering/selection changes.
Residual risks:
- No interactive `yoi panel` PTY session was run; visual evidence is covered by focused render/string tests.
- Full `multi_pod` suite remains blocked by unrelated existing failures noted above.
---
<!-- event: review author: yoi-reviewer-00001KV4ZPAD3 at: 2026-06-15T07:08:12Z status: approve -->
## Review: approve
Review result: approve
Evidence checked:
- Reviewed diff `79dda10d..f3b435e7`.
- Changed files limited to:
- `crates/tui/src/multi_pod.rs`
- `crates/tui/src/workspace_panel.rs`
- Worktree was clean and on expected branch/commit:
- `impl/00001KV4ZPAD3-panel-row-hierarchy`
- `f3b435e7 fix: clarify panel ticket row hierarchy`
Acceptance review:
- Ticket two-line rows now have clearer hierarchy:
- primary line uses selected marker `▶ ` plus state/title;
- detail line uses `│ meta ` when selected and `meta` label for secondary metadata.
- Ticket-associated Intake Pod rows now render as child rows with indentation plus `└` / indented `▶` and `Intake Pod: <pod>` labeling.
- Relationship is not color-only; indentation/marker/label communicate hierarchy.
- Selected Ticket vs selected Intake Pod are distinguishable through marker placement, label, color/style, and status text.
- `live`, `restorable`, and `stale` Intake status remains visible.
- Pre-Ticket Intake Pod behavior appears preserved; existing tests still assert pre-ticket sessions are not emitted as `TicketIntakePod` child rows.
- Mouse/keyboard action semantics appear unchanged; changes are limited to row rendering/status text.
- Ticket lifecycle transitions, relation gates, registry persistence, polling/spawn behavior, and Ticket schema were not changed.
- Invalid Ticket placeholder behavior remains non-actionable.
- Alt+Enter handling was not touched.
Focused coverage observed:
- Ticket primary/secondary row rendering contract updated.
- Non-selected alignment/truncation tests updated for `meta`.
- Waiting gate readability remains covered.
- New child-row rendering test covers indentation, single-line behavior, status column, title label, and selected child marker.
- New selected Intake child status test confirms it is not presented as a generic Ticket or generic Pod.
- Existing adjacency/pre-ticket exclusion test remains present.
Validation performed by reviewer:
- Passed: `git diff --check 79dda10d..f3b435e7`
- Passed: `cargo fmt --check`
Validation not run by reviewer:
- Cargo tests were not rerun because review scope was read-only and tests write build artifacts. Coder-reported focused test results were inspected as evidence.
Broader failure assessment:
- The reported broader `cargo test -p tui multi_pod --lib` failure appears unrelated based on diff scope; changes are confined to Panel row rendering/status presentation and tests around that contract, with no workspace-context/runtime setup logic changes.
Conclusion:
- Approved. No blocker remains.
---
<!-- event: implementation_report author: yoi-orchestrator at: 2026-06-15T07:09:01Z -->
## Implementation report
Integration report:
Merged implementation branch into orchestration branch:
- branch: `impl/00001KV4ZPAD3-panel-row-hierarchy`
- implementation commit: `f3b435e7 fix: clarify panel ticket row hierarchy`
- merge commit: `8c00a6e9 merge: panel row hierarchy`
Reviewer result:
- `approve` recorded from `yoi-reviewer-00001KV4ZPAD3`.
Validation in Orchestrator worktree `/home/hare/Projects/yoi/.worktree/orchestration`:
- Passed: `cargo test -p tui workspace_panel --lib`
- 16 passed
- Passed: `cargo test -p tui panel_ticket --lib`
- 4 passed
- Passed: `cargo test -p tui selected_ticket_intake_child_status --lib`
- 1 passed
- Passed: `cargo fmt --check`
- Passed: `git diff --check`
Notes:
- Broader `cargo test -p tui multi_pod --lib` remains affected by unrelated workspace-context tests and was not used as a blocker.
- Ticket/Intake visual hierarchy improved without lifecycle/action/schema/polling/spawn semantic changes.
- Orchestrator worktree is clean after validation.
Cleanup planned:
- Stop related coder/reviewer Pods.
- Remove only child implementation worktree/branch for this Ticket.
---
<!-- event: state_changed author: yoi-orchestrator at: 2026-06-15T07:09:01Z from: inprogress to: done reason: merged_validated field: state -->
## State changed
Reviewer approved, implementation branch merged into the orchestration branch, and focused validation passed in the Orchestrator worktree. Marking Ticket done in the orchestration branch.
---