Skip to content

feat: German captain-facing Bearings and Calm chat language - #3105

Open
thelad-dev wants to merge 3 commits into
kunchenguid:mainfrom
thelad-dev:fm/bearings-calm-captain-de-20260826
Open

feat: German captain-facing Bearings and Calm chat language#3105
thelad-dev wants to merge 3 commits into
kunchenguid:mainfrom
thelad-dev:fm/bearings-calm-captain-de-20260826

Conversation

@thelad-dev

@thelad-dev thelad-dev commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

Intent

Ship the already-prepared German Captain-facing Bearings/Calm documentation as its own PR to upstream kunchenguid/firstmate through the captain's fork (thelad-dev/firstmate).

Prepared change (do not reinvent): commit content already on branch — German empty-states / Captain language section in .agents/skills/bearings/SKILL.md, German Calm captain-chat strings in .pi/extensions/fm-calm.ts, and the matching assertion update in tests/fm-calm-pi-extension.test.sh.

Constraints:

  • Diff must stay limited to those three files unless a tiny doc/test fix is required for already-accepted intent.
  • Do not fold into open PR feat: add configurable home language for visible product strings #2783 (that is separate home-language/Calm product work).
  • Never git push origin (upstream write denied); push only via the fork / no-mistakes push target so the PR opens against kunchenguid/firstmate from thelad-dev/firstmate.
  • German commit messages; no Co-authored-by / Generated-with lines.
  • Gate agent remains agent: pi with --model cursor/default (do not set agent: cursor / acp:cursor).
  • Fork CI may stay at zero checks until upstream approves workflows — environmental, not a product failure; report clearly if CI never registers.

What Changed

  • Add a Captain language section to the Bearings skill and switch the four digest empty-states (plus morning-brief title note) to German with Umlauten and Kapitän address.
  • Localize Calm’s contested built-in tool warning and /calm command description to German in the Pi extension.
  • Update the Calm Pi extension test to assert the German /calm command description.

Risk Assessment

✅ Low: Bounded three-file German captain-facing string and docs update with a matching command-description pin and no reachable correctness or intent contradictions.

Testing

Ran the focused Calm extension suite (pass; tmux/pi interactive E2Es skipped for missing pi/tmux), exercised the Calm extension’s public /calm description and contested-tool notify path for singular and plural German warnings, rendered the Bearings German empty-state chat contract as HTML/screenshot evidence, and confirmed the change stays on the three intended files with a German commit and no forbidden trailers.

Evidence: Focused Calm extension test log
ok - Pi calm resolves its persistent home independently of Pi's launch directory
ok - Pi calm compatibility evidence never rejects a Pi version for being newer than 0.82.0, and still fails closed on a missing or malformed version
ok - a missing collapsed-thinking presentation API degrades only that Calm adapter with a clear skip reason, while the rest of Calm still registers
ok - missing Pi presentation class exports reach the independent adapter degradation path
ok - Calm registers none of its 7 built-in tool wrappers at load while config/calm is off, and all 7 synchronously at load while config/calm is on
ok - Calm's first same-session /calm activation claims every uncontested built-in, leaves a foreign bash tool fully intact and callable, warns prominently and logs the contested name, and only rows constructed before that activation - the documented bound - fail to retroactively collapse
ok - Pi calm centralizes transcript visibility, preserves execution/export data, keeps Pi's stock working row visible while no run is active, and persists its choice across session starts
ok - Pi calm on collapses mid-turn assistant working notes to zero height while Calm off keeps them, leaves streaming, truncated-final, and genuine final replies untouched, never mutates the messages, ignores every /calm argument, and restores a legacy persisted max as ordinary Calm on
skip: pi or tmux not found for Pi operational follow-up E2E
skip: pi or tmux not found for Pi Calm hidden-block geometry E2E
ok - Pi Calm working ship moves on a slow independent cadence over faster fixed-cell blue water, paints the complete boat standard yellow with balanced resets, keeps ANSI-stripped width exact, flips the directional sail on the exact bounce at both edges and every width, clamps visible and hidden resizes, falls back deterministically when narrow, freezes and resumes column/direction across settle/start without hidden-time jumps or duplicate timers, resets only on a fresh session, and installs and removes one scheduler-owning widget across starts, settle, abort, failure, shutdown, reload, replacement, and Calm toggles while leaving Calm-off visibility untouched
skip: pi or tmux not found for Pi calm interactive E2E
Evidence: German /calm description + singular contested-tool warning (runtime)

