18 KiB
作成
LocalTicketBackend によって作成されました。
State changed
Ticket を workspace-panel が queued にしました。
Decision
Routing decision: implementation_ready_but_waiting_capacity_conflict
Reason:
- Ticket body / thread / artifacts、relation、OrchestrationPlan、Orchestrator workspace state を確認した。要件・受け入れ条件・invariants は実装可能な粒度で揃っており、planning に戻す concrete missing information はない。
- ただし現在
00001KV09WYC6の Coder Pod が稼働中で、同じ Panel /crates/tui/src/workspace_panel.rs周辺を主対象としている。 - 本 Ticket も Panel Ticket row / partial failure handling を扱うため、並行実装すると row model/action/diagnostic 周辺で conflict risk が高い。
- 既に
00001KTFY8V80と00001KV09WYC6の2件が inprogress で Coder capacity を使用中。現時点では追加 spawn せず、00001KV09WYC6の結果を取り込んでから routing acceptance する。
Evidence checked:
- Ticket body/thread: ready -> queued を確認。
- Ticket relations: blocker なし。
- OrchestrationPlan: 既存 record なし。
- Orchestrator workspace:
/home/hare/Projects/yoi/.worktree/orchestrationは clean、queue commit28f3ed62上。 - Visible Pods:
yoi-coder-00001KTFY8V80とyoi-coder-00001KV09WYC6が running。
Next action:
00001KV09WYC6の実装・review・integration 後、Panel row model/action surface を再確認してからqueued -> inprogressacceptance を検討する。- planning return ではなく queued のまま waiting とする。
Decision
Routing decision: implementation_ready
Reason:
- 以前の waiting reason は
00001KV09WYC6と同じ Panel row/action surface の conflict risk だったが、00001KV09WYC6は reviewer approve、orchestration branch への merge、focused validation、Ticketdoneまで完了した。 - 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:
00001KTFY8V80reviewer running、coder idle。Panel implementation worker/reviewer for00001KV09WYC6は停止済み。 - 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 を迂回しない。 TicketDoctorlogic を再利用してよいが、Panel 起動ごとに重い full doctor を必須にしない。
Escalate if:
TicketBackend::listpublic 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 --checkgit 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 との整合。
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 を記録する。
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(...)andshow_partial(...). - Added bounded/sanitized
TicketInvalidRecordreporting. - Preserved strict existing
TicketBackend::list/showsemantics. - Added ticket backend test for valid records surviving peer invalid record failures.
- Added tolerant
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
ticketaction 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.
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 anOk(Ticket)with lossy/omitted relations. LocalTicketBackend::show_partialreturnsticket_from_dir_tolerant(...)as successful partial details.relation_view_for_meta_tolerantbuilds a relation view from remaining records afterall_ticket_relation_records_tolerantrecords relation read errors.- Panel unconditionally emits a normal actionable
ticket_row(...)whenevershow_partialreturnsOk, and only extendsinvalid_recordsfor diagnostics. - A ready row can therefore still receive
NextUserAction::Queue.
Consequence:
- If a ready Ticket's own
artifacts/relations.jsonis corrupt/unreadable, Panel can show both:- a normal ready Ticket row with
Queue, and - an invalid placeholder for the same Ticket id.
- a normal ready Ticket row with
- 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.mdwith corrupt/unreadable current Ticket detail/artifact, preferably malformedartifacts/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.rscrates/tui/src/workspace_panel.rscrates/tui/src/multi_pod.rs- Ticket
00001KV3A5CNHitem.
Positive findings:
- Strict
TicketBackend::list/showbehavior 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 testwas 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.
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 checksshow_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.mdbut malformedartifacts/relations.jsonis 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
- one ready Ticket with malformed
- 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
- corrupt Ticket id is visible as
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.
Review: approve
Review result: approve
Evidence checked:
- Target worktree clean at
456722c3. - Reviewed diff
a1c8264b..456722c3and second-pass fix diffb83b9e4e..456722c3. - Confirmed backend partial/tolerant read paths:
LocalTicketBackend::list_partialLocalTicketBackend::show_partial- tolerant relation/state loading records invalid Ticket ids via
TicketInvalidRecordinstead of failing entire list/detail load.
- Confirmed Panel row construction:
- uses
list_partialandshow_partial; - collects invalid records into bounded diagnostics/placeholders;
- detects when
show_partialreports 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.
- uses
- Confirmed invalid placeholder rows are diagnostics-only:
kind == PanelRowKind::InvalidTicketticket == Nonenext_action == Noneis_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.jsonready 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 testwas 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.
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 panel456722c3 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
approverecorded fromyoi-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.
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.