25 KiB
作成
LocalTicketBackend によって作成されました。
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_or_missing_authority
Reason:
- Dashboard Queue により人間が Orchestrator routing を許可した queued Ticket として確認した。
- Ticket body は Worker runtime registry / overview reporting / runtime capability / identity / visibility / raw-session boundary / local Pod runtime migration を具体的に列挙しており、実装意図と受け入れ条件は implementation-ready に近い。
TicketRelationQueryでは blocking relation は 0 件、初回TicketOrchestrationPlanQueryでは既存 plan record は 0 件だった。- ただし現在
00001KVTNAY20(Abstract Workspace Worker runtime spawn operations) がinprogressで、同じLocalRuntimeBridge/ Workspace Worker runtime abstraction / runtime identity・cwd 境界とcrates/workspace-server/src/hosts.rs周辺を扱っている。 00001KVTNAY20は multi-agent startup が provider/runtime error で停止しており、implementation worktree は clean だが Coder sibling capacity が実質利用できない状態である。- この Ticket を今
queued -> inprogressにすると、同じ runtime abstraction の registry 側と spawn 側を別 branch で同時に固定して conflict risk が高い。さらに Coder/Reviewer loop を起動できないため、acceptance 後に進められない。
Evidence checked:
- Ticket body / thread:
00001KVWECEQGの item/thread。thread は create、planning->ready、ready->queued のみで未解決 planning question は記録されていない。 - Relations / orchestration plan:
00001KVWECEQGは relation 0 件、既存 plan 0 件。routing 中にorch-plan-20260624-092429-1(do_not_parallelizewith00001KVTNAY20) とorch-plan-20260624-092435-2(waiting capacity note) を記録した。 - Related Ticket:
00001KVTNAY20はinprogress、accepted plan と waiting-capacity note があり、Coder Pod startup/provider failure により実装未開始。 - Workspace state:
/home/hare/Projects/yoi/.worktree/orchestrationは clean。既存 implementation worktree/home/hare/Projects/yoi/.worktree/00001KVTNAY20-worker-runtime-spawnは clean ata729d686。 - Visible Pods:
yoi, currentyoi-orchestrator, and stopped/restorable failedyoi-coder-00001KVTNAY20-worker-runtimemetadata only; active usable Coder/Reviewer sibling は無い。
Decision:
00001KVWECEQGは planning へ戻さない。Ticket の missing decision / missing information は現時点で具体化していない。- ただし
queued -> inprogressacceptance は行わず、queued のまま待機させる。 - Blocker は Ticket 要件ではなく、(1)
00001KVTNAY20との runtime abstraction/code-surface conflict、(2) Coder sibling runtime/provider capacity failure。
Next action:
- 先に
00001KVTNAY20の Coder runtime/provider blocker を解消して multi-agent workflow を再開する、または人間が Orchestrator direct implementation / ordering を明示的に許可する。 - その後、この Ticket を再 routing し、必要なら
00001KVTNAY20の実装結果に合わせて registry abstraction の IntentPacket を作る。
Decision
Routing decision: implementation_ready
Reason:
- ユーザーから「進めて」と明示 follow-up があり、以前
queuedのまま待機させた blocker を再確認した。 - Ticket body は Worker runtime registry / overview reporting / runtime capability / identity / visibility / raw-session boundary / local Pod runtime migration を具体的に列挙しており、observable な acceptance criteria と reviewer focus がある。
TicketRelationQueryは blocking relation 0 件。- 以前の
do_not_parallelize/ waiting-capacity note は00001KVTNAY20がdoneになり、merge/validation 済みになったことで解消済みとして扱える。 - 現在の
crates/workspace-server/src/hosts.rsには00001KVTNAY20の結果としてWorkspaceWorkerRuntime、typed spawn/stop/proxy request/result、local Pod metadata overview が入り、今回の registry/capability/overview abstraction をその上に重ねられる。残る不確実性は local tactic / bounded investigation に収まる。 - orchestration worktree は clean で、同一 Ticket 用 worktree/branch はまだ無い。
Evidence checked:
- Ticket body / thread:
00001KVWECEQGの item/thread。前回 routing decision 以降の missing planning question はなし。 - Relations / orchestration plan: relation 0 件。既存 plan は前回の
do_not_parallelize/ waiting-capacity と、今回記録した accepted planorch-plan-20260624-103655-3。 - Related Ticket:
00001KVTNAY20はdone。review approve、orchestration merge、validation success、child cleanup 済み。 - Code map:
crates/workspace-server/src/hosts.rs,crates/workspace-server/src/server.rsを current orchestration branch で確認。 - Workspace state:
/home/hare/Projects/yoi/.worktree/orchestrationは clean。
IntentPacket:
Intent:
- Workspace backend の Worker runtime surface を、single local bridge から registry / host / capability / overview reporting の境界へ抽象化し、Dashboard/API が runtime 一覧・worker 一覧・capability/diagnostic を安全に表示できる基盤を作る。
Binding decisions / invariants:
- registry/overview は local Pod metadata と role-session/runtime metadata の安全な summary を扱う。raw session contents や unchecked private/runtime paths を API response に出さない。
- Browser/API 由来の値を runtime authority として扱わない。worker/host id は backend が解決・検証した bounded identifier として扱う。
- runtime identity / workspace_root / process cwd / role-session claim は混同しない。
00001KVTNAY20で入った low-level launch boundary と Ticket/role/orchestration resolver separation を崩さない。- remote Host protocol、full scheduler、operation UI、stream/proxy 実装、permission/auth の完成、raw session inspection は non-goal。
Requirements / acceptance criteria:
- Worker runtime registry/service abstraction が、複数 runtime/host summary と capability/diagnostic reporting を表現できる。
LocalRuntimeBridge由来の local runtime が registry の一実装/entry として扱われ、API handler が concrete bridge に直接密結合しすぎない。- overview response は bounded/safe fields のみで、local Pod metadata failure や unavailable capability を diagnostic として返せる。
- existing
/api/hosts//api/workerssemantics を維持または明確に migration し、UI が使う shape を壊す場合は対応も含める。 - validation として少なくとも
cargo test -p yoi-workspace-server,cargo check -p yoi,cd web/workspace && deno task check && deno task build,git diff --checkを実施する。
Implementation latitude:
- registry trait/struct 名、module split、capability enum/string shape、diagnostic aggregation の詳細は coder が既存 code style に合わせて決めてよい。
- API の大規模追加ではなく、current endpoints の内部境界整理と typed overview/capability shape の初期導入を優先してよい。
- UI 変更は必要最小限でよい。既存 web build/typecheck を通すための追随は行ってよい。
Escalate if:
- Browser/API から raw path/session/executable/profile 等を受けないと実装できない。
- runtime registry を scheduler/lease/remote Host protocol として固定する必要が出る。
00001KVTNAY20の launch boundary を戻す/破る必要が出る。- raw session content や private metadata を overview に出す必要がある。
Validation:
cargo test -p yoi-workspace-servercargo check -p yoicd web/workspace && deno task check && deno task buildgit diff --check- 影響範囲に応じて追加 Rust tests。
Current code map:
- Primary:
crates/workspace-server/src/hosts.rs,crates/workspace-server/src/server.rs。 - Secondary: Workspace web API consumers under
web/workspace, role-session/local metadata helpers if needed,crates/client/src/spawn.rs/crates/client/src/ticket_role.rsonly to preserve boundaries. - Avoid: root/original workspace operations, unrelated Panel UI completion, remote Host protocol, scheduler/queue implementation, raw session reading.
Critical risks / reviewer focus:
- registry abstraction becoming a scheduler or authority layer by accident.
- leaking raw session/private paths/unchecked metadata into overview responses.
- host/worker ids derived from user-controlled strings without bounding/validation.
- breaking the launch boundary from
00001KVTNAY20. - conflating runtime workspace root, process cwd, role-session claim, and local metadata hints.
Next action:
queued -> inprogressを記録してから、worktree-workflow で/home/hare/Projects/yoi/.worktree/00001KVWECEQG-worker-runtime-registryを作成し、multi-agent-workflow で Coder/Reviewer sibling loop に進める。
State changed
Orchestrator acceptance: queued -> inprogress
- 直前確認で
TicketShowは statequeued、blocking relation は 0 件。 - 以前の blocker だった
00001KVTNAY20はdoneになり、orchestration branch に merge/validated 済み。 TicketOrchestrationPlanQueryでは過去の do_not_parallelize / waiting-capacity note と、今回の accepted planorch-plan-20260624-103655-3を確認した。過去 blocker は解消済みとして扱う。- routing decision と IntentPacket は Ticket thread に記録済み。
- これ以降に worktree-workflow で
/home/hare/Projects/yoi/.worktree/00001KVWECEQG-worker-runtime-registryを作成し、multi-agent-workflow に接続する。
Implementation report
Implementation orchestration update:
- worktree-workflow に従い、implementation worktree
/home/hare/Projects/yoi/.worktree/00001KVWECEQG-worker-runtime-registryと branchwork/00001KVWECEQG-worker-runtime-registryを作成した。 - child worktree では tracked
.yoiproject records を見える状態にし、.yoi/memory、local/runtime/log/lock/secret-like.yoipaths を sparse-checkout で除外する方針にした。 - Coder Pod
yoi-coder-00001KVWECEQG-worker-registryを sibling として起動した。write scope は child worktree に限定し、runtime workspace root/home/hare/Projects/yoiは startup 要件を満たすため non-recursive read のみにした。 - Coder には root/original workspace と orchestration worktree で read/write/validation/git operation を行わないよう明示した。
Implementation report
Implementation report:
実装概要:
crates/workspace-server/src/hosts.rsWorkerRuntimeRegistryを追加。WorkspaceWorkerRuntimetrait を runtime entry の抽象境界として再整理。- 既存 local Pod metadata 読み取りを
LocalPodRuntimeadapter として registry に登録。 RuntimeSummary,RuntimeCapabilitySummary,WorkerCapabilitySummary,WorkerWorkspaceSummary, typedRuntimeDiagnosticを追加。- API caller 由来の
host_id/worker_idを backend 側で bounded identifier として検証。 - raw session contents / socket path / metadata file path / raw workspace path を summary に出さないよう整理。
- metadata の
workspace_rootは runtime workspace identity との照合にだけ使い、API にはcurrent_workspacesummary として出す。 - 他 workspace / workspace_root missing の Pod metadata は通常 worker overview から除外し、typed diagnostic のみ返す。
- 先行 Ticket
00001KVTNAY20の low-level launch 境界用 typed request/intent/result shape は維持。
crates/workspace-server/src/server.rs- server state を
Arc<WorkerRuntimeRegistry>に変更。 /api/hosts,/api/workers,/api/hosts/{host_id}/workersを registry 経由に変更。/api/runtimesを追加し、runtime overview を返せるようにした。- invalid runtime identifier / unknown worker / unsupported capability の API error mapping を追加。
- server tests を registry source / runtime overview / safe summary 仕様に更新。
- server state を
crates/workspace-server/src/lib.rs- registry/worker/capability 用 error variant を追加。
crates/workspace-server/src/repositories.rs- shared typed diagnostic severity に合わせて更新。
web/workspace/src/lib/workspace-sidebar/types.ts- runtime / capability / worker workspace summary 型を更新。
- raw
workspace_root/ localpod_name前提を削除。
web/workspace/src/lib/workspace-pages/WorkspacePage.svelte- Host/Worker overview 表示を safe summary fields に合わせて更新。
Validation:
cargo test -p yoi-workspace-server: successcargo check -p yoi: successcd web/workspace && deno task check: successcd web/workspace && deno task build: successgit diff --check: success
Commit:
9bd15507 feat: add worker runtime registry overview
Residual risks / notes:
- remote Host protocol / scheduler / stream proxy / worker control operation は non-goal のまま、typed capability/diagnostic で unsupported/pending を返す境界に留めた。
- API response から raw workspace/session/private path は出さない方針に寄せたため、UI は workspace path ではなく
current_workspacescope/identity summary を表示する。 nix build .#yoi --no-linkは Cargo/Deno validation が通過済みだが、最終統合 confidence を上げる場合は Orchestrator 側判断で実行可能。
Review: request changes
Review result: request_changes
確認範囲:
- child worktree
/home/hare/Projects/yoi/.worktree/00001KVWECEQG-worker-runtime-registryのみで read-only inspection。 - Ticket
item.md/thread.md/ orchestration plan、371fd7c6..HEADの差分、主にcrates/workspace-server/src/hosts.rs/server.rs/ web 型・表示を確認。 - read-only のため、テスト・ビルド・
git diff --checkは実行していない。
良い点:
WorkspaceWorkerRuntimetrait、WorkerRuntimeRegistry、LocalPodRuntimeが導入され、WorkspaceApiはArc<WorkerRuntimeRegistry>を保持し、/api/hosts//api/workers//api/hosts/{host_id}/workers/ 新規/api/runtimesが registry 経由になっている。HostSummary/WorkerSummaryは rawworkspace_root/ metadata path / socket path / raw session を直接返さない形に整理されており、UI 側も新しい safe summary shape に追随している。- spawn/stop/proxy/stream は unsupported/reserved の型・diagnostic に留めており、scheduler / remote host protocol / raw session ingest には踏み込んでいない。
Blockers:
- worker detail/lookup の id 解決が opaque id 境界を満たしていない。
worker_id_for_pod()はpod_nameを sanitize/lowercase/truncate してlocal-pod-*を作る一方、LocalPodRuntime::worker()はlocal-pod-を strip した値をそのままpod_root/<pod_name>/metadata.jsonのディレクトリ名として使っている。- 実 Pod 名に大文字、
.などの置換対象文字、truncate 対象が含まれると、list_workers()が返したworker_idから同じ Worker を lookup できない。 - Yoi の実 Pod 名には Ticket ID 由来の大文字を含むものがあり得るため現実的に壊れる。これは Ticket の「worker detail / lookup」「
pod_nameを external operation key にしない」「worker_id は backend が解決する opaque id」という要件に反する。
- id の bounded/unique 性が full id に対して保証されていない。
sanitize_identifier()は fragment を最大 120 にするが、local-pod-/local-prefix 付与後の id はvalidate_backend_identifier()のMAX_IDENTIFIER_LEN = 120を超え得る。- sanitize による衝突(例:
foo.barとfoo-bar)も避けられていない。将来 detail endpoint や operation routing を足した時に、一覧で返した id が lookup/validation で拒否される・別 Worker に衝突するリスクがある。
Required fixes:
worker_idは返却後に確実に backend で再解決できる opaque/stable id にする。raw pod name を authority として外へ出さず、scan した metadata/dir entry からgenerated_worker_id -> actual pod dirを backend 内で照合する、または衝突しない hash/digest を含める。MAX_IDENTIFIER_LENは prefix を含む full id に対して満たすようにし、生成側と検証側の不一致をなくす。- 大文字 Ticket ID を含む Pod 名、
.など sanitize される Pod 名、長い Pod 名、衝突ケースについて、list_workers()が返したworker_idをregistry.worker()/LocalPodRuntime::worker()で引けるテストを追加する。
Non-blocking note:
- Ticket acceptance には
nix build .#yoi --no-linkも含まれている一方、coder 報告にはない。必要なら修正後に Orchestrator 判断で実施・明示すること。
Implementation report
Follow-up implementation report after review request_changes:
対応内容:
worker_idを raw Pod dir 名から逆算する実装を廃止した。LocalPodRuntime::worker()は Pod registry を backend 側で scan し、生成済み opaqueworker_idと実 Pod dir を照合して解決する。- API caller が渡す
worker_idは raw path / raw Pod name authority ではなく、backend-resolved identifier として扱う。
worker_id/host_idの生成を bounded + collision-resistant に変更した。- prefix を含む full id が
MAX_IDENTIFIER_LEN = 120以下になるよう制御。 sha2digest の短縮 hex を suffix として含め、foo.bar/foo-barや長大名 truncation による collision を避ける。- 生成 id は既存 validation を通る形式に限定。
- prefix を含む full id が
- focused tests を追加・更新した。
- uppercase Ticket-ID-like Pod name。
./@/#等の sanitized char。foo.barvsfoo-barcollision case。- long/truncated names。
list_workers()が返す id をregistry.worker()/LocalPodRuntime::worker()に渡して解決できること。- id が bounded / validation-compatible / duplicate-free であること。
変更ファイル:
Cargo.lockcrates/workspace-server/Cargo.tomlcrates/workspace-server/src/hosts.rscrates/workspace-server/src/server.rs
Validation:
cargo test -p yoi-workspace-server: successcargo check -p yoi: successcd web/workspace && deno task check: successcd web/workspace && deno task build: successgit diff --check: success
Commit:
38d25582 fix: make worker runtime ids resolvable
Residual risks / notes:
sha2.workspace = trueをyoi-workspace-serverに追加したため、Cargo.lockの workspace-server dependency entry が更新された。- raw session/private path leak、scheduler/remote protocol scope creep、
00001KVTNAY20の low-level launch boundary は維持している。
Review: approve
Review result: approve
確認内容:
- child worktree のみで
9bd15507..HEADfix diff と必要箇所の現行実装を read-only 確認。 - ビルド/テストは read-only 指示のため再実行せず、coder 報告を参照。
判断:
- 以前の blocker 2件は解消されている。
根拠:
LocalPodRuntime::worker()はlocal-pod-strip で raw Pod dir 名へ戻す実装をやめ、pod_names()で registry を scan し、各 actual Pod dir name から生成したworker_id_for_pod()と照合して backend 内部で解決する形になっている。これにより、大文字・記号・sanitize 対象文字を含む Pod 名でも list→lookup が成立する。worker_id_for_pod()/host_id_for_workspace()はbounded_backend_identifier()経由になり、prefix を含む full id がMAX_IDENTIFIER_LEN内に収まるよう body を切り詰め、SHA-256 digest suffix を付けて sanitize/truncation collision を避ける設計になっている。- 追加テストで Ticket-like uppercase Pod 名、
./-collision、#/@、長い Pod 名、duplicate-free、validation-compatible、registry/runtime lookup roundtrip がカバーされている。 - raw metadata path / socket path / workspace root / raw session を overview API に出さない方針、registry 経由の read-only API、spawn/stop/proxy 非実装の unsupported 境界は維持されている。
Non-blocking notes:
worker_idは sanitize 済み body を含むため完全な無意味 IDではないが、操作キーとしては backend 解決の opaque id になっており、今回の Ticket 意図には十分合っている。- reported validation は通過とのことだが、reviewer では再実行していない。
Implementation report
Integration outcome:
- Coder
yoi-coder-00001KVWECEQG-worker-registryが implementation branchwork/00001KVWECEQG-worker-runtime-registryに実装を commit した。 - Reviewer
yoi-reviewer-00001KVWECEQG-worker-registryは初回 review でworker_idopaque lookup / bounded unique id の blocker を指摘し、Coder が38d25582 fix: make worker runtime ids resolvableで修正した。 - Follow-up review は
approve。LocalPodRuntime::worker()の backend 内部 scan/照合、bounded digest 付き id 生成、list→lookup roundtrip tests、raw path/session 非公開、unsupported capability boundary が確認された。 - Orchestrator worktree
/home/hare/Projects/yoi/.worktree/orchestrationで branchwork/00001KVWECEQG-worker-runtime-registryを merge 済み。- merge commit:
1251c0ca merge: 00001KVWECEQG worker runtime registry - implementation commit:
9bd15507 feat: add worker runtime registry overview - fix commit:
38d25582 fix: make worker runtime ids resolvable
- merge commit:
sha2.workspace = true追加によりCargo.lockが変わったため、Nix package cargoHash を更新した。- package hash commit:
b975812c nix: update yoi cargo hash
- package hash commit:
Validation in Orchestrator worktree:
cargo test -p yoi-workspace-server: successcargo check -p yoi: successcd web/workspace && deno task check: successcd web/workspace && deno task build: successgit diff --check: successnix build .#yoi --no-link: success after updatingpackage.nixcargoHash tosha256-rR8mrMDg1CCXb3Y5MnhUqSd0vAsI5OStFQCRIrvx8fg=
Notes:
- Initial
nix build .#yoi --no-linkfailed only because cargoHash was stale after the new dependency; this was fixed and revalidated. - Reviewer non-blocking note: generated
worker_idstill includes a sanitized body fragment, but as an operation key it is now backend-resolved opaque id and acceptable for this Ticket.
Next action:
- Mark Ticket done after this integration/validation evidence.
- Then stop related child Pods and remove only the child implementation worktree/branch.
State changed
Implementation is merged into the orchestration branch and validated.
Evidence:
- merge commit:
1251c0ca merge: 00001KVWECEQG worker runtime registry - package hash commit:
b975812c nix: update yoi cargo hash - reviewer result: approve after requested changes were fixed
- validation in
/home/hare/Projects/yoi/.worktree/orchestrationsucceeded:cargo test -p yoi-workspace-servercargo check -p yoicd web/workspace && deno task checkcd web/workspace && deno task buildgit diff --checknix build .#yoi --no-link
Closure is not performed here; this state records implementation completion after merge/validation.
State changed
Ticket を closed にしました。
完了
Implemented, reviewed, marked done, and merged into develop.