{"id":"weekly-digests","name":"weekly-digests","summary":"プロジェクトの全クロードメモリータイムラインを週ごとの連続的なナラティブダイジェスト生成します。タイムラインをISO週ごとのファイルに分割し、週ごとに連続したサブエージェントを実行し、それぞれ前の週のキャリーフォワードブロックを受け取り、ISO週ごとに1章のデータを作成します。","body":"# Weekly Digests\n\nProduce a serial, multi-chapter narrative digest of a project's complete claude-mem history. Differs from `timeline-report` (one long report) — this generates one digest *per ISO week*, with each subagent reading the prior week's carry-forward block so the story stays coherent.\n\n**The chapter count equals the number of ISO weeks the timeline covers.** A project with 2 weeks of data produces 2 chapters; one with 30 weeks produces 30. There is no fixed length — count the weeks first, then drive the pipeline off that count.\n\n## When to Use\n\nTrigger when the user asks for:\n\n- \"Weekly digests\"\n- \"Week-by-week story\"\n- \"Serial timeline\"\n- \"Story chapters of [project]\"\n- \"Run a digest for each week\"\n- \"Continue the story week by week\"\n\nIf the user wants a single sweeping report, use `timeline-report` instead. This skill is for serial chapter format.\n\n## Prerequisites\n\n- claude-mem worker running\n- Project has at least one ISO week of observations (the pipeline degenerates gracefully — even N=1 works)\n- A clean output directory the user is comfortable writing into\n\n**Resolve the worker port** (do this once, reuse `$WORKER_PORT`):\n\n```bash\nWORKER_PORT=\"${CLAUDE_MEM_WORKER_PORT:-$(node -e \"const fs=require('fs'),p=require('path'),os=require('os');const uid=(typeof process.getuid==='function'?process.getuid():77);const fallback=String(37700+(uid%100));try{const s=JSON.parse(fs.readFileSync(p.join(os.homedir(),'.claude-mem','settings.json'),'utf-8'));process.stdout.write(String(s.CLAUDE_MEM_WORKER_PORT||fallback));}catch{process.stdout.write(fallback);}\" 2>/dev/null)}\"\n```\n\n## Workflow\n\n### Step 1: Determine the Project Name\n\nSame worktree-detection pattern as `timeline-report`. In a worktree, the data source is the **parent project**:\n\n```bash\ngit_dir=$(git rev-parse --git-dir 2>/dev/null)\ngit_common_dir=$(git rev-parse --git-common-dir 2>/dev/null)\nif [ \"$git_dir\" != \"$git_common_dir\" ]; then\n  parent_project=$(basename \"$(dirname \"$git_common_dir\")\")\nelse\n  parent_project=$(basename \"$PWD\")\nfi\necho \"$parent_project\"\n```\n\n### Step 2: Fetch the Full Timeline and Save It\n\n```bash\nmkdir -p .scratch\ncurl -s \"http://localhost:${WORKER_PORT}/api/context/inject?project=PROJECT_NAME&full=true\" \\\n  > .scratch/cm-timeline.md\nwc -l .scratch/cm-timeline.md\n```\n\nSanity-check: confirm the file is non-empty and has the expected structure (preamble, then date headers like `### Mon DD, YYYY`, then numeric observation lines `<id> <time> <emoji> <title>` and session boundary lines `S<n> <prompt> (Mon DD at HH:MMpm)`).\n\n### Step 3: Split the Timeline Into Per-ISO-Week Files\n\nWrite a Python script to `.scratch/split-timeline.py` that:\n\n1. Parses date headers (`### Mon DD, YYYY`).\n2. Groups days into ISO weeks via `date.isocalendar()` (Monday-start).\n3. Emits one file per week to `docs/timeline-weeks/<YYYY>-W<NN>-<MonDD>-to-<MonDD>.md`, preserving each day's section verbatim.\n4. Runs a dual-pass sanity check: total observations distributed must equal the count in the source file.\n\nOutput structure (filenames illustrative):\n\n```\ndocs/timeline-weeks/\n  README.md                       # weekly index table\n  YYYY-W<NN>-MonDD-to-MonDD.md    # one per ISO week the timeline covers\n  ...\n```\n\nEach weekly file should preserve the original daily sections verbatim. Do not paraphrase at this stage — the digest agents need raw fidelity.\n\n**Count the resulting files** before launching the pipeline. That count is `TOTAL` and drives every subsequent step. Empty weeks (zero observations between active weeks) should be skipped — the pipeline only operates on weeks that have content.\n\n### Step 4: Build the Weekly Index README\n\nWrite `docs/timeline-weeks/README.md` with a markdown table: Week | Dates | Observations | Sessions | File. This becomes the operator's roadmap and helps the agents understand pacing (peak weeks vs trough weeks).\n\n### Step 5: Run the Consecutive Subagent Pipeline\n\n**Critical: subagents run sequentially, NOT in parallel.** Each agent receives the prior agent's carry-forward block. This is the entire point of the skill — without it you have N disjoint summaries; with it you have an N-chapter serial narrative.\n\nCreate the output directory:\n\n```bash\nmkdir -p docs/timeline-weeks/digests\n```\n\nFor each week, in chronological order, dispatch a Task subagent (general-purpose) with this prompt template. **Wait for each agent to complete before launching the next.** Capture the carry-forward block from the result and inject it as `STORY_SO_FAR` into the next prompt.\n\n#### Subagent Prompt Template\n\n```\nYou are writing chapter {N} of {TOTAL} in a serial week-by-week digest of the {PROJECT} project's development history. Chapters 1 through {N-1} are written. {SPECIAL_NOTE: e.g. \"This is the LARGEST week\", \"This is the TROUGH\", \"This is the FINAL chapter\", \"This is the ONLY chapter — both first AND final week\"}.\n\n**Source file (read in full):**\n{ABSOLUTE_PATH_TO_WEEK_FILE}\n\n**Output digest file (write):**\n{ABSOLUTE_PATH_TO_DIGEST_FILE}\n\n**Format key for the source file:**\n- Numeric lines like `1 7:59p 🔵 Save hook file is empty` are observations (ID, time, type-emoji, title)\n- `S##` lines are session boundaries (the user prompt that started the session)\n- Emoji legend: 🎯session 🔴bugfix 🟣feature 🔄refactor ✅change 🔵discovery ⚖️decision 🚨security_alert 🔐security_note 🤫sensitive\n\n**Story so far (carry-forward from Week {N-1}):**\n\n{STORY_SO_FAR_BLOCK_OR_EMPTY_FOR_WEEK_1}\n\n**Your digest must include:**\n1. **Title line** — `# Week {N} ({WEEK_LABEL}): {DATE_RANGE} — [your chosen subtitle]`\n2. **One-line tagline** — what this week is about, in plain English\n3. **Narrative section** ({BUDGET}) — tell the story. Resolve threads from prior weeks where the data shows resolution. Introduce new arcs. Use specific observation details.\n4. **Threads continued / opened / resolved** sections\n5. **Cliffhanger / What's next**\n6. **Carry-forward block** at the very bottom, fenced as ```carry-forward ... ``` — structured handoff for the next week's agent.\n\n**CARRY-FORWARD DISCIPLINE:**\n- Cap at ~350 words.\n- AGGRESSIVELY PRUNE: drop arcs that didn't surface this week unless they're actively unresolved cliffhangers.\n- Drop cast members absent 2+ weeks unless load-bearing for the long arc.\n- Quality over completeness. The next agent inherits what you mention; mention judiciously.\n\nRequired carry-forward sub-sections:\n- **Active arcs** — ongoing themes/projects the next agent should watch for\n- **Cast** — notable named systems/people/tools (continuing + new)\n- **Unresolved** — open questions or unfinished work\n- **Tone notes** — how the story is being told (voice, perspective, register evolution)\n\n**Tone rules:**\n- Third-person narrator, sharp, observational. Not twee.\n- AI is \"Claude\"; human is \"{USER_FIRST_NAME}\".\n- Treat codebase components as characters — whatever the project's recurring named systems are (e.g. a worker, a queue, a process manager, a recurring bug, a flaky migration). Don't import names from another project; use what shows up in this project's observations.\n- Don't manufacture drama. Name what's there.\n- Track the user's prompt-register evolution week by week (frustration markers, escalation language, shifts in tone).\n- Note meta-recursion if the project is reflexive about its own behavior (e.g. a tool that documents its own work, an AI agent debugging itself, a system that catches its own regressions).\n- Watch for new villains or co-stars and name them.\n- For trough/silent weeks: silence IS the story. Don't pad. Name what didn't happen.\n- For surge weeks (>2,000 obs): pick 4-7 spine arcs and tell them well. Don't catalog.\n\n**Important:** Do NOT speculate beyond what's in the source file.\n\nAfter writing the file, return:\n1. Path of the file you wrote\n2. The carry-forward block verbatim\n3. One-sentence summary of the week\n```\n\n#### Narrative Budget by Observation Count\n\nScale narrative length proportionally to the week's volume:\n\n| Obs count | Narrative section budget |\n| --- | --- |\n| < 100 | 200–400 words |\n| 100–500 | 300–600 words |\n| 500–1,500 | 500–900 words |\n| 1,500–3,000 | 700–1,100 words |\n| 3,000+ | 800–1,300 words |\n\nPad these into the `{BUDGET}` slot of the prompt for each week.\n\n#### The First Week\n\nFor Week 1, pass an empty `STORY_SO_FAR_BLOCK` and an instruction noting it's the origin chapter — the agent should establish initial cast, tone, and arcs for everyone after.\n\n#### The Final Week\n\nThe final week gets a different ending: **no carry-forward block**. Instead, instruct the agent to write a `## Where We Are` section (~250 words) naming what's still open at the moment of writing. Tell the agent the project is ongoing — the digest stops; the story doesn't. Don't give the story a false ending.\n\n#### When N = 1 (single-week project)\n\nApply BOTH treatments to the same chapter: empty `STORY_SO_FAR_BLOCK` AND `## Where We Are` instead of a carry-forward block. The agent is writing both the origin and the close in one pass. Don't reference prior or future chapters that don't exist.\n\n### Step 6: Rename Files for Sortable Order\n\nThe agents write digests with names like `YYYY-W<NN>-digest.md`. These already sort chronologically by ISO week (until a project crosses a year boundary inside one project name), but **add a zero-padded numeric prefix** so the order is unambiguous to humans browsing or scripting against the directory:\n\n```bash\ncd docs/timeline-weeks/digests\ntotal=$(ls *.md | wc -l | tr -d ' ')\nwidth=${#total}                  # 1 for N<10, 2 for N<100, 3 for N<1000\n[ \"$width\" -lt 2 ] && width=2    # always pad to at least 2 for readability\ni=0\nfor f in *.md; do\n  printf -v prefix \"%0${width}d\" $i\n  mv \"$f\" \"${prefix}-$f\"\n  i=$((i+1))\ndone\n```\n\nResult for N=30: `00-...md` through `29-...md`. For N=4: `00-...md` through `03-...md`. For N=120: `000-...md` through `119-...md`. **Always zero-pad** — `1-...md` and `10-...md` sort wrong without it.\n\nDo NOT also prepend the order number to the digest title line inside each file. The filename prefix is for sorting; the title stays clean: `# Week N (W##): Date — Subtitle`.\n\n### Step 7: Report Completion\n\nTell the user:\n- Total weeks digested (N)\n- Output directory path\n- Date range covered\n- Any silent/trough weeks worth flagging\n- A one-sentence capstone summarizing the arc — written by the final-chapter agent, or composed by the operator from the final agent's `## Where We Are` section.\n\n## Pipeline Discipline\n\nThese rules emerged from running the pipeline end-to-end. Encode them every time:\n\n1. **Sequential, not parallel.** The whole point is the carry-forward chain. Parallelism breaks it.\n2. **Carry-forward is bounded.** It will bloat without active pruning. Tell every agent: cap ~350 words, drop dormant arcs, drop absent cast.\n3. **Track register evolution explicitly.** The user's prompt-style across weeks is a story arc. Frustration markers shift over time (whatever they happen to be in this project's data). Name the shifts.\n4. **Treat components as characters.** Whatever recurring named systems show up in the observations are this project's villains and co-stars. Stable cast across weeks builds narrative coherence.\n5. **Honor silence.** Trough weeks (10–100 obs) are real chapters. Name what didn't happen. Don't pad.\n6. **Don't manufacture drama.** Just observe the data. If the project is reflexive, the recursion is the drama; you don't need to add more.\n7. **Final week: no false ending.** The digest stops; the project doesn't. Write `## Where We Are`, not \"the end.\"\n\n## Error Handling\n\n- **Empty timeline**: project name wrong, or worker not running. `curl -s \"http://localhost:${WORKER_PORT}/api/search?query=*&limit=1\"` to verify.\n- **Worker not running**: start it via your usual method or check `ps aux | grep worker-service`.\n- **Subagent returns malformed carry-forward**: extract the carry-forward block by regex (` ```carry-forward ... ``` `) and pass forward verbatim. If missing, ask the agent to retry with the explicit instruction \"your reply MUST include the carry-forward block fenced as ```carry-forward ... ``` at the very end.\"\n- **One agent fails mid-pipeline**: retry that week with the same carry-forward. Don't skip — the chain breaks.\n- **Carry-forward growing past ~500 words**: tighten the discipline instruction in subsequent prompts. Force pruning explicitly.\n\n## Examples\n\n### Long-running project (~30 weeks)\n\nUser: \"Make weekly digests for [project] from beginning to end\"\n\n1. Resolve worker port, detect project name.\n2. Fetch full timeline → `.scratch/cm-timeline.md`.\n3. Run `.scratch/split-timeline.py` → N weekly files in `docs/timeline-weeks/` (e.g. 30).\n4. Generate `docs/timeline-weeks/README.md` index.\n5. Launch N subagents consecutively, one per week. Each gets the prior week's carry-forward. The first chapter starts with empty carry-forward; the final chapter writes `## Where We Are` instead of a carry-forward block.\n6. Rename digests with zero-padded order prefix (`00-...md` through `29-...md`).\n7. Report total chapters, date range, any troughs/peaks, and the one-line capstone the final agent produced.\n\n### Short-lived project (~3 weeks)\n\nSame flow, just smaller. N=3, so:\n- Chapter 1: empty carry-forward, establish cast/tone/arcs.\n- Chapter 2: receives chapter 1's carry-forward, builds on it.\n- Chapter 3: receives chapter 2's carry-forward, BUT gets the final-chapter treatment (`## Where We Are` instead of carry-forward block).\n- Filenames: `00-...md`, `01-...md`, `02-...md`.\n\n### Single-week project (N=1)\n\nApply both first-and-final-chapter treatment to the only chapter: empty carry-forward, `## Where We Are` close, no inter-chapter references. Filename: `00-...md`.","author":"@thedotmack","ownerProfile":null,"authorContacts":null,"sourceUrl":"https://github.com/thedotmack/claude-mem/tree/main/plugin/skills/weekly-digests","license":"Apache-2.0","category":"writing","lang":"en","tokens":3439,"stars":0,"calls30d":2,"claimed":false,"visibility":"public","origin":"crawler","version":"0.1.0","createdAt":"2026-08-22","updatedAt":"2026-08-22","files":[],"requires":{"mcp":[],"tools":[]},"safety":{"flags":[],"scannedAt":"2026-08-22","hasScripts":false,"networkEndpoints":[]}}