merge: integrate orchestration branch
This commit is contained in:
@@ -0,0 +1,2 @@
|
||||
{"id":"orch-plan-20260614-154052-1","ticket_id":"00001KT0Z4BK8","kind":"waiting_capacity_note","note":"Ticket 自体は implementation_ready で blocking relation なし。現在 `00001KTFY8V80` と `00001KV09WYC6` の Coder Pod が running で、review/integration follow-up capacity も必要なため、追加 spawn は一時待機する。","author":"yoi-orchestrator","at":"2026-06-14T15:40:52Z"}
|
||||
{"id":"orch-plan-20260614-154934-2","ticket_id":"00001KT0Z4BK8","kind":"accepted_plan","accepted_plan":{"summary":"Accept queued Plugin package/discovery design Ticket now that one active Coder has moved to review stage. Implement as design proposal and minimal safe references, preserving Plugin/MCP/feature authority boundaries.","branch":"impl/00001KT0Z4BK8-plugin-package-discovery","worktree":"/home/hare/Projects/yoi/.worktree/00001KT0Z4BK8-plugin-package-discovery","role_plan":"Orchestrator creates a dedicated implementation worktree and spawns a Coder with write scope limited to that worktree. Reviewer will run read-only after implementation report. This work is documentation/design-focused and source-disjoint from active Panel/TUI implementation."},"author":"yoi-orchestrator","at":"2026-06-14T15:49:34Z"}
|
||||
@@ -1,8 +1,8 @@
|
||||
---
|
||||
title: 'Plugin distribution package format and discovery'
|
||||
state: 'queued'
|
||||
state: 'done'
|
||||
created_at: '2026-06-01T06:49:53Z'
|
||||
updated_at: '2026-06-14T15:40:15Z'
|
||||
updated_at: '2026-06-14T15:56:45Z'
|
||||
queued_by: 'workspace-panel'
|
||||
queued_at: '2026-06-14T15:40:15Z'
|
||||
---
|
||||
|
||||
@@ -134,4 +134,245 @@ Marked ready by `yoi ticket state`.
|
||||
Ticket を `workspace-panel` が queued にしました。
|
||||
|
||||
|
||||
---
|
||||
|
||||
<!-- event: decision author: yoi-orchestrator at: 2026-06-14T15:40:52Z -->
|
||||
|
||||
## Decision
|
||||
|
||||
Routing decision: implementation_ready_but_waiting_capacity
|
||||
|
||||
Reason:
|
||||
- Ticket body / thread / artifacts、relation、OrchestrationPlan、Orchestrator workspace state を確認した。Plugin package / discovery / enablement boundary の design work item として要件・受け入れ条件・non-goals・invariants は十分に具体化されている。
|
||||
- blocking relation / OrchestrationPlan blocker はない。
|
||||
- Plugin package work は現在 active な Panel/TUI implementation と source surface が大きく重ならないため、設計上の conflict blocker ではない。
|
||||
- ただし現在 `00001KTFY8V80` と `00001KV09WYC6` の2件が inprogress で Coder Pod running。Reviewer follow-up と integration capacity も未使用ではなく、さらに queued Panel/TUI work 2件を待機させている。
|
||||
- 現時点では追加 Coder Pod を spawn せず、active Coder のいずれかが implementation report を返して review/integration 見通しが立ってから acceptance する。
|
||||
|
||||
Evidence checked:
|
||||
- Ticket body/thread: Plugin package design requirements、過去の Plugin/MCP/feature-layer decision、`planning -> ready`、Panel `ready -> queued` を確認。
|
||||
- Ticket relations: blocker なし。
|
||||
- OrchestrationPlan: 既存 record なし。
|
||||
- Orchestrator workspace: `/home/hare/Projects/yoi/.worktree/orchestration` は clean、queue commit `4be6c966` 上。
|
||||
- Visible Pods: `yoi-coder-00001KTFY8V80` と `yoi-coder-00001KV09WYC6` が running。
|
||||
|
||||
Next action:
|
||||
- 先行 inprogress Ticket の少なくとも1件が implementation report / review stage に進み、Coder capacity が空いた時点で再確認し、unblocked なら `queued -> inprogress` acceptance と dedicated worktree 作成へ進む。
|
||||
- planning return ではなく queued のまま waiting とする。
|
||||
|
||||
---
|
||||
|
||||
<!-- event: decision author: yoi-orchestrator at: 2026-06-14T15:49:34Z -->
|
||||
|
||||
## Decision
|
||||
|
||||
Routing decision: implementation_ready
|
||||
|
||||
Reason:
|
||||
- 先行 Coder のうち `00001KV09WYC6` が implementation report を返し review stage に入ったため、Plugin work 用の Coder capacity を再評価した。
|
||||
- Ticket body / thread / relations / orchestration plan / Orchestrator workspace state を再確認した。blocking relation はなく、既存 waiting note は capacity 起因であり、現在は1件分の Coder capacity を空けられる。
|
||||
- 本 Ticket は Plugin package / discovery / enablement boundary の design/documentation work が主で、active Panel/TUI implementation と source surface が大きく重ならない。
|
||||
- Plugin/MCP/feature-layer authority boundary に関する prior decisions は Ticket thread に記録済みで、残る不確実性は proposal の構成・記述・必要最小限の config shape 調査に閉じている。
|
||||
|
||||
Evidence checked:
|
||||
- Ticket body / thread: package format、store/source mapping、discovery vs enablement、manifest semantics、runtime-specific notes、cache/pinning、diagnostics、prior Plugin/MCP/feature-layer decisions を確認。
|
||||
- Ticket relations: blocker なし。
|
||||
- OrchestrationPlan: capacity waiting note 1件のみ。blocking/conflict record なし。
|
||||
- Orchestrator workspace: `/home/hare/Projects/yoi/.worktree/orchestration` は clean、`80a9e40d` 上。
|
||||
- Active Pods: `00001KTFY8V80` coder running、`00001KV09WYC6` reviewer running。
|
||||
- Bounded code/doc map: Plugin docs は未作成。関連 candidate は `docs/design/*`, `crates/manifest/src/{config,profile}.rs`, `crates/pod/src/feature.rs`, `crates/pod/src/hook.rs`。
|
||||
|
||||
IntentPacket:
|
||||
|
||||
Intent:
|
||||
- `.yoi-plugin` package distribution/discovery/enablement boundary の durable design proposal を repository に追加し、後続 implementation Ticket を独立して切れる状態にする。
|
||||
|
||||
Binding decisions / invariants:
|
||||
- Package presence in user/workspace plugin stores is discovery only; registration, WASM init, Hooks/Tools contribution, process/server startup, and MCP server launch require explicit enablement and grants.
|
||||
- Source-qualified identity is required: `user:<id>`, `project:<id>`, `builtin:<id>` are distinct; ambiguous unqualified IDs fail closed.
|
||||
- Plugin permission declarations are requests, not grants. Effective grants are Plugin-layer policy plus existing manifest/profile/scope/tool/web/secret/runtime allowlists.
|
||||
- Do not model Plugin permissions with `pod::feature` HostAuthority/grant concepts.
|
||||
- MCP remains a separate feature-backed integration and is out of initial Plugin packaging/runtime unless future Ticket explicitly approves a bridge.
|
||||
- Archive handling must reject path traversal and unsafe layout, use bounded extraction, compute deterministic digest, and materialize into digest-keyed cache before runtime initialization.
|
||||
- Restore should use resolved manifest/session metadata for enabled Plugin plan; fresh discovery must not silently upgrade a restored Pod.
|
||||
|
||||
Requirements / acceptance criteria:
|
||||
- Repository contains a documented Plugin distribution/package proposal covering `.yoi-plugin` archive structure, root `plugin.toml`, assets, user/workspace/builtin stores, source/trust mapping, identity collision rules, discovery vs enablement, manifest fields, archive safety, cache/digest/pinning, diagnostics, and runtime-specific notes for declarative hooks and WASM.
|
||||
- Proposal explicitly states store placement is discovery only, not execution or registration.
|
||||
- Proposal distinguishes Plugin permission request/grant model from `pod::feature` authority concepts.
|
||||
- Proposal calls out MCP as separate and out of initial Plugin packaging.
|
||||
- Follow-up implementation cuts are clear for manifest/profile enablement, package discovery, archive validation/cache, Plugin permission policy, WASM packaging, and any future MCP/plugin bridge.
|
||||
|
||||
Implementation latitude:
|
||||
- Primary deliverable may be a design doc plus minimal cross-references; code changes are optional and should stay within safe internal boundaries.
|
||||
- Coder may choose exact doc path/name consistent with existing docs organization.
|
||||
- If proposing config shape, prefer illustrative schemas over broad runtime implementation unless obviously small and safe.
|
||||
|
||||
Escalate if:
|
||||
- A real runtime implementation becomes necessary to satisfy the Ticket.
|
||||
- Plugin package design would require changing Profile/manifest authority semantics, Pod restore semantics, secret handling, or MCP enablement model.
|
||||
- The proposal would imply workspace package execution or silent restore upgrades.
|
||||
|
||||
Validation:
|
||||
- `cargo fmt --check` if code or Rust doc tests are touched.
|
||||
- `git diff --check` always.
|
||||
- If only Markdown docs are touched, focused validation may be `git diff --check` plus link/path sanity review.
|
||||
|
||||
Current code/doc map:
|
||||
- Likely doc destination: `docs/design/`.
|
||||
- Related architecture candidates: `crates/manifest/src/config.rs`, `crates/manifest/src/profile.rs`, `crates/pod/src/feature.rs`, `crates/pod/src/hook.rs`.
|
||||
|
||||
Critical risks / reviewer focus:
|
||||
- Discovery vs enablement separation.
|
||||
- Plugin permission requests vs grants.
|
||||
- MCP separation.
|
||||
- Source identity collision/fail-closed behavior.
|
||||
- Archive safety and digest/cache semantics.
|
||||
- Restore/fresh discovery no silent upgrade invariant。
|
||||
|
||||
---
|
||||
|
||||
<!-- event: state_changed author: yoi-orchestrator at: 2026-06-14T15:49:39Z from: queued to: inprogress reason: orchestrator_acceptance_after_capacity_release field: state -->
|
||||
|
||||
## State changed
|
||||
|
||||
Routing decision と accepted implementation plan を記録済み。blocking relation / orchestration-plan blocker はなく、capacity waiting reason は解消した。implementation side effects の前に `queued -> inprogress` acceptance を記録する。
|
||||
|
||||
---
|
||||
|
||||
<!-- event: implementation_report author: yoi-coder-00001KT0Z4BK8 at: 2026-06-14T15:53:15Z -->
|
||||
|
||||
## Implementation report
|
||||
|
||||
Implementation report from Coder Pod `yoi-coder-00001KT0Z4BK8`:
|
||||
|
||||
Commit:
|
||||
- `3c674a70 docs: propose plugin package distribution`
|
||||
|
||||
Changed files:
|
||||
- `docs/design/plugin-packages.md`
|
||||
- Added the `.yoi-plugin` package/discovery/enablement design proposal.
|
||||
- `docs/README.md`
|
||||
- Added the new design doc to the maintained documentation reading order.
|
||||
|
||||
Design choices covered:
|
||||
- `.yoi-plugin` as a constrained single-file archive with required root `plugin.toml`.
|
||||
- Suggested package layout for `module.wasm`, declarative hooks, schemas, README/license, and assets.
|
||||
- User/workspace/builtin plugin stores and source-qualified identity: `user:<id>`, `project:<id>`, `builtin:<id>`.
|
||||
- Explicit discovery-vs-enablement separation.
|
||||
- Store presence under `${XDG_DATA_HOME:-~/.local/share}/yoi/plugins/` or `<workspace>/.yoi/plugins/` is discovery only, never registration/execution.
|
||||
- Plugin permission declarations are requests, not grants.
|
||||
- Plugin permission policy is explicitly separate from `pod::feature` HostAuthority/grant concepts.
|
||||
- Archive validation, traversal rejection, bounded extraction, deterministic digest, digest-keyed cache materialization, and optional pin/lock behavior.
|
||||
- Restore uses resolved enabled-plugin plan/digest metadata; fresh discovery must not silently upgrade a restored Pod.
|
||||
- Diagnostics guidance without secret leakage.
|
||||
- Runtime notes for declarative hooks and WASM.
|
||||
- MCP is explicitly out of initial Plugin packaging/runtime and requires a future separate bridge Ticket.
|
||||
- Follow-up implementation cuts are listed for enablement schema, discovery, validation/cache, permission policy, declarative hooks, WASM, locks, and future MCP bridge.
|
||||
|
||||
Validation reported by coder:
|
||||
- Passed: `git diff --check`.
|
||||
- Link/path sanity review:
|
||||
- Verified `docs/README.md` references existing `docs/design/plugin-packages.md`.
|
||||
- Verified touched Markdown files have trailing newlines and no tab characters.
|
||||
- Post-commit check:
|
||||
- `git status --short --branch` showed clean branch `impl/00001KT0Z4BK8-plugin-package-discovery`.
|
||||
- `git diff --check HEAD~1 HEAD` passed with no whitespace errors.
|
||||
- No Rust/code changes were made, so `cargo fmt` / `cargo test` were not run.
|
||||
|
||||
Repository status:
|
||||
- Child implementation worktree clean after commit.
|
||||
|
||||
Residual risks / blockers:
|
||||
- This is intentionally a design proposal only. Exact manifest/Profile schema, lock-file format, archive limits, cache path, and WASM ABI details remain for follow-up implementation Tickets.
|
||||
|
||||
---
|
||||
|
||||
<!-- event: review author: yoi-reviewer-00001KT0Z4BK8 at: 2026-06-14T15:56:22Z status: approve -->
|
||||
|
||||
## Review: approve
|
||||
|
||||
Review result: approve
|
||||
|
||||
Evidence checked:
|
||||
- Child worktree/branch:
|
||||
- `/home/hare/Projects/yoi/.worktree/00001KT0Z4BK8-plugin-package-discovery`
|
||||
- `impl/00001KT0Z4BK8-plugin-package-discovery`
|
||||
- HEAD: `3c674a70512ca31b5745d901959c04442c1695d0`
|
||||
- Base merge point: `d73f748ee8d2e25217cafe3754eb9fa8870ddbed`
|
||||
- Diff `d73f748e..HEAD` inspected:
|
||||
- added `docs/design/plugin-packages.md`
|
||||
- updated `docs/README.md`
|
||||
- Ticket intent/acceptance context reviewed from the child worktree Ticket record.
|
||||
|
||||
Acceptance criteria review:
|
||||
- `.yoi-plugin` archive structure and required root `plugin.toml` are documented.
|
||||
- Packaged assets/layout are covered, including optional WASM module, hooks, schemas, README/license, and `assets/**`.
|
||||
- Stores and source/trust mapping are covered for `builtin:<id>`, `user:<id>`, and `project:<id>`.
|
||||
- Package presence in user/workspace stores is clearly discovery only, not execution/registration.
|
||||
- Source-qualified identity, ambiguous-id fail-closed behavior, and collision handling are covered.
|
||||
- Discovery vs enablement and restore/no-silent-upgrade behavior are explicit.
|
||||
- Manifest/Profile enablement shape is illustrative and appropriately deferred.
|
||||
- Plugin permission declarations are requests, not grants; effective grants are tied to Plugin-layer policy plus existing manifest/profile/tool/scope/web/secret/runtime authority layers.
|
||||
- The document avoids using `pod::feature` HostAuthority/grant concepts as Plugin permission/security model.
|
||||
- Archive safety covers traversal rejection, unsafe file types, bounded extraction, deterministic digest, digest-keyed cache, and manifest path validation.
|
||||
- Diagnostics guidance covers attribution, bounded output, and no secret leakage.
|
||||
- Runtime notes cover declarative hooks, WASM initialization from digest cache, host limits, and ToolRegistry/permission checks.
|
||||
- MCP is explicitly separate and out of the initial Plugin package runtime.
|
||||
- Follow-up implementation cuts are clear and separable.
|
||||
- `docs/README.md` cross-reference is appropriate and remains Why/design-oriented.
|
||||
|
||||
Validation performed:
|
||||
- Passed: `git diff --check d73f748e..HEAD`
|
||||
- Passed: `git diff --check HEAD~1 HEAD`
|
||||
- README-listed relative doc target existence checked with shell commands.
|
||||
- Manual Markdown/design boundary review completed.
|
||||
|
||||
Validation not run:
|
||||
- No cargo commands because the change is documentation-only.
|
||||
- A Python-based link check could not run because `python3` is unavailable; shell existence checks were used instead.
|
||||
|
||||
Conclusion:
|
||||
- Approved. No blocking concern remains.
|
||||
|
||||
---
|
||||
|
||||
<!-- event: implementation_report author: yoi-orchestrator at: 2026-06-14T15:56:45Z -->
|
||||
|
||||
## Implementation report
|
||||
|
||||
Integration report:
|
||||
|
||||
Merged implementation branch into orchestration branch:
|
||||
- branch: `impl/00001KT0Z4BK8-plugin-package-discovery`
|
||||
- implementation commit: `3c674a70 docs: propose plugin package distribution`
|
||||
- merge commit: `2b9dae48 merge: plugin package design`
|
||||
|
||||
Reviewer result:
|
||||
- `approve` recorded from `yoi-reviewer-00001KT0Z4BK8`.
|
||||
|
||||
Validation in Orchestrator worktree `/home/hare/Projects/yoi/.worktree/orchestration`:
|
||||
- Passed: `git diff --check`
|
||||
- Passed: `test -f docs/design/plugin-packages.md`
|
||||
- Passed: `grep -n 'plugin-packages.md' docs/README.md`
|
||||
|
||||
Cargo validation:
|
||||
- Not run because the merged change is documentation-only.
|
||||
|
||||
Notes:
|
||||
- The proposal is intentionally design-only. Exact manifest/Profile schema, lock-file format, archive limits, cache path, and WASM ABI remain follow-up implementation work.
|
||||
- Orchestrator worktree is clean after validation.
|
||||
|
||||
Cleanup planned:
|
||||
- Stop related coder/reviewer Pods.
|
||||
- Remove only child implementation worktree/branch for this Ticket.
|
||||
|
||||
---
|
||||
|
||||
<!-- event: state_changed author: yoi-orchestrator at: 2026-06-14T15:56:45Z from: inprogress to: done reason: merged_validated field: state -->
|
||||
|
||||
## State changed
|
||||
|
||||
Reviewer approved, documentation/design implementation branch merged into the orchestration branch, and documentation-focused validation passed in the Orchestrator worktree. Marking Ticket done in the orchestration branch.
|
||||
|
||||
---
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
---
|
||||
title: "Preserve active workflows across compaction"
|
||||
state: 'inprogress'
|
||||
state: 'done'
|
||||
created_at: "2026-06-07T02:23:28Z"
|
||||
updated_at: '2026-06-14T15:24:58Z'
|
||||
updated_at: '2026-06-14T16:26:01Z'
|
||||
queued_by: 'workspace-panel'
|
||||
queued_at: '2026-06-14T15:23:07Z'
|
||||
---
|
||||
|
||||
@@ -145,3 +145,273 @@ Critical risks / reviewer focus:
|
||||
Routing decision と accepted implementation plan を記録済み。blocking relation / orchestration-plan blocker はなく、Orchestrator workspace は clean。implementation side effects の前に `queued -> inprogress` acceptance を記録する。
|
||||
|
||||
---
|
||||
|
||||
<!-- event: implementation_report author: yoi-coder-00001KTFY8V80 at: 2026-06-14T15:50:38Z -->
|
||||
|
||||
## Implementation report
|
||||
|
||||
Implementation report from Coder Pod `yoi-coder-00001KTFY8V80`:
|
||||
|
||||
Commit:
|
||||
- `362fedfb fix: preserve active workflows across compaction`
|
||||
|
||||
Changed files:
|
||||
- `crates/pod/src/active_workflow.rs`
|
||||
- `crates/pod/src/lib.rs`
|
||||
- `crates/pod/src/pod.rs`
|
||||
- `crates/pod/src/segment_log_sink.rs`
|
||||
- `resources/prompts/internal/compact_system.md`
|
||||
|
||||
Implemented behavior:
|
||||
- Added durable typed active workflow state as session-log extension domain `pod.active_workflows`.
|
||||
- State records include:
|
||||
- workflow slug
|
||||
- invocation source/time
|
||||
- task scope
|
||||
- active/completed/cancelled status
|
||||
- snapshotted workflow guidance
|
||||
- extracted obligations/checkpoints
|
||||
- completion/cancellation reason/time
|
||||
- Workflow bodies are snapshotted at invocation time rather than resolved to latest resource/builtin version during rehydration. Rationale: active workflow authority remains traceable to the original governed task and does not silently change when resource files change later.
|
||||
- Compaction now:
|
||||
- feeds active workflow state into compact worker input
|
||||
- writes active workflow state into the replacement segment as typed extension state
|
||||
- injects post-compaction workflow guidance into `SegmentStart.history` from durable state, not transient turn-local data
|
||||
- Added `ActiveWorkflowList`, `ActiveWorkflowComplete`, and `ActiveWorkflowCancel` tools so active workflow state can be inspected, completed, or explicitly cancelled.
|
||||
- Missing/corrupt/unsupported active workflow extension state fails closed with bounded diagnostics rather than reusing stale prior state.
|
||||
|
||||
Validation reported by coder:
|
||||
- Passed: `cargo fmt --check`
|
||||
- Passed: `git diff --check`
|
||||
- Passed: `cargo test -p pod active_workflow --lib`
|
||||
- includes focused coverage for review/merge/close-style obligations crossing compaction/rehydration
|
||||
- Passed: `cargo test -p pod includes_active_workflow_snapshot_section --lib`
|
||||
- Ran: `cargo test -p pod --lib`
|
||||
- Failed on 2 prompt text assertions reported as unrelated/pre-existing:
|
||||
- `prompt::catalog::tests::pod_orchestration_guidance_section_renders_resource_body`
|
||||
- `prompt::system::tests::pod_orchestration_guidance_is_included_for_pod_management_tools`
|
||||
- both assert the unrelated string `worktree status, diff, and test results`
|
||||
|
||||
Repository status:
|
||||
- Child implementation worktree clean after commit.
|
||||
|
||||
Residual risks / notes:
|
||||
- Active workflow obligation extraction is intentionally conservative: it stores full snapshotted guidance as authority and derives bounded checkpoint labels from obligation-like lines.
|
||||
- Completion/cancellation tool calls persist through normal history; compaction additionally writes updated typed snapshot into the compacted segment.
|
||||
|
||||
---
|
||||
|
||||
<!-- event: review author: yoi-reviewer-00001KTFY8V80 at: 2026-06-14T15:58:49Z status: request_changes -->
|
||||
|
||||
## Review: request changes
|
||||
|
||||
Review result: request_changes
|
||||
|
||||
Evidence checked:
|
||||
- Child worktree/branch/head:
|
||||
- `/home/hare/Projects/yoi/.worktree/00001KTFY8V80-active-workflows-compaction`
|
||||
- `impl/00001KTFY8V80-active-workflows-compaction`
|
||||
- HEAD `362fedfbe6689886f1e2e7c29da61e39b0ce1e38`
|
||||
- merge base with requested base: `73d0a6a4`
|
||||
- `git status --short` was clean.
|
||||
- Diff `73d0a6a4..362fedfb` inspected.
|
||||
- Read-only validation:
|
||||
- Passed: `git diff --check 73d0a6a4..362fedfb`
|
||||
- Cargo/fmt not rerun because review scope was read-only.
|
||||
|
||||
What looks good:
|
||||
- A typed active workflow snapshot was added with slug, status, invocation source/time, task scope, snapshot policy, snapshotted guidance, obligations/checkpoints, and completion metadata.
|
||||
- Active workflow state is separated from advertised workflows; activation comes from invoked `SystemItem::Workflow` rather than resident workflow catalog.
|
||||
- Snapshot-vs-latest behavior is explicit via `WorkflowBodySnapshotPolicy::SnapshottedAtInvocation`.
|
||||
- Compaction passes active workflow state into compactor input and writes typed `LogEntry::Extension` into the compacted segment.
|
||||
- Clear/cancel tools are exposed as `ActiveWorkflowComplete` / `ActiveWorkflowCancel`.
|
||||
|
||||
Required changes:
|
||||
|
||||
1. Stale active workflow guidance can remain in prompt history after typed state is invalid, completed, or cancelled.
|
||||
|
||||
- The implementation writes active workflow rehydration guidance as an ordinary system message in compacted history (`pod.rs` around the compaction replacement history construction).
|
||||
- Restore later uses `SegmentStart.history` as worker history.
|
||||
- Corrupt/obsolete extension handling drops/diagnoses the typed state but does not remove the old `[Active workflow snapshot]` system message from compacted history.
|
||||
- Therefore the model can still see stale workflow obligations even when the durable active-workflow extension is missing/corrupt/obsolete.
|
||||
- The same leakage risk applies after completion/cancellation: old compacted system messages can remain until another compaction.
|
||||
|
||||
Required fix:
|
||||
- Ensure active workflow guidance shown to the model is gated by currently valid active workflow state, not immutable old compacted history.
|
||||
- For example, regenerate guidance from validated typed state at context/compaction time, or sanitize/supersede old active workflow system messages when typed state is invalid/inactive.
|
||||
- Add focused coverage for compacted history containing an active workflow message plus missing/corrupt/obsolete extension, and for completion/cancellation after compaction.
|
||||
|
||||
2. Completion/cancellation durability is inferred from generic tool-call history and trusts bare `ToolCall`s.
|
||||
|
||||
- `ActiveWorkflowComplete` / `ActiveWorkflowCancel` mutate only the in-memory store in the tool implementation.
|
||||
- They do not append a new typed `LogEntry::Extension` on successful status change.
|
||||
- Restore reconstructs completion/cancellation by scanning history.
|
||||
- Replay marks workflows completed/cancelled based solely on `Item::ToolCall` names, without requiring a matching successful `ToolResult`.
|
||||
|
||||
Required fix:
|
||||
- Persist status changes as typed durable active workflow state when the status tool succeeds, or make replay validate a matching non-error tool result/event proving the tool executed successfully.
|
||||
- Add focused tests for interrupted/unmatched/error status tool calls.
|
||||
|
||||
Prompt-test failure assessment:
|
||||
- The reported `cargo test -p pod --lib` failures about `worktree status, diff, and test results` appear unrelated. The diff changes `resources/prompts/internal/compact_system.md`, while the failing assertions are in pod orchestration prompt tests and reference a different prompt resource.
|
||||
|
||||
Conclusion:
|
||||
- Changes requested. Do not integrate until stale-guidance gating and completion/cancellation durability are fixed and covered.
|
||||
|
||||
---
|
||||
|
||||
<!-- event: implementation_report author: yoi-coder-00001KTFY8V80 at: 2026-06-14T16:17:48Z -->
|
||||
|
||||
## Implementation report
|
||||
|
||||
Follow-up implementation report after reviewer request_changes:
|
||||
|
||||
New commit:
|
||||
- `ff446052 fix: gate active workflow rehydration state`
|
||||
|
||||
Changed files in follow-up:
|
||||
- `crates/pod/src/active_workflow.rs`
|
||||
- `crates/pod/src/ipc/interceptor.rs`
|
||||
- `crates/pod/src/pod.rs`
|
||||
|
||||
Review blocker 1 resolved: stale active workflow guidance in prompt history
|
||||
- Active workflow rehydration guidance is no longer persisted into compacted `SegmentStart.history` as an ordinary system message.
|
||||
- Compaction still carries active workflow state forward via typed `pod.active_workflows` extension state.
|
||||
- Request context is sanitized before model calls:
|
||||
- stale `[Active workflow snapshot]` system messages are stripped,
|
||||
- current active workflow guidance is regenerated request-locally from validated typed state,
|
||||
- when typed state is missing/corrupt/obsolete/inactive and stale workflow hints are present, a bounded inactive-state message supersedes old compacted references.
|
||||
- Restore paths strip stale active workflow rehydration messages before installing worker history.
|
||||
- Compaction source/retained histories strip old active workflow rehydration messages so old snapshots are not re-summarized as active authority.
|
||||
|
||||
Review blocker 2 resolved: completion/cancellation durability
|
||||
- `ActiveWorkflowComplete` / `ActiveWorkflowCancel` now persist successful status changes by committing a new typed `LogEntry::Extension` snapshot through the session log writer.
|
||||
- Restore no longer infers completion/cancellation from bare `Item::ToolCall` history.
|
||||
- Typed extension state is the authority, avoiding trust in unmatched/interrupted/error tool calls.
|
||||
|
||||
Focused coverage added/updated:
|
||||
- Compacted history containing active workflow rehydration message plus:
|
||||
- missing extension,
|
||||
- corrupt extension,
|
||||
- obsolete extension.
|
||||
- Completion/cancellation after compaction suppressing old compacted guidance.
|
||||
- Successful status tool writes a typed durable extension.
|
||||
- Unmatched/error status tool calls do not mutate restored active workflow state.
|
||||
- Existing review/merge/close workflow obligation coverage still passes.
|
||||
|
||||
Validation reported by coder:
|
||||
- Passed: `cargo fmt --check`
|
||||
- Passed: `git diff --check`
|
||||
- Passed: `cargo test -p pod active_workflow --lib`
|
||||
- 7 passed
|
||||
- Passed: `cargo test -p pod interceptor --lib`
|
||||
- 19 passed
|
||||
- Ran: `cargo test -p pod --lib`
|
||||
- Still fails only on the previously reported unrelated prompt assertion failures:
|
||||
- `prompt::catalog::tests::pod_orchestration_guidance_section_renders_resource_body`
|
||||
- `prompt::system::tests::pod_orchestration_guidance_is_included_for_pod_management_tools`
|
||||
- both assert missing text: `worktree status, diff, and test results`
|
||||
- result: `332 passed; 2 failed`
|
||||
|
||||
Repository status:
|
||||
- Child implementation worktree clean after follow-up commit.
|
||||
|
||||
---
|
||||
|
||||
<!-- event: review author: yoi-reviewer-00001KTFY8V80-r2 at: 2026-06-14T16:25:00Z status: approve -->
|
||||
|
||||
## Review: approve
|
||||
|
||||
Review result: approve
|
||||
|
||||
Evidence checked:
|
||||
- Child worktree:
|
||||
- `/home/hare/Projects/yoi/.worktree/00001KTFY8V80-active-workflows-compaction`
|
||||
- HEAD: `ff446052 fix: gate active workflow rehydration state`
|
||||
- Base checked against: `73d0a6a4`
|
||||
- Original implementation checked where relevant: `362fedfb`
|
||||
|
||||
Prior blocker 1: stale active workflow guidance after compaction
|
||||
- Resolved.
|
||||
- Active workflow rehydration is now derived from typed `LogEntry::Extension` state via `ActiveWorkflowStore`, not from ordinary prompt/tool-call history.
|
||||
- Restore strips prior `[Active workflow snapshot]` system messages before installing history.
|
||||
- Rehydration guidance is regenerated request-time from validated active typed state.
|
||||
- Missing/corrupt/unsupported extension state fails closed: no active workflow restored, stale rehydration messages stripped, and bounded inactive diagnostic text tells the model not to treat older compacted history/summaries as active workflow authority.
|
||||
- Completed/cancelled typed state does not regenerate active guidance.
|
||||
- Compaction no longer stores active workflow guidance directly in `SegmentStart.history` as ordinary durable prompt authority; it carries typed extension entries.
|
||||
- Focused coverage exists for stale active workflow message plus missing/corrupt/unsupported state and completion/cancellation after compaction.
|
||||
|
||||
Prior blocker 2: completion/cancellation durability
|
||||
- Resolved.
|
||||
- `ActiveWorkflowComplete` / `ActiveWorkflowCancel` mutate store status and commit a fresh typed `LogEntry::Extension` snapshot through the active workflow log committer.
|
||||
- Production controller wiring attaches the log writer before feature/tool registration, so status tools have durable commit plumbing.
|
||||
- Restore no longer trusts bare unmatched `Item::ToolCall` entries or failed/error calls to infer completed/cancelled state.
|
||||
- Focused tests cover unmatched/error status tool calls and explicit completed/cancelled typed extension suppression of active guidance.
|
||||
|
||||
Overall acceptance:
|
||||
- Durable typed active workflow representation exists.
|
||||
- Compaction carries active workflow state forward through typed extension state.
|
||||
- Rehydration restores guidance from durable validated state.
|
||||
- Snapshot-vs-latest policy is explicit and fail-closed on missing/corrupt/unsupported latest state.
|
||||
- No hidden context injection from non-durable transient data was found.
|
||||
- Active vs advertised workflow separation is preserved.
|
||||
- Clear/cancel/complete behavior is durable typed-state transition.
|
||||
|
||||
Validation performed by reviewer:
|
||||
- Passed: `git diff --check 73d0a6a4..HEAD`
|
||||
- Passed: `cargo fmt --check`
|
||||
- `git status --short` remained clean.
|
||||
|
||||
Validation not rerun by reviewer:
|
||||
- Cargo tests were not rerun because review scope was read-only and tests write build artifacts. Coder-reported focused test results were inspected as evidence.
|
||||
|
||||
Full-suite prompt failure assessment:
|
||||
- The remaining reported `cargo test -p pod --lib` prompt assertion failures involving `worktree status, diff, and test results` appear unrelated to the active workflow typed-state/compaction changes.
|
||||
|
||||
Conclusion:
|
||||
- Approved. No remaining blocker found.
|
||||
|
||||
---
|
||||
|
||||
<!-- event: implementation_report author: yoi-orchestrator at: 2026-06-14T16:26:01Z -->
|
||||
|
||||
## Implementation report
|
||||
|
||||
Integration report:
|
||||
|
||||
Merged implementation branch into orchestration branch:
|
||||
- branch: `impl/00001KTFY8V80-active-workflows-compaction`
|
||||
- implementation commits:
|
||||
- `362fedfb fix: preserve active workflows across compaction`
|
||||
- `ff446052 fix: gate active workflow rehydration state`
|
||||
- merge commit: `64d26f84 merge: preserve active workflows across compaction`
|
||||
|
||||
Reviewer result:
|
||||
- First review requested changes for stale prompt-history guidance and completion/cancellation durability.
|
||||
- Second-pass review `approve` recorded from `yoi-reviewer-00001KTFY8V80-r2`.
|
||||
|
||||
Validation in Orchestrator worktree `/home/hare/Projects/yoi/.worktree/orchestration`:
|
||||
- Passed: `cargo test -p pod active_workflow --lib`
|
||||
- 7 passed
|
||||
- Passed: `cargo test -p pod interceptor --lib`
|
||||
- 19 passed
|
||||
- Passed: `cargo fmt --check`
|
||||
- Passed: `git diff --check`
|
||||
|
||||
Notes:
|
||||
- Full `cargo test -p pod --lib` was not rerun at integration because coder already reported only the known unrelated prompt assertion failures. Focused tests and reviewer inspection covered the changed active workflow/compaction/interceptor paths.
|
||||
- Orchestrator worktree is clean after validation.
|
||||
|
||||
Cleanup planned:
|
||||
- Stop related coder/reviewer Pods.
|
||||
- Remove only child implementation worktree/branch for this Ticket.
|
||||
|
||||
---
|
||||
|
||||
<!-- event: state_changed author: yoi-orchestrator at: 2026-06-14T16:26:01Z from: inprogress to: done reason: merged_validated field: state -->
|
||||
|
||||
## State changed
|
||||
|
||||
Reviewer approved after requested fixes, implementation branch merged into the orchestration branch, and focused validation passed in the Orchestrator worktree. Marking Ticket done in the orchestration branch.
|
||||
|
||||
---
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
---
|
||||
title: 'Workspace panel: show Ticket-associated Intake Pods adjacent to Ticket rows'
|
||||
state: 'inprogress'
|
||||
state: 'done'
|
||||
created_at: '2026-06-13T10:54:31Z'
|
||||
updated_at: '2026-06-14T15:24:58Z'
|
||||
updated_at: '2026-06-14T15:55:36Z'
|
||||
assignee: null
|
||||
readiness: 'implementation_ready'
|
||||
risk_flags: ['panel-ux', 'local-role-session-registry', 'pod-session-state']
|
||||
|
||||
@@ -109,3 +109,139 @@ Critical risks / reviewer focus:
|
||||
Routing decision と accepted implementation plan を記録済み。blocking relation / orchestration-plan blocker はなく、Orchestrator workspace は clean。00001KTFY8V80 とは主対象が workflow/compaction と TUI Panel で分かれており、独立 worktree/branch で並行開始可能と判断したため、implementation side effects の前に `queued -> inprogress` acceptance を記録する。
|
||||
|
||||
---
|
||||
|
||||
<!-- event: implementation_report author: yoi-coder-00001KV09WYC6 at: 2026-06-14T15:48:12Z -->
|
||||
|
||||
## Implementation report
|
||||
|
||||
Implementation report from Coder Pod `yoi-coder-00001KV09WYC6`:
|
||||
|
||||
Commit:
|
||||
- `2664cdd9 feat: show ticket intake pods in panel`
|
||||
|
||||
Changed files:
|
||||
- `crates/tui/src/workspace_panel.rs`
|
||||
- `crates/tui/src/multi_pod.rs`
|
||||
|
||||
Implemented behavior:
|
||||
- Workspace Panel derives Ticket-associated Intake Pods from the local role/session registry:
|
||||
- active local Intake claim for a Ticket
|
||||
- related Intake sessions whose `related_tickets` explicitly contain that Ticket id
|
||||
- Pre-Ticket Intake sessions without an explicit Ticket relation are not associated, even if the Pod name contains the Ticket id.
|
||||
- Ticket rows now get adjacent child rows:
|
||||
- `↳ Intake Pod: <pod-name>`
|
||||
- status column shows `live`, `restorable`, or `stale`
|
||||
- non-stale associated Intake rows expose `Open/attach` behavior via the existing Pod open path
|
||||
- stale rows show unavailable/stale reason instead of trying to open
|
||||
- Added typed row key/kind for Ticket Intake Pod rows:
|
||||
- `PanelRowKey::TicketIntakePod`
|
||||
- `PanelRowKind::TicketIntakePod`
|
||||
- Kept related display bounded with `MAX_ASSOCIATED_INTAKE_ROWS_PER_TICKET = 3`.
|
||||
- Preserved existing local claim handling for generic `related_pods`, while using the new typed `intake_pods` field for visible Ticket Intake child rows.
|
||||
- Updated panel selection/open plumbing so associated Intake rows resolve to existing Pod open/attach behavior.
|
||||
|
||||
Focused coverage:
|
||||
- Added `workspace_panel_shows_ticket_associated_intake_pods_adjacent_to_ticket`, covering:
|
||||
- local Intake claim adjacent row
|
||||
- related Intake session adjacent row
|
||||
- live status/action contract
|
||||
- Pre-Ticket Intake session not falsely associated
|
||||
|
||||
Validation reported by coder:
|
||||
- Passed: `cargo test -p tui workspace_panel --lib`
|
||||
- Passed: `cargo test -p tui role_session_registry --lib`
|
||||
- Passed: `cargo fmt --check`
|
||||
- Passed: `git diff --check`
|
||||
- Ran relevant: `cargo test -p tui multi_pod --lib`
|
||||
- Failed in one existing environment/path-sensitive test:
|
||||
- `tests::orchestrator_launch_uses_runtime_workspace_not_process_cwd`
|
||||
- Failure expected `/tmp/.../runtime-workspace` but observed the worktree path.
|
||||
- The suite compiled; coder assessed this as unrelated to the Intake-row changes.
|
||||
|
||||
Repository status:
|
||||
- Child implementation worktree clean after commit.
|
||||
|
||||
Residual risks / blockers:
|
||||
- No known implementation blocker.
|
||||
- Validation caveat: unrelated `multi_pod` filtered-suite failure noted above remains for reviewer/orchestrator assessment.
|
||||
|
||||
---
|
||||
|
||||
<!-- event: review author: yoi-reviewer-00001KV09WYC6 at: 2026-06-14T15:54:30Z status: approve -->
|
||||
|
||||
## Review: approve
|
||||
|
||||
Review result: approve
|
||||
|
||||
Evidence checked:
|
||||
- Worktree clean and HEAD at implementation commit `2664cdd9`.
|
||||
- Ticket intent/body/thread reviewed from the child worktree.
|
||||
- Diff `73d0a6a4..2664cdd9` reviewed.
|
||||
- Changed files limited to:
|
||||
- `crates/tui/src/workspace_panel.rs`
|
||||
- `crates/tui/src/multi_pod.rs`
|
||||
- Read-only whitespace validation:
|
||||
- `git diff --check 73d0a6a4..2664cdd9` passed.
|
||||
|
||||
Acceptance / invariant review:
|
||||
- Ticket-associated Intake Pods are modeled as explicit `PanelRowKind::TicketIntakePod` rows with `PanelRowKey::TicketIntakePod { ticket_id, pod_name }`.
|
||||
- Rows are inserted immediately after the owning Ticket row, satisfying adjacent/clearly-related display.
|
||||
- Association comes from local role/session registry evidence: active local claim and Intake sessions with explicit `related_tickets`.
|
||||
- Pod-name-contains-ticket-id heuristic was removed, reducing false association risk and preserving the pre-Ticket Intake invariant.
|
||||
- Pre-Ticket Intake Pods without related Ticket evidence are not attached to Ticket rows; focused test covers this.
|
||||
- Multiple Intake entries per Ticket are supported and bounded by `MAX_ASSOCIATED_INTAKE_ROWS_PER_TICKET`; no 1:1 assumption.
|
||||
- one-active-claim-per-Ticket remains enforced by existing registry claim path; this change only reads/displays claims/sessions.
|
||||
- No git-tracked Ticket metadata/frontmatter/thread storage was added for Pod assignment/status.
|
||||
- No automatic polling or automatic Intake spawn was added.
|
||||
- Arbitrary selected Pod direct-send UX was not revived; associated Intake row routes through existing open/attach behavior.
|
||||
- live/restorable/stale status is surfaced via `TicketLocalClaimStatus::label()`.
|
||||
- Focused coverage exists for adjacent Intake rows and multi-pod selection/open behavior.
|
||||
|
||||
Validation not rerun:
|
||||
- Cargo/fmt validation was not rerun because the review scope was read-only and those commands may write build artifacts.
|
||||
|
||||
Reported `multi_pod` failure assessment:
|
||||
- `tests::orchestrator_launch_uses_runtime_workspace_not_process_cwd` appears unrelated. The implementation changes Workspace Panel row modeling/rendering/selection/open routing only and does not modify orchestrator launch workspace/cwd construction.
|
||||
|
||||
Conclusion:
|
||||
- Approved. No blocker remains for integration.
|
||||
|
||||
---
|
||||
|
||||
<!-- event: implementation_report author: yoi-orchestrator at: 2026-06-14T15:55:36Z -->
|
||||
|
||||
## Implementation report
|
||||
|
||||
Integration report:
|
||||
|
||||
Merged implementation branch into orchestration branch:
|
||||
- branch: `impl/00001KV09WYC6-panel-intake-pod-rows`
|
||||
- implementation commit: `2664cdd9 feat: show ticket intake pods in panel`
|
||||
- merge commit: `2fcbd6ae merge: panel intake pod rows`
|
||||
|
||||
Reviewer result:
|
||||
- `approve` recorded from `yoi-reviewer-00001KV09WYC6`.
|
||||
|
||||
Validation in Orchestrator worktree `/home/hare/Projects/yoi/.worktree/orchestration`:
|
||||
- Passed: `cargo test -p tui workspace_panel --lib`
|
||||
- Passed: `cargo test -p tui role_session_registry --lib`
|
||||
- Passed: `cargo fmt --check`
|
||||
- Passed: `git diff --check`
|
||||
|
||||
Notes:
|
||||
- The coder-reported `cargo test -p tui multi_pod --lib` failure was reviewed and assessed unrelated to this Ticket. It was not used as a blocker.
|
||||
- Orchestrator worktree is clean after validation.
|
||||
|
||||
Cleanup planned:
|
||||
- Stop related coder/reviewer Pods.
|
||||
- Remove only child implementation worktree/branch for this Ticket.
|
||||
|
||||
---
|
||||
|
||||
<!-- event: state_changed author: yoi-orchestrator at: 2026-06-14T15:55:36Z from: inprogress to: done reason: merged_validated field: state -->
|
||||
|
||||
## State changed
|
||||
|
||||
Reviewer approved, implementation branch merged into the orchestration branch, focused validation passed in the Orchestrator worktree, and cleanup is ready. Marking Ticket done in the orchestration branch.
|
||||
|
||||
---
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
{"id":"orch-plan-20260614-153704-1","ticket_id":"00001KV3A5CNH","kind":"conflicts_with","related_ticket":"00001KV09WYC6","note":"同じ Workspace Panel Ticket row/model/action/diagnostic surface を変更する可能性が高いため、`00001KV09WYC6` の実装・review・integration 後に再 routing する。","author":"yoi-orchestrator","at":"2026-06-14T15:37:04Z"}
|
||||
{"id":"orch-plan-20260614-153704-2","ticket_id":"00001KV3A5CNH","kind":"waiting_capacity_note","note":"現在 `00001KTFY8V80` と `00001KV09WYC6` の2件が inprogress で Coder Pod running。`00001KV09WYC6` と source surface が重なるため、追加 spawn せず queued のまま待機。","author":"yoi-orchestrator","at":"2026-06-14T15:37:04Z"}
|
||||
{"id":"orch-plan-20260614-155739-3","ticket_id":"00001KV3A5CNH","kind":"accepted_plan","accepted_plan":{"summary":"Accept invalid-Ticket partial failure Panel bugfix now that prior Panel Intake row work is integrated. Implement partial failure handling and focused tests without changing Ticket lifecycle authority.","branch":"impl/00001KV3A5CNH-panel-invalid-ticket-tolerance","worktree":"/home/hare/Projects/yoi/.worktree/00001KV3A5CNH-panel-invalid-ticket-tolerance","role_plan":"Orchestrator creates a dedicated implementation worktree and spawns a Coder with write scope limited to that worktree. Reviewer will run read-only after implementation report. Prior conflict with `00001KV09WYC6` is resolved because that Ticket is merged/validated/done in orchestration branch."},"author":"yoi-orchestrator","at":"2026-06-14T15:57:39Z"}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
---
|
||||
title: 'Panel: invalid Ticket があっても Ticket 機能全体を無効化しない'
|
||||
state: 'queued'
|
||||
state: 'done'
|
||||
created_at: '2026-06-14T14:56:51Z'
|
||||
updated_at: '2026-06-14T15:37:04Z'
|
||||
updated_at: '2026-06-14T16:38:01Z'
|
||||
assignee: null
|
||||
readiness: 'implementation_ready'
|
||||
risk_flags: ['tui-panel', 'ticket-backend', 'partial-failure', 'diagnostics']
|
||||
|
||||
@@ -39,3 +39,316 @@ Next action:
|
||||
- planning return ではなく queued のまま waiting とする。
|
||||
|
||||
---
|
||||
|
||||
<!-- event: decision author: yoi-orchestrator at: 2026-06-14T15:57:39Z -->
|
||||
|
||||
## Decision
|
||||
|
||||
Routing decision: implementation_ready
|
||||
|
||||
Reason:
|
||||
- 以前の waiting reason は `00001KV09WYC6` と同じ Panel row/action surface の conflict risk だったが、`00001KV09WYC6` は reviewer approve、orchestration branch への merge、focused validation、Ticket `done` まで完了した。
|
||||
- Ticket body / thread / relations / orchestration plan / current Orchestrator workspace を再確認した。blocking relation はなく、planning に戻す concrete missing information はない。
|
||||
- 本 Ticket は invalid/corrupt/unreadable individual Ticket record に対する Panel partial failure handling として concrete であり、残る不確実性は backend/list/show error handling と Panel row/diagnostic 表現の実装戦術に閉じている。
|
||||
|
||||
Evidence checked:
|
||||
- Ticket body/thread: Background, requirements, acceptance criteria, invariants, implementation latitude, escalation conditions, validation を確認。
|
||||
- Ticket relations: blocker なし。
|
||||
- OrchestrationPlan: `00001KV09WYC6` との prior conflict/waiting note を確認。先行 Ticket 完了により blocker は解消。
|
||||
- Orchestrator workspace: `/home/hare/Projects/yoi/.worktree/orchestration` は clean、`81667a9a` 上。
|
||||
- Active Pods: `00001KTFY8V80` reviewer running、coder idle。Panel implementation worker/reviewer for `00001KV09WYC6` は停止済み。
|
||||
- Current code map after prior Panel merge: `crates/tui/src/workspace_panel.rs`, `crates/tui/src/multi_pod.rs`, `crates/ticket/src/lib.rs`。
|
||||
|
||||
IntentPacket:
|
||||
|
||||
Intent:
|
||||
- Workspace Panel で個別 invalid/corrupt/unreadable Ticket record があっても、正常な Ticket rows と actions を表示・維持し、invalid record は bounded diagnostic/placeholder として見せる。
|
||||
|
||||
Binding decisions / invariants:
|
||||
- invalid Ticket を理由に正常 Ticket の Panel 操作を巻き添えで止めない。
|
||||
- invalid Ticket record を Panel が自動修復・自動削除しない。
|
||||
- invalid Ticket には Queue / Close / planning return など lifecycle mutation action を出さない。
|
||||
- Ticket lifecycle authority / state schema は変更しない。
|
||||
- Ticket backend config 全体が unusable な場合と、個別 record の partial failure を区別する。
|
||||
- 正常 Ticket の lifecycle mutation は既存 typed Ticket backend / Panel action path を通す。
|
||||
- invalid record の content や secret-like content を UI/diagnostic に漏らさない。
|
||||
|
||||
Requirements / acceptance criteria:
|
||||
- valid + invalid Ticket が混在しても valid rows は残る。
|
||||
- 正常 ready Ticket の Queue action、正常 planning Ticket の clarification/Intake 導線を維持する。
|
||||
- invalid Ticket は bounded diagnostic または disabled placeholder row として見える。
|
||||
- invalid Ticket に lifecycle mutation action を提示しない。
|
||||
- Panel header/diagnostics は全体 unavailable ではなく一部読み込み失敗を表す。
|
||||
- backend root/config unusable の既存 degraded behavior は壊さない。
|
||||
- Focused tests で partial failure、bounded invalid indication、valid action preservation、config unusable case を確認する。
|
||||
|
||||
Implementation latitude:
|
||||
- 表示形式は header diagnostic / placeholder row / detail route のどれでもよい。
|
||||
- backend `list` を lossy にするか、Panel 側 per-Ticket load recovery にするかは実装判断。ただし typed boundary を保ち、Panel 専用 ad hoc parsing で schema authority を迂回しない。
|
||||
- `TicketDoctor` logic を再利用してよいが、Panel 起動ごとに重い full doctor を必須にしない。
|
||||
|
||||
Escalate if:
|
||||
- `TicketBackend::list` public semantics の大幅変更が必要。
|
||||
- invalid path/id を安全に特定できない。
|
||||
- Panel action dispatch が valid Ticket と invalid placeholder を安全に分けられない。
|
||||
- TicketDoctor と Panel diagnostics の severity/wording が矛盾する。
|
||||
- invalid content を読まないと UI 表示できない設計になる。
|
||||
|
||||
Validation:
|
||||
- `cargo test -p tui workspace_panel --lib`
|
||||
- 必要に応じて `cargo test -p ticket`
|
||||
- `cargo fmt --check`
|
||||
- `git diff --check`
|
||||
|
||||
Critical risks / reviewer focus:
|
||||
- partial failure が全体 Ticket UI unavailable に戻らないこと。
|
||||
- invalid placeholder/action key が lifecycle mutation path に入らないこと。
|
||||
- Ticket backend config failure との区別。
|
||||
- diagnostics の boundedness と secret-like content 非露出。
|
||||
- prior `00001KV09WYC6` の Ticket-associated Intake row behavior との整合。
|
||||
|
||||
---
|
||||
|
||||
<!-- event: state_changed author: yoi-orchestrator at: 2026-06-14T15:57:47Z from: queued to: inprogress reason: orchestrator_acceptance_after_conflict_resolution field: state -->
|
||||
|
||||
## State changed
|
||||
|
||||
Routing decision と accepted implementation plan を記録済み。先行 `00001KV09WYC6` は merge/validation/done 済みで、prior conflict/waiting reason は解消。blocking relation / unresolved orchestration-plan blocker はないため、implementation side effects の前に `queued -> inprogress` acceptance を記録する。
|
||||
|
||||
---
|
||||
|
||||
<!-- event: implementation_report author: yoi-coder-00001KV3A5CNH at: 2026-06-14T16:21:50Z -->
|
||||
|
||||
## Implementation report
|
||||
|
||||
Implementation report from Coder Pod `yoi-coder-00001KV3A5CNH`:
|
||||
|
||||
Commit:
|
||||
- `b83b9e4e fix: tolerate invalid ticket rows in panel`
|
||||
|
||||
Changed files:
|
||||
- `crates/ticket/src/lib.rs`
|
||||
- Added tolerant `LocalTicketBackend::list_partial(...)` and `show_partial(...)`.
|
||||
- Added bounded/sanitized `TicketInvalidRecord` reporting.
|
||||
- Preserved strict existing `TicketBackend::list/show` semantics.
|
||||
- Added ticket backend test for valid records surviving peer invalid record failures.
|
||||
- `crates/tui/src/workspace_panel.rs`
|
||||
- Panel now uses partial ticket loading.
|
||||
- Valid Ticket rows remain visible/actionable when sibling Ticket records are invalid.
|
||||
- Invalid records render as disabled diagnostic placeholder rows.
|
||||
- Invalid placeholder rows have no lifecycle actions and no `ticket` action identity.
|
||||
- Header diagnostics indicate partial Ticket load failure with bounded placeholder count.
|
||||
- Added focused Panel tests covering valid ready Queue action, valid planning Clarify/Intake path, associated Intake row adjacency, invalid row bounded/non-actionable behavior, secret-like content non-exposure, and backend config unusable behavior.
|
||||
- `crates/tui/src/multi_pod.rs`
|
||||
- Added rendering/selection support for invalid Ticket placeholder rows.
|
||||
- Invalid placeholder rows are shown as ticket-section diagnostics but remain action-disabled.
|
||||
|
||||
Validation reported by coder:
|
||||
- Passed: `cargo test -p tui workspace_panel --lib`
|
||||
- Passed: `cargo test -p ticket partial_list_and_show --lib`
|
||||
- Passed: `cargo fmt --check`
|
||||
- Passed: `git diff --check`
|
||||
|
||||
Repository status:
|
||||
- Child implementation worktree clean after commit.
|
||||
|
||||
Residual risks / blockers:
|
||||
- None known.
|
||||
- Strict backend list/show behavior was preserved; new partial methods are opt-in for Panel tolerance.
|
||||
|
||||
---
|
||||
|
||||
<!-- event: review author: yoi-reviewer-00001KV3A5CNH at: 2026-06-14T16:27:19Z status: request_changes -->
|
||||
|
||||
## Review: request changes
|
||||
|
||||
Review result: request_changes
|
||||
|
||||
Blocker:
|
||||
- A corrupt current-ticket relation artifact can still produce an actionable normal Ticket row.
|
||||
|
||||
Details:
|
||||
- New tolerant relation loading records relation-artifact failures as `TicketInvalidRecord`, but still returns an `Ok(Ticket)` with lossy/omitted relations.
|
||||
- `LocalTicketBackend::show_partial` returns `ticket_from_dir_tolerant(...)` as successful partial details.
|
||||
- `relation_view_for_meta_tolerant` builds a relation view from remaining records after `all_ticket_relation_records_tolerant` records relation read errors.
|
||||
- Panel unconditionally emits a normal actionable `ticket_row(...)` whenever `show_partial` returns `Ok`, and only extends `invalid_records` for diagnostics.
|
||||
- A ready row can therefore still receive `NextUserAction::Queue`.
|
||||
|
||||
Consequence:
|
||||
- If a ready Ticket's own `artifacts/relations.json` is corrupt/unreadable, Panel can show both:
|
||||
1. a normal ready Ticket row with `Queue`, and
|
||||
2. an invalid placeholder for the same Ticket id.
|
||||
- This violates the invariant that invalid/corrupt Ticket records must not expose Queue/Close/planning-return/lifecycle mutation actions.
|
||||
- It is also risky because malformed relations may hide dependency/blocker authority; Queue must not be exposed for that same corrupt Ticket record.
|
||||
|
||||
Required changes:
|
||||
- If partial detail loading reports an invalid record for the same Ticket id being rendered, do not also render that Ticket as an actionable normal row.
|
||||
- Replace it with a disabled invalid placeholder, or otherwise guarantee no lifecycle mutation action is available for that id.
|
||||
- Add focused coverage for a valid `item.md` with corrupt/unreadable current Ticket detail/artifact, preferably malformed `artifacts/relations.json`, asserting:
|
||||
- Ticket id is visible as invalid diagnostic/placeholder.
|
||||
- no Queue/Close/lifecycle action is available for that Ticket id.
|
||||
- other valid Ticket rows/actions remain available.
|
||||
|
||||
Evidence checked:
|
||||
- Reviewed implementation diff `a1c8264b..b83b9e4e`.
|
||||
- Inspected:
|
||||
- `crates/ticket/src/lib.rs`
|
||||
- `crates/tui/src/workspace_panel.rs`
|
||||
- `crates/tui/src/multi_pod.rs`
|
||||
- Ticket `00001KV3A5CNH` item.
|
||||
|
||||
Positive findings:
|
||||
- Strict `TicketBackend::list/show` behavior remains unchanged; partial behavior is opt-in.
|
||||
- Mixed valid/invalid item frontmatter is covered by focused tests.
|
||||
- Panel creates disabled invalid placeholder rows with no `next_action`.
|
||||
- Backend config unusable remains a whole-ticket degraded case in tests.
|
||||
- Existing associated Intake row behavior is covered for a valid ready Ticket.
|
||||
|
||||
Validation performed by reviewer:
|
||||
- Passed: `git diff --check a1c8264b..HEAD`
|
||||
- Passed: `cargo fmt --check`
|
||||
|
||||
Validation not run:
|
||||
- `cargo test` was not rerun because review scope was read-only and Cargo writes build artifacts.
|
||||
|
||||
Conclusion:
|
||||
- Changes requested. Do not integrate until current-ticket detail/artifact corruption cannot expose lifecycle actions and focused coverage is added.
|
||||
|
||||
---
|
||||
|
||||
<!-- event: implementation_report author: yoi-coder-00001KV3A5CNH at: 2026-06-14T16:30:55Z -->
|
||||
|
||||
## Implementation report
|
||||
|
||||
Follow-up implementation report after reviewer request_changes:
|
||||
|
||||
New commit:
|
||||
- `456722c3 fix: disable tickets with invalid detail records`
|
||||
|
||||
Changed file in follow-up:
|
||||
- `crates/tui/src/workspace_panel.rs`
|
||||
|
||||
Blocker resolved:
|
||||
- `build_ticket_rows(...)` now checks `show_partial(...)` diagnostics for an invalid record whose label matches the Ticket id currently being rendered.
|
||||
- If the current Ticket id is reported invalid during partial detail loading, Panel no longer emits the normal actionable `ticket_row(...)`.
|
||||
- The invalid record flows through the existing bounded invalid placeholder/diagnostic path, so the Ticket id remains visible but has no lifecycle action.
|
||||
|
||||
Behavior after fix:
|
||||
- A ready Ticket with valid `item.md` but malformed `artifacts/relations.json` is shown only as an invalid diagnostic placeholder.
|
||||
- It cannot receive Queue, Close, clarification/planning-return, or other lifecycle mutation actions.
|
||||
- Other valid Ticket rows continue to render normally and keep their actions.
|
||||
|
||||
Coverage added:
|
||||
- `workspace_panel_disables_current_ticket_when_detail_artifact_is_invalid`
|
||||
- Test scenario:
|
||||
- one ready Ticket with malformed `artifacts/relations.json`
|
||||
- one separate valid ready Ticket
|
||||
- Assertions:
|
||||
- corrupt Ticket id is visible as `PanelRowKey::InvalidTicket(...)`
|
||||
- no normal `PanelRowKey::Ticket(...)` row exists for that corrupt id
|
||||
- placeholder has no action and no Ticket action identity
|
||||
- other valid ready Ticket still has `NextUserAction::Queue`
|
||||
- header reports partial Ticket load failure
|
||||
|
||||
Validation reported by coder:
|
||||
- Passed: `cargo test -p tui workspace_panel_disables_current_ticket_when_detail_artifact_is_invalid --lib`
|
||||
- Passed: `cargo test -p tui workspace_panel --lib`
|
||||
- Passed: `cargo fmt --check`
|
||||
- Passed: `git diff --check`
|
||||
|
||||
Repository status:
|
||||
- Child implementation worktree clean after follow-up commit.
|
||||
|
||||
---
|
||||
|
||||
<!-- event: review author: yoi-reviewer-00001KV3A5CNH-r2 at: 2026-06-14T16:37:15Z status: approve -->
|
||||
|
||||
## Review: approve
|
||||
|
||||
Review result: approve
|
||||
|
||||
Evidence checked:
|
||||
- Target worktree clean at `456722c3`.
|
||||
- Reviewed diff `a1c8264b..456722c3` and second-pass fix diff `b83b9e4e..456722c3`.
|
||||
- Confirmed backend partial/tolerant read paths:
|
||||
- `LocalTicketBackend::list_partial`
|
||||
- `LocalTicketBackend::show_partial`
|
||||
- tolerant relation/state loading records invalid Ticket ids via `TicketInvalidRecord` instead of failing entire list/detail load.
|
||||
- Confirmed Panel row construction:
|
||||
- uses `list_partial` and `show_partial`;
|
||||
- collects invalid records into bounded diagnostics/placeholders;
|
||||
- detects when `show_partial` reports an invalid record whose label matches the summary id being rendered;
|
||||
- skips normal actionable `PanelRowKey::Ticket(id)` for that id;
|
||||
- emits `InvalidTicket(id)` placeholder instead.
|
||||
- Confirmed invalid placeholder rows are diagnostics-only:
|
||||
- `kind == PanelRowKind::InvalidTicket`
|
||||
- `ticket == None`
|
||||
- `next_action == None`
|
||||
- `is_ticket_action()` excludes invalid rows
|
||||
- lifecycle dispatch preparation only accepts `row.is_ticket_action()`.
|
||||
- Confirmed regression test for prior blocker:
|
||||
- `workspace_panel_disables_current_ticket_when_detail_artifact_is_invalid`
|
||||
- malformed `artifacts/relations.json` ready Ticket has no normal actionable row;
|
||||
- disabled `PanelRowKey::InvalidTicket(corrupt.id)` placeholder exists;
|
||||
- another valid ready Ticket keeps `Queue`.
|
||||
- Confirmed broader acceptance coverage remains:
|
||||
- mixed valid/invalid records preserve valid ready/planning rows;
|
||||
- invalid rows are capped and do not leak malformed state strings;
|
||||
- backend config unusable remains separate whole-ticket degradation;
|
||||
- valid Ticket-associated Intake rows remain adjacent to valid Ticket rows.
|
||||
|
||||
Validation performed by reviewer:
|
||||
- Passed: `git diff --check a1c8264b..HEAD`
|
||||
- Passed: `cargo fmt --check`
|
||||
|
||||
Validation not run:
|
||||
- `cargo test` was not run by reviewer because read-only review scope prevents writing build artifacts. Coder-reported passing tests were inspected as evidence.
|
||||
|
||||
Conclusion:
|
||||
- Approved. No remaining blocker found.
|
||||
|
||||
---
|
||||
|
||||
<!-- event: implementation_report author: yoi-orchestrator at: 2026-06-14T16:38:01Z -->
|
||||
|
||||
## Implementation report
|
||||
|
||||
Integration report:
|
||||
|
||||
Merged implementation branch into orchestration branch:
|
||||
- branch: `impl/00001KV3A5CNH-panel-invalid-ticket-tolerance`
|
||||
- implementation commits:
|
||||
- `b83b9e4e fix: tolerate invalid ticket rows in panel`
|
||||
- `456722c3 fix: disable tickets with invalid detail records`
|
||||
- merge commit: `863b13b6 merge: tolerate invalid panel tickets`
|
||||
|
||||
Reviewer result:
|
||||
- First review requested changes for corrupt current-ticket relation/detail artifacts exposing lifecycle actions.
|
||||
- Second-pass review `approve` recorded from `yoi-reviewer-00001KV3A5CNH-r2`.
|
||||
|
||||
Validation in Orchestrator worktree `/home/hare/Projects/yoi/.worktree/orchestration`:
|
||||
- Passed: `cargo test -p tui workspace_panel --lib`
|
||||
- 16 passed
|
||||
- Passed: `cargo test -p ticket partial_list_and_show --lib`
|
||||
- 1 passed
|
||||
- Passed: `cargo fmt --check`
|
||||
- Passed: `git diff --check`
|
||||
|
||||
Notes:
|
||||
- Valid Ticket rows/actions remain available when peer records are invalid.
|
||||
- If a current Ticket's detail/artifact load reports invalidity, Panel renders only a disabled invalid placeholder for that id and no lifecycle action.
|
||||
- Orchestrator worktree is clean after validation.
|
||||
|
||||
Cleanup planned:
|
||||
- Stop related coder/reviewer Pods.
|
||||
- Remove only child implementation worktree/branch for this Ticket.
|
||||
|
||||
---
|
||||
|
||||
<!-- event: state_changed author: yoi-orchestrator at: 2026-06-14T16:38:01Z from: inprogress to: done reason: merged_validated field: state -->
|
||||
|
||||
## State changed
|
||||
|
||||
Reviewer approved after requested fixes, implementation branch merged into the orchestration branch, and focused validation passed in the Orchestrator worktree. Marking Ticket done in the orchestration branch.
|
||||
|
||||
---
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
# E2E evidence for Ticket 00001KV3BQ7Q3
|
||||
|
||||
Validation date: 2026-06-14
|
||||
Worktree: `/home/hare/Projects/yoi/.worktree/00001KV3BQ7Q3-panel-e2e-evidence`
|
||||
Branch: `impl/00001KV3BQ7Q3-panel-e2e-evidence`
|
||||
|
||||
## Summary
|
||||
|
||||
| Target merge behavior | Status | E2E scenario / assertion |
|
||||
| --- | --- | --- |
|
||||
| `802fa1f00f8725fe35336e083cd05652fee1409e` / `merge: rewind live refresh` | Pass for current fixture PTY E2E | `single_pod_rewind_picker_applies_without_escape_and_suppresses_duplicate_enter` spawns the real `yoi` binary under PTY, opens the rewind picker, applies the target without Esc/restart/restore, observes `rewind_applied` with restored composer text, and now also waits for the post-apply PTY stream to contain the unique live composer marker `rewind-live-refresh`. |
|
||||
| `02311883f7cda116676d8e179a14ad0be9e7a244` / `merge: panel mouse selection` | Pass for current fixture PTY E2E | `panel_mouse_click_selects_row_without_dispatching_action` spawns the real `yoi panel` PTY path, injects SGR mouse click input, observes `selection_changed` for the clicked row, and asserts no `action_requested` event was emitted by click alone. |
|
||||
| `db7bad7a64766c2039a4c10781801cb571027955` / `merge: panel quit latency` | Pass for bounded current fixture PTY E2E; original live-terminal latency remains outside this fixture | `panel_ctrl_c_exits_promptly_after_background_barrier` spawns the real `yoi panel` PTY path with a held `reload` background task, confirms that task is pending, sends Ctrl-C, and asserts clean process exit within `PanelHarness::default_exit_wait()` (1500 ms) plus `quit_requested` and `background_task_aborted { task: "reload" }` events. This guarantees that pending fixture background reload work is aborted and does not block quit past the threshold; it does not prove arbitrary live-terminal latency outside this fixture. |
|
||||
|
||||
## Commands and results
|
||||
|
||||
- `cargo fmt --check` — passed.
|
||||
- `cargo test -p yoi-e2e --features e2e --no-run` — passed; built `yoi-e2e` unit/integration test executables.
|
||||
- `cargo test -p yoi-e2e --features e2e` — passed: `yoi_e2e` unit test 1/1, `panel` integration tests 3/3, `rewind` integration test 1/1, doc-tests 0.
|
||||
- `cargo check -p yoi-e2e -p yoi -p tui` — passed.
|
||||
- `git diff --check` — passed.
|
||||
|
||||
## Residual gaps / non-claims
|
||||
|
||||
- These are automated fixture PTY confirmations only. They are not manual/live-terminal validation.
|
||||
- The mouse path uses the harness's SGR mouse injection through a PTY. It confirms the real `yoi panel` process path receives and handles the encoded click as intended, but it is not a hardware/terminal-emulator compatibility matrix.
|
||||
- The quit-latency assertion is bounded to the fixture's held `reload` task and 1500 ms threshold. It confirms pending fixture background work does not user-visibly block quit beyond that bound, but does not independently reproduce every historical live latency observation.
|
||||
@@ -1,2 +1,3 @@
|
||||
{"id":"orch-plan-20260614-153704-1","ticket_id":"00001KV3BQ7Q3","kind":"waiting_capacity_note","note":"現在2件の Coder Pod が running。さらに本 Ticket は現行 HEAD の Panel/TUI E2E evidence を扱うため、先行 Panel/TUI implementation branch の integration 後に、検証対象 HEAD を明確化してから acceptance する。","author":"yoi-orchestrator","at":"2026-06-14T15:37:04Z"}
|
||||
{"id":"orch-plan-20260614-153704-2","ticket_id":"00001KV3BQ7Q3","kind":"after","related_ticket":"00001KV09WYC6","note":"E2E evidence 対象の現行 HEAD を曖昧にしないため、少なくとも active な Panel display implementation (`00001KV09WYC6`) の outcome 確認後に開始する。","author":"yoi-orchestrator","at":"2026-06-14T15:37:04Z"}
|
||||
{"id":"orch-plan-20260614-163914-3","ticket_id":"00001KV3BQ7Q3","kind":"accepted_plan","accepted_plan":{"summary":"Accept TUI/Panel E2E evidence Ticket after prior Panel implementation Tickets are integrated and done. Validate current orchestration HEAD behavior using existing/updated yoi-e2e scenarios and record pass/fail/gap evidence.","branch":"impl/00001KV3BQ7Q3-panel-e2e-evidence","worktree":"/home/hare/Projects/yoi/.worktree/00001KV3BQ7Q3-panel-e2e-evidence","role_plan":"Orchestrator creates a dedicated implementation/validation worktree and spawns a Coder with write scope limited to that worktree. Coder should run/add minimal E2E evidence and commit test/doc/evidence changes as needed. Reviewer will run read-only after implementation report."},"author":"yoi-orchestrator","at":"2026-06-14T16:39:14Z"}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
---
|
||||
title: '対象 TUI/Panel merge commit の挙動を現行 E2E で確認する'
|
||||
state: 'queued'
|
||||
state: 'done'
|
||||
created_at: '2026-06-14T15:24:05Z'
|
||||
updated_at: '2026-06-14T15:37:04Z'
|
||||
updated_at: '2026-06-14T16:54:05Z'
|
||||
assignee: null
|
||||
readiness: 'implementation_ready'
|
||||
risk_flags: ['e2e', 'tui', 'panel', 'regression-evidence']
|
||||
|
||||
@@ -39,3 +39,200 @@ Next action:
|
||||
- planning return ではなく queued のまま waiting とする。
|
||||
|
||||
---
|
||||
|
||||
<!-- event: decision author: yoi-orchestrator at: 2026-06-14T16:39:14Z -->
|
||||
|
||||
## Decision
|
||||
|
||||
Routing decision: implementation_ready
|
||||
|
||||
Reason:
|
||||
- Prior waiting reason は Panel/TUI surface の先行 implementation branch により E2E evidence 対象 HEAD が曖昧になることだった。
|
||||
- `00001KV09WYC6` と `00001KV3A5CNH` は reviewer approve、orchestration branch merge、focused validation、Ticket `done` まで完了した。
|
||||
- Ticket body / thread / relations / orchestration plan / current Orchestrator workspace を再確認した。blocking relation はなく、planning に戻す concrete missing information はない。
|
||||
- 本 Ticket は validation/evidence work item であり、現行 orchestration HEAD で対象 TUI/Panel behavior を E2E で pass/fail/coverage-gap として記録する作業に閉じている。
|
||||
|
||||
Evidence checked:
|
||||
- Ticket body/thread: 対象 commit 3件、確認すべき user-visible behavior、acceptance criteria、binding decisions、escalation conditions、validation command を確認。
|
||||
- Ticket relations: blocker なし。
|
||||
- OrchestrationPlan: prior waiting note と `after 00001KV09WYC6` を確認。先行 Panel work は完了済み。
|
||||
- Orchestrator workspace: `/home/hare/Projects/yoi/.worktree/orchestration` は clean、`765e6e8e` 上。
|
||||
- Visible Pods: child Pod なし。
|
||||
|
||||
IntentPacket:
|
||||
|
||||
Intent:
|
||||
- 現行 orchestration HEAD / 現行 E2E infrastructure で、対象 TUI/Panel merge commit が意図した user-visible behavior を実プロセス PTY 経路で確認し、pass/fail/coverage-gap を明示する。
|
||||
|
||||
Binding decisions / invariants:
|
||||
- focused unit test / code review だけで user-visible TUI/Panel behavior を確認済み扱いにしない。
|
||||
- E2E pass と manual/live user confirmation を混同しない。
|
||||
- 現行 E2E が確認していない behavior を pass と書かない。
|
||||
- historical merge decision を書き換えず、現行状態の evidence を追加する。
|
||||
- 主目的は validation/evidence 整理であり、対象 behavior の大きな再設計や unrelated fix はしない。
|
||||
- E2E 追加・更新時は fixture-local HOME/XDG/runtime/workspace isolation と no-provider/no-network 前提を維持する。
|
||||
|
||||
Requirements / acceptance criteria:
|
||||
- `802fa1f0`, `02311883`, `db7bad7a` の3件それぞれについて、現行 E2E での確認結果を pass / fail / coverage gap として記録する。
|
||||
- pass の場合は E2E test 名、assertion、command、結果を記録する。
|
||||
- coverage gap の場合は何が確認できないか、追加 E2E か manual/live validation が必要かを記録する。
|
||||
- mouse selection は実 `yoi` binary + PTY 経路で user-visible observer を確認する。
|
||||
- quit latency は process exit だけでなく pending work / threshold / latency 観点で何を保証したか明示する。
|
||||
- rewind live refresh は restart/restore なしの live 表示更新が E2E で確認されるか、不足を明示する。
|
||||
- `cargo test -p yoi-e2e --features e2e` または同等の現行 E2E command を実行し結果を記録する。
|
||||
|
||||
Implementation latitude:
|
||||
- 既存 `yoi-e2e` scenario の再利用、test name/assertion の明確化、最小限の scenario 追加・更新は Coder 判断。
|
||||
- 不足する observer/helper は production behavior に影響しない `e2e-test` feature gate 配下で追加可。
|
||||
- latency threshold は既存 E2E 基準を優先し、変更が必要なら理由を報告する。
|
||||
- flake の hardening と behavior fix を混同しない。
|
||||
|
||||
Escalate if:
|
||||
- 現行 E2E infrastructure では原理的に確認不能で、実端末 manual validation や新 harness 設計が必要。
|
||||
- latency の測定が既存 observer / threshold では意味を持たない。
|
||||
- PTY SGR injection と実端末 mouse 操作に乖離疑いが残る。
|
||||
- actual regression が見つかり、validation Ticket の範囲を超える修正が必要。
|
||||
|
||||
Validation:
|
||||
- `cargo test -p yoi-e2e --features e2e` または必要な narrow E2E command。
|
||||
- E2E 追加・更新時は `cargo test -p yoi-e2e --no-run`, `cargo fmt --check`, `git diff --check`。
|
||||
- 変更範囲に応じて `cargo check -p yoi-e2e -p yoi -p tui`。
|
||||
|
||||
Critical risks / reviewer focus:
|
||||
- PTY / real binary 経路であること。
|
||||
- unit/focused test と E2E evidence の混同防止。
|
||||
- coverage gap を pass と偽らないこと。
|
||||
- E2E fixture isolation / no-provider / no-network 維持。
|
||||
- recently merged Panel changes (`00001KV09WYC6`, `00001KV3A5CNH`) 後の現行 HEAD に対する evidence であること。
|
||||
|
||||
---
|
||||
|
||||
<!-- event: state_changed author: yoi-orchestrator at: 2026-06-14T16:39:19Z from: queued to: inprogress reason: orchestrator_acceptance_after_panel_head_stabilized field: state -->
|
||||
|
||||
## State changed
|
||||
|
||||
Routing decision と accepted implementation/evidence plan を記録済み。先行 Panel/TUI implementation Tickets は merge/validation/done 済みで、prior waiting reason は解消。blocking relation / unresolved orchestration-plan blocker はないため、E2E validation side effects の前に `queued -> inprogress` acceptance を記録する。
|
||||
|
||||
---
|
||||
|
||||
<!-- event: implementation_report author: hare at: 2026-06-14T16:45:57Z -->
|
||||
|
||||
## Implementation report
|
||||
|
||||
# E2E evidence for Ticket 00001KV3BQ7Q3
|
||||
|
||||
Validation date: 2026-06-14
|
||||
Worktree: `/home/hare/Projects/yoi/.worktree/00001KV3BQ7Q3-panel-e2e-evidence`
|
||||
Branch: `impl/00001KV3BQ7Q3-panel-e2e-evidence`
|
||||
|
||||
## Summary
|
||||
|
||||
| Target merge behavior | Status | E2E scenario / assertion |
|
||||
| --- | --- | --- |
|
||||
| `802fa1f00f8725fe35336e083cd05652fee1409e` / `merge: rewind live refresh` | Pass for current fixture PTY E2E | `single_pod_rewind_picker_applies_without_escape_and_suppresses_duplicate_enter` spawns the real `yoi` binary under PTY, opens the rewind picker, applies the target without Esc/restart/restore, observes `rewind_applied` with restored composer text, and now also waits for the post-apply PTY stream to contain the unique live composer marker `rewind-live-refresh`. |
|
||||
| `02311883f7cda116676d8e179a14ad0be9e7a244` / `merge: panel mouse selection` | Pass for current fixture PTY E2E | `panel_mouse_click_selects_row_without_dispatching_action` spawns the real `yoi panel` PTY path, injects SGR mouse click input, observes `selection_changed` for the clicked row, and asserts no `action_requested` event was emitted by click alone. |
|
||||
| `db7bad7a64766c2039a4c10781801cb571027955` / `merge: panel quit latency` | Pass for bounded current fixture PTY E2E; original live-terminal latency remains outside this fixture | `panel_ctrl_c_exits_promptly_after_background_barrier` spawns the real `yoi panel` PTY path with a held `reload` background task, confirms that task is pending, sends Ctrl-C, and asserts clean process exit within `PanelHarness::default_exit_wait()` (1500 ms) plus `quit_requested` and `background_task_aborted { task: "reload" }` events. This guarantees that pending fixture background reload work is aborted and does not block quit past the threshold; it does not prove arbitrary live-terminal latency outside this fixture. |
|
||||
|
||||
## Commands and results
|
||||
|
||||
- `cargo fmt --check` — passed.
|
||||
- `cargo test -p yoi-e2e --features e2e --no-run` — passed; built `yoi-e2e` unit/integration test executables.
|
||||
- `cargo test -p yoi-e2e --features e2e` — passed: `yoi_e2e` unit test 1/1, `panel` integration tests 3/3, `rewind` integration test 1/1, doc-tests 0.
|
||||
- `cargo check -p yoi-e2e -p yoi -p tui` — passed.
|
||||
- `git diff --check` — passed.
|
||||
|
||||
## Residual gaps / non-claims
|
||||
|
||||
- These are automated fixture PTY confirmations only. They are not manual/live-terminal validation.
|
||||
- The mouse path uses the harness's SGR mouse injection through a PTY. It confirms the real `yoi panel` process path receives and handles the encoded click as intended, but it is not a hardware/terminal-emulator compatibility matrix.
|
||||
- The quit-latency assertion is bounded to the fixture's held `reload` task and 1500 ms threshold. It confirms pending fixture background work does not user-visibly block quit beyond that bound, but does not independently reproduce every historical live latency observation.
|
||||
|
||||
|
||||
---
|
||||
|
||||
<!-- event: review author: yoi-reviewer-00001KV3BQ7Q3 at: 2026-06-14T16:53:51Z status: approve -->
|
||||
|
||||
## Review: approve
|
||||
|
||||
Review result: approve
|
||||
|
||||
Evidence checked:
|
||||
- Worktree/branch/commit:
|
||||
- `/home/hare/Projects/yoi/.worktree/00001KV3BQ7Q3-panel-e2e-evidence`
|
||||
- `impl/00001KV3BQ7Q3-panel-e2e-evidence`
|
||||
- HEAD `1f07e57a test: record panel tui e2e evidence`
|
||||
- base/merge-base `5e81bc38`
|
||||
- Ticket intent and acceptance criteria in `.yoi/tickets/00001KV3BQ7Q3/item.md`.
|
||||
- Implementation/evidence changes in:
|
||||
- `.yoi/tickets/00001KV3BQ7Q3/artifacts/e2e-evidence.md`
|
||||
- `.yoi/tickets/00001KV3BQ7Q3/thread.md`
|
||||
- `crates/tui/src/single_pod.rs`
|
||||
- `tests/e2e/src/lib.rs`
|
||||
- `tests/e2e/tests/panel.rs`
|
||||
- `tests/e2e/tests/rewind.rs`
|
||||
|
||||
Findings:
|
||||
- `802fa1f0` / rewind live refresh: strengthened `single_pod_rewind_picker_applies_without_escape_and_suppresses_duplicate_enter` uses real `yoi` PTY fixture, applies rewind, observes `rewind_applied`, verifies restored composer text `rewind-live-refresh`, and waits for raw PTY output after the pre-rewind offset to contain that marker. This satisfies fixture PTY E2E evidence for restart/restore-free live display update.
|
||||
- `02311883` / panel mouse selection: existing `panel_mouse_click_selects_row_without_dispatching_action` uses real `yoi panel` PTY, SGR click injection, observes selection change, and asserts no `action_requested` from click alone. This is not just unit/code review coverage.
|
||||
- `db7bad7a` / panel quit latency: strengthened `panel_ctrl_c_exits_promptly_after_background_barrier` confirms pending `reload`, sends Ctrl-C, requires clean exit within `PanelHarness::default_exit_wait()` / 1500 ms, and asserts `background_task_aborted { task: "reload" }`. The evidence states the bounded guarantee precisely and does not overclaim arbitrary live-terminal latency.
|
||||
|
||||
Residual gap representation:
|
||||
- Correctly represented. The evidence distinguishes automated fixture PTY E2E from manual/live-terminal validation, describes mouse coverage as SGR PTY injection rather than terminal-emulator matrix, and keeps the original live-terminal latency gap outside the fixture guarantee.
|
||||
|
||||
Validation performed by reviewer:
|
||||
- Passed: `git diff --check 5e81bc38..HEAD`
|
||||
- Passed: `cargo fmt --check`
|
||||
- `git status --porcelain=v1` was clean.
|
||||
|
||||
Validation not rerun by reviewer:
|
||||
- E2E tests/checks were not rerun in reviewer because they write to build/artifact locations. Coder-reported passing results were reviewed as evidence.
|
||||
|
||||
Conclusion:
|
||||
- Approved. No blocker remains.
|
||||
|
||||
---
|
||||
|
||||
<!-- event: implementation_report author: yoi-orchestrator at: 2026-06-14T16:54:05Z -->
|
||||
|
||||
## Implementation report
|
||||
|
||||
Integration report:
|
||||
|
||||
Merged implementation/evidence branch into orchestration branch:
|
||||
- branch: `impl/00001KV3BQ7Q3-panel-e2e-evidence`
|
||||
- implementation commit: `1f07e57a test: record panel tui e2e evidence`
|
||||
- merge commit: `b5e7ca98 merge: panel e2e evidence`
|
||||
|
||||
Reviewer result:
|
||||
- `approve` recorded from `yoi-reviewer-00001KV3BQ7Q3`.
|
||||
|
||||
Validation in Orchestrator worktree `/home/hare/Projects/yoi/.worktree/orchestration`:
|
||||
- Passed: `cargo fmt --check`
|
||||
- Passed: `cargo test -p yoi-e2e --features e2e --no-run`
|
||||
- Passed: `cargo test -p yoi-e2e --features e2e`
|
||||
- Passed: `cargo check -p yoi-e2e -p yoi -p tui`
|
||||
- Passed: `git diff --check`
|
||||
|
||||
Per-target evidence outcome:
|
||||
- `802fa1f0` / rewind live refresh: pass for current fixture PTY E2E. Strengthened rewind E2E verifies post-apply PTY output contains the unique restored composer marker without restart/restore.
|
||||
- `02311883` / panel mouse selection: pass for current fixture PTY E2E. Existing Panel mouse E2E covers real `yoi panel` PTY, SGR click selection change, and no action dispatch on click alone.
|
||||
- `db7bad7a` / panel quit latency: pass for bounded fixture PTY E2E with residual live-terminal gap. Strengthened Panel quit E2E confirms pending reload background task is aborted and quit completes within the 1500 ms fixture threshold.
|
||||
|
||||
Residual gaps:
|
||||
- Evidence is automated fixture PTY E2E, not manual/live-terminal validation.
|
||||
- Mouse coverage is SGR PTY injection through real process path, not a terminal-emulator compatibility matrix.
|
||||
- Quit latency evidence is bounded to fixture-held reload work and threshold, not every historical live latency scenario.
|
||||
|
||||
Cleanup planned:
|
||||
- Stop related coder/reviewer Pods.
|
||||
- Remove only child implementation worktree/branch for this Ticket.
|
||||
|
||||
---
|
||||
|
||||
<!-- event: state_changed author: yoi-orchestrator at: 2026-06-14T16:54:05Z from: inprogress to: done reason: merged_validated field: state -->
|
||||
|
||||
## State changed
|
||||
|
||||
Reviewer approved, implementation/evidence branch merged into the orchestration branch, and E2E-focused validation passed in the Orchestrator worktree. Marking Ticket done in the orchestration branch.
|
||||
|
||||
---
|
||||
|
||||
Reference in New Issue
Block a user