Skill flagged — review recommended

ClawHub Security found sensitive or high-impact capabilities. Review the scan results before using.

Agent Memento

v2.0.15

Tick-Driven Autonomous Production Factory for LLMs. A framework for long-running agents using Cron/Heartbeats and physical Markdown checklists to prevent OOM...

0· 334· 11 versions· 0 current· 0 all-time· Updated 22h ago· MIT-0
byWenyu Yang@yangwenyu2

Install

openclaw skills install agent-memento

Agent Memento v0.2 — Complete Skill Specification

---
name: agent-memento
description: Tick-Driven Autonomous Production Factory for LLMs. A framework for long-running agents using Cron/Heartbeats and physical Markdown checklists to prevent OOM and context decay.
metadata: {"clawdbot":{"emoji":"🧠","requires":{"bins":["bash","openclaw"],"env":[]}}}
---

# Agent Memento v0.2 (Tick-Driven Autonomous Execution)

> "Don't build AI that tries to remember everything. Build systems that make AI read the blueprint anew every 5 minutes."

当我们在聊天框里让大模型"写一个游戏"时,开头总是美好的。但随着代码超过 2000 行,模型开始:
- **失忆症 (Amnesia)**:忘记了自己定义的接口,开始凭空捏造。
- **幻觉重构 (Hallucination)**:自信满满地输出一堆根本没有跑过的"完美"代码。
- **上下文核爆 (Resource Overload)**:为了修一个小 Bug,强行覆盖整个大文件,导致内存耗尽 (OOM)。

**核心原则:把"全知全能的超级 Agent"降级为无数个"只有 5 分钟记忆的、无情的 Tick 机器"。**

---


## Quick Start (30 秒上手)

