A skill is reusable instruction — a SKILL.md — distilled from real agent work and stored in paper console. When a teammate solves a hard problem well, you don’t have to rediscover how they did it: capture the session, turn it into a skill, and the prompt, tool order, and approach become something the whole team can reuse.
Skills are the step beyond reading session history. History tells you how the work happened; a skill turns the best of that work into something you can apply again.
How skills work
- Run an agent through the
paperctl CLIso the session is captured topaper console. - Generate a skill from a session that went well.
- Review and edit it — name, description, tags, and the
SKILL.mdcontent. - Publish a version so teammates can find and reuse it.
Generate a skill from a session
Open a captured session in paper console and generate a skill from it. You can seed it with a short hint — a name, description, type, or tags — and the console extracts a first SKILL.md from the session’s prompts, tool calls, and turns.
Because the skill comes from a real run, it reflects what actually worked, not a best-guess written from memory.
The same works from the terminal: paperctl skill generate <session-id> kicks off generation for one or more sessions (--name pins the name), and paperctl skill list browses your organization’s library.
pnpm typecheck && pnpm exec eslint src/components/dashboard/dashboard-digest-card.tsx src/components/dashboard/highlight-row.tsx src/components/sessions/sessions-table.tsx src/routes/_app/index.tsx --max-warnings=0 && pnpm exec vitest run src/components/dashboard src/components/sessions/sessions-table src/routes/_app/index && pnpm build > /tmp/digest-responsive/build.log 2>&1Test Files 10 passed (10) Tests 49 passed (49)
pnpm typecheck && pnpm exec eslint src/components/dashboard/dashboard-digest-card.tsx src/components/dashboard/dashboard-digest-card-v2.test.tsx --max-warnings=0 && pnpm exec vitest run src/components/dashboard && pnpm buildTest Files 3 passed (3) Tests 30 passed (30)
pnpm typecheck && pnpm exec eslint src/components/dashboard/dashboard-digest-card.tsx src/components/dashboard/dashboard-digest-card-v2.test.tsx src/components/dashboard/digest-progress.tsx src/components/dashboard/digest-progress.test.tsx --max-warnings=0 && pnpm exec vitest run src/components/dashboard && pnpm buildFAIL src/components/dashboard/dashboard-digest-card-v2.test.tsx > DashboardDigestCard v2 > shows accomplishments and next steps with the structured digestTestingLibraryElementError: Unable to find an accessible element with the role "region" and name `/digest details/i`
rg -n 'Clearing Digest|headline|narrative|accomplishments|next_steps' cassettes telemetry platform -g '*.go' -g '*.json' -g '*.md' -g '*.ts' | head -300*** Update File: src/components/dashboard/dashboard-digest-card-v2.test.tsx@@- it("renders v2 structure when the headline is absent", () => {- // headline is optional on the wire and defaults to "" — the structure- // this branch renders is what makes a digest v2, not the headline.- const noHeadline = { ...v2Digest, content: { ...v2Digest.content, headline: "" } };- render(<DashboardDigestCard state={ready(noHeadline)} />);- expect(screen.getByRole("heading", { name: "Summary" })).toBeInTheDocument();- expect(screen.getByText("One merge, one blocker.")).toBeInTheDocument();+ it("does not promote a generated headline when the narrative is empty", () => {+ const emptyNarrative = {+ ...v2Digest,+ content: { ...v2Digest.content, headline: "Clearing Digest", narrative: "" },+ };+ render(<DashboardDigestCard state={ready(emptyNarrative)} />);+ expect(screen.queryByRole("heading", { name: "Summary" })).not.toBeInTheDocument();+ expect(screen.queryByText("Clearing Digest")).not.toBeInTheDocument(); expect(screen.getByRole("list", { name: "Highlights" })).toBeInTheDocument();- expect(screen.getByRole("heading", { name: "Still open" })).toBeInTheDocument();+ expect(screen.getByRole("button", { name: /accomplishments & next steps/i })).toBeInTheDocument(); });
Success. Updated the following files:M src/components/dashboard/dashboard-digest-card-v2.test.tsx
pnpm exec vitest --run src/components/dashboard/digest-details.test.tsx src/components/dashboard/dashboard-digest-card-v2.test.tsx src/components/dashboard/dashboard-digest-card.test.tsxTest Files 3 passed (3) Tests 31 passed (31)
*** Update File: src/components/dashboard/digest-details.tsx@@- const summary = detailSummary(accomplishments.length, nextSteps.length, watch.length); let primarySectionsClassName = "grid";@@- <span className="min-w-0">- <span id="digest-details-heading" className="block text-sm font-medium text-foreground">- Details- </span>- <span className="mt-0.5 block text-xs text-muted-foreground">{summary}</span>+ <span id="digest-details-heading" className="text-sm font-medium text-foreground">+ More details </span>
Success. Updated the following files:M src/components/dashboard/highlight-row.tsxM src/components/dashboard/digest-details.tsxM src/components/dashboard/digest-details.test.tsxM src/components/dashboard/dashboard-digest-content.test.tsxM src/components/dashboard/dashboard-digest-card-v2.test.tsx
*** Update File: src/components/dashboard/digest-details.tsx@@- title="Accomplishments"+ title="Outcomes"*** Update File: src/components/dashboard/dashboard-digest-card.tsx@@- <DigestList title="Accomplishments" items={content.accomplishments} horizon={state.period.horizon} />+ <DigestList title="Outcomes" items={content.accomplishments} horizon={state.period.horizon} />
Success. Updated the following files:M src/components/dashboard/digest-details.tsxM src/components/dashboard/dashboard-digest-card.tsxM src/components/dashboard/digest-details.test.tsx
pnpm exec vitest --run src/components/dashboard/digest-details.test.tsx src/components/dashboard/dashboard-digest-card.test.tsx src/components/dashboard/dashboard-digest-content.test.tsxTest Files 3 passed (3) Tests 25 passed (25)
Review, edit, and publish
A generated skill starts unpublished. Edit it to sharpen the result:
- Name and description — what the skill does and when to reach for it.
- Tags and type — so it’s easy to find later.
- Content — the
SKILL.mditself.
Publishing creates an immutable version with a changelog, visible to everyone on your team. Versions accumulate as v1, v2, and so on, and older versions stay browsable with a diff against the current version — useful when you want to see how a skill changed or compare against a previous cut.
Find and reuse skills
The Skills view in paper console is the shared library for your team:
- Search by name or description.
- Filter by scope — all skills, just yours, or your team’s, with live counts.
- Filter by tag and sort by most recent or most downloaded.
- Switch between card and table views of the library.
- Open any skill to read its content, see the sessions it came from, and browse its version history.
Anyone on the team can duplicate a skill — fork it into an editable copy of their own — copy a link to it, or download its SKILL.md. Editing and deleting a skill are reserved for its creator.
To use a skill, install it — paperctl skill sync <slug> puts the SKILL.md where your agent reads it, and re-running it later picks up new versions. Skills are also served by the tapes Skills API, so agents that pull skills in over HTTP reach the same library.
Use when refining a dashboard digest: check the source data, keep the summary focused, and verify the layout at mobile and desktop widths.
Writing or editing concept pages on papercompute.com (`src/content/concepts/<slug>.mdx`). TRIGGER when a new concept page is requested.
Use when assessing paper forest groves for cleanup, specifically to identify clean, caveat-laden, and far-from-ready groves.
Demonstrate the integration of Lambda MicroVMs with the Paper proxy and agent for capturing model turns. Use when wiring MicroVM workloads into tapes.
Use when preparing to release the new skills feature in the cloud, ensuring all necessary updates to the cloud environment land in order.
Use when creating a new Paper Compute clearing environment from scratch and ensuring its functionality end to end.
Use when managing a paper forest of groves to identify which can be safely removed. This skill involves syncing, inspecting, and pruning.
Making a skill from scratch