ticket: preflight workspace panel composer targets

This commit is contained in:
Keisuke Hirata 2026-06-06 13:24:53 +09:00
parent 556fd42973
commit f23a4a29c6
No known key found for this signature in database
3 changed files with 116 additions and 1 deletions

View File

@ -0,0 +1,100 @@
# Delegation intent: workspace panel composer targets
## Classification
`implementation-ready` after action model and Orchestrator lifecycle slices.
The panel now has `yoi panel`, Ticket-config-gated Ticket UI, Pod-centric no-Ticket behavior, and Ticket-enabled Orchestrator lifecycle. This ticket adds the first composer target split so users can send either to the Companion/selected Pod path or directly to a new Intake role Pod.
## Intent
Add workspace panel composer target selection with two first-class targets:
- `Companion` / current Pod-centric send path;
- `Ticket Intake` / launch a new Intake role Pod with the composer body as its first run input.
The Intake path must not append the message to Companion/current Pod history. It should go only to the launched Intake Pod's initial `Method::Run` input/history through the existing Ticket role launcher path.
## Worktree / branch
- worktree: `/home/hare/Projects/yoi/.worktree/workspace-panel-composer-targets`
- branch: `work/workspace-panel-composer-targets`
This ticket may read tracked `.yoi/tickets` records/design artifacts. Do not read or edit `.yoi/memory/`.
## Requirements
- Add a workspace panel composer target model with at least:
- `Companion` / existing selected-Pod send behavior;
- `Ticket Intake`.
- The UI must clearly show the active composer target using existing TUI visual conventions.
- Add a simple keybinding or command path to switch targets without losing typed text where practical.
- `Companion` target should preserve existing panel/Pod-centric send behavior.
- In no-Ticket workspace, this should be the only available target and should behave like the current Pod dashboard send.
- `Ticket Intake` target should be available only when Ticket config is defined/usable.
- Empty Intake messages must be rejected with a bounded diagnostic/actionbar-style message.
- Intake target must call the existing Ticket role launcher (`TicketRole::Intake`) rather than constructing spawn/profile/workflow prompt content inside TUI.
- The composer body must become dynamic user instruction/run input for the Intake launch.
- The Intake body must not be sent to Companion/current Pod history or to any selected Pod.
- After a successful Intake launch, clear the composer and surface a bounded success notice including the launched Pod name.
- On launch failure, keep the composer text and surface a bounded diagnostic.
- Do not implement Intake -> Orchestrator handoff payload in this ticket; that is the next child ticket.
- Do not reintroduce `--multi`.
- Keep layout changes minimal; final display tuning is later.
## Non-goals
- Intake -> Orchestrator handoff contract.
- Generic arbitrary target routing.
- Scheduler/queue.
- Ticket action queue display.
- Final layout/display tuning.
- Companion Pod/session creation beyond preserving existing panel send behavior.
## Current code map
- `crates/tui/src/multi_pod.rs`
- Current panel substrate, composer handling, selected Pod send/open behavior, notices/diagnostics.
- `crates/tui/src/workspace_panel.rs`
- ViewModel/header/diagnostics. Extend with composer target view state only if useful; keep it thin.
- `crates/client/src/ticket_role.rs`
- `TicketRoleLaunchContext`, `TicketRole::Intake`, and `launch_ticket_role_pod(...)`. Use this path for Intake launch.
- `crates/tui/src/command.rs`
- Existing `:ticket intake ...` route for reference only; do not duplicate prompt/profile construction in TUI.
- `crates/tui/src/app.rs`
- Normal composer/history semantics for reference; ensure Intake target does not mutate the wrong history.
## Validation
Run at least:
- targeted TUI tests for composer target switching and Enter behavior;
- a test that Intake target rejects empty input;
- a test that Intake target calls/constructs a Ticket role launch request without sending to selected Pod path;
- a test that no-Ticket workspace exposes only Companion/Pod-centric send;
- `cargo test -p tui workspace_panel`;
- `cargo test -p tui multi` or updated panel test names;
- `cargo test -p client ticket_role` if role launcher code changes;
- `cargo test -p yoi panel`;
- `cargo check --workspace --all-targets`;
- `cargo fmt --check`;
- `git diff --check`;
- `cargo build -p yoi`;
- `target/debug/yoi ticket doctor`.
Run `nix build .#yoi --no-link` if feasible.
## Completion report
Report:
- worktree path / branch;
- commit hash;
- composer target model/keybinding;
- no-Ticket target behavior;
- Intake launch path and how the typed body is routed;
- proof that Intake body does not go to Companion/current Pod history;
- diagnostics/success notices;
- tests updated/added;
- validation results;
- known follow-up layout/display tuning items.

View File

@ -7,7 +7,7 @@ kind: task
priority: P1 priority: P1
labels: [tui, composer, intake, panel] labels: [tui, composer, intake, panel]
created_at: 2026-06-05T21:07:04Z created_at: 2026-06-05T21:07:04Z
updated_at: 2026-06-05T21:07:04Z updated_at: 2026-06-06T04:24:53Z
assignee: null assignee: null
legacy_ticket: null legacy_ticket: null
--- ---

View File

@ -4,4 +4,19 @@
Created by LocalTicketBackend create. Created by LocalTicketBackend create.
---
<!-- event: plan author: hare at: 2026-06-06T04:24:53Z -->
## Plan
Preflight result: `implementation-ready` after action model and Orchestrator lifecycle.
This ticket should add the first composer target split for `yoi panel`: preserve the Companion/selected-Pod send path, and add a Ticket Intake target that launches an Intake role Pod with the composer body as the initial user instruction. The Intake body must not be appended to Companion/current Pod history or sent to the selected Pod.
Ticket Intake target is available only when Ticket config is defined/usable. No-Ticket workspaces remain Pod-centric and expose only the existing send behavior.
Detailed delegation intent is recorded in `artifacts/delegation-intent.md`.
--- ---