Skip to content

feat(brief): add pipeline wait rule to no-mistakes ship briefs - #45

Merged
TastyTom13 merged 4 commits into
mainfrom
fm/fm-brief-pipeline-wait-rule
Sep 30, 2026
Merged

TastyTom13 merged 4 commits into
mainfrom
fm/fm-brief-pipeline-wait-rule

Conversation

@TastyTom13

@TastyTom13 TastyTom13 commented Sep 29, 2026 •

Copy link
Copy Markdown
Owner

Intent

Said 2026-09-29 evening: "we have been burning tokens at a rate faster then usual. I wonder why."

Context found by firstmate: the generated crew instructions say nothing about how to wait for the no-mistakes pipeline, so workers improvise. Pi workers ran sleep 180; no-mistakes axi status loops for hours, one model turn every three minutes per worker, which emptied the ChatGPT pool. A Claude worker put a change monitor on no-mistakes axi status, whose elapsed timers change every second, and received 60 events in 30 minutes, each a model turn.

What Changed

  • bin/fm-dod-lib.sh: the generated no-mistakes crew brief now has a "Waiting on the pipeline" section. It tells workers to keep the drive call's --wait within their harness command limit and to wait with a single sleep 540 call between no-mistakes axi status checks. It forbids change monitors or watch tools on axi status output, because its timers change every second. It also tells workers to append a paused: awaiting pipeline <step> on <branch or PR> line to the status file, and to add a new line only when the step changes.
  • tests/fm-brief.test.sh: no-mistakes briefs must contain the new section, the harness-bounded --wait rule and the paused declaration. Direct-PR and local-only briefs must not contain the section.

Risk Assessment

✅ Low: The change adds a short wait-rule section to the no-mistakes brief and a test that checks the generated brief; the earlier review fixes (verb from the shared variable, waits under the harness cap) are in place.

Testing

I ran the real brief generator in a throwaway home for all three modes and once with the paused verb overridden. The no-mistakes brief has the wait rule, the other two do not, and the override shows up in the brief. I also ran the whole brief test file and it passed. No UI is involved. I could not run a live worker to see if it obeys the text, because that needs a real model run.

  • Live validation: ✅ go - 4 of 4 scenarios driven live against the product
Scenario Result Live Evidence
Generate a no-mistakes brief: it has the wait section (bounded --wait, one sleep 540 between checks, no monitor on axi status, paused declaration) ✅ pass live brief-transcript.txt
Generate direct-PR and local-only briefs: they must not carry the wait section ✅ pass live brief-transcript.txt (grep count 0 for both)
Override FM_CLASSIFY_PAUSED_VERB=holding: the brief tells the worker to write holding: not paused: ✅ pass live brief-transcript.txt line 152 shows holding: declaration
All modes still generate cleanly, with no broken heredoc marker (EOF) ✅ pass live exit 0 for all modes, EOF count 0, fm-brief-test.txt
Evidence: Generated briefs across modes and verb override

Source: Generated briefs across modes and verb override

== no-mistakes: wait section ==
# Waiting on the pipeline
- Keep the drive call's `--wait` at or under your harness's command limit: the default `8m` fits a ten-minute cap, and a longer value gets the call killed.
- When a call returns with the run still going, wait with one call that fits the same limit, such as `sleep 540`, before the next `no-mistakes axi status`.
- Every check costs you a model turn, so never check more often than that.
- Never attach a change monitor or watch tool to `no-mistakes axi status` output: its timers change every second, so every tick wakes you for nothing.
- The pipeline never advances past a gate on its own, so a long wait loses nothing.
- Before each wait, append `paused: awaiting pipeline <step> on <branch or PR>` to the status file, and append a new line only when the step changes.

== direct-PR count ==
0
== local-only count ==
0
== override verb (holding) ==
152:- Before each wait, append `holding: awaiting pipeline <step> on <branch or PR>` to the status file, and append a new line only when the step changes.
== unterminated heredoc marker (EOF) count ==
0
== default verb ==
152:- Before each wait, append `paused: awaiting pipeline <step> on <branch or PR>` to the status file, and append a new line only when the step changes.
Evidence: fm-brief.test.sh output

Source: fm-brief.test.sh output

