feat(voyage): wire 4 downstream commands to brief.phase_signals + composition rule (v5.1)

This commit is contained in:
Kjell Tore Guttormsen 2026-05-13 21:13:51 +02:00
commit d3975c441c
4 changed files with 121 additions and 0 deletions

View file

@ -1519,6 +1519,37 @@ VOYAGE_PROFILE=balanced /trekexecute --project ...
Stats records emit `profile`, `phase_models`, and `profile_source` per
Phase 9 record.
## Composition rule (v5.1)
Independent of the profile system. When `brief.md` carries
`phase_signals` (brief_version ≥ 2.1), each downstream phase resolves
effort + model as:
```
effort_for_phase = brief.phase_signals[<phase>]?.effort ?? 'standard'
model_for_phase = brief.phase_signals[<phase>]?.model ?? profile.phase_models[<phase>]
```
The brief signal wins per-phase when present; the profile fills any
gaps. There is no helper module — composition is documented prose in
each downstream command.
For `/trekexecute` specifically: `effort == 'low'` activates `--gates open`
+ sequential-only execution (no worktree-isolated parallel waves — runs
all sessions in a single foreground loop). `effort == 'standard'` (or
absent) → no change (default execution strategy applies). High-effort
behavior is deferred to v5.1.1 per brief Non-Goal.
### Sequencing gate surface
When `/trekexecute --project <dir>` is invoked, optionally run
`brief-validator.mjs --soft --json` against `{dir}/brief.md`. If
`BRIEF_V51_MISSING_SIGNALS` appears in `errors` (brief_version ≥ 2.1
without `phase_signals` or `phase_signals_partial: true`), halt with:
`Brief is brief_version 2.1 but does not carry phase_signals — re-run
/trekbrief to commit them (Phase 3.5).` Enforcement is validator-only;
commands surface, don't re-enforce.
## Hard rules
1. **No AskUserQuestion for execution decisions.** All execution decisions come