agentleFS
protocolprotocol/perun/.claude/skills/communication-structure/SKILL.md

communication-structure

Skill2 starsChanged 27 days agoMITView on GitHub

Use BEFORE sending any human-facing message (PR body, issue/PR comment, status update, reply) or producing a report, plan, doc, summary or table. Forces BLUF, one ask, core value only, zero AI-slop before you draft. Skip for chat with the user.

1 other project uses a version of this.

Adopted by

Most recently taken up by

The file

Show its rules and text

We split this skill into the rules it gives an agent

14 rules. About 0 are common, 12 are distinctive, and 2 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈12

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 2

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Key figure line: When the source gives a deciding figure, one line Key figure: <figure> <what it measures> states it exactly as the source …

    line 34
  2. Distinctive:

    Add nothing the source lacks: No number, date, owner, recommendation, rationale, command or promise the author did not give.

    line 35
  3. Distinctive:

    No effort counts ("12 tasks", PRs, "% complete") and no "coming next week".

    line 59
  4. Distinctive:

    Read line 1 alone. Does it stand as the whole message?

    line 92
  5. Distinctive:

    Every paragraph after the first changes what the reader does, or it's cut.

    line 94
  6. Very specific:

    Every number, date and name is in the source.

    line 95
  7. Distinctive:

    Before: "So I looked into why the dashboard was showing no data.

    line 102
  8. Distinctive:

    After: "Deploy succeeded; the dashboard is empty because the nightly sync never ran after it.

    line 105
  9. Distinctive:

    Before: "Thanks for looking!

    line 109
  10. Distinctive:

    After: "Empty state: skeleton loader (matches the app) vs.

    line 110
  11. Distinctive:

    Before: "12 tasks done, 40 PRs merged.

    line 115
  12. Distinctive:

    After: "The export button works for customers: verified-on-the-dashboard export page.

    line 116
  13. Distinctive:

    Before: "Strong progress — we've closed the vast majority of the open items." After: "<closed> / <total> backlog items closed.

    line 121
  14. Distinctive:

    After: "<closed> / <total> backlog items closed.

    line 122

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Communication structure

Governs the structure of anything a human reads without you there to narrate it — a message (PR body, issue/PR comment, status update, reply) or a deliverable (a report, plan, doc, summary, table). Same prose-voice boundary as idea-critic: persisted artifacts stay normal English, never compressed chat shorthand. This is about shape and length, not vocabulary. Lookup table: INDEX.md; read it instead of opening references blindly.

