diff --git a/amplifier_app_cli/data/skills/ten-lane-highway/SKILL.md b/amplifier_app_cli/data/skills/ten-lane-highway/SKILL.md index f9ba7efe..46375288 100644 --- a/amplifier_app_cli/data/skills/ten-lane-highway/SKILL.md +++ b/amplifier_app_cli/data/skills/ten-lane-highway/SKILL.md @@ -138,7 +138,12 @@ with the short work-item id `vbs` still resolves to lane `vbs-…`); an owner that matches no lane, matches ambiguously, or is unclaimed is reported as such rather than guessed at. -State lives in `BATCH_DIR` (create one per highway, e.g. `~/dev/hw-`): +Use one workspace-contained `BATCH_DIR` per highway, following the caller's +workspace conventions. The caller defines where `BATCH_DIR` lives, not this skill. +Establish that path before creating batch state or launching lanes. Keep any +`HIGHWAY_LANES_ROOT` override within the same workspace. + +State lives in `BATCH_DIR`: `manifest.tsv` (scripts write), `HIGHWAY.md` (you write), `goals/` (pre-composed goal files), `lanes/` (worktrees), `.width` (authoritative width), `infra.tsv` (the infra ledger), `infra.owners.tsv` (which lane claimed which row), diff --git a/amplifier_app_cli/data/skills/ten-lane-highway/examples/first-run.md b/amplifier_app_cli/data/skills/ten-lane-highway/examples/first-run.md index abaa6bec..ac7a7951 100644 --- a/amplifier_app_cli/data/skills/ten-lane-highway/examples/first-run.md +++ b/amplifier_app_cli/data/skills/ten-lane-highway/examples/first-run.md @@ -26,9 +26,10 @@ small enough to watch every moving part. In a headless one-shot, name the skill in prose instead of the bare slash token: `amplifier run "Use the ten-lane-highway skill and drive: "`. -2. **Intake + strategize (Phases 1–2).** The manager writes `BATCH_DIR` - (e.g. `~/dev/hw-firstrun`), a `HIGHWAY.md`, pins `BATCH_DIR/.width` to `2`, - and **pre-composes a goal file per queued item** into `BATCH_DIR/goals/`. +2. **Intake + strategize (Phases 1–2).** Establish a workspace-contained `BATCH_DIR` + following the caller's workspace conventions; the caller chooses where it + lives. Write `HIGHWAY.md` there, pin `BATCH_DIR/.width` to `2`, + and **pre-compose a goal file per queued item** into `BATCH_DIR/goals/`. 3. **Approve at the gate (Phase 3).** You will see one screen: outcome, width 2, the first wave (lane → repo → item), the priority rationale, watch cadence. diff --git a/amplifier_app_cli/data/skills/ten-lane-highway/scripts/lane_teardown.sh b/amplifier_app_cli/data/skills/ten-lane-highway/scripts/lane_teardown.sh index 06ecc6f8..fc261ae1 100755 --- a/amplifier_app_cli/data/skills/ten-lane-highway/scripts/lane_teardown.sh +++ b/amplifier_app_cli/data/skills/ten-lane-highway/scripts/lane_teardown.sh @@ -44,7 +44,7 @@ # lane_teardown.sh BATCH_DIR LANE reconcile [--yes] [--strict] # lane_teardown.sh BATCH_DIR LANE audit [--open-only] # -# BATCH_DIR highway batch dir holding infra.tsv (e.g. /home/.../hw-model-performance) +# BATCH_DIR workspace-contained batch directory chosen by the caller; holds infra.tsv # LANE SHORT lane / work-item id — e.g. woe, 161, dt1 — NOT the lane # directory name (`woe-lane-scoped-teardown`). # diff --git a/tests/test_ten_lane_highway_readiness.py b/tests/test_ten_lane_highway_readiness.py index a91bee17..f6d337d6 100644 --- a/tests/test_ten_lane_highway_readiness.py +++ b/tests/test_ten_lane_highway_readiness.py @@ -346,6 +346,19 @@ def test_watchdog_advisories_remain_append_only_across_runs(tmp_path: Path) -> N assert len(second.splitlines()) == 2 +@pytest.mark.parametrize("document", [SKILL, FIRST_RUN], ids=["skill", "first-run"]) +def test_highway_batch_location_follows_caller_workspace(document: Path) -> None: + """Guidance leaves the layout to the caller, not a personal home-directory example.""" + text = document.read_text(encoding="utf-8") + + assert "workspace-contained `BATCH_DIR`" in text + assert "caller" in text + teardown = (SCRIPTS / "lane_teardown.sh").read_text(encoding="utf-8") + for home_prefix in ("~/", "$HOME/", "${HOME}/", "/home/", "/Users/"): + assert home_prefix not in text + assert home_prefix not in teardown + + def test_highway_docs_forbid_clearing_wake_needed_while_watchdog_runs() -> None: docs = ( f"{SKILL.read_text(encoding='utf-8')}\n"