SKILL·532D1F

ax-narrate

Necmttn
Updated Yesterday
92
9
92
View on GitHub
Metaai

About

The ax-narrate skill generates a structured session narration when triggered by phrases like "narrate this session" or "summarize what changed." It captures the complete development story including corrections, abandoned attempts, and tool failures that don't appear in final PRs. The output is saved as a JSON file in `.ax/narrations/` for review in ax studio.

Quick Install

Claude Code

Recommended
Primary
npx skills add Necmttn/ax -a claude-code
Plugin CommandAlternative
/plugin add https://github.com/Necmttn/ax
Git CloneAlternative
git clone https://github.com/Necmttn/ax.git ~/.claude/skills/ax-narrate

Copy and paste this command in Claude Code to install this skill

Documentation

ax:narrate - write the session's story as a structured narration

You were there. This skill turns YOUR OWN memory of the session into a reviewable artifact: 3-7 stops in reading-flow order, each anchored to real evidence - code hunks, turn numbers, user quotes, failures. The point is to capture what a PR diff never shows: the corrections, the dead ends, the recoveries.

The artifact validates against SessionNarration in apps/studio/src/routes/narration-types.ts and renders in ax studio.

Step 1 - identify the session

  • Preferred: ax sessions here --days=1 --json and pick the current session's id (the one matching this conversation). Use the short id.
  • If ax is unavailable or the session isn't ingested yet, derive a slug: <repo>-<YYYYMMDD-HHmm>. Note in meta that turn seqs are best-effort ordinals in that case.
  • If available, ax sessions show <id> --json gives you the real turn seqs to anchor against. Prefer real seqs over guesses.

Step 2 - reconstruct the story from your own context

Re-read the conversation in your head before writing anything:

  1. What did the user originally ask for? (intent)
  2. What existed before, what exists now? (before/after)
  3. Where did the user redirect or correct you? EVERY one of these becomes a correction anchor. No exceptions.
  4. Which tool failures actually mattered (changed your approach, cost real time, forced a workaround)? Each becomes a tool_failure anchor. Skip trivial retries that changed nothing.
  5. Which attempts were abandoned? They get a stop or at least a turn anchor - abandonment is part of the story.

Step 3 - choose 3-7 stops, in reading-flow order

A stop is a LOGICAL unit of change, not a file. If three files changed for one reason, that is ONE stop with several anchors. Order rules (stolen from the code-tour playbook because they work):

  • Entry point first: the change that, understood alone, unlocks the rest.
  • Cause before effect: the correction comes before the code it caused.
  • Definitions before consumers: types/schema stops before usage stops.
  • Verification last: tests, typecheck, and the failures hit on the way.
  • Combine trivial housekeeping into one final stop, or omit it.

Step 4 - write each stop

  • title: short and friendly. "Call counts become a char diffstat", not "Changes to files-touched.ts".
  • gist: ONE sentence. Not two. A reader who reads nothing else must get the stop from the gist. Conversational, the way you'd say it to a colleague.
  • detail: 2-4 sentences of markdown (paragraphs, inline code, bold). Say WHY the change looks the way it does; "we did X instead of Y because Z" is exactly what the reader wants.
  • transition: a short connective phrase to the next stop; empty string "" for the last stop.
  • anchors: MUST be non-empty. An unanchored stop is an unsupported claim. Anchor kinds:
kindrequired fieldsuse for
file_hunkfile, old_text, new_text, label, opt turn_seqa real code change
code_stateartifact, label, lang, code, opt turn_seqthe evolving architecture snapshot
turnturn_seq, labela plain moment in the transcript
user_directionturn_seq, quoteuser steering (not correcting)
correctionturn_seq, quote, outcomeuser correcting course
tool_failureturn_seq, tool, error_excerpt, recoveryconsequential failure
termname, definitiona domain term the story leans on

