23 KiB
作成
LocalTicketBackend によって作成されました。
Decision
Worker 側が持つ workspace 情報は Option<WorkspaceId> に留める。WorkspaceBackendRef、endpoint、auth/SecretRef、adapter/client の materialization は Runtime/host 側の責務とし、Worker は Runtime から注入された scoped WorkspaceClient / handle 経由で workspace-aware API に request する。
Plan
整理結果:
-
00001KX6Y2A9Q WorkerFilesystemAuthority
- hard dependency なし。
- no-workdir を filesystem authority none として型で表現する基盤。
-
00001KX6WVNPD Embedded no-workdir Worker authority policy
- depends_on: 00001KX6Y2A9Q。
- UI/API の workdir 任意化と embedded no-workdir tool surface 制御を実装する。
-
00001KX6Y6ZEA WorkspaceBackend / workspace_id 分離
- depends_on: 00001KX6Y2A9Q。
- workspace_root path 依存を workspace_id + Runtime-injected WorkspaceClient へ移行する。
- embedded no-workdir MVP をブロックしない。
Hard dependencies は WorkerFilesystemAuthority を共通前提に限定する。WorkspaceBackend 分離は embedded no-workdir policy の MVP には related だが depends_on にはしない。
Decision
Clarification: this ticket should remove Worker-level workspace_root: PathBuf, not leave it as a staged authority surface. Local paths may remain only inside Runtime/host backend adapters or WorkerFilesystemAuthority::Local; Worker workspace identity is Option<WorkspaceId> and workspace operations go through an injected WorkspaceClient / handle.
Intake summary
Marked ready by yoi ticket state.
State changed
Marked ready by yoi ticket state.
State changed
Ticket を workspace-panel が queued にしました。
Decision
Routing decision: blocked_by_dependency
Reason:
- Dashboard queue authorization was inspected, but this Ticket has an explicit typed
depends_onrelation to00001KX6Y2A9Q。 00001KX6Y2A9Qis currentlyinprogressand is refactoring Worker filesystem authority / cwd removal / no-workdir boundaries。- This Ticket replaces Worker
workspace_rootpath usage withWorkspaceBackend, which builds on the same Worker struct/context/constructor boundary。 - Starting now would likely conflict with the active filesystem-authority refactor and obscure review boundaries。
- Therefore this routing pass leaves the Ticket
queuedand does not recordqueued -> inprogress, create a worktree, or spawn role Pods。
Evidence checked:
- Ticket body / recent thread / artifacts。
TicketRelationQuery(00001KX6Y6ZEA): includes dependency on00001KX6Y2A9Q。TicketList(inprogress):00001KX6Y2A9Qis the active inprogress Ticket。- Orchestrator worktree status: clean。
Next action:
- Re-route this Ticket after
00001KX6Y2A9Qis approved, merged, validated, and closed。 - Escalate only if a human explicitly requests combined implementation in the same branch/worktree。
Decision
Routing decision: hold_queued_due_migration_boundary_conflict
Reason:
- 前提
00001KX6Y2A9Qは closed になったため dependency 自体は解消済み。 - ただし、この routing pass では
00001KX6WVNPDを先に受理した。 00001KX6WVNPDは embedded no-workdir policy MVP であり、WorkspaceBackend migration を必要としない小さい境界変更である。- この Ticket は Worker
workspace_rootpath をWorkspaceBackendに置き換える refactor で、Worker struct/context/constructor/runtime spawn/UI API 周辺に触れる。 00001KX6WVNPDも同じ Worker create / embedded runtime / no-workdir authority surface に触るため、並行 branch で進めると conflict と review boundary 混濁の可能性が高い。- よって、この Ticket は
queuedのまま保持し、00001KX6WVNPDが reviewed/merged/closed になってから再 routing する。
Evidence checked:
- Ticket body / thread / relations / orchestration plan。
TicketRelationQuery(00001KX6Y6ZEA): prerequisite00001KX6Y2A9Qは closed。TicketList(inprogress): routing pass 中に00001KX6WVNPDを accepted for implementation。- Orchestrator worktree status: clean。
Next action:
00001KX6WVNPDの implementation/review/merge/close を完了後、この Ticket を再 routing する。- 人間が combined branch を明示希望する場合のみ、この待機判断を再検討する。
Decision
Routing decision: implementation_ready
Reason:
- 前提
00001KX6Y2A9Qは closed 済みで、WorkerFilesystemAuthority::{None, Local}と cwd 除去境界が merge 済み。 - 関連
00001KX6WVNPDも closed 済みで、embedded no-workdir Worker policy / UI/API optionality が merge 済み。 - この Ticket の typed
depends_on 00001KX6Y2A9Qは解消済み。00001KX6WVNPDはrelatedであり blocker ではなく、直前の conflict/migration-boundary waiting note もその Ticket の merge/close により解消済み。 TicketList(inprogress)は 0 件で、Orchestrator worktree は clean。- Ticket body/thread に Worker-level local path identity をなくし、Runtime/host-owned backend/client 境界へ移す binding decision が記録されている。
Evidence checked:
- Ticket body / thread / relations / orchestration plan。
- Closed prerequisite
00001KX6Y2A9Qand closed related policy Ticket00001KX6WVNPD。 TicketRelationQuery(00001KX6Y6ZEA): outgoingdepends_on 00001KX6Y2A9Qis closed; other relations arerelatedonly。TicketOrchestrationPlanQuery(00001KX6Y6ZEA): prior waiting notes were dependency/conflict notes now resolved by prerequisite and related Ticket closure。TicketList(inprogress): 0 件。- Orchestrator worktree status: clean。
IntentPacket:
Intent:
- Worker の workspace identity/context を local path (
workspace_root: PathBuf) から path-free identity (Option<WorkspaceId>) と Runtime/host injected workspace client/handle 境界へ移行する。 - Filesystem authority は
WorkerFilesystemAuthorityに閉じ込め、workspace identity/client が local filesystem authority を意味しないようにする。
Binding decisions / invariants:
- Worker struct は durable/context identity として local workspace path を保持しない。
- Worker-level
workspace_root: PathBuffield と local path-returning workspace identity accessor を削除する。 - Worker が
WorkspaceBackendRef/ endpoint / auth / SecretRef / adapter を直接解決しない。 - Runtime/host 側が backend binding source を保持・解決し、Worker には narrow
WorkspaceClient/ handle を注入する。 workspace_id = Some(...)かつfilesystem = Noneを表現できること。workspace_id = Noneかつfilesystem = Noneの会話専用 Worker も表現できること。- local path が必要な処理は Runtime/host backend adapter または
WorkerFilesystemAuthority::Localの内側に閉じ込める。 - capability を導入する場合でも authority source にせず、tool registration / UX / discovery hint として扱い、enforcement は backend 側に置く。
WorkerFilesystemAuthority/ embedded no-workdir policy を崩さない。workspace root fallback や process cwd fallback を filesystem authority として復活させない。
Requirements / acceptance criteria:
- Worker context に
workspace_id: Option<WorkspaceId>equivalent と injected workspace client/handle equivalent を持てる。 - Worker struct に
workspace_root: PathBufが存在しない。 - workspace-aware features(Ticket / memory / workflow / project records / workspace metadata)は local workspace path authority ではなく injected workspace client/handle 経由へ移行する、または移行が必要な箇所を fail-closed / unavailable diagnostic にする。
- Runtime/host が
WorkspaceBackendRefequivalent を保持・解決し、Worker launch/restore/embedded/spawn path へ安全に materialize できる。 - No-workdir Worker は workspace API access と local filesystem authority の有無を独立に表現できる。
- Existing local/workdir Workers still work with
WorkerFilesystemAuthority::Localand local-path-only operations confined there。 - Tests cover no local workspace path identity on Worker, workspace_id/client injection shape, no filesystem authority mixing, and representative workspace-aware API/tool behavior。
Implementation latitude:
WorkspaceId,WorkspaceBackendRef,WorkspaceClient/ handle の exact placement/name/API surface は existing crate boundaries に合わせてよい。- Minimal client/handle can support only currently needed workspace-aware operations if broad API migration would exceed Ticket scope, but it must not leave Worker-local path authority as the active path。
- If a currently path-backed feature cannot be migrated safely in this Ticket, prefer explicit unavailable/fail-closed diagnostic with follow-up note rather than hidden path fallback。
- Capability discovery is optional unless needed for safe tool registration/UX。
Escalate if:
- Removing
workspace_rootfrom Worker requires changing product semantics for memory/Ticket/workflow availability beyond local refactor。 - A workspace-aware feature cannot be migrated without introducing a broad external backend/protocol design not captured by this Ticket。
- You need to reintroduce Worker-held local workspace path as identity/authority。
- You need to weaken no-workdir fs/Bash tool omission or
WorkerFilesystemAuthorityinvariants。 - Public API/serialization migration requires incompatible durable-state handling beyond existing restore/test coverage。
Validation:
rg "workspace_root" crates/worker crates/worker-runtime crates/yoi-pod-client crates/yoi-workspace-serverwith expected remaining hits only outside Worker identity/authority or documented adapter boundaries。rg "worker\.workspace_root|workspace_root\(\)" cratesor equivalent showing Worker local path accessor removed。git diff --checkcargo test -p worker --lib --testscargo test -p worker-runtime --features ws-server,fs-storecargo test -p yoi-workspace-server --libcargo check -p yoicd web/workspace && deno task check && deno task testif API/types/UI are touched。yoi ticket doctornix build .#yoi --no-link
Current code map / likely touch points:
crates/worker/src/worker.rsfor Worker context fields and accessors。crates/worker/src/controller.rsfor workspace-aware tool/resource setup currently tied to workspace path。crates/worker-runtime/src/worker_backend.rsfor Runtime/embedded/restore construction and backend binding materialization。- workspace-server/client crates if backend/client DTOs or Worker launch summaries expose workspace identity。
- tests around no-workdir Workers, restore, child spawn, Ticket/memory/workflow availability。
Critical risks / reviewer focus:
- Hidden local path authority retained in Worker under a renamed field/accessor。
- Workspace identity/client being treated as filesystem authority。
- WorkspaceBackendRef/endpoint/secret leaking into Worker-owned state。
- Breaking local/workdir Workers or child spawn/restore while removing path identity。
- Regressing embedded no-workdir policy or filesystem/Bash tool omission。
- Over-broad migration that invents a large remote-workspace protocol instead of the minimal safe boundary needed here。
State changed
Prerequisite and prior conflict/migration-boundary Ticket are now closed. This Ticket is accepted for implementation before creating a worktree or spawning role Pods.
Implementation report
Implementation progress report:
- Coder Pod
yoi-coder-00001KX6Y6ZEA-workspace-backendcompleted implementation in/home/hare/Projects/yoi/.worktree/00001KX6Y6ZEA-workspace-backendon branchwork/00001KX6Y6ZEA-workspace-backend。 - Implementation commit:
142b60e1b3ca refactor: separate worker workspace identity。 - Orchestrator inspected worktree status, branch log, commit stats,
git diff --check 74b07bd7..HEAD, and workspace-root accessor grep. Worktree was clean and diff check passed。
Implementation summary:
- Replaced Worker-held
workspace_root: PathBufidentity with path-freeWorkerWorkspaceContext,WorkspaceId, andWorkspaceClient。 - Kept local filesystem authority under
WorkerFilesystemAuthority::{None, Local(LocalWorkingDirectory)}。 - Updated Worker constructors / restore / spawn paths to receive workspace context separately from filesystem authority。
- Added runtime-side
RuntimeWorkspaceBackendRefas host-owned local backend binding that injects narrow Worker workspace context。 - No-filesystem Workers keep memory/workflow local layouts unavailable/fail-closed rather than falling back to workspace paths。
- Preserved legacy metadata
workspace_rootonly as a local filesystem hint derived fromWorkerFilesystemAuthority::Local, not as Worker identity。 - Updated tests for path-free workspace identity/client separation from local tool cwd/root, workspace client without filesystem authority, no local path-returning Worker workspace accessor, and constructor usage。
Files touched:
crates/worker/src/worker.rscrates/worker/src/controller.rscrates/worker/src/entrypoint.rscrates/worker/src/lib.rscrates/worker/src/discovery.rscrates/worker/src/ticket_event_notify.rscrates/worker/tests/*crates/worker-runtime/src/worker_backend.rscrates/worker-runtime/Cargo.tomlcrates/session-store/src/worker_metadata.rsCargo.lockpackage.nix
Coder-reported validation passed:
rg -n "workspace_root" crates/worker crates/worker-runtime crates/client crates/workspace-serverwith remaining hits as legacy metadata/local filesystem adapter or host/runtime local backend boundaries plus tests。rg -n "worker\\.workspace_root|pub fn workspace_root|fn workspace_root" crates/worker crates/worker-runtime crates/client crates/workspace-server || true; no Workerworkspace_root()accessor hits. Orchestrator grep observed an unrelatedcrates/workspace-server/src/records.rsproject-record accessor hit outside Worker identity。git diff --checkcargo test -p worker --lib --testscargo test -p worker-runtime --features ws-server,fs-storecargo test -p yoi-workspace-server --libcargo check -p yoiyoi ticket doctornix build .#yoi --no-link
Not run by Coder:
cd web/workspace && deno task check && deno task testbecause web/API/types were not touched。
Next action:
- Route to external Reviewer Pod before merge/close decisions。
Review: approve
External review result: approve
Evidence:
- Worker identity is path-free:
WorkerWorkspaceContextcarriesOption<WorkspaceId>plus narrowWorkspaceClient/unavailable state, whileWorkerstoresworkspace_contextandfilesystem_authorityinstead of aworkspace_root: PathBuf(crates/worker/src/worker.rs:61-109,384-405)。 - No
worker.workspace_root()/ local path-returning workspace accessor remains; local paths are exposed only throughWorkerFilesystemAuthority::Localhelpers such aslocal_working_directory()(worker.rs:741-840)。 - Runtime/host boundary now resolves local workspace backend context before constructing Workers (
crates/worker-runtime/src/worker_backend.rs:321-390), and Worker construction accepts injected workspace context + filesystem authority (worker.rs:4219-4260)。 - Workspace/client without filesystem and no-workspace/no-filesystem Workers are represented and covered by tests (
worker.rs:5441-5530; worker-runtime tests around901+)。 - Workspace-aware local features fail closed when no local filesystem authority is available; Ticket/memory/workflow/spawn-dependent surfaces require
filesystem_authority.local()and otherwise return unavailable errors rather than cwd/root fallback (crates/worker/src/controller.rs:630-672,709-779)。 - Legacy
workspace_rootmetadata is written only as a compatibility/local hint from local filesystem authority, not as Worker identity (worker.rs:4604-4621;session-store/src/worker_metadata.rs)。
Validation performed:
git diff --check 142b60e1^ 142b60e1- Focused grep for forbidden
workspace_root()accessor: no matches。 - Focused tests:
cargo test -p worker spawned_context_tests --libcargo test -p worker-runtime worker_spawn_receives_materialized_workspace_cwd_instead_of_source_repo --features ws-server,fs-storecargo test -p worker-runtime adapter_dispatches_user_input_through_worker_run_lifecycle --features ws-server,fs-store
Blockers: none。
Non-blocking notes:
- Remaining
workspace_roothits are local runtime/entrypoint/spawn-tool adapter, legacy metadata, or test contexts; reviewer did not find Worker identity/accessor use。 set_active_with_workspace_contextpreserves existing metadata fields when passedNone; acceptable for this Ticket as compatibility metadata, but future no-workspace reuse of an existing Pod name may want explicit clearing semantics to avoid stale UI hints。
Implementation report
Merge / final validation report:
- Reviewer approved the implementation with no blockers。
- Merged branch
work/00001KX6Y6ZEA-workspace-backendinto orchestration branch with merge commit391f11fc merge: workspace backend worker context。 - Final validation was rerun in
/home/hare/Projects/yoi/.worktree/orchestrationafter merge。
Validation passed:
rg -n 'workspace_root' crates/worker crates/worker-runtime crates/client crates/workspace-server || truewith remaining hits limited to legacy metadata/local adapter/test contexts。rg -n 'worker\\.workspace_root|pub fn workspace_root|fn workspace_root' crates/worker crates/worker-runtime crates/client crates/workspace-server || true; no Worker identity/accessor hits were found. The expected unrelated workspace-server project-record accessor remains outside Worker identity。git diff --checkcargo test -p worker --lib --testscargo test -p worker-runtime --features ws-server,fs-storecargo test -p yoi-workspace-server --libcargo check -p yoicd web/workspace && deno task checkcd web/workspace && deno task testyoi ticket doctornix build .#yoi --no-link
Validation log:
/run/user/1000/yoi/yoi-orchestrator/bash-output/workspace-backend-final-validation-1783732052.txt
Reviewed/merged implementation commit:
142b60e1 refactor: separate worker workspace identity
Non-blocking reviewer note:
set_active_with_workspace_contextpreserves existing metadata fields when passedNone; acceptable for this Ticket as compatibility metadata, but future no-workspace reuse of an existing Pod name may want explicit clearing semantics to avoid stale UI hints。
State changed
Implementation was reviewed, merged into orchestration branch, and final validation passed. Moving to done before closure.
State changed
Ticket を closed にしました。
完了
Worker workspace identity / WorkspaceBackend boundary を実装・レビュー・merge・検証した。
実装内容:
- Worker-held
workspace_root: PathBufidentity を削除し、path-freeWorkerWorkspaceContext,WorkspaceId,WorkspaceClientに置き換えた。 - Worker は
workspace_contextとfilesystem_authorityを分離して保持し、local filesystem authority はWorkerFilesystemAuthority::{None, Local(LocalWorkingDirectory)}に閉じ込めた。 - Worker constructors / restore / spawn paths を workspace context と filesystem authority の分離形に更新した。
- Runtime 側に
RuntimeWorkspaceBackendRefを追加し、host-owned local backend binding から narrow Worker workspace context を注入するようにした。 workspace_id/clientが存在しても local filesystem authority を意味しないようにした。- no-filesystem Workers では memory/workflow local layouts を workspace path fallback せず unavailable/fail-closed にした。
- legacy metadata
workspace_rootは compatibility/local filesystem hint として、WorkerFilesystemAuthority::Local由来の場合だけ扱うようにした。 - tests で path-free workspace identity/client と local cwd/root の分離、filesystem authority なしの workspace client、local path-returning Worker workspace accessor 不在、constructor/restore/spawn behavior を確認した。
Review:
- Reviewer approved with no blockers。
- Evidence included path-free Worker context, no Worker
workspace_root()accessor, Runtime/host backend materialization boundary, workspace-client-without-filesystem tests, fail-closed local workspace features, and legacy metadata confinement。 - Non-blocking note:
set_active_with_workspace_contextpreserves existing metadata fields when passedNone; future no-workspace reuse of an existing Pod name may want explicit clearing semantics to avoid stale UI hints。
Merge / validation:
- Merge commit:
391f11fc merge: workspace backend worker context。 - Final validation passed:
rg -n 'workspace_root' crates/worker crates/worker-runtime crates/client crates/workspace-server || truerg -n 'worker\\.workspace_root|pub fn workspace_root|fn workspace_root' crates/worker crates/worker-runtime crates/client crates/workspace-server || truegit diff --checkcargo test -p worker --lib --testscargo test -p worker-runtime --features ws-server,fs-storecargo test -p yoi-workspace-server --libcargo check -p yoicd web/workspace && deno task checkcd web/workspace && deno task testyoi ticket doctornix build .#yoi --no-link
- Validation log:
/run/user/1000/yoi/yoi-orchestrator/bash-output/workspace-backend-final-validation-1783732052.txt