From 4cda83b748560cdafea1232a96cffb21640305a1 Mon Sep 17 00:00:00 2001 From: Hare Date: Tue, 23 Jun 2026 15:50:36 +0900 Subject: [PATCH] ticket: accept workspace identity and selection work --- .../artifacts/orchestration-plan.jsonl | 1 + .yoi/tickets/00001KVSKGDYS/item.md | 4 +- .yoi/tickets/00001KVSKGDYS/thread.md | 67 +++++++++++++++++++ .../artifacts/orchestration-plan.jsonl | 1 + .yoi/tickets/00001KVSKJ0EA/item.md | 4 +- .yoi/tickets/00001KVSKJ0EA/thread.md | 60 +++++++++++++++++ 6 files changed, 133 insertions(+), 4 deletions(-) create mode 100644 .yoi/tickets/00001KVSKGDYS/artifacts/orchestration-plan.jsonl create mode 100644 .yoi/tickets/00001KVSKJ0EA/artifacts/orchestration-plan.jsonl diff --git a/.yoi/tickets/00001KVSKGDYS/artifacts/orchestration-plan.jsonl b/.yoi/tickets/00001KVSKGDYS/artifacts/orchestration-plan.jsonl new file mode 100644 index 00000000..bff3e9bb --- /dev/null +++ b/.yoi/tickets/00001KVSKGDYS/artifacts/orchestration-plan.jsonl @@ -0,0 +1 @@ +{"id":"orch-plan-20260623-065020-1","ticket_id":"00001KVSKGDYS","kind":"accepted_plan","accepted_plan":{"summary":"Add tracked `.yoi/workspace.toml` schema/loader/create-if-missing path for safe local Workspace identity and use persisted workspace id in Workspace APIs/repository/host id derivation, with tests for missing/existing/invalid/no-path-leak behavior.","branch":"impl/00001KVSKGDYS-workspace-identity","worktree":"/home/hare/Projects/yoi/.worktree/00001KVSKGDYS-workspace-identity","role_plan":"Orchestrator creates a dedicated child worktree and spawns a narrow-scope Workspace backend Coder. Reviewer will be spawned read-only after Coder reports implementation commit(s). After approval, Orchestrator integrates into `orchestration`, validates workspace-server/frontend/Nix as needed, records closure, and cleans only the child worktree/branch."},"author":"yoi-orchestrator","at":"2026-06-23T06:50:20Z"} diff --git a/.yoi/tickets/00001KVSKGDYS/item.md b/.yoi/tickets/00001KVSKGDYS/item.md index af9d6d78..a4ebecad 100644 --- a/.yoi/tickets/00001KVSKGDYS/item.md +++ b/.yoi/tickets/00001KVSKGDYS/item.md @@ -1,8 +1,8 @@ --- title: 'Persist local Workspace identity in .yoi/workspace.toml' -state: 'queued' +state: 'inprogress' created_at: '2026-06-23T06:43:28Z' -updated_at: '2026-06-23T06:47:18Z' +updated_at: '2026-06-23T06:50:20Z' assignee: null queued_by: 'workspace-panel' queued_at: '2026-06-23T06:47:18Z' diff --git a/.yoi/tickets/00001KVSKGDYS/thread.md b/.yoi/tickets/00001KVSKGDYS/thread.md index 58d35841..eee04e13 100644 --- a/.yoi/tickets/00001KVSKGDYS/thread.md +++ b/.yoi/tickets/00001KVSKGDYS/thread.md @@ -30,4 +30,71 @@ Marked ready by `yoi ticket state`. Ticket を `workspace-panel` が queued にしました。 +--- + + + +## Decision + +Routing decision: `implementation_ready_parallel` + +Reason: +- Ticket body has concrete `workspace.toml` semantics, backend/API consistency requirements, migration-safe behavior, tests, and validation criteria。 +- No relations / blockers / orchestration plan records exist。 +- Active Dashboard no-auto-selection work is TUI-only and separate from Workspace backend identity persistence, so parallel implementation is acceptable。 +- Orchestrator worktree is clean on `orchestration` at `13e76d35`; target worktree / branch is not present。 +- Current Workspace backend has ad-hoc/stable-ish IDs; Ticket asks for tracked local identity at `.yoi/workspace.toml`。 + +IntentPacket: + +Intent: +- Persist local Workspace identity in tracked `.yoi/workspace.toml` and use it as the stable local Workspace id across backend APIs, repository IDs, host ID derivation, and frontend display where applicable。 + +Binding decisions / invariants: +- `.yoi/workspace.toml` is tracked project record, not local runtime/secret file。 +- It should contain only safe project identity fields, e.g. `workspace_id`, `display_name`, `created_at` or equivalent; no absolute paths, user names, socket paths, data-dir paths, tokens, or runtime secrets。 +- Existing checkouts without the file must remain usable with safe auto-create or fallback behavior。 +- Workspace id should not change on process restart, repo path move, or sibling worktree checkout when the file is present。 +- Avoid changing Ticket/Objectives canonical authority。 +- Do not confuse this with Profile/manifest/override runtime config。 +- Handle invalid/corrupt `workspace.toml` fail-closed with clear diagnostic; do not silently generate a different id over a bad tracked file unless explicitly safe。 + +Requirements / acceptance criteria: +- Define `.yoi/workspace.toml` schema and parser/loader. +- Add create-if-missing behavior for local workspace server/bootstrap path, or a documented CLI/tool path if auto-create is unsuitable. +- Use persisted workspace id in Workspace API responses and any Repository/Host ids derived from workspace id. +- Ensure generated file is safe to commit and has no local absolute paths/secrets. +- Existing tests updated to deterministic temp workspace identity behavior。 +- Add tests for missing file creation/fallback, existing stable id, invalid file error, and no local path leakage。 +- Validation includes workspace-server tests, Deno check/build if frontend output changes, git diff check, Ticket doctor, and Nix build if package/source behavior changes。 + +Implementation latitude: +- Put parser in `workspace-server` crate if currently only the web backend needs it, or a small shared crate if needed; avoid broad architecture churn。 +- Workspace id can reuse project-record id allocator if suitable, or a stable slug/uuid/base32 type if already used。 +- If auto-writing tracked file during server startup is risky, implement explicit ensure function used by tests/bootstrap and document behavior; but Ticket prefers tracked persistence。 +- Frontend can just display the id returned by existing `/api/workspace` if backend response changes。 + +Escalate if: +- Creating tracked `.yoi/workspace.toml` from a server process violates current project-record write boundaries。 +- Workspace id generation requires global registry/coordination beyond local checkout。 +- Existing code strongly assumes workspace id is derived from path and changing it would break multiple APIs unexpectedly。 +- Nix/source filtering excludes `.yoi/workspace.toml` unexpectedly and package behavior needs product decision。 + +Validation plan: +- `cargo fmt --check` +- `cargo test -p yoi-workspace-server` +- `cargo check -p yoi-workspace-server` +- `cd web/workspace && deno task check && deno task build` if frontend-visible changes occur。 +- `git diff --check` +- `cargo run -p yoi -- ticket doctor` +- `nix build .#yoi --no-link` if package/source filtering or tracked file behavior changed。 + +--- + + + +## State changed + +Human authorized queue routing from Workspace Dashboard. Ticket has concrete local workspace identity requirements and no recorded blockers, so Orchestrator accepts implementation. + --- diff --git a/.yoi/tickets/00001KVSKJ0EA/artifacts/orchestration-plan.jsonl b/.yoi/tickets/00001KVSKJ0EA/artifacts/orchestration-plan.jsonl new file mode 100644 index 00000000..da83405e --- /dev/null +++ b/.yoi/tickets/00001KVSKJ0EA/artifacts/orchestration-plan.jsonl @@ -0,0 +1 @@ +{"id":"orch-plan-20260623-064931-1","ticket_id":"00001KVSKJ0EA","kind":"accepted_plan","accepted_plan":{"summary":"Change Workspace Dashboard selection semantics so initial display and reload/background refresh do not auto-select rows; explicit keyboard/mouse selection still works; no-selection + TicketIntake composer submits global/new Intake; add focused tests.","branch":"impl/00001KVSKJ0EA-dashboard-no-auto-selection","worktree":"/home/hare/Projects/yoi/.worktree/00001KVSKJ0EA-dashboard-no-auto-selection","role_plan":"Orchestrator creates a dedicated child worktree and spawns a narrow-scope TUI Coder. Reviewer will be spawned read-only after Coder reports implementation commit(s). After approval, Orchestrator integrates into `orchestration`, validates TUI focused tests, records closure, and cleans only the child worktree/branch."},"author":"yoi-orchestrator","at":"2026-06-23T06:49:31Z"} diff --git a/.yoi/tickets/00001KVSKJ0EA/item.md b/.yoi/tickets/00001KVSKJ0EA/item.md index 37bf1857..ae5a7da1 100644 --- a/.yoi/tickets/00001KVSKJ0EA/item.md +++ b/.yoi/tickets/00001KVSKJ0EA/item.md @@ -1,8 +1,8 @@ --- title: 'Dashboard reload と初期表示で row を自動選択しない' -state: 'queued' +state: 'inprogress' created_at: '2026-06-23T06:44:20Z' -updated_at: '2026-06-23T06:47:17Z' +updated_at: '2026-06-23T06:49:31Z' assignee: null readiness: 'implementation_ready' risk_flags: ['tui-ux', 'panel-selection', 'reload-state'] diff --git a/.yoi/tickets/00001KVSKJ0EA/thread.md b/.yoi/tickets/00001KVSKJ0EA/thread.md index bd6b86ed..a03f0aaa 100644 --- a/.yoi/tickets/00001KVSKJ0EA/thread.md +++ b/.yoi/tickets/00001KVSKJ0EA/thread.md @@ -29,4 +29,64 @@ LocalTicketBackend によって作成されました。 Ticket を `workspace-panel` が queued にしました。 +--- + + + +## Decision + +Routing decision: `implementation_ready_parallel` + +Reason: +- Ticket body has concrete Dashboard selection semantics and focused test requirements。 +- No relations / blockers / orchestration plan records exist。 +- Active queued Workspace identity Ticket is backend/workspace-server focused and separate from TUI Dashboard row-selection code, so parallel implementation is acceptable。 +- Orchestrator worktree is clean on `orchestration` at `13e76d35`; target worktree / branch is not present。 +- Code map from Ticket body points to `crates/tui/src/dashboard/mod.rs`, `tests.rs`, and `render.rs`。 + +IntentPacket: + +Intent: +- Treat no-selection as a first-class Dashboard UX state: initial panel display and reload/background refresh must not auto-select rows, while explicit keyboard/mouse selection still works。 + +Binding decisions / invariants: +- Initial `yoi panel` display should have `selected_row = None` even when rows are visible。 +- `Esc` clear must persist across reload/snapshot refresh; reload must not recreate selection after explicit no-selection。 +- If a user explicitly selected a row and it remains visible after reload, that selection may be preserved。 +- If selected row disappears after reload, fall back safely to no-selection。 +- Composer draft must survive selection clear/reload。 +- Existing row actions, queue/close/open operations, Ticket workflow state semantics, and row-click-is-selection-only policy must remain unchanged。 +- No broad Dashboard layout redesign in this Ticket。 + +Requirements / acceptance criteria: +- Initial Dashboard state has no selected row when rows exist。 +- Esc clear -> reload completion -> still no selected row。 +- No-selection + `TicketIntake` composer submit routes to global/new Intake, not selected Ticket refinement。 +- Keyboard navigation or mouse click can explicitly create selection again。 +- Focused tests cover the above semantics。 + +Implementation latitude: +- Use an explicit no-selection flag or refine selection visibility correction conditions。 +- The key is to make selection creation happen only from explicit user navigation/click/action paths, not from reload/init visibility correction。 + +Escalate if: +- Initial no-selection substantially breaks keyboard-only navigation or blank Enter action contract。 +- Existing selection visibility correction has safety roles that cannot be preserved with a local change。 +- Real terminal / PTY behavior is required beyond focused tests。 + +Validation plan: +- `cargo fmt --check` +- `cargo test -q -p tui workspace_panel` +- Dashboard focused tests as needed。 +- `git diff --check` +- `cargo run -p yoi -- ticket doctor`。 + +--- + + + +## State changed + +Human authorized queue routing from Workspace Dashboard. Ticket has concrete Dashboard selection semantics and no recorded blockers, so Orchestrator accepts implementation. + ---