From 573d289941d91c82f34a4ee72a12669f6c10c9e8 Mon Sep 17 00:00:00 2001 From: Ed_ Date: Wed, 3 Jun 2026 00:28:20 -0400 Subject: [PATCH] test(pytest): register clean_install marker for opt-in clone-and-verify test --- .../clean_install_test_20260603/index.md | 7 ++++++ .../clean_install_test_20260603/metadata.json | 11 ++++++++++ .../clean_install_test_20260603/plan.md | 22 +++++++++++++++++++ .../clean_install_test_20260603/spec.md | 22 +++++++++++++++++++ pyproject.toml | 1 + 5 files changed, 63 insertions(+) create mode 100644 conductor/tracks/clean_install_test_20260603/index.md create mode 100644 conductor/tracks/clean_install_test_20260603/metadata.json create mode 100644 conductor/tracks/clean_install_test_20260603/plan.md create mode 100644 conductor/tracks/clean_install_test_20260603/spec.md diff --git a/conductor/tracks/clean_install_test_20260603/index.md b/conductor/tracks/clean_install_test_20260603/index.md new file mode 100644 index 00000000..5e17b4f3 --- /dev/null +++ b/conductor/tracks/clean_install_test_20260603/index.md @@ -0,0 +1,7 @@ +# Track clean_install_test_20260603 Context + +- [Specification](./spec.md) +- [Implementation Plan](./plan.md) +- [Metadata](./metadata.json) +- [Source Plan](../../../../docs/superpowers/plans/2026-06-02-clean-install-test.md) +- [Source Spec](../../../../docs/superpowers/specs/2026-06-02-clean-install-test-design.md) diff --git a/conductor/tracks/clean_install_test_20260603/metadata.json b/conductor/tracks/clean_install_test_20260603/metadata.json new file mode 100644 index 00000000..d922bc3f --- /dev/null +++ b/conductor/tracks/clean_install_test_20260603/metadata.json @@ -0,0 +1,11 @@ +{ + "id": "clean_install_test_20260603", + "title": "Clean Install Test", + "phase": null, + "created": "2026-06-03", + "status": "in_progress", + "spec_file": "spec.md", + "plan_file": "plan.md", + "depends_on": [], + "completion_checkpoints": [] +} diff --git a/conductor/tracks/clean_install_test_20260603/plan.md b/conductor/tracks/clean_install_test_20260603/plan.md new file mode 100644 index 00000000..91629c62 --- /dev/null +++ b/conductor/tracks/clean_install_test_20260603/plan.md @@ -0,0 +1,22 @@ +# Implementation Plan: Clean Install Test (clean_install_test_20260603) + +## Phase 1: Add pytest marker +Focus: Register the `clean_install` marker in `pyproject.toml` so the test can be selected with `pytest -m clean_install` or filtered with `-m "not clean_install"`. + +- [ ] Task 1.1: Pre-edit checkpoint - `git add .` +- [ ] Task 1.2: Edit `pyproject.toml` to add `clean_install` marker +- [ ] Task 1.3: Run `pytest --collect-only` to confirm marker is recognized +- [ ] Task 1.N: Atomic commit + git note + +## Phase 2: Create the test file +Focus: Create `tests/test_clean_install.py` with opt-in clone-and-verify logic. + +- [ ] Task 2.1: Pre-edit checkpoint - `git add .` +- [ ] Task 2.2: Create `tests/test_clean_install.py` using `urllib.request` (deviation from plan, see spec.md) +- [ ] Task 2.3: Run the test in skip mode - should be 1 skipped +- [ ] Task 2.N: Atomic commit + git note + +## Phase 3: Phase Completion Verification +- [ ] Task 3.1: Run the test in default mode - should be 1 skipped (gating works) +- [ ] Task 3.2: `pytest --collect-only -m clean_install` confirms marker works +- [ ] Task 3.N: conductor(checkpoint) commit + audit note diff --git a/conductor/tracks/clean_install_test_20260603/spec.md b/conductor/tracks/clean_install_test_20260603/spec.md new file mode 100644 index 00000000..e7d62a27 --- /dev/null +++ b/conductor/tracks/clean_install_test_20260603/spec.md @@ -0,0 +1,22 @@ +# Clean Install Test (clean_install_test_20260603) + +Opt-in pytest test that clones the Manual Slop repo to a temp dir, runs `uv sync`, launches `sloppy.py --enable-test-hooks`, and verifies the Hook API responds. Catches "works on my machine" failures by exercising the full install-and-launch path in an isolated environment. + +## Goal + +Add a single integration test file `tests/test_clean_install.py` that, when opted in via `RUN_CLEAN_INSTALL_TEST=1`, performs a full clean install + launch verification of Manual Slop. Skipped by default to avoid breaking CI for users without network access to the Gitea clone URL. + +## Plan Source + +This track executes the plan at `docs/superpowers/plans/2026-06-02-clean-install-test.md` and references the spec at `docs/superpowers/specs/2026-06-02-clean-install-test-design.md`. + +## Files Touched + +| File | Action | +|---|---| +| `pyproject.toml` | Modify: add `clean_install` marker | +| `tests/test_clean_install.py` | Create: opt-in clone-and-verify test | + +## Deviation from Plan + +The plan uses `requests` library, but `requests` is not a project dependency. Per `conductor/tech-stack.md` "Dependency Minimalism" rule and the existing pattern in `src/mcp_client.py` web tools (which use `urllib.request` + `html.parser` from stdlib), the test will use `urllib.request` from Python stdlib instead. This avoids adding a new external dependency for a single opt-in test. diff --git a/pyproject.toml b/pyproject.toml index f20c49a0..c7ae71c2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -37,6 +37,7 @@ dev = [ [tool.pytest.ini_options] markers = [ "integration: marks tests as integration tests (requires live GUI)", + "clean_install: clean install verification (opt-in via RUN_CLEAN_INSTALL_TEST=1)", ] [tool.mypy]