18 KiB
作成
LocalTicketBackend によって作成されました。
Decision
Follow-up to 00001KX6BPY7M. Deletion/cleanup policy is intentionally manual-first:
- No automatic prune based on age or capacity in this ticket.
- Backend presents a plan with reasons, blockers, linked Worker/Workdir ids, retention, pinned state, and expected revision/digest.
- User or explicit orchestration authority selects targets and executes cleanup.
- Pinned Worker history is protected.
- Clean workdir files are cache and may be manually cleaned when not linked to running Workers.
- Dirty orphan workdirs require recovery/discard decision, not normal prune.
Decision
Clarification: because 00001KX6BPY7M is already in progress, this follow-up ticket explicitly owns implementation of Worker pinned state beyond merely consuming it in prune logic.
Scope added here:
- Persist pinned flag or equivalent Worker retention field in Backend registry.
- Add Backend Worker pin/unpin mutation API.
- Include pinned state in Worker list/detail and prune plan.
- Ensure manual cleanup execution rejects pinned Worker history and protected linked records.
Decision
Lifecycle clarification:
- Worker lifecycle should stay simple: running -> stopped -> delete.
- Do not introduce archived as a Worker lifecycle state in this ticket.
- Worker is the storage unit for Session/transcript history; deleting a Worker deletes or removes access to that history.
- Pinned remains necessary and blocks Worker deletion.
- Workdir files are cache and should be manually deletable.
- Dirty workdir deletion is allowed only with explicit confirmation that changes will be discarded.
- Compression/archive storage for Session history is out of scope and should be a separate storage policy if needed later.
Intake summary
Marked ready by yoi ticket state.
State changed
Marked ready by yoi ticket state.
State changed
Ticket を workspace-panel が queued にしました。
Decision
Routing decision: blocked_by_dependency_or_missing_authority
Reason:
- Ticket is a manual delete / cleanup follow-up that depends on the Backend Worker/Workdir registry and link authority from
00001KX6BPY7M。 00001KX6BPY7Mis currentlyinprogresson branchwork/00001KX6BPY7M-worker-workdir-registryand under external review。- This Ticket touches the same store schema, server APIs, Worker/Workdir projections, retention/managed-unmanaged semantics, and cleanup safety rules。
- Starting this Ticket now would create a high-conflict parallel branch and could implement delete/cleanup behavior against an unreviewed registry model。
- Therefore this routing pass leaves the Ticket queued and does not record
queued -> inprogress, create a worktree, or spawn role Pods。
Evidence checked:
- Ticket body / thread / artifacts。
TicketRelationQuery(00001KX6CRVBE): 0 typed relations, but Ticket body/order context makes00001KX6BPY7Ma practical implementation prerequisite。TicketOrchestrationPlanQuery(00001KX6CRVBE): prior record 0 件だったため、今回after 00001KX6BPY7Mと waiting-capacity note を記録。TicketList: queued はこの Ticket 1件、inprogress は00001KX6BPY7M1件。- Orchestrator worktree git status: clean on
orchestration。
Next action:
00001KX6BPY7Mの implementation/review/merge outcome を待つ。- registry/link model が merge されたら、この Ticket を再 routing し、updated orchestration branch から start する。
Escalate if:
- 人間が
00001KX6BPY7Mとこの Ticket を同一 combined worktree で統合実装する方針に切り替えたい場合。
Decision
Routing decision: accept for implementation
Reason:
- Previously recorded prerequisite
00001KX6BPY7Mhas now been reviewed, merged into orchestration branch, final-validated, closed, and its child implementation worktree/branch cleaned up。 TicketRelationQuery(00001KX6CRVBE)shows no typed blockers。- Queue contains this Ticket and there are no other
inprogressTickets。 - Ticket is concrete and well scoped: manual Worker delete / Workdir cleanup plan and execution on top of Backend Worker/Workdir registry/link authority。
Accepted plan:
- Create dedicated implementation worktree
/home/hare/Projects/yoi/.worktree/00001KX6CRVBE-manual-cleanupon branchwork/00001KX6CRVBE-manual-cleanupfrom current orchestration branch。 - Route implementation to sibling Coder Pod。
- Route external review to sibling Reviewer Pod after Coder commit/validation。
- Orchestrator retains merge, final validation, Ticket close, and cleanup authority。
Design constraints for implementation:
- Cleanup/delete is manual-first only; no automatic prune policy。
- Worker lifecycle remains
running -> stopped -> delete; do not introducearchivedlifecycle state。 pinnedWorker/history is protected in plan generation and execution。- Workdir file cleanup blocks when linked to running Workers。
- Dirty Workdir discard is explicit and separate from ordinary clean cleanup。
- Execution must reject stale plan revision/digest。
- Browser-facing responses/UI must not expose raw Runtime paths。
- Workdir/Worker canonical records should remain Backend/registry based and safe after execution。
State changed
Prerequisite registry/link model is now closed and merged. Accepting queued manual cleanup Ticket for implementation before creating worktree or spawning role Pods.
Implementation report
Implementation progress report:
- Coder Pod
yoi-coder-00001KX6CRVBE-manual-cleanupcompleted implementation in/home/hare/Projects/yoi/.worktree/00001KX6CRVBE-manual-cleanupon branchwork/00001KX6CRVBE-manual-cleanup。 - Implementation commit:
ba44391acfdb8076c06ced9324b74d6cc63910ab feat: add manual worker workdir cleanup。 - Orchestrator inspected the worktree status, branch log, commit stats, and
git diff --check 5f762a6c..HEAD; worktree was clean and diff check passed。
Coder-reported implementation summary:
- Added Backend Worker retention APIs for pin/unpin registry rows; Worker list/detail carries
pinned/retention_state; pin/unpin mutates Backend registry only and does not affect Runtime processes。 - Added manual Runtime cleanup plan API with separate Worker delete and Workdir cleanup/delete candidates, action kind, reason/blocking reason, linked ids, pinned state, cleanliness/file status, running-link state, and safe reclaim-byte placeholder。
- Added manual cleanup execution API requiring expected plan revision/digest; rejects stale plans, pinned Worker/history delete, running-linked Workdir cleanup, and dirty cleanup without explicit discard confirmation; allows safe removed/missing Workdir registry deletion。
- Added Browser UI for manual cleanup preview/execution on Runtime Workdirs page and Backend-only pin/unpin controls on Worker page。
- Added focused tests for plan generation, stale rejection, pinned protection, running-linked Workdir blocking, dirty confirmation, removed/missing record delete, and raw path redaction。
Coder-reported validation passed:
git diff --checkcargo test -p yoi-workspace-server --libcargo test -p worker-runtime --features ws-server,fs-storecargo check -p yoicd web/workspace && deno task check && deno task testyoi ticket doctornix build .#yoi --no-link
Next action:
- Route to external Reviewer Pod before merge/close decisions。
Review: request changes
External review result: request_changes
Blocker:
- Dirty Workdir safety is not implemented against real Runtime/filesystem state。
- Cleanup plan decides
WorkdirDirtyDiscardsolely fromWorkdirRegistryRecord.cleanliness(crates/workspace-server/src/server.rs:1689-1695)。 - Runtime observation sync always writes
cleanliness: "clean"for observed Workdirs (server.rs:4179-4199) and there is no code outside tests that records"dirty"(rg "cleanliness.*dirty|dirty.*cleanliness"only finds plan/test use)。 - Execution then treats such targets as
WorkdirCleanCleanupand calls Runtime cleanup without dirty confirmation (server.rs:1851-1852)。 - Runtime cleanup uses forced removal (
crates/worker-runtime/src/working_directory.rs:505-508)。 - This violates acceptance items requiring safe dirty/clean status representation and explicit confirmation before dirty discard。
Test gap:
- The dirty confirmation test seeds a synthetic registry row with
cleanliness = "dirty"(server.rs:5436-5449,5551-5580), so it does not catch the real path where Runtime/workdir sync overwrites or fails to detect dirty files。
Positive evidence:
- pin/unpin API/routes and retention projection exist (
server.rs:1544-1584,2032-2072,4008-4022)。 - plan/execution endpoints include digest/revision stale checks and pinned/running-link blocking (
server.rs:1766-1840)。 - UI preview/execution and pin controls are present without raw path fields。
Non-blocking note:
estimated_reclaim_bytesis present but alwaysNone; confirm whether “when safe” requires actual byte estimation before approval。
Implementation report
Follow-up implementation progress report after request_changes:
- Coder Pod
yoi-coder-00001KX6CRVBE-manual-cleanupcompleted the dirty/unknown Workdir safety fix and committed361569a69efcba929b59b9c48113add5499d5068 fix: require discard confirmation for unknown workdirs。 - Orchestrator inspected the implementation worktree status, branch log, commit stats, and
git diff --check 5f762a6c..HEAD; worktree was clean and diff check passed。
Coder-reported fix summary:
- Runtime-observed/materialized Workdirs are no longer marked
cleanwithout trusted clean evidence。 - Observed Workdirs now sync as
cleanliness: "unknown"。 - Cleanup plan downgrades stale
cleanregistry rows tounknownwhen real Runtime observation exists。 - Present Workdirs with
cleanliness: "unknown"ordirtyare classified as discard-confirmation targets, not normal clean cleanup。 - Direct Workdir cleanup rejects unknown/dirty Workdirs and requires the cleanup execution API with explicit discard confirmation。
- Browser UI labels distinguish verified-clean cleanup from dirty/unknown-state discard。
estimated_reclaim_bytesremains intentionallyNoneunless a safe estimate is available。
Regression tests added/updated:
- Real observed Workdir without verified clean evidence is classified as
unknownandWorkdirDirtyDiscard。 - Normal/direct cleanup is rejected for unknown Workdir state。
- Dirty/unknown discard requires explicit confirmation。
- Stale
cleanregistry state is downgraded when Runtime observation exists。 - Existing path-safe cleanup test uses explicit cleanup execution confirmation。
Coder-reported validation passed:
git diff --checkcargo test -p yoi-workspace-server --libcargo test -p worker-runtime --features ws-server,fs-storecargo check -p yoicd web/workspace && deno task check && deno task testyoi ticket doctornix build .#yoi --no-link
Next action:
- Request focused re-review on the dirty/unknown Workdir blocker and overall acceptance status before merge/close decisions。
Review: approve
Focused re-review result: approve
Evidence:
- Dirty/unknown blocker is fixed。
- Runtime/materialized Workdirs now sync as
cleanliness: "unknown"(crates/workspace-server/src/server.rs:4208; pending create also around1400)。 - Cleanup planning downgrades any live-observed non-dirty row to unknown before action selection (
server.rs:1689-1701)。 - Unknown/dirty present Workdirs become
WorkdirDirtyDiscardwith explicit-confirmation reasons (server.rs:1721-1725)。 - Direct Workdir DELETE rejects that path before calling Runtime cleanup (
server.rs:1491-1509)。 - Execution still checks expected revision + digest for staleness (
server.rs:1780-1788), blocks pinned/running-linked Workdirs (server.rs:1703-1707,1834-1839), and requiresconfirm_dirty_discard_target_idsbefore forced Runtime cleanup for dirty/unknown targets (server.rs:1842-1850)。 - Normal clean cleanup is only reachable for
cleancandidates (server.rs:1698-1699,1860-1861)。
No observed regressions in reviewed acceptance points:
- Pinned Worker deletion remains blocked (
server.rs:1811-1816)。 - Workdir record delete remains separate for removed/missing (
server.rs:1696-1697,1869-1879)。 - Plan responses expose ids/status/reasons/links/retention but not raw paths (
server.rs:620-633)。 - UI labels dirty/unknown discard distinctly from verified-clean cleanup with a separate confirm checkbox (
web/workspace/.../workdirs/+page.svelte)。 estimated_reclaim_bytes: Noneis acceptable here because no safe size source is implemented/exposed; the optional field is present and avoids raw-path traversal/leakage。
Validation performed by reviewer:
cargo test -p yoi-workspace-server cleanup --libpassed。- Targeted regression tests
observed_workdir_without_verified_clean_evidence_requires_discard_confirmationandstale_clean_registry_row_is_downgraded_by_real_observation_before_cleanuppassed。 git diff --check HEAD^..HEADpassed。
Implementation report
Merge / final validation report:
- Reviewer approved the implementation after the dirty/unknown Workdir safety fix。
- Merged branch
work/00001KX6CRVBE-manual-cleanupinto orchestration branch with merge commit4970a58c merge: manual worker workdir cleanup。 - Ticket record conflicts from child branch were resolved in favor of Orchestrator-authoritative Ticket records; implementation code changes were merged。
- Final validation was rerun in
/home/hare/Projects/yoi/.worktree/orchestrationafter merge。
Validation passed:
git diff --checkcargo test -p yoi-workspace-server --libcargo test -p worker-runtime --features ws-server,fs-storecargo check -p yoicd web/workspace && deno task checkcd web/workspace && deno task testyoi ticket doctornix build .#yoi --no-link
Validation log:
/run/user/1000/yoi/yoi-orchestrator/bash-output/manual-cleanup-final-validation-1783708592.txt
Reviewed/merged implementation commits:
ba44391a feat: add manual worker workdir cleanup361569a6 fix: require discard confirmation for unknown workdirs
State changed
Implementation was reviewed, merged into orchestration branch, and final validation passed. Moving to done before closure.
State changed
Ticket を closed にしました。
完了
Manual Worker/Workdir delete and cleanup operations を実装・レビュー・merge・検証した。
実装内容:
- Backend Worker registry row の pin/unpin API を追加し、Worker list/detail に
pinned/retention_stateを返すようにした。 - Runtime ごとの manual cleanup plan API を追加し、Backend Worker/Workdir/link registry と Runtime observation に基づいて Worker delete / Workdir cleanup/delete candidates を生成するようにした。
- Plan candidate は action kind、reason/blocking reason、linked Worker/Workdir ids、pinned state、cleanliness/file status、running-link status、safe な reclaim bytes placeholder を含む。
- Manual cleanup execution API は expected plan revision/digest を要求し、stale plan を拒否する。
- Pinned Worker/history delete、running-linked Workdir cleanup、dirty/unknown Workdir の confirmation なし discard を拒否する。
- Removed/missing Workdir registry record delete は安全条件のもとで separate action として扱う。
- Runtime-observed/materialized Workdirs は trusted clean evidence なしに
cleanとせず、unknownとして扱い、normal clean cleanup ではなく explicit discard confirmation path に乗せる。 - Browser UI に Runtime Workdirs cleanup preview/execution と Worker pin/unpin controls を追加した。
- UI では verified-clean cleanup と dirty/unknown-state discard を区別し、raw Runtime materialized path を表示しない。
Review:
- 初回 review は dirty Workdir safety の実データ経路が不十分として
request_changes。 361569a6 fix: require discard confirmation for unknown workdirsで observed Workdir をunknown扱いにし、unknown/dirty cleanup に explicit confirmation を要求するよう修正。- focused re-review は
approve。 estimated_reclaim_bytes: Noneは safe size source が未実装のため許容と判断された。
Merge / validation:
- Merge commit:
4970a58c merge: manual worker workdir cleanup。 - Final validation passed:
git diff --checkcargo test -p yoi-workspace-server --libcargo test -p worker-runtime --features ws-server,fs-storecargo check -p yoicd web/workspace && deno task checkcd web/workspace && deno task testyoi ticket doctornix build .#yoi --no-link
- Validation log:
/run/user/1000/yoi/yoi-orchestrator/bash-output/manual-cleanup-final-validation-1783708592.txt