yoi/.yoi/tickets/00001KVJHYP4Q/thread.md

38 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:

  • Workspace Dashboard Queue により、この Ticket は Orchestrator routing 対象として明示許可された。
  • Ticket body は Plugin instance model / registry、new Component instance world、legacy Tool adapters、manifest/static validation、plugin check/list/show reporting、Service/Ingress lifecycle/status、Ingress test path、per-surface grants、docs/templates/PDK updates、validation を詳細に定義している。
  • 未解決 relation blocker はない。
  • 現在 queued はこの Ticket のみ、inprogress は 0 件、spawned child implementation Pods はなし、matching branch/worktree はなし、Orchestrator worktree は clean。
  • Risk domain は plugin / wasm-component / service / ingress / lifecycle / grants / runtime architecture だが、Ticket は no hidden context injection、ToolRegistry run-stability、legacy Tool compatibility、no ambient WASI network/socket、per-surface grants、host-mediated outputs を明示している。bounded context check 後も implementation 前に必要な追加 human decision は見つからなかった。

Evidence checked:

  • Ticket 00001KVJHYP4Q body / thread / relations / artifacts。
  • TicketRelationQuery(00001KVJHYP4Q): no blockers。
  • TicketOrchestrationPlanQuery(00001KVJHYP4Q): no previous plan records; accepted plan recorded now。
  • Workspace state:
    • Orchestrator worktree clean at 7f06e656
    • queued: this Ticket only。
    • inprogress: 0。
    • visible Pods are self/peers only; spawned children 0。
    • no matching implementation branch/worktree。

IntentPacket:

Intent:

  • Move Plugin runtime semantics from per-Tool artifact execution to host-managed PluginInstance / PluginInstanceRegistry
  • Treat Tool / Service / Ingress as surfaces of the same Plugin instance, sharing instance state/config/diagnostics while preserving explicit authorization and ordinary visible output paths。
  • Preserve existing Tool-only component/raw wasm Plugin packages through compatibility adapters。

Binding decisions / invariants:

  • Existing Tool Plugin packages must continue to work through instance registry compatibility path。
  • Tool execution remains model/user initiated and returns through ordinary Tool result/history path。
  • Service/Ingress must not secretly call model Tools or mutate context/history directly。
  • Plugin outputs/events must use Tool results or explicit durable/visible host-mediated paths; no hidden context injection。
  • Tool schemas remain run-stable and model-visible only through normal ToolRegistry construction。
  • Per-surface grants are independent: Tool, Service, Ingress grants must be validated separately; sharing an instance must not bypass authorization。
  • Host APIs remain separately grant-gated。
  • No raw ambient WASI network/socket authority。
  • Ingress events are bounded typed untrusted inputs。
  • If a safe host action path does not exist, expose diagnostics/status rather than inventing unsafe paths。

Requirements / acceptance criteria:

  • Add PluginInstanceRegistry or equivalent host-managed instance boundary。
  • ToolRegistry dispatch goes through Plugin instance handles。
  • Add new Component instance world/resource files and Rust PDK support。
  • Add legacy Tool component/raw wasm adapters behind the instance registry。
  • Extend manifest/static validation for Service/Ingress declarations and runtime compatibility。
  • Update yoi plugin check/list/show reporting for legacy Tool-only vs instance-capable packages and rejected surfaces。
  • Add host-managed start/status/stop lifecycle and bounded diagnostics。
  • Add Ingress dispatch API and at least one bounded in-process ingress delivery test path。
  • Validate Tool/Service/Ingress grants independently。
  • Update docs/templates for instance-oriented authoring。
  • Focused tests cover manifest validation, legacy compatibility, instance state persistence across Tool calls, Tool/Ingress shared instance dispatch, grant denial, timeout/trap/failure diagnostics。
  • Validation includes cargo fmt --check, relevant tests/checks, git diff --check, yoi ticket doctor, and nix build .#yoi --no-link

Escalate if:

  • The instance boundary cannot be implemented without broad Worker/ToolRegistry redesign beyond Ticket scope。
  • Preserving legacy Tool runtime while adding instance runtime would substantially distort architecture。
  • Safe Service/Ingress host action semantics require a product decision not already specified。
  • WIT/PDK interface shape requires a compatibility-breaking public API decision beyond this Ticket。

Next action:

  • Record queued -> inprogress and commit Ticket records before creating implementation worktree and spawning Coder。