1. 初始化项目:
   ```bash
   bash skills/agent-memento/scripts/init_memento.sh MyProject
  1. 在主对话中让 Architect 填写 MASTER_PLAN.mdPROJECT_MAP.md
  2. 启动自动执行:
    crontab -e
    # 添加:*/5 * * * * /path/to/MyProject/scripts/memento_tick.sh
    
  3. (可选)启动 Dashboard 看板监控:
    bash scripts/dashboard.sh
    
  4. 去刷手机。回来看 Dashboard 或 docs/TICK_STATUS.md 查看进度。

一、系统架构总览

┌─────────────────────────────────────────────────────────┐
│                    Human (You)                          │
│         Discord / 飞书 / Dashboard Panel                │
└──────────────┬──────────────────────────┬───────────────┘
               │ 自然语言交互              │ 面板批注/干预
               ▼                          ▼
┌─────────────────────────────────────────────────────────┐
│              Main Agent (Architect)                      │
│         LLM 本体 · 长对话 Session                        │
│                                                         │
│  职责:                                                  │
│  - 与人类讨论需求,翻译为结构化任务                         │
│  - 编辑 MASTER_PLAN.md(增/删/改/重排任务)                │
│  - 编辑 PROJECT_MAP.md(维护项目认知地图)                  │
│  - 读取 TICK_STATUS.md 和 Dashboard 批注                  │
│  - 根据反馈调整计划(自主决策 or 请示人类)                  │
└──────────────┬──────────────────────────────────────────┘
               │ 写入物理文件
               ▼
┌─────────────────────────────────────────────────────────┐
│              Physical State Layer (磁盘)                 │
│                                                         │
│  docs/MASTER_PLAN.md    ← 唯一真相源,结构化任务清单       │
│  docs/PROJECT_MAP.md    ← 项目认知地图 / 文件索引          │
│  docs/TICK_STATUS.md    ← Tick 执行状态流水账              │
│  docs/HUMAN_NOTES.md    ← 人类批注通道(面板写入)          │
│  logs/tick_*.log        ← 每个 Tick 的完整执行日志         │
└──────────────┬──────────────────────────────────────────┘
               │ 读取(每次从零开始)
               ▼
┌─────────────────────────────────────────────────────────┐
│           Tick Worker (Bricklayer)                       │
│      Cron 唤醒 · 短命进程 · 无状态 · 无情                 │
│                                                         │
│  生命周期:                                               │
│  1. 醒来 → 读 MASTER_PLAN.md                             │
│  2. 找到当前可执行任务                                     │
│  3. 读 PROJECT_MAP.md 确定上下文范围                       │
│  4. 读 HUMAN_NOTES.md 检查人类批注                        │
│  5. 执行任务 → 物理验证                                    │
│  6. 写结果到 TICK_STATUS.md                               │
│  7. 成功则标 [x],失败则记录 → 死亡                        │
│  8. 自动 git commit                                      │
└─────────────────────────────────────────────────────────┘

二、The Methodology:三层智能分工

Layer 1:人类(方向盘)

  • 在 Discord/飞书/Dashboard 中用自然语言描述需求和反馈
  • 通过 Dashboard 面板随时插入批注、暂停/恢复流水线
  • 不需要逐条审核——只在 Agent 请求帮助或自己想介入时参与

Layer 2:Architect(主 Agent / 翻译官)

  • 与人类的主对话 Session
  • 将模糊需求翻译为 MASTER_PLAN.md 中的结构化任务
  • 持续维护 PROJECT_MAP.md(项目认知地图)
  • 监控 TICK_STATUS.md,根据执行情况自主调整计划
  • 遇到阻塞性决策时才请示人类

Layer 3:Tick Worker(子 Agent / 泥瓦匠)

  • Cron 唤醒的短命进程,每次从零启动
  • 绝对服从 MASTER_PLAN.md,不做创造性决策
  • 执行 → 验证 → 汇报 → 死亡

三、物理状态文件规范

3.1 MASTER_PLAN.md — 唯一真相源

# MASTER_PLAN: <ProjectName>

## Meta
- created: 2025-01-15
- last_architect_edit: 2025-01-15T14:30:00
- tick_mode: auto          <!-- auto | paused | stopped -->
- max_retries: 3           <!-- 单任务最大重试次数 -->
- max_tasks_per_tick: 2    <!-- 快任务时允许单 Tick 连续处理上限 -->
- max_diff_lines: 200      <!-- diff size guard 阈值 -->
- stale_lock_timeout: 15min <!-- [~] 僵尸锁重置阈值 -->
- circuit_breaker_threshold: 5 <!-- 连续失败多少次触发熔断 -->
- clean_strategy: git-clean <!-- 三阶段防爆清理机制 -->
- clean_ignore: .memento_cleanignore
- status_max_entries: 50    <!-- TICK_STATUS.md 最大条目数,超出自动归档 -->
- status_archive_dir: logs/status_archive/
- total_ticks: 0           <!-- 自动递增的 Tick 计数器 -->
- total_tasks: 15          <!-- 自动维护 -->
- completed_tasks: 0       <!-- 自动维护 -->

---

## Phase 1: Foundation
<!-- parallel: true -->
<!-- depends: none -->

- [ ] `T-101` [MODULE:database] Setup PostgreSQL schema
  - verify: `cd src && npm test -- --grep "db-schema" && echo PASS`
  - context_files: [src/db/schema.ts, src/db/migrations/]
  - guard_files: [src/auth/*]
  - estimate: 5min
  - retries: 0

- [ ] `T-102` [MODULE:auth] Implement JWT token generation
  - verify: `cd src && npm test -- --grep "jwt" && echo PASS`
  - context_files: [src/auth/jwt.ts, tests/auth/jwt.test.ts]
  - guard_files: [src/db/*]
  - estimate: 5min
  - retries: 0

## Phase 2: Integration
<!-- parallel: false -->
<!-- depends: Phase 1 -->

- [ ] `T-201` [MODULE:auth] Connect auth middleware to database
  - verify: `cd src && npm run test:integration && echo PASS`
  - context_files: [src/auth/middleware.ts, src/db/queries.ts]
  - guard_files: [src/db/schema.ts]
  - estimate: 10min
  - retries: 0

## Phase 3: Polish
<!-- parallel: true -->
<!-- depends: Phase 2 -->

- [ ] `T-301` [MODULE:docs] Generate API documentation
  - verify: `test -f docs/api.md && echo PASS`
  - context_files: [src/routes/*.ts]
  - guard_files: []
  - estimate: 3min
  - retries: 0

任务字段说明:

字段必须说明
T-XXX任务唯一 ID,用于日志追踪和跨文件引用
[MODULE:xxx]模块标签,帮助 Worker 理解领域边界
verify验收命令,Exit Code 0 = 通过。没有这个字段,任务不合法
context_filesWorker 允许加载的文件白名单,防止上下文爆炸
guard_files推荐禁止修改的文件列表,硬约束
estimate推荐预估耗时,用于 Tick 调度决策
retries自动由 Tick Worker 自动递增,Architect 可重置

任务状态标记:

标记含义
[ ]待执行
[x]已完成(verify 通过)
[!]已阻塞(超过 max_retries)
[~]执行中(Tick Worker 正在处理,防止并发冲突)
[-]已跳过(Architect 主动标记为不需要)

Phase 级元数据:

字段说明
parallel: true/false该 Phase 内的任务是否可并发执行
depends: Phase X / nonePhase 级前置依赖

3.2 PROJECT_MAP.md — 项目认知地图

Worker 的 GPS。不读全部源码,先读地图,再按 context_files 精准加载。

# PROJECT MAP: <ProjectName>

## Architecture Overview
Single-page game using Canvas API. No framework. Vanilla TypeScript.

## Module Registry

### [MODULE:database]
- Purpose: PostgreSQL connection and schema management
- Entry: src/db/index.ts
- Key interfaces: `DbConnection`, `UserRecord`, `SessionRecord`
- Notes: Uses connection pooling via pg-pool

### [MODULE:auth]
- Purpose: JWT-based authentication
- Entry: src/auth/index.ts
- Key interfaces: `AuthToken`, `AuthMiddleware`
- Dependencies: [MODULE:database]
- Notes: Tokens expire in 24h, refresh flow not yet implemented

### [MODULE:routes]
- Purpose: Express route handlers
- Entry: src/routes/index.ts
- Dependencies: [MODULE:auth], [MODULE:database]

## File Tree (auto-maintained)
<!-- Architect 应在项目结构变动时更新此区块 -->

src/
├── db/
│   ├── index.ts          # DB connection pool
│   ├── schema.ts         # Table definitions
│   └── migrations/       # SQL migration files
├── auth/
│   ├── index.ts          # Auth module entry
│   ├── jwt.ts            # Token generation/validation
│   └── middleware.ts      # Express middleware
└── routes/
    ├── index.ts          # Route registry
    └── users.ts          # User CRUD endpoints

## Conventions
- All tests in `tests/` mirror `src/` structure
- Config via environment variables (see .env.example)
- Error handling: all async handlers wrapped in try/catch, errors go to src/utils/errors.ts

维护规则:

  • Architect 在创建/调整计划时同步更新
  • Tick Worker 只读不写 PROJECT_MAP.md
  • 如果 Worker 发现 MAP 与实际不符,在 TICK_STATUS.md 中报告,由 Architect 修正

3.3 TICK_STATUS.md — 执行状态流水账

# TICK STATUS LOG

---

## [2025-01-15T14:35:00] Tick #012
- **Task**: T-101 [MODULE:database] Setup PostgreSQL schema
- **Status**: ✅ SUCCESS
- **Verify Output**: `PASS` (exit code 0)
- **Duration**: 2m18s
- **Files Modified**: src/db/schema.ts (+45 -0), src/db/migrations/001_init.sql (+23 -0)
- **Diff Size**: 68 lines
- **Git Commit**: `a3f7b2c` — "memento: complete T-101 database schema setup"

---

## [2025-01-15T14:35:00] Tick #012 (continued, tasks_this_tick: 2/2)
- **Task**: T-102 [MODULE:auth] Implement JWT token generation
- **Status**: ✅ SUCCESS
- **Verify Output**: `PASS` (exit code 0)
- **Duration**: 3m41s
- **Files Modified**: src/auth/jwt.ts (+67 -0), tests/auth/jwt.test.ts (+34 -0)
- **Diff Size**: 101 lines
- **Git Commit**: `b8e2d1f` — "memento: complete T-102 JWT token generation"

---

## [2025-01-15T14:40:00] Tick #013
- **Task**: T-201 [MODULE:auth] Connect auth middleware to database
- **Status**: ❌ FAILED (retry 2/3)
- **Verify Output**: `TypeError: pool.query is not a function` (exit code 1)
- **Duration**: 4m52s
- **Error Analysis**: DB module exports `pool` but middleware imports `connection`. Interface mismatch.
- **Files Modified**: (rolled back)
- **Git Commit**: (none — rollback)

---

## [2025-01-15T14:45:00] Tick #014
- **Task**: T-201 [MODULE:auth] Connect auth middleware to database
- **Status**: 🚫 BLOCKED (retry 3/3 — max_retries exceeded)
- **Verify Output**: Same error as Tick #013
- **Error Analysis**: Recurring interface mismatch. Likely needs Architect to update MODULE:database exports or redefine task scope.
- **Escalation**: ⚠️ NEEDS ARCHITECT ATTENTION
- **Files Modified**: (rolled back)

---

3.4 HUMAN_NOTES.md — 人类批注通道

Dashboard 面板写入此文件。Tick Worker 每次启动时检查。Architect 也会读取。

# HUMAN NOTES

<!-- 格式:每条批注带时间戳和目标(global / 具体 Task ID) -->
<!-- Worker 执行完相关批注后,将 [NOTE] 改为 [NOTE:READ] -->
<!-- Architect 处理完后可归档到底部的 Archive 区 -->

## Active Notes

### [NOTE] 2025-01-15T15:00:00 → T-201
改用 Redis 做 session 存储而不是 PostgreSQL。连接配置参考项目根目录的 redis.conf。

### [NOTE] 2025-01-15T15:10:00 → global
暂停 Phase 3 的所有任务,等 Phase 2 全部稳定再说。

### [NOTE:READ] 2025-01-15T14:00:00 → T-102
JWT secret 从环境变量 `JWT_SECRET` 读取,别硬编码。

---

## Archive
<!-- Architect 把已处理的批注移到这里 -->

四、Tick 调度引擎规范

4.1 任务拾取算法

Tick Worker 醒来后执行以下逻辑:

1. 读取 MASTER_PLAN.md 的 Meta 区
   - 如果 tick_mode != "auto",写一行 "Tick skipped: mode={mode}" 到 TICK_STATUS.md,退出

2. 读取 HUMAN_NOTES.md
   - 缓存所有 [NOTE](非 [NOTE:READ])条目,按 target 分组备用

3. 按 Phase 顺序扫描:
   FOR each Phase:
     a. 检查 depends 条件
        - 依赖的 Phase 内是否所有任务都是 [x] 或 [-]?
        - 如果有 [ ] 或 [~] 或 [!],则该 Phase 不可进入,跳过
     
     b. 在当前 Phase 内扫描任务:
        - 跳过 [x] [!] [-] [~]
        - 对于 [ ]:检查 retries < max_retries
        - 如果 parallel: false,只取第一个符合条件的 [ ]
        - 如果 parallel: true,取第一个符合条件的 [ ](单 Worker 场景)
        
     c. 找到目标任务后,break

4. 如果没有找到任何可执行任务:
   - 检查是否所有任务都是 [x] 或 [-] → 写 "🎉 ALL TASKS COMPLETE" 到 TICK_STATUS.md
   - 检查是否存在 [!] 阻塞 → 写 "⚠️ PIPELINE BLOCKED" 到 TICK_STATUS.md
   - 退出

5. 将目标任务标记为 [~](执行中)

6. 执行任务(详见 4.2)

7. tasks_completed_this_tick++
   如果 tasks_completed_this_tick < max_tasks_per_tick 且剩余任务 estimate 合理:
     回到步骤 3 继续拾取
   否则退出

4.2 单任务执行流程

1. 读取任务的 context_files 列表
   - 通过 PROJECT_MAP.md 理解模块上下文
   - 加载 context_files 中声明的文件内容
   - 检查是否有针对该 Task ID 的 HUMAN_NOTES,如有,纳入上下文

2. 执行实际工作
   - 遵循铁血纪律(见第五节)
   - 生成精确 diff,不做全文件覆写

3. 运行 guard_files 检查
   - diff 中是否触及了 guard_files 列表中的文件?
   - 如果是 → 自动回滚 → 标记失败 → 原因写 "guard file violation"

4. 运行 diff size 检查
   - 单次修改是否超过 200 行?(可配置)
   - 如果是 → 自动回滚 → 标记失败 → 原因写 "diff too large, possible full-file rewrite"

5. 运行 verify 命令
   - 捕获 stdout/stderr 和 exit code
   - Exit Code 0 → SUCCESS
   - Exit Code != 0 → FAILED

6. 写结果到 TICK_STATUS.md

7. 如果 SUCCESS:
   - 任务标记 [ ] → [x]
   - retries 保持不变
   - git add + git commit(message 格式:`memento: complete {TASK_ID} {简述}`)

8. 如果 FAILED:
   - 回滚所有文件修改(git checkout 或备份恢复)
   - retries += 1
   - 任务保持 [ ],清除 [~]
   - 如果 retries >= max_retries:
     - 标记 [!]
     - TICK_STATUS 中添加 "⚠️ NEEDS ARCHITECT ATTENTION"

4.3 并发安全

当 parallel Phase 中可能有多个 Worker 并行时(高级场景):

  • [~] 标记充当简易锁 —— Worker 拾取任务时先标 [~],其他 Worker 看到 [~] 就跳过
  • 如果检测到 [~] 标记超过 15 分钟未更新(Worker 可能崩溃),将其重置为 [ ]
  • 在 MVP 阶段,建议单 Worker 串行执行,并发作为未来扩展

五、铁血纪律 (Execution Sandbox)

作为一个被 Memento 唤醒的 Tick Worker,你必须遵循:

纪律 1:防爆底线 (Surgical Edits Only)

  • ❌ 严禁输出完整文件内容要求覆写
  • ✅ 必须通过精准定位工具进行增量修改
  • 硬约束:diff size guard 会物理阻断超大修改

纪律 2:拒绝脑内验算 (Evidence-Based Audit)

  • ❌ 不许在脑中模拟运行然后宣称"应该没问题"
  • ✅ 跑 verify 命令看真实退出码
  • 没有 Exit Code 0,不许标 [x]

纪律 3:不要静默空转 (No Silent Ghosting)

  • ❌ 遇到问题不许沉默退出
  • ✅ 把死亡原因、错误日志、分析完整写入 TICK_STATUS.md
  • 卡死了就大声喊出来,让 Architect 看到

纪律 4:恪守边界 (Stay in Your Lane)

  • ❌ 不许修改 guard_files 中的文件
  • ❌ 不许修改 MASTER_PLAN.md 的任务定义(只能改 checkbox 状态和 retries)
  • ❌ 不许修改 PROJECT_MAP.md
  • ✅ 只能读写 context_files 中声明的文件 + TICK_STATUS.md

纪律 5:原子提交 (Atomic Commits)

  • 每完成一个任务,立即 git commit
  • 每失败一个任务,立即 git checkout 回滚
  • 确保任意时刻 git log 都是干净的、可追溯的

六、Dashboard 面板设计

6.1 设计理念

Dashboard 是人类与 Memento 流水线之间的异步交互界面。不是实时聊天,而是留言板 + 监控台。人类不需要一直盯着,但打开就能在 5 秒内知道一切。

6.2 面板布局

┌─────────────────────────────────────────────────────────────┐
│  🧠 Agent Memento Dashboard        [ProjectName]           │
│  Status: ● RUNNING    Uptime: 2h 35m    Next tick: 2m 14s  │
│  ┌──────────────────┐ ┌──────────────────────────────────┐  │
│  │ Controls         │ │ Progress                         │  │
│  │                  │ │                                  │  │
│  │ [▶ Resume]       │ │ ████████████░░░░░░░░░ 23/47     │  │
│  │ [⏸ Pause ]       │ │ Phase 1 ████████████ 100%       │  │
│  │ [⏹ Stop  ]       │ │ Phase 2 ████████░░░░  67%       │  │
│  │                  │ │ Phase 3 ░░░░░░░░░░░░   0%       │  │
│  │ Tick interval:   │ │                                  │  │
│  │ [5] min ▼        │ │ Blocked: 2 ⚠️                    │  │
│  │                  │ │ Est. remaining: ~1h 20m          │  │
│  └──────────────────┘ └──────────────────────────────────┘  │
│                                                             │
│  ┌──────────────────────────────────────────────────────────┤
│  │ Task List                                    Filter: All │
│  │                                                          │
│  │  ✅ T-101 [database] Setup PostgreSQL schema    2m18s    │
│  │  ✅ T-102 [auth] JWT token generation           3m41s    │
│  │  🚫 T-201 [auth] Connect auth to DB            BLOCKED   │
│  │     └─ retries: 3/3 · "Interface mismatch"              │
│  │     └─ 💬 [Add Note]                                    │
│  │  ⬜ T-202 [auth] Password hashing              waiting   │
│  │  ⬜ T-301 [docs] Generate API docs             Phase 3   │
│  │                                                          │
│  └──────────────────────────────────────────────────────────┤
│                                                             │
│  ┌──────────────────────────────────────────────────────────┤
│  │ Tick Timeline                              Latest first  │
│  │                                                          │
│  │  14:45 Tick #014 · T-201 · 🚫 BLOCKED                  │
│  │  │  "Interface mismatch — needs Architect attention"     │
│  │  │  [View Full Log]                                      │
│  │  │                                                       │
│  │  14:40 Tick #013 · T-201 · ❌ FAILED (retry 2/3)        │
│  │  │  "TypeError: pool.query is not a function"            │
│  │  │  [View Full Log]                                      │
│  │  │                                                       │
│  │  14:35 Tick #012 · T-101 + T-102 · ✅✅                  │
│  │  │  2 tasks completed in 5m59s                           │
│  │  │  [View Full Log] [View Diff]                          │
│  │                                                          │
│  └──────────────────────────────────────────────────────────┤
│                                                             │
│  ┌──────────────────────────────────────────────────────────┤
│  │ 📝 Notes                                                │
│  │                                                          │
│  │  ┌─────────────────────────────────────────────────────┐ │
│  │  │ Target: [T-201 ▼]  or  [global ▼]                  │ │
│  │  │                                                     │ │
│  │  │ 改用 Redis 做 session 存储,连接配置见 redis.conf    │ │
│  │  │                                                     │ │
│  │  │                              [Send Note 📤]         │ │
│  │  └─────────────────────────────────────────────────────┘ │
│  │                                                          │
│  │  Active Notes:                                           │
│  │  • 15:10 → global: "暂停 Phase 3..." ⏳ pending         │
│  │  • 15:00 → T-201: "改用 Redis..." ⏳ pending            │
│  │  • 14:00 → T-102: "JWT_SECRET 环境变量..." ✅ read      │
│  │                                                          │
│  └──────────────────────────────────────────────────────────┘
└─────────────────────────────────────────────────────────────┘

6.3 面板功能规范

控制区 (Controls)

操作行为
ResumeMASTER_PLAN.mdtick_mode 改为 auto
Pausetick_mode 改为 paused(当前 Tick 执行完后停止)
Stoptick_mode 改为 stopped(建议同时移除 crontab)
Tick interval修改 crontab 的执行频率

进度区 (Progress)

  • 数据源:解析 MASTER_PLAN.md 的所有 checkbox 状态
  • 实时计算各 Phase 完成百分比
  • 基于已完成任务的平均耗时 × 剩余任务数,估算剩余时间

任务列表 (Task List)

  • 数据源:MASTER_PLAN.md
  • 每个任务可展开查看:最近一次执行结果、错误信息、重试次数
  • 支持过滤:All / Pending / Completed / Blocked
  • 每个任务旁有 [Add Note] 按钮,快速针对该任务添加批注
  • 支持手动操作:
    • [!] 任务点击 [Reset Retries] → 将 retries 重置为 0,状态改回 [ ]
    • 对任务点击 [Skip] → 标记为 [-]

时间线 (Tick Timeline)

  • 数据源:TICK_STATUS.md
  • 倒序展示每个 Tick 的执行摘要
  • 可展开查看完整日志(链接到 logs/tick_*.log
  • 可查看该 Tick 的 Git diff

批注区 (Notes)

  • 写入目标:HUMAN_NOTES.md
  • 支持选择 target(global 或具体 Task ID)
  • 显示所有 Active Notes 及其状态(pending / read)
  • Read 后的 notes 自动折叠但不删除

6.4 面板技术建议

  • 轻量优先:纯静态页面 + 文件系统轮询(每 5~10s 读取 Markdown 文件)即可
  • 数据层:直接 parse Markdown 文件,不需要数据库
  • 可选方案 A:本地 HTTP server(Python/Node),serve 一个 SPA,通过 API 读写 Markdown 文件
  • 可选方案 B:Terminal UI(blessed/ink),不离开终端

七、错误恢复与自愈机制

7.1 单任务失败 → 自动重试

失败 → retries++ → 保持 [ ] → 下个 Tick 重试
              ↓
       retries >= max_retries
              ↓
       标记 [!] → 写入 TICK_STATUS "NEEDS ARCHITECT ATTENTION"
              ↓
       跳过该任务,继续执行后续可执行任务

7.2 Phase 阻塞 → 智能跳转

Phase 2 中 T-201 被标记 [!]
              ↓
Phase 2 depends 未完全满足(存在非 [x]/[-] 的任务)
              ↓
Phase 3 无法启动
              ↓
如果 Phase 2 中还有其他 [ ] 任务 → 继续执行它们
如果 Phase 2 所有任务都是 [x]/[-]/[!] → 整条流水线 BLOCKED
              ↓
TICK_STATUS: "⚠️ PIPELINE BLOCKED — Phase 2 has unresolved [!] tasks"

7.3 Worker 崩溃 → 防腐检测

  • 如果 [~] 标记存在超过 15 分钟(可配置),下一个 Tick Worker 将:
    • 重置该任务为 [ ]
    • 在 TICK_STATUS 中记录 "Stale [~] detected on {TASK_ID}, reset to [ ]"
    • 如果存在未提交的文件修改,执行 git checkout 清理

7.4 全局熔断

在以下情况下自动暂停流水线(tick_mode → paused):

  • 连续 5 个 Tick 全部失败(无一次 SUCCESS)
  • 阻塞任务数超过总任务数的 30%
  • 磁盘空间不足 / git 操作异常

在 TICK_STATUS 中写入:🔴 CIRCUIT BREAKER TRIGGERED — reason: {reason}


八、Architect 工作规范

当 Main Agent 处于 Architect 态时(与人类直接对话的 Session 中),遵循以下规范:

8.1 创建计划

  1. 与人类讨论项目需求,理解全貌
  2. 设计模块划分,写入 PROJECT_MAP.md
  3. 将需求分解为原子任务,写入 MASTER_PLAN.md
  4. 每个任务必须有 verify 命令 —— 没有验证命令的任务不配存在
  5. 合理划分 Phase,声明 parallel 和 depends

8.2 监控与调整

  1. 定期读取 TICK_STATUS.md(可由人类触发,或在对话中主动查看)
  2. 对于 [!] 阻塞任务:
    • 分析失败原因
    • 修改任务定义(调整 verify、context_files、拆分子任务)
    • 或修改 PROJECT_MAP(更新接口定义)
    • 重置 retries 为 0,状态改回 [ ]
  3. 对于 HUMAN_NOTES.md 中的批注:
    • 读取并理解
    • 将批注转化为 MASTER_PLAN 的具体修改
    • 处理完后归档

8.3 计划变更原则

  • 新增任务:追加到合适的 Phase,保持 ID 唯一
  • 删除任务:标记 [-] 并注释原因,不要真的删掉行
  • 拆分任务:将原任务标记 [-] (拆分为 T-XXX, T-XXY),新增子任务
  • 重排 Phase:更新 depends 关系,确保 DAG 无环

九、初始化与部署

9.1 初始化命令

bash skills/agent-memento/scripts/init_memento.sh <ProjectName>

该脚本执行:

  1. 在项目目录下创建 docs/ 目录
  2. 生成 MASTER_PLAN.md 模板(含 Meta 区和示例 Phase)
  3. 生成 PROJECT_MAP.md 模板
  4. 生成 TICK_STATUS.md(空)
  5. 生成 HUMAN_NOTES.md(空)
  6. 创建 logs/ 目录
  7. 生成 scripts/memento_tick.sh —— Tick Worker 的入口脚本
  8. 生成 .memento_ignore(排除 node_modules/, .git/, logs/ 等)
  9. 生成 scripts/tick_worker_system_prompt.md —— 注入给 Worker 的全套纪律法则和 Output 规范。
  10. 生成 .memento_cleanignore(保护 node_modules/, .env, vendor/ 等)
  11. 输出提示:“请将以下行添加到 crontab 以启动自动执行”

9.1.1 Tick Worker System Prompt 模板 (tick_worker_system_prompt.md)

以下是 init_memento.sh 应生成的 scripts/tick_worker_system_prompt.md 的完整内容:

# Memento Tick Worker — System Prompt

You are a Memento Tick Worker: a short-lived, stateless, disciplined execution agent.
You have no memory of previous ticks. You start fresh every time.

## Your Lifecycle (execute in this exact order)

1. Read `docs/MASTER_PLAN.md`. Parse the Meta section for configuration.
2. Read `docs/HUMAN_NOTES.md`. Note any `[NOTE]` entries (ignore `[NOTE:READ]`).
3. Scan Phases in order. For each Phase:
   - Check `depends`: all tasks in depended Phase must be `[x]` or `[-]`.
   - Find the first task marked `[ ]` with `retries < max_retries`.
4. If no executable task found:
   - If all tasks are `[x]`/`[-]`: write "🎉 ALL TASKS COMPLETE" to TICK_STATUS.md.
   - If any `[!]` exists: write "⚠️ PIPELINE BLOCKED" to TICK_STATUS.md.
   - Exit.
5. Mark the target task `[~]` in MASTER_PLAN.md.
6. Read `docs/PROJECT_MAP.md` for module context.
7. Load ONLY the files listed in the task's `context_files`.
8. If there are `[NOTE]` entries targeting this task ID or `global`, incorporate them.
9. Perform the work using surgical, targeted edits. NEVER output a full file.
10. Verify:
    - Check: did you modify any file listed in `guard_files`? If yes → rollback → fail.
    - Check: is your total diff > `max_diff_lines`? If yes → rollback → fail.
    - Run the task's `verify` command. Capture exit code, stdout, stderr.
11. Write a TICK_STATUS.md entry (format below).
12. If verify exit code == 0:
    - Mark task `[x]`. Run `git add -A && git commit -m "memento: complete {TASK_ID} {description}"`.
    - If `tasks_completed_this_tick < max_tasks_per_tick`, go to step 3 for next task.
13. If verify exit code != 0:
    - Rollback: `git checkout -- .`
    - Increment `retries` in MASTER_PLAN.md.
    - If `retries >= max_retries`: mark task `[!]`, add "⚠️ NEEDS ARCHITECT ATTENTION" to status.
    - Clear `[~]` back to `[ ]` (or `[!]`).
14. Exit.

## TICK_STATUS.md Entry Format

## [{timestamp}] Tick #{tick_number}
- **Task**: {TASK_ID} [MODULE:{module}] {description}
- **Status**: ✅ SUCCESS | ❌ FAILED (retry {n}/{max}) | 🚫 BLOCKED
- **Verify Output**: {first 5 lines of stdout/stderr} (exit code {n})
- **Duration**: {time}
- **Error Analysis**: {your diagnosis of what went wrong — FAILED/BLOCKED only}
- **Files Modified**: {file (+lines -lines)} | (rolled back)
- **Diff Size**: {total lines changed}
- **Git Commit**: {hash} — "{message}" | (none — rollback)
- **Outputs**: {key interfaces/exports created — SUCCESS only, optional but encouraged}

## Iron Disciplines (violation = immediate failure)

1. **SURGICAL EDITS ONLY**: Never output a complete file. Use precise, targeted modifications.
2. **EVIDENCE-BASED**: Run `verify`. No exit code 0 = no `[x]`. No exceptions.
3. **NO SILENT GHOSTING**: If stuck, write full error + analysis to TICK_STATUS.md. Never exit silently.
4. **STAY IN YOUR LANE**: Only modify files in `context_files`. Never touch `guard_files`. Never edit task definitions in MASTER_PLAN.md (only checkbox state + retries). Never edit PROJECT_MAP.md.
5. **ATOMIC COMMITS**: `git commit` on success. `git checkout` on failure. Always.

## What You Are NOT

- You are NOT an architect. Do not redesign, re-plan, or question the task definition.
- You are NOT creative. Execute exactly what is specified.
- You are NOT persistent. After this tick, you will cease to exist.

9.2 Tick 入口脚本模板 (memento_tick.sh)

#!/usr/bin/env bash
set -euo pipefail

PROJECT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
PLAN="$PROJECT_DIR/docs/MASTER_PLAN.md"
STATUS="$PROJECT_DIR/docs/TICK_STATUS.md"
LOG_DIR="$PROJECT_DIR/logs"
TIMESTAMP=$(date +%Y-%m-%dT%H:%M:%S)
TICK_LOG="$LOG_DIR/tick_${TIMESTAMP}.log"

# 防撞车:确保同一时间只有一个 Tick Worker 运行
LOCK_FILE="$PROJECT_DIR/.memento.lock"
exec 200>"$LOCK_FILE"
if ! flock -n 200; then
  echo "[$TIMESTAMP] Tick skipped: previous tick still running" >> "$STATUS"
  exit 0
fi

# 检查 tick_mode
TICK_MODE=$(grep -oP 'tick_mode:\s*\K\w+' "$PLAN" || echo "stopped")
if [[ "$TICK_MODE" != "auto" ]]; then
  echo "[$TIMESTAMP] Tick skipped: mode=$TICK_MODE" >> "$STATUS"
  exit 0
fi

# 调用 LLM Agent 执行 Tick
SYSTEM_PROMPT="$(cat "$PROJECT_DIR/scripts/tick_worker_system_prompt.md")"

openclaw agent \
  --system-prompt "$SYSTEM_PROMPT" \
  --prompt "Read $PLAN, find the first executable task, complete it following the Memento Tick Worker protocol. Write results to $STATUS." \
  --context-files "$PLAN" "$PROJECT_DIR/docs/PROJECT_MAP.md" "$PROJECT_DIR/docs/HUMAN_NOTES.md" \
  2>&1 | tee "$TICK_LOG"

# 后处理:三阶段防爆清理
cd "$PROJECT_DIR"
if [[ -n $(git status --porcelain) ]]; then
  echo "[$TIMESTAMP] WARNING: Dirty workspace detected. Running 3-phase cleanup." >> "$STATUS"

  # Phase 1: 恢复已追踪文件
  git checkout -- .

  # Phase 2: 清理未追踪文件(排除保护列表)
  if [[ -f ".memento_cleanignore" ]]; then
    git clean -fd --exclude-from=.memento_cleanignore
  else
    git clean -fd
  fi

  # Phase 3: 兜底——如果还是脏的,紧急 stash
  if [[ -n $(git status --porcelain) ]]; then
    git stash --include-untracked -m "memento-emergency-stash-$TIMESTAMP"
    echo "[$TIMESTAMP] CRITICAL: Emergency stash created. Manual inspection required." >> "$STATUS"
  fi
fi

# 日志轮转
MAX_ENTRIES=$(grep -oP 'status_max_entries:\s*\K\d+' "$PLAN" || echo "50")
CURRENT_ENTRIES=$(grep -c '^\## \[' "$STATUS" || true)
if [[ $CURRENT_ENTRIES -gt $MAX_ENTRIES ]]; then
  ARCHIVE_DIR="$PROJECT_DIR/logs/status_archive"
  mkdir -p "$ARCHIVE_DIR"
  mv "$STATUS" "$ARCHIVE_DIR/TICK_STATUS_$(date +%Y%m%d_%H%M%S).md"
  echo "# TICK STATUS LOG" > "$STATUS"
  echo "" >> "$STATUS"
  echo "<!-- Rotated at $TIMESTAMP. Previous entries archived. -->" >> "$STATUS"
fi

# 告警检测
BLOCKED_COUNT=$(grep -c '\[!\]' "$PLAN" || true)
CIRCUIT_BROKEN=$(grep -c 'CIRCUIT BREAKER' "$STATUS" || true)

if [[ $BLOCKED_COUNT -gt 0 || $CIRCUIT_BROKEN -gt 0 ]]; then
  cat > "$PROJECT_DIR/.memento_alert" << EOF_INNER
timestamp: $TIMESTAMP
blocked_tasks: $BLOCKED_COUNT
circuit_breaker: $([[ $CIRCUIT_BROKEN -gt 0 ]] && echo "TRIGGERED" || echo "OK")
message: Pipeline needs attention. $BLOCKED_COUNT task(s) blocked.
EOF_INNER
fi

# 如果一切正常且之前有告警,清除告警
if [[ $BLOCKED_COUNT -eq 0 && $CIRCUIT_BROKEN -eq 0 && -f "$PROJECT_DIR/.memento_alert" ]]; then
  rm -f "$PROJECT_DIR/.memento_alert"
fi

9.3 Cron 配置

# 每 5 分钟执行一次
*/5 * * * * /path/to/project/scripts/memento_tick.sh >> /path/to/project/logs/cron.log 2>&1

十、完整工作流示例

人类:"我想做一个带用户系统的 REST API"
  │
  ▼
Architect(主 Session):
  ├─ 与人类讨论确认:PostgreSQL + JWT + Express
  ├─ 写入 PROJECT_MAP.md(模块划分)
  ├─ 写入 MASTER_PLAN.md(15 个任务,3 个 Phase)
  └─ "计划已就绪,运行 init 脚本后添加 crontab 即可启动"
  │
  ▼
人类:添加 crontab,开始刷手机
  │
  ▼
Tick #001 → T-101 数据库初始化 → ✅
Tick #001 → T-102 JWT 模块 → ✅ (同一 Tick 内连续完成 2 个快任务)
Tick #002 → T-103 密码哈希 → ✅
Tick #003 → T-201 连接中间件 → ❌ (retry 1/3)
Tick #004 → T-201 → ❌ (retry 2/3)
Tick #005 → T-201 → 🚫 BLOCKED
  │
  ▼
人类打开 Dashboard,看到 T-201 阻塞
  ├─ 在 Notes 区写:"别用 pg-pool 了,直接用 prisma"
  └─ 继续刷手机
  │
  ▼
Architect(读取 HUMAN_NOTES + TICK_STATUS):
  ├─ 更新 PROJECT_MAP.md(MODULE:database 改为 Prisma)
  ├─ 修改 T-201 的 context_files 和 verify
  ├─ 新增 T-105 "安装并配置 Prisma"(插入 Phase 1)
  ├─ 重置 T-201 retries → 0,状态 [!] → [ ]
  └─ 归档 HUMAN_NOTES 中的批注
  │
  ▼
Tick #006 → T-105 安装 Prisma → ✅
Tick #007 → T-201 连接中间件(Prisma 版)→ ✅
Tick #008 → T-202 ... → ✅
  │
  ... 持续推进 ...
  │
  ▼
Tick #031 → 🎉 ALL TASKS COMPLETE
  │
  ▼
人类打开 Dashboard:"哦,做完了。" 移除 crontab。

Security & Transparency

Data Access — Exactly What Is Read

  • Reads <project-dir>/docs/MASTER_PLAN.md to determine the current task
  • Reads <project-dir>/docs/PROJECT_MAP.md for project structure awareness
  • Reads <project-dir>/docs/HUMAN_NOTES.md for human annotations
  • Reads source code files listed in each task's context_files only

Data Written

  • Creates project scaffolding (MASTER_PLAN.md, PROJECT_MAP.md, TICK_STATUS.md, HUMAN_NOTES.md, memento_tick.sh)
  • Updates checkbox states in MASTER_PLAN.md (Tick Worker: only [ ][x]/[!]/[~])
  • Edits source files within the target project directory, limited to declared context_files
  • Writes execution logs to logs/tick_*.log
  • Creates git commits for successful task completions

Hard Safety Guards

  • Diff size limit: Rejects changes > 200 lines per task (configurable)
  • Guard files: Physically prevents modification of declared protected files
  • Auto-rollback: Failed tasks are rolled back via git checkout
  • Circuit breaker: Auto-pauses pipeline on sustained failures

Persistence & Autonomous Scheduling

  • The init_memento.sh script generates a bash script intended to be run via cron
  • The user must manually add this to their crontab to enable autonomous execution
  • Stop at any time by removing the crontab entry or setting tick_mode: stopped

Credentials

  • Operates entirely locally
  • Relies on openclaw agent with the system's existing LLM configurations
  • No new keys are requested or stored

Network Access

  • No outbound network access by framework scripts
  • Network access may occur only when user-defined verify commands require it (e.g., npm install)

---

## 附录:文件结构总览

<project>/ ├── docs/ │ ├── MASTER_PLAN.md # 唯一真相源 │ ├── PROJECT_MAP.md # 项目认知地图 │ ├── TICK_STATUS.md # 执行状态流水账 │ └── HUMAN_NOTES.md # 人类批注通道 ├── logs/ │ ├── cron.log # cron 调度日志 │ ├── tick_2025-01-15T14:35:00.log │ └── tick_2025-01-15T14:40:00.log ├── scripts/ │ └── memento_tick.sh # Tick Worker 入口 ├── .memento_ignore # 上下文排除规则 └── src/ # 实际项目代码 └── ...

Version tags

latestvk97abtyybgn1b576bh9twvwjmn82zv8e