--- id: SAND-WP-0003 type: workplan title: "wise-validator extraction from e2e-framework" domain: infotech repo: sand-boxer status: finished owner: codex topic_slug: custodian created: "2026-06-23" updated: "2026-06-23" state_hub_workstream_id: "36ea4fec-52e2-45b6-a9dc-f39d9a7a88c0" --- # wise-validator extraction from e2e-framework Extract the validation half of `the-custodian/e2e-framework/` into the `wise-validator` repo. sand-boxer (SAND-WP-0002) already owns provision/teardown via `ext.compose-ssh`; this workplan delivers health polling, test execution, pass/fail reporting, and the `validate run` CLI. **Charter:** `wise-validator/INTENT.md` **Predecessor:** SAND-WP-0002 (finished) **Follow-on:** SAND-WP-0004 (`the-custodian` `make e2e` shim) ## Scaffold wise-validator package ```task id: SAND-WP-0003-T01 status: done priority: high state_hub_task_id: "d3134479-1989-418d-845d-4785f602ee00" ``` Python 3.11+ package in `~/wise-validator`: `pyproject.toml`, `src/wisevalidator/`, `tests/`, `Makefile` (`setup`, `install`, `check`, `test`, `lint`). ## Extract e2e.yml schema ```task id: SAND-WP-0003-T02 status: done priority: high state_hub_task_id: "506cdb09-6ee6-449e-a33e-e08a48615c97" ``` Port `e2e-framework/schema.py` as `wisevalidator/schema.py` — `E2EConfig`, `HealthCheck`, v1 `e2e/e2e.yml` contract (CUST-WP-0028 compatible). ## sand-boxer client integration ```task id: SAND-WP-0003-T03 status: done priority: high state_hub_task_id: "45c3c408-207c-4472-8853-1203e05ebe2a" ``` `wisevalidator/sandbox_client.py` — call `sandboxer create` / `destroy` (CLI v0), parse `SandboxStatus` JSON, no embedded provisioners. ## Validation runner ```task id: SAND-WP-0003-T04 status: done priority: high state_hub_task_id: "b2bde5b1-baab-4939-944b-002251de3f2b" ``` `wisevalidator/runner.py` — load contract, request sandbox, HTTP health-wait on remote host, run `test_command`, apply `cleanup` policy (`always` / `on_success` / `never`). ## State Hub reporter ```task id: SAND-WP-0003-T05 status: done priority: medium state_hub_task_id: "35f5492e-8b0b-4be0-8c9c-2894e7a06056" ``` Port `e2e-framework/reporter.py` — `event_type: e2e_result` progress events (backward compatible with legacy framework). ## validate run CLI ```task id: SAND-WP-0003-T06 status: done priority: high state_hub_task_id: "8321b5aa-9d7d-4ea3-89d2-c63a2dd15503" ``` Typer CLI `validate run ` with `--host`, `--keep`, `--workstream-id`, `--no-report`. Entry point: `validate`. ## Tests ```task id: SAND-WP-0003-T07 status: done priority: high state_hub_task_id: "0df0c94f-5461-41dd-87ff-c0676a93b45c" ``` Unit tests for schema, runner (mocked sandbox + SSH), reporter. Fixture repo with minimal `e2e/e2e.yml`. ## Registry and docs ```task id: SAND-WP-0003-T08 status: done priority: medium state_hub_task_id: "bad129e3-2e24-4df1-91d8-2c61d2421382" ``` `registry/capabilities/validation.compose-e2e.md`, `docs/integrations/sand-boxer.md`, `docs/runbooks/validate-compose-e2e.md`. Updated `sand-boxer/docs/migration-gaps.md`. ## Remote smoke (optional) ```task id: SAND-WP-0003-T09 status: wait priority: low state_hub_task_id: "f2e849fa-3cc4-4d04-9a88-95d1443b0c73" ``` `scripts/smoke-validate-run.sh` against CoulombCore when `SANDBOXER_HOST` set; operator verification (same host requirements as SAND-WP-0002-T10).