### Added
- `src/framework_chief/_shell.py` — `_shell_cmd()` auto-detects the right interpreter at runtime (`pwsh`/`powershell` on Windows, `bash` elsewhere) and returns a ready-to-pass argument prefix; `_split_cmd()` uses `.split()` on Windows instead of `shlex.split()` to avoid POSIX quoting issues with Windows paths. Single dispatch point; all callsites import from here — no hardcoded `"bash"` anywhere.
- `src/framework_chief/data/scripts/chief-install.ps1` and `chief-sync.ps1` — faithful PowerShell 7+ ports of the bash originals, bundled so `chief init` deploys them alongside the `.sh` versions on every platform.
- CI unit job extended to a matrix `[ubuntu-latest, windows-latest]` — Python shell-dispatch verified on both platforms.
- `tests/unit/test_shell.py` — 14 tests covering all branches of `_shell_cmd` and `_split_cmd`: platform mocking, `pwsh`/`powershell` discovery order, fallback to `bash`, `RuntimeError` when nothing is found.
- `tests/unit/test_phases.py` extended with 5 new tests: `always_run=True` bypasses the skip guard even when the artifact exists; `always_run=False` still skips; `copy_scripts` phase asserts `always_run=True` (so `.ps1` upgrades propagate); `_exec_wire_agents` returns `failed` on `RuntimeError` and on `FileNotFoundError`.
- `tests/unit/test_cli.py` — 2 tests for `cmd_sync`: both `RuntimeError` and `FileNotFoundError` from `_shell_cmd` return exit code 127.
- `tests/mechanical/run-mechanical.ps1` — PowerShell 7+ port of `run-mechanical.sh`; covers `chief-sync.ps1` idempotency (3 runs, exit 0), CLAUDE.md overlay correctness, Copilot marker count, `.claude/commands/chief.md`, `.codex/prompts/chief.md`, `--ai` isolation for each target (claude/copilot/codex), and non-zero exit on missing `AGENTS.md`.
- CI `mechanical-ps1` job on `windows-latest` — runs `tests/mechanical/run-mechanical.ps1` via `pwsh`, 10-minute cap.
- `docs/adrs/ADR-0008-shell-auto-detect.md` — records the decision to use auto-detect instead of an explicit `--shell` flag, the rationale, and the `.ps1` sibling extension contract.

### Changed
- `cli.py` and `phases.py` — all subprocess invocations now go through `_shell_cmd()` / `_split_cmd()` instead of hardcoded `["bash", ...]` / `shlex.split()`.
- `cmd_sync` in `cli.py` now catches `RuntimeError` (raised by `_shell_cmd` when no interpreter is found) in addition to `FileNotFoundError`, returning 127 in both cases.

### Removed
- Root `scripts/` directory deleted — was a duplicate of `src/framework_chief/data/scripts/` with no tooling pointing at it. The authoritative copies live in `data/scripts/` and are what `chief init` deploys.

---
