Skip to content

test: stacked test PR for resolve-compose-stack.sh user-extension loop (5 scenarios) #508

@yasinBursali

Description

@yasinBursali

Context

Surfaced during CG review of PR 1.6 (resolver Python hygiene, fix/resolver-python-hygiene).

PR 1.6 (currently DRAFT, must-merge-after Light-Heart-Labs#1029) aligns the user-extension loop of scripts/resolve-compose-stack.sh with the built-in loop's structure. After PR 1.6 + PR Light-Heart-Labs#1029 both merge, the user-ext loop will have 5 new behavior paths with zero existing test coverage:

  1. compose_file from manifest (default compose.yaml)
  2. .disabled suffix handling (sibling <base>.disabled file → skip)
  3. compose.local.yaml overlay (gated on dream_mode in (local, hybrid, lemonade))
  4. compose.multigpu.yaml overlay (gated on gpu_count > 1)
  5. gpu_backends filter (added by PR fix(resolver): dedupe override.yml; apply gpu_backends filter to user-extensions Light-Heart-Labs/DreamServer#1029)

The existing tests/test-resolve-compose-resilient.sh etc. only exercise built-in extensions. Zero fixtures live under data/user-extensions/ for the test suite.

Proposed scope

Add a new test (BATS or shell) that creates a synthetic USER_EXTENSIONS_DIR fixture tree and asserts each of the 5 behaviors:

  1. compose_file from manifest: ext with manifest.yamlservice.compose_file: custom.yaml AND custom.yaml exists → resolver emits -f .../custom.yaml (NOT -f .../compose.yaml)
  2. .disabled skip: ext with compose.yaml.disabled (no plain compose.yaml) → resolver skips silently
  3. compose.local.yaml overlay: ext with both compose.yaml + compose.local.yaml, run with DREAM_MODE=hybrid → resolver emits BOTH -f flags
  4. compose.multigpu.yaml overlay: ext with both compose.yaml + compose.multigpu.yaml, run with gpu_count=2 → resolver emits BOTH
  5. gpu_backends filter: ext with gpu_backends: [nvidia] → resolver SKIPS on GPU_BACKEND=apple; emits on GPU_BACKEND=nvidia

Plus the compat carve-out:
6. manifest-less user-ext: ext with NO manifest, just compose.yaml → resolver still emits -f .../compose.yaml (preserves historical behavior)

Why stacked

PR 1.6 ships without these tests deliberately — the test PR depends on PR 1.6 + PR Light-Heart-Labs#1029 both being merged so the user-ext loop has all 5 features to test. Filing this as a stacked follow-up.

Severity

Medium — landing PR 1.6 + PR Light-Heart-Labs#1029 without tests means future regressions in the user-ext loop have no CI signal.

Source

CG review of PR 1.6 fix/resolver-python-hygiene, batch 1 (2026-04-26).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions