ticket: request changes on websocket bounds
This commit is contained in:
parent
27f6b3366c
commit
519730e7d3
|
|
@ -2,7 +2,7 @@
|
||||||
title: 'Plugin: URL 権限ベースの WebSocket host API を実装する'
|
title: 'Plugin: URL 権限ベースの WebSocket host API を実装する'
|
||||||
state: 'inprogress'
|
state: 'inprogress'
|
||||||
created_at: '2026-06-21T07:11:34Z'
|
created_at: '2026-06-21T07:11:34Z'
|
||||||
updated_at: '2026-06-21T12:33:03Z'
|
updated_at: '2026-06-21T12:43:06Z'
|
||||||
assignee: null
|
assignee: null
|
||||||
readiness: 'implementation_ready'
|
readiness: 'implementation_ready'
|
||||||
risk_flags: ['plugin', 'host-api', 'websocket', 'service', 'ingress', 'lifecycle', 'permissions', 'security', 'persistence']
|
risk_flags: ['plugin', 'host-api', 'websocket', 'service', 'ingress', 'lifecycle', 'permissions', 'security', 'persistence']
|
||||||
|
|
|
||||||
|
|
@ -324,3 +324,74 @@ Reviewer focus:
|
||||||
Orchestrator will wait for reviewer verdict before integration。
|
Orchestrator will wait for reviewer verdict before integration。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
<!-- event: review author: yoi-reviewer-00001KVMGAEJN-r1 at: 2026-06-21T12:43:06Z status: request_changes -->
|
||||||
|
|
||||||
|
## Review: request changes
|
||||||
|
|
||||||
|
Verdict: `request_changes`
|
||||||
|
|
||||||
|
確認範囲:
|
||||||
|
- Diff `3eac7f8e..ce62d235` in worktree `/home/hare/Projects/yoi/.worktree/00001KVMGAEJN-plugin-websocket-host-api`:
|
||||||
|
- `Cargo.lock`
|
||||||
|
- `crates/manifest/src/plugin.rs`
|
||||||
|
- `crates/pod/Cargo.toml`
|
||||||
|
- `crates/pod/src/feature/plugin.rs`
|
||||||
|
- `crates/pod/src/pod.rs`
|
||||||
|
- `crates/yoi/src/plugin_cli.rs`
|
||||||
|
- `docs/development/plugin-development.md`
|
||||||
|
- `package.nix`
|
||||||
|
- `resources/plugin/wit/deps/yoi-host/yoi-host-v1.wit`
|
||||||
|
- `resources/plugin/wit/yoi-plugin-instance-v1.wit`
|
||||||
|
- `resources/plugin/wit/yoi-plugin-tool-v1.wit`
|
||||||
|
- Ticket authority:
|
||||||
|
- `.yoi/tickets/00001KVMGAEJN/item.md`
|
||||||
|
- `.yoi/tickets/00001KVMGAEJN/thread.md`
|
||||||
|
|
||||||
|
Blocking issue:
|
||||||
|
|
||||||
|
1. WebSocket open が実際には bounded / cancellable ではなく、open-connection limit も network I/O 後にしか適用されていない。
|
||||||
|
|
||||||
|
Evidence:
|
||||||
|
- `crates/pod/src/feature/plugin.rs:922-931`
|
||||||
|
- `execute_plugin_websocket_open` は URL/grant validation 後に `client.open(...)` を呼び、その後で handle table に insert している。
|
||||||
|
- `crates/pod/src/feature/plugin.rs:2536-2558`
|
||||||
|
- `TungstenitePluginWebSocketClient::open` は最初に `tungstenite::client::connect_with_config(...)` を呼ぶ。
|
||||||
|
- `set_system_websocket_timeouts(...)` は connection established 後にしか呼ばれない。
|
||||||
|
- `crates/pod/src/feature/plugin.rs:2687-2698`
|
||||||
|
- `PLUGIN_WEBSOCKET_MAX_OPEN_CONNECTIONS` は `PluginWebSocketHandleTable::insert` 内で check されるため、`client.open(...)` 完了後、つまり network I/O 後にしか適用されない。
|
||||||
|
|
||||||
|
Implications:
|
||||||
|
- DNS/TCP/TLS/WebSocket handshake が Yoi の WebSocket timeout 適用前に OS/library behavior に従って block し得る。
|
||||||
|
- `PLUGIN_WASM_TIMEOUT` wrapper は plugin Tool execution に timeout を返すが、spawned blocking task の open 自体は cancel しないため background で継続し得る。
|
||||||
|
- handle table が満杯でも、新しい outbound WebSocket connection を開いた後で reject するため、max open connections の resource-bound intent を破り、意図しない network side effect が発生し得る。
|
||||||
|
|
||||||
|
Why this blocks:
|
||||||
|
- Ticket は WebSocket API に bounded handle lifetime、max open connections、timeout/cancellation behavior、cleanup を要求している。
|
||||||
|
- capacity / timeout / cancellation の enforcement が network I/O 前に fail closed していないため、この acceptance criteria を満たしていない。
|
||||||
|
|
||||||
|
Required fix:
|
||||||
|
- Network I/O 前に capacity を reserve/check する。
|
||||||
|
- Open path を bounded/cancellable にする、または bound を保証できない場合は dialing 前に fail closed する。
|
||||||
|
- Timeout/cancellation/resource-bound semantics を tests で固定する。
|
||||||
|
|
||||||
|
Non-blocking concerns:
|
||||||
|
- WebSocket host API は component/tool WIT surface に追加され、raw helper path tests はあるが、「long-lived WebSocket connection を Tool call 内に隠さず Plugin instance/Service lifecycle として扱う」という Ticket invariant を pin する integration test/diagnostic は見当たらなかった。現行 Plugin instance が Tool/Service state を共有するなら許容可能だが、lifecycle boundary の regression test/diagnostic があるとより明確。
|
||||||
|
- `close_all` / drop cleanup と component `stop` cleanup はあるが、active blocking host calls は blocking operation が戻るまで handle-table mutex を保持し得る。これは open timeout/cancellation blocker の副次的問題。
|
||||||
|
|
||||||
|
Reviewer validation:
|
||||||
|
- `cargo fmt --check`: passed
|
||||||
|
- `git diff --check 3eac7f8e..HEAD`: passed
|
||||||
|
- `cargo test -p manifest websocket`: passed
|
||||||
|
- `cargo test -p pod websocket`: passed, 6 focused pod WebSocket tests
|
||||||
|
- `cargo test -p yoi render_show_distinguishes_request_grant_statuses_and_broad_targets`: passed
|
||||||
|
- `cargo test -p manifest request_host_api_manifest_and_grant_parse_with_request_names`: passed
|
||||||
|
- `cargo check -p manifest -p pod -p yoi`: passed
|
||||||
|
- `cargo run -p yoi -- ticket doctor`: passed (`doctor: ok`)
|
||||||
|
- `nix build .#yoi --no-link`: passed; reviewer did not reproduce earlier disk-space failure。
|
||||||
|
- Boundary/stale grep over docs/resources/manifest/pod/yoi CLI for `host_api.request`, `host_api.websocket`, WebSocket/SSE, hidden context/history, Dashboard/Ticket/Discord/reconnect terms found no hidden context injection, Ticket mutation, Dashboard channel, reconnect daemon, or Discord-specific overreach in inspected changes。
|
||||||
|
|
||||||
|
Worktree status:
|
||||||
|
- Clean on `impl/00001KVMGAEJN-plugin-websocket-host-api`。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user