feat(skills): add captain-invocable /quiet skill for end-of-turn-only replies - #4
Merged
Conversation
Session-scoped silence: tools still run; one captain-facing reply at turn end. Truth still beats silence for blockers and credentials. Documents that MCP tool rows stay visible.
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
Add a captain-invocable /quiet skill so firstmate stays silent until the final captain-facing reply. Hide mid-turn chatter (checking..., need the URL...); Calm already hides built-in tool rows; MCP/custom tool rows (lean-ctx ctx_*) cannot be hidden and must not be claimed to hide. Form: skill only under .agents/skills/quiet/SKILL.md, user-invocable true, triggers /quiet stay quiet no chatter silent until done; off with /quiet off or talk normally. Not an axi CLI, not a new Pi extension, do not wrap MCP tools, do not change Calm hide contract except optional one-line pointer. Behavior while on: no mid-turn captain messages, tools still run, one captain-facing reply at end of turn, truth beats silence for blockers/credentials/failures. One-line AGENTS.md trigger only as coding-guidelines require. Ponytail full: short one-owner skill. Branch fm/fm-quiet-skill-p1.
What Changed
.agents/skills/quiet/SKILL.md, a user-invocable session-scoped skill: while on, tools still run but mid-turn captain-facing chatter is suppressed, and exactly one end-of-turn reply is sent that still surfaces blockers, needed credentials, and failures; toggled with/quiet//quiet offor natural-language equivalents, with no flags, files, or config written.ctx_*) stay visible and the skill must never claim to hide them, wrap MCP tools, or change Calm's hide contract./quiettrigger in AGENTS.md, a/quietrow in the README built-in skills table, and anagent-runtimeaudience entry indocs/documentation-audiences.json.Risk Assessment
✅ Low: Prose-only addition of one skill file and a one-line AGENTS.md trigger that satisfies every required intent constraint, contains none of the forbidden behaviors, and matches the repo's established skill frontmatter and trigger-hygiene conventions.
Testing
Ran the fm-test-run-selected documentation-audiences contract test (passes with round 1's classification fix), demonstrated the doc-audience checker failing on the base-commit inventory and passing on the target, semantically verified the quiet skill's frontmatter contract and trigger phrases via YAML parsing, proved the diff-scope form constraints (three files only, one AGENTS.md line, no forbidden surfaces), and confirmed round 1's live Pi end-to-end transcript still applies since the skill content is unchanged — all checks pass with no findings.
Evidence: Doc-audience check: fails on base inventory, passes on target
$ bin/fm-doc-audience-check.sh --inventory <base 49184b9 inventory> fm-doc-audience-check: unclassified: .agents/skills/quiet/SKILL.md exit=1 $ bin/fm-doc-audience-check.sh # inventory at target a8861e9 fm-doc-audience-check: ok surfaces=68 local_links=243 exit=0Evidence: Quiet skill frontmatter semantic verification (10/10 assertions)
PASS - name is 'quiet' PASS - user-invocable is boolean true PASS - frontmatter keys match working sibling skill schema PASS - metadata matches sibling shape PASS - description advertises trigger/off phrase '/quiet' PASS - description advertises trigger/off phrase 'stay quiet' PASS - description advertises trigger/off phrase 'no chatter' PASS - description advertises trigger/off phrase 'silent until done' PASS - description advertises trigger/off phrase '/quiet off' PASS - description advertises trigger/off phrase 'talk normally'Evidence: Diff-scope proof of form constraints (3 files, 1 AGENTS.md line, no bin//extensions/ changes)
Evidence: Live Pi end-to-end transcript: /quiet suppresses mid-turn chatter, one final reply; /quiet off restores narration (round 1, skill content unchanged)
Pipeline
Updates from git push no-mistakes
✅ **intent** - passed
✅ No issues found.
✅ **Rebase** - passed
✅ No issues found.
✅ **Review** - passed
✅ No issues found.
🔧 **Test** - 1 issue found → auto-fixed ✅
docs/documentation-audiences.json:168- The new .agents/skills/quiet/SKILL.md was not classified in docs/documentation-audiences.json, so bin/fm-doc-audience-check.sh exited 1 ("unclassified: .agents/skills/quiet/SKILL.md") and tests/fm-documentation-audiences.test.sh — part of the pure-contract-unit family that fm-test-run selects for SKILL.md and AGENTS.md changes — failed on the repository-inventory case. Fixed by adding the {"path": ".agents/skills/quiet/SKILL.md", "audience": "agent-runtime"} entry in alphabetical order, mirroring all sibling skills; the full test now passes.bash bin/fm-doc-audience-check.sh— initially failed withunclassified: .agents/skills/quiet/SKILL.md; passes after adding the inventory entrybash tests/fm-documentation-audiences.test.sh— all 4 cases pass after the inventory fix (this is the pure-contract-unit family member that consumes SKILL.md/AGENTS.md surfaces per bin/fm-test-run.sh's change mapping)Live e2e session 1:pi --print --approve --no-session --no-context-files --no-extensions --no-skills --skill .agents/skills --tools read --model openai-codex/gpt-5.6-sol --thinking low --mode json "/quiet" "Read notes.txt and harbor.txt, then tell me the code word and the berth number."— /quiet yields exactly one short confirmation; task turn runs two read tools with zero mid-turn assistant text and one final reply containing both answersLive e2e session 2: same pi invocation with messages"/quiet" "/quiet off" "Read harbor.txt and walk me through what you are doing as you go."— /quiet off yields a one-sentence restore confirmation and the next turn shows normal mid-turn narration before the tool call (the chatter quiet suppresses)Manual check: quiet SKILL.md frontmatter (name/description/user-invocable/metadata.internal) matches sibling skills (ahoy, afk); diff contains only SKILL.md + one AGENTS.md line — no CLI, Pi extension, MCP wrapper, or Calm hide-contract change; grep confirmed no other unit test consumes the edited AGENTS.md escalation section🔧 Fix: classify quiet skill in documentation audience inventory
✅ Re-checked - no issues remain.
bash tests/fm-documentation-audiences.test.sh— all 4 cases pass at the target commitbin/fm-doc-audience-check.sh --inventory <base-commit inventory>— reproduces the pre-fix failureunclassified: .agents/skills/quiet/SKILL.md(exit 1)bin/fm-doc-audience-check.sh— passes at target (ok surfaces=68 local_links=243, exit 0)Semantic YAML parse of.agents/skills/quiet/SKILL.mdfrontmatter asserting name=quiet, user-invocable=true (boolean), key schema identical to working sibling skillafk, and description containing all six required trigger/off phrases — 10/10 assertions passgit diff --name-status 49184b9 a8861e9scope check — only the skill file, one AGENTS.md line (+1/-0), and the inventory entry changed; zero files underbin/orextensions/(no CLI, no Pi extension, no MCP wrap, no Calm hide-contract change)Confirmedgit diff 8ae138a a8861e9 -- .agents/skills/quiet/SKILL.md AGENTS.mdis empty, so round 1's live Pi end-to-end transcript (quiet-on suppresses mid-turn chatter with tools running and one final truthful reply; /quiet off restores narration) remains valid evidence for the target commit✅ **Document** - passed
✅ No issues found.
✅ **Lint** - passed
✅ No issues found.
✅ **Push** - passed
✅ No issues found.