ok - fm-brief: scaffolds leave the worker role scope to the launch boundary and keep the secondmate contract
ok - fm-brief.sh: bash -n succeeds
/private/var/folders/08/gk0k1cz96snd794rnghc_98r0000gn/T/fm-brief.IpE8Nb/heredoc-in-substitution.sh:2
ok - fm-brief.sh: no heredoc is nested inside a command substitution (Bash 3.2 parse-safe)
ok - fm-brief.sh: --help renders the complete header
ok - fm-brief.sh: no-mistakes/direct-PR/local-only briefs generate cleanly
ok - fm-brief.sh: ship --mode is required and closed-set validated
ok - fm-brief.sh: the explicit ship mode wins over the registered posture
ok - fm-brief.sh: --yolo and scout/secondmate --mode are refused, never silently dropped
ok - fm-brief.sh: the base branch line renders only for an explicit base
ok - fm-brief.sh: faster paths use configured authority without stacked review
ok - fm-brief.sh: no-mistakes DOD keeps its apostrophe prose and bans --yes outright
ok - fm-brief.sh: no-mistakes ask-user findings use one event plus a verbatim snapshot
ok - fm-brief.sh: ship project-memory wording carries the AGENTS.md authoring bar
ok - fm-brief.sh: --herdr-lab emits the complete hard safety contract
ok - fm-brief.sh: --herdr-lab uses its quoted Firstmate-owned helper path
ok - fm-brief.sh: ship and scout scaffolds make omitted Herdr intent fail-visible
ok - fm-brief.sh: the documented {TASK} and {FIRSTMATE_SPEC} fills cannot corrupt the Herdr safety gate
ok - fm-brief.sh: Herdr lab contract covers scouts and rejects secondmate misuse
ok - fm-brief.sh: --no-projects scaffolds a project-less charter and guards misuse
ok - fm-brief.sh: marked requests avoid generic acknowledgements and preserve material reporting
ok - fm-brief.sh: relative directory inputs ignore CDPATH, render stable absolute charter paths, or fail loudly
ok - fm-brief.sh: custom pause verb renders in every scaffold
ok - fm-brief.sh: ship and scout scaffolds teach validation-round pauses
ok - fm-brief.sh: investigation and visual-review completions load the shared decision policy
ok - fm-brief: scout and secondmate code paths still scaffold well-formed briefs
ok - fm-brief.sh: scout Lavish hosting follows the bootstrap lavish-axi floor and names a durable board path
ok - fm-brief.sh: ship and scout carry the CONTEXT pointer, Toolkit, and Reporting rules
ok - fm-brief.sh: --env-file is opt-in, absolute, self-explaining, and refused on charters
ok - fm-brief.sh: the merge wait is declared exactly where a PR is raised
ok - fm-brief.sh: the Built-by PR-body line reads this task's own recorded harness/model/effort
ok - fm-brief.sh: fable-prompting Task subsections, charter Intent slot, Working discipline lines, cd caution, and ship verification step render for every scaffold
ok - fm-brief.sh: acceptance-numbering and red-then-green rules render only for PR-raising ship briefs
ok - fm-brief.sh: the screenshot pre-flight renders only for --ui tasks
ok - fm-brief.sh: --help documents the --ui screenshot pre-flight
ok - fm-brief.sh: ship and scout briefs name the unwanted and wanted turn ends plus the time sentence
ok - fm-brief.sh: --pasted-file marks the captain's paste under Captain's intent and is otherwise byte-identical
ok - fm-brief.sh: --design adds only the front-end design block
ok - fm-brief.sh: --visual is surface-bound, shared by ship/scout, and byte-neutral when absent
ok - fm-brief.sh: --help documents the visual-work flag and surface selector
ok - fm-brief.sh: --help documents --pasted-file and --design

Pipeline

Updates from git push no-mistakes

✅ **intent** - passed

✅ No issues found.

✅ **Rebase** - passed

✅ No issues found.

✅ **Review** - passed

✅ No issues found.

✅ **Test** - passed

✅ No issues found.

  • Live validation: ✅ go - 4 of 4 scenarios driven live against the product
Scenario Result Live Evidence
Generate a no-mistakes brief: it has the wait section (bounded --wait, one sleep 540 between checks, no monitor on axi status, paused declaration) ✅ pass live brief-transcript.txt
Generate direct-PR and local-only briefs: they must not carry the wait section ✅ pass live brief-transcript.txt (grep count 0 for both)
Override FM_CLASSIFY_PAUSED_VERB=holding: the brief tells the worker to write holding: not paused: ✅ pass live brief-transcript.txt line 152 shows holding: declaration
All modes still generate cleanly, with no broken heredoc marker (EOF) ✅ pass live exit 0 for all modes, EOF count 0, fm-brief-test.txt
  • FM_HOME=&lt;tmp&gt; bin/fm-brief.sh b-&lt;mode&gt; some-proj --mode no-mistakes|direct-PR|local-only, then inspected the generated brief.md files
  • FM_CLASSIFY_PAUSED_VERB=holding bin/fm-brief.sh ... --mode no-mistakes and checked the rendered declaration
  • bash tests/fm-brief.test.sh (whole file, exit 0)
✅ **Document** - passed

✅ No issues found.

✅ **Lint** - passed

✅ No issues found.

✅ **Push** - passed

✅ No issues found.

Built by: claude/sonnet at medium

@TastyTom13
TastyTom13 force-pushed the fm/fm-brief-pipeline-wait-rule branch from 5ef3a75 to 899abd7 Compare September 30, 2026 08:26
@TastyTom13
TastyTom13 merged commit f62249d into main Sep 30, 2026
29 of 30 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant