一键导入
reading-recommendations
Use when managing the reading list in Outline — adds books, marks reads, updates taste anchors, and recommends what to read next
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Use when managing the reading list in Outline — adds books, marks reads, updates taste anchors, and recommends what to read next
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Use when reviewing an implementation plan or design plan with Codex before exiting plan mode or starting execution — covers the canonical `codex exec` invocation pattern (mktemp temp dir, stdin-piped prompt, read-only sandbox, xhigh reasoning), 5-section prompt structure, executor-context filter, and structured output triage. Triggers on "review the plan with Codex", "Codex review", or after writing a plan file to `~/.claude/plans/` for any non-trivial multi-step work.
Use when triaging, cleaning, or organizing Gmail inbox — fetches unread messages in batches, classifies them into existing Gmail labels, surfaces action items, and archives on user approval. Triggers on: /triage, 'triage my email', 'clean up my inbox', 'organize my gmail'.
Use when restructuring monolithic project docs into a wiki, splitting flat reports into themed pages, or noticing duplicated disclaimers/preambles across project docs. Covers phased fan-out to parallel subagents, Outline-specific gotchas (H1 in body, relative links, anchor slugs), canonical-URL discipline for subagent prompts, and full-page verification using a Haiku checklist agent.
Use when starting a new project from scratch — "I want to track X", "set up a project for Y", "start a project for Z", "begin tracking W". Covers mandatory pre-creation questions (scope / artifact-bearing or pure-doc / location / initial structure), Outline collection placement, PROJECTS.yaml discipline, and wiki-from-day-1 structure to prevent flat single-doc projects that need restructuring later. Cross-references restructuring-project-docs-into-wikis for shared Outline conventions.
Auto-activates for Home Assistant and home automation questions
Use when writing blog posts, emails, or prose as Bojan — applies his narrative texture, concrete specificity, dry humor, and corrects common AI voice failures. Triggers on "write as me", "in my voice", "blog post", "draft an email for me".
| name | reading-recommendations |
| description | Use when managing the reading list in Outline — adds books, marks reads, updates taste anchors, and recommends what to read next |
All book data lives in Outline. Never create or edit local files for this collection.
Use for: adding a book, marking a book read, updating the taste profile, asking "what should I read next?", searching for a specific entry.
Do not use for: general book discussion, recommendations not being added to the list, or any file-system operations on ~/Working/projects/reading-recommendations/ (those files are deleted after the Outline migration).
| What | ID |
|---|---|
| Resources collection | ab5099b4-17a3-49e6-9b0c-b9792435a2d3 |
| Reading Recommendations parent doc | 0f17b8f8-2138-4fe6-89a5-90ba884b5386 |
| Books (intermediate parent — all book docs live here) | 639b1aee-b922-4592-81c7-6c92c90266a5 |
| Reader Profile doc | 9156dbab-e59a-4d68-ac97-210cdb4931af |
Hierarchy: Resources → Reading Recommendations → Books → individual book docs
The Books doc's child list is the index — there is no separate index file to maintain.
Title format: Just the book title — e.g. Declare, Tomorrow, and Tomorrow, and Tomorrow. Do NOT prefix with author or year. If two books genuinely share a title, append (Year) to disambiguate.
Content structure — starts with a two-column metadata table (no header row), then ## sections:
| | |
|---|---|
| **Author** | Tim Powers |
| **Year** | 2001 |
| **Status** | to-read |
| **Priority** | must-try |
| **Length** | long |
| **Top pick** | yes |
| **Rating** | — |
| **Date read** | — |
| **Reread** | no |
| **Genres** | weird-horror · spy-tradecraft |
| **Taste anchors** | le-carre · stross-laundry |
| **Recommended by** | curation |
| **Series** | — |
## Pitch
[Why this book fits this specific taste profile]
## Why it fits
[Named taste-anchor connections]
## Caveats
[Honest warnings — pacing, register, length, content]
## Links
- [Find on Amazon](...)
## Review
*To be filled in after reading.*
- **Rating:**
- **What resonated:**
- **What didn't:**
- **Reread likelihood:**
- **Would recommend to:**
## Notes
[Post-read annotations, quotes, threads to pull on]
Controlled vocabularies — use exactly these values:
| Field | Values |
|---|---|
| Status | to-read · reading · read · abandoned · skipped |
| Priority | must-try · strongly-recommended · worth-considering |
| Length | short (<200pp) · medium (200–500pp) · long (500–1000pp) · epic (>1000pp) |
| Recommended by | curation · wife · friend · self · other |
Taste anchor slugs — ALWAYS fetch the Reader Profile (9156dbab) and check the Taste Anchor Slugs table before using any slug. Never invent a slug; add new ones to the table when warranted.
Existing migrated books may not all have the metadata table yet. When updating an existing book, add the table if absent.
mcp__claude_ai_Outline__list_documents(
query="<author or title>",
collectionId="ab5099b4-17a3-49e6-9b0c-b9792435a2d3"
)
Save the id field from the result — you need it for update_document.
mcp__claude_ai_Outline__create_document:
title: just the book titletext: content starting with the metadata table (no H1 heading)parentDocumentId: 639b1aee-b922-4592-81c7-6c92c90266a5 ← Books doc, not Reading RecommendationscollectionId: ab5099b4-17a3-49e6-9b0c-b9792435a2d3Two touches — both are required for every finished read.
Touch 1 — Update the book doc:
idmcp__claude_ai_Outline__fetch on the doc URLmcp__claude_ai_Outline__update_document with the full updated content:
**Status:** read**Rating:** N (1–5)Touch 2 — Update the Reader Profile (always required for finished reads):
mcp__claude_ai_Outline__fetch on 9156dbab-e59a-4d68-ac97-210cdb4931afmcp__claude_ai_Outline__update_document on the Reader Profile (9156dbab-e59a-4d68-ac97-210cdb4931af)Touch 2 is not optional — every finished read gets an entry in Confirmed Reading History.
mcp__claude_ai_Outline__fetch on 9156dbab-e59a-4d68-ac97-210cdb4931afmcp__claude_ai_Outline__list_documents with query "Status: read" and collectionId="ab5099b4-17a3-49e6-9b0c-b9792435a2d3"mcp__claude_ai_Outline__update_document on the Reader Profilelist_documents(query="Status: to-read", collectionId="ab5099b4...")
query="Status: to-read priority: must-try"Note: The "Status: to-read" search relies on Outline full-text matching the inline metadata table. Existing migrated books may not have it yet. If search returns few results, tell the user and offer to load all ~150 docs for a comprehensive pass (slower).
When the Reader Profile or a book doc names another book in the collection, that mention should hyperlink to the target. Follow this pattern when adding a book that references existing entries, or when retroactively linking older docs.
list_collection_documents on ab5099b4-17a3-49e6-9b0c-b9792435a2d3, then filter children of the Books doc (639b1aee).*Title* → [Title](url) (strip the *)**Title** → [**Title**](url) (keep the bold)Title → [Title](url)update_document call with editMode: "replace". See "Outline editing gotchas" below for why this matters.Non-obvious update_document behaviors discovered during heavy migration and link-backfill work. Apply on every edit.
update_document while a tab is open, the tab's stale state will land seconds-to-minutes later as a new revision and clobber your changes — without errors. Before any non-trivial edit, ask the user to close the browser tab on the target doc. This is the single most important rule, and explains 90% of "my links disappeared" mysteries.patch mode silently strips hyperlinks. Calls return success and the revision increments, but Outline's ProseMirror engine drops the link during render. Always use editMode: "replace" when adding links to existing text. Trade-off: replace needs the full body, so fetch first.replace calls overwrite each other. A second replace composed from a stale fetch will silently undo the first pass's changes. For multiple substitutions in one doc, compose them all into a single replace.create_attachment is broken — fails with Cannot read properties of undefined (reading 'get') (server-side MCP bug). Migrate file content (transcripts, notes) as child Outline docs instead of attaching binaries.- [x] checked items are silently dropped.## heading.| Mistake | Correct behaviour |
|---|---|
| Titling a book doc as "Author — Title (Year)" | Title is just the book title; author and year go in the metadata table |
Using inline bold text for metadata (**Author:** X **Year:** Y) | Use the two-column markdown table format — see Book Document Format above |
Parenting new books under Reading Recommendations (0f17b8f8) | Parent under Books (639b1aee) — that's one level deeper |
| Skipping Touch 2 when marking as read | Touch 2 is always required — every read gets a Confirmed Reading History entry |
| Inventing a taste anchor slug | Fetch the Reader Profile and use the Taste Anchor Slugs table; add new ones explicitly |
Calling update_document with a title or URL | Save the id from the search result and pass that |
Editing local files in ~/Working/projects/reading-recommendations/ | Those files are deleted — Outline is the only source of truth |
| Editing a doc while the user has it open in a browser tab | Ask the user to close the tab first — the tab's stale ProseMirror state will silently overwrite the API write |
Using editMode: "patch" to add hyperlinks | Use "replace" — patch silently drops links during ProseMirror render |
Doing multiple replace updates per doc in sequence | Compose all substitutions into one replace — sequential calls overwrite each other |
| Trusting an agent's "links added" report without verifying | Re-fetch the doc to inspect — the update response echoes what was sent, not what persisted |
Calling create_attachment to upload a binary | Tool is broken; migrate file content as a child Outline doc instead |