mirror of
https://github.com/morluto/rea
synced 2026-10-25 22:08:11 -04:00
fix(setup): preserve cleanup ownership and resource reports (#6920)
* fix(setup): report host-owned cleanup resources alongside the primary's
SetupHost.close documents that it reports the resources a setup host still
owns, but its contract returned only a string. runSetup therefore built the
ProviderCleanupError from the primary failure's cleanupResources alone, so a
resource the host failed to release reached the projection only inside a
free-text reason while the error asks the caller to review the reported local
resources.
Return a SetupCloseReport instead. closeSetupResources absorbs the structured
resources of any cause that reports them, through
ArtifactReaderFailure.cleanupObservation, and leaves opaque failures
message-only so no resource name is invented. runSetup then unions the host's
resources with the primary's before building the typed cleanup error.
Two boundary tests read the close result directly: the skill-cleanup case now
asserts the retained backup path in the report reason rather than in a bare
string, and the shared ownership helper takes an opaque close result because it
only ever awaits undefined from either host it is given.
Validation: RED then green in src/application/Setup.recovery.test.ts, where
the new case previously received only the primary resource; 116 tests across
the seven Setup and cleanup-ownership suites pass; tsc --noEmit over the
changed set, its setup callers, and both boundary tests exits 0; oxlint
reports 0 errors; oxfmt --check is clean; verify:module-boundaries passes.
The two failures in src/setupEnvironment.test.ts reproduce identically on
pristine bded9c628 with this change stashed.
* fix(setup): preserve cleanup ownership through host reports
* fix(setup): bind finalization reports to cleanup owners
* fix(setup): retain live resources in returned cleanup views
* fix(setup): preserve completed cleanup and exact installer resources
* fix(setup): retain delegated cleanup across authority changes
* fix(setup): compose callback and source cleanup authorities
* fix(setup): retain producer cleanup failure reasons
* fix(cli): render structured setup cleanup resources
* fix(setup): separate failure evidence from cleanup ownership
* fix(setup): normalize close failures and unify lease binding
* fix(setup): preserve direct lease resource attribution
---------
Co-authored-by: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com>
This commit is contained in:
@@ -17,6 +17,7 @@ import { describe, expect, it } from "vitest";
|
||||
import { z } from "zod";
|
||||
import { parse as parseToml } from "smol-toml";
|
||||
|
||||
import type { SetupResult } from "../../../src/application/SetupTypes.js";
|
||||
import { createTestTempDirectory } from "../../fixtures/temporaryDirectory.js";
|
||||
import { cliTest } from "../../support/cli/cliFixture.js";
|
||||
|
||||
@@ -492,6 +493,43 @@ describe("interactive setup completion", () => {
|
||||
);
|
||||
},
|
||||
);
|
||||
it("prints retained cleanup resources without relying on paths in remediation", async () => {
|
||||
const resources = ["/fixture/owned backup", "/fixture/临时目录"];
|
||||
const result: SetupResult = {
|
||||
status: "needs_human",
|
||||
code: "cleanup_failed",
|
||||
plannedActions: [],
|
||||
appliedActions: [],
|
||||
clients: {},
|
||||
clientStates: [],
|
||||
doctor: {
|
||||
healthy: true,
|
||||
environment_healthy: true,
|
||||
availableProviders: [],
|
||||
scope: {
|
||||
mode: "explicit",
|
||||
clients: [],
|
||||
providers: [],
|
||||
skill: false,
|
||||
target: null,
|
||||
},
|
||||
},
|
||||
remediation: "Owned descriptor remains busy",
|
||||
cleanup: { reason: "Owned descriptor remains busy", resources },
|
||||
};
|
||||
const { stderr } = await execute(
|
||||
process.execPath,
|
||||
[
|
||||
"--input-type=module",
|
||||
"--eval",
|
||||
'import { renderInteractiveSetupResult } from "./dist/cli/interactiveSetup.js";\n' +
|
||||
`renderInteractiveSetupResult(${JSON.stringify(result)}, {});`,
|
||||
],
|
||||
{ cwd: process.cwd(), env: { ...process.env, NO_COLOR: "1" } },
|
||||
);
|
||||
expect(stderr).toContain(result.remediation);
|
||||
for (const resource of resources) expect(stderr).toContain(resource);
|
||||
});
|
||||
});
|
||||
|
||||
interface JourneyStep {
|
||||
|
||||
Reference in New Issue
Block a user