fix(ticket): separate retained responsibility from unfinished work

T-715: end assignment work identities atomically on done/close without deleting responsibility. Reopen never reactivates old authority. Schema 82 preserves legacy closed assignments, historical removal plans and Worker attribution; active work drives admission, auth/routing, retention and cleanup while independent lifecycle/attachment fences remain.

Validation: root cargo check; cargo test -p yoi-workspace-server (630 lib + 11 bin), -p merge-request (20), -p worker (947); worker-runtime restore/removal filters (2); Deno ticket responsibility/runtime UI contracts (12); cargo fmt --all -- --check; git diff --check HEAD.
This commit is contained in:
2026-10-08 15:35:16 +09:00
parent b0d8c7b786
commit b6de908e9f
16 changed files with 1799 additions and 122 deletions
@@ -519,7 +519,8 @@
<aside class="ticket-control-rail">
<section class="ticket-control-card ticket-worker-card">
<header><h2>Role assignments</h2><span>Server-authoritative</span></header>
<header><h2>Role assignments</h2><span>Retained responsibility</span></header>
<p class="workspace-empty-copy">Responsibility is retained after work ends and Worker removal; it does not indicate a running Worker or active work authority.</p>
{#if ticket.assignments.length > 0}
<ul class="ticket-assignment-list">
{#each ticket.assignments as assignment}
@@ -538,7 +539,7 @@
{/each}
</ul>
{:else}
<p class="workspace-empty-copy">No active role assignment.</p>
<p class="workspace-empty-copy">No role responsibility recorded.</p>
{/if}
{#if ticket.action_eligibility.can_assign_orchestrator}
<button
@@ -48,3 +48,15 @@ Deno.test("ticket detail fences stale mutation responses", () => {
assertStringIncludes(operationSource, "generation === routeGeneration");
}
});
Deno.test("ticket responsibility display does not claim Worker liveness or work authority", () => {
assertStringIncludes(pageSource, "Retained responsibility");
assertStringIncludes(pageSource, "after work ends and Worker removal");
assertStringIncludes(
pageSource,
"does not indicate a running Worker or active work authority",
);
assertStringIncludes(pageSource, "assignment.principal.runtime_id");
assertStringIncludes(pageSource, "assignment.principal.worker_id");
assert(!pageSource.includes("No active role assignment."));
});