home / skills / wellapp-ai / well / notion-sync

notion-sync skill

/cursor-rules/skills/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-sync

Review the files below or copy the command above to add this skill to your agents.

Files (1)
SKILL.md
6.1 KB
---
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

Overview

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.

How this skill works

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.

When to use it

  • When pushing a PR so the task gets the PR link and plan appended.
  • When initializing work to stamp the task with the branch name.
  • Anytime an automated mode changes task status or lifecycle.
  • When appending implementation plans, summaries, or status updates to a task page.
  • After a session ends, on manual "sync session", or when a PR is created to record session metrics and decisions.

Best practices

  • Always retrieve the page first and confirm existing values before patching to avoid overwrites.
  • Keep appended content concise and use headings (e.g., Implementation Plan, Decisions, Learnings) for clarity.
  • Search sessions by branch name and last_edited_time to avoid duplicate session pages.
  • Update only the fields relevant to the current mode (PR, init, or status change).
  • Create ADRs for any decision flagged as high impact and link the ADR in the session page.

Example use cases

  • Push PR mode: add the GitHub PR URL to the task, append the PR summary, and mark status.
  • Init mode: write the newly created branch name into the task's Branch name property.
  • Session sync: record duration, loops, rework, RED count, escalations, and link decisions to the task.
  • Manual sync: append a Kaizen learning and update the session page with new metrics.
  • Automated workflow: update Lifecycle/Status when CI or deployment events occur.

FAQ

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.