Skip to content
Back to skills

Session Status

ASecurity

Report where the current coding session stands: what's left, session status, where does this session stand. Covers work in flight, remaining work, questions you were asked and never answered, unresolved decisions, blockers, and a suggested session title. USE WHEN checking mid-flight what remains in a session.

  • 8 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added October 6, 2026
ai-agentsgoshellbashgit

Works with

  • claude code
  • mcp

Security analysis

A100/100

Scanned October 6, 2026

npx -y skills add bordenet/superpowers-plus --skill session-status --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Session Status?

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

Security grade badge for Session Status
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/bordenet-session-status/badge)](https://www.skillsdirectory.com/skills/bordenet-session-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: session-status
source: superpowers-plus
augment_menu: true
description: "Report where the current coding session stands: what's left, session status, where does this session stand. Covers work in flight, remaining work, questions you were asked and never answered, unresolved decisions, blockers, and a suggested session title. USE WHEN checking mid-flight what remains in a session."
summary: "Use when: checking where this session stands mid-flight. Skip when: summarizing a call, document, or board, or tracking tasks that outlive the session."
triggers: ["/session-status", "/sp-session-status", "what's left", "whats left",
           "session status", "status of this session", "where does this session stand",
           "where are we"]
anti_triggers: []
requires_mcp: []
coordination:
  group: productivity
  order: 3
  requires: []
  enables: []
  escalates_to: []
  internal: false
composition:
  consumes: [conversation-state, task-list, execution-doc, git-state, clock]
  produces: [session-status-readout, suggested-session-title]
  capabilities: [session-state-reporting, stranded-decision-detection]
  priority: 50
  optional: false
  requires_all: false
---

# session-status

> **Wrong skill?** Resume elsewhere after compaction -> `context-ferry` (writes a file;
> this prints only). What others pushed -> `session-handoff`. Tasks outliving this session,
> and the owner of `TODO.md` -> `todo-management`. The status of anything but this session (a
> service, sprint, rollout, release, pipeline) belongs to its owner, not this skill -- stop and
> route to that owner instead of reporting on it here.
>
> **Do not rename this to `summarize`, and do not fill in `anti_triggers` without
> re-measuring.** The router reads frontmatter `name:` before the directory, so a
> directory-only rename does nothing to the router's name-match scoring. The `anti_triggers`
> veto matches anywhere in a prompt, so a broad entry like "what's left on my todo" can make
> the skill vanish from `/session-status what's left on my todo` too. Re-measure with
> `skill-trigger-audit` before changing the name, description, or anti_triggers.

**Announce at start:** "I'm using the **session-status** skill to report where this session stands."

## When to Use

The user asks `/session-status`, "what's left", "session status", or "where does this
session stand", often while checking one of several parallel sessions. Read-only; run it
as often as asked, including mid-edit.

## Procedure

1. Read the sources below. Note anything you could not read in full.
2. Draft candidate items for the four item sections, and `Active now` as prose.
3. Run **The Filter Pass** over the item sections.
4. Order each item section by source: plan doc, task list, git, then conversation newest first; an item named as blocking another goes to the top. Below the cap this can read oddly, placing a durable-but-later task above an urgent recent one. Keep it: it is the only ordering two runs agree on.
5. Keep at most seven items per item section. If one had more, add `- +N more` as a last item line, where `N` is that section's dropped count; a bare `+N more` is absorbed into the item above it when rendered.
6. Print the readout as ordinary markdown, not inside a code fence.
7. **Stop.** See **Stop**.

## Sources

Read all five. Every command here is read-only.

- **Conversation.** The visible transcript, and the only source for unanswered questions and
  stranded decisions.
- **Task list.** On Claude Code, read the block the harness injected into context. Its
  task tool is **write-only**: it takes a full replacement array, so calling it could
  delete the user's completed entries. Never call it here. On a runtime with no
  equivalent harness-injected task block, there is no source for this line -- name it on
  `Not read` as `task list: no harness source on this runtime` rather than improvising a
  substitute (do not treat this as license to read `TODO.md` -- that stays banned below
  regardless of runtime).
- **Plan or execution doc.** Only a checklist you read or wrote *this session*; read its
  unchecked `- [ ]` items. Do not go looking for one, and never read `~/context-ferry-*.md`:
  it also holds `- [ ]` items but belongs to another session and can carry credentials.
- **Git.** `git rev-parse --show-toplevel`, then take the basename yourself: wrapping it as
  `basename "$(...)"` exits 0 with an empty value outside a repo, so judge this read by its
  output, never its status. `git rev-parse --abbrev-ref HEAD` for the branch; the literal
  `HEAD` means detached *or* no commits yet, so try `git rev-parse --short HEAD` and print
  `detached-<sha>`, or if that also fails print `<dir>` alone and name it on `Not read`.
  `git --no-optional-locks status --porcelain` for changes, the flag keeping the read from
  rewriting the index.
- **Clock.** `date '+%Y-%m-%d %H:%M:%S'`. Never write a timestamp you did not read.

**Interrupted git operation.** `--porcelain` cannot name one: a halted rebase looks like
ordinary conflicts, a bisect or half-applied cherry-pick like a clean tree. Run this once
per name, substituting each of `rebase-merge`, `rebase-apply`, `MERGE_HEAD`,
`CHERRY_PICK_HEAD`, `REVERT_HEAD`, `BISECT_LOG`, `sequencer`:

```bash
test -e "$(git rev-parse --git-path rebase-merge)" && echo IN_PROGRESS || echo none
```

Both halves are required: `--git-path` prints a path and exits 0 whether or not the file
exists, so its status and output report every operation as running in every state, and
without `|| echo none` a clean tree exits 1, which some runtimes surface as a failure.
`sequencer` catches a multi-commit cherry-pick or revert whose conflict was resolved with
plain `git commit`, which clears `CHERRY_PICK_HEAD` while picks stay pending. If a probe
cannot run, say so on `Not read`.

**Do not read `TODO.md`.** It is user-global, so its items are mostly other projects.
`todo-crud.sh` is also unsafe: `todo-engine.py` re-applies `chmod 0444` and `chflags` before
dispatch and outside the writer lock, which can collide with another session mid-write.
`todo-management` owns that file.

**The `Not read` line.** Name anything that failed, returned nothing, did not apply, or
returned less than the whole picture. `nothing` means all five were read in full, so it is
wrong when one merely did not apply. Never fill a gap from memory, and never say something
does not exist when you only failed to see it: "no plan doc in view" is honest, "no plan
doc" is not. A compacted conversation belongs here too, since it neither fails nor returns
nothing but succeeds and returns less: **write `conversation truncated, earlier questions and
decisions may be missing` unless you positively see the session's start.** Default to writing
it, because you cannot locate your own context boundary reliably and a post-compaction
transcript opens with a summary that reads like a beginning. Questions and stranded decisions
have no other source, so this is the gap that silently empties the sections this skill is for.

## The Readout

Print these in order. Omit any of the four item sections with no items, heading included,
and omit `Active now` when nothing is in flight. Header, `Not read`, and `Suggested title`
always print.

```text
## Session Status | <dir>@<branch> | <timestamp>

Not read: <anything not read in full, or "nothing">

**Active now**
<Prose, max three sentences, on the unfinished state of live work: what is half-done,
which files, what has not been run. An interrupted operation comes first and names it.>

**Remaining**
- [ ] <task> (<source>)
- +2 more

**Open questions for you**
1. "<verbatim question text>"

**Stranded decisions**
- <the unresolved point>: <options on the table, or the constraint not yet applied>

**Blocked**
- <item>: blocked on <what or who> (<source>)

**Suggested title**
`<title>`
```

The four **item sections** are `Remaining`, `Open questions for you`, `Stranded decisions`,
and `Blocked`. Pipes separate the header fields because space runs collapse when rendered.
`Remaining` holds unchecked plan-doc items, incomplete task-list entries, and work requested
this session that is not done; `Blocked` holds anything that cannot proceed until someone or
something else acts, such as a review, a deploy, or an answer. Merely not started is
`Remaining`. **A blocked item goes in `Blocked` only, never also in `Remaining`**, though
equally undone: otherwise both claim it and it prints twice. Items in those two sections carry
a source tag, one of `conversation`, `task list`, `plan doc`, `git`; `Open questions`,
`Stranded decisions`, and `Active now` carry none, the conversation being their only source.

`git` contributes at most one `Remaining` item, `uncommitted changes in N file(s)`. Linked
worktrees have private working trees, so that count is this directory's alone, but nothing you
can read says whether a second tab is open on it, so always add `may include another session's
edits` to that item and to any file named in `Active now`.

**Degraded header.** Print the fields you read and drop the separator for one you could not,
so `<dir>` alone or `<timestamp>` alone. Outside a repo the branch and status reads fail and
the toplevel read returns empty: print `## Session Status | <timestamp>` with `git absent` on
`Not read`, and never derive the directory name from the shell's working path.

**With all four item sections empty *and* nothing in `Active now`**, print the header, `Not
read`, then exactly `Nothing pending in what I can see.` and the title. An interrupted git
operation counts as work in flight, so it never appears beside that sentence. Never invent
work to fill a section.

## What Counts as Stranded

Report one when either holds. The first takes the `options on the table` shape, the second `constraint not yet applied`.

1. Two or more paths were named and none chosen, or a path was picked and a later
   instruction silently contradicted it.
2. A stated preference, constraint, or correction was never applied, or what was asked for
   and what got built diverge unacknowledged.

Capture unanswered questions **verbatim**, in quotes: paraphrase loses the choice the question
was pinning down. An implicit one ("I'll assume X unless you object") has no quotable text, so
rephrase it as a direct question and print it **unquoted, prefixed `implied:`** rather than
dropping it or wrapping words the user never said in quotes. These are questions **the
assistant asked the user**; a user request the assistant never answered is `Remaining` work.
The verbatim rule comes from `context-ferry`; a change to it belongs in both.

## The Filter Pass

Run at step 3, before ordering and capping. Without it a long transcript pulls the readout
toward a recap of finished work, the one thing the user did not ask for.

**Operate only on item lines** (beginning `- `, `- [ ] `, or `N. `) inside the four item
sections. The header, `Not read`, `Active now`, and `Suggested title` are never touched.

**Delete an item line if and only if** what it names is finished and nothing about it remains.
A line leading with finished work but naming something outstanding survives, so `PR merged,
waiting on the reviewer to approve` stays, as does partial progress. Afterwards, if one of
those four sections has no item lines left, drop its heading too.

`Active now` is exempt from the filter but not from the no-recap rule, and it is the one place
a recap can enter uncaught, so check every clause against something unfinished. `Ported two of
five files, tests not run` is correct: the finished half locates the unfinished half. A clause
naming only what succeeded is still a recap here, so `the battery and probe both pass` does not
belong, since it leaves nothing open.

Rationalizations that produce a recap, and the answer to each: "a quick recap gives useful
context" (the scrollback holds it), "I'll list what's done as `[x]`" (completed items are
omitted, not checked off), "nothing is pending, so I'll suggest next steps" (print the
empty-state sentence and stop).

