merge: integrate orchestration branch

# Conflicts:
#	.yoi/tickets/00001KV0TJVN5/item.md
#	.yoi/tickets/00001KV0TJVN5/thread.md
This commit is contained in:
2026-06-14 02:50:53 +09:00
8 changed files with 619 additions and 64 deletions
+1 -1
View File
@@ -2,7 +2,7 @@
title: 'E2E harness が最新 yoi binary を自動 build して使うようにする'
state: 'closed'
created_at: '2026-06-13T15:46:07Z'
updated_at: '2026-06-13T16:34:06Z'
updated_at: '2026-06-13T16:53:48Z'
assignee: null
readiness: 'ready'
queued_by: 'yoi ticket'
+21
View File
@@ -284,5 +284,26 @@ Ticket を closed にしました。
Closed after prior done-state completion.
---
<!-- event: comment author: orchestrator at: 2026-06-13T16:53:48Z -->
## 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-orchestrator` and `workspace-orchestrator` appeared.
Current assessment:
- Earlier E2E runs before the env isolation follow-up inherited host environment, including likely `XDG_RUNTIME_DIR`, so `yoi panel` could observe the host/global runtime Pod registry under `/run/user/...` even though `HOME`/`XDG_DATA_HOME` were fixture paths。
- The fixture also intentionally writes blocking Pod metadata for `workspace` and `workspace-orchestrator` under fixture `XDG_DATA_HOME` to 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 inheriting `XDG_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_DIR` or equivalent controlled fixture runtime path, or an assertion that fallback runtime is fixture-local)。
- Add regression assertions/artifacts proving tested `yoi panel` sees 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-orchestrator` artifacts only after confirming whether they are live Pods, fixture artifacts, or prior Panel-created worktrees。
---
@@ -0,0 +1,21 @@
{
"version": 1,
"relations": [
{
"ticket_id": "00001KV0YK5S0",
"kind": "related",
"target": "00001KSKBP9YG",
"note": "E2E harness first slice の runtime/tmp isolation と cleanup follow-up。",
"author": "orchestrator",
"at": "2026-06-13T16:56:22Z"
},
{
"ticket_id": "00001KV0YK5S0",
"kind": "related",
"target": "00001KV0TJVN5",
"note": "E2E binary/env isolation follow-up の残課題(runtime/data/workspace isolation and cleanup)を補う。",
"author": "orchestrator",
"at": "2026-06-13T16:56:22Z"
}
]
}
+43
View File
@@ -0,0 +1,43 @@
---
title: 'E2E harness を完全な tmp runtime/data/workspace 隔離と cleanup に対応させる'
state: 'done'
created_at: '2026-06-13T16:56:11Z'
updated_at: '2026-06-13T17:33:53Z'
assignee: null
readiness: 'ready'
queued_by: 'yoi ticket'
queued_at: '2026-06-13T16:56:31Z'
---
## 背景
E2E harness は `00001KSKBP9YG` / `00001KV0TJVN5` で Panel PTY E2E、最新 `yoi` binary build、tested subprocess の env isolation を導入した。しかし、ユーザーから `yoi-orchestrator-orchestrator` / `workspace-orchestrator` などの Pod/worktree artifact が出現したとの報告があり、host runtime / Pod registry / worktree artifact isolation と cleanup がまだ十分に証明されていない。
既知の問題:
- 初期 E2E は `env_clear()` 前に `XDG_RUNTIME_DIR` など host env を継承し得た。
- Fixture は `workspace` / `workspace-orchestrator` の Pod metadata を作るが、これは fixture-local でなければならない。
- 現在の env isolation は host env leak を防ぐが、E2E が完全に clean な tmp runtime/data/workspace で動き、実行後に cleanup することを明示的に保証・検証していない。
## 要件
- E2E は毎回完全に clean な temporary environment を作って実行する。
- Workspace / HOME / XDG_DATA_HOME / XDG_STATE_HOME / XDG_CONFIG_HOME / runtime dir / artifacts root を fixture ごとに分離する。
- Tested `yoi` subprocess は host runtime / Pod registry / session / worktree / data dir を見ない。
- Fixture で作る Pod metadata(例: `workspace`, `workspace-orchestrator`)は fixture-local であり、host/global registry に出ない。
- 実行後、fixture runtime/data/workspace/temp dirs は成功・失敗に関係なく cleanup される。失敗時に必要な artifact は `target/e2e-artifacts/...` にコピーしてから cleanup する。
- Cleanup policy / fixture root / runtime dir / data dir / removed paths を artifact に記録する。
- 既存の binary provider、env credential isolation、mouse capture tracking、quit pending barrier を壊さない。
## 受け入れ条件
- `cargo test -p yoi-e2e --features e2e --test panel -- --nocapture` が clean tmp env を使い、終了後に fixture temp root を残さない。
- E2E artifact から fixture workspace/data/runtime paths と cleanup result が確認できる。
- Test または assertion により、Panel が host live Pods / host runtime registry を見ていないことを確認する。
- Fixture-created `workspace-orchestrator` 等が fixture-local であり、cleanup 後に temp root ごと消えることを確認する。
- Host `XDG_RUNTIME_DIR` などを設定した状態でも tested `yoi` は fixture runtime だけを見る。
- `cargo fmt --check``git diff --check`、関連 `cargo check` / E2E tests が pass する。
## 関連
- `00001KSKBP9YG`: E2E harness first slice。
- `00001KV0TJVN5`: E2E binary provider / env isolation follow-up。
+195
View File
@@ -0,0 +1,195 @@
<!-- event: create author: orchestrator at: 2026-06-13T16:56:11Z -->
## 作成
LocalTicketBackend によって作成されました。
---
<!-- event: intake_summary author: orchestrator at: 2026-06-13T16:56:22Z -->
## Intake summary
ユーザーが E2E を完全に clean な tmp environment で実行し、毎回 cleanup することを明示した。要件は workspace/HOME/XDG/runtime/artifacts の fixture 分離、host Pod/runtime registry 非参照、fixture-created Pod metadata の fixture-local 化、成功/失敗時 cleanup と artifact 記録。
---
<!-- event: state_changed author: orchestrator at: 2026-06-13T16:56:22Z from: planning to: ready reason: user_authorized_clean_tmp_e2e_isolation field: state -->
## State changed
Ticket planning が完了しました。state planning -> ready。
---
<!-- event: state_changed author: "yoi ticket" at: 2026-06-13T16:56:31Z from: ready to: queued reason: queued field: state -->
## State changed
Ticket を `yoi ticket` が queued にしました。
---
<!-- event: decision author: orchestrator at: 2026-06-13T16:56:50Z -->
## Decision
Routing decision: implementation_ready
Reason:
- ユーザーが E2E harness の clean tmp environment / cleanup を明示した。
- Ticket は `queued` で、要件・受け入れ条件は具体的。既存 `00001KSKBP9YG` / `00001KV0TJVN5` の follow-up で、主な変更面は `tests/e2e` に bounded される。
- Blocking relation はなく、既存 queued Tickets とは変更面が異なる。Orchestrator worktree は clean。
- Risk は test/runtime isolation だが、binding invariantshost runtime registry 非参照、fixture-local Pod metadata、cleanup artifact 記録)が明確なため実装可能。
Evidence checked:
- 新規 Ticket body / related records。
- `00001KV0TJVN5` の post-merge concern: host/global runtime registry を見た可能性、fixture `workspace-orchestrator` metadata、runtime isolation assertion 不足。
- Existing E2E code map: `tests/e2e/src/lib.rs` の fixture setup / `PanelHarness::spawn` / `run_yoi_capture` / artifact handling。
- Orchestrator workspace state: clean。
IntentPacket:
Intent:
- E2E harness が毎回 clean な tmp workspace/data/runtime environment で実行され、host Pod/runtime registry を見ず、成功・失敗に関係なく fixture temp を cleanup するようにする。
Binding decisions / invariants:
- Tested `yoi` process は host runtime/data/session/worktree/Pod registry を見ない。
- Fixture-created Pods (`workspace`, `workspace-orchestrator` 等) は fixture-local。
- Failure diagnostics は `target/e2e-artifacts` にコピーして残し、fixture temp root は cleanup する。
- Existing binary provider、env credential isolation、mouse capture guard、quit pending barrier を壊さない。
- Root/original workspace では作業しない。
Requirements / acceptance criteria:
- `cargo test -p yoi-e2e --features e2e --test panel -- --nocapture` が clean tmp env を使い、終了後に fixture temp root を残さない。
- Artifact に fixture workspace/data/runtime paths、cleanup result、env/runtime policy が残る。
- Test/assertion で Panel が host live Pods / host runtime registry を見ないことを確認する。
- Host `XDG_RUNTIME_DIR` 等が設定されていても tested `yoi` は fixture runtime だけを見る。
- `cargo fmt --check` / `git diff --check` / relevant checks / E2E tests が pass。
Implementation latitude:
- `tempfile::TempDir` / custom guard / artifact snapshot strategy の具体設計は Coder が選んでよい。
- Runtime dir は explicit `XDG_RUNTIME_DIR` fixture path でも、Yoi-specific fixture runtime env でもよいが、host fallback を使わないことを artifact/assertion で示す。
- Failure artifact は fixture tree 全体ではなく必要 subset copy でよい。
Escalate if:
- Yoi runtime path discovery に explicit test runtime dir を渡す public/production surface 変更が必要になる場合。
- Cleanup と artifact preservation が両立しない design constraint がある場合。
---
<!-- event: state_changed author: orchestrator at: 2026-06-13T16:56:58Z from: queued to: inprogress reason: orchestrator_acceptance_user_requested_clean_tmp_isolation field: state -->
## State changed
Ticket evidence、related E2E tickets、existing code map、Orchestrator worktree clean state を確認した。ユーザーが明示的に修正を依頼しており、blocking relation はない。実装 side effect の前に inprogress acceptance を記録する。
---
<!-- event: implementation_report author: hare at: 2026-06-13T17:06:29Z -->
## Implementation report
Implemented scoped E2E tmp/runtime isolation for Ticket 00001KV0YK5S0.
Files changed:
- `tests/e2e/src/lib.rs`
- `FixtureWorkspace` now owns a `TempDir` under `target/e2e-tmp` and writes persistent scenario artifacts under `target/e2e-artifacts/<run-id>`.
- Each fixture creates isolated workspace, HOME, XDG data/state/config/runtime dirs and passes `XDG_RUNTIME_DIR` explicitly to all tested `yoi` subprocesses under `env_clear`.
- Fixture metadata records fixture root, workspace/home/XDG paths, runtime policy, env policy, and cleanup result.
- Cleanup snapshots the fixture tree into persistent artifacts, closes/removes the temp root, writes `cleanup.json`, and reports cleanup failure.
- `tests/e2e/tests/panel.rs`
- Existing two Panel E2E tests now assert fixture path isolation, absence of host/runtime Pod marker leakage in rendered rows, and explicit fixture cleanup/removal after each scenario.
Isolation/cleanup policy:
- Tested `yoi` never inherits host env wholesale; fixture setup and Panel subprocesses use `env_clear` with an allowlist that includes only fixture HOME/XDG data/state/config/runtime plus test/runtime-specific variables.
- `XDG_RUNTIME_DIR` is always a fixture-local runtime dir under the temporary fixture root.
- Fixture-local Pod metadata markers (`workspace`, `workspace-orchestrator`) are created only inside fixture data home and panel rows assert no host/fixture runtime markers leak.
- Artifacts persist outside the temp root in `target/e2e-artifacts`; cleanup snapshots selected fixture contents there before removing the temp root.
Validation:
- `cargo check -p yoi-e2e --all-targets --features e2e` — passed.
- `cargo test -p yoi-e2e --features e2e --test panel -- --nocapture` — passed (2 tests).
- `XDG_RUNTIME_DIR=/tmp/yoi-e2e-host-runtime-leak-test OPENAI_API_KEY=host-secret cargo test -p yoi-e2e --features e2e --test panel -- --nocapture` — passed (2 tests); artifacts show fixture `xdg_runtime_dir`, `host_xdg_runtime_dir_present: true`, and `cleanup_success: true`.
- `YOI_E2E_BIN=target/debug/yoi cargo test -p yoi-e2e --features e2e --test panel -- --nocapture` — passed (2 tests).
- `cargo fmt --check` — passed.
- `git diff --check` — passed.
Remaining gaps:
- No known gaps within the delegated scope.
---
<!-- event: review author: orchestrator at: 2026-06-13T17:31:57Z status: approve -->
## Review: approve
外部 Reviewer Pod 起動を試みたが、この Orchestrator の現在の delegation scope では child launch validation が要求する root workspace read grant を再委譲できず、Reviewer Pod を起動できなかった。そのため Orchestrator が実装 diff・validation・artifact を直接確認した。
確認した実装:
- `tests/e2e/src/lib.rs` に per-scenario `FixtureWorkspace` / `TempDir` 管理を追加。
- fixture root 配下に `workspace``home``data``state``config``runtime` を作り、tested `yoi` には `env_clear()` + fixture-local `XDG_RUNTIME_DIR` を渡す。
- `PanelHarness::spawn` と fixture setup command は host `XDG_RUNTIME_DIR` / host provider env を継承しない。
- fixture snapshot / cleanup report / fixture metadata を `target/e2e-artifacts/<run>/` に保存し、fixture temp root は cleanup 後に存在しないことを記録する。
- tests は hostile host `XDG_RUNTIME_DIR` を設定した状態でも fixture runtime policy を使う。
- existing binary provider、mouse capture guard、quit pending barrier、env credential isolation は維持されている。
Validation performed by Orchestrator:
- `cargo fmt --check`: PASS
- `git diff --check`: PASS
- `cargo check -p yoi-e2e --all-targets --features e2e`: PASS
- `XDG_RUNTIME_DIR=/tmp/yoi-e2e-host-runtime-leak-test 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
- artifact spot-check: recent `cleanup.json` records `cleanup_success: true` and `fixture_root_exists_after: false`
- `target/e2e-tmp` の直下に residual fixture temp root が残っていないことを確認。
Notes:
- Failure artifact は fixture snapshot を保存するため、host への leak ではなく `target/e2e-artifacts` に診断情報が残る。
- Fixture-created `workspace` / `workspace-orchestrator` Pod metadata は fixture data dir / snapshot に閉じる。host runtime/data registry を読む経路は fixture `XDG_RUNTIME_DIR` + env clear により遮断されている。
Decision: approve.
---
<!-- event: implementation_report author: orchestrator at: 2026-06-13T17:33:46Z -->
## Implementation report
Integration outcome: merged and validated.
- Implementation branch: `ticket-00001KV0YK5S0-e2e-tmp-isolation`
- Implementation commit: `07e754ce test: isolate e2e tmp runtime fixtures`
- Review: Orchestrator direct review `approve`Reviewer Pod は現 delegated scope の child launch validation 制約で起動できなかったため、Orchestrator が diff / validation / artifact を確認)
- Orchestrator merge commit: `20184eeb merge: e2e tmp isolation`
Implemented:
- E2E fixture now creates per-scenario clean temp root under `target/e2e-tmp` with isolated workspace, HOME, XDG data/state/config, and explicit fixture `XDG_RUNTIME_DIR`
- Tested `yoi` subprocesses continue to use `env_clear()` and now receive fixture-local runtime dir, preventing host runtime / Pod registry observation。
- Fixture metadata, run metadata, fixture snapshot, and cleanup report are persisted under `target/e2e-artifacts/<run>` before temp cleanup。
- Fixture temp roots are removed after scenario completion, and cleanup reports record `cleanup_success` plus `fixture_root_exists_after`
- Existing binary provider, `YOI_E2E_BIN` override, credential env isolation, mouse capture guard, and quit pending barrier remain intact。
Orchestrator validation after merge:
- `cargo fmt --check`: PASS
- `git diff --check`: PASS
- `cargo check -p yoi-e2e --all-targets --features e2e`: PASS
- `XDG_RUNTIME_DIR=/tmp/yoi-e2e-host-runtime-leak-test 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`: PASS2 tests
- Artifact spot-check: latest `cleanup.json` files record `cleanup_success: true` and `fixture_root_exists_after: false`
- `target/e2e-tmp` direct child count after validation: 0。
Residual notes:
- Persistent diagnostic artifacts intentionally remain under `target/e2e-artifacts`
- Fixture snapshots may contain fixture-local `workspace` / `workspace-orchestrator` metadata, but those live under the copied artifact snapshot, not host runtime/data state。
Next:
- Mark Ticket `done` and clean up implementation worktree/branch.
---
<!-- event: state_changed author: orchestrator at: 2026-06-13T17:33:53Z from: inprogress to: done reason: merged_and_validated field: state -->
## State changed
E2E tmp/runtime isolation follow-up was reviewed, merged into the Orchestrator branch as `20184eeb`, and validated in the Orchestrator worktree. Panel E2E now uses clean per-scenario tmp workspace/data/runtime fixtures, preserves artifacts under `target/e2e-artifacts`, removes fixture temp roots after runs, and does not inherit host runtime/credential environment. Ticket implementation work is done; closure remains separate.
---