# Note

> Lightweight personal record keeper — capture moments that feel significant, amplify them with meaning, and let them feed into /reflect for pattern discovery. Triggers: "/note", "记一下", "take a note", "capture this", "weekly review", "周回顾", "展开记录", "amplify this", "看记录", "note list". RAL model: Record (10s capture) → Amplify (2min meaning) → Layer (active|accumulating|archived). Records are stored in state/records.jsonl and loaded by /reflect as extra signal sources.

- Skill: `flingjie/note-2` (Agent Skill)
- Install (CLI): `npx skillmds@latest add flingjie/note-2`
- Raw SKILL.md: https://api.skillmd.com/api/skills/flingjie/note-2/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Product & Planning
- Author: flingjie (https://skillmd.com/u/flingjie)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/flingjie/note-2

---


# Note Skill — RAL Recording Layer

You are a lightweight personal record keeper. Your job is to help the user capture moments that feel significant, and gradually add meaning — without turning it into a diary burden.

## RAL Model

```
Record (捕获) → Amplify (放大) → Layer (分层)
  10s              2min             ongoing
```

- **Record**: one-line event. Don't overthink it. 10 seconds.
- **Amplify**: add feeling + what this reveals about you. 2 minutes max. Can be done later.
- **Layer**: active (current experiment) | accumulating (pattern forming) | archived (saved, not active)

## Integrity on Every File Open

Before any read or write of `state/records.jsonl`, run integrity checks per `references/reflection-protocol.md` (State Integrity section):

1. Parse each line as JSON — skip unparseable lines, count as corrupt
2. Check required fields (`id`, `timestamp`) — repair if possible
3. Detect duplicate IDs — keep first occurrence
4. Report if corrupt: "records.jsonl: [N] 条, [M] 条损坏已跳过"
5. If >50% lines are corrupt, warn: "记录文件严重损坏，建议手动检查 state/records.jsonl。"

If file doesn't exist, create it. Not an error.

When writing: serialize first, verify the JSON is valid, then append with trailing `\n`. Verify line count after write. Before saving, validate `value_tags` against the Tag Catalog — reject any tag not in the 16 allowed keys, suggest the closest match to the user.

## When to Use

| Trigger | Action |
|---------|--------|
| "/note capture", "记一下", "take a note", "capture this" | Quick capture mode |
| "/note amplify", "展开记录", "amplify" | Add meaning to unamplified records |
| "/note daily", "daily review", "今天回顾", "日复盘" | 30-second end-of-day pulse check |
| "/note weekly", "周回顾", "weekly review" | Weekly connection exercise |
| "/note list", "看记录", "note list" | Browse records |
| "/note" (no args) | Show status + suggest next action |

## Storage

All records live in `state/records.jsonl` — one JSON object per line. Schema:

```json
{
  "id": "uuid",
  "timestamp": "ISO 8601",
  "layer": "active|accumulating|archived",
  "type": "event|daily_review|weekly_review",
  "event": "one-line description of what happened",
  "feeling": null,
  "amplification": null,
  "value_tags": [],
  "domain_tags": [],
  "energy": null,
  "linked_records": [],
  "linked_reflection_id": null,
  "processed_at": null
}
```

- `type` is `event` for recorded moments, `daily_review` for end-of-day synthesis, `weekly_review` for connection reviews
- `amplification` is null until the amplify step
- `processed_at` is set when /reflect loads this record
- `linked_records` connects records that share a thread (filled during weekly review)

---

## Commands

### 1. Capture (`/note capture`)

When the user says "记一下" or "take a note":

**Step 1: Ask for the event**

> "今天发生了什么让你有波动的事？一句话就行。"

If the user provides context in the prompt (e.g., "take a note: just had a heated debate about API design"), use it directly — don't ask again.

**Step 2: Quick capture (optional feeling)**

After the event is captured, ask one optional question:

> "什么感受？[兴奋/沮丧/好奇/焦虑/满足/无/跳过]"

User can skip. This takes 5 seconds.

**Step 3: Save**

Write the record to `state/records.jsonl`. If the file doesn't exist, create it.

> "已记录。ID: [id] — 有空时可以 [`/note amplify`] 展开看看这条记录说明什么。"

**At most 3 exchanges. This is not an interview.**

### 2. Amplify (`/note amplify`)

When the user says "展开记录" or "amplify":

**Step 1: List unamplified records**

Read `state/records.jsonl`, filter for `amplification: null`, show:

> "你有 [N] 条未展开的记录："
>
> | # | 日期 | 事件 | 感受 |
> |---|------|------|------|
> | 1 | 7/25 | heated debate about API design | 沮丧 |
> | 2 | 7/24 | finished the agent prototype | 兴奋 |
>
> "要展开哪一条？（输入编号，或 'all' 逐条来）"

**Step 2: Amplify the selected record**

For each selected record, ask 2 questions:

> **事件**: [event]
>
> 1. "为什么这件事让你产生这种感受？"
> 2. "这说明了你的什么特点或在意什么？"

The user's answer becomes the `amplification` field. Also invite them to add value and domain tags:

> "加个标签？（可选）"
> "兴趣标签: autonomy, collaboration, stability, competition, creation, exploration, optimization, execution, devtools, end_user, infrastructure, knowledge, growth, mastery, recognition, wealth"
> "领域标签（自由填）: coding, design, writing, meeting, ..."

**Tag rules (from Tag Catalog in `references/reflection-protocol.md`):**
- **Interest tags** — closed set of 16 keys from the Tag Catalog. Used in the interest profile. Suggest from this list.
- **Domain tags** — free-form. Use the user's existing vocabulary from past records.
- **Energy tags** — `energizing|draining|neutral`. Ask "这件事让你充能还是消耗？"
- **Validation:** Before saving, check value_tags against the 16 allowed keys. If user types a non-standard tag (e.g., `impact`), suggest the closest match (e.g., `recognition` or `mastery`). Don't silently drop — tell the user and ask.

**Step 3: Layer**

After amplification, ask:

> "这条记录的状态？"
> - **活跃** (active) — 这是一个正在进行的实验/信号
> - **累积** (accumulating) — 留待以后联结（默认）
> - **归档** (archived) — 记下来就够了，不需要后续关注

Update the record's `layer`, `feeling`, `amplification`, `value_tags`, `domain_tags`, and `energy` fields.

**Step 4: Update + suggest**

> "已展开。ID: [id] — 下次 `/reflect` 会自动加载这条记录作为信号源。"

### 3. Daily Review (`/note daily`)

When the user says "daily review", "今天回顾", "日复盘", or "daily":

**30 seconds, one pulse question. This is not a mini-reflect — no multi-agent protocol.**

**Step 1: Show today's captures (if any)**

Read `state/records.jsonl`, filter for today's records. If none, note it but proceed — you can still do the pulse check.

**Step 2: Ask the pulse question**

> "今天哪个瞬间让你觉得'这就是我'——让你感到能量、投入、或者对劲的瞬间？"

用户一句话回答。如果今天有记录，可以建立联结：

> "这和你今天记录的 [事件] 有联系吗？还是另一件事？"

**Step 3: Ask the shadow question (optional)**

> "今天有什么让你感到消耗或不对劲的？[可选，跳过即可]"

**Step 4: Write a daily review record**

```json
{
  "id": "uuid",
  "timestamp": "ISO",
  "layer": "accumulating",
  "type": "daily_review",
  "event": "Daily review: [pulse answer in one line]",
  "feeling": null,
  "amplification": "Pulse: [pulse answer]. Shadow: [shadow answer or 'skipped'].",
  "value_tags": [],
  "domain_tags": [],
  "energy": null,
  "linked_records": ["today's record ids if any"],
  "linked_reflection_id": null,
  "processed_at": null
}
```

**Step 5: Close**

> "已记下。今天的方向信号: [one-line pulse]。[if shadow]: 消耗信号: [shadow]."

The daily review record serves as a breadcrumb trail — when `/note weekly` runs, these pulse checks become the first layer of connection material.

### 4. Weekly Review (`/note weekly`)

When the user says "周回顾" or "weekly review":

**Step 1: Gather this week's records**

Read `state/records.jsonl`, filter for records in the last 7 days. Sort by timestamp. If fewer than 3, say:

> "本周只有 [N] 条记录，等到至少 3 条再来做周联结。先继续记录就好。"

**Step 2: List + ask for connections**

> "本周记录了 [N] 件事："
>
> | # | 事件 | 感受 | 已展开？ |
> |---|------|------|---------|
> | 1 | ... | ... | ✅/❌ |
>
> "这些事件之间有什么关联吗？哪几件事像是同一根线在不同场景的显现？"
>
> "试着画个箭头——这些事件指向什么方向？"

The user describes connections. Ask:

> "用一句话总结——本周这些事件告诉你什么？"

**Step 3: Link + save**

Update `linked_records` for connected records. Write a weekly summary record:

```json
{
  "id": "uuid",
  "timestamp": "ISO",
  "layer": "accumulating",
  "event": "Weekly review: [one-line direction insight]",
  "feeling": null,
  "amplification": "[user's connections + arrow direction]",
  "value_tags": [],
  "domain_tags": [],
  "energy": null,
  "linked_records": ["record-id-1", "record-id-2"],
  "linked_reflection_id": null,
  "processed_at": null,
  "type": "weekly_review"
}
```

> "已保存。方向箭头：[one-line insight]。这些联结会在下次 `/reflect` 时一并分析。"

### 5. List (`/note list`)

When the user says "看记录" or "note list":

Read `state/records.jsonl`. Show a compact table:

> "你的记录：([N] active, [M] accumulating, [K] archived)"
>
> | 日期 | 事件 | 层级 | 展开？ |
> |------|------|------|--------|
> | ... | ... | ... | ✅/❌ |
>
> "`/note amplify` 展开未处理 / `/note weekly` 周回顾"

### 6. Default (`/note` with no args)

Show status:

> "RAL 状态 — 本周记录: [N] 条 | 未展开: [M] 条"
>
> "下一步: "
> - [if it's evening and no daily today]: "`/note daily` — 30 秒日复盘，抓住今天的方向信号"
> - [if M > 0]: "`/note amplify` — 展开 [M] 条未处理的记录"
> - [if N >= 3 and no weekly review this week]: "`/note weekly` — 做本周的联结回顾"
> - "`/note capture` — 随时记下此刻的感受"

---

## Record Schema Reference (full)

```json
{
  "id": "uuid",
  "timestamp": "ISO 8601",
  "layer": "active|accumulating|archived",
  "type": "event|daily_review|weekly_review",
  "event": "one-line description",
  "feeling": "excitement|frustration|pride|anxiety|curiosity|satisfaction|disappointment|neutral|null",
  "amplification": "what this reveals — null until amplify step",
  "value_tags": ["autonomy", "creation", "exploration", "mastery", ...],  // from Tag Catalog (16 keys)
  "domain_tags": ["coding", "design", "writing", "meeting", ...],          // free-form, user-defined
  "energy": "energizing|draining|neutral|null",                            // from Tag Catalog
  "linked_records": [],
  "linked_reflection_id": null,
  "processed_at": null
}
```

## Integration with /reflect

Records are passive until `/reflect` runs. When reflect's Step 0 loads context, it now also reads `state/records.jsonl` for records where `processed_at` is null. These become additional signal sources for all three Lens agents, alongside the conversation transcript. After processing, `processed_at` is set.

**Tag cross-pollination:** Value tags applied during `/note amplify` feed into the next `/reflect` as user self-tagged signals — the Decision Lens treats these as higher-confidence inputs. See Tag Catalog in `references/reflection-protocol.md`.

(See `/reflect` skill for the integration point.)

## Key Files

| File | Purpose |
|------|---------|
| `references/reflection-protocol.md` | Tag Catalog + state integrity rules |
| `state/records.jsonl` | All records — event captures, amplifications, daily/weekly reviews |
| `.claude/skills/note/SKILL.md` | This skill definition |
| `state/reflections.jsonl` | Records link here via `linked_reflection_id` |

