ticket: use base32 project record ids

This commit is contained in:
2026-06-09 22:10:47 +09:00
parent 0803bc3725
commit 4203988d74
798 changed files with 477 additions and 105 deletions
@@ -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.
+39
View File
@@ -0,0 +1,39 @@
---
title: "Workspace panel composer targets"
state: "closed"
created_at: "2026-06-05T21:07:04Z"
updated_at: "2026-06-06T04:47:31Z"
---
## Background
The workspace panel composer must let users choose whether a message goes to the Companion management chat or directly to Ticket Intake.
The key UX requirement is that a request sent to Intake must not be appended to the Companion/current Pod session history.
## Requirements
- Add a composer target model for the workspace panel:
- Companion;
- Ticket Intake.
- Companion target sends normal messages to the Companion Pod/session.
- Intake target launches a new Intake role Pod and sends the composer body as its first `Method::Run` input.
- Intake target must not send the body to Companion/current Pod history.
- Empty Intake messages are rejected.
- The UI clearly shows the active composer target.
- User can switch/cancel target without losing typed text where practical.
- Use Ticket role launcher rather than constructing spawn/profile/workflow prompt content inside UI.
## Non-goals
- Generic arbitrary target routing.
- Scheduler/queue.
- Intake -> Orchestrator handoff implementation.
- Action queue display.
## Acceptance criteria
- User can choose Companion or Intake before pressing Enter.
- Intake path creates a new Intake role launch with the typed body as dynamic run input.
- Existing Companion history does not receive the Intake body.
- Tests cover target switching and Enter behavior for both targets where practical.
+36
View File
@@ -0,0 +1,36 @@
Implemented first workspace panel composer targets.
Changes:
- Added workspace panel composer target model with:
- `Companion` / existing selected-Pod send behavior;
- `Ticket Intake`.
- Added `Ctrl+T` target switching without clearing typed composer text.
- Displayed active target in the panel target/status line and actionbar guidance using existing TUI conventions.
- No-Ticket and unusable-Ticket-config workspaces expose only `Companion` / Pod-centric behavior.
- `Ticket Intake` is available only when Ticket config is usable.
- Empty Intake input is rejected with a bounded diagnostic.
- Intake launch uses the existing `TicketRole::Intake` / `launch_ticket_role_pod(...)` path.
- Composer text is passed as `TicketRoleLaunchContext.user_instruction` for the Intake launch.
- Intake text is not sent to Companion/current Pod history or selected-Pod direct send path.
- Successful Intake launch clears composer and reports the launched Pod name.
- Launch failure keeps composer text and reports a bounded diagnostic.
- Intake -> Orchestrator handoff payload was intentionally not added; the follow-up handoff ticket owns that.
- `--multi` was not reintroduced.
Validation after merge:
- `cargo test -p tui workspace_panel`
- `cargo test -p tui multi_pod`
- `cargo test -p client ticket_role`
- `cargo test -p yoi panel`
- `cargo check --workspace --all-targets`
- `cargo fmt --check`
- `git diff --check HEAD~1..HEAD`
- `cargo build -p yoi`
- `target/debug/yoi ticket doctor`
- `nix build .#yoi --no-link --print-out-paths`
External review approved with no requested changes.
Known follow-up:
- Active target display is intentionally minimal; final placement/color/wording tuning is deferred.
- Intake -> Orchestrator handoff remains the next child ticket.
+86
View File
@@ -0,0 +1,86 @@
<!-- event: create author: yoi ticket at: 2026-06-05T21:07:04Z -->
## Created
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`.
---
<!-- event: review author: hare at: 2026-06-06T04:47:31Z status: approve -->
## Review: approve
External reviewer approved commit `a7c155e` with no blocking issues.
Review summary:
- Composer targets include `Companion` and `Ticket Intake`.
- No-Ticket/unusable-Ticket-config workspaces remain Companion-only.
- Active target is visible and `Ctrl+T` switching preserves typed input.
- Ticket Intake uses `TicketRole::Intake` via `launch_ticket_role_pod` with composer text as `TicketRoleLaunchContext.user_instruction`.
- Intake text does not route through the selected-Pod direct send path.
- Empty Intake input is rejected locally with a bounded diagnostic.
- Success clears composer and reports launched Pod name; failure keeps composer and reports a bounded diagnostic.
- No Intake -> Orchestrator handoff payload was added.
- `--multi` was not reintroduced.
---
<!-- event: close author: hare at: 2026-06-06T04:47:31Z status: closed -->
## Closed
Implemented first workspace panel composer targets.
Changes:
- Added workspace panel composer target model with:
- `Companion` / existing selected-Pod send behavior;
- `Ticket Intake`.
- Added `Ctrl+T` target switching without clearing typed composer text.
- Displayed active target in the panel target/status line and actionbar guidance using existing TUI conventions.
- No-Ticket and unusable-Ticket-config workspaces expose only `Companion` / Pod-centric behavior.
- `Ticket Intake` is available only when Ticket config is usable.
- Empty Intake input is rejected with a bounded diagnostic.
- Intake launch uses the existing `TicketRole::Intake` / `launch_ticket_role_pod(...)` path.
- Composer text is passed as `TicketRoleLaunchContext.user_instruction` for the Intake launch.
- Intake text is not sent to Companion/current Pod history or selected-Pod direct send path.
- Successful Intake launch clears composer and reports the launched Pod name.
- Launch failure keeps composer text and reports a bounded diagnostic.
- Intake -> Orchestrator handoff payload was intentionally not added; the follow-up handoff ticket owns that.
- `--multi` was not reintroduced.
Validation after merge:
- `cargo test -p tui workspace_panel`
- `cargo test -p tui multi_pod`
- `cargo test -p client ticket_role`
- `cargo test -p yoi panel`
- `cargo check --workspace --all-targets`
- `cargo fmt --check`
- `git diff --check HEAD~1..HEAD`
- `cargo build -p yoi`
- `target/debug/yoi ticket doctor`
- `nix build .#yoi --no-link --print-out-paths`
External review approved with no requested changes.
Known follow-up:
- Active target display is intentionally minimal; final placement/color/wording tuning is deferred.
- Intake -> Orchestrator handoff remains the next child ticket.
---