State changed

Ticket body/thread, relation metadata, Orchestrator worktree state, visible Pods, existing branch/worktree, and bounded Plugin instance lifecycle context were checked. There is no unresolved blocking dependency, no inprogress/capacity blocker, and no missing planning decision. Accepting this queued Ticket for implementation before worktree/Pod side effects.


Implementation report

Implementation orchestration start:

  • Acceptance records were committed on Orchestrator branch: 5ec8bae9 ticket: accept plugin instance lifecycle
  • Created implementation worktree /home/hare/Projects/yoi/.worktree/00001KVJHYP4Q-plugin-instance-lifecycle on branch impl/00001KVJHYP4Q-plugin-instance-lifecycle at 5ec8bae9
  • Spawned Coder Pod yoi-coder-00001KVJHYP4Q with write scope limited to the implementation worktree and read-only root scope only for runtime workspace identity。
  • Coder task explicitly forbids root/original workspace implementation, unsafe hidden context/action paths, broad ToolRegistry bypasses, merge, Ticket close, and cleanup。

Next action:

  • Wait for Coder implementation report, then inspect branch diff/validation evidence and route to Reviewer。

Implementation report

Coder implementation report received from yoi-coder-00001KVJHYP4Q.

Implementation commit:

  • 147a6005 plugin: add instance lifecycle surface

Changed areas reported:

  • Manifest support for Service/Ingress declarations and permissions。
  • New yoi:plugin/instance@1.0.0 WIT/resource surface。
  • Host-managed PluginInstanceRegistry / PluginInstanceHandle in Pod plugin feature layer。
  • Plugin Tool registration/dispatch now routes through instance handles。
  • Legacy raw-wasm and yoi:plugin/tool@1.0.0 component Tool runtimes preserved through registry adapter path。
  • Instance lifecycle/status/stop/diagnostics surfaces and bounded Ingress dispatch API added。
  • Independent Tool/Service/Ingress grant validation added。
  • Static inspection / Plugin CLI diagnostics extended for Service/Ingress eligibility。
  • Rust PDK instance-oriented types/trait/macro support added。
  • Rust component instance template resources added。
  • Plugin component model docs updated。
  • Tests added/updated for manifest validation, CLI reporting/templates, legacy compatibility, grant checks, and in-process shared Tool/Ingress dispatch。

Coder validation reported as passing:

  • cargo test -p manifest plugin -- --nocapture
  • cargo test -p pod plugin -- --nocapture
  • cargo test -p yoi plugin -- --nocapture
  • cargo check -p yoi
  • cargo check -p yoi-plugin-pdk
  • cargo fmt --check
  • git diff --check
  • yoi ticket doctor
  • nix build .#yoi --no-link

Dependency/package impact:

  • No new Rust dependencies。
  • Added package/resource files under resources/plugin/templates/rust-component-instance/ and resources/plugin/wit/yoi-plugin-instance-v1.wit
  • No Cargo.lock or package.nix changes required; Nix build succeeded。

Known risks / deferrals:

  • Instance Component ABI is intentionally minimal string-JSON host dispatch (start, handle-tool, handle-ingress, status, stop) and should be reviewed before treating it as stable public low-level ABI。
  • Service lifecycle is surfaced as host-managed registration/status/stop diagnostics; no unsafe hidden model/tool/context action path was added。
  • Rust PDK instance macro provides author-facing instance helpers, but full cargo-component generated glue ergonomics may need follow-up polish if public PDK shape becomes stricter。

Orchestrator evidence checked before review dispatch:

  • Implementation worktree is clean。
  • HEAD is 147a6005
  • Diff from acceptance 5ec8bae9..HEAD is one implementation commit touching 12 files, about 1399 insertions / 34 deletions。
  • git diff --check 5ec8bae9..HEAD produced no diagnostics。

Next action:

  • Dispatch Reviewer for r1 review against Ticket requirements, with focus on instance registry boundary, legacy compatibility, ToolRegistry run-stability, no hidden context/action paths, per-surface grants, Service/Ingress lifecycle semantics, static inspection/CLI reporting, WIT/PDK/template correctness, bounds/resource limits, and validation evidence。

Plan

