|
|
@@ -0,0 +1,33 @@
|
|
|
+# Todo 52.11 Bundle Interrupt and Path Safety Plan
|
|
|
+
|
|
|
+**Status:** in_progress
|
|
|
+
|
|
|
+## Goal
|
|
|
+
|
|
|
+Close the post-symlink interruption window and constrain report bundle names to the configured output directory.
|
|
|
+
|
|
|
+## Observation
|
|
|
+
|
|
|
+- A `KeyboardInterrupt` can arrive after `os.symlink()` creates the public bundle entry but before the implementation records publication. Cleanup then removes the backing bundle and leaves a dangling public symlink.
|
|
|
+- The optional `timestamp` argument is used as a path component without basename validation, so an absolute path or separator-containing value can escape `output_dir`.
|
|
|
+- Existing fsync tests count calls but do not prove that both report files, the bundle directory, and the output directory are the objects being synced.
|
|
|
+
|
|
|
+## Scope
|
|
|
+
|
|
|
+- Add a regression that injects interruption immediately after successful symlink creation and prove the public bundle remains complete rather than dangling.
|
|
|
+- Once public publication is attempted, retain the already-complete private bundle on ambiguous interruption/error paths; cleanup only before publication begins.
|
|
|
+- Validate an explicit timestamp as a bounded safe basename using a conservative ASCII identifier character set; reject absolute paths, separators, dot segments, controls, and empty values before filesystem writes.
|
|
|
+- Strengthen fsync tests to identify the two report files and both directories, not only count invocations.
|
|
|
+
|
|
|
+## Files
|
|
|
+
|
|
|
+- Modify: `src/agent_lab/infrastructure/benchmark_reporting.py`
|
|
|
+- Modify: `tests/test_benchmark_reporting.py`
|
|
|
+
|
|
|
+## Verification
|
|
|
+
|
|
|
+- `uv run pytest tests/test_benchmark_reporting.py -q`
|
|
|
+- `uv run pytest tests/test_benchmark_reporting.py tests/test_benchmark_cli.py -q`
|
|
|
+- `uv run pytest`
|
|
|
+- `git diff --check`
|
|
|
+
|