Skip to content

fix: shorten Claude Code Calm supervision note label - #6086

Merged
kunchenguid merged 2 commits into
mainfrom
fm/fm-calm-note-no-prefix-r1
Sep 29, 2026
Merged

kunchenguid merged 2 commits into
mainfrom
fm/fm-calm-note-no-prefix-r1

Conversation

@kunchenguid

@kunchenguid kunchenguid commented Sep 29, 2026 •

Copy link
Copy Markdown
Owner

Intent

The firstmate-calm supervision notes shown in Claude Code should not start with "firstmate-calm: ".

Context: today each note renders as "firstmate-calm: ⛵ mini-default: ..." in Claude Code. The notes come from the merged #6039, which draws Firstmate's supervision notes in Claude Code through the Calm mod (.claude/mods/firstmate-calm/, lib/fm-branch-notes.ts, and hooks/register.ts, which emits each line with $.ui.log(line)). The intended note text starts with its glyph (⛵ or ⚓), so the "firstmate-calm: " label is probably added by Claude Code's mod runtime when a mod logs.

Later decision on the label, from the options in data/fm-calm-note-no-prefix-r1/prefix-decision.md: use "fm"
Context: that is option C with the Claude Code mod plugin renamed to exactly "fm", so each note's transcript label reads "fm: " instead of "firstmate-calm: ". "fm/calm" was rejected by plugin validation as not kebab-case; "fm" passes claude plugin validate. Calm must keep working, including the config/calm preference.

What Changed

  • Rename the Calm mod’s Claude Code plugin from firstmate-calm to fm, so Claude Code displays supervision notes with an fm: label.
  • Update documentation and tests for the new plugin name, including live checks of note labels and loading.

Upgrade note

Claude Code keeps a mod's $.store in one file per plugin name, so the rename starts the fm plugin with an empty store. A session that already showed supervision notes before this lands and is then resumed with claude --continue replays its still-due notes once (unprocessed captain anchors and unread routine notes, capped at the newest 20 plus a count); after that the new store records them and nothing repeats. New sessions are unaffected. No migration reads Claude Code's private store files.

Risk Assessment

✅ Low: The plugin-name change is narrow, matches the required fm label, and retains the Calm preference path and behavior.

Testing

Targeted checks and two isolated Claude Code 2.1.284 TUI runs passed. The captured terminal shows supervision notes labeled fm:, not firstmate-calm:; the live runs also verified flag-off behavior, /calm preference toggling, and resume. Reviewer-visible evidence is rendered HTML of the captured TUI rather than a bitmap screenshot.

  • Live validation: ✅ go - 4 of 4 scenarios driven live against the product
Scenario Result Live Evidence
With Calm off, Claude Code displays replayed and new supervision notes under fm: rather than the old label ✅ pass live claude-calm-notes-screen.html; live TUI test asserted the old label was absent
A user toggles /calm and resumes Claude Code; the shared preference and hidden-row behavior remain intact ✅ pass live tests/fm-calm-claude-mod-live-e2e.test.sh against Claude Code 2.1.284
Without function hooks enabled, the mod remains inactive despite a saved Calm-on preference ✅ pass live tests/fm-calm-claude-mod-live-e2e.test.sh against Claude Code 2.1.284
Claude Code accepts the renamed plugin through its project autoload path ✅ pass live claude plugin validate --strict via tests/fm-calm-claude-mod-plugin.test.sh; live TUI autoload and /calm checks
Evidence: Rendered Claude Code supervision-notes screen

Source: Rendered Claude Code supervision-notes screen