Review dispatch:

  • Spawned Reviewer Pod yoi-reviewer-00001KVJHYP4Q-r1 against implementation branch impl/00001KVJHYP4Q-plugin-instance-lifecycle
  • Review target commit: 147a6005 plugin: add instance lifecycle surface
  • Review baseline: 5ec8bae9
  • Reviewer task focuses on instance registry boundary, legacy Tool compatibility, ordinary Tool result/history path, Service/Ingress no hidden action/context paths, ToolRegistry run-stability, per-surface and host API grant independence, no ambient WASI/network authority, bounded ingress/events/diagnostics, static inspection no-exec behavior, WIT/PDK/template coherence, tests, and Nix/package evidence。
  • Reviewer is instructed not to edit source, commit, merge, close the Ticket, or use TicketReview directly; it will report verdict/evidence back to Orchestrator。

Review: request changes

Verdict: request_changes

確認範囲:

  • Ticket contract / Orchestrator IntentPacket。
  • Implementation diff: 5ec8bae9..147a6005
  • 主な対象:
    • crates/pod/src/feature/plugin.rs
    • crates/manifest/src/plugin.rs
    • crates/yoi/src/plugin_cli.rs
    • crates/plugin-pdk/src/lib.rs
    • resources/plugin/wit/yoi-plugin-instance-v1.wit
    • resources/plugin/templates/rust-component-instance/*
    • Plugin component docs/templates and focused tests。
  • Hidden history/context injection、ToolRegistry bypass、Ingress/Service production call path、ambient WASI/network authority の有無を確認。

Blocking issues:

  1. Rust instance PDK/template が buildable ではなく、WIT component instance ABI を実際に export していない。

    • resources/plugin/templates/rust-component-instance/Cargo.toml は repository 配下 package だが [workspace] がなく、direct authoring check が workspace membership error で失敗する。
    • resources/plugin/templates/rust-component-instance/src/lib.rsToolOutput::text(...) を呼ぶが、crates/plugin-pdk/src/lib.rs には ToolOutput::new, ToolOutput::json, ToolOutput::summary しかない。
    • export_plugin_instance! は generated WIT bindings / generated export! macro for world instance を実装していない。raw placeholder #[unsafe(export_name = "start")] と private Rust methods を定義するだけで、host が期待する component-model exports (start, handle-tool, handle-ingress, status, stop) を生成しない。
    • Ticket が要求する WIT/PDK/template coherence と instance-oriented authoring surface を満たしていない。
  2. Component instance lifecycle が status/error outputs を parse せず、component status export が実質 unused。

    • PluginInstance::status は host-side lifecycle/diagnostics のみを返し、component runtime の status export を呼ばない。
    • PluginComponentInstanceRuntime::start は component start export の returned string を捨てている。
    • PluginComponentInstanceRuntime::stop も returned string を捨てている。
    • WIT は status を export しているが、host-side runtime method がない。
    • Component が {"error": ...}start から返しても host が started と扱い得るため、lifecycle/status/diagnostics acceptance criteria を満たしていない。
  3. Service/Ingress surfaces が Tool 登録なしでは host-managed Plugin instance を作成・保持しない。

    • PluginToolFeature::install の実 install path では Service declarations は metadata only、Ingress declarations は authorization-check only。
    • Instance は Tool registration loop 内でのみ作られる。
    • Service-only / Ingress-only instance-capable plugin は host-managed instance、lifecycle start、status、diagnostics、retained ingress dispatch handle を得られない。
    • deliver_ingress は production caller に接続されておらず、focused ingress test は synthetic TestIngress instance を使っている。
    • Ticket intent の “Tool / Service / Ingress as surfaces of the same Plugin instance” を満たしていない。

Non-blocking concerns / follow-ups:

  • Human yoi plugin show output でも Service/Ingress eligibility を明示すると JSON なしでも rejected surfaces が分かりやすい。
  • Real instance-component tests が弱い。Rust/PDK generated yoi:plugin/instance@1.0.0 component の build/execution through start/tool/ingress/status/stop coverage が欲しい。

Reviewer validation:

  • git diff --check 5ec8bae9..HEAD: passed。
  • cargo fmt --check: passed。
  • cargo test -p manifest plugin -- --nocapture: passed。
  • cargo test -p pod plugin -- --nocapture: passed。
  • cargo test -p yoi plugin -- --nocapture: passed。
  • cargo check -p yoi: passed。
  • cargo check -p yoi-plugin-pdk: passed。
  • yoi ticket doctor: passed。
  • nix build .#yoi --no-link: passed。
  • Additional focused template validation failed: CARGO_TARGET_DIR=target/review-template cargo check --manifest-path resources/plugin/templates/rust-component-instance/Cargo.toml with workspace membership error。

Worktree status at review end: clean。


Implementation report

Coder r1-fix report received from yoi-coder-00001KVJHYP4Q.

New fix commit:

  • 870bcc76 plugin: fix instance lifecycle blockers

Branch commits now:

  • 870bcc76 plugin: fix instance lifecycle blockers
  • 147a6005 plugin: add instance lifecycle surface

Fix summary:

  • crates/plugin-pdk/src/lib.rs:
    • Reworked instance PDK export macro to use generated wit-bindgen Guest / export! shape instead of raw placeholder exports。
    • Added coherent instance-world helpers/status/error JSON handling。
  • resources/plugin/templates/rust-component-instance/:
    • Added empty [workspace] so template checks as an in-tree standalone authoring package。
    • Fixed template API mismatch by using existing ToolOutput::json
    • Added wit_bindgen::generate! for instance world and updated export macro usage。
  • crates/pod/src/feature/plugin.rs:
    • Component instance lifecycle now decodes start / stop returned JSON and fails closed on returned errors / failed status。
    • Host now calls component status export and includes component status in PluginInstanceStatus
    • Service/Ingress-capable installs create and retain host-managed instances even without Tool registration。
    • Added retained registry handle and bounded installed-path Ingress dispatch API。
    • Added tests for component start error handling, component status/stop reporting, service-only instance retention, and installed-path Tool/Ingress shared-instance dispatch。
  • No Cargo.lock, dependency, or package.nix changes。

Coder validation reported as passing:

  • cargo test -p manifest plugin -- --nocapture
  • cargo test -p pod plugin -- --nocapture
  • cargo test -p yoi plugin -- --nocapture
  • cargo check -p yoi
  • cargo check -p yoi-plugin-pdk
  • CARGO_TARGET_DIR=target/review-template cargo check --manifest-path resources/plugin/templates/rust-component-instance/Cargo.toml
  • cargo fmt --check
  • git diff --check 5ec8bae9..HEAD
  • yoi ticket doctor
  • nix build .#yoi --no-link

Remaining deferral / risk:

  • Instance PDK now uses wit-bindgen export glue and template checks, but yoi:plugin/instance@1.0.0 remains first public shape and should be reviewed before broad external stability promises。

Orchestrator evidence checked before r2 review:

  • Implementation worktree is clean。
  • HEAD is 870bcc76
  • Fix diff from 147a6005..HEAD touches 4 files, about 506 insertions / 119 deletions。
  • Overall git diff --check 5ec8bae9..HEAD produced no diagnostics。

Next action:

  • Route back to Reviewer for r2 verification of the PDK/template export glue, lifecycle status/error parsing, Service/Ingress instance retention, installed-path ingress dispatch, and final acceptance criteria。

Review: request changes

Verdict: request_changes

確認範囲:

  • Ticket authority / Orchestrator IntentPacket。
  • Fix diff: 147a6005..870bcc76
  • Overall implementation shape: 5ec8bae9..870bcc76
  • 主な対象:
    • crates/plugin-pdk/src/lib.rs
    • resources/plugin/templates/rust-component-instance/Cargo.toml
    • resources/plugin/templates/rust-component-instance/src/lib.rs
    • resources/plugin/wit/yoi-plugin-instance-v1.wit
    • crates/pod/src/feature/plugin.rs
    • crates/manifest/src/plugin.rs
    • crates/yoi/src/plugin_cli.rs

Previous blocker verification:

  • Rust instance PDK/template buildability / WIT export shape: substantially addressed。
    • export_plugin_instance! now targets generated wit-bindgen Guest / export! shape。
    • Instance template has empty [workspace], uses ToolOutput::json, and includes wit_bindgen::generate!
    • Focused template validation passes。
  • Component lifecycle start/status/stop handling: substantially addressed。
    • Host parses lifecycle JSON and fails closed on error/failure status。
    • Component status export is called and reflected in instance status。
    • Stop output is decoded/reported。
  • Service/Ingress instance retention and installed-path dispatch: substantially addressed。
    • PluginToolFeature retains a PluginInstanceRegistry
    • Service/Ingress-capable installs can create/retain instance without Tool registration。
    • Installed-path dispatch_ingress exists and tests cover shared Tool/Ingress dispatch。

Blocking issue:

  1. Enabled surface selection is not enforced per surface during descriptor/install, so mixed-surface plugins can expose or block the wrong surfaces。
    • PluginToolFeature is gated at coarse whole-record level by whether any of Tool/Service/Ingress appears in record.enabled_surfaces
    • Once feature exists, descriptor and install paths iterate over all declared manifest services/tools/ingresses, not only selected/enabled surfaces。
    • Concrete risk:
      • Plugin declaring both Tool and Service with only Service selected can still attempt to authorize/register Tool。
      • Missing Tool grant can fail selected Service install。
      • If Tool grant exists, unselected Tool can become model-visible。
      • Unselected Service/Ingress can be provided/started if their grants exist。
    • This violates the Ticket requirement that Tool / Service / Ingress grants and exposure remain independent and explicitly gated。

Required fix:

  • Filter descriptor/install loops by record.enabled_surfaces
  • Ensure registered/denial behavior accounts for selected surface set, not all manifest declarations。
  • Add focused tests for mixed-surface packages with partial enabled surfaces:
    • Service selected, Tool declared but not selected: Service installs and Tool does not register。
    • Tool selected, Service/Ingress declared but not selected: no Service/Ingress instance/dispatch exposure。
    • Missing grants for unselected surfaces do not fail selected-surface install。
    • Grants for unselected surfaces do not cause exposure。

Non-blocking concern:

  • Existing disabled-surface test only clears all enabled surfaces and does not cover mixed-surface partial enablement。

Reviewer validation:

  • cargo fmt --check: passed。
  • git diff --check 5ec8bae9..HEAD: passed。
  • CARGO_TARGET_DIR=target/review-template cargo check --manifest-path resources/plugin/templates/rust-component-instance/Cargo.toml: passed。
  • cargo test -p manifest plugin -- --nocapture: passed。
  • cargo test -p pod plugin -- --nocapture: passed。
  • cargo test -p yoi plugin -- --nocapture: passed。
  • cargo check -p yoi: passed。
  • cargo check -p yoi-plugin-pdk: passed。
  • yoi ticket doctor: passed。
  • nix build .#yoi --no-link: passed。

Worktree status at end: clean。


Implementation report

Coder r2-fix report received from yoi-coder-00001KVJHYP4Q.

New fix commit:

  • 79ca0f7f plugin: enforce enabled lifecycle surfaces

Branch commits now:

  • 79ca0f7f plugin: enforce enabled lifecycle surfaces
  • 870bcc76 plugin: fix instance lifecycle blockers
  • 147a6005 plugin: add instance lifecycle surface

Fix summary:

  • crates/pod/src/feature/plugin.rs:
    • Added per-surface record.enabled_surfaces gating for Plugin descriptor construction。
    • Filtered install loops so Tool / Service / Ingress setup only processes selected surfaces。
    • Changed install denial/exposure accounting to consider selected surfaces only。
    • Added runtime dispatch guards so unselected Tool/Ingress surfaces cannot be used even if grants exist。
    • Added focused tests for mixed-surface partial enablement:
      • Service selected, Tool declared but not selected: Service installs, Tool does not register, missing Tool grants do not fail install。
      • Tool selected, Service/Ingress declared but not selected: no Service descriptor/install exposure, Ingress dispatch denied even with grants。
    • Kept previous lifecycle/status/ingress retention tests passing。

Coder validation reported as passing:

  • cargo test -p manifest plugin -- --nocapture
  • cargo test -p pod plugin -- --nocapture
  • cargo test -p yoi plugin -- --nocapture
  • cargo check -p yoi
  • cargo check -p yoi-plugin-pdk
  • CARGO_TARGET_DIR=target/review-template cargo check --manifest-path resources/plugin/templates/rust-component-instance/Cargo.toml
  • cargo fmt --check
  • git diff --check 5ec8bae9..HEAD
  • yoi ticket doctor
  • nix build .#yoi --no-link

Orchestrator evidence checked before r3 review:

  • Implementation worktree is clean。
  • HEAD is 79ca0f7f
  • Fix diff from 870bcc76..HEAD touches only crates/pod/src/feature/plugin.rs, about 190 insertions / 97 deletions。
  • Overall git diff --check 5ec8bae9..HEAD produced no diagnostics。

Next action:

  • Route back to Reviewer for r3 verification of per-surface enabled selection enforcement and final acceptance criteria。

Review: request changes

Verdict: request_changes

確認範囲:

  • Ticket authority / Orchestrator IntentPacket。
  • r3 fix diff: 870bcc76..79ca0f7f
  • Relevant overall implementation shape: 5ec8bae9..79ca0f7f
  • 主な対象:
    • crates/pod/src/feature/plugin.rs
    • crates/yoi/src/plugin_cli.rs
    • crates/manifest/src/plugin.rs
    • crates/plugin-pdk/src/lib.rs
    • resources/plugin/templates/rust-component-instance/*
    • resources/plugin/wit/yoi-plugin-instance-v1.wit

Previous r2 blocker verification:

  • Runtime/registration side is mostly fixed。
  • Descriptor construction is gated by record.enabled_surfaces
  • Install loops now gate Service / Ingress / Tool setup independently。
  • Install denial accounting counts selected exposed surfaces rather than only Tools。
  • Runtime dispatch guards exist for unselected Tool/Ingress use。
  • Tests cover requested selected/unselected mixed-surface cases。

Blocking issue:

  1. Static inspection / yoi plugin list/show still evaluates unselected surfaces and can mark valid partial-surface enablement as rejected。
    • Runtime install now filters enabled surfaces, but static inspection still treats all declared manifest Tool / Service / Ingress surfaces as active eligibility requirements。
    • PluginStaticInspection::statically_eligible() requires all inspected tools, services, and ingresses to be eligible。
    • inspect_resolved_plugin_static() still iterates over all declared manifest tools/services/ingresses rather than selected/enabled surfaces。
    • yoi plugin list/show uses this unfiltered static inspection for resolved items。
    • Status calculation can classify the resolved item as rejected when no usable Tool exists and static_eligible is false。

Concrete failure mode:

  • Mixed package declares Tool + Service。
  • Enablement selects only Service。
  • Service grants are present; Tool grants are absent because Tool is not selected。
  • Runtime install correctly ignores unselected Tool。
  • Static inspection still checks unselected Tool and records missing Tool grant diagnostics, so static_eligible = false
  • For service-only selection with no usable Tool, yoi plugin list/show can report the resolved plugin as rejected even though selected Service surface is valid/installable。

Why this blocks approval:

  • Ticket requires Tool / Service / Ingress grants to be independent。
  • Unselected surfaces must not block selected surfaces。
  • Ticket also requires yoi plugin check/list/show to report legacy vs instance-capable/rejected surfaces accurately。
  • Runtime path is fixed, but inspection/status can still be blocked by unselected surfaces, creating authority/reporting mismatch。

Required fix:

  • Make resolved static inspection eligibility account for record.enabled_surfaces
  • Alternatively, separate declared-surface inspection from enabled-surface inspection and compute resolved list/show status from enabled surfaces only。
  • Keep plugin check free to inspect full package declaration if appropriate, but plugin list/show for a resolved enablement must not mark selected Service/Ingress invalid because unrelated unselected Tool grants are absent。
  • Add focused yoi plugin tests for mixed-surface partial enablement status/reporting。

Non-blocking concern:

  • Runtime install tests now cover partial enablement, but focused yoi plugin list/show tests are still missing and should be added with the fix。

Reviewer validation:

  • cargo fmt --check: passed。
  • git diff --check 5ec8bae9..HEAD: passed。
  • Template cargo-check: passed。
  • cargo test -p manifest plugin -- --nocapture: passed。
  • cargo test -p pod plugin -- --nocapture: passed。
  • cargo test -p yoi plugin -- --nocapture: passed。
  • cargo check -p yoi: passed。
  • cargo check -p yoi-plugin-pdk: passed。
  • yoi ticket doctor: passed。
  • nix build .#yoi --no-link: passed。

Worktree status at end: clean。


Implementation report

Coder r3-fix report received from yoi-coder-00001KVJHYP4Q.

New fix commit:

  • 627c8f36 plugin: filter static enabled surfaces

Branch commits now:

  • 627c8f36 plugin: filter static enabled surfaces
  • 79ca0f7f plugin: enforce enabled lifecycle surfaces
  • 870bcc76 plugin: fix instance lifecycle blockers
  • 147a6005 plugin: add instance lifecycle surface

Fix summary:

  • crates/pod/src/feature/plugin.rs:
    • inspect_resolved_plugin_static() now filters Tool / Service / Ingress inspection by record.enabled_surfaces
    • PluginStaticInspection::statically_eligible() therefore reflects enabled/selected surfaces only for resolved Plugin records。
    • plugin check remains full-declaration oriented because check-time inspection uses all declared manifest surfaces as enabled。
  • crates/yoi/src/plugin_cli.rs:
    • Resolved plugin list/show diagnostics now use filtered static inspection。
    • Added focused CLI inspection test for mixed Tool+Service package where only Service is enabled and Tool grants are absent:
      • status remains active
      • static eligibility remains true。
      • unselected Tool is not listed/reported。
      • unselected Tool missing grants do not produce diagnostics/rejection。

Coder validation reported as passing:

  • cargo test -p manifest plugin -- --nocapture
  • cargo test -p pod plugin -- --nocapture
  • cargo test -p yoi plugin -- --nocapture
  • cargo check -p yoi
  • cargo check -p yoi-plugin-pdk
  • CARGO_TARGET_DIR=target/review-template cargo check --manifest-path resources/plugin/templates/rust-component-instance/Cargo.toml
  • cargo fmt --check
  • git diff --check 5ec8bae9..HEAD
  • yoi ticket doctor
  • nix build .#yoi --no-link

Orchestrator evidence checked before r4 review:

  • Implementation worktree is clean。
  • HEAD is 627c8f36
  • Fix diff from 79ca0f7f..HEAD touches crates/pod/src/feature/plugin.rs and crates/yoi/src/plugin_cli.rs, about 209 insertions / 76 deletions。
  • Overall git diff --check 5ec8bae9..HEAD produced no diagnostics。

Next action:

  • Route back to Reviewer for r4 verification of static inspection / plugin list/show partial-surface reporting and final acceptance criteria。

Review: approve

Verdict: approve

確認範囲:

  • Ticket contract:
    • .yoi/tickets/00001KVJHYP4Q/item.md
    • .yoi/tickets/00001KVJHYP4Q/thread.md
  • r4 fix diff: 79ca0f7f..627c8f36
  • overall implementation shape: 5ec8bae9..627c8f36
  • Focused files:
    • crates/pod/src/feature/plugin.rs
    • crates/yoi/src/plugin_cli.rs
    • crates/manifest/src/plugin.rs
    • crates/plugin-pdk/src/lib.rs
    • resources/plugin/templates/rust-component-instance/*
    • resources/plugin/wit/yoi-plugin-instance-v1.wit

r3 blocker verification:

  • Previous static-inspection/list-show blocker is resolved。
  • inspect_resolved_plugin_static() now filters Tool / Service / Ingress eligibility by record.enabled_surfaces
  • PluginStaticInspection::statically_eligible() now operates over filtered/selected surface vectors for resolved records。
  • plugin check remains full-declaration oriented because check-time inspection constructs the record with all declared manifest surfaces enabled。
  • Resolved plugin list/show diagnostics now use filtered static inspection and include selected Service/Ingress diagnostics。
  • Focused CLI test service_only_enablement_ignores_unselected_tool_static_grants confirms a mixed Tool+Service package with only Service enabled remains active, is statically eligible, does not report the unselected Tool, and does not emit missing Tool grant diagnostics。

Earlier blocker re-check:

  • Instance PDK/template shape, lifecycle returned JSON/status handling, Service/Ingress instance retention, installed-path ingress dispatch, and per-surface runtime guards remain present at a high level。

Blocking issues:

  • None found。

Non-blocking follow-ups:

  • None requiring this Ticket to remain blocked。

Reviewer validation passed:

  • cargo fmt --check
  • git diff --check 5ec8bae9..HEAD
  • CARGO_TARGET_DIR=target/review-template cargo check --manifest-path resources/plugin/templates/rust-component-instance/Cargo.toml
  • cargo test -p manifest plugin -- --nocapture
  • cargo test -p pod plugin -- --nocapture
  • cargo test -p yoi plugin -- --nocapture
  • cargo check -p yoi
  • cargo check -p yoi-plugin-pdk
  • /home/hare/Projects/yoi/target/debug/yoi ticket doctor
  • nix build .#yoi --no-link

Template check generated resources/plugin/templates/rust-component-instance/Cargo.lock; reviewer removed it after validation。

Worktree status:

  • Clean at commit 627c8f36 on impl/00001KVJHYP4Q-plugin-instance-lifecycle

Implementation report

Reviewer r4 approvalを受けて、実装ブランチを Orchestrator worktree の orchestration branch に統合した。

統合:

  • Merge commit: 43c9216e merge: plugin instance lifecycle surface
  • Merged branch: impl/00001KVJHYP4Q-plugin-instance-lifecycle
  • Implementation commits:
    • 147a6005 plugin: add instance lifecycle surface
    • 870bcc76 plugin: fix instance lifecycle blockers
    • 79ca0f7f plugin: enforce enabled lifecycle surfaces
    • 627c8f36 plugin: filter static enabled surfaces

Orchestrator worktree validation:

  • cargo fmt --check: passed
  • git diff --check HEAD^1..HEAD: passed
  • cargo test -p manifest plugin -- --nocapture: passed
  • cargo test -p pod plugin -- --nocapture: passed
  • cargo test -p yoi plugin -- --nocapture: passed
  • cargo check -p yoi: passed
  • cargo check -p yoi-plugin-pdk: passed
  • CARGO_TARGET_DIR=target/review-template cargo check --manifest-path resources/plugin/templates/rust-component-instance/Cargo.toml: passed
  • /home/hare/Projects/yoi/target/debug/yoi ticket doctor: passed
  • nix build .#yoi --no-link: passed

Template validation generated resources/plugin/templates/rust-component-instance/Cargo.lock; it was removed after validation. Final Orchestrator worktree status is clean。


State changed

Reviewer approval、Orchestrator worktree への統合、必要な検証が完了したため done に遷移する。実装は Plugin instance lifecycle surface、Service/Ingress declarations and grants、PDK/template、static/runtime inspection、legacy compatibility、および focused tests を含む。


State changed

Ticket を closed にしました。


完了

Plugin Service/Ingress component lifecycle surface を実装し、Orchestrator worktree の orchestration branch に統合した。

主な成果:

  • Pod plugin feature に host-managed PluginInstanceRegistry / instance handle 境界を追加し、Tool dispatch を instance 経由に変更。
  • New instance-capable component world yoi:plugin/instance@1.0.0 と WIT resource を追加。
  • yoi-plugin-pdk と Rust component template に instance-oriented authoring support を追加。
  • Existing component Tool world / raw wasm Tool runtime を instance registry compatibility path に維持。
  • Manifest/static validation に Service / Ingress declarations と per-surface grant validation を追加。
  • Service lifecycle/status/diagnostics と bounded in-process ingress dispatch path を実装。
  • Tool / Service / Ingress enabled-surface filtering を runtime install, dispatch guard, and resolved static inspection / yoi plugin list/show に適用。
  • plugin check は package declaration inspection、resolved plugin list/show は selected/enabled surfaces に基づく reporting に分離。
  • Focused tests added for manifest validation, legacy Tool compatibility, instance state persistence, ingress dispatch, Service/Ingress grant denial, failure diagnostics, and partial enabled-surface static reporting。

統合・検証:

  • Merge commit: 43c9216e merge: plugin instance lifecycle surface
  • Implementation commits: 147a6005, 870bcc76, 79ca0f7f, 627c8f36
  • Reviewer final verdict: approve
  • Validation passed: cargo fmt --check, git diff --check HEAD^1..HEAD, cargo test -p manifest plugin -- --nocapture, cargo test -p pod plugin -- --nocapture, cargo test -p yoi plugin -- --nocapture, cargo check -p yoi, cargo check -p yoi-plugin-pdk, template cargo-check, yoi ticket doctor, and nix build .#yoi --no-link

範囲外:

  • Discord Bridge 本体、public registry/install/update/signature tooling、arbitrary Plugin UI channel、hidden context injection、Service/Ingress による model-visible Tool schema mutation は実装していない。

Implementation report

Post-close cleanup completed。

  • Stopped child Pods and reclaimed scope:
    • yoi-coder-00001KVJHYP4Q
    • yoi-reviewer-00001KVJHYP4Q-r1
  • Removed implementation worktree:
    • /home/hare/Projects/yoi/.worktree/00001KVJHYP4Q-plugin-instance-lifecycle
  • Deleted implementation branch:
    • impl/00001KVJHYP4Q-plugin-instance-lifecycle
  • Orchestrator worktree remains clean on orchestration at bc484338

Root/original workspace was not used for merge/validation/cleanup operations beyond observing the worktree list output from the Orchestrator worktree command。