voyage/lib
Kjell Tore Guttormsen 20f32bb06b
fix(intent): M1 + M2 — the parser fails closed; --approve reaches any brief file
M1: headings inside fenced code blocks and HTML comments are text, not
headings, and ## Intent / ## Goal must each appear exactly once. A second
section, an example section in a code block or comment, or a '## ' line in
a code block inside Intent no longer carries the old approval: check gives
INVALID (duplicate) or STALE, stamp refuses a duplicate. A plain brief
hashes exactly as before (pinned), so no stamped brief goes stale.
Re-run of the PM's 29 probes: vi-a, vi-b, vii-a, vii-b now stop; the rest
unchanged. The PM's p7c probe was a no-op (its replace string is not in the
base brief); vii-c is covered by its own test, red on 66e1fa1.

M2: /trekbrief --approve takes <project-dir | brief-file>. New
intent-approval.mjs --resolve decides: a directory → <dir>/brief.md and
/trekplan --project; a file → itself and /trekplan --brief. Phase 4h and the
stamp line use {BRIEF_PATH}; /trekplan's halt table names
/trekbrief --approve {brief_path}, which works on both brief modes, and so
does the gate's hint. HANDOVER-CONTRACTS' "open to every producer's brief"
is now true. Chose fixing the path over rewording the contract because two
real briefs (docs/*-brief.md) had no approval path at all.

Red ff760ed 9/29 → green 29/29. Suite 1219: 1217 pass / 0 fail / 2 skip.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23 09:22:03 +02:00
..
exporters fix(stats): intent_approved reaches the OTel allowlist like every other trekbrief field 2026-09-23 07:52:45 +02:00
parsers feat(intent): /trekplan halts without an approved intent; the approval is stamped on both paths 2026-09-23 07:50:51 +02:00
plan feat(voyage): S12 — NW3 synthesis-agent built + measured → declined per measurement [skip-docs] 2026-06-18 17:58:39 +02:00
profiles feat(profiles): add built-in fable profile (all six phases on fable) 2026-07-02 16:59:26 +02:00
review fix(review): write the gold-scorer key separator as an escape, not a raw NUL byte 2026-09-17 15:36:18 +02:00
stats fix(stats): M6 — trekbrief and trekplan records land where the yardstick reads 2026-09-23 09:17:52 +02:00
util feat(research-loop-cap): give the discovery ceiling a reader, not just a sentence 2026-08-12 23:09:11 +02:00
validators fix(intent): M1 + M2 — the parser fails closed; --approve reaches any brief file 2026-09-23 09:22:03 +02:00
verification fix(verification): a section the runner cannot read SAYS so, and trekplan is pinned to the format it reads 2026-09-18 03:00:13 +02:00