Skip to content
Back to skills

Status

ASecurity

Render the state of every feature, task or mission in flight as a fixed six-line glance card — progress bar per front, what is running now, what is done, what is next, what needs the operator, what is open — followed by the links worth opening, built from mission_list/mission_get, the board and the PRs, never from memory. Use whenever the operator asks "status?", "where are we", "is it done", "what's left", "what do you need from me", "how's the mission", or opens a session after being away. ...

  • 2 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added October 6, 2026
ai-agentsgogit

Works with

  • terminal
  • cli

Security analysis

A100/100

Scanned October 6, 2026

npx -y skills add junielton/harnu --skill status --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Status?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Status
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/junielton-status/badge)](https://www.skillsdirectory.com/skills/junielton-status)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: status
description: Render the state of every feature, task or mission in flight as a fixed six-line glance card — progress bar per front, what is running now, what is done, what is next, what needs the operator, what is open — followed by the links worth opening, built from mission_list/mission_get, the board and the PRs, never from memory. Use whenever the operator asks "status?", "where are we", "is it done", "what's left", "what do you need from me", "how's the mission", or opens a session after being away. Also the mandatory header of every report-back, every mission tick and every delivery report. Do NOT use to narrate what happened in a session (that is the body below the card) or to grade acceptance criteria (delivery-verifier).
---

# Status — the glance card

The operator runs several projects and several fan-outs at once. Every time they
come back they ask the same four things: _is it done, what is left, what is
running, what do you need from me._ A 40-line narrative answers none of them at a
glance. This card answers all four in six lines, always the same six, always in
the same order — so the eye learns where to look and stops reading.

This card and the **`report-back`** final report are one visual system. Same
glyphs, same grid, same links block, same ban on emoji — so a status card sitting
on top of a report-back reads as one document, not two. When they disagree,
`report-back`'s rendered example is the reference.

## The card

One block per front (a feature, an epic, a mission, a multi-wave task). Exactly
six lines, in this order, even when a line is empty:

```
  <id> <name>            <bar> <counts> · <verdict>
  now      <what is running right now · who · for how long>
  done     <what is finished, newest last, · separated>
  next     <what comes after now, in order>
⚑ you      <the ONLY line that asks the operator for something — or the
           success token, spelled out: `— nothing, you're clear`>
? open     <unanswered questions, unverified claims, named risks>
```

Then, after one blank line, the **links** — everything the reader might open.

Three columns, and the shape is the whole point:

1. **A 2-wide gutter** — one glyph plus one space — blank on almost every line.
   Only the glyphs in the table below ever land there. An empty gutter is what
   makes a full one loud.
2. **A label column, left-aligned, 9 wide.** Words, not glyphs: `now`, `done`,
   `next`, `you`, `open`. The value always starts at column 12. The eye learns
   the column and stops reading labels after the first card.
3. **The value**, prose, `·` separated.

The header line replaces the first label. When there is a single front and no id
to name, it reads `wave` and nothing is lost:

```
  wave     ▰▰▱▱▱ 3 units running · 0 PRs open
```

Rules that keep it a glance:

- **Six lines. No seventh.** Detail lives below the links, after a blank line,
  and is optional. The operator must be able to stop reading after the cards.
- **Each of the six lines prints exactly once per front.** No second `now`, no
  `done` repeated under a `progress` heading, no card re-printed for the same
  front with fresher numbers. A mission is one front: one card, whose header
  already carries its progress — there is no separate progress line. If you
  read the mission twice while writing, render the second read and drop the
  first.
- **`you` is sacred.** It carries only actions the operator must personally take
  — merge, close, decide, test by hand. Nothing an agent could do belongs there.
  When nothing is owed it reads **`— nothing, you're clear`**, spelled out, not
  a bare dash. It is the highest-value token in the card: the only one that gives
  the operator permission to close the terminal. An absent line reads as "I
  forgot to check"; a bare `—` reads as "there is nothing here"; the sentence
  reads as "I checked, you are free". It always prints.
- **`now` names the executor and the age** (`ab53791f · 14 min`). Staleness is
  information, and for a mission it is already computed: `mission_get`'s
  `derived.stale` is the stall flag — print it, do not re-judge it from ages.
- **Evidence, not narrative.** Every token comes from a source: the mission
  (`mission_list` / `mission_get` — steps, proofs, links, blockers, the `you`
  line), the board card (status, ACs, evidence), `gh pr list` / `gh pr checks`.
  If a fact has no source, it goes to `open`, never to `done`.
- **Counts over adjectives.** `3/4`, `2 PRs open`, `1 unmet` — never "mostly
  done", "almost there", "going well".
- **Newest front first**, then by how much of it is blocked on `you`.
- **Write the labels in the language you are speaking to the operator**, exactly
  as `report-back` does. The column widths are what is fixed, not the words —
  translate `now`, `done`, `next`, `you` and `open`, then pad to the same 9
  columns. A status card and the report-back under it must never disagree on
  which language they are in.

## The glyph vocabulary is frozen — narrow text, no emoji

Emoji are the wrong tool for a column. They occupy two cells on some fonts and
one on others, and which ones misbehave is not predictable from the codepoint —
`⚪` and `⚠️` look as safe as `✅` and are not. Any padding that fixes one
terminal breaks another. A card written into a file, a commit message or a PR
body must survive with no emoji at all.

So the markers are **narrow text glyphs**, the same six the `report-back` skill
uses. Every one is exactly one column on every font, so the label column never
shifts:

| marker  | where  | means                                                   |
| ------- | ------ | ------------------------------------------------------- |
| `✓`     | header | shipped — evidence exists (merged PR, green checks)     |
| `!`     | header | needs attention — stalled, CI red, blocked              |
| `✗`     | header | finished and failed — pairs with a `stopped at` verdict |
| `-`     | header | not started                                             |
| (blank) | header | in flight, healthy                                      |
| `!`     | `now`  | stale — `derived.stale` is true on the mission          |
| `⚑`     | `you`  | something is actually owed by the operator              |
| `?`     | `open` | there is an open question                               |

`done` and `next` never take a glyph. A card that is healthy and owes nothing
shows an entirely blank gutter — which is the fastest possible read.

Banned outright, and this is measured, not taste: every emoji (`✅ ❌ 🟡 🔵 🚩
⚪ ⚠️ 🔗 🟢 🔴 ⏳`), plus `▶` and `⏭`, which have emoji variants a terminal may
promote to double width. **Exactly one space after the marker. Never two.**

Two more strokes, and then stop:

- **Identifiers go in backticks** — PR numbers, card ids, session ids, branches,
  flags: `` `#145` ``, `` `T161` ``, `` `ab53791f` ``, `` `feat/t215` ``,
  `` `--permission-mode` ``. The terminal renders code spans in the accent
  color, which is the only color in the card and costs nothing to produce.
- **The front id is bold**, the name beside it is not.
- **Nothing else is colored.** No glyphs inside the prose of a line, no green
  checks sprinkled through the text. If everything is marked, nothing is.
- **Never mark a fact you did not verify.** `✓` on a header asserts evidence
  exists. When in doubt the header stays blank and the doubt goes to `open`.

## The verdict — the one place the card says "this worked"

Everything else in this format signals trouble: a `✗`, a `⚑`, a `?`. Success is
left as an absence — no marker, no flag, an empty gutter. That is not enough. A
reader cannot tell "nothing is owed" apart from "nobody checked", and the two
have opposite consequences.

So a front that is **finished and proven** ends its header line with an explicit
verdict, after the counts:

```
✓ **T217** bundled skills      ▰▰▰▰ 4/4 · shipped `0.3.27` · all green
  you      — nothing, you're clear
```

The clause may be written only when **all three** are true at the same moment:

1. the bar is full — every unit counted is done;
2. the `you` line is empty — nothing is owed to the operator;
3. the evidence is **named**, in the card or in the links — a merged PR, green
   checks, a release tag, a passing suite with its count.

Miss any one and the clause is simply omitted. An omitted verdict is not a
failure — it means "not proven finished", which is exactly the honest reading.
Never write it from the feeling that the work went well; it is the one token in
the card that asserts a conclusion, so it carries the same evidence rule as `✓`.

Its counterpart is the negative verdict, on the same line and under the same
rule: `· stopped at <what>` when a front is finished-but-failed. Between the two
sits the ordinary case — no clause at all, work still in flight.

## The bar

`▰` filled / `▱` empty, and never anything else. Two shapes, pick one per report
and do not mix them:

- **One cell per unit, with the count** — `▰▰▰▱ 3/4`. Use this whenever the
  denominator is small and real.
- **Ten cells with a percentage** — `▰▰▰▰▰▰▰▱▱▱ 70%`. Use this for a front whose
  units are too many to draw, and only when the percentage comes from a counted
  ratio.

Several phases get several bars on the same line, `·` separated:
`spec ▰▰▰▱ 3/4 · impl ▱▱▱▱ 0/4`.

**No denominator read this run → no bar**, just the front name. A bar built from
how far along it feels is the worst line this format can emit.

**A mission's `derived.progress` is the bar — render it, never recount it.**
`mission_get` returns it, computed once by Harnu, and the operator's Topbar pill
renders the very same object. One cell per step (`total`), `▰` for each of the
`done` ones, then the headline exactly as the pill says it:
`Step N of M · V verified · L left behind`, with N = `current.from` ("Steps a–b
of M" when `current.from` ≠ `current.to`), V = `verified`, L =
`leftBehind.length` — drop the `· L left behind` clause when L is 0, and write
`Step M of M ✓` only when `allDone`. Never count steps by proof yourself, never
print a count of proven steps, and never build the bar from `mission_list`'s `steps: {
total, verified, claimed }` — that field is deprecated and disagrees with the
pill. A `mission_list` row's `progress` may be one poll old (see its
`computedAt`); the card uses `mission_get`'s.

## The links — what the reader might open

After the last card, one blank line, then every PR, issue, CI run, board card,
ClickUp/Jira task, deploy or preview URL, dashboard, Slack thread, or generated
file the reader might want to open (repo-relative paths count).

```
PR `#224` · spec merged → https://github.com/org/repo/pull/224
CI run → https://github.com/org/repo/actions/runs/9912
Delivery report → docs/reports/t215.md
```

- One line per link, `<why open it> → <url or path>`. The label says what it is
  and why they'd open it, not just "link".
- **Never align this block into columns.** It is the one block whose content
  wraps — a 90-char URL under an aligned label column lands its tail under the
  labels and ruins the card. One space each side of the arrow, always.
- Prefer the **deepest** link: the CR thread itself, not the PR page containing
  it. "What do I open" should land on the thing, not near it.
- A URL is written in full HERE and only here. Inside a card it is a bare
  `` `#224` ``.
- **Never invent a URL.** If a link was expected but does not exist, say so on
  its line: `PR → not opened yet (stopped at review)`.
- Drop the block entirely when there is nothing clickable.

## Where the facts come from

1. **Missions — `mission_list({ folder })`, then `mission_get({ folder,
missionId })` for every mission that is not `closed`.** Each mission is one
   front, attributed to its `ownerSessionId` — two orchestrators in one checkout
   read as two fronts, never as one contradictory one. The projection already
   carries what used to be hand-assembled from four places:

   | card line | read it from                                                                                       |
   | --------- | -------------------------------------------------------------------------------------------------- |
   | header    | `derived.progress`, as-is (above); `status` and `blocked` for the gutter                           |
   | `now`     | steps `running` in `derived.progress.states`, with `derived.steps[].children` for who and how long |
   | `done`    | steps whose state is `done` or `verified`, in step order                                           |
   | `next`    | the steps after `current`, in order, still `todo`                                                  |
   | `you`     | `mission_get`'s `you` line, verbatim — then the rest of `youItems`, in order, if it says `+N more` |
   | `open`    | `leftBehind` and `unprovable` steps, open blockers, `openQuestions`, `pendingRescope`              |

   `youItems` is the ordered list of everything the operator owes (a re-scope,
   the close, operator blockers, due checks, human steps, child approvals); the
   `you` line is its first item plus `(+N more)`. Print it as-is and add each
   further item as a short clause in the same order — never reordered, never
   reworded into something Harnu did not say, never an item you derived
   yourself. A `delivered` mission's `you` line asks the operator to close it.
   `stale` never appears in `mission_list`'s `status` — it is `derived.stale` on
   `mission_get`, and it puts `!` on the header and on `now`.

2. **Legacy goal files — only the ones no mission covers.** A goal file whose
   frontmatter names a mission (`mission: mnt-…`) is that mission's front, so
   skip it. A goal file with no `mission:` line is an older, unmigrated front —
   read it as before (executors, done criteria, pending gates), attribute it to
   its `session:` frontmatter or its `<session8>` filename prefix, and add `not
yet a Mission` to its `open` line. A legacy `.harnu/GOAL.md` counts the same way.
3. **The board** — `get_board` when it exists; until then `memory_read
roadmap/<slug>` for each front's card: column, per-AC table, evidence, open
   questions. A card-only front (no mission) is built from this alone.
4. **`gh pr list --state open` and `gh pr checks <n>`** — CI and merge state. A
   PR a mission links is already resolved in `derived.steps[].links` (its
   `state`); `gh` adds only what the projection does not carry, like checks.
5. **`get_fleet`** — only for fronts with no mission. A mission's linked sessions
   are already in its projection; polling the whole fleet for them is waste.

Read every source that applies before writing a single card. A card written from
memory is the thing this skill exists to prevent.

## Where the card is mandatory

- The first thing in every **report-back** — the rail, ledger and summary come
  after. The card's own links block folds into the report's links block; do not
  print two.
- The one-line `tick —` of a **mission** tick expands to the card when anything
  in `you` or `open` changed since the previous tick.
- The top of every **delivery report**, above "Where we are".
- Any answer to _status / where are we / is it done / what's left / what do you
  need from me_.

## Example — one mission, no id to name

The plainest shape the card takes:

```
  wave     ▰▰▱▱▱ 3 units running · 0 PRs open
  now      `T164` (U1 render) · `BUG-71` (body attach) · `BUG-72` (Image Cards)
  done     nothing yet
  next     first PR to open → verify AC by AC; U1 unblocks U2
⚑ you      review `#156` · production is losing content right now
? open     `T165` queued · UnresolvedMediaWarnings still log-only

PR `#156` · content loss fix → https://github.com/org/repo/pull/156
```

## Example — a mission, rendered from `derived.progress`

`mission_get` returned `total: 5`, `current: { from: 4, to: 4 }`, `done: 3`,
`verified: 2`, `leftBehind: []`, one due check on step 3, and a `you` line that
asks for it. The card prints that, once:

```
  **T381** mission v3       ▰▰▰▱▱ Step 4 of 5 · 2 verified
  now      S4 skills · `8f2c11ab` · 25 min
  done     S1 core · S2 reads · S3 renderer
  next     S5 amendments
⚑ you      tick the due check on S3 (designer sign-off)
? open     S3 is done, not yet verified
```

Note what it does **not** print: no `3/5 proven`, no second line restating the
step count, no `Progress` row. The header is the progress.

## Example — three named fronts

```
  **T215** message_session   spec ▰▰▰▱ 3/4 · impl ▱▱▱▱ 0/4
  now      gate decision → spec PR · `ab53791f` · 14 min
  done     O-1 answered · gate decided · `#224` merged
  next     predicate spec · implementation · live probe
  you      — nothing, you're clear
? open     `--permission-mode auto` never probed

! **T216** delivery assurance  S1 ▰▰▱▱ 2/4 · S2–S4 ▱▱▱ 0/3
! now      idle 3 h — waiting on `T215`
  done     research · S0 skills · S1 spec (`#225` merged)
  next     S1 implementation (needs `T215` for the send-back)
⚑ you      decide whether S1 lands before `T215` or waits for it
? open     wave collision across worktrees (§11 Q4)

✓ **T217** bundled skills      ▰▰▰▰ 4/4 · shipped `0.3.27`
  now      —
  done     staging + namespacing verified live
  next     —
⚑ you      close the card · close `BUG-86`
  open     —

PR `#224` · spec merged → https://github.com/org/repo/pull/224
PR `#225` · S1 spec → https://github.com/org/repo/pull/225
Release `0.3.27` → https://github.com/org/repo/releases/tag/v0.3.27
```

Reading only the gutter: one shipped, one needing attention, one stale executor,
two things owed, two open questions. Reading nothing else at all is allowed. That
is the point.

Note what `T217` does **not** carry: its bar is full and its evidence is named,
but two things are still owed, so the `· all green` verdict is withheld. Shipped
is not the same as clear.

## Boundaries

- The card reports; it never moves a card, merges, or closes anything.
- It never invents a `done` from a self-report — a unit an executor _says_ is
  finished but whose PR does not exist is `now`, not `done`.
- When the sources disagree (board says `in-progress`, fleet says the session is
  gone), the disagreement itself goes to `open` — the card does not pick a side.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…