Hard anchor rules

  • file_hunk carries VERBATIM old/new fragments from the actual edits you made - copy the real text, never paraphrase code. Keep hunks short (5-15 lines per side); pick the most telling fragment, not the whole edit. old_text: null for pure insertions, new_text: null for pure deletions. Never both null.
  • Every user correction/redirect in the session gets a correction anchor with a verbatim (trimmed) quote and a concrete outcome - what actually changed because of it.
  • Every consequential tool failure gets a tool_failure anchor with a real error_excerpt and how you recovered (or "abandoned").
  • Never fabricate turn seqs. Use ax sessions show seqs when you have them; otherwise count user turns from the start of the conversation and say so in the detail.
  • code_state is the architecture spine of the narration: pick ONE stable artifact id (e.g. "review-architecture") and restate the FULL snapshot at each stop where the design moved - pseudo-code of types/interfaces, how they compose, and the call stack (plan-style: Caller -> Callee // note). Consecutive snapshots of the same artifact animate token-by-token in studio, so KEEP shared lines byte-identical between stops and let only the real delta differ - a new method, a renamed shape, an added edge case. Use code_state for the evolving design; use file_hunk for one-off code jumps (those render as static before/after diffs, not motion).

Step 5 - emit the artifact

Write .ax/narrations/<session-id>.json (create the directory if needed) with exactly this top-level shape:

{
  "schema_version": 1,
  "kind": "narration",
  "meta": {
    "session_id": "<id>",
    "generated_at": "<ISO-8601 now>",
    "generator": "skill",
    "model": "<your model id>"
  },
  "title": "...",
  "intent": "...",
  "before": "...",
  "after": "...",
  "stops": [ { "title": "...", "gist": "...", "detail": "...", "transition": "...", "anchors": [ ... ] } ]
}

Before finishing, self-check against the validator's rules:

  • stops non-empty (3-7), every stop's anchors non-empty.
  • Every gist is one sentence; every correction has an outcome; every tool_failure has a recovery; no file_hunk with both sides null or empty.
  • Strings are plain JSON strings (escape newlines in hunks as \n).

Then tell the user where the file landed and give a 2-line summary of the story you wrote. Do not paste the whole JSON into chat.

GitHub Repository

Necmttn/ax
Path: skills/narrate
0
agent-memoryagent-observabilityai-agentsbunclaude-codecodex
FAQ

Frequently asked questions

What is the ax-narrate skill?

ax-narrate is a Claude Skill by Necmttn. Skills package instructions and resources that Claude loads on demand, so Claude can perform ax-narrate-related tasks without extra prompting.

How do I install ax-narrate?

Use the install commands on this page: add ax-narrate to Claude Code as a plugin, or clone its repository into your skills directory, then restart Claude so it picks up the skill.

What category does ax-narrate belong to?

ax-narrate is in the Meta category, tagged ai.

Is ax-narrate free to use?

Yes. ax-narrate is listed on AIMCP and free to install.

Related Skills

content-collections
Meta

This skill provides a production-tested setup for Content Collections, a TypeScript-first tool that transforms Markdown/MDX files into type-safe data collections with Zod validation. Use it when building blogs, documentation sites, or content-heavy Vite + React applications to ensure type safety and automatic content validation. It covers everything from Vite plugin configuration and MDX compilation to deployment optimization and schema validation.

View skill
polymarket
Meta

This skill enables developers to build applications with the Polymarket prediction markets platform, including API integration for trading and market data. It also provides real-time data streaming via WebSocket to monitor live trades and market activity. Use it for implementing trading strategies or creating tools that process live market updates.

View skill
creating-opencode-plugins
Meta

This skill helps developers create OpenCode plugins that hook into 25+ event types like commands, files, and LSP operations. It provides the plugin structure, event API specifications, and implementation patterns for JavaScript/TypeScript modules. Use it when you need to intercept, monitor, or extend the OpenCode AI assistant's lifecycle with custom event-driven logic.

View skill
sglang
Meta

SGLang is a high-performance LLM serving framework that specializes in fast, structured generation for JSON, regex, and agentic workflows using its RadixAttention prefix caching. It delivers significantly faster inference, especially for tasks with repeated prefixes, making it ideal for complex, structured outputs and multi-turn conversations. Choose SGLang over alternatives like vLLM when you need constrained decoding or are building applications with extensive prefix sharing.

View skill