#77 made `unpack_document` refuse a symlinked nearest-existing ancestor of `output_dir`, but `Document.open(path, workspace_dir=<symlink>)` still extracts through the link: `workspace.py` creates the workspace directory before calling unpack, so the guard sees an existing real directory. Applying the same rule at workspace creation would refuse `workspace_dir="/tmp/<new>"` on macOS (`/tmp → private/tmp`), so it needs the same nearest-existing-ancestor rule *and* a decision on whether a user-chosen `workspace_dir` under a system symlink is legitimate (it is on macOS; document or resolve it). Found by the multi-review of PR #88. Also: `openspec/specs/structured-errors/spec.md:49` still describes an unscoped `replace()` call that the runtime rejects.
0 commit comments