notebook-caffc6 — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited notebook-caffc6 (Agent Skill) and scored it 83/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 4 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 4 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Project trail system. Initialize, save, recover, migrate, and manage project notes.
You are stateless. Every conversation ends and your context dies. The next agent that opens this project starts from zero — re-reads code, re-discovers constraints, re-makes mistakes you already made. The human becomes a context shuttle between amnesiac agents.
Notebook makes the project remember so you don't have to. When you save a note, you're not journaling — you're leaving a breadcrumb for a future version of yourself that has no idea what happened here. Every failure you record is a loop you prevent. Every constraint you document is a dead end the next session skips. Every decision you capture is an argument that never gets re-litigated.
The index and lessons files are designed to be fast to scan — a future agent can recover full project context in seconds instead of minutes of re-exploration. This is the difference between an agent that compounds knowledge across sessions and one that starts over every time.
Save aggressively. The cost of a note you didn't need is near zero. The cost of a note you didn't write is another wasted session.
/eat insteadProactive save rule: Save after every significant decision, failure, or constraint discovered — without being asked. Every ~20 tool calls without a save is too long. If you would say "I should remember this," write it now.
| Command | Action |
|---|---|
/notebook | Init (new project) or status (existing) |
/notebook save | Write a note immediately — never prompts, just writes |
/notebook save resolved: <desc> | Save a note and resolve the matching lesson |
/notebook recover | Read index + lessons + flagged notes, summarize state |
/notebook migrate [path] | Convert messy notes into notebook format |
Projects nest. A parent repo can contain sub-projects; a monorepo contains packages; a studio contains builds. Each can have its own _notebook/. Before saving, decide where the note belongs.
Rule: save the note in the smallest notebook whose scope contains the insight.
_notebook/_notebook/How to locate candidates: walking up from cwd, collect every directory with a project marker (PROJECT_STATE.md, CLAUDE.md, .git/, package.json / Cargo.toml / pyproject.toml / go.mod). The nearest is the default. If higher candidates exist and the note's scope clearly belongs to one of them, save there instead.
If the chosen parent notebook doesn't exist yet, initialize it first (see Initializing _notebook/) before writing.
Shared procedure used by both /notebook init and /notebook save (when no notebook exists at the chosen scope).
_notebook/
├── README.md
├── _index.md
└── lessons.mdREADME.md: # Project Notebook
This directory contains project memory for AI agents.
Read `_index.md` first for full project context, then `lessons.md` for known pitfalls._index.md: # Notes Index
Project trail — read this first on context recovery.lessons.md: # Lessons
What not to do. Read this every session.gh repo view --json visibility -q '.visibility' from the project root.PUBLIC → add _notebook/ to .gitignorePRIVATE or INTERNAL → do not gitignore (notes are safe to track)gh, not a GitHub repo) → gitignore (safe default — assume public until proven private)Notebook initialized at {project_root}/_notebook/ — gitignored (public repo).Notebook initialized at {project_root}/_notebook/ — tracked in git (private repo)._index.mdlessons.md_notebook/ is gitignored but repo is private (or vice versa), mention it once — e.g. _notebook/ is gitignored but this is a private repo — you can remove it from .gitignore to track notes in git. Don't modify .gitignore automatically for existing projects.Never prompt. Never ask questions. Just write.
Find candidate project roots walking up from cwd (see Scope). Pick the notebook scope that matches the note: nearest root by default, parent only if the note's scope clearly belongs higher.
No root found → "No project root detected. Run /notebook from within a project first."
If _notebook/ doesn't exist at the chosen scope, run Initializing _notebook/ silently.
Read _index.md, find highest note number, increment. Start at 0001 if empty.
Priority order:
/notebook save constraint: RLS can't do cross-schema joins/notebook save, synthesize from recent exchangesInfer from content. Never ask.
| Type | Signal |
|---|---|
decision | Chose between options, committed to approach |
learning | Non-obvious gotcha, unexpected behavior |
constraint | Hard limitation (library, API, platform) |
pivot | Changing direction from previous approach |
investigation | Research findings, benchmarks, comparisons |
failure | Tried something, didn't work — and why |
resolved | A previous lesson/constraint no longer applies |
Default: learning.
File: _notebook/NNNN-type-short-title.md
Quick format (default):
# NNNN: Short Descriptive Title
**Type:** type | **Date:** YYYY-MM-DD
Content. 1-5 lines. Be specific — library names, error messages, version numbers.
What happened, what it means going forward.Full format (major architectural decisions only):
# NNNN: Short Descriptive Title
**Type:** decision | **Date:** YYYY-MM-DD
**Status:** accepted
## Context
What prompted this? (1-3 sentences)
## Decision
What we decided. Be specific.
## Rationale
Why this over alternatives.
## Alternatives Considered
- **Alternative A:** Rejected because X
## Consequences
What this means going forward.Threshold: meaningful alternatives considered AND hard to reverse → full format. Everything else → quick.
Append a rich one-line summary to _index.md:
- NNNN type: Detailed one-liner useful standalone⚑ flag for critical constraints, breaking discoveries, architectural decisions:
- NNNN ⚑ constraint: Critical thing every session must knowFor types `failure`, `learning`, `constraint`: append a distilled one-liner to lessons.md.
Format — pure signal, no metadata:
- Concise lesson. What not to do and why, or what to do instead.The full note has context and details. The lesson is the takeaway — one line a model can scan in a second.
For type `resolved`: write the note as usual, then strike the matching lesson. See Resolving Lessons for matching rules and format.
Only if the note materially changes project state (blocking constraint, architecture change, pivot). If no PROJECT_STATE.md exists, skip.
Single line confirmation:
Saved: _notebook/NNNN-type-short-title.mdNothing else.
_notebook/_index.md_notebook/lessons.md_notebook/_notebook/PROJECT_STATE.md if it existsConvert existing messy notes into notebook format. One-time onboarding for projects with pre-existing notes.
_notebook/ infrastructure exists at the chosen scope (see Initializing _notebook/)_notebook/_index.md from scratch with rich one-line summarieslessons.mdIf _notebook/ already has notes, continue numbering from the highest existing. Migrate never overwrites existing notes.
After migration, report: how many files found, how many converted, how many lessons extracted. Show the generated index.
To mark a lesson as resolved use: /notebook save resolved: <exact phrase or lesson number>
Matching rules:
Note saved but no matching lesson found to resolve.Strike the lesson in lessons.md and reference the note that resolved it:
~~Prisma doesn't work with edge runtime~~ *(resolved: fixed in Prisma 6.0 — see 0047)*Strikethrough preserves history — a future model sees what used to be a problem and knows to skip it. The note reference lets anyone find the resolution details.
Archiving: When lessons.md exceeds 50 resolved (struck-through) entries, move all resolved lessons to lessons-archive-YYYY-MM.md and remove them from the active file. Keep only open lessons in the active file.
When reading lessons.md during context recovery, check if any lessons are outdated — library upgrades, removed constraints, resolved workarounds. Flag to the user: "Lesson [X] may be stale — [reason]. Want me to resolve it?"
On any new session or /notebook recover, read in this order:
_notebook/_index.md — what is this project, what happened_notebook/lessons.md — what not to doPROJECT_STATE.md — current snapshot (if exists)_notebook/lessons.md first. The answer may already be there. This is the reflex that prevents loops.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.