Shape every agent comment as a short typed brief the owner can triage in seconds β π΄ issue Β· π‘ proposal Β· β done Β· π choice Β· π action Β· π review β with all the depth collapsed behind it. Enforced by the require-owner-brief hook. Use before posting ANY GitHub comment as an agent, or when asked to "make this shorter", "brief me", "just tell me what I need to do".
Installs into .claude/skills of the current project.
Are you the author of Owner Brief?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/friendlyinternet-owner-brief)
---
name: owner-brief
layer: method
description: Shape every agent comment as a short typed brief the owner can triage in seconds β π΄ issue Β· π‘ proposal Β· β done Β· π choice Β· π action Β· π review β with all the depth collapsed behind it. Enforced by the require-owner-brief hook. Use before posting ANY GitHub comment as an agent, or when asked to "make this shorter", "brief me", "just tell me what I need to do".
allowed-tools: Bash, Read, Grep
---
# The owner brief β one line they act on, everything else collapsed
The owner reads these on a phone, holding ~20 async threads. **The depth is not the problem
and is never cut** β the problem is that it arrives *as* the notification, so every ping costs
a full read.
So: **lead with a typed brief, collapse the rest.** Same comment, same content, different order.
## The six types
Pick exactly one. The last three are `ask-human`'s existing shapes β this is one vocabulary,
not a parallel system; reach for that skill's templates when the brief is a hold.
| | type | means | typical follow-up | may @mention? |
|---|---|---|---|---|
| π΄ | **Issue** | something is broken or wrong | you decide whether it's worth fixing now | yes |
| π‘ | **Proposal** | a suggestion you can take or drop | yes / no / later | yes |
| β | **Done** | landed and verified | nothing | **no** |
| π | **Choice** | a real fork, needs your pick | `A` / `B` | yes |
| π | **Action** | you must do something the agent can't | do it, then comment | yes |
| π | **Review** | approve or reject a diff/preview | β / `lgtm` / changes | yes |
If two apply, pick the one that describes **what you need back**, not what you did. A bug you
already fixed is β , not π΄.
## The other half: don't spend a mention on nothing
**An @mention is a request for action.** Spending one on an FYI teaches the owner to ignore
mentions, which costs far more than the notification. The gate refuses a β carrying a live
mention.
**Where the noise actually came from.** Over the last 100 comments, 29 would notify the owner
and **17 of those carried no ask at all** β their only mention was the mandatory provenance
disclaimer, `posted from @pmcp's account`. It sits in a blockquote, so a reader never sees it,
and GitHub notifies anyway. That was **59% of every ping**.
So the disclaimer now writes the handle in a **code span**:
```
> π€ **Claude Code** Β· interactive agent Β· posted from `@pmcp`'s account (not Maarten)
```
It renders identically and does not notify. Backticking it across the templates removes those
17 pings; the 12 that remain are genuine asks.
**GitHub notifies for a mention inside a blockquote and inside `<details>`.** Code spans and
fenced blocks are the only places it doesn't. So "hide it in the collapsed section" does *not*
make a mention silent β backtick it, or don't write it.
## The shape
Visible part **β€700 chars and β€10 non-empty lines**:
```
π΄ **<one line: what happened>**
> π€ <provenance header β its own hook requires this>
**You:** <the single next action β or "nothing, FYI">
**Depth:** <link to the full comment / PR / run / report>
<details><summary>Findings / patch / evidence</summary>
β¦everything you were about to write, at any lengthβ¦
</details>
```
**`**You:**` is the load-bearing line.** If you can't state one next action, you don't yet know
what you're asking for β work that out before posting.
## Say the visible part plainly (the word-choice layer)
Structure is only half. A brief that is the right shape and still full of repo jargon fails just
as hard β the owner said so, repeatedly: *"i have no idea what you said"*, *"thats unreadable"*,
*"this is gibberish to me"*. The rule is in `AGENTS.md` (*Plain language*); here is what it looks
like, from real messages this session:
| β what was written | β plain |
|---|---|
| "work the second group down β re-dispatch the tasks, verify/close the stale ones β so the filter converges to just the 8 that are genuinely yours" | "8 of these aren't really waiting for you β they got the wrong label. Want me to clean them up? **yes / no**" |
| "the sweep will tag the nine stranded PRs `status:needs-merge` for one-click merging" | "nine finished PRs will show up needing one tap to merge" |
| "#2095 keeps it that way going forward" | *(cut it β the owner doesn't run the plumbing)* |
| "re-dispatch the task to the pipeline" | "hand it back to run again" |
The pattern in every miss: naming the **mechanism** (the sweep, the filter, the label, the issue
number) instead of the **outcome** (what the owner sees or does). Read the visible part aloud as if
to someone who's never seen this repo; any phrase that needs a footnote gets rewritten.
## What doesn't count against the limits
Nothing inside `<details>`, a code fence, the provenance blockquote, an HTML comment marker, or
the generated-by footer. **Collapse it, don't cut it** β if the escape hatch weren't real,
agents would delete content instead of moving it, which is worse than the wall.
A comment with **no π€ header** (a human's) is untouched at any length.
## Two failure modes
**Burying the ask.** #2054 posted a patch-to-apply under a question heading, and the gate
announced *"asked you a question"* above 4,372 characters containing no question. The type
marker exists so this can't happen: it says what's wanted before anything else is read.
**Splitting the thread.** Don't post the brief and the depth as two comments β one comment,
brief in front, depth in `<details>`. Two comments doubles the notifications, which is the
problem, not the fix.
## Enforcement
`require-owner-brief` (PreToolUse on `add_issue_comment`) blocks a non-conforming agent
comment and prints the vocabulary + the collapse rule. The decision is
`scripts/owner-brief.mjs` β pure, unit-tested, and checked against the real comment corpus.
**Why the trigger is "is this an agent comment" and not "does it @mention the owner":** the
@mention rule was the obvious design and measuring killed it. Of the 29 owner-mentioning
comments in the last 100, **17 carry `@pmcp` only inside the mandatory provenance disclaimer**
β exactly the long reports being complained about. An @mention gate would have waved the
offenders through and constrained only the dozen that already used a standalone address.
**Why these limits:** across 93 agent comments the visible part runs 0 Β· 114 Β· 330 Β· 591 Β·
25497 chars and 0 Β· 1 Β· 3 Β· 6 Β· 217 lines. The median is already 330 chars / 3 lines; 700c/10L
refuses the walls, not the norm. The line limit reuses the ~10 lines `ask-human` already
states rather than inventing a second number.
## Relationship to `ask-human`
`ask-human` covers the **blocking** subset (π / π / π) in depth: the `Needs:` line, the
recommendation-first rule, the medium-selection table, `status:blocked`, push-before-you-block.
This skill is the wrapper that makes **every** comment β including the non-blocking π΄ / π‘ / β
β arrive in the same scannable shape. When the brief is a hold, use `ask-human`'s template
inside it.