Conversation
Rewrite section 9's decision-presentation sentence in place so a captain decision is asked as two to four mutually exclusive options, recommended one first, each carrying its consequence, with discarded options kept visible. `lavish-axi` keeps its role for several options or a structured report. The escalation-form line above it and ask-user-authority's escalation elements now cross-reference that one owner instead of restating it. Claude-Session: https://claude.ai/code/session_01877Z1wbhk1iRi73ApTo19E
This was referenced Sep 18, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Intent
The captain instructed this directly in a crewmate's window on 2026-09-09, twice, and then confirmed the placement himself by selection. His instruction, in substance: present EVERY decision as selectable options rather than prose.
The shape he asked for:
He was reacting against prose escalations that bury (a)/(b)/(c) in a paragraph. The options must be selectable, not described.
On placement, he was given three choices and picked "firstmate contract only": NOT the project repo. A crewmate had written the rule into Uwhamadang's committed AGENTS.md; that copy was reverted on his instruction, because a rule about how to present decisions to the captain does not belong in a file read by contributors who are not talking to him.
What Changed
AGENTS.mdsection 9 now defines a decision-presentation contract: every decision put to the captain in an escalation or self-initiated ask is presented as two to four mutually exclusive selectable options, recommended one first and marked as such, each carrying its consequence rather than only a label — never prose the captain has to parse choices out of. A plausibly-expected discarded option stays visible with the reason it fails, listed apart from that set as unpickable context that does not count toward the two-to-four.ahoyandask-user-authorityskills now point their option/escalation steps atAGENTS.mdsection 9 as the owner of the form the captain sees, so the contract has one definition rather than divergent per-skill copies.Risk Assessment
✅ Low: Documentation-only wording change to one always-loaded contract plus two one-line cross-references; every component traces to an explicit prior-round decision, the placement constraint is satisfied (the rule exists nowhere but AGENTS.md), the collisions with the bearings digest, board cards, and ahoy's one-at-a-time pacing are resolved by the :508 carve-out, and no code path, data flow, or protected resource is touched.
Testing
I exercised the delivery path this contract change actually rides: a running firstmate session that compacts after the change lands is re-delivered the complete on-disk AGENTS.md, with the selectable-option set, the two-to-four bound, the discarded-option visibility rule, the surface carve-out, and the batching/labelling rule all present in the emitted payload. Adversarially, an unchanged contract triggers no refresh and a pre-change contract delivers only the base wording, so the mechanism is drift-triggered rather than noisy. For the captain's placement ruling I drove the three real generators that write agent instructions into project territory and confirmed none of them carry the captain-facing form, while ask-user decisions still route back to firstmate. The two new skill pointers resolve against the delivered payload, whose section 9 is the escalation section and the only place the option rules appear. No screenshot or rendered artifact applies: the changed surface is an agent-facing instruction contract delivered as text into a session, not UI, so the reviewer-visible evidence is the emitted digest payload itself. The one thing I could not drive is whether a firstmate then renders a decision as 2-4 options in captain chat, which is model interpretation of a prompt and needs a live LLM session; it is reported untested.
scenario1-instruction-refresh.shdrove bin/fm-session-start.sh in an isolated FM_HOME; the emitted digest carriesCURRENT AGENTS.md - INSTRUCTION REFRESHwith the complete contract byte-for-byte,…scenario3-drift-guard.shran two further compactions against the same live digest: an unchanged contract emitted no refresh section, and a contract reverted to base emitted the refresh with `then th…scenario2-placement.shgenerated a real crewmate ship brief and secondmate charter with bin/fm-brief.sh and a project AGENTS.md with bin/fm-ensure-agents-md.sh; none contain the option form, the bri…scenario4-pointer-resolution.pyparsed the payload emitted by the live session-start run into a section model: section 9 is 'Escalation and captain etiquette', all nine option-form clauses live ther…Evidence: Scenario transcript (all four drivers plus the ask-user-authority test)
Source: Scenario transcript (all four drivers plus the ask-user-authority test)
$ scenario1-instruction-refresh.sh ok - compaction re-delivered the updated decision-presentation contract to the running firstmate $ scenario2-placement.sh ok - the decision-presentation form stays in the firstmate contract: worker brief, secondmate charter, and generated project AGENTS.md carry none of it $ scenario3-drift-guard.sh ok - instruction refresh fires only on real contract drift and delivers exactly the contract on disk $ scenario4-pointer-resolution.py delivered contract sections: [1..14]; section 9 = 'Escalation and captain etiquette'; pointer targets resolved $ tests/fm-ask-user-authority.test.sh ok - primary workers and secondmates receive the authority rule through generated instructionsEvidence: Section 9 exactly as delivered to the running firstmate on compaction
Source: Section 9 exactly as delivered to the running firstmate on compaction
Evidence: Instruction-refresh excerpt: the four new decision-presentation rules in the emitted digest
Source: Instruction-refresh excerpt: the four new decision-presentation rules in the emitted digest
Evidence: Full compact digest emitted after the contract change (delivered payload)
Source: Full compact digest emitted after the contract change (delivered payload)
Evidence: Generated project AGENTS.md from bin/fm-ensure-agents-md.sh - project memory only
Source: Generated project AGENTS.md from bin/fm-ensure-agents-md.sh - project memory only
Evidence: Pointer resolution against the delivered payload's section model
Source: Pointer resolution against the delivered payload's section model
Evidence: Reproducible drivers used for the four scenarios
Source: Reproducible drivers used for the four scenarios
Pipeline
Updates from git push no-mistakes
✅ **intent** - passed
✅ No issues found.
✅ **Rebase** - passed
✅ No issues found.
AGENTS.md:509- The recorded document-round decision was two-part: "scope the batching clause so it governs a single ask FIRSTMATE INITIATES, and a surface that owns its own decision-clearing sequence keeps that sequence." Only the second half landed (:508). The batching clause at :509 still carries no scope of its own - the phrase "in an escalation or ask you initiate" appears only in :506, which governs the option FORM, not pacing. That leaves the ahoy case resting entirely on :508, whose sentence grants the pacing exemption and then immediately reasserts "the rest of this section still applies to them" - and :509's batching clause is part of that rest. Concrete sequence: the captain runs /ahoy with three visibly open decisions;.agents/skills/ahoy/SKILL.md:46-50presents the single most impactful one and then the next, one at a time; an agent reading :508's tail concludes the batching requirement in :509 is among "the rest of this section" and still binds, so it either batches all three (breaking the guided flow the captain kept) or must re-derive that "that pacing" silently displaces :509. The charitable reading works, but the text does not settle it. Narrowest remedy, and the one the recorded decision already authorized: carry :506's scope into the batching clause itself, e.g. "batch one round's decisions into a single ask you initiate instead of serial questions" - one phrase, no new rule, and it removes any need to reason about :508's tail. Action is ask-user because the edit changes contract wording the captain supplied and completes a decision he already made rather than correcting a mechanical defect.AGENTS.md:490- The escalation ordering was changed from base ("then the consequence, options when applicable, and a recommendation") to put the recommendation BEFORE the options. Nothing in the User intent requires that reorder - the intent's only ordering constraint is "The recommended option first and marked as recommended", which :506 already carries inside the option set. The result states the recommendation twice: once as a standalone line naming an option the captain has not yet seen, then again as the marked first option. Concrete sequence: firstmate escalates a two-option choice; per :490 it writes "Recommend option A" before A is defined, then per :506 renders A first and marked as recommended. Not wrong, but it is a captain-facing form change the intent did not ask for. Narrower form: restore the base ordering ("the consequence, options when applicable, and a recommendation") and keep only the added pointer to the selectable form this section defines below. Action is ask-user because escalation ordering is deliberate captain-facing product behavior, not a mechanical fix.AGENTS.md:507- ":507 Keep any option you considered and discarded visible with the reason it fails" is unbounded - it requires every discarded option on every ask, with no cap, while :489 in the same section requires "Every escalation must stand alone and remain concise" and :506 forbids an undifferentiated menu. Concrete sequence: firstmate escalates a backend choice after ruling out five approaches; :507 obliges listing all five discarded entries with reasons alongside the 2-4 selectable options, producing a nine-item escalation that directly fights :489 and the anti-menu spirit of :506. The User intent's wording is "A rejected option stays visible with the reason it fails, so he can see what was considered and discarded" - it establishes the duty but not that it is exhaustive regardless of count. Narrower form: bound it to the options the captain would plausibly otherwise raise, or cap the discarded list the way the selectable set is capped. Action is ask-user: how much discarded context the captain wants to see is his call, and the intent text does not settle it.🔧 Fix applied.
1 info still open:
GROK_BOT.md:27- GROK_BOT.md is a second live firstmate contract in this repo (classified "public-product" in docs/documentation-audiences.json) that states its own decision-presentation rule and never imports AGENTS.md. Its rule now diverges from the new section 9 contract: it already requires a choice card with the real options and a recommendation, so the intent's core ask ("present EVERY decision as selectable options") is met there, but it carries no two-to-four cap, no discarded-option visibility, and it explicitly says "One card at a time. Do not batch unrelated decisions into one list" - the direct opposite of AGENTS.md:509's "batch one round's decisions into a single ask you initiate instead of serial questions". Concrete sequence: the Grok-surface firstmate finishes a round with three open decisions; under GROK_BOT.md:27 it sends three separate cards, which is exactly the serial questioning :509 forbids on the AGENTS.md surface, so the same fleet presents decisions two different ways. Nothing breaks today because the two files govern separate deployments and GROK_BOT.md does not read AGENTS.md, and AGENTS.md:508's surface carve-out would arguably cover its pacing if it did. This may well be deliberate: the recorded placement decision was "firstmate contract only, NOT the project repo", and the reason given was that the rule does not belong in a file read by contributors who are not talking to the captain - GROK_BOT.md is public-product, so excluding it is a defensible reading of that same decision. Raising it only so the scope call is explicit rather than incidental. Not auto-fixable: whether the Grok surface adopts the cap, the discarded-option duty, and batching is a product call the author owns, and the remedy would edit a shipped contract this change never touched.✅ **Test** - passed
✅ No issues found.
scenario1-instruction-refresh.shdrove bin/fm-session-start.sh in an isolated FM_HOME; the emitted digest carriesCURRENT AGENTS.md - INSTRUCTION REFRESHwith the complete contract byte-for-byte,…scenario3-drift-guard.shran two further compactions against the same live digest: an unchanged contract emitted no refresh section, and a contract reverted to base emitted the refresh with `then th…scenario2-placement.shgenerated a real crewmate ship brief and secondmate charter with bin/fm-brief.sh and a project AGENTS.md with bin/fm-ensure-agents-md.sh; none contain the option form, the bri…scenario4-pointer-resolution.pyparsed the payload emitted by the live session-start run into a section model: section 9 is 'Escalation and captain etiquette', all nine option-form clauses live ther…bash scenario1-instruction-refresh.sh— drove bin/fm-session-start.sh in an isolated FM_HOME: startup on the base contract, contract change lands,--reemit --source compactre-delivers the complete target contractbash scenario3-drift-guard.sh— adversarial: compact with an unchanged contract emits no refresh; a reverted contract emits the base escalation wording and none of the new option rulesbash scenario2-placement.sh— drove bin/fm-brief.sh (ship--mode no-mistakesand--secondmate) and bin/fm-ensure-agents-md.sh on a fresh project repo, asserting the emitted worker brief, secondmate charter, and generated project AGENTS.md carry no captain-facing option formpython3 scenario4-pointer-resolution.py— parsed the live-emitted AGENTS.md payload into a section model and resolved both newAGENTS.md section 9skill pointers against itbash tests/fm-ask-user-authority.test.sh— existing end-to-end coverage for the generated instructions that route ask-user decisions to firstmate✅ **Document** - passed
✅ No issues found.
⏭️ **Lint** - skipped
✅ **Push** - passed
✅ No issues found.