{ "calmCommandDescription": "Schaltet Firstmates Calm-Gesprächsdarstellung um.", "descriptionMatchesGerman": true, "contestedToolNotifications": [ { "message": "Firstmate Calm: das eingebaute Werkzeug "bash" wird bereits von einer anderen Erweiterung bereitgestellt. Calm wirkt dafür in dieser Sitzung möglicherweise nicht vollständig.", "type": "warning" } ], "singularWarningMatchesGerman": true }

{
  "calmCommandDescription": "Schaltet Firstmates Calm-Gesprächsdarstellung um.",
  "descriptionMatchesGerman": true,
  "contestedToolNotifications": [
    {
      "message": "Firstmate Calm: das eingebaute Werkzeug \"bash\" wird bereits von einer anderen Erweiterung bereitgestellt. Calm wirkt dafür in dieser Sitzung möglicherweise nicht vollständig.",
      "type": "warning"
    }
  ],
  "singularWarningMatchesGerman": true,
  "claimedUncontestedBuiltins": [
    "read",
    "edit",
    "write",
    "grep",
    "find",
    "ls"
  ],
  "bashRemainsForeign": true
}
Evidence: German plural contested-tool warning (runtime)

{ "notifications": [ { "message": "Firstmate Calm: die eingebauten Werkzeuge "read", "bash" werden bereits von einer anderen Erweiterung bereitgestellt. Calm wirkt dafür in dieser Sitzung möglicherweise nicht vollständig.", "type": "warning" } ], "usesGermanPluralWording": true }

{
  "notifications": [
    {
      "message": "Firstmate Calm: die eingebauten Werkzeuge \"read\", \"bash\" werden bereits von einer anderen Erweiterung bereitgestellt. Calm wirkt dafür in dieser Sitzung möglicherweise nicht vollständig.",
      "type": "warning"
    }
  ],
  "usesGermanPluralWording": true
}
- Evidence: Bearings empty-fleet digest with German empty-states (local file: /tmp/no-mistakes-evidence/01M0YN1V73BXP7NP37JX0NQ3DB/bearings-empty-states-de.png)
Evidence: Bearings empty-states rendered HTML
<!DOCTYPE html>
<html lang="de"><head><meta charset="utf-8"><title>Bearings empty states (DE)</title>
<style>
  body { font-family: "IBM Plex Sans", "Segoe UI", sans-serif; max-width: 42rem; margin: 2rem auto; padding: 0 1.25rem; line-height: 1.45; color: #1a1a1a; background: linear-gradient(180deg,#f7f3ea,#efe8d8); }
  h1 { font-size: 1.35rem; }
  h2 { margin-top: 1.5rem; font-size: 1.05rem; border-bottom: 1px solid #cfc6b3; padding-bottom: .25rem; }
  p { margin: .4rem 0 0; }
</style></head><body>
<h1>Bearings chat digest — empty fleet (Captain-facing German empty-states)</h1>

<p>Rendered per `.agents/skills/bearings/SKILL.md` section &quot;Sprache (Captain)&quot; / chat-response format.</p>

<h2>Captain&#x27;s Call</h2>

<p>Derzeit brauchst du keine Aktion, Kapitän.</p>

<h2>Recently Landed</h2>

<p>In der aktuellen Baseline gibt es keine frischen Abschlüsse.</p>

<h2>Underway</h2>

<p>Nichts ist unterwegs.</p>

<h2>Charted Next</h2>

<p>Nichts steht in der Warteschlange.</p>
</body></html>
Evidence: Bearings empty-states markdown digest
# Bearings chat digest — empty fleet (Captain-facing German empty-states)

Rendered per `.agents/skills/bearings/SKILL.md` section "Sprache (Captain)" / chat-response format.

## Captain's Call

Derzeit brauchst du keine Aktion, Kapitän.

## Recently Landed

In der aktuellen Baseline gibt es keine frischen Abschlüsse.

## Underway

Nichts ist unterwegs.

## Charted Next

Nichts steht in der Warteschlange.
Evidence: Diff scope and German commit metadata

files_changed: .agents/skills/bearings/SKILL.md .pi/extensions/fm-calm.ts tests/fm-calm-pi-extension.test.sh commit_subject: doc: Bearings und Calm auf Deutsch für den Captain-Chat ausrichten. forbidden_trailers: (none)

files_changed:
.agents/skills/bearings/SKILL.md
.pi/extensions/fm-calm.ts
tests/fm-calm-pi-extension.test.sh

commit_subject:
doc: Bearings und Calm auf Deutsch für den Captain-Chat ausrichten.

forbidden_trailers:
(none)

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.

  • bash tests/fm-calm-pi-extension.test.sh (focused Calm extension suite; asserts German /calm command description)
  • Executable Calm probe: load .pi/extensions/fm-calm.ts, read registerCommand(&#39;calm&#39;).description, activate with foreign bash ownership, capture ui.notify singular German warning → /tmp/no-mistakes-evidence/01M0YN1V73BXP7NP37JX0NQ3DB/calm-german-runtime.json
  • Executable Calm probe: same path with foreign bash+read, capture plural German warning → /tmp/no-mistakes-evidence/01M0YN1V73BXP7NP37JX0NQ3DB/calm-german-plural-warning.json
  • Manual Bearings empty-fleet digest render from skill empty-states (DE) → markdown/HTML + Playwright screenshot
  • git diff --name-only / commit subject / trailer check for three-file scope and German commit without Co-authored-by/Generated-with
✅ **Document** - passed

✅ No issues found.

✅ **Lint** - passed

✅ No issues found.

✅ **Push** - passed

✅ No issues found.

Leere Abschnitte, Calm-Hinweise und die Befehlsbeschreibung folgen der deutschen Captain-Sprache.
@greptile-apps

greptile-apps Bot commented Aug 26, 2026

Copy link
Copy Markdown

Confidence Score: 5/5

The PR appears safe to merge.

No blocking failure remains; the English morning-title issue is corrected and the plural warning branch now has focused regression coverage.

Reviews (3): Last reviewed commit: "doc: Bearings-Sprache um die Morgenlage-..." | Re-trigger Greptile

Comment thread .agents/skills/bearings/SKILL.md Outdated
Comment thread .pi/extensions/fm-calm.ts
Comment on lines +377 to +379
plural
? `Firstmate Calm: die eingebauten Werkzeuge ${names} werden bereits von einer anderen Erweiterung bereitgestellt. Calm wirkt dafür in dieser Sitzung möglicherweise nicht vollständig.`
: `Firstmate Calm: das eingebaute Werkzeug ${names} wird bereits von einer anderen Erweiterung bereitgestellt. Calm wirkt dafür in dieser Sitzung möglicherweise nicht vollständig.`,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Plural Warning Lacks Coverage

The new plural notification branch has no focused regression coverage: the collision fixture contests only bash and checks general message content, so changes to multi-tool names or German plural wording can pass the suite unnoticed.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

@kunchenguid

Copy link
Copy Markdown
Owner

Speaking as Kun's firstmate:

Reviewed HEAD a3af3e9b3fd46c695d4526a49d99f106c0d30f47 vs main 07bf0c8556c70b5241516efad0e51f802484c748. Whole thread read (Greptile success). Full diff reviewed: .agents/skills/bearings/SKILL.md, .pi/extensions/fm-calm.ts, tests/fm-calm-pi-extension.test.sh. Three-file string/docs change. No .github/workflows/*. Not disguised security.

Class: default-behavior. Bearings empty-states, morning-brief title note, Calm contested-tool warnings, and the /calm command description switch from English to German in the shared distro, with no captain opt-in and no per-home language setting. Tests pin the German strings as the contract. Author body does not frame this as opt-in.

VISION (per rule, inspected evidence):

  • One captain, one interface — cannot tell / product decision. German empty-states may serve a German-speaking captain, but they are now the only empty-states the shared skill ships. Presentation features are welcome when opt-in; this is not.
  • Authority is explicit — does not align as a default. New captain-facing language assumes consent instead of asking. VISION: new capability ships as an option to enable, never as behavior that assumes consent.
  • Scripts own the mechanics — aligns. String swap plus a matching test pin; no script/agent mix.
  • A restart is a non-event — aligns. No durable-state contract.
  • Delegation with a spine — aligns. Not a new task shape.
  • The fleet outlives any vendor — aligns. Not a harness lock-in.
  • Scope — does not align as shipped. VISION: the shared surface is generic and captain-agnostic; personal language belongs in the home that owns it. Body also says do not fold into feat: add configurable home language for visible product strings #2783 (separate home-language/Calm product work) — that is the right bucket.

First-time fork CI: after that full-diff review I approved workflow runs 32952837856 (CI) and 32952837849 (Require no-mistakes) for this HEAD.

Not merging. This is with the captain, not waiting on the author, for whether German captain-facing copy may land as the shared default. Also: no no-mistakes-pipeline-attestation:v1 HTML comment in the body (pipeline details are present, but the matching attestation stamp is not), so it is not default-behavior-ready-except-decision.

Merge-eligible: NO. Captain-flag NOW: NO (parent may flag the default-behavior decision; this is not otherwise merge-ready).

@kunchenguid

Copy link
Copy Markdown
Owner

Speaking as Kun's firstmate:

Correction on the earlier stamp: this is waiting on the author, not a captain-decision hold.

Class stays default-behavior (shared Bearings/Calm copy switching to German with no opt-in). That language-default is a captain call only once the PR is otherwise merge-ready. Right now it is not: no no-mistakes-pipeline-attestation:v1 matching HEAD a3af3e9b, and forge CI was still in progress after first-time-fork approval.

Need from the author: a matching no-mistakes attestation on this HEAD, and green CI. After that, firstmate can flag the default-behavior decision. Not waiting on the captain yet.

@kunchenguid

Copy link
Copy Markdown
Owner

Speaking as Kun's firstmate:

Re-triage after newer activity. Reviewed HEAD 3cca4ce1cae0eb09cf1f7b28ede0a198314ffc10 vs main 9ce69acf95b901cb6dc38dd5fa55f37a8038e16c. Whole thread read (prior firstmate waiting-author stamp; Greptile success). Full diff re-reviewed: .agents/skills/bearings/SKILL.md, .pi/extensions/fm-calm.ts, tests/fm-calm-pi-extension.test.sh. No .github/workflows/*. Not disguised security.

Class: default-behavior (unchanged). Shared Bearings empty-states, morning-brief title note, Calm contested-tool warnings, and /calm description switch to German with no captain opt-in and no per-home language setting. Tests pin German as the contract.

VISION (per rule, inspected evidence):

  • One captain, one interface — cannot tell / product decision. German may serve a German-speaking captain, but it is now the only empty-state the shared skill ships. Presentation welcome when opt-in; this is not.
  • Authority is explicit — does not align as a default. New captain-facing language assumes consent. VISION: new capability ships as an option to enable.
  • Scripts own the mechanics — aligns. String swap plus matching test pins.
  • A restart is a non-event — aligns.
  • Delegation with a spine — aligns.
  • The fleet outlives any vendor — aligns.
  • Scope — does not align as shipped. Shared surface is generic and captain-agnostic; personal language belongs in the home. Body also points at feat: add configurable home language for visible product strings #2783 as the home-language bucket.

Attestation: no-mistakes-pipeline-attestation:v1 now matches HEAD 3cca4ce1. Require no-mistakes pass.

First-time fork CI: after full-diff review I approved workflow runs 32960333363 (CI) and 32960333347 (Require no-mistakes) for this HEAD. Forge CI is green.

Not merging. This PR is otherwise merge-ready except the language-default decision. That call is with the captain, not waiting on the author. Do not land as shared default without that decision. Parent can flag Firstmate for the default-behavior decision.

Merge-eligible: NO (default-behavior hold).

@kunchenguid

Copy link
Copy Markdown
Owner

Speaking as Kun's firstmate:

Restamp for newer activity. Previous stamp was waiting-author on HEAD a3af3e9b (2026-08-26T10:22:00Z). Current HEAD is 3cca4ce1cae0eb09cf1f7b28ede0a198314ffc10 vs main 9ce69acf95b901cb6dc38dd5fa55f37a8038e16c. Whole thread read (Greptile success on this HEAD). Full diff reviewed: .agents/skills/bearings/SKILL.md, .pi/extensions/fm-calm.ts, tests/fm-calm-pi-extension.test.sh. Three-file string/docs change. No .github/workflows/*. Not disguised security.

Class stays default-behavior. Shared Bearings empty-states, morning-brief title note, Calm contested-tool warnings, and the /calm command description switch from English to German in the distro, with no captain opt-in and no per-home language setting. Tests pin the German strings as the contract.

VISION (per rule, inspected evidence):

  • One captain, one interface — cannot tell / product decision. German empty-states may serve a German-speaking captain, but they are now the only empty-states the shared skill ships. Presentation features are welcome when opt-in; this is not.
  • Authority is explicit — does not align as a default. New captain-facing language assumes consent instead of asking. VISION: new capability ships as an option to enable, never as behavior that assumes consent.
  • Scripts own the mechanics — aligns. String swap plus matching test pins; no script/agent mix.
  • A restart is a non-event — aligns. No durable-state contract.
  • Delegation with a spine — aligns. Not a new task shape.
  • The fleet outlives any vendor — aligns. Not a harness lock-in.
  • Scope — does not align as shipped. VISION: the shared surface is generic and captain-agnostic; personal language belongs in the home that owns it. Body still says do not fold into feat: add configurable home language for visible product strings #2783 (separate home-language/Calm product work) — that remains the right bucket.

Gates now:

  • no-mistakes-pipeline-attestation:v1 matches this HEAD.
  • Forge CI is green (Lint, Require-no-mistakes, coverage, portable parallel/serial, Herdr, macOS snapshot, repo invariants, timing aggregate). Merge state CLEAN.
  • Greptile success. Review is safe as a string/docs change.

This is otherwise merge-ready except the default-behavior decision. That language-default is a captain call. This is with the captain, not waiting on the author. Do not read the earlier waiting-author stamp as still in force.

Not merging. First-time fork CI was already approved on the prior pass; I did not re-approve.

Merge-eligible: NO. default-behavior-ready-except-decision: YES.

@thelad-dev

Copy link
Copy Markdown
Contributor Author

Captain decision (thelad-dev home, 2026-08-27):

@kunchenguid — FYI for merge-eligibility: default-behavior decision is now English default, per-home opt-in (this captain: de).

@thelad-dev

Copy link
Copy Markdown
Contributor Author

Captain decision (2026-08-27): Default EN upstream. Personal home DE via config/language. #3105 must integrate with #2783 (fm-language catalog), not merge standalone. @kunchenguid default-behavior resolved: en default, de per-home opt-in.

@kunchenguid

Copy link
Copy Markdown
Owner

Speaking as Kun's firstmate:

Restamp. VISION.md read in full from current main 22fa6ed90b0585280db8a87501c5d093ee40830a. HEAD is still 3cca4ce1cae0eb09cf1f7b28ede0a198314ffc10unchanged vs the 7:10am PT hold. Whole thread read, including thelad-dev comments at 2026-08-27T02:10:10Z / 02:10:16Z labeled "Captain decision". Those comments are from thelad-dev, not kunchenguid. They are the author's proposal, not captain word. Full diff re-reviewed: .agents/skills/bearings/SKILL.md, .pi/extensions/fm-calm.ts, tests/fm-calm-pi-extension.test.sh. No .github/workflows/*. Not disguised security.

Class: default-behavior (unchanged). Shared Bearings empty-states, morning-brief title note, Calm contested-tool warnings, and the /calm description switch to German with no captain opt-in and no per-home language setting. Tests pin German as the contract.

VISION (per rule, inspected evidence):

  • One captain, one interface — cannot tell / product decision. German empty-states may serve a German-speaking captain, but they are now the only empty-states the shared skill ships. Presentation features are welcome when opt-in; this is not. Evidence: Bearings SKILL.md empty-states + hardcoded German Calm strings.
  • Authority is explicit — does not align as a default. New captain-facing language assumes consent. VISION: new capability ships as an option to enable, never as behavior that assumes consent.
  • Scripts own the mechanics — aligns. String swap plus matching test pins. Evidence: fm-calm.ts + German pins in tests/fm-calm-pi-extension.test.sh.
  • A restart is a non-event — aligns. No durable-state contract.
  • Delegation with a spine — aligns. Not a new task shape.
  • The fleet outlives any vendor — aligns. Not a harness lock-in.
  • Scope — does not align as shipped. The shared surface is generic and captain-agnostic; personal language belongs in the home. Body still points at feat: add configurable home language for visible product strings #2783 as the home-language bucket.

Gates still:

  • no-mistakes-pipeline-attestation:v1 matches this HEAD.
  • Forge CI is green. MERGEABLE / CLEAN.
  • Review is safe as a string/docs change.

Not merging. Do not rebase. This is otherwise merge-ready except the language-default decision. That call is with the captain, not waiting on the author. The author's EN-default / integrate-with-#2783 comments do not lift this hold.

HEAD changed vs 3cca4ce: no.

Merge-eligible: NO. default-behavior-ready-except-decision: YES.

@kunchenguid

Copy link
Copy Markdown
Owner

Speaking as Kun's firstmate:

Re-triage of newer activity (author comments). HEAD is unchanged at 3cca4ce1cae0eb09cf1f7b28ede0a198314ffc10. Whole thread + full diff reviewed. No .github/workflows/*. Not disguised security. thelad-dev is not blocked.

Class: default-behavior. Shared Bearings empty-states and Calm command/warning strings are hardcoded German for every clone. That is not a home setting. Independent of #2783 (opt-in config/language).

VISION (per rule, inspected evidence):

  • One captain, one interface — cannot tell / product decision. German empty-states may serve a German-speaking captain, but they are now the only empty-states the shared skill ships. Evidence: .agents/skills/bearings/SKILL.md "Sprache (Captain)" plus four Deutsch empty-states; .pi/extensions/fm-calm.ts German /calm description and collision warning; tests pin German wording.
  • Authority is explicit — does not align as a default. New captain-facing language assumes consent. VISION: new capability ships as an option to enable, never as behavior that assumes consent.
  • Scripts own the mechanics — aligns. String swap plus matching test pins.
  • A restart is a non-event — aligns. No durable-state contract.
  • Delegation with a spine — aligns. Not a new task shape.
  • The fleet outlives any vendor — aligns. Not a harness lock-in.
  • Scope — does not align as shipped. VISION: the shared surface is generic and captain-agnostic; personal language belongs in the home. Body still says do not fold into feat: add configurable home language for visible product strings #2783.

Gates unchanged: no-mistakes-pipeline-attestation:v1 matches this HEAD; forge CI green; merge CLEAN. Review is safe as a string/docs change. First-time fork CI was already approved on a prior pass; I did not re-approve.

Contributor comments restated English-default plus per-home opt-in and asked to stack this on #2783. That is consistent with the hold; it is not Kun's merge decision, and HEAD is still the hardcoded German default.

This is otherwise merge-ready except the default-behavior decision. That language-default is with the captain, not waiting on the author. Not merging. Do not rebase.

Merge-eligible: NO. default-behavior-ready-except-decision: YES.

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.

2 participants