# Conflicts: # .yoi/tickets/00001KV0TJVN5/item.md # .yoi/tickets/00001KV0TJVN5/thread.md
19 KiB
作成
LocalTicketBackend によって作成されました。
Intake summary
ユーザーが cargo build による最新 yoi binary 入手を E2E harness default にする方針を明示した。要件・受け入れ条件は、YOI_E2E_BIN override を残しつつ、通常 E2E 実行では harness が cargo build -p yoi --features e2e-test --bin yoi を実行し、生成 binary を直接 PTY spawn すること。
State changed
Ticket planning が完了しました。state planning -> ready。
State changed
Ticket を yoi ticket が queued にしました。
Decision
Routing decision: implementation_ready
Reason:
- ユーザーが方針を明示した:
cargo runを PTY の process-under-test にせず、E2E harness がcargo build -p yoi --features e2e-test --bin yoiを実行し、生成された binary を直接 spawn する。 - Ticket は
queuedで、要件・受け入れ条件は具体的。blocking relation はなく、既存 E2E harness の小さな follow-up として実装可能。 - 既存 production/non-production boundary、mouse capture check、quit pending barrier は維持すべき invariant として明記済み。
Evidence checked:
- Ticket body / relation to
00001KSKBP9YG。 - Existing E2E harness code:
tests/e2e/src/lib.rs::yoi_binary()currently prefersYOI_E2E_BIN, then inferstarget/debug/yoi, but does not build it。 - Orchestrator worktree is clean。
IntentPacket:
Intent:
cargo test -p yoi-e2e --features e2e ...を任意タイミングで実行しても、harness が最新 source から E2E 用yoibinary を build して直接 PTY spawn するようにする。
Binding decisions / invariants:
cargo runを process-under-test にしない。YOI_E2E_BINexplicit override は残してよい。- default path は harness 内
cargo build -p yoi --features e2e-test --bin yoi+ direct binary spawn。 - production/non-production boundary と
e2e-testfeature gating を壊さない。 - mouse capture tracking / quit pending barrier を壊さない。
Requirements / acceptance criteria:
- 事前 manual build なしに
cargo test -p yoi-e2e --features e2e --test panel -- --nocaptureが pass する。 YOI_E2E_BIN=<path>指定時は override としてその path が使われる。- Build command / binary path が artifact または diagnostics から分かる。
cargo fmt --check、git diff --check、関連 checks が pass。
Implementation latitude:
OnceLock等で同一 test process 内の build を 1 回にまとめてよい。- Workspace root detection は
CARGO_MANIFEST_DIRparent traversal、cargo metadata、または robust helper のいずれでもよい。 - Cargo executable は
CARGOenv を尊重する。
Escalate if:
- workspace/package layout 上、E2E test process 内から cargo build するのが大きな cyclic/build-system 問題を起こす場合。
- Nix/package source filter 等の追加変更が必要になる場合。
State changed
Ticket evidence、existing E2E harness code map、Orchestrator worktree clean state を確認した。ユーザーが明示的に修正を依頼しており、blocking relation はない。実装 side effect の前に inprogress acceptance を記録する。
Decision
追加の critical gap: E2E subprocess environment が host credentials を継承し得る。
Current finding:
PanelHarness::spawnと fixture setup のrun_yoi_captureはCommand::new(binary)に対してenv_clear()を呼んでいない。HOME/XDG_*は fixture dir に差し替えているが、通常の process environment は継承される。- そのため、現時点の Panel tests は LLM call を意図的に起こしていないものの、何らかの E2E path が provider/LLM call に到達した場合、host の
OPENAI_API_KEY/ANTHROPIC_API_KEY/ その他 provider credentials や secret-related env を見てしまう可能性がある。
Decision:
- E2E harness は default で host environment を継承してはならない。
Command起動時はenv_clear()を使い、必要最小限の env(HOME,XDG_*,TERM,PATH/CARGO等 build/runtime に必要なもの、YOI_TUI_TEST_EVENTS,YOI_POD_RUNTIME_COMMAND, explicit test env)だけを allowlist で渡す。- Provider credentials / secret refs / network credentials は default deny。LLM/provider E2E を将来追加する場合は fixture provider / canned server / explicit test-only env で渡す。
- Panel/TUI E2E は real LLM call が発生しないことを前提にし、host auth への依存を禁止する。
Acceptance addition for 00001KV0TJVN5:
- Existing subprocess launches (
PanelHarness::spawn,run_yoi_capture, cargo build provider where appropriate) must not leak host provider credentials to the testedyoiprocess。 - At minimum, yoi subprocess env should be allowlisted and provider key names should be absent unless explicitly supplied by a future fixture provider test。
Decision
Environment-boundary reference added: docs/development/environment.md is binding context for this follow-up.
Relevant policy:
- Environment variables are a minimized runtime boundary.
- Provider credentials and runtime configuration should not depend on ambient process state.
- Tests should prefer typed fixtures/injection and mutate process environment only around thin env-reader behavior.
YOI_POD_RUNTIME_COMMANDis a development-only executable-path override, not a general ambient configuration channel.
Implication for this Ticket:
- E2E harness must not let tested
yoisubprocesses inherit host env by default. PanelHarness::spawnand fixture setup commands should useenv_clear()plus an explicit allowlist.- Provider/secret/network credential env must be absent unless a future provider-fixture E2E explicitly injects test-only values.
- Existing
YOI_*test env should be limited to the feature-gated E2E observability/binary runtime paths and documented as test-only/dev-only surface, not normal runtime configuration. - The cargo build provider should avoid putting Cargo itself in the measured PTY path; any build env inheritance must be considered separately from the tested
yoisubprocess env boundary.
Implementation report
Implementation report for Ticket 00001KV0TJVN5
Files changed:
tests/e2e/src/lib.rs- Added a cached e2e binary provider using
OnceLock. - Preserves
YOI_E2E_BIN=<path>as the explicit override and skips the default cargo build provider in that path. - Default path runs
${CARGO:-cargo} build -p yoi --features e2e-test --bin yoifrom the workspace root, then returns the directtarget/{profile}/yoibinary path for PTY spawning. - Writes
target/e2e-artifacts/binary-provider.jsonand emits diagnostics with provider, build command, and binary path. - Expanded command-failure diagnostics to include command args.
- Added a cached e2e binary provider using
tests/e2e/tests/panel.rs- Updated panel tests to use the fallible cached binary provider.
Validation:
cargo fmt --check— passed.git diff --check— passed.cargo check -p yoi-e2e --all-targets --features e2e— passed.unset YOI_E2E_BIN && cargo test -p yoi-e2e --features e2e --test panel -- --nocapture— passed; default provider built the currentyoibinary and PTY-spawnedtarget/debug/yoi.YOI_E2E_BIN=/home/hare/Projects/yoi/.worktree/e2e-binary-provider/target/debug/yoi cargo test -p yoi-e2e --features e2e --test panel -- --nocapture— passed; override provider path used without invoking the default cargo-build provider.
Remaining gaps:
- None known.
Implementation report
Implementation report for Ticket 00001KV0TJVN5
Files changed:
tests/e2e/src/lib.rs- Added a cached e2e binary provider using
OnceLock. - Preserves
YOI_E2E_BIN=<path>as the explicit override and skips the default cargo build provider in that path. - Default path runs
${CARGO:-cargo} build -p yoi --features e2e-test --bin yoifrom the workspace root, then returns the directtarget/{profile}/yoibinary path for PTY spawning. - Writes
target/e2e-artifacts/binary-provider.jsonand emits diagnostics with provider, build command, binary path, and tested-subprocess env policy. - Expanded command-failure diagnostics to include command args.
- Follow-up: isolated tested
yoisubprocess environments in bothPanelHarness::spawnand fixture setuprun_yoi_capturewithenv_clear()plus explicit allowlists only. - Follow-up: recorded env policy in
run.json,binary-provider.json, and per-fixturefixture-commands.jsonlartifacts. - Follow-up: added a regression assertion that tested-subprocess policies use
env_clear, do not allowPATH, and default-deny provider credentials (OPENAI_API_KEY,ANTHROPIC_API_KEY,GEMINI_API_KEY) and secret-like patterns. - Follow-up: relative
YOI_E2E_BINvalues are resolved against the workspace root and must exist, so tested subprocess launch does not rely onPATHlookup.
- Added a cached e2e binary provider using
tests/e2e/tests/panel.rs- Updated panel tests to use the fallible cached binary provider.
Env isolation policy:
- Cargo build provider remains a build-tool command and is not treated as the tested
yoisubprocess. - Tested
yoifixture setup commands receive only:HOME,XDG_DATA_HOME,XDG_STATE_HOME,XDG_CONFIG_HOME,YOI_POD_RUNTIME_COMMAND. - Tested
yoi panelcommands receive only: fixtureHOME,XDG_DATA_HOME,XDG_STATE_HOME,XDG_CONFIG_HOME,TERM,YOI_TUI_TEST_EVENTS,YOI_POD_RUNTIME_COMMAND, andYOI_TUI_TEST_HOLD_BACKGROUND_TASKwhen used. PATHis intentionally not passed to testedyoisubprocesses; the harness launches the already-resolved binary path directly.- Host provider credentials / token / secret-like environment variables are default-denied. Future provider/LLM E2E should use fixture providers, canned servers, or explicit test env instead of inheriting host credentials.
Validation:
cargo fmt --check— passed.git diff --check— passed.cargo check -p yoi-e2e --all-targets --features e2e— passed.cargo test -p yoi-e2e --features e2e tested_yoi_env_policy_is_env_clear_allowlist -- --nocapture— passed.unset YOI_E2E_BIN && OPENAI_API_KEY=host-secret ANTHROPIC_API_KEY=host-secret GEMINI_API_KEY=host-secret cargo test -p yoi-e2e --features e2e --test panel -- --nocapture— passed; default provider built the currentyoibinary and testedyoisubprocesses used isolated env policy artifacts. Host provider env was present for the harness but is not inherited by testedyoisubprocesses becauseenv_clear()is applied before the allowlist.YOI_E2E_BIN=/home/hare/Projects/yoi/.worktree/e2e-binary-provider/target/debug/yoi OPENAI_API_KEY=host-secret ANTHROPIC_API_KEY=host-secret GEMINI_API_KEY=host-secret cargo test -p yoi-e2e --features e2e --test panel -- --nocapture— passed; override provider path used without invoking the default cargo-build provider, and testedyoisubprocesses still used isolated env policy.
Remaining gaps:
- None known.
Review: approve
Review: approve
Decision: approve for Ticket 00001KV0TJVN5.
Evidence reviewed:
- Ticket intent/acceptance criteria require default E2E setup to build
yoiwithcargo build -p yoi --features e2e-test --bin yoi, then direct-spawn the produced binary, while preservingYOI_E2E_BINoverride and existing panel E2E behavior. tests/e2e/src/lib.rsnow resolvesyoi_binary()through aOnceLock-cachedBinaryProviderInfo. The default path runs${CARGO:-cargo} build -p yoi --features e2e-test --bin yoifrom the workspace root and returnstarget/{debug|release}/yoi; the override path validates and usesYOI_E2E_BINwithout invoking the cargo-build provider.- PTY execution remains
Command::new(&config.binary).arg("panel");cargo runis not in the process-under-test path. PanelHarness::spawnand fixturerun_yoi_captureboth callenv_clear()and then set only explicit fixture/test variables.PATHand provider credentials are not allowlisted.YOI_POD_RUNTIME_COMMANDis set to the resolved binary path, so tested subprocesses do not need hostPATH.- Diagnostics/artifacts include provider/build/env policy in
target/e2e-artifacts/binary-provider.json, panelrun.json, and fixturefixture-commands.jsonl. - Existing mouse-capture guard (
expect_mouse_capture_enabled/ SGR 1000+1006 tracking), background-task quit barrier assertions, ande2e-testproduction boundary code were not weakened by this diff.
Validation:
- Reviewer reran
git diff --check a4df9754..HEAD— passed. - Reviewer reran
cargo test -p yoi-e2e --features e2e tested_yoi_env_policy_is_env_clear_allowlist -- --nocapture— passed. - Also accepted Orchestrator-reported full validation, including fmt/check,
cargo check -p yoi-e2e --all-targets --features e2e, default panel E2E with host provider env present, andYOI_E2E_BINoverride panel E2E with host provider env present — all reported passed.
Risks / follow-up:
- No blocking issues found. The cargo build provider intentionally still uses build-tool environment; tested
yoisubprocesses are isolated.
Implementation report
Integration outcome: merged and validated.
- Implementation branch:
ticket-00001KV0TJVN5-e2e-binary-provider - Implementation commits:
13d00530 test: build e2e yoi binary provider,47efeb01 test: isolate e2e yoi subprocess env - Review commit/event:
7e24a8df ticket: approve e2e binary provider - Orchestrator merge commit:
8abc2b7f merge: e2e binary provider
Implemented:
- Default E2E binary provider now runs
${CARGO:-cargo} build -p yoi --features e2e-test --bin yoifrom workspace root, caches the result, and direct-spawns the producedtarget/{profile}/yoibinary for PTY tests。 YOI_E2E_BIN=<path>remains an explicit override and skips the default cargo-build provider。cargo runis not used as process-under-test; Cargo is not in the PTY/signal/quit-latency measured path。- Tested
yoisubprocesses (PanelHarness::spawnand fixture setuprun_yoi_capture) now useenv_clear()plus explicit allowlists only。 - Host provider credentials / token / secret-like env are default-denied for tested
yoisubprocesses。 - Artifacts include binary provider/build command/binary path and tested subprocess env policy。
Orchestrator validation after merge:
cargo fmt --check: PASSgit diff --check: PASScargo check -p yoi-e2e --all-targets --features e2e: PASScargo test -p yoi-e2e --features e2e tested_yoi_env_policy_is_env_clear_allowlist -- --nocapture: PASSunset YOI_E2E_BIN && OPENAI_API_KEY=host-secret ANTHROPIC_API_KEY=host-secret GEMINI_API_KEY=host-secret cargo test -p yoi-e2e --features e2e --test panel -- --nocapture: PASS(default cargo-build provider used; 2 panel E2E tests passed)YOI_E2E_BIN=/home/hare/Projects/yoi/.worktree/orchestration/yoi-orchestrator/target/debug/yoi OPENAI_API_KEY=host-secret ANTHROPIC_API_KEY=host-secret GEMINI_API_KEY=host-secret cargo test -p yoi-e2e --features e2e --test panel -- --nocapture: PASS(override provider used; 2 panel E2E tests passed)
Residual note:
- Cargo build provider intentionally uses build-tool environment; only tested
yoisubprocesses are env-isolated. Future LLM/provider E2E should use fixture providers/canned servers/explicit test env, not host credentials。
Next:
- Mark Ticket
doneand clean up child coder/reviewer Pods plus implementation worktree/branch. Closure remains separate。
State changed
E2E binary provider follow-up was reviewed, approved, merged into the Orchestrator branch as 8abc2b7f, and validated in the Orchestrator worktree. Default E2E runs now build the current yoi binary before direct PTY spawn, YOI_E2E_BIN override remains available, and tested yoi subprocesses are isolated with env_clear() plus allowlist so host provider credentials are not inherited. Ticket implementation work is done; closure remains separate.
State changed
Ticket を closed にしました。
完了
Closed after prior done-state completion.
Comment
Post-merge concern from user: E2E isolation may still have leaked or left visible Pod/worktree artifacts.
Observed concern:
- User reports Pods named
yoi-orchestrator-orchestratorandworkspace-orchestratorappeared.
Current assessment:
- Earlier E2E runs before the env isolation follow-up inherited host environment, including likely
XDG_RUNTIME_DIR, soyoi panelcould observe the host/global runtime Pod registry under/run/user/...even thoughHOME/XDG_DATA_HOMEwere fixture paths。 - The fixture also intentionally writes blocking Pod metadata for
workspaceandworkspace-orchestratorunder fixtureXDG_DATA_HOMEto drive panel rows. That should be fixture-local, but if runtime/data isolation is wrong it can become visible outside the intended fixture。 - The later
env_clear()+ allowlist fix prevents host env credential leak and likely prevents inheritingXDG_RUNTIME_DIR, causing runtime fallback to fixture HOME; however, no explicit regression assertion currently proves that E2E cannot see/create global runtime Pod state or workspace-orchestrator worktrees。
Required follow-up direction:
- Add explicit runtime isolation to E2E (
XDG_RUNTIME_DIRor equivalent controlled fixture runtime path, or an assertion that fallback runtime is fixture-local)。 - Add regression assertions/artifacts proving tested
yoi panelsees only fixture Pod metadata/runtime state and does not observe host live Pods。 - Ensure E2E cleanup removes any fixture Pod metadata/runtime/worktree artifacts it creates。
- Investigate and clean any residual
yoi-orchestrator-orchestrator/workspace-orchestratorartifacts only after confirming whether they are live Pods, fixture artifacts, or prior Panel-created worktrees。