v0.7.0 — test: rename L6 step-02 and decouple pre-state from reonboard-implicit test
## Problem
L6 chain step 2 (`tests/dogfood/l5-rows/02-onboard-local/`) has three test-design issues that surfaced during the post-Phase-B L6 prompt audit on #2904:
### 1. Misleading name
`02-onboard-local` reads like "tests local onboarding from scratch." It actually tests **implicit reonboard FROM local-shape**: the pre-state is a project already locally onboarded; the prompt then triggers a reonboard intent ("make this available on GitLab"); bro should detect the implicit signal, call `onboard_state_get`, and apply.
The "local" in the name refers to the **pre-state**, not what's tested. README has to explain this away. Step 03 (`03-reonboard-remote`) covers the explicit `/onboard` slash-command path; together they form an implicit-vs-explicit reonboard pair, but the naming doesn't surface that.
### 2. Hardcoded "GitLab" in the prompt
`prompt.txt`: `@bro I want to make this project available on GitLab.`
The prompt names a specific provider. The pre-state has no remote, so bro's provider-detection logic should pick the right backend (gh or glab) from environment. Hardcoding "GitLab" in the prompt biases the test:
- May skip provider-detection judgment entirely
- Won't generalize to users on github / bitbucket / etc.
- Couples the test to one author's habitual provider
Same anti-pattern shape as step-14 (skill named) and step-10 (consultant named — see !2923) — telling bro the *answer* in the prompt rather than testing bro's *judgment*.
### 3. Pre-state + test-intent conflated
`fixture.txt: onboarding-named` is the generic onboarded fixture. `setup.sh` then re-seeds local-shape `plugin_config` values (no remote, github-flow, pr_target=main). This makes the test do double duty:
- Set up local-shape state (the precondition)
- Test the reonboard trigger (the actual contract)
A dedicated `onboarding-local-shape` fixture would let the test focus on a single contract. Less moving parts in `setup.sh`; clearer failure attribution.
## Evidence (verified 2026-05-17)
- `tests/dogfood/l5-rows/02-onboard-local/README.md` — scenario doc explicitly says "the user signals reonboard intent" and "Bro must call `onboard_state_get` then `onboard_apply` with `shape='remote'`"
- `tests/dogfood/l5-rows/02-onboard-local/prompt.txt` — literal "GitLab" mention
- `tests/dogfood/l5-rows/02-onboard-local/setup.sh` — re-seeds plugin_config to local-shape state on top of `onboarding-named` fixture
- `tests/dogfood/l5-rows/03-reonboard-remote/prompt.txt` is `/onboard` (slash command — the explicit path; step 02 is the implicit path)
## Plan
### Step A — rename
- Rename `tests/dogfood/l5-rows/02-onboard-local/` → `tests/dogfood/l5-rows/02-reonboard-implicit-from-local/`
- Update `tests/dogfood/l6-chain/chain-manifest.json` step name + row_dir
- Update any cross-references in `tests/EVALUATION.md`, `tests/dogfood/lib/l6-chain-helpers.sh`, or anywhere else that names the step by string
- Run `bash tests/dogfood/run-l6-chain.sh --from 2 --halt-on-fail 1` to confirm the rename plumbs through
### Step B — provider-agnostic prompt
Rewrite `prompt.txt` to omit the provider name. Example:
```
@bro I want to push this project to a remote.
Don't ask questions.
```
Bro then exercises provider-detection (checks env for `gh` / `glab` availability via `tools/sync/backend.ts::detectAvailable()`) and picks accordingly. Scorers (`outcome.sql`) already accept either path — `plugin_config[remotes] != '[]'` is provider-agnostic.
Verify: with `gh` available, bro picks github; with only `glab` available, bro picks gitlab. Both paths should pass the same scorers.
### Step C — split pre-state into dedicated fixture
Optional (defer if Step A+B are sufficient). Create `tests/dogfood/fixtures/onboarding-local-shape/` that ships local-shape `plugin_config` values inline (identity row, github-flow branching, pr_target=main, empty remotes, issue_sync=off, deep_scan_completed audit). Strip the re-seed logic from `setup.sh` so the test does one thing.
## Acceptance criteria
- Row directory renamed; chain manifest + helpers updated
- L6 chain step 2 passes under the new name (no regression)
- `prompt.txt` does NOT name a git host (no `\b(gitlab|github|bitbucket|codeberg)\b`)
- Scorers accept either gh-detected or glab-detected outcome
- README clarifies the implicit-vs-explicit reonboard pair (cross-link step 03)
- If Step C lands: `setup.sh` collapses to ≤5 lines (or is deleted entirely)
## Out of scope
- Auditing the OTHER 12 L6 prompts (step 14 fixed in #2904; step 10 in !2923; step 02 in this issue — rest reviewed as clean)
- Adding new L6 scenarios (separate issue)
- Reworking the provider-detection logic in `tools/sync/backend.ts`
## Coordination
- Companion to !2923 (step-10 prompt rewrite) — same "don't tell bro the answer" doctrine
- !2922 (sync mock precedence) is the parallel L2 fix
- All three discovered during post-Phase-B audit of #2904
## Note on source
Human caught the naming mismatch during 2026-05-17 post-Phase-B review: "Why this onboard-local ask to make the repo available on GL?" Investigation surfaced the three design issues above.
issue