diff --git a/.github/scripts/tests/feature-map.test.mjs b/.github/scripts/tests/feature-map.test.mjs index f4b505fd324..94adc049ecd 100644 --- a/.github/scripts/tests/feature-map.test.mjs +++ b/.github/scripts/tests/feature-map.test.mjs @@ -64,6 +64,14 @@ test("accepts a documented partial area and excludes tests and stories from page assert.deepEqual(f.check(), []); }); +test("accepts CRLF line endings in the index and recipes", (t) => { + const f = fixture(t); + for (const path of ["feature-map/README.md", "feature-map/example.md"]) { + f.write(path, readFileSync(join(f.root, path), "utf8").replace(/\n/g, "\r\n")); + } + assert.deepEqual(f.check(), []); +}); + test("new nested pages cannot hide under a previously covered directory", (t) => { const f = fixture(t); f.write("ui/src/pages/apps/new/NewPanel.tsx", ""); diff --git a/feature-map/recovery.md b/feature-map/recovery.md index b5c8b60eb9c..3e8a8564678 100644 --- a/feature-map/recovery.md +++ b/feature-map/recovery.md @@ -35,8 +35,10 @@ use the currently offered action. Follow any linked repair task and return owner ### `run-detail` Open the agent's run (`/agents/:agentId/runs/:runId`) from activity or the task's -run link. Inspect failure/workspace recovery there, then return to the source -task. This is a separate host for shared recovery controls. +run link. The run page hosts workspace recovery controls only for a failed run +with error code `workspace_validation_failed` and a linked source task that still +has a live `workspace_validation` recovery action. Use the source task for other +stopped-run recovery checks. ### `operator-retry` @@ -91,11 +93,15 @@ history remains. A fixture pass does not qualify every live harness/provider. Automated: [run workspace recovery](../ui/src/components/RunWorkspaceRecoverySurface.test.tsx) tests this host; it is component coverage, not an end-to-end repair. -Manual: open the exact failed run and compare its recovery diagnosis to the -source task. Use an eligible action from the run surface, return to the task, +Manual: prepare a failed run with error code `workspace_validation_failed`, a +linked source task, and a live `workspace_validation` recovery action on that +task. Open that exact run and compare its recovery diagnosis to the source task. +Use an eligible action from the run surface, return to the task, and verify the same action state, persisted outcome, and restored execution. -Repeat with an actor who lacks authority. Full run-detail navigation remains a -manual gap. +Repeat with an actor who lacks authority. Verify that the run-page controls are +absent for other error codes or after the source action retires; continue other +recovery checks on the source task. Full run-detail navigation remains a manual +gap. ### `operator-retry` diff --git a/scripts/check-feature-map.mjs b/scripts/check-feature-map.mjs index 1bf3c516295..1d3acd9e508 100644 --- a/scripts/check-feature-map.mjs +++ b/scripts/check-feature-map.mjs @@ -35,7 +35,7 @@ function entryIds(text, label, errors) { export function checkFeatureMap(repoRoot = defaultRoot) { const errors = []; const mapRoot = resolve(repoRoot, "feature-map"); - const read = (path) => readFileSync(resolve(repoRoot, path), "utf8"); + const read = (path) => readFileSync(resolve(repoRoot, path), "utf8").replace(/\r\n?/g, "\n"); const normalize = (path) => relative(repoRoot, path).split(sep).join("/"); const isFile = (path) => existsSync(path) && statSync(path).isFile(); const localFile = (base, path) => {