## Suggested Title

One title, not a menu, backtick-wrapped on its own line so it copies cleanly. On Claude
Code the user pastes it into `/rename`; on a runtime with no rename command, present it
as a copyable line and do not name `/rename`.

- Three to seven words, noun phrase, concrete nouns from the actual work; a ticket key
  counts as one word. Lead with a ticket key **only** if the branch name carries it
  (`feat/PROJ-123-...` yields `PROJ-123`) or the user typed it this session, never from recall.
- Banned: `session`, `work`, `discussion`, `exploration`, `deep dive`, any word true of
  every session, em dashes, emoji, decorative colons.
- Nothing pending and nothing substantive done: name the surface, as in `slop-check port,
  not yet run`.

## Stop

The readout is the whole deliverable. After printing it: make no edits, run nothing beyond
the reads above, do not act on any listed item, do not answer the questions you printed, do
not dispatch a subagent, do not offer to continue, and **do not continue or abort any
interrupted operation you just reported**. End the turn. It is a snapshot, so if the user
later says "go", re-read first: another tab on this directory may have changed the tree, and
an interrupted operation must be resolved by the user before anything is committed, since a
commit made during one can be discarded by the abort that ends it.

## Failure Modes

| Failure | Recovery |
|---|---|
| An interrupted operation reported when none runs, a halted one reported as ordinary changes, or `Nothing pending` on a detached HEAD or mid-bisect | All three are the probe. Use the exact two-branch form in **Sources** for all seven names including `sequencer`: `--git-path` alone always prints a path and exits 0, `--porcelain` alone can never name the operation, and a clean tree is not a safe tree. A detached HEAD prints `detached-<sha>`, never the literal `HEAD`. |
| `Open questions` and `Stranded decisions` empty after a compaction | They have no source but the conversation. Put the full `conversation truncated, earlier questions and decisions may be missing` on `Not read` rather than reporting none. |
| Readout opens with completed work | The filter ran before the draft was complete, or `Active now` was written as a recap. Re-draft it as unfinished state and re-run step 3. |
| `Suggested title` or `Not read` missing, or the readout mixes two sessions' work | None of the three is an item section, so omit-when-empty and the filter never reach them. Header, `Not read`, and title always print; two tabs on one directory cannot be told apart, so say so rather than guessing. |
| A source called absent when only unreadable, or a timestamp or branch that looks plausible but is wrong | Both assert what was not read. Say "in view" for the first; for the second run the command in **Sources** or drop the field. Either way name it on `Not read`. |
| `Blocked` always empty | Anything waiting on another person or system belongs there, not in `Remaining`. |
| A question was paraphrased and the user answered a different one | Questions are quoted verbatim. Re-read the conversation and quote exactly. |

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…