18 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: implementation_ready
Reason:
- ユーザーから「続けて」と明示 follow-up があり、queued dependency chain の次 Ticket として再確認した。
00001KVXK0WE4は host-owned WebSocket driver の concrete slice で、Discord protocol、full reconnect/resume policy、secret store/auth injection、browser-facing WebSocket API、WIT/PDK templates update は non-goal として分離されている。- outgoing
depends_onは00001KVXK0WDQと00001KVXK0WDXだが、両方とも done / merged / reviewed / validated 済み。TicketShowderived blockers は空で、implementation acceptance blocker は残っていない。 - incoming dependent
00001KVXK0WEAは WIT/PDK/templates update で、この Ticket 完了後に進めるべき後続であり、この Ticket の acceptance blocker ではない。 - bounded context check で current
crates/pod/src/feature/plugin.rsに existing pullhost_api.websockethelpers、WebSocket grants/allowlist、Plugin Service lifecycle / ingress queue、Service output command model が存在することを確認した。Ticket の残る不確実性は host-owned connection driver / frame-to-ingress / output command send integration の local implementation に閉じる。
Evidence checked:
- Ticket body / thread:
item.md,thread.md。未解決 planning question は記録されていない。 - Relations / orchestration plan: outgoing depends_on
00001KVXK0WDQと00001KVXK0WDXは done。routing 前 plan は historical blocked_by records 2 件で、prerequisites 完了により解消済み。accepted planorch-plan-20260625-062148-3を記録済み。 - Related Tickets:
00001KVXK0WDQand00001KVXK0WDXare done. - Code context:
crates/pod/src/feature/plugin.rsの WebSocket allowlist/grants, existing pull API helpers, Plugin Service ingress queue, output command model。 - Workspace state:
/home/hare/Projects/yoi/.worktree/orchestrationは clean。inprogress Ticket は 0 件。
IntentPacket:
Intent:
- Service Plugin に紐づく host-owned WebSocket connection driver を追加し、incoming text frames を Plugin ingress queue に event として enqueue し、Service output command の
websocket_sendを grant-check 後に Host が送信できるようにする。
Binding decisions / invariants:
- Connection ownership is Host-side. Plugin code does not run a long-lived recv loop as recommended service path.
- Existing pull
host_api.websocket.recv(timeout)API may remain for compatibility/internal bounded use, but docs/recommended service integration path must move away from it. - WebSocket target authority is manifest declaration + enabled grant / allowlist. Unauthorized target/send fails closed.
- v0 handles text frames. Binary application payload is unsupported/diagnostic. ping/pong/close handling should be bounded/control/diagnostic, not app payload.
- Incoming frames are converted to service ingress events using existing bounded queue and lifecycle diagnostics.
- Outgoing sends use Service output command path from
00001KVXK0WDX; do not bypass its validation/grant boundary. - Full reconnect/resume policy, Discord/Slack protocol logic, secret injection design, browser-facing WebSocket API, WIT/PDK/templates update are non-goals.
Requirements / acceptance criteria:
- Host-owned WebSocket driver can manage a connection associated with a Service Plugin.
- Incoming text frames enqueue Plugin ingress events.
- Close/error/reconnect-needed states become ingress events or status diagnostics.
- Plugin output command can trigger WebSocket text send after grant checks.
- Ungranted send / unauthorized target is fail-closed diagnostic.
- Connection status, last frame time, last error, queue drops, send failures are visible in diagnostics/status.
- Tests cover driver lifecycle, incoming frame to ingress, send command execution/rejection, close/error diagnostics, and frame kind handling.
Implementation latitude:
- Exact struct names and whether tests use mock WebSocket client/connection or local bounded fake are coder choices.
- v0 may model reconnect-needed as diagnostic instead of automatic reconnect.
- Keep integration in
crates/pod/src/feature/plugin.rsunless a small helper module split is clearly cleaner.
Escalate if:
- Real network tests or external services are required.
- Secret store/auth injection becomes necessary.
- Durable cross-process queue or scheduler semantics are required.
- Implementing this requires WIT/PDK/template changes rather than Rust-side host runtime only.
- Browser-facing WebSocket API or protocol-specific Discord/Slack behavior is needed.
Validation:
cargo test -p podcargo check -p yoigit diff --checknix build .#yoi --no-link- Focused WebSocket driver / service ingress tests during development.
Current code map:
- Primary:
crates/pod/src/feature/plugin.rs。 - Secondary only if necessary: docs/development recommended path wording。
- Avoid: WIT/PDK/templates update (reserved for
00001KVXK0WEA), protocol-specific integrations, full reconnect policy, secret store, browser WebSocket API。
Critical risks / reviewer focus:
- hidden ambient network authority or bypassing manifest/grant allowlist。
- pull
recv(timeout)remaining as recommended long-lived service path。 - output command send bypassing Service command validation。
- unbounded reader task/queue or dropped diagnostics。
- tests that require real external network。
- scope creep into PDK/templates or protocol-specific behavior。
Next action:
queued -> inprogressを記録してから worktree-workflow で/home/hare/Projects/yoi/.worktree/00001KVXK0WE4-plugin-websocket-driverを作成し、multi-agent-workflow で Coder/Reviewer sibling loop に進める。
State changed
Orchestrator acceptance: queued -> inprogress
- 直前確認で
TicketShowは statequeued、derived blockers は空。 - outgoing dependencies
00001KVXK0WDQと00001KVXK0WDXは done / merged / reviewed / validated 済み。 - accepted plan
orch-plan-20260625-062148-3を確認した。 - routing decision と IntentPacket は Ticket thread に記録済み。
- これ以降に worktree-workflow で
/home/hare/Projects/yoi/.worktree/00001KVXK0WE4-plugin-websocket-driverを作成し、multi-agent-workflow に接続する。
Implementation report
Implementation orchestration update:
- prerequisite
00001KVXK0WDXが done になったため、00001KVXK0WE4を再 routing して受理した。 - worktree-workflow に従い、implementation worktree
/home/hare/Projects/yoi/.worktree/00001KVXK0WE4-plugin-websocket-driverと branchwork/00001KVXK0WE4-plugin-websocket-driverを作成した。 - child worktree では tracked
.yoiproject records を見える状態にし、.yoi/memory、local/runtime/log/lock/secret-like.yoipaths を sparse-checkout で除外する方針にした。 - Coder Pod
yoi-coder-00001KVXK0WE4-websocket-driverを 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:
- Ticket:
00001KVXK0WE4 - Branch/worktree:
work/00001KVXK0WE4-plugin-websocket-driver//home/hare/Projects/yoi/.worktree/00001KVXK0WE4-plugin-websocket-driver - Commit:
f2c51ffe399fc4eaa0ab4e4052867d55e534b229 - Commit message:
feat: add plugin websocket service driver
変更ファイル:
crates/pod/src/feature/plugin.rs- Service Plugin 用の host-owned WebSocket driver を追加。
ingress.sourcesのwebsocket:wss://.../ws(s)://...を Service WebSocket 接続として扱う実装を追加。- incoming text frame を既存の bounded Service ingress queue へ
websocket_textevent として enqueue。 - close/error を
websocket_close/websocket_erroringress event と status diagnostic に反映。 websocket_sendService output command を host-owned connection 経由の text send に接続。- manifest declaration + enabled grant / allowlist を通らない open/send は fail-closed。
- status に connection state、last frame time、last error、received/sent count、queue drops、send failures を追加。
- driver lifecycle / incoming / send success / send rejection / send failure / close-error diagnostics / binary-like frame error の focused tests を追加。
docs/development/plugin-development.md- Service Plugin の推奨 WebSocket integration を、guest long-lived recv loop ではなく host-owned Service WebSocket driver +
websocket_sendoutput command に更新。
- Service Plugin の推奨 WebSocket integration を、guest long-lived recv loop ではなく host-owned Service WebSocket driver +
検証結果:
cargo test -p pod --lib websocket_: success (14 passed)cargo test -p pod --lib service_output_command: success (4 passed)cargo check -p pod: successcargo check -p yoi: successgit diff --check: successnix build .#yoi --no-link: success- Nix dirty warning は worktree の ignored
target/によるもので、tracked changes はなし。
- Nix dirty warning は worktree の ignored
cargo test -p pod: failed only in known prompt guidance snapshot tests outside this Ticket (438 passed; 2 failed)prompt::catalog::tests::pod_orchestration_guidance_section_renders_resource_bodyprompt::system::tests::pod_orchestration_guidance_is_included_for_pod_management_tools
Residual risks / notes:
- v0 は自動 reconnect/resume policy を実装せず、close/error は diagnostic/event 化に留めている。
- Service WebSocket source の manifest 表現は既存
ingress.sourcesの文字列規約として追加。WIT/PDK/templates 更新は Ticket00001KVXK0WEA側に残している。 - 実ネットワーク test は non-goal のため、mock WebSocket client/connection による bounded focused tests で検証している。
Review: approve
Review result: approve
読み取り専用で Ticket / IntentPacket / 62e467c0..HEAD diff を確認した。Ticket review 記録・merge・close・検証コマンド実行は reviewer では行っていない。
確認した証拠:
- 変更範囲は
crates/pod/src/feature/plugin.rsとdocs/development/plugin-development.mdのみで、WIT / PDK / templates へのスコープ拡大はない。 - Host-owned Service WebSocket driver:
- Service/Ingress 有効時に
ingress.sourcesからwebsocket:/ws(s)://source を subscription 化している。 - instance start 後に host 側で connection start し、reader thread を生成している。
- Service/Ingress 有効時に
- authority / fail-closed:
- open は
host_api.websocketpermission と manifest/grant allowlist を通した既存 validation を再利用している。 websocket_sendは Service output command envelope の validation/grant check 経由でのみ実行され、URL scheme/credentials/static target/manifest+grant allowlist を検査している。
- open は
- ingress queue / diagnostics:
- text frame は
websocket_textevent として既存deliver_ingresspath に渡され、失敗時は queue drop と diagnostic を記録する。 - close/error は
websocket_close/websocket_errorevent と status diagnostic に反映される。 - status には connection state, last frame, last error, received/sent counts, queue drops, send failures が出る。
- text frame は
- output command send:
PluginServiceOutputCommandKind::WebSocketSendが追加され、実行時は host-owned connection のsend_textに接続され、send failure diagnostic も記録する。
- docs:
recv(timeout)は bounded/internal/tool-style use として残しつつ、Service Plugin では host-owned Service WebSocket driver +websocket_sendを推奨する文面に更新されている。
- tests:
- mock/fake client による incoming text/close、send success/failure、unauthorized target、receive error/binary相当 diagnostic のテストが追加されている。
検証状況:
- reviewer は cargo/nix 等を実行していない(read-only / no writes 指示のため)。
- diff・対象コード・Ticket acceptance を静的確認し、coder 報告の
cargo check/ focused tests / nix build 結果を前提証跡として扱った。
Non-blocking notes:
docs/development/plugin-development.mdの “Current status” 付近にはまだ Service/Ingress/WebSocket を future work と読む余地が残っているが、本 Ticket の受け入れ条件である「pull recv を recommended service path にしない」は満たしている。後続の docs/PDK/templates Ticket で整理するとよい。- close/error event の enqueue 失敗は text frame のような queue-drop counter には載せていないが、status diagnostic は記録されるため今回の acceptance 上は blocker ではない。
Implementation report
Integration outcome:
- Coder
yoi-coder-00001KVXK0WE4-websocket-driverが implementation branchwork/00001KVXK0WE4-plugin-websocket-driverに実装を commit した。- implementation commit:
f2c51ffe feat: add plugin websocket service driver
- implementation commit:
- Reviewer
yoi-reviewer-00001KVXK0WE4-websocket-driverは read-only review でapprove。host-owned connection authority、manifest/grant allowlist、ingress queue integration、websocket_sendcommand validation、status diagnostics、scope creep なしを確認した。 - Orchestrator worktree
/home/hare/Projects/yoi/.worktree/orchestrationで branchwork/00001KVXK0WE4-plugin-websocket-driverを merge 済み。- merge commit:
b9e786e1 merge: 00001KVXK0WE4 plugin websocket driver
- merge commit:
Implemented behavior:
crates/pod/src/feature/plugin.rsに Service Plugin 用 host-owned WebSocket driver を追加。ingress.sourcesのwebsocket:wss://.../ws(s)://...source を Service WebSocket connection として扱う。- incoming text frame を existing bounded Service ingress queue へ
websocket_textevent として enqueue。 - close/error は
websocket_close/websocket_errorevent と status diagnostic に反映。 websocket_sendService output command は host-owned connection 経由の text send に接続。- manifest declaration + enabled grant / allowlist を通らない open/send は fail-closed。
- status に connection state, last frame time, last error, received/sent counts, queue drops, send failures を追加。
docs/development/plugin-development.mdの Service Plugin 推奨 WebSocket integration を host-owned driver +websocket_sendoutput command に更新。
Validation in Orchestrator worktree:
cargo test -p pod --lib websocket_: successcargo test -p pod --lib service_output_command: successcargo check -p pod: successcargo check -p yoi: successgit diff --check: successnix build .#yoi --no-link: successcargo test -p pod: failed only in known prompt guidance snapshot assertions outside this Plugin diff:prompt::catalog::tests::pod_orchestration_guidance_section_renders_resource_bodyprompt::system::tests::pod_orchestration_guidance_is_included_for_pod_management_tools- Plugin/WebSocket focused tests in the same run passed.
Notes:
- Reviewer non-blocking note:
docs/development/plugin-development.mdの “Current status” 付近にはまだ Service/Ingress/WebSocket を future work と読む余地が残る。後続00001KVXK0WEAの docs/PDK/templates update で整理するのがよい。 - Reviewer non-blocking note: close/error event enqueue failure は text frame と同じ queue-drop counter には載らないが、status diagnostic は記録されるため blocker ではない。
- Follow-up
00001KVXK0WEAis dependency-unblocked and can be re-routed next.
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 with one unrelated known full-suite caveat.
Evidence:
- merge commit:
b9e786e1 merge: 00001KVXK0WE4 plugin websocket driver - reviewer result: approve
- validation in
/home/hare/Projects/yoi/.worktree/orchestration:cargo test -p pod --lib websocket_: successcargo test -p pod --lib service_output_command: successcargo check -p pod: successcargo check -p yoi: successgit diff --check: successnix build .#yoi --no-link: successcargo test -p pod: failed only in prompt guidance snapshot assertions outside this Plugin diff; Plugin/WebSocket-focused tests passed.
Closure is not performed here; this state records implementation completion after merge/review/focused validation.
State changed
Ticket を closed にしました。
完了
Implemented, reviewed, marked done, and merged into develop.