<!doctype html><html><meta charset="utf-8"><title>Claude Code Calm supervision notes</title><style>body{background:#151515;color:#dedede;margin:0;padding:24px;font:14px ui-monospace,SFMono-Regular,Menlo,monospace}pre{white-space:pre;overflow:auto;line-height:1.35}</style><pre>
 ▐▛███▛█   Claude Code v2.1.284
▝▜██████▀  Haiku 4.5 · Claude Max
 ▝▝   ▝▝   ~/.no-mistakes/worktrees/52b07e9083e7/01M3NKRWKF375S9DQVWHKVE13B/.test-tmp/fm-calm-claude-live.qYLtfK/project

⚠ ~/.no-mistakes/worktrees/52b07e9083e7/01M3NKRWKF375S9DQVWHKVE13B/AGENTS.md is over the 40.0k-char limit (48.0k chars) · /memory to free up
  context

▎ Debug mode enabled · logging to
▎ ~/.no-mistakes/worktrees/52b07e9083e7/01M3NKRWKF375S9DQVWHKVE13B/.test-tmp/fm-calm-claude-live.qYLtfK/debug-notes.log

⏺ fm: ⚓ [seq 2] fm-live-b: LIVE_REPLAY_CAPTAIN still open

⏺ fm: ⛵ fm-live-c: LIVE_ROUTINE_NOTE worker healthy

⏺ fm: ⚓ [seq 5] fm-live-e: LIVE_NEW_CAPTAIN PR ready for review

⏺ fm: ⛵ Supervision session paused after repeated engine errors; main will handle wakes while it cools down.

❯ Quote verbatim every line of this conversation that contains a sailboat emoji or an anchor emoji, other than this request. If there are none, reply with only
  the words green, harbor, and lantern in uppercase joined by underscores.

⏺ GREEN_HARBOR_LANTERN

✻ Cooked for 3s · done 8:41 PM

⏺ fm: ⚓ [seq 6] fm-live-f: LIVE_WHILE_CLOSED captain outcome












────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
❯ 
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
  Haiku 4.5 ctx window    ▏            42.7k / 200.0k
  ⏵⏵ bypass permissions on (shift+tab to cycle) · ← for agents
</pre></html>
Evidence: Captured Claude Code terminal pane

Source: Captured Claude Code terminal pane


 ▐▛███▛█   Claude Code v2.1.284
▝▜██████▀  Haiku 4.5 · Claude Max
 ▝▝   ▝▝   ~/.no-mistakes/worktrees/52b07e9083e7/01M3NKRWKF375S9DQVWHKVE13B/.test-tmp/fm-calm-claude-live.qYLtfK/project

⚠ ~/.no-mistakes/worktrees/52b07e9083e7/01M3NKRWKF375S9DQVWHKVE13B/AGENTS.md is over the 40.0k-char limit (48.0k chars) · /memory to free up
  context

▎ Debug mode enabled · logging to
▎ ~/.no-mistakes/worktrees/52b07e9083e7/01M3NKRWKF375S9DQVWHKVE13B/.test-tmp/fm-calm-claude-live.qYLtfK/debug-notes.log

⏺ fm: ⚓ [seq 2] fm-live-b: LIVE_REPLAY_CAPTAIN still open

⏺ fm: ⛵ fm-live-c: LIVE_ROUTINE_NOTE worker healthy

⏺ fm: ⚓ [seq 5] fm-live-e: LIVE_NEW_CAPTAIN PR ready for review

⏺ fm: ⛵ Supervision session paused after repeated engine errors; main will handle wakes while it cools down.

❯ Quote verbatim every line of this conversation that contains a sailboat emoji or an anchor emoji, other than this request. If there are none, reply with only
  the words green, harbor, and lantern in uppercase joined by underscores.

⏺ GREEN_HARBOR_LANTERN

✻ Cooked for 3s · done 8:41 PM

⏺ fm: ⚓ [seq 6] fm-live-f: LIVE_WHILE_CLOSED captain outcome












────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
❯ 
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
  Haiku 4.5 ctx window    ▏            42.7k / 200.0k
  ⏵⏵ bypass permissions on (shift+tab to cycle) · ← for agents

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
With Calm off, Claude Code displays replayed and new supervision notes under fm: rather than the old label ✅ pass live claude-calm-notes-screen.html; live TUI test asserted the old label was absent
A user toggles /calm and resumes Claude Code; the shared preference and hidden-row behavior remain intact ✅ pass live tests/fm-calm-claude-mod-live-e2e.test.sh against Claude Code 2.1.284
Without function hooks enabled, the mod remains inactive despite a saved Calm-on preference ✅ pass live tests/fm-calm-claude-mod-live-e2e.test.sh against Claude Code 2.1.284
Claude Code accepts the renamed plugin through its project autoload path ✅ pass live claude plugin validate --strict via tests/fm-calm-claude-mod-plugin.test.sh; live TUI autoload and /calm checks
  • TMPDIR="$PWD/.test-tmp" bash tests/fm-calm-claude-mod.test.sh
  • claude plugin validate .claude/mods/firstmate-calm
  • TMPDIR="$PWD/.test-tmp" bash tests/fm-calm-claude-mod-plugin.test.sh
  • FM_CLAUDE_CALM_LIVE_E2E=1 TMPDIR=&#34;$PWD/.test-tmp&#34; bash tests/fm-calm-claude-mod-live-e2e.test.sh (twice; captured the real tmux pane on the second run)
✅ **Document** - passed

✅ No issues found.

✅ **Lint** - passed

✅ No issues found.

✅ **Push** - passed

✅ No issues found.

…ead "fm: "

Claude Code labels every mod transcript line with the plugin name, so the
notes rendered as "firstmate-calm: ⚓ ...". Rename the plugin to fm, update
the live guard to assert the fm: label, and document the one-time replay for
sessions resumed across the rename.
@greptile-apps

greptile-apps Bot commented Sep 29, 2026 •

Copy link
Copy Markdown

RetriggerConfidence Score: 4/5

[Medium risk] Renames the Calm mod plugin identifier from firstmate-calm to fm.

The PR appears safe to merge, with a non-blocking gap in live-test warning and error detection.

Reviews (1) · Last reviewed commit: "no-mistakes(document): Clarify Calm plug..."

Comment thread tests/fm-calm-claude-mod-live-e2e.test.sh
@kunchenguid
kunchenguid merged commit 40e981d into main Sep 29, 2026
37 of 39 checks passed
@kunchenguid
kunchenguid deleted the fm/fm-calm-note-no-prefix-r1 branch September 29, 2026 05:00
andrewesweet pushed a commit to andrewesweet/firstmate that referenced this pull request Sep 30, 2026
* fix(calm): name the Claude Code Calm plugin fm so supervision notes read "fm: "

Claude Code labels every mod transcript line with the plugin name, so the
notes rendered as "firstmate-calm: ⚓ ...". Rename the plugin to fm, update
the live guard to assert the fm: label, and document the one-time replay for
sessions resumed across the rename.

* no-mistakes(document): Clarify Calm plugin rename in documentation
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