agentleFS
bordenetbordenet/superpowers-plus/skills/productivity/session-status/skill.md

session-status

Skill8 starsChanged 6 months agoMITView on GitHub

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.

1 other project uses a version of this.

Adopted by

Most recently taken up by

The file

We split this skill into the rules it gives an agent

6 rules. About 0 are common, 4 are distinctive, and 2 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈4

    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. Distinctive:

    Read the sources below. Note anything you could not read in full.

    line 53
  2. Distinctive:

    Run The Filter Pass over the item sections.

    line 55
  3. Very specific:

    Keep at most seven items per item section.

    line 57
  4. Distinctive:

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

    line 63
  5. Very specific:

    Plan or execution doc: Only a checklist you read or wrote *this session*.

    line 74
  6. Distinctive:

    Run at step 3, before ordering and capping.

    line 193

≈ “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

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:

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.

## 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

FailureRecovery
An interrupted operation reported when none runs, a halted one reported as ordinary changes, or Nothing pending on a detached HEAD or mid-bisectAll 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 compactionThey 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 workThe 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' workNone 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 wrongBoth 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 emptyAnything waiting on another person or system belongs there, not in Remaining.
A question was paraphrased and the user answered a different oneQuestions are quoted verbatim. Re-read the conversation and quote exactly.

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.