| name | pin |
| description | Pin session decisions, questions, objections, scope constraints, and corrections to a persistent board that survives context compaction. Use PROACTIVELY when: (1) user approves/rejects a recommendation, (2) user asks a clarifying question about a proposal, (3) user states a scope constraint, (4) user corrects a misunderstanding. Also use when user says "pin", "track this", "mark as approved", "board", "show pins". This skill should be auto-invoked by the model without user asking ā whenever a decision, question, or constraint is detected in conversation, pin it immediately after responding.
|
| allowed-tools | ["Bash","Read","Write","Edit"] |
| model | haiku |
| context | main |
| user-invocable | true |
Pin ā Session Decision Board
Persist decisions, questions, constraints, and corrections to a JSON file that survives context compaction. A companion hook injects the board into every tool call so the model never forgets.
Auto-Invoke Rules
After responding to any user message where a decision was made, a question was asked about a proposal, or a constraint was stated, IMMEDIATELY invoke /pin with the appropriate category. Do not ask permission ā just pin it.
Examples of auto-invoke triggers:
- User: "yes go with bun" ā respond normally, then
/pin ā
use bun
- User: "what about the latency impact?" ā respond normally, then
/pin ā split services ā latency impact?
- User: "no skip auth for now" ā respond normally, then
/pin ā auth layer ā skip for MVP
- User: "MVP only, max 3 files" ā respond normally, then
/pin š MVP only, max 3 files
- User: "no I meant artisans not developers" ā respond normally, then
/pin š§ target = artisans, not developers
Do NOT pin:
- Casual conversation, greetings
- Implementation details (code changes, file edits)
- Things already pinned (check board first)
Commands
| Command | Action |
|---|
/pin ā
<text> | Pin approved item |
/pin ā <text> | Pin pending question |
/pin ā <text> | Pin killed/rejected item |
/pin š <text> | Pin scope constraint |
/pin š§ <text> | Pin correction |
/pin show or /pin | Display current board |
/pin rm <n> | Remove pin by number |
/pin clear | Clear all pins |
/pin clear triage | Clear ā
/ā only, keep š/ā/š§ |
State File
Path: $PRAXIS_DIR/.session-logs/<slug>/pins.json
Derive slug from CWD:
GIT_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
REL_PATH="${PWD#$GIT_ROOT/}"
SLUG=$(echo "$REL_PATH" | tr '/' '-')
PINS_DIR="$PRAXIS_DIR/.session-logs/$SLUG"
PINS_FILE="$PINS_DIR/pins.json"
Schema:
{
"items": [
{
"id": 1,
"type": "approved",
"emoji": "ā
",
"content": "use bun everywhere",
"detail": "",
"ts": "2026-04-01T14:30:00Z"
}
],
"next_id": 2
}
Type mapping: ā
=approved, ā=pending, ā=killed, š=scope, š§=correction
Pin (/pin <emoji> <text>)
Parse the emoji prefix to determine type. Text after emoji is content. If text contains ā, split into content and detail.
- Derive
PINS_FILE path (see State File above)
mkdir -p the directory
- Read existing file or init
{"items":[],"next_id":1}
- Check if content already pinned (exact match on content field) ā if so, respond
ā ļø Already pinned. and stop
- Check limits: 5 items per type, 20 total. If category full, drop oldest item of that type.
- Append new item with
id=next_id, increment next_id
- Write file
- Respond:
š Pinned #N: <emoji> <content> ā one line only, then resume prior work
Show (/pin show or /pin)
- Read
PINS_FILE
- If file missing or items empty:
š Pin board is empty.
- Display:
š Pin Board (5 items)
1. ā
use bun everywhere (minor: keep fallback for CI)
2. ā
split the PR into 2
3. ā split services ā latency impact?
4. ā auth rewrite ā out of MVP scope
5. š MVP only, max 3 files
Remove (/pin rm <n>)
If no number: ā ļø Usage: /pin rm <number>
- Read
PINS_FILE, find item with id === n
- If not found:
ā ļø Pin #N not found.
- Remove item, write file
- Respond:
šļø Pin #N removed.
Clear (/pin clear)
- Reset file to
{"items":[],"next_id":<keep current next_id>}
- Respond:
šļø Pin board cleared.
Clear Triage (/pin clear triage)
- Remove items where type is
approved or pending
- Keep items where type is
killed, scope, or correction
- Write file
- Respond:
šļø Triage cleared. <N> pins remaining.
Limits
- 5 items per type, 20 total
- When a category is full, drop the oldest item of that type (lowest id)
Key Behaviors
- One-line responses only. Never add commentary about pin content.
- Resume immediately. After any pin command, pick up the prior conversation exactly where it left off.
- Store verbatim. No cleanup, no categorization, no reformulation of user's words.
- Stable numbering. Gaps stay after deletion.
next_id always increments, never reuses.