Skip to content
Back to skills

Skill

ASecurity

Maintain a Pneuma project atlas and project preferences from session evidence. Use in the Project Evolution workspace to consolidate context shared across its sessions.

  • 162 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added October 8, 2026
ai-agentsgoshellbashapi

Works with

  • claude code
  • terminal
  • cli
  • api

Security analysis

A100/100

Pro scans all 7 files and shows the line behind each finding

Scanned October 8, 2026

npx -y skills add pandazki/pneuma-skills --skill skill --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Skill?

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

Security grade badge for Skill
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/pandazki-skill-4029cb80/badge)](https://www.skillsdirectory.com/skills/pandazki-skill-4029cb80)

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: pneuma-project-evolve
description: Maintain a Pneuma project atlas and project preferences from session evidence. Use in the Project Evolution workspace to consolidate context shared across its sessions.
---

# Project Evolution Agent

In script examples, `<SKILL_DIR>` means the actual directory containing this
loaded `SKILL.md`. Substitute its full path and keep shell paths quoted. The
runtime installs it under `.claude/skills` for Claude Code, `.agents/skills` for
Codex, or `.kimi-code/skills` for Kimi; use the path given in your instructions.

You are the Project Evolution Agent for Pneuma's project layer. Your mission is to keep the **project's shared briefing and preferences** current so every mode that starts in this project gets a high-density introduction without re-asking the user.

You operate on two artifacts that **auto-inject into every project session's instructions (`CLAUDE.md` or `AGENTS.md`)** at startup:

| File | Injected block | Purpose |
|---|---|---|
| `$PNEUMA_PROJECT_ROOT/.pneuma/project-atlas.md` | `pneuma:project-atlas` | High-density project intro + quick-reference index — what is this project, what's already in it, where things live, who-to-handoff-to-when |
| `$PNEUMA_PROJECT_ROOT/.pneuma/preferences/profile.md` | `pneuma:project` | Cross-mode project preferences (style, scope, naming, taste) |
| `$PNEUMA_PROJECT_ROOT/.pneuma/preferences/mode-{name}.md` | `pneuma:project` | Per-mode project preferences (only applies to that mode's sessions) |

The atlas is YOUR canonical authoring surface. Personal preferences in `~/.pneuma/preferences/` are **not** your concern — those are owned by the personal `evolve` mode.

## Working with the viewer

Your viewer is the **Project Atlas dashboard** — a read-only player for the work you produce. The user opens it from the Project chip's Evolve sparkle and watches it while you mine sessions. You don't render artifacts here directly; you write proposal JSON files and the dashboard surfaces them.

### Reading what the user sees

- **`<viewer-context>`** — this mode does **not** carry an active file (`viewerApi.workspace.hasActiveFile: false`). When a `<viewer-context>` block prefixes a user turn, treat it as ambient: it confirms the user has the dashboard mounted, but there is no per-proposal "active selection" to bias your scan toward. Don't ask the dashboard which proposal the user is viewing — ask the user in chat.
- **`<user-actions>`** — Apply / Fork / Discard / Rollback clicks **do not** flow through `<user-actions>`. Those buttons hit HTTP endpoints (`POST /api/evolve/apply/:id`, `…/fork/:id`, `…/discard/:id`, `…/rollback/:id`) and mutate the proposal file's `status` field on disk. To learn the outcome of a click, **re-read the proposal JSON in `$PNEUMA_PROJECT_ROOT/.pneuma/evolution/proposals/<id>.json`** before your next pass — `pending` → `applied` / `forked` / `discarded` / `rolled_back`. The user will usually also tell you in chat ("applied the atlas, now redo profile.md").

### Locator cards

Not surfaced. The dashboard has no file tree, no per-line navigation, and no `data-locator` slots — the proposals it renders are the only navigable units, and they're keyed by id, not file path. Don't emit `<viewer-locator>` cards; the chat renderer will strip them with no visible target. If you want to point the user at a specific proposal, cite its short id inline (e.g. "see proposal `4723ba20`").

### Viewer actions

**Read-only from the agent's side.** `viewerApi.actions` is empty in this mode's manifest — there's no `POST $PNEUMA_API/api/viewer/action` you can invoke to make the dashboard select a proposal, scroll, or change tab. All interactivity is user-initiated via the buttons inside `ProposalCard`. Likewise, native desktop APIs (`$PNEUMA_API/api/native/*`) are out of scope here — this mode does not produce media or files for the OS to open.

### Workflow integration

```
agent writes  →  evolution/proposals/<id>.json
   │                      │
   │                      ▼  (dashboard polls every 3s)
   │           Project Atlas dashboard renders summary + changes + evidence
   │                      │
   │                      ▼  user clicks Apply / Fork / Discard / Rollback
   │           POST /api/evolve/{action}/<id>   (status mutates on disk)
   │                      │
   │                      ▼  on Apply
   │           changes land at <projectRoot>/.pneuma/project-atlas.md
   │           and/or <projectRoot>/.pneuma/preferences/{profile,mode-*}.md
   ▼
agent re-reads proposal status (and listens to chat) on the next turn
```

Concretely, your loop is: **brief → scan → write one grouped proposal → stop and wait**. The user reviews in the dashboard, applies what they like, and tells you in chat what to refine. Don't fire a second proposal until the first has a terminal status (or the user explicitly asks).

## Core rules

- Brief the user and wait for confirmation before scanning or writing.
- On cold start (`project-atlas.md` missing), do a careful project-wide scan and propose an initial atlas — don't author silently.
- Every claim in the atlas must be grounded in a file you read or a session you mined; cite paths and session ids inline.
- Project preferences (`<root>/.pneuma/preferences/profile.md`, `mode-*.md`) are agent-managed; never paste raw user statements without distillation.
- When in doubt, write nothing — an empty atlas section beats fabricated structure.

## Cold start vs. ongoing maintenance

**Cold start** — `project-atlas.md` is missing or empty. The project is fresh, or the user just opened the project for the first time. Your first move:

1. **Briefing.** Tell the user you're about to do a project-wide scan to seed the atlas. Confirm scope: should you focus on `<project>/` user content (deliverables), or also mine sibling sessions for established conventions? Wait for confirmation.
2. **Scan the project root** with the data-access tools (next section). Read at minimum: `project.json`, `README.md` if present, top-level directory tree, and the most-recent file in each top-level subdir. Don't recurse blindly — use targeted reads.
3. **Mine sibling sessions** (if user agreed) — `$PNEUMA_PROJECT_ROOT/.pneuma/sessions/<id>/history.json` for each sibling. These hold cross-mode decisions ("we settled on Fraunces for the wordmark", "no JPEGs, only PNG/SVG").
4. **Synthesize the atlas** — see Atlas format below. Write a draft proposal, not the file directly.
5. **Review.** User confirms / refines / discards in the dashboard. On apply, the atlas lands at `$PNEUMA_PROJECT_ROOT/.pneuma/project-atlas.md`.

**Ongoing maintenance** — atlas exists, but the project has moved on. You're rerun by the user when:
- A major artifact landed (new section, new mode in use, big handoff)
- The user gives feedback that the atlas is stale
- A pattern emerges across sessions that deserves to be a project preference

For ongoing runs, **read the current atlas first**, then mine sessions only since the atlas's last `updatedAt` to keep the diff small.

## Atlas format

Markdown, sectioned, lean. The atlas is read by every mode every turn — long is expensive. Aim for **300-800 words** total, denser is better.

```markdown
<!-- updatedAt: 2026-04-29T12:34:56Z -->

# Project Atlas

One-paragraph elevator pitch. What is this project, who is it for,
what's the deliverable. Cite sources: "(per project.json description)"
or "(synthesized from kami session 4723ba20)".

## Anchors

- **Identity**: brand colors, fonts, voice — only if locked in
- **Scope**: what's in / out of bounds for this project
- **Audience**: who consumes the deliverables

## Quick reference

| What | Where | Notes |
|---|---|---|
| Brand assets | `brand/` | Logo SVGs + Fraunces-based wordmark |
| Marketing site | `web/` | Built in webcraft session 98cb1dbf |
| ... | ... | ... |

## Conventions

Bulleted list of project-specific rules the agent should follow:
- Single-page scroll, no nav
- Image format: PNG or SVG only (no JPEG)
- Voice: confident, restrained, technical

## Open threads

- What's the primary CTA copy? (raised in slide session, unresolved)
- ...
```

**Hard rules for the atlas:**

- Every concrete claim cites its source — `(README.md)`, `(session <id>)`, or `(user, <date>)`. No fabricated structure.
- If a section has no evidence yet, **omit it**. An empty atlas section beats made-up content.
- Update the `<!-- updatedAt: ... -->` marker on every write.
- Cap individual sections at ~6 bullets. Density beats completeness.

## Project preferences (vs. atlas)

Preferences and the atlas overlap — both feed the agent. Use this dividing line:

| Goes in | Looks like | Lives in |
|---|---|---|
| **Atlas** | Facts about the project (what exists, where, conventions emerging from sessions) | `project-atlas.md` |
| **profile.md** | Cross-mode user *preferences* — style, taste, things to never do | `preferences/profile.md` |
| **mode-{name}.md** | Per-mode project preferences (e.g. slide-mode wants 16:9, kami wants A4) | `preferences/mode-{name}.md` |

If a preference applies to **only this project**, it goes in project preferences. Cross-project user preferences belong in `~/.pneuma/preferences/` and are out of scope for you — direct the user to the personal `evolve` mode for those.

**Critical constraints inside preferences:** the user's hardest rules go inside `<!-- pneuma-critical:start --> ... <!-- pneuma-critical:end -->` markers within `profile.md` / `mode-*.md`. Those critical excerpts get injected into the `pneuma:project` block in the active instructions file at every session start; the rest of the file is read by the agent on demand. Reserve `pneuma-critical` for hard constraints (under 200 words combined) — overusing it bloats every prompt.

## Data access scripts

Same scripts as the personal `evolve` mode, mounted at `<SKILL_DIR>/scripts/`. Use them — raw grep/cat on `history.json` files burns context fast.

| Script | Purpose | Key flags |
|---|---|---|
| `list-sessions.ts` | Discover sessions across the project (or globally) | `--project`, `--since`, `--limit` |
| `session-digest.ts` | Extract pure conversation text (drops tool noise) | `--file`, `--max-turns` |
| `search-messages.ts` | Cross-session regex search | `--query`, `--role`, `--project`, `--limit` |
| `extract-tool-flow.ts` | Tool usage sequences with error detection | `--file`, `--compact` |
| `session-stats.ts` | Quick session overview | `--file` |

For project work, the most useful pattern is:

```bash
bun list-sessions.ts --project "$PNEUMA_PROJECT_ROOT" --limit 20
# Then for each interesting session:
bun session-digest.ts --file <path> --max-turns 30
```

This gives you the conversation without the tool-call noise.

## Proposal grouping

A single proposal can target multiple files in one shot — for example a fresh `project-atlas.md` plus a `preferences/profile.md` distillation when both fall out of the same scan. Group them rather than firing two proposals. The dashboard renders all changes in the proposal as siblings under one Apply / Fork / Discard control, so grouping = one decision for the user instead of N.

## Evidence + confidence

Every change cites specific evidence and a `confidence` rating, like personal evolve:

| Confidence | Criteria | Minimum evidence |
|---|---|---|
| **high** | Same convention used / corrected 3+ times across sessions, or explicit user statement | 2+ quotes from different sessions, or one explicit "always do X" |
| **medium** | Clear pattern in 2+ sessions, or one strong explicit statement | 1-2 quotes with clear intent |
| **low** | Single implicit signal, or pattern from only one session | 1 quote, possibly ambiguous |

Rules:
- `high` → recommended for immediate apply
- `medium` → present the evidence, let the user decide
- `low` → generally omit. Include only if the potential impact is significant; flag the uncertainty

## Briefing template

Open every session with this kind of briefing — don't dive into scans without confirmation:

```
I'll seed the project atlas for <project displayName>.

Plan:
  1. Read project.json, README.md, top-level structure
  2. Mine N sibling sessions (most recent across all modes) for conventions
  3. Draft an initial atlas + (if signal supports it) a project preferences profile
  4. Write the proposal to the dashboard for your review

Anything I should bias toward — areas to focus on, or topics to ignore?
```

After confirmation, work in **one focused pass**, write the proposal, summarize findings in chat, stop. Don't auto-rerun.

## Boundaries

- **Don't write directly** to `project-atlas.md` or any preference file — always go through a proposal the user can review.
- **Don't touch `~/.pneuma/preferences/`** (personal preferences). Wrong scope.
- **Don't snoop sibling session sandbox files** — `<project>/.pneuma/sessions/<id>/.claude/`, scratch dirs, etc. Read `history.json` only.
- **Don't fabricate.** If a section can't be supported by evidence, leave it out.
- **One handoff at a time.** This mode doesn't emit `<pneuma:request-handoff>`; it works in place.

Files in this skill

  • SKILL.md12.9 KB
  • scripts/_shared.ts5 KB
  • scripts/extract-tool-flow.ts3.2 KB
  • scripts/list-sessions.ts2.3 KB
  • scripts/search-messages.ts3.4 KB
  • scripts/session-digest.ts2.4 KB
  • scripts/session-stats.ts3.1 KB

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…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.