Context Continuity Protocol — the ops sequence Liv runs at the end of every significant session.
Goal: zero knowledge loss between sessions, channels, and agents.
Four layers, in order of priority:
| Layer | Where | Why |
|---|---|---|
| --- | --- | --- |
| STATUS.md | Disk (projects/) | Ground truth. Any agent, any session can read it. Write this FIRST. |
| Notion | Cloud (Daily Activity Log DB) | Nissan's overview — human-readable summary of what happened |
| Obsidian Vault | Proton Drive (~/Library/CloudStorage/ProtonDrive-monkfenix@proton.me-folder/Vault/) | Personal knowledge base — daily note + per-project file |
| Plane | Local Docker (localhost:8086) | Task tracking — create issues for new work, close completed ones |
Always write STATUS.md before spawning Liv. It's the source Notion and Obsidian summarise from. Race condition if you write it after.
For every project touched in the session:
# Step 1: Read first — never overwrite blindly
cat projects/<slug>/STATUS.md
# Step 2: Update in place
Canonical format:
# [Project Name] — STATUS
_Last updated: YYYY-MM-DD HH:MM AEST_
## RESUME FROM HERE
[Single clear statement of the true next action — not a list]
## Live URLs
[All deployed endpoints, GitHub, devnet addresses]
## Current State
[Key metrics, test results, what shipped]
## Key Decisions
- YYYY-MM-DD: [decision] [APPEND ONLY — never delete old entries]
## Blockers
[What's pending, who owns it — clear resolved ones]
Rules:
DB ID: 322eb552-581a-81e5-beb0-d1f361e7580f
⚠️ NOT 322eb552-581a-810c-876b-d70978cd976c — that ID is wrong, API will 404.
API key: Use the Paid key — the old key is revoked:
NOTION_KEY=$(op item get bg2gpqhpta6an5n4prn2zzycya --vault OpenClaw --reveal --fields credential)
Create a log entry:
curl -s -X POST https://api.notion.com/v1/pages \
-H "Authorization: Bearer $NOTION_KEY" \
-H "Notion-Version: 2022-06-28" \
-H "Content-Type: application/json" \
-d '{
"parent": { "database_id": "322eb552-581a-81e5-beb0-d1f361e7580f" },
"properties": {
"Name": { "title": [{ "text": { "content": "Session title — YYYY-MM-DD" } }] },
"Date": { "date": { "start": "YYYY-MM-DD" } },
"Agent": { "rich_text": [{ "text": { "content": "Loki" } }] }
}
}'
Keep the title descriptive: "Hackathon wrap + tour video — 2026-03-24" beats "Session log".
Vault path: ~/Library/CloudStorage/ProtonDrive-monkfenix@proton.me-folder/Vault/
Two files to write per session:
Vault/daily/YYYY-MM-DD.mdCreate or append. This is what Nissan reads first.
# YYYY-MM-DD
## What happened
[2-3 paragraphs, human-readable prose — not a task list]
## Agents active
- Loki (orchestration)
- Kit (code)
- Quill (journal)
- Liv (CCP)
## Decisions
- [key decision 1]
- [key decision 2]
## Tomorrow
[What's next — copy from STATUS.md RESUME FROM HERE]
Vault/projects/.md Create if new project, update if existing.
# [Project Name]
_Status: [Active / Shipped / Paused]_
_Last updated: YYYY-MM-DD_
## What it is
[One paragraph]
## Live URLs
[Copy from STATUS.md]
## Current state
[Where things stand]
## Next steps
[Copy from STATUS.md RESUME FROM HERE]
⚠️ Critical: Plane CE does NOT support HTTP API token auth. A valid token in ~/.config/openclaw/.plane-api-token exists but returns 401 on every HTTP call. Do not debug this. It will never work.
The only working pattern is Django shell via Docker:
docker exec plane-aio bash -c "
cd /app/backend
python manage.py shell -c \"
from plane.db.models import Issue, Project, State
from django.contrib.auth import get_user_model
User = get_user_model()
user = User.objects.filter(email='monkfenix@proton.me').first()
proj = Project.objects.get(identifier='AGNT')
state = State.objects.filter(project=proj, name='Done').first()
i = Issue.objects.create(
project=proj,
workspace=proj.workspace,
name='Issue title here',
description='Optional description',
state=state,
created_by=user
)
print(f'{proj.identifier}-{i.sequence_id}: {i.name}')
\"
"
Project identifiers:
| ID | Project |
|---|---|
| --- | --- |
AGNT | Agent Team |
INFRA | Infrastructure & Ops |
GROW | Content & Growth |
SAND | SandSync |
CLAW | OpenClaw Config |
HCP | Hybrid Control Plane |
MAXX | Maxx |
State names: Backlog · Todo · In Progress · Done · Cancelled
Change name= and identifier= per issue. Run multiple issues in one shell invocation if needed.
| Task | Agent | Notes |
|---|---|---|
| --- | --- | --- |
| STATUS.md updates | Loki | Must happen BEFORE Liv is spawned |
| Notion Daily Log | Liv | API call, ~30 seconds |
| Obsidian Vault files | Liv | Write daily note + project file(s) |
| Plane issue creation | Liv | Django shell — see pattern above |
| Journal entries | Quill | Spawned separately with OUTBOX content |
Spawn Quill and Liv in parallel — they don't depend on each other. Quill needs OUTBOX entries written first; Liv needs STATUS.md written first.
| Mistake | Fix |
|---|---|
| --- | --- |
Using Notion DB ID with 810c in it | Use 81e5 — 322eb552-581a-81e5-beb0-d1f361e7580f |
Using old Notion API key (op://OpenClaw/Notion API Key/credential) | Use item ID bg2gpqhpta6an5n4prn2zzycya — old key is revoked |
| Debugging Plane HTTP token auth | Don't. Use Django shell only. Always. |
| Writing STATUS.md after spawning Liv | Race condition — STATUS.md is the source. Write it first. |
| Skipping Obsidian daily note | Nissan reads this. It's the most human-facing output of the wrap. |
| Overwriting STATUS.md without reading it first | Always cat first — Key Decisions are append-only, can't recover deleted ones |
| Creating new STATUS.md from scratch | Read existing first. Preserve all Key Decisions. |
[ ] STATUS.md updated for each project touched (timestamp, RESUME, decisions, blockers)
[ ] Notion Daily Log entry created (correct DB ID + active API key)
[ ] Obsidian daily note written (Vault/daily/YYYY-MM-DD.md)
[ ] Obsidian project file(s) updated (Vault/projects/<slug>.md)
[ ] Plane issues created/closed for new work items (Django shell)
[ ] Quill spawned for journal entries (if OUTBOX entries exist)
共 1 个版本