30 KiB
作成
LocalTicketBackend によって作成されました。
State changed
Ticket を workspace-panel が queued にしました。
Plan
Routing hold / waiting-capacity note:
明示 queue review で Ticket body / relations / orchestration plan / workspace state を確認した。
Current decision:
- この Ticket は
queuedのまま待機。 - 依存 Ticket
00001KV5W3PHW/00001KV5W3PJ3は closed で dependency blocker ではない。 - ただし同時 queued の
00001KVFD3YSVCLI inspection を先に受理した。CLI inspection は Plugin discovery / enablement / grants / diagnostics の read-only public surface を作る作業で、host API implementation と同じ Plugin manifest/grant/runtime/diagnostic 周辺に触れる。 00001KVFDX9AYfs host API とは WASM Plugin Tool runtime host import boundary、Plugin grant model、diagnostics/tests/package behavior の変更面が重なるためdo_not_parallelizeplan record を残した。
Bounded reason for idle queued:
- conflict / reviewer-coder bottleneck。
Next action:
00001KVFD3YSVの implementation/review/merge outcome を確認後、queued のまま再 routing する。- その時点で
fshost API Ticket との ordering / conflict も再確認する。
Decision
Routing decision: implementation_ready
Reason:
- Panel Queue により、この Ticket は Orchestrator routing 対象として明示許可された。
- Ticket body には、HTTPS host API intent、binding invariants、acceptance criteria、non-goals、validation、escalation-worthy risk domain が実装可能な粒度で揃っている。
- 依存 relation の
00001KV5W3PHWminimal WASM runtime、00001KV5W3PJ3permission grants、関連00001KVFD3YSVCLI inspection は closed で blocker ではない。 - Risk domain は network / secrets / host API / permission grants だが、Ticket は HTTPS-only、private/local target rejection、grant allowlist、bounded request/response/timeout/diagnostics、no ambient env/network、ordinary Tool result path を binding invariants として明示している。bounded context check 後も implementation 前に必要な追加 human decision は見つからなかった。
- 同時 queued の
00001KVFDX9AYfs host API と00001KVG0HR96Component Model migration は Plugin runtime/grant/diagnostic/packaging surface が重なるため、waiting/conflict notes を更新し queued のまま待機する。
Evidence checked:
- Ticket
00001KVFDX9AFbody / thread / artifacts。 TicketRelationQuery(00001KVFDX9AF): depends_on は closed。related Ticket は context であり acceptance blocker ではない。TicketOrchestrationPlanQuery(00001KVFDX9AF): 既存 waiting/do_not_parallelize records を確認。今回accepted_planを記録済み。- Related completed Tickets:
00001KV5W3PHW— minimal WASM Tool runtime closed。00001KV5W3PJ3— Plugin permission grants closed。00001KVFD3YSV— Plugin read-only CLI inspection closed。
- Current queued Tickets:
00001KVFDX9AYfs host API: do_not_parallelize / waiting reason を維持。00001KVG0HR96Component Model migration: migration boundary / conflict waiting note を更新。
- Orchestrator worktree
/home/hare/Projects/yoi/.worktree/orchestration: clean。 - Existing branch/worktree: matching
00001KVFDX9AFbranch/worktree はなし。 - Visible Pods: self / peer / intake only; spawned child capacity is free。
- Current code map:
crates/pod/src/feature/plugin.rs: Plugin resolver, permission grants, static inspection, WASM tool feature。crates/pod/src/pod.rs: WASM Tool runtime /run_plugin_wasm_tool/ host import validation。crates/manifest/src/plugin.rs: Plugin manifest and permission model。crates/yoi/src/plugin_cli.rs: read-only inspection output should remain compatible with host API diagnostics。
IntentPacket:
Intent:
- WASM Plugin Tool runtime に、明示 grant された outbound HTTPS request だけを実行できる
httpshost API を追加する。 - Plugin は ambient network access を持たず、host API import + requested permission + config grant + allowlist を満たす場合だけ bounded HTTPS request を実行できる。
Binding decisions / invariants:
- Host API name/domain は
https。webではない。 - HTTPS-only。
http://、localhost、private IP、link-local、unix socket、file URL、local/private host targets は reject。 - Grant がない場合、network access 前に fail closed。
- host / method / optional path prefix などの allowlist を表現し、grant と request を照合する。
- Request/response は bounded。
- method allowlist
- request body size bound
- header count/size bound
- response body size bound
- timeout
- redirect policy
- Credentials は ambient env から読まない。header/auth は explicit config / secret ref 経由だけ。
- Diagnostics に secret-like header/token/body content を漏らさない。
- HTTPS response は hidden context injection ではなく ordinary Tool result/history path に残す。
fshost API、WebSocket/SSE/timers、Service/Ingress lifecycle、Plugin package manager は non-goals。
Requirements / acceptance criteria:
- Granted Plugin Tool can perform an allowed HTTPS request through host API。
- Missing
host_api.httpsgrant denies before network access。 - Disallowed host / method / URL scheme denies。
http://, localhost, private IP, link-local, local/private host targets reject。- Timeout and response-size bounds are enforced。
- Request/response diagnostics are bounded and redact secret-like values。
- No ambient env credentials or ambient network APIs are exposed to WASM。
- Tool result path remains ordinary Tool result/history path。
- Tests cover allowed HTTPS, missing grant, disallowed host/method/scheme/private target, timeout, response truncation, secret redaction, no network without host API import/grant。
Implementation latitude:
- Choose exact ABI/import shape consistent with existing
yoi-plugin-wasm-1host import design。 - Choose narrow grant config representation for host/method/path allowlist consistent with current Plugin permission grant model。
- Use local deterministic test server/mock if needed for allowed HTTPS/timeout/response bound tests, but keep network-safety tests deterministic。
- Choose bounded response header/body representation that fits existing Tool result error/result types。
Escalate if:
- Implementing HTTPS requires broad runtime executor redesign or Component Model migration first。
- Secure host/method/path grant model cannot be represented without breaking existing permission grant schema。
- SecretRef handling requires new secret-store public API beyond explicit config references。
- Safe private/local-host rejection cannot be implemented deterministically enough for tests。
- Host API result/error shape requires product-visible Tool result schema decision beyond this Ticket。
Validation:
- Focused plugin HTTPS host API tests。
- Relevant
cargo test/cargo checkforpod,manifest,yoias changed。 cargo fmt --check。git diff --check。nix build .#yoibecause dependency/package/network code may change。
Critical risks / reviewer focus:
- Network access before grant/allowlist checks。
- Private/local/localhost bypass through DNS, redirects, IPv6, encoded URLs, or scheme confusion。
- Secret leakage in diagnostics or Tool result/history。
- Ambient env credential usage。
- Unbounded request/response bodies or headers。
- Hidden context injection by bypassing normal Tool result path。
- Breaking existing Plugin permission grant enforcement or CLI inspection semantics。
Next action:
queued -> inprogressを記録し、Ticket records を Orchestrator worktree に commit してから、専用 implementation worktree を作成し Coder Pod を narrow write scope で起動する。root/original workspace は操作しない。
State changed
Ticket body/thread, relation metadata, orchestration plan records, related completed Tickets, Orchestrator worktree, visible Pods, existing branch/worktree, and bounded Plugin host API code context were checked. Depends-on blockers are closed, prior CLI inspection related work is closed, and no dirty-state blocker or missing planning decision was found. fs host API and Component Model migration remain queued with conflict/migration waiting records. Accepting this queued Ticket for implementation before worktree/Pod side effects.
Implementation report
Implementation start note:
queued -> inprogress acceptance、accepted plan、routing decision / IntentPacket、fs host API / Component Model migration の waiting records を記録し、Orchestrator worktree で commit した後に、専用 implementation worktree と Coder Pod を起動した。
Worktree:
/home/hare/Projects/yoi/.worktree/00001KVFDX9AF-plugin-https-host-api- branch:
impl/00001KVFDX9AF-plugin-https-host-api
Coder Pod:
yoi-coder-00001KVFDX9AF
Scope / boundaries:
- child runtime workspace root は read scope。
- implementation worktree は write scope。
- root/original workspace と Orchestrator worktree へは書き込まないよう指示済み。
.yoi/memory、runtime/log/lock/local/secret-like.yoipaths は編集しないよう指示済み。
Related queued Tickets:
00001KVFDX9AYfs host API remains queued due existing do_not_parallelize / conflict with HTTPS host API.00001KVG0HR96Component Model migration remains queued due migration boundary / conflict with active host API work.
Next:
- Coder は granted HTTPS host API implementation、focused tests、validation、implementation commit を行い、実装報告を返す予定。
Implementation report
Coder implementation report received / Orchestrator validation:
Implementation commit:
73775275—plugin: implement https host api
Summary:
- Added typed HTTPS host API grant scope to Plugin permission model:
- hosts
- methods
- optional path prefixes
- bounded request/response options
- Implemented
yoi:httpsWASM host import handling in the Plugin Tool runtime。 - Added deterministic local TLS / HTTPS test harness for runtime tests。
- Added URL validation / network safety checks:
- HTTPS-only;
- reject
http://; - reject localhost/private/link-local/local targets;
- reject disallowed hosts/methods/schemes before network access。
- Added request/response bounds and diagnostics:
- body/header limits;
- response truncation;
- timeout;
- bounded/redacted error messages。
- Preserved no ambient env credentials and ordinary Tool result/history path semantics。
- Updated read-only Plugin CLI inspection so HTTPS host API grant details / diagnostics remain inspectable。
- Updated
package.nixcargo hash for new dependency/build closure.
Files changed:
Cargo.lockcrates/manifest/src/plugin.rscrates/pod/Cargo.tomlcrates/pod/src/feature/plugin.rscrates/pod/src/pod.rscrates/yoi/src/plugin_cli.rspackage.nix
Coder reported validation:
cargo fmt --check— passedcargo check -p pod -p manifest -p yoi— passedcargo test -p pod feature::plugin::tests -- --nocapture— passed; 36 passedcargo test -p manifest plugin -- --nocapture— passed; 17 passedcargo test -p yoi plugin_cli -- --nocapture— passed; 10 passedgit diff --check— passednix build .#yoi --no-link— passed
Orchestrator evidence checked:
- Pod output を確認。
- implementation worktree は clean。
- branch
impl/00001KVFDX9AF-plugin-https-host-apiHEAD は73775275。 - diff stat from accepted base
1fdef32a..73775275: 7 files changed, 1799 insertions, 97 deletions。
Validation re-run by Orchestrator in implementation worktree:
cargo fmt --check— passedcargo check -p pod -p manifest -p yoi— passedcargo test -p pod feature::plugin::tests -- --nocapture— passed; 36 passed, 0 failedcargo test -p manifest plugin -- --nocapture— passed; 17 passed, 0 failedcargo test -p yoi plugin_cli -- --nocapture— passed; 10 passed, 0 failedgit diff --check— passednix build .#yoi --no-link— passed
Routing classification: review_needed
Next action:
- recorded intent / invariants / acceptance criteria に照らして、read-only Reviewer Pod で外部レビューする。
- 特に grant-before-network、private/local rejection、redirect/DNS bypass、bounds/timeouts、secret redaction、ordinary Tool result path、no ambient env credentials、CLI inspection compatibility、dependency/package.nix correctness を確認する。
Plan
Review dispatch:
Reviewer Pod yoi-reviewer-00001KVFDX9AF を read-only scope で起動した。
Review target:
- worktree:
/home/hare/Projects/yoi/.worktree/00001KVFDX9AF-plugin-https-host-api - branch:
impl/00001KVFDX9AF-plugin-https-host-api - commit:
73775275
Reviewer focus:
- recorded intent / invariants / acceptance criteria に対する適合性。
- network access が grant/allowlist checks の前に発生しないこと。
- private/local/localhost/link-local target rejection が DNS / IPv6 / redirect / scheme edge cases を含め妥当であること。
- timeout / request-response size / header bounds が enforce されること。
- secret-like values が errors / diagnostics / Tool results に漏れないこと。
- ambient env credential / ambient network access path が WASM に exposed されていないこと。
- HTTPS response が ordinary Tool result/history path だけに戻ること。
- allowed HTTPS / missing grant / disallowed host-method-scheme-private target / timeout / truncation / redaction / no network without grant/import tests が意味を持つこと。
- manifest/permission grant schema changes が existing grants / CLI inspection と整合していること。
Cargo.lock/package.nixupdate が妥当で、nix build .#yoi --no-linkvalidation と整合していること。fshost API と Component Model migration が non-goals として保たれていること。
Next:
- Reviewer output を確認し、approve なら Orchestrator worktree への merge/validation/cleanup/close-ready 処理へ進む。request_changes なら blocker を記録して Coder に戻す。
Review: request changes
Review result: request_changes
対象:
- Ticket:
00001KVFDX9AF - branch:
impl/00001KVFDX9AF-plugin-https-host-api - commit:
7377527f(plugin: implement https host api)
Blockers:
-
Private/local target rejection is bypassable with IPv4-mapped IPv6 literals.
validate_static_https_targetparses the URL host asIpAddrand delegates IPv6 literals tois_forbidden_ipv6(crates/pod/src/feature/plugin.rs:622-631,665-669).is_forbidden_ipv6rejects loopback/unspecified/ULA/link-local/multicast (699-705) but does not checkIpv6Addr::to_ipv4_mapped()/ IPv4-compatible forms.- Rust confirms
::ffff:127.0.0.1is notis_loopback()as IPv6, whileto_ipv4_mapped()isSome(127.0.0.1). - A granted request to
https://[::ffff:127.0.0.1]/...would therefore pass the current private/local filter if the grant host matches, violating localhost/private IP rejection and the IPv6 edge-case reviewer focus.
-
DNS private-address validation is TOCTOU and does not bind the checked address set to the actual connection.
ReqwestPluginHttpsClient::executecallsvalidate_dns_target(url)before constructing/sending the request (crates/pod/src/feature/plugin.rs:365-405).validate_dns_targetresolves withToSocketAddrsand rejects private/local addresses in that returned set (641-655), butreqwestperforms its own DNS resolution later duringbuilder.send()(405).- DNS rebinding / split answers between the preflight lookup and reqwest’s lookup can pass validation on a public address then connect to a private/local address.
- Ticket critical risks explicitly include DNS/private/local bypasses before network access.
Requested changes:
- Reject IPv4-mapped IPv6 addresses by applying the existing IPv4 forbidden checks to mapped IPv4 addresses; add tests for mapped loopback/private/link-local examples.
- Bind DNS validation to the actual connection path. Either pin validated public
SocketAddrs into the reqwest client/request resolver path, or otherwise ensure the actual connected remote address is validated / not private. - Add deterministic test coverage around the real validation edge cases where feasible.
Supporting positive findings:
- Grant checks happen before request parsing/DNS/network dispatch in
execute_plugin_https_request, and WASM import validation deniesyoi:httpsimports without requested/configuredhost_api.httpsgrant before instantiation. - Scheme, embedded credentials, method allowlist, request descriptor/body/header count/size, response body/header bounds, timeout, no redirects, and
no_proxy()are present. - WASM imports are narrow (
yoi:tool,yoi:httpsonly), WASI/ambient imports are rejected, andyoi:fsremains explicitly unimplemented. - Response path remains ordinary plugin Tool output/history path.
- Manifest/CLI schema additions are mostly compatible: new
PluginPermission::HostApi,PluginHttpsGrant, defaultedgrants.https, and CLI display of configured HTTPS grants.
Test gap:
- Current HTTPS-focused tests use
MockHttpsClientfor allowed/denied/timeout/truncation behavior. That is useful for grant ordering, but it does not exercise the realReqwestPluginHttpsClientDNS filtering, redirect policy, TLS/HTTPS path, or actual timeout/read-limit behavior. Given the security-sensitive DNS/IP requirements, add coverage for the real validation edge cases above.
Plan
Review follow-up dispatch:
Reviewer yoi-reviewer-00001KVFDX9AF は request_changes を返したため、Ticket review として記録し、既存 Coder Pod yoi-coder-00001KVFDX9AF に修正依頼を送った。
Blockers:
-
IPv4-mapped IPv6 literals が private/local target rejection を bypass し得る。
::ffff:127.0.0.1などを IPv6 として見るだけでは loopback/private 判定に漏れる。Ipv6Addr::to_ipv4_mapped()等で mapped IPv4 を取り出し、既存 IPv4 forbidden checks を適用する必要がある。
-
DNS private-address validation が TOCTOU で actual connection path に bind されていない。
- preflight
ToSocketAddrsvalidation 後にreqwestが別途 DNS resolution するため、DNS rebinding / split answers で public answer validation 後に private/local address へ接続し得る。 - validated public
SocketAddrs を reqwest client/request resolver path に pin する、または actual connected remote address を検証する必要がある。
- preflight
Required fixes sent to Coder:
- IPv4-mapped IPv6 addresses を mapped IPv4 として private/local/link-local/loopback checks に通す。
- mapped loopback/private/link-local の tests を追加する。
- DNS validation を actual connection path に bind する設計へ修正する。
- DNS / actual connection edge の deterministic test coverage を追加する。
- Prior positives を維持する: grant-before-network、WASM import grant validation、HTTPS-only、embedded credentials rejection、method allowlist、bounds、timeout、no redirects、
no_proxy()、ordinary Tool result path、manifest/CLI schema compatibility。
Next:
- Coder の修正 commit / validation report を待つ。
- 修正後、network-safety edge cases と grant-before-network invariants を中心に再レビューする。
Implementation report
Coder review-fix implementation report received / Orchestrator validation:
Incremental fix commit:
85683f17—plugin: harden https target validation
Summary:
- Hardened IPv6 target validation:
- IPv4-mapped IPv6 addresses now apply existing IPv4 private/local/link-local checks.
- IPv4-compatible embedded forms are also checked through IPv4 rules.
- Host canonicalization strips IPv6 brackets before IP parsing.
- Removed DNS validation TOCTOU gap:
- DNS resolution now produces validated public
SocketAddrs. - Those exact validated addresses are pinned into the
reqwestclient viaresolve_to_addrs, soreqwestdoes not perform a separate unvalidated DNS lookup for hostname requests. - Private DNS answers are rejected before client build / network dispatch.
- DNS resolution now produces validated public
- Added deterministic tests for:
- IPv4-mapped loopback/private/link-local rejection;
- IPv4-compatible private rejection;
- DNS resolution pinning to validated public socket addresses;
- private DNS answer rejection before client build.
Files changed in incremental fix:
crates/pod/src/feature/plugin.rs
Coder reported validation:
cargo test -p pod feature::plugin::tests— passed; 39 testscargo test -p manifest plugin— passed; 17 testscargo test -p yoi plugin_cli— passed; 10 testscargo check -p pod -p manifest -p yoi— passedcargo fmt --check— passedgit diff --check— passednix build .#yoi --no-link— passed
Orchestrator evidence checked:
- Pod output を確認。
- implementation worktree は clean。
- branch
impl/00001KVFDX9AF-plugin-https-host-apiHEAD は85683f17。 - incremental diff stat from previous review target
7377527f..85683f17: 1 file changed, 170 insertions, 21 deletions。
Validation re-run by Orchestrator in implementation worktree:
cargo fmt --check— passedcargo check -p pod -p manifest -p yoi— passedcargo test -p pod feature::plugin::tests -- --nocapture— passed; 39 passed, 0 failedcargo test -p manifest plugin -- --nocapture— passed; 17 passed, 0 failedcargo test -p yoi plugin_cli -- --nocapture— passed; 10 passed, 0 failedgit diff --check— passednix build .#yoi --no-link— passed
Routing classification: review_needed
Next action:
- previous
request_changesblockers が解消されたか、read-only Reviewer Pod で再レビューする。
Plan
Review re-dispatch:
Reviewer Pod yoi-reviewer-00001KVFDX9AF-r2 を read-only scope で起動した。
Review target:
- worktree:
/home/hare/Projects/yoi/.worktree/00001KVFDX9AF-plugin-https-host-api - branch:
impl/00001KVFDX9AF-plugin-https-host-api - commits:
7377527f— initial HTTPS host API implementation85683f17— target validation hardening fix
Reviewer focus:
- previous IPv4-mapped/compatible IPv6 private/local bypass blocker が解消されているか。
- DNS validation が validated address pinning により actual reqwest connection path に bind され、unvalidated resolution path が残っていないか。
- mapped IPv6 / DNS pinning / private DNS answer rejection tests が deterministic で意味を持つか。
- prior positives: grant-before-network、WASM import grant validation、HTTPS-only、embedded credentials rejection、method allowlist、bounds、timeout、no redirects、
no_proxy()、ordinary Tool result path、manifest/CLI schema compatibility が維持されているか。 resolve_to_addrsusage や host canonicalization に新しい security regression がないか。
Next:
- Reviewer output を確認し、approve なら Orchestrator worktree への merge/validation/cleanup/close-ready 処理へ進む。request_changes なら blocker を記録して Coder に戻す。
Review: approve
Review result: approve
対象:
- Ticket:
00001KVFDX9AF - branch:
impl/00001KVFDX9AF-plugin-https-host-api - commits:
7377527f—plugin: implement https host api85683f17—plugin: harden https target validation
No remaining blockers found.
Evidence reviewed:
- IPv4-mapped / compatible IPv6 bypass is closed.
- Host canonicalization strips IPv6 brackets before IP parsing via
normalize_host_literal/canonical_host. validate_static_https_targetparses canonical hosts asIpAddrand appliesvalidate_public_ip.is_forbidden_ipv6delegates mapped/compatible embedded IPv4 addresses throughipv6_embedded_ipv4, then applies existing IPv4 private/loopback/link-local/broadcast/special checks.ipv4_mapped_ipv6_targets_deny_before_networkcovers::ffff:127.0.0.1,::ffff:10.0.0.1,::ffff:169.254.169.254, and compatible::10.0.0.1, with mock network call count asserted as zero.
- Host canonicalization strips IPv6 brackets before IP parsing via
- DNS validation is bound to the reqwest connection path.
ReqwestPluginHttpsClient::executecallsresolve_https_target_for_clientbefore building the client.- Hostname URLs resolve to
SocketAddrs, reject empty/private/local answers, and return those exact validated addresses. - reqwest builder pins each validated domain using
resolve_to_addrs(domain, &pinned_resolution.addrs), with no remaining separate unvalidated DNS lookup path visible in this implementation. - IP-literal URLs skip DNS pinning only after static IP validation.
- DNS tests are deterministic and meaningful at the unit boundary.
FakeHttpsResolveravoids live DNS/network.dns_resolution_is_pinned_to_validated_public_socket_addressesverifies resolver input, returned pinned domains/addrs, and reqwest builder acceptance ofresolve_to_addrs.dns_resolution_rejects_private_addresses_before_client_buildverifies private DNS answers fail before client build/network dispatch.
- Prior positives remain preserved.
- Grant checks happen before request validation/client dispatch in
execute_plugin_https_request. - WASM import validation checks
yoi:httpsauthorization before allowing the import. - HTTPS-only, embedded-credential rejection, host/method/path allowlist, request/header/body bounds, response truncation, timeout, no redirects,
no_proxy(), sensitive-header rejection/redaction, and ordinary Tool result flow remain present. - Existing tests cover missing grant before network, disallowed host/method/scheme/private targets before network, timeout/redaction, response truncation, no network without HTTPS import, and ordinary Tool result path.
- Grant checks happen before request validation/client dispatch in
Reviewer validation:
- Static diff/code review and worktree status inspection.
- Orchestrator-reported successful runs were reviewed:
cargo fmt --checkcargo check -p pod -p manifest -p yoi- focused pod/manifest/yoi plugin tests
git diff --checknix build .#yoi --no-link
Conclusion:
- Previous request_changes blockers are resolved.
- Implementation satisfies the recorded Ticket acceptance criteria and is ready for merge/validation in the Orchestrator worktree.
Review: approve
Review result: approve
対象:
- Ticket:
00001KVFDX9AF - branch:
impl/00001KVFDX9AF-plugin-https-host-api - commits:
7377527f—plugin: implement https host api85683f17—plugin: harden https target validation
No remaining blockers found.
Evidence reviewed:
- IPv4-mapped / compatible IPv6 bypass is closed.
- Host canonicalization strips IPv6 brackets before IP parsing via
normalize_host_literal/canonical_host. validate_static_https_targetparses canonical hosts asIpAddrand appliesvalidate_public_ip.is_forbidden_ipv6delegates mapped/compatible embedded IPv4 addresses throughipv6_embedded_ipv4, then applies existing IPv4 private/loopback/link-local/broadcast/special checks.ipv4_mapped_ipv6_targets_deny_before_networkcovers::ffff:127.0.0.1,::ffff:10.0.0.1,::ffff:169.254.169.254, and compatible::10.0.0.1, with mock network call count asserted as zero.
- Host canonicalization strips IPv6 brackets before IP parsing via
- DNS validation is bound to the reqwest connection path.
ReqwestPluginHttpsClient::executecallsresolve_https_target_for_clientbefore building the client.- Hostname URLs resolve to
SocketAddrs, reject empty/private/local answers, and return those exact validated addresses. - reqwest builder pins each validated domain using
resolve_to_addrs(domain, &pinned_resolution.addrs), with no remaining separate unvalidated DNS lookup path visible in this implementation. - IP-literal URLs skip DNS pinning only after static IP validation.
- DNS tests are deterministic and meaningful at the unit boundary.
FakeHttpsResolveravoids live DNS/network.dns_resolution_is_pinned_to_validated_public_socket_addressesverifies resolver input, returned pinned domains/addrs, and reqwest builder acceptance ofresolve_to_addrs.dns_resolution_rejects_private_addresses_before_client_buildverifies private DNS answers fail before client build/network dispatch.
- Prior positives remain preserved.
- Grant checks happen before request validation/client dispatch in
execute_plugin_https_request. - WASM import validation checks
yoi:httpsauthorization before allowing the import. - HTTPS-only, embedded-credential rejection, host/method/path allowlist, request/header/body bounds, response truncation, timeout, no redirects,
no_proxy(), sensitive-header rejection/redaction, and ordinary Tool result flow remain present. - Existing tests cover missing grant before network, disallowed host/method/scheme/private targets before network, timeout/redaction, response truncation, no network without HTTPS import, and ordinary Tool result path.
- Grant checks happen before request validation/client dispatch in
Reviewer validation:
- Static diff/code review and worktree status inspection.
- Orchestrator-reported successful runs were reviewed:
cargo fmt --checkcargo check -p pod -p manifest -p yoi- focused pod/manifest/yoi plugin tests
git diff --checknix build .#yoi --no-link
Conclusion:
- Previous request_changes blockers are resolved.
- Implementation satisfies the recorded Ticket acceptance criteria and is ready for merge/validation in the Orchestrator worktree.