Click/Typer CliRunner.Result.stderr is a property that raises
ValueError when stderr was not separately captured (mix_stderr=True
is the default). Wrap all result.stderr accesses in try/except
to handle this gracefully.
Implement the B1 (Project Data Models) domain models from scratch,
aligned with docs/specification.md:
- Resource model: ULID PK, PhysVirt enum (physical|virtual),
SandboxStrategy enum (5 spec values), ResourceCapabilities,
extensible resource_type_name, DAG relationships, frozen model
- NamespacedProject model: identified solely by [[server:]namespace/]name,
LinkedResource for project-resource links, ContextConfig with memory
tiers/retention/temporal scope, domain methods (link/unlink/get)
- parse_namespaced_name(): full namespace parsing with reserved/provider
namespace validation, bare name defaulting to local/
- Extract legacy Project/ProjectSettings/ProjectStats to project_legacy.py
- 81 Behave scenarios (233 steps), all passing
- Lint (ruff), typecheck (pyright) clean
- Full existing test suite (2336 scenarios) unaffected