Doc Sync — Cascading Document Updater
What This Skill Does
Maintains consistency across a documentation ecosystem where one source change (e.g., a new meeting note) should cascade updates to multiple downstream documents (PRD, presentation, project memory).
This is NOT a background watcher. This skill is the Claude-side processor that:
- Reads a sync report or detects changes directly
- Extracts actionable content from new/modified source files
- Proposes specific edits to each downstream target
- Applies changes only after user approval
Prerequisites
Infrastructure (one-time setup)
The persistent detection layer runs outside Claude Code via /pm:sync-init:
| Component | Path | Purpose |
|---|---|---|
| Orchestrator | ~/.claude/scripts/project-sync-orchestrator.sh | Email search + file detection + report generation |
| launchd agent | ~/Library/LaunchAgents/com.claude.project-sync.<name>.plist | Background scheduler (every 2 hours) |
| State dir | ~/.claude/state/<project-name>/ | Logs, timestamps, cached config (outside OneDrive) |
Per-Project Config
Each project needs .sync-watch.json in its root:
json{ "project_name": "My Project", "watch_dirs": ["docs/meeting-notes", "docs/research"], "target_docs": { "tier1": [ { "path": "docs/PRD.html", "name": "Product Requirements", "update_from": ["meeting-notes", "research"], "what": "Requirements, user stories, decisions" } ], "tier2": [ { "path": "docs/presentation.html", "name": "Stakeholder Deck", "update_from": ["meeting-notes"], "what": "Stakeholder updates, timeline changes" } ] }, "ignore_patterns": [".*", "*.tmp", "~$*"], "file_types": [".md", ".html", ".docx", ".xlsx", ".pdf"] }
Invocation
Automatic (via session hook)
When you start a Claude Code session in a watched project with pending changes:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ SYNC WATCHER ► 3 new/modified file(s) detected ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Say "process sync report" to review and apply updates.
Manual
/doc-sync— check for changes now and process/doc-sync path/to/new-file.md— process a specific source fileprocess sync report— process a pending.sync-report.md
Process
Step 1: Detect Changes
If .sync-report.md exists: Read it — it lists all changed files with timestamps.
If no report (manual invocation):
bash!`bash ~/.claude/scripts/project-sync-orchestrator.sh "$(pwd)"`
Then read the generated .sync-report.md (written to project root or ~/.claude/state/<project-name>/sync-report.md).
If a specific file was passed as $ARGUMENTS: Use that file as the sole source.
If no changes detected: Report "All documents are in sync." and stop.
Step 2: Read Source Files
For each new/modified file detected:
- Skip binaries (
.docx,.xlsx,.pptx,.pdf) — note them but don't read. Tell user: "Binary file detected — paste key content or convert to text." - Read text files (
.md,.html) in full - Extract structured data from each:
For each source file, extract: - NEW STAKEHOLDERS: Name, Role, Email, Group - NEW DECISIONS: What was decided, by whom, date, impact - NEW REQUIREMENTS: Functional/non-functional, priority, acceptance criteria - NEW ACTION ITEMS: Owner, deadline, status - NEW ARCHITECTURE: Design changes, module updates, integration changes - NEW RISKS: Description, impact, mitigation - VERSION CHANGES: What changed from previous version
Step 3: Read Config & Map Dependencies
Read .sync-watch.json to determine which target docs need which types of updates.
For each target doc in tier1 and tier2:
- Check if any source file matches its
update_frompatterns - If yes → read the target doc to understand current state
- Identify exactly WHERE in the target doc the new content should go
Step 4: Propose Updates
Present a structured proposal — DO NOT edit anything yet:
markdown## Sync Proposal ### Source: Meeting-Notes-2026-03-17.md **New content extracted:** - 2 new stakeholders (Jane Doe, John Smith) - 1 decision (moved go-live to Q4) - 3 action items ### Updates Needed: **1. PRD.html** (Tier 1) - Section 05 Stakeholders: Add Jane Doe (Tax Director), John Smith (IT Lead) - Section 12 Timeline: Update go-live from Q3 → Q4 - Change log: Add v1.1 entry - [Show exact diff preview for each change] **2. Presentation.html** (Tier 1) - Slide 7 (Team): Add 2 stakeholder cards - Slide 12 (Timeline): Update milestone date - [Show exact diff preview] **3. CLAUDE.local.md** (Tier 1) - Recent Changes: Add dated entry - [Show exact content to append] **4. Stakeholder-Directory.xlsx** (Tier 2) - SKIP — binary file, manual update needed
Step 5: Get Approval
Ask user:
- "Apply all updates?" → proceed with all
- "Apply selectively?" → let user pick which targets
- "Skip for now?" → clean up report, do nothing
- User may also request modifications to the proposal
Step 6: Apply Updates
For each approved target:
- Read the target file (always re-read before editing — it may have changed)
- Apply edits using the Edit tool (not Write — preserve unchanged content)
- Verify the edit was applied correctly
- Log what was changed
Step 7: Clean Up & Update Memory
After all edits applied:
- Delete
.sync-report.md(consumed) - Update
_temp/.last-sync-checktimestamp - Update
CLAUDE.local.mdRecent Changes section with a dated entry summarizing what was synced - Report summary to user:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ DOC SYNC ► COMPLETE ✓ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Source files processed: 3 Documents updated: 4 ✓ PRD.html — 3 edits (stakeholders, timeline, changelog) ✓ Presentation.html — 2 edits (team slide, timeline) ✓ CLAUDE.local.md — 1 edit (recent changes) ⚠ Stakeholder-Directory.xlsx — skipped (binary) Manual follow-up needed: - Update Stakeholder-Directory.xlsx with 2 new contacts
Critical Rules
- NEVER edit without approval. Always show the proposal first. The user must explicitly approve.
- NEVER fabricate content. Only extract what's actually written in source files. If a meeting note doesn't mention a stakeholder's email, don't guess it.
- NEVER overwrite — always append/insert. Use Edit tool with precise
old_stringmatching. Never rewrite entire files. - ALWAYS read target docs before editing. They may have been modified since the report was generated.
- ALWAYS preserve existing formatting. Match the target doc's style (HTML structure, CSS classes, indentation patterns).
- Binary files are report-only. Flag them for manual update, don't attempt to modify.
- Version bumps: If the target doc has a version badge/number, increment it and add a changelog entry.
Adding This to a New Project
- Create
.sync-watch.jsonin the project root (use template above) - Run
/pm:sync-initto set up the launchd cron job - Done — the background orchestrator runs every 2 hours and generates
.sync-report.mdwhen changes are detected
Dependency Graph Pattern
For complex projects, document the update cascade in .sync-watch.json:
Meeting Notes ──→ PRD ──→ PRD Presentation │ │ ├──→ Main Presentation ←──┘ │ └──→ CLAUDE.local.md ←── (all changes)
This ensures that when a meeting note creates a PRD change, and that PRD change should also update the presentation, the full cascade is handled in one sync pass.


