Athlete comms test protocol

Purpose

This protocol tests whether athlete-comms is behaving correctly as a final language-review gate without sending any message to the athlete.

It validates review quality, not runtime authority.

What this protocol can prove

This protocol can prove that, when athlete-comms is invoked, it can:

  • approve a clean athlete-facing message
  • rewrite a technically correct but poorly worded message
  • block a draft, internal note, or progress update
  • preserve required coaching meaning and attribution

What this protocol cannot prove

This protocol cannot prove that all athlete delivery is forced through athlete-comms.

Without a runtime hard gate, another path could still bypass the role.

Mode 1, fixture review

Use a fixed set of known-good and known-bad candidate messages.

For each fixture, hand the package to athlete-comms and require one of these outcomes:

  • APPROVE
  • REWRITE
  • BLOCK

No athlete delivery occurs in this mode.

Mode 2, shadow review on real drafts

For a real outbound athlete message:

  1. Coach Luca prepares the candidate body.
  2. The candidate is handed to athlete-comms.
  3. athlete-comms returns one of the review outcomes.
  4. The result is shown only to the operator.
  5. The message is not sent to the athlete.

This validates live behavior without live delivery.

Mode 3, adversarial review

Intentionally test failure cases such as:

  • internal progress chatter
  • partial drafts
  • missing attribution
  • vague wording that weakens the recommendation
  • operator-facing file-path leakage

The expected result is BLOCK or REWRITE, depending on severity.

Standard handoff package

Use this package shape for every test:

Field Purpose
recipient Athlete identity and target, marked dry-run
message_type Morning plan, nutrition reply, check-in, ad hoc reply, etc.
content_owner Usually main
contributors Actual participants
must_preserve Statements that must not be weakened
candidate_body The athlete-facing draft under review
tone_intent Direct, calm, concise, race-focused
athlete_language_profile_path Usually athlete/comms-profile.md
delivery_policy Set to dry-run, do not send

Required test output

For each test, athlete-comms should return a structured review result:

Field Meaning
result APPROVE, REWRITE, or BLOCK
reasons Short list of why that result was chosen
rewritten_body Present only for REWRITE
send_allowed Must be false in dry-run mode
footer_check Pass or fail
policy_violations Any detected violations

Pass criteria

The role is considered working in dry-run review if it consistently does all of the following:

  • blocks obvious draft fragments and internal progress chatter
  • rewrites weak but salvageable athlete language into coach-grade wording
  • approves already-clean messages without unnecessary rewriting
  • preserves required technical meaning
  • verifies attribution accurately without rewriting Coach Luca's footer content
  • when a case blocks outside dry-run, logs the raw blocked candidate into the athlete-local canonical daily log with a timestamped audit trail
  • never marks dry-run output as sendable

Minimum regression set

Run at least these cases every time the role or policy changes:

  1. clean morning plan, should APPROVE
  2. vague but technically correct training reply, should REWRITE
  3. internal progress update, should BLOCK
  4. nutrition reply with missing footer, should REWRITE or BLOCK
  5. mixed operator note plus athlete message, should BLOCK
  6. sharp but clean short reply, should APPROVE

Confidence scale

  • Low confidence: one or two ad hoc tests only
  • Moderate confidence: fixture suite passes once after changes
  • High confidence: fixture suite plus repeated shadow review on real drafts

Important limitation

Passing this test protocol means the role is useful. It does not mean the workspace has a true hard gate. That requires delivery-path enforcement, not only successful review behavior.