home / skills / wellapp-ai / well / notion-sync
This skill standardizes Notion task updates across modes, syncing PR links, branch names, statuses, and optional content append.
npx playbooks add skill wellapp-ai/well --skill notion-syncReview the files below or copy the command above to add this skill to your agents.
---
name: notion-sync
description: Standardize Notion task updates across all modes
---
# Notion Sync Skill
Standardize how Notion tasks are updated across all modes.
## When to Use
- Push PR mode: update PR link and append plan
- Init mode: update branch name
- Any mode updating task status
- Appending content to task pages
## Phases
### Phase 1: Retrieve Task Page
Fetch current task state:
```
API-retrieve-a-page:
page_id: [task-page-id]
```
Verify the page exists and note current field values.
### Phase 2: Update Standard Fields
Update properties based on context:
**Available fields:**
| Field | Type | When to Update |
|-------|------|----------------|
| Github PR link | url | On PR creation |
| Branch name | rich_text | On branch creation |
| Lifecycle/Status | select | On state changes |
**API call:**
```
API-patch-page:
page_id: [task-page-id]
properties:
"Github PR link": { url: "[PR-URL]" }
"Branch name": { rich_text: [{ text: { content: "[branch-name]" }}]}
```
### Phase 3: Append Content (Optional)
If content needs to be added to the page body:
**Get existing blocks:**
```
API-get-block-children:
block_id: [page-id]
```
**Append new content:**
```
API-patch-block-children:
block_id: [page-id]
children: [
{
"type": "heading_2",
"heading_2": { "rich_text": [{ "text": { "content": "Implementation Plan" }}]}
},
{
"type": "paragraph",
"paragraph": { "rich_text": [{ "text": { "content": "[plan-content]" }}]}
}
]
```
**Content types to append:**
- Implementation plans (from Plan mode)
- PR summaries (from Push PR mode)
- Status updates
### Phase 4: Confirm Sync
Verify the update was successful:
```
API-retrieve-a-page:
page_id: [task-page-id]
```
Check that updated fields reflect new values.
---
## Phase 5: Session Journal Sync (NEW)
Sync session metrics and decisions to Session Journal database.
### When to Run
- After PR is created (via push-pr.mdc)
- On manual "sync session" command
- On session abandon
### 5.1: Gather Session Data
Collect from `session-status` skill:
- Duration, loops, rework, waiting, RED count, escalations
Collect from `decision-capture` skill:
- Decisions made this session (KO, significant OK)
- Learnings captured (Kaizen/Hansei)
### 5.2: Check for Existing Session
```
Notion MCP: API-post-search
query: "[branch-name]"
filter:
property: "object"
value: "page"
sort:
property: "last_edited_time"
direction: "descending"
```
### 5.3: Create or Update Session Page
**If new session:**
```
Notion MCP: API-post-page
parent: { database_id: "[SESSION_JOURNAL_DB_ID]" }
properties:
Title: { title: [{ text: { content: "[Feature] - [Date]" }}]}
Task: { relation: [{ id: "[kanban_task_id]" }]}
Date: { date: { start: "[session_date]" }}
Duration: { number: [total_minutes] }
Phase Reached: { select: { name: "[phase]" }}
Outcome: { select: { name: "[outcome]" }}
Loops: { number: [total_loops] }
Rework: { number: [rework_count] }
Waiting: { number: [waiting_minutes] }
RED Count: { number: [red_count] }
Escalations: { number: [escalation_count] }
Branch: { rich_text: [{ text: { content: "[branch-name]" }}]}
```
**If existing session:**
```
Notion MCP: API-patch-page
page_id: [existing_page_id]
properties:
Duration: { number: [updated_minutes] }
Phase Reached: { select: { name: "[latest_phase]" }}
Outcome: { select: { name: "[outcome]" }}
Loops: { number: [updated_loops] }
... (other updated metrics)
```
### 5.4: Append Decisions and Learnings
```
Notion MCP: API-patch-block-children
block_id: [session_page_id]
children:
- type: heading_2
heading_2: { rich_text: [{ text: { content: "Decisions" }}]}
- type: bulleted_list_item
bulleted_list_item: { rich_text: [{ text: { content: "[KO] [decision 1] - [rationale]" }}]}
- type: bulleted_list_item
bulleted_list_item: { rich_text: [{ text: { content: "[OK] [decision 2] - [rationale]" }}]}
- type: heading_2
heading_2: { rich_text: [{ text: { content: "Learnings" }}]}
- type: bulleted_list_item
bulleted_list_item: { rich_text: [{ text: { content: "[Kaizen] [learning 1]" }}]}
- type: bulleted_list_item
bulleted_list_item: { rich_text: [{ text: { content: "[Hansei] [learning 2]" }}]}
```
### 5.5: Link to Kanban Task
```
Notion MCP: API-patch-page
page_id: [kanban_task_id]
properties:
Session Journal: { relation: [{ id: "[session_page_id]" }]}
```
### 5.6: Create ADR for High-Impact Decisions
If any decision has Impact = HIGH:
1. Create ADR file in `/docs/decisions/`
2. Link ADR URL in Session Journal page
### Session Journal Output
```markdown
## Session Journal Synced
**Session:** [Feature] - [Date]
**Page:** [Notion URL]
**Kanban:** Linked to [Task name]
### Metrics Recorded
- Duration: [N]min
- Loops: [N]
- Rework: [N]
- RED Count: [N]
- Escalations: [N]
### Decisions: [N] captured
### Learnings: [N] captured
[If ADR: ADR-[NNN] created]
**Status:** Sync successful
```
---
## Output
Present sync summary:
```
## Notion Sync Complete
**Task:** [task-title]
**Page ID:** [page-id]
### Updates Applied
- ✅ Github PR link: [url]
- ✅ Branch name: [branch]
- ✅ Content appended: [description]
**Status:** Sync successful
```
---
## Standard Field Reference
**Staffing Database ID:** `256c4d5e-7bea-80ca-ba8d-c0ba0bb881c6`
**Common Properties:**
- `Github PR link` (url) - Link to GitHub PR
- `Branch name` (rich_text) - Git branch name
- `Lifecycle` or `Status` (select) - Task state
- `Assignee` (people) - Task owner
- `Sprint` (relation) - Sprint association
---
## Integration
This skill is invoked by:
- `push-pr.mdc` - Phase 2.2 (Sync Notion) + Phase 4 (Session Journal)
- `init.mdc` - Update branch name
- Any mode needing Notion updates
- Manual "sync session" command
**Notion MCP Tools:**
- `API-retrieve-a-page` - Get task details
- `API-get-block-children` - Get page content
- `API-patch-page` - Update page properties
- `API-patch-block-children` - Add content to page
- `API-post-page` - Create new session entries
- `API-post-search` - Find existing sessions by branch
This skill standardizes how Notion task pages and session journals are updated across automation modes. It ensures PR links, branch names, lifecycle states, and appended content are applied consistently. It also creates or updates session journal entries to capture metrics, decisions, and learnings.
The skill reads the target Notion task page, verifies current property values, and patches the standard fields (Github PR link, Branch name, Lifecycle/Status). If needed, it fetches block children and appends structured content like implementation plans, PR summaries, or status notes. For sessions, it searches for an existing session page by branch, then creates or updates the session entry and appends decisions and learnings, linking back to the kanban task.
How does the skill avoid creating duplicate session pages?
It searches the session journal database by branch name and sorts by last_edited_time; if a match exists it patches that page, otherwise it creates a new one.
What content types are safe to append to pages?
Headings, paragraphs, and bulleted list items are supported for plans, PR summaries, decisions, and learnings.