yoi/work-items/closed/20260601-125240-workspace-local-manifest-override/thread.md

5.9 KiB

Created

Created by tickets.sh create.


Plan

Delegation intent: workspace-local manifest override

Intent:

  • Implement a workspace-local manifest override file that overlays Profile-derived normal startup configuration.

Requirements:

  • Support .yoi/override.local.toml as the local ignored override file.
  • Detect the nearest workspace override relative to the active workspace/project base used for profile discovery.
  • Apply the override as a PodManifestConfig layer after Profile resolution and before final PodManifest validation/snapshot persistence.
  • Preserve explicit --manifest <path> as a one-file escape hatch; do not apply workspace overrides in explicit manifest mode unless you stop and report a strong reason.
  • Resolve relative paths in the override file from .yoi/ / the override file parent directory.
  • Add provenance/diagnostic information where the existing manifest/profile resolution surfaces can carry it without broad refactoring.
  • Add focused tests for discovery, merge order, path base, and explicit-manifest behavior.
  • Update docs only if the behavior is durable and useful to document.

Invariants:

  • Do not reintroduce ambient .yoi/manifest.toml cascade as normal startup.
  • Do not put runtime-bound fields into reusable Profiles.
  • Keep explicit manifest mode low-level and predictable.
  • Do not read ignored secret-like file contents.
  • Do not edit unrelated tickets or parent workspace files.

Non-goals:

  • Do not support multiple cascading override files unless the existing workspace discovery naturally requires it.
  • Do not implement a new profile language.
  • Do not change dependency versions.
  • Do not close the ticket or merge the worktree.

Escalate if:

  • The correct workspace base is ambiguous between TUI launch, yoi pod, and SpawnPod.
  • Provenance support requires changing persisted manifest schema in a broad way.
  • Supporting .yoi/override.toml as trackable state seems necessary.
  • Tests require real spawned process E2E coverage.

Validation:

  • Run focused manifest/profile tests, preferably cargo test -p manifest plus any touched pod tests.
  • Run ./tickets.sh doctor, git diff --check, and nix build .#yoi if feasible in the worktree.
  • Record any skipped validation with rationale.

Implementation report

Implementation report

Implemented workspace-local manifest override support.

Behavior

  • Normal Profile/default resolution now searches upward from the resolver workspace base for the nearest .yoi/override.local.toml.
  • The override is parsed as a PodManifestConfig layer, resolved relative to its parent .yoi/ directory, and merged after builtin defaults plus the selected Profile but before final PodManifest validation and snapshot serialization.
  • Resolved profile provenance now records the applied override path in manifest.profile.workspace_override.
  • Explicit --manifest <path> mode remains a single-file escape hatch and does not apply workspace-local overrides.
  • Workspace-local overrides are rejected if they set pod.name, keeping Pod identity runtime-bound.

Validation

  • cargo test -p manifest workspace_local_override -- --nocapture
  • cargo test -p pod manifest_mode_does_not_apply_workspace_local_override -- --nocapture
  • cargo test -p manifest -p pod
  • ./tickets.sh doctor
  • git diff --check
  • nix build .#yoi

All completed successfully.


Review: approve

Review: workspace-local manifest override

Reviewer Pod: workspace-override-reviewer-20260601

Result

Approved. No blockers found.

Findings

The implementation satisfies the intent:

  • .yoi/override.local.toml is discovered as the workspace-local override.
  • The override applies only to normal Profile/default resolution.
  • Explicit --manifest <path> remains a single-file escape hatch and does not load the workspace override.
  • Merge order is builtin/default + selected Profile, then workspace override, then final PodManifest validation.
  • Relative paths in the override are resolved from the override file parent .yoi/ directory.
  • .yoi/manifest.toml cascade was not reintroduced.
  • Overrides that set pod.name are rejected.
  • Provenance is recorded narrowly through manifest.profile.workspace_override.

Follow-up handled

Reviewer requested non-blocking coverage for the case where both parent and nested .yoi/override.local.toml exist. Coder added commit 8f98785 test: cover nearest workspace override, which verifies the nearest nested override wins and checks provenance.

Validation evidence

Coder reported:

  • cargo test -p manifest workspace_local_override -- --nocapture
  • cargo test -p pod manifest_mode_does_not_apply_workspace_local_override -- --nocapture
  • cargo test -p manifest -p pod
  • ./tickets.sh doctor
  • git diff --check
  • nix build .#yoi

Parent/orchestrator reran after merge:

  • cargo test -p manifest workspace_local_override -- --nocapture
  • cargo test -p pod manifest_mode_does_not_apply_workspace_local_override -- --nocapture
  • ./tickets.sh doctor
  • git diff --check
  • nix build .#yoi
  • ./result/bin/yoi pod --help

Residual risk

ProfileResolver::resolve() still discovers named/default profiles from process cwd while with_workspace_base(...) controls scope and override discovery. This was judged non-blocking for the intended CLI/Profile/default/SpawnPod paths, but future callers should avoid assuming with_workspace_base also binds registry discovery.


Closed

Implemented workspace-local .yoi/override.local.toml as an ignored manifest override layer for normal Profile/default startup. Explicit --manifest remains override-free; focused tests and nix build passed.