Goal
Make manifest-backed workspace reports preserve logical repository names and apply one consistent workspace-root boundary policy to symlinked paths.
Background
workspace_manifest_entries() retains the logical candidate path, but the manifest status and check aggregators index entries by entry.path.parent.resolve().name. For workspace/api -> workspace/physical with a manifest entry named api, a healthy repository is reported as missing under api and as an unlisted extra under physical.
The read-only report paths also do not reuse the containment resolver used by workspace mutation paths, so an outside-resolving symlink is not handled consistently. This was reproduced on origin/main 734a458a: one healthy in-root symlink produced an expected api missing result plus an extra physical warning.
Scope
- Workspace scanner, status, check, and shared path metadata
- Workspace doctor, onboarding, and agent-brief consumers
- Regression tests and user-facing documentation for in-root and outside-resolving symlinks
Acceptance Criteria
Validation
python -m pytest cli/python/base_projects/tests/test_workspace_status_manifest.py cli/python/base_projects/tests/test_workspace_checks.py cli/python/base_projects/tests/test_workspace_onboarding.py cli/python/base_projects/tests/test_workspace_agent_brief.py -q
env -u BASE_HOME ./bin/base-test
git diff --check
Non-Goals
- No change to clone, update, configure, or setup mutation semantics already covered by containment tests.
- No recursive workspace discovery.
Project Fields
- Status: Backlog
- Priority: P1
- Area: Workspace
- Initiative: Workspace Handling
- Size: S
- Milestone: v1.10.0
Agent Assignment
- Human first; the read-only report contract and symlink boundary need maintainer review before implementation.
Goal
Make manifest-backed workspace reports preserve logical repository names and apply one consistent workspace-root boundary policy to symlinked paths.
Background
workspace_manifest_entries()retains the logical candidate path, but the manifest status and check aggregators index entries byentry.path.parent.resolve().name. Forworkspace/api -> workspace/physicalwith a manifest entry namedapi, a healthy repository is reported as missing underapiand as an unlisted extra underphysical.The read-only report paths also do not reuse the containment resolver used by workspace mutation paths, so an outside-resolving symlink is not handled consistently. This was reproduced on origin/main
734a458a: one healthy in-root symlink produced an expectedapimissing result plus an extraphysicalwarning.Scope
Acceptance Criteria
status,check,doctor,onboarding, andagent-briefreport one expected repository with the logical name and do not invent a physical-name extra.Validation
python -m pytest cli/python/base_projects/tests/test_workspace_status_manifest.py cli/python/base_projects/tests/test_workspace_checks.py cli/python/base_projects/tests/test_workspace_onboarding.py cli/python/base_projects/tests/test_workspace_agent_brief.py -qenv -u BASE_HOME ./bin/base-testgit diff --checkNon-Goals
Project Fields
Agent Assignment