The rule

  • BLUF. Line 1 is the answer: the outcome, the number, the ask, in 30 words or fewer. Everything after it is support the reader can skip without losing the decision. No greeting, background or "This PR..." opener.
  • One decision, explicit. An ask names its owner and date when the source gives them ("Dana, please pick A or B by Tuesday"), addressed to the reader; with none given, leave them out; stand-ins ("owner unassigned") fail comms_lint.py. A message ends on the ask. A PR body asks in its own words; "Reply A or B" is for messages, never PRs.
  • Name the options in the ask. Line 1 names each option by what it is ("hire temp paralegals, outsource, or delay"), never by a bare letter, with the owner and the date the source gives.
  • Key figure line. When the source gives a deciding figure, one line Key figure: <figure> <what it measures> states it exactly as the source does, near the top.
  • Add nothing the source lacks. No number, date, owner, recommendation, rationale, command or promise the author did not give. Keep an author's lean at its stated strength ("leaning B", not "I recommend B"); with no view given, name the options and who decides. A derived figure shows its basis; an unknown is named ("insert overhead: not measured"). comms_lint.py --source checks this.
  • Per-artifact shape and budget. Status update, PR body, release note, decision memo or executive summary, incident summary, README section, comment, meeting notes: read references/artifact-templates.md before you draft. comms_lint.py --kind <kind> --file <draft> scores each rule and prints the exact fix (exit 1 = below the bar). The operating layer's agentic-delivery/scripts/comms_guard.py hook runs it before a PR or tracker write and warns; it never blocks.
  • Send-ready, complete. Full sentences a reader can act on as written: no <placeholder>, no note to the sender (word count, "owner/deadline" remark), no emoji beyond ✅/⏳ marks. Length follows the facts the reader needs; the reference budgets are lint ceilings, not targets, and cutting never drops a source fact.
  • Scannable. Bold the one load-bearing sentence. Short paragraphs. A list only when every item is parallel and load-bearing; keep the 1-2 open questions that change the decision and push the rest to the doc or PR.
  • Their next action, not your process. Drop how you worked; keep every option, trade-off, cost and reason the source states, since those are what the reader decides on.
  • A stakeholder-facing update states verified present-tense outcomes only: what works on the surface they use, in plain value terms, checked there before you write it (✅ = verified, names where; ⏳ = pending; neutral facts unmarked). No effort counts ("12 tasks", PRs, "% complete") and no "coming next week".
  • Status updates for leadership (tracker project updates, issue status comments, owner hand-offs) use a fixed seven-part structure. Read references/leadership-status-update.md; scripts/status_update_lint.py checks it.
  • Status vocabulary: merged, deployed, verified-on-<page> are distinct. "live", "shipped to users" and "done" claim the last one and need a verified-on-<page> or journey: reference nearby; else say "merged" or "deployed, unverified". scripts/status_vocab_lint.py --file <update.md> flags the rest.
  • Numbers over adjectives. "40s to 6s" beats "significantly faster." A headline metric states the exact measured value and the exact target on the same line (X / Y, X of Y), computed at report time, never rounded toward the desired outcome. Only descriptive language ("mostly," "on track") with no paired numbers is incomplete. If the exact number is unknown, say so.

Deliverables, not just messages

The message rules apply to a deliverable (report, plan, doc, table) except the 30-second cap: it is as long as its content requires and no longer. BLUF still comes first, every section earns its place, and Cut on sight applies in full: no filler, no restated prompt, no marketing adjectives, no summary-of-the-summary. This is the suite's no-slop output contract; other skills link to it.

Cut on sight

"You're right" / "great point." Hedges ("it depends", "I think maybe", "could potentially") — but keep material uncertainty: "the sync may not have run; its log is unavailable" is evidence, not a hedge. Cut the reflexive qualifier, never the honest unknown. Restating the question. Filler adjectives ("comprehensive", "robust", "seamless"). A summary of the summary. Take a position only if the author gave one; if two are live, name both and who decides.

Sanity check

  1. Read line 1 alone. Does it stand as the whole message? If not, promote it.
  2. Count the asks. More than one → split, or pick the one that blocks the reader.
  3. Every paragraph after the first changes what the reader does, or it's cut.
  4. Every number, date and name is in the source. Run comms_lint.py.
  5. To test a draft as a reader, run scripts/reader_check.py with a question set from evals/reader-checks.json (decision, headline figure, costs and consequence answerable from the text alone).

Before → After

Status update. Before: "So I looked into why the dashboard was showing no data. I checked a few things... I think the nightly sync job isn't running after a deploy... Not 100% sure, but running it manually should fix it — let me know if you want me to try." After: "Deploy succeeded; the dashboard is empty because the nightly sync never ran after it. Running it now. Please confirm production, not staging, today."

PR body. Before: "Thanks for looking! There are kind of two ways to go on the empty state..." After: "Empty state: skeleton loader (matches the app) vs. a 'no data yet' message (clearer for new users). Wen, please pick one." (the author's lean, if any, stays as stated; no invented recommendation, date or stand-in)

Stakeholder update. Before: "12 tasks done, 40 PRs merged. The export button is live. Saved filters ship next week." After: "The export button works for customers: verified-on-the-dashboard export page. Saved filters: no date promised." (effort counts and the promise are dropped; an unchecked claim is flagged in the lead, never asserted)

Progress status, exact vs. flattering. Before: "Strong progress — we've closed the vast majority of the open items." After: "<closed> / <total> backlog items closed. Owner-blocked ones listed below." (the source's counts replace the brackets; if it gives none, say the count is unknown)

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.