Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when syncing research documents to Notion. Handles Notion synchronization operations including state management and encoding validation.
.claude/skills/bilal140202-notion-sync/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | -15% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 409% | 0% |
| case-04 | ✗→✓ | ▲ Improved | -29% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 33% | 0% |
| case-06 | ✗→✓ | ▲ Improved | -2% | 0% |
This skill provides standardized procedures for synchronizing research documents to Notion, ensuring data integrity and avoiding common pitfalls.
/daily-routine workflowFile: .notion_sync_state.json
Purpose: Tracks which files have been synced to avoid duplicates
Structure:
json{ "research/daily_briefs/Multi_Target_Analysis_20260117.md": { "page_id": "abc123...", "last_synced": "2026-01-17T10:30:00Z" } }
| Script | Purpose | Use Case | |--------|---------|----------| | ops/sync_full_research.py | Full repository sync | Initial setup, major updates | | scripts/sync_to_notion.py | Incremental sync | Daily updates | | scripts/sync_vault.py | Vault-specific sync | Knowledge base updates |
powershell# Ensure documents are clean .bin\python\python.exe ops/lint_reports.py
Why: Notion API rejects malformed Markdown or encoding issues
powershell# Full sync (use sparingly) .bin\python\python.exe ops/sync_full_research.py # Incremental sync (recommended) .bin\python\python.exe scripts/sync_to_notion.py
.notion_sync_state.json updatedSymptom: Notion pages show garbled text
Root cause: File not UTF-8 encoded
Solution:
powershell# Fix encoding first .bin\python\python.exe ops/lint_reports.py # Then retry sync .bin\python\python.exe scripts/sync_to_notion.py
Symptom: Same report appears multiple times in Notion
Root cause: Sync state file corrupted or missing
Solution:
powershell# Check sync state cat .notion_sync_state.json # If corrupted, backup and regenerate Copy-Item .notion_sync_state.json .notion_sync_state.json.backup # Then run full sync
Symptom: 429 Too Many Requests error
Root cause: Notion API rate limits exceeded
Solution:
Symptom: 401 Unauthorized error
Root cause: Invalid or expired Notion API token
Solution:
NOTION_API_KEY environment variableQ: Should I run full sync or incremental sync?
Q: When should I sync?
/daily-routine completion (Phase 6)Q: What if sync fails?
lint_reports.py to fix encoding.notion_sync_state.json integrityAlways run quality checks before syncing:
powershell.bin\python\python.exe ops/lint_reports.py
Prefer incremental over full sync to:
Periodically check .notion_sync_state.json:
powershell.bin\python\python.exe ops/diagnose_notion.py
What it checks:
Scenario 1: Sync state corrupted
powershell# Backup current state Copy-Item .notion_sync_state.json .notion_sync_state.json.backup # Clear state (forces full resync) Remove-Item .notion_sync_state.json # Run full sync .bin\python\python.exe ops/sync_full_research.py
Scenario 2: Partial sync failure
powershell# Identify failed files from error log # Manually fix those files # Retry incremental sync .bin\python\python.exe scripts/sync_to_notion.py
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 12,305 | 4,055 | -67% | 1 | 1 | 0% | 2,193 | 1,875 | -15% | 0 | 0 | — |
case-02 | fail→fail | 16,298 | 7,307 | -55% | 1 | 1 | 0% | 2,539 | 1,804 | -29% | 0 | 0 | — |
case-03 | fail→pass | 3,569 | 7,129 | +100% | 1 | 1 | 0% | 494 | 2,514 | +409% | 0 | 0 | — |
case-04 | fail→pass | 16,357 | 3,463 | -79% | 1 | 1 | 0% | 2,798 | 1,983 | -29% | 0 | 0 | — |
case-05 | fail→pass | 8,835 | 2,972 | -66% | 1 | 1 | 0% | 1,405 | 1,871 | +33% | 0 | 0 | — |
case-06 | fail→pass | 14,135 | 4,439 | -69% | 1 | 1 | 0% | 2,210 | 2,174 | -2% | 0 | 0 | — |
case-07 | fail→pass | 36,507 | 5,128 | -86% | 1 | 1 | 0% | 2,658 | 2,270 | -15% | 0 | 0 | — |
case-08 | fail→pass | 9,354 | 3,704 | -60% | 1 | 1 | 0% | 1,546 | 1,899 | +23% | 0 | 0 | — |
case-09 | pass→pass | 12,170 | 4,956 | -59% | 1 | 1 | 0% | 1,756 | 2,101 | +20% | 0 | 0 | — |
case-10 | fail→pass | 15,560 | 2,169 | -86% | 1 | 1 | 0% | 2,378 | 1,705 | -28% | 0 | 0 | — |
case-11 | fail→fail | 20,994 | 5,263 | -75% | 1 | 1 | 0% | 1,727 | 2,336 | +35% | 0 | 0 | — |
case-12 | fail→pass | 14,297 | 7,164 | -50% | 1 | 1 | 0% | 2,128 | 2,640 | +24% | 0 | 0 | — |
case-13 | fail→pass | 7,191 | 2,238 | -69% | 1 | 1 | 0% | 1,057 | 1,748 | +65% | 0 | 0 | — |
case-14 | fail→pass | 13,217 | 1,852 | -86% | 1 | 1 | 0% | 2,226 | 1,627 | -27% | 0 | 0 | — |
case-15 | fail→pass | 6,061 | 1,876 | -69% | 1 | 1 | 0% | 911 | 1,673 | +84% | 0 | 0 | — |
case-16 | fail→pass | 9,945 | 4,157 | -58% | 1 | 1 | 0% | 1,520 | 2,074 | +36% | 0 | 0 | — |
case-17 | pass→pass | 9,765 | 2,859 | -71% | 1 | 1 | 0% | 1,526 | 1,768 | +16% | 0 | 0 | — |
case-18 | pass→pass | 13,292 | 6,477 | -51% | 1 | 1 | 0% | 2,270 | 2,496 | +10% | 0 | 0 | — |
case-19 | pass→pass | 10,589 | 4,093 | -61% | 1 | 1 | 0% | 1,707 | 2,095 | +23% | 0 | 0 | — |
case-20 | pass→fail | 13,214 | 7,331 | -45% | 1 | 1 | 0% | 2,299 | 2,593 | +13% | 0 | 0 | — |
case-21 | pass→pass | 14,760 | 10,093 | -32% | 1 | 1 | 0% | 2,859 | 3,235 | +13% | 0 | 0 | — |
case-22 | pass→pass | 7,257 | 7,111 | -2% | 1 | 1 | 0% | 1,246 | 2,590 | +108% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 21 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +55 percentage points is the difference between those two pass rates over the 21 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.