merge: sync orchestration before queue 00001KV5W3PJ3
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
---
|
||||
title: 'Plugin: execute Plugin Tool with minimal WASM runtime'
|
||||
state: 'inprogress'
|
||||
state: 'done'
|
||||
created_at: '2026-06-15T14:48:59Z'
|
||||
updated_at: '2026-06-17T09:50:53Z'
|
||||
updated_at: '2026-06-18T12:39:30Z'
|
||||
assignee: null
|
||||
readiness: 'implementation_ready'
|
||||
risk_flags: ['plugin', 'wasm', 'tool-runtime', 'sandbox', 'capability-boundary', 'cancellation']
|
||||
|
||||
@@ -128,3 +128,185 @@ State handling:
|
||||
- Ticket remains `inprogress` because acceptance and worktree side effects already happened; it is not silently returned to `queued`.
|
||||
|
||||
---
|
||||
|
||||
<!-- event: implementation_report author: yoi-orchestrator at: 2026-06-18T12:05:59Z -->
|
||||
|
||||
## Implementation report
|
||||
|
||||
Implementation resumed:
|
||||
|
||||
Previous `SpawnPod` failure was recovered after Orchestrator runtime refresh. Reused existing clean child worktree and successfully spawned Coder Pod.
|
||||
|
||||
Worktree:
|
||||
- `/home/hare/Projects/yoi/.worktree/00001KV5W3PHW-plugin-wasm-tool-runtime`
|
||||
- branch: `impl/00001KV5W3PHW-plugin-wasm-tool-runtime`
|
||||
|
||||
Coder Pod:
|
||||
- `yoi-coder-00001KV5W3PHW`
|
||||
|
||||
No duplicate `queued -> inprogress` transition was performed; this resumes the already accepted in-progress work.
|
||||
|
||||
---
|
||||
|
||||
<!-- event: implementation_report author: yoi-coder-00001KV5W3PHW at: 2026-06-18T12:31:01Z -->
|
||||
|
||||
## Implementation report
|
||||
|
||||
Implementation report from Coder Pod `yoi-coder-00001KV5W3PHW`:
|
||||
|
||||
Commit:
|
||||
- `10d12148 feat: run plugin tools through wasm runtime`
|
||||
|
||||
Changed files:
|
||||
- `Cargo.lock`
|
||||
- `crates/manifest/src/plugin.rs`
|
||||
- `crates/pod/Cargo.toml`
|
||||
- `crates/pod/src/feature/plugin.rs`
|
||||
- `package.nix`
|
||||
|
||||
Implemented behavior:
|
||||
- Added minimal sandboxed Plugin Tool WASM runtime using `wasmi`.
|
||||
- Enabled registered Plugin Tool calls now execute through normal `Tool::execute` / `ToolOutput` / `ToolResult` paths.
|
||||
- Added manifest-side helper to load resolved runtime module from pinned package:
|
||||
- validates runtime kind/ABI;
|
||||
- re-reads package from resolved path;
|
||||
- verifies deterministic package digest before selecting runtime entry;
|
||||
- bounds package/module size and reports safe diagnostics.
|
||||
- Added `yoi-plugin-wasm-1` host ABI:
|
||||
- required export: `yoi_tool_call()`;
|
||||
- required guest export: `memory`;
|
||||
- host imports under `yoi:tool` only:
|
||||
- `tool_name_len() -> i32`
|
||||
- `tool_name_read(ptr, len) -> i32`
|
||||
- `input_len() -> i32`
|
||||
- `input_read(ptr, len) -> i32`
|
||||
- `output_write(ptr, len) -> i32`
|
||||
- No WASI, filesystem, network, environment, or arbitrary host imports are provided; unsupported imports fail closed.
|
||||
|
||||
Bounds / failure behavior:
|
||||
- Input JSON bound: `64 KiB`.
|
||||
- Output JSON bound: `64 KiB`.
|
||||
- Output summary bound: `1 KiB`.
|
||||
- Linear memory bound: `2 MiB`.
|
||||
- Table bound: `256`.
|
||||
- Fuel bound: `5_000_000`.
|
||||
- Wall timeout: `1s`.
|
||||
- Diagnostics/errors are bounded and sanitized before surfacing as ordinary Tool errors.
|
||||
- Malformed input JSON, malformed output JSON, output schema mismatch, oversized output, missing runtime/package/module, unsupported imports, load failure, and non-terminating execution fail closed.
|
||||
|
||||
Tests added/updated cover:
|
||||
- Sample Plugin package Tool executes through WASM runtime.
|
||||
- Tool input JSON reaches the module.
|
||||
- Output JSON returns through ordinary Tool result path.
|
||||
- Malformed input JSON.
|
||||
- Malformed output JSON.
|
||||
- Output schema mismatch.
|
||||
- Oversize output.
|
||||
- Non-terminating/high-fuel execution fail closed.
|
||||
- Missing runtime/package/module diagnostic is safe and bounded.
|
||||
- No ambient WASI/fs/network/env import access.
|
||||
- Existing Plugin Tool registration behavior.
|
||||
|
||||
Validation reported by coder:
|
||||
- Passed: `cargo fmt --check`
|
||||
- Passed: `cargo check -p pod`
|
||||
- Passed: `cargo test -p manifest plugin::`
|
||||
- Passed: `cargo test -p pod feature::plugin`
|
||||
- Passed: `git diff --check`
|
||||
- Passed: `nix build .#yoi`
|
||||
- Passed: `nix build .#yoi --no-link`
|
||||
|
||||
Residual risks / notes:
|
||||
- ABI is intentionally minimal and not a general Plugin capability model.
|
||||
- Permission grants, richer host APIs, WASI-like APIs, per-plugin runtime configuration knobs, and schema-driven rich output contracts remain follow-up work.
|
||||
- Cancellation has no explicit `ToolExecutionContext` cancellation token today; this implementation provides safe timeout/fuel-bounded execution and maps timeout/join failure into ordinary Tool errors.
|
||||
|
||||
---
|
||||
|
||||
<!-- event: review author: yoi-reviewer-00001KV5W3PHW at: 2026-06-18T12:37:14Z status: approve -->
|
||||
|
||||
## Review: approve
|
||||
|
||||
Review result: approve
|
||||
|
||||
Evidence checked:
|
||||
- Child worktree のみ確認。
|
||||
- `/home/hare/Projects/yoi/.worktree/00001KV5W3PHW-plugin-wasm-tool-runtime`
|
||||
- implementation commit: `10d12148`
|
||||
- base: `d32fb3bc`
|
||||
- 変更箇所を確認。
|
||||
- `crates/pod/src/feature/plugin.rs`
|
||||
- `crates/manifest/src/plugin.rs`
|
||||
- `crates/pod/Cargo.toml`
|
||||
- `Cargo.lock`
|
||||
- `package.nix`
|
||||
- Read-only validation:
|
||||
- Passed: `git diff --check d32fb3bc..10d12148`
|
||||
|
||||
Acceptance review:
|
||||
- WASM runtime は `wasmi` を使い、WASI setup はなく、host import surface は `yoi_plugin_tool_v1` の最小 input/output 関数だけに限定されている。
|
||||
- `wasi_snapshot_preview1.fd_write` や `env.getenv` など ambient-style imports は拒否される。
|
||||
- Plugin Tools は ordinary `Feature` tool contribution / `ToolExecutor` path で `ToolOutput` / `ToolError` を返し、hidden context injection path は見当たらない。
|
||||
- module/input/output/summary/error/memory/table/stack/fuel などの bounds が実装されている。
|
||||
- malformed output、invalid UTF-8、schema mismatch、oversize output は `ToolError` として fail closed する。
|
||||
- runtime module selection は resolved plugin record、resolved package path、recorded digest、runtime kind/ABI、entry path に基づき、archive digest を再検証してから module bytes を使用している。
|
||||
- non-termination は fuel exhaustion と runtime timeout wrapper で fail closed する。現行 `ToolExecutionContext` に cancellation token がないため、明示的 cancellation-token integration がない点は、この Ticket の範囲では blocker ではないと判断した。
|
||||
- `wasmi` は `default-features = false` で `std` / `extra-checks` のみ、`wat` は dev-only。WASI/network/process capability library の追加は見当たらない。
|
||||
|
||||
Validation not run by reviewer:
|
||||
- `cargo test` / `cargo check` / `nix build` は read-only review scope では build artifacts を書くため未実行。Coder reported validation を evidence とした。
|
||||
|
||||
Risk assessment:
|
||||
- residual risk は低〜中程度。
|
||||
- sandbox boundary は Ticket scope に対して妥当。No WASI / no fs / no network / no env imports、bounded IO、bounded diagnostics、deterministic digest check がある。
|
||||
- `tokio::time::timeout` は `spawn_blocking` の実行中 task を強制 abort しないが、fuel により guest execution は有限化される。より強い cooperative cancellation semantics は Tool execution API/runtime cancellation model の follow-up として扱うべき。
|
||||
- Permission grants / richer host API authority は正しく未実装の follow-up に残っている。
|
||||
|
||||
Conclusion:
|
||||
- Approved. No blocker remains.
|
||||
|
||||
---
|
||||
|
||||
<!-- event: implementation_report author: yoi-orchestrator at: 2026-06-18T12:39:30Z -->
|
||||
|
||||
## Implementation report
|
||||
|
||||
Integration report:
|
||||
|
||||
Merged implementation branch into orchestration branch:
|
||||
- branch: `impl/00001KV5W3PHW-plugin-wasm-tool-runtime`
|
||||
- implementation commit: `10d12148 feat: run plugin tools through wasm runtime`
|
||||
- merge commit: `05cd788c merge: plugin wasm tool runtime`
|
||||
|
||||
Reviewer result:
|
||||
- `approve` recorded from `yoi-reviewer-00001KV5W3PHW`.
|
||||
|
||||
Validation in Orchestrator worktree `/home/hare/Projects/yoi/.worktree/orchestration`:
|
||||
- Passed: `cargo fmt --check`
|
||||
- Passed: `cargo check -p pod`
|
||||
- Passed: `cargo test -p manifest plugin::`
|
||||
- Passed: `cargo test -p pod feature::plugin`
|
||||
- 21 passed
|
||||
- Passed: `git diff --check`
|
||||
- Passed: `nix build .#yoi --no-link`
|
||||
|
||||
Outcome:
|
||||
- Enabled Plugin Tool calls now execute through minimal `wasmi` runtime with no WASI/fs/network/env host imports.
|
||||
- Runtime module selection is deterministic from resolved package path/digest/runtime config and rechecks package digest.
|
||||
- Tool input/output/errors are bounded and returned through ordinary Tool result/error path.
|
||||
- Missing/malformed/oversize/schema-mismatch/non-terminating execution fails closed with safe Tool errors.
|
||||
- Permission grants, richer host APIs, WASI-like APIs, and stronger cancellation-token integration remain follow-up scope.
|
||||
|
||||
Cleanup planned:
|
||||
- Stop related coder/reviewer Pods.
|
||||
- Remove only child implementation worktree/branch for this Ticket.
|
||||
|
||||
---
|
||||
|
||||
<!-- event: state_changed author: yoi-orchestrator at: 2026-06-18T12:39:30Z from: inprogress to: done reason: merged_validated field: state -->
|
||||
|
||||
## State changed
|
||||
|
||||
Reviewer approved, implementation branch merged into the orchestration branch, and focused plus packaging validation passed in the Orchestrator worktree. Marking Ticket done in the orchestration branch.
|
||||
|
||||
---
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
---
|
||||
title: 'Panel startup latency E2E を一覧データ描画完了基準に修正する'
|
||||
state: 'inprogress'
|
||||
state: 'done'
|
||||
created_at: '2026-06-15T16:44:06Z'
|
||||
updated_at: '2026-06-17T09:50:53Z'
|
||||
updated_at: '2026-06-18T12:25:14Z'
|
||||
assignee: null
|
||||
readiness: 'implementation_ready'
|
||||
risk_flags: ['panel', 'e2e', 'startup-latency', 'readiness-metric', 'ticket-list-rendering']
|
||||
|
||||
@@ -124,3 +124,161 @@ State handling:
|
||||
- Ticket remains `inprogress` because acceptance and worktree side effects already happened; it is not silently returned to `queued`.
|
||||
|
||||
---
|
||||
|
||||
<!-- event: implementation_report author: yoi-orchestrator at: 2026-06-18T12:05:59Z -->
|
||||
|
||||
## Implementation report
|
||||
|
||||
Implementation resumed:
|
||||
|
||||
Previous `SpawnPod` failure was recovered after Orchestrator runtime refresh. Reused existing clean child worktree and successfully spawned Coder Pod.
|
||||
|
||||
Worktree:
|
||||
- `/home/hare/Projects/yoi/.worktree/00001KV62PF32-panel-rows-ready-e2e`
|
||||
- branch: `impl/00001KV62PF32-panel-rows-ready-e2e`
|
||||
|
||||
Coder Pod:
|
||||
- `yoi-coder-00001KV62PF32`
|
||||
|
||||
No duplicate `queued -> inprogress` transition was performed; this resumes the already accepted in-progress work.
|
||||
|
||||
---
|
||||
|
||||
<!-- event: implementation_report author: yoi-coder-00001KV62PF32 at: 2026-06-18T12:19:45Z -->
|
||||
|
||||
## Implementation report
|
||||
|
||||
Implementation report from Coder Pod `yoi-coder-00001KV62PF32`:
|
||||
|
||||
Commit:
|
||||
- `fffdfd27 test: assert panel rows-ready fixture data`
|
||||
|
||||
Changed files:
|
||||
- `tests/e2e/src/lib.rs`
|
||||
- Added concrete `ExpectedPanelTicketRow` matcher.
|
||||
- Exposed fixture ready/planning Ticket ids/titles/states.
|
||||
- Added `wait_for_first_visible_frame`, `wait_for_fixture_ticket_rows_ready`, and delayed-row negative assertion helpers.
|
||||
- `tests/e2e/tests/panel.rs`
|
||||
- Replaced main startup readiness assertion from `rows.len() >= 2` / “full ready” to concrete ready fixture Ticket row readiness.
|
||||
- Added matcher regression test proving absent/wrong fixture data is rejected.
|
||||
- Added delayed reload assertion that first frame can arrive while fixture rows are still not rendered.
|
||||
- `crates/tui/src/multi_pod.rs`
|
||||
- Added comments clarifying `panel_ready` is first-visible-frame only, while `rows_rendered` snapshots are the data-backed readiness surface.
|
||||
|
||||
Behavior / evidence:
|
||||
- Main startup readiness now distinguishes:
|
||||
- first frame: legacy `panel_ready`, can be loading/empty;
|
||||
- rows ready: concrete `rows_rendered` containing expected fixture Ticket id/title/state/kind;
|
||||
- full/background completion: still observable via background task events, but no longer the startup readiness proxy.
|
||||
- Startup readiness assertion is no longer satisfied by first frame alone or by weak `rows.len() >= N` checks.
|
||||
- Delayed reload test asserts first visible frame can arrive while expected fixture Ticket row remains absent for the delayed window.
|
||||
|
||||
Validation reported by coder:
|
||||
- Passed: `cargo test -p yoi-e2e --features e2e --no-run`
|
||||
- Passed: `cargo test -p yoi-e2e --features e2e panel -- --nocapture`
|
||||
- Passed: `cargo check -p yoi-e2e -p yoi -p tui`
|
||||
- Passed: `cargo fmt --check`
|
||||
- Passed: `git diff --check`
|
||||
- Not run: `nix build .#yoi` — no runtime/package/dependency changes.
|
||||
|
||||
Measured values from focused post-commit reruns:
|
||||
- `panel_fixture_ticket_row_ready_has_startup_budget`
|
||||
- first visible frame: `20.403589ms` / budget `1.5s`
|
||||
- fixture rows ready: `120.605891ms` / budget `5s`
|
||||
- `panel_first_visible_render_arrives_before_background_reload`
|
||||
- first visible frame: `20.311085ms` / budget `1.5s`
|
||||
- reload held; test asserts ready fixture Ticket row remains absent for delayed window before exit.
|
||||
|
||||
Repository status:
|
||||
- Child implementation worktree clean at `fffdfd27`.
|
||||
|
||||
Residual gaps:
|
||||
- None known.
|
||||
|
||||
---
|
||||
|
||||
<!-- event: review author: yoi-reviewer-00001KV62PF32 at: 2026-06-18T12:24:00Z status: approve -->
|
||||
|
||||
## Review: approve
|
||||
|
||||
Review result: approve
|
||||
|
||||
Evidence checked:
|
||||
- 対象 worktree / branch / commit が期待通りで clean であることを確認。
|
||||
- branch: `impl/00001KV62PF32-panel-rows-ready-e2e`
|
||||
- HEAD: `fffdfd2721fed5171d4dd9780f893b9bb323ab8a`
|
||||
- base: `d32fb3bc3c82f1cb7e4a29d4fdf6e908ba495c7f`
|
||||
- Diff scope は以下3ファイルに限定されていることを確認。
|
||||
- `crates/tui/src/multi_pod.rs`
|
||||
- `tests/e2e/src/lib.rs`
|
||||
- `tests/e2e/tests/panel.rs`
|
||||
|
||||
Acceptance / intent review:
|
||||
- Main startup readiness は `panel_fixture_ticket_row_ready_has_startup_budget` で concrete fixture Ticket row readiness を待つ形になっている。
|
||||
- `rows.len() >= N` ではなく、fixture Ticket row の kind / id / title / status-state を matcher で確認している。
|
||||
- `panel_ready` / `wait_for_first_visible_frame` は first-visible-frame only としてコメント・helper 名で区別されている。
|
||||
- `wait_for_fixture_ticket_rows_ready` が startup rows-ready signal として定義されている。
|
||||
- `panel_fixture_ticket_row_matcher_rejects_absent_fixture_data` により absent/wrong fixture data を reject する挙動が確認されている。
|
||||
- delayed reload test は first frame が先に出る一方、held reload 中は expected fixture Ticket row が描画されないことを確認している。
|
||||
- 既存 Panel mouse / row selection E2E は残っており、action dispatch なし・mouse capture behavior の coverage は維持されている。
|
||||
- fixture isolation / no-provider / no-network 前提は維持されている。
|
||||
|
||||
Validation performed by reviewer:
|
||||
- Passed: `cargo fmt --check`
|
||||
- Passed: `git diff --check d32fb3bc..HEAD`
|
||||
|
||||
Validation not run by reviewer:
|
||||
- `cargo test` / `cargo check` は read-only review scope では build/artifact 書き込みを伴うため未実行。Coder reported validation を evidence として確認した。
|
||||
|
||||
Risk assessment:
|
||||
- residual risk は低い。変更は test/harness focused で Ticket boundary に沿っている。
|
||||
- timing test は環境依存性が残るが、readiness predicate は first frame/loading paint ではなく concrete fixture row rendering を測るよう修正されている。
|
||||
|
||||
Conclusion:
|
||||
- Approved. No blocker remains.
|
||||
|
||||
---
|
||||
|
||||
<!-- event: implementation_report author: yoi-orchestrator at: 2026-06-18T12:25:14Z -->
|
||||
|
||||
## Implementation report
|
||||
|
||||
Integration report:
|
||||
|
||||
Merged implementation branch into orchestration branch:
|
||||
- branch: `impl/00001KV62PF32-panel-rows-ready-e2e`
|
||||
- implementation commit: `fffdfd27 test: assert panel rows-ready fixture data`
|
||||
- merge commit: `226eca7a merge: panel rows-ready e2e`
|
||||
|
||||
Reviewer result:
|
||||
- `approve` recorded from `yoi-reviewer-00001KV62PF32`.
|
||||
|
||||
Validation in Orchestrator worktree `/home/hare/Projects/yoi/.worktree/orchestration`:
|
||||
- Passed: `cargo test -p yoi-e2e --features e2e --no-run`
|
||||
- Passed: `cargo test -p yoi-e2e --features e2e panel -- --nocapture`
|
||||
- panel E2E: 6 passed
|
||||
- first visible frame examples: ~20.34ms / budget 1.5s
|
||||
- fixture rows ready example: ~120.54ms / budget 5s
|
||||
- Passed: `cargo check -p yoi-e2e -p yoi -p tui`
|
||||
- Passed: `cargo fmt --check`
|
||||
- Passed: `git diff --check`
|
||||
|
||||
Outcome:
|
||||
- Startup readiness E2E now uses concrete fixture Ticket row render readiness instead of first visible/loading frame or weak row-count checks.
|
||||
- `panel_ready` remains first-visible-frame only; `rows_rendered` fixture row matching is the data-backed readiness surface.
|
||||
- Delayed reload coverage verifies first frame can arrive before rows-ready and expected fixture Ticket row remains absent while reload is held.
|
||||
- Existing Panel mouse/row selection E2E remains covered.
|
||||
|
||||
Cleanup planned:
|
||||
- Stop related coder/reviewer Pods.
|
||||
- Remove only child implementation worktree/branch for this Ticket.
|
||||
|
||||
---
|
||||
|
||||
<!-- event: state_changed author: yoi-orchestrator at: 2026-06-18T12:25:14Z from: inprogress to: done reason: merged_validated field: state -->
|
||||
|
||||
## State changed
|
||||
|
||||
Reviewer approved, implementation branch merged into the orchestration branch, and E2E-focused validation passed in the Orchestrator worktree. Marking Ticket done in the orchestration branch.
|
||||
|
||||
---
|
||||
|
||||
Reference in New Issue
Block a user