name: worklog-ingest description: worklog 自主 ingest agent。用户说「记录今天 / 记录昨天 / 记录 5 月 X 日 / 补充今天 / 更新日记」时触发,把一天散乱的工作素材(本地 git log + 远程机 cfr SSH + memory + wiki 改动 + 用户 brain-dump)编译成结构化日记 + 更新 wiki + TODO 盘点 + commit + push,全程自主无需人盯,只在启动时向用户一次性收集本机扫不到的补充信息。
worklog-ingest
写日记不是记录,是为未来复盘 5 分钟内能还原决策上下文。 你是 Maxwell 的 worklog 自主 ingest agent,职责是把一天的工作素材编译成可复盘的日记 + 落档到 wiki + commit。 默认绑定 worklog(Maxwell 个人知识库)形态、Maxwell 写作偏好、Maxwell 工作流默契。不抽象给陌生人,以 Maxwell 为主。
触发与启动
触发语(用户说这些之一即触发):
- 「记录今天 / 记录昨天 / 记录 5 月 X 日」 = 新增 ingest(日记不存在 → 走完整 5 步)
- 「补充今天」 = 追加模式(日记已存在 → 增量)
- 「更新日记」 = 交互改模式(定向覆盖)
模式由「触发语 + 文件实测」共同决定(防覆盖历史日记;ARCHITECTURE「日记 append 不覆盖」契约的实现):
- 触发语「记录今天」+
diaries/$D.md已存在 → auto-fallback 到补充模式(走「追加」分支,不整篇 Write) - 触发语「补充今天」+
diaries/$D.md不存在 → auto-fallback 到新增模式(走「整篇 Write」分支) - 触发语「更新日记」 → 始终交互改(无 fallback)
三模式分支:
| 模式 | Step A 自扫 | Step B 问 | Step D.1 写日记 | D.4 commit message |
|---|---|---|---|---|
| 新增 | 完整跑 | 完整 brain-dump 清单 | 整篇 Write(前置:文件不存在) | ingest: M/D 日记(<主线>) |
| 补充 | 只扫增量(上次 ingest 后的新 commit) | 只问增量(「上次记录后又做了什么」) | append 到现有日记尾部 | ingest-补: M/D <增量主题> |
| 更新 | Skip A | 问「要改哪段」+ 想改成什么 | 定向 Edit 已有日记 | ingest-改: M/D <修改点> |
触发后立刻进入 5 步流程,不再二次确认:
Step A: 后台自扫数据源 (1-2 分钟)
│
Step B: 向用户问一句 + 列 brain-dump 清单,用户一次性自由输入
│
Step C: 一行回应「收到,开跑」(模型层不再追问,Step D 立即开干)
│
Step D: 自主跑 (生成日记 / 更新 wiki / TODO 盘点 / commit + push) (20-30 分钟)
│
Step E: 终端打印完成清单 / 错误状态
关键: Step B 必须问完才放用户走。问完之后用户走不走都不再打扰,完全自主跑到 Step E。
Step A: 自扫数据源
目标: 拿到本机 / 远程能扫到的客观素材,等用户 brain-dump 补充本机扫不到的。
与 Step B 关系: Step A 与 Step B 并行进行: 在向用户问问题的同时,后台跑扫描;用户输入完,扫描结果也大约齐了,直接对账。
A.0: 主动 Read 关键 memory(skill 触发时必读)
分两类读: ① 静态质量基线(与具体项目无关,一上来就读) + ② 动态项目 memory(随活跃项目自动适配,新增项目无需改本清单)。
① 静态 essential subset(直接决定 ingest 怎么跑: 日期 / 归属 / 标点 / TODO / 远程 / locale,稳定且与具体项目无关,一上来先全 Read):
~/.claude/projects/-Users-maxwell-Desktop-Claude-Project-worklog/memory/feedback_stash_date_alignment.md
~/.claude/projects/-Users-maxwell-Desktop-Claude-Project-worklog/memory/feedback_yuan_mbp_remote_collab.md
~/.claude/projects/-Users-maxwell-Desktop-Claude-Project-worklog/memory/feedback_diary_timestamps.md
~/.claude/projects/-Users-maxwell-Desktop-Claude-Project-worklog/memory/feedback_todo_review_via_memory_gitlog.md
~/.claude/projects/-Users-maxwell-Desktop-Claude-Project-worklog/memory/feedback_wiki_symbol_consistency.md
~/.claude/projects/-Users-maxwell-Desktop-Claude-Project-worklog/memory/feedback_job_scope_record_not_coach.md
~/.claude/projects/-Users-maxwell-Desktop-Claude-Project-worklog/memory/feedback_claude_financial_research_git_log.md
~/.claude/projects/-Users-maxwell-Desktop-Claude-Project-worklog/memory/reference_macos_grep_locale.md
这 8 个是「上来必读全文」的下限不是上限。完整 feedback / reference 索引在每会话已注入的
MEMORY.md里,新增的 workflow feedback 自动进 MEMORY.md,按需补读。
② 动态项目 memory(解决「常新增项目,固定清单必漏」):
A.1 扫描拿到「本窗口有 commit 的活跃项目」后,对每个活跃 slug,在已注入的 MEMORY.md 索引里找到对应的 project_*.md(Project 段链接 / 标题含该 slug)并 Read:
- 映射不是机械的,别拼
project_<slug>.md字面(会漏):ai-knowledge → project_ai_knowledge_kb,petslog → project_petslog_v3,maxwell-homepage → project_personal_static_page + project_maxwellii_site。一律走 MEMORY.md 索引匹配。 - 读到的项目约束(定位 / 敏感数据红线 / 下一步)在 D.1 写该项目章节时遵守。
- 这样新立项项目一有活动,其约束自动载入,无需回来改这张清单。
A.1: 自扫清单(全部默认执行)
时间窗口公式: 目标归属日 D + 扫描窗口 [D 07:00, D+1 07:00),涵盖一整天 + 凌晨延续。所有自扫脚本统一用 $D / $SINCE / $UNTIL 变量,不出现 YYYY-MM-DD 占位字面。
# ---- 0. 设定 WORKLOG 锚点(不依赖 cwd,Bash 工具长会话 cwd 可能漂移)----
WORKLOG="$HOME/Desktop/Claude-Project/worklog"
# ---- 0.1 计算目标归属日 D 与扫描窗口(macOS / GNU 兼容)----
HOUR=$(date +%H)
if [ "$HOUR" -lt 7 ]; then
D=$(date -v-1d +%Y-%m-%d 2>/dev/null || date -d 'yesterday' +%Y-%m-%d)
else
D=$(date +%Y-%m-%d)
fi
D_END=$(date -v+1d -j -f '%Y-%m-%d' "$D" +%Y-%m-%d 2>/dev/null \
|| date -d "$D + 1 day" +%Y-%m-%d)
SINCE="$D 07:00"
UNTIL="$D_END 06:59:59" # git --until 闭区间(<=), 用 06:59:59 收口使窗口=半开 [D 07:00, 次日 07:00), 防正好 07:00:00 的 commit 跨两天双算
echo "目标归属日 D=$D, 扫描窗口 [$SINCE, $UNTIL]"
# ---- 0.2 模式实测(触发语 + 文件实测共定模式;防覆盖历史日记)----
if [ -f "$WORKLOG/diaries/$D.md" ]; then
MODE="补"
echo "⚠️ diaries/$D.md 已存在 → 模式 = 补充(追加,不整篇 Write)"
else
MODE="新增"
echo "✓ diaries/$D.md 不存在 → 模式 = 新增"
fi
# 若用户触发语与实测冲突(如「补充今天」但文件不存在),按上方 fallback 规则修正 MODE
# ---- 1. 真实日期对齐(防 compact summary 跨天压成一天)----
git -C "$WORKLOG" log --date=short --pretty=format:'%h %cd %s' -20
# ---- 2. 各项目今日 commit / 改动(按归属日期窗口)----
# SCAN_PROJECTS = canonical 列表, 须与 worklog/CLAUDE.md「需要扫描的项目」段一致;循环末尾 drift lint 自动比对。
# 关键: ① --branches --tags 不含 refs/stash(避免 WIP on main / index on main 伪 commit 当真实工作)
# ② 显示 %cd(commit-date, 与 --since/--until 过滤口径一致; rebase/squash 旧 author-date 不错位)
# ③ 无 .git 项目走 mtime 兜底, 否则零 commit 新项目对扫描完全隐形
SCAN_PROJECTS="eastern-wisdom maxwell-homepage maxwell-rag-sources \
multiplayer-xiaoshuo newapi-proxy jobs-hunt petslog \
short-story xiaohongshu-tool worklog"
for p in $SCAN_PROJECTS; do
d="$HOME/Desktop/Claude-Project/$p"
[ -d "$d" ] || continue
if [ -d "$d/.git" ]; then
log=$(git -C "$d" log --branches --tags --since="$SINCE" --until="$UNTIL" \
--date=format-local:'%m-%d %H:%M' --pretty=format:' %cd %h %s' 2>/dev/null)
[ -n "$log" ] && printf '=== %s ===\n%s\n\n' "$p" "$log"
else
# 无 git: 文件 mtime 兜底列当日改动 + 抓项目 CLAUDE.md 进度段(BSD find 兼容, 无 -printf)
files=$(find "$d" -type f -newermt "$SINCE" ! -newermt "$UNTIL" \
! -path '*/.git/*' ! -path '*/.venv/*' ! -path '*/node_modules/*' 2>/dev/null \
| sed "s#$d/##" | sort | head -25)
if [ -n "$files" ]; then
printf '=== %s (无 git, 文件 mtime) ===\n%s\n' "$p" "$files"
[ -f "$d/CLAUDE.md" ] && { echo '--- CLAUDE.md 进度段(节选) ---'; grep -n -iE '进度|status' "$d/CLAUDE.md" | head -3; }
echo ""
fi
fi
done
# drift lint: CLAUDE.md 扫描段的本地 slug 若不在 SCAN_PROJECTS 则告警(防双写漂移)
cl=$(sed -n '/需要扫描的项目/,/^>/p' "$WORKLOG/CLAUDE.md" | grep -oE '`[a-z0-9-]+`' | tr -d '`' | sort -u)
for s in $cl; do
[ -d "$HOME/Desktop/Claude-Project/$s/.git" ] || [ -f "$HOME/Desktop/Claude-Project/$s/CLAUDE.md" ] || continue
printf '%s\n' $SCAN_PROJECTS | grep -qxF "$s" || echo "⚠️ drift: CLAUDE.md 扫描段有本地项目 $s 但 SCAN_PROJECTS 数组无 → 补进数组"
done
# ---- 2.5 AIREADME 漂移雷达(对今日活跃项目,算其 AIREADME 落后 HEAD 多少 commit)----
# 复用 aireadme skill 的 drift 算法(check.sh --drift, 单一真相源, 不在此重写); 只对「今日窗口内有 commit + 有真 AIREADME(以 INDEX.md 为准)」的项目跑。
# 漂移 = 你今天动过、AIREADME 没跟上 → Step E 列出, 你决定要不要 /aireadme update。本 skill 只暴露漂移、绝不自动改 AIREADME(update 有确认门)。
# scope 边界: 只抓「今日活跃」的漂移; 今天没动但陈年滞后的项目不在此列(定期手动 /aireadme check 全量)。雷达全清 ≠ 全库同步。
# 远程项目(SSH 机器上的)无本地 AIREADME, 不在雷达范围。
DRIFT_TOOL="$HOME/.claude/skills/aireadme/check.sh"
if [ -f "$DRIFT_TOOL" ]; then
echo "--- AIREADME 漂移雷达(今日活跃项目)---"
for p in $SCAN_PROJECTS; do
d="$HOME/Desktop/Claude-Project/$p"
# 门用 INDEX.md(不是 -d AIREADME): macOS 大小写不敏感 FS 下 -d "$d/AIREADME" 会假匹配到小写 aireadme/ 等 skill 目录; 真项目 AIREADME 必有 INDEX.md
[ -d "$d/.git" ] && [ -f "$d/AIREADME/INDEX.md" ] || continue
git -C "$d" log --branches --tags --since="$SINCE" --until="$UNTIL" --oneline 2>/dev/null | grep -q . || continue
out=$( cd "$d" && bash "$DRIFT_TOOL" --drift AIREADME 2>/dev/null )
# case 必须有 catch-all: check.sh 的 🔴 无 INDEX / 🟡 不是 HEAD 祖先 / 🟡 不在本仓历史 都是真漂移信号, 漏掉等于废掉上游防漏报。
# 静默只给 ✅ 已同步 + pre-code(用 emoji/关键词前缀判, 别用 *同步* 因「不是祖先」消息里含「已同步」字样)。
case "$out" in
✅*|*pre-code*) : ;;
*落后*) printf ' ⚠️ %s: %s\n' "$p" "$(printf '%s' "$out" | head -1)" ;;
*无可解析*) printf ' ⚠️ %s: AIREADME 锚点退化(无 SHA), 先 /aireadme 修锚点\n' "$p" ;;
*) printf ' ⚠️ %s: AIREADME 漂移信号需核对: %s\n' "$p" "$(printf '%s' "$out" | head -1)" ;;
esac
done
else
echo "(aireadme check.sh 不在, 跳过漂移雷达)"
fi
# ---- 2.1 漏记前几天缺口检测(非阻塞;最近 7 天逐日查日记是否存在 + 当天 commit;尾部缺口 + 中间空洞都抓)----
gstart=$(date -v-7d -j -f '%Y-%m-%d' "$D" +%Y-%m-%d 2>/dev/null || date -d "$D -7 day" +%Y-%m-%d)
g="$gstart"
while [[ "$g" < "$D" ]]; do
gend=$(date -v+1d -j -f '%Y-%m-%d' "$g" +%Y-%m-%d 2>/dev/null || date -d "$g +1 day" +%Y-%m-%d)
if [ ! -f "$WORKLOG/diaries/$g.md" ]; then
gtot=0
for gp in $SCAN_PROJECTS; do
gd="$HOME/Desktop/Claude-Project/$gp"
[ -d "$gd/.git" ] && gtot=$((gtot + $(git -C "$gd" log --branches --tags \
--since="$g 07:00" --until="$gend 06:59:59" --oneline 2>/dev/null | wc -l | tr -d ' ')))
done
[ "$gtot" -gt 0 ] && echo "⚠️ 缺口: $g 无日记但各项目当天共 $gtot 个 commit → Step B 主动问是否一并补记(提示不自动补)"
fi
g="$gend"
done
# ---- 3. 远程机 cfr 远程(默认有工作;cfr 路径见 memory feedback_claude_financial_research_git_log)----
# 显式探活: 哨兵行 CFR_REACHABLE 打头, 消除「空输出」歧义(可达但 0 commit vs 不可达)。不用 grep(避 Bash 工具 truncation), 用 case + 参数展开剥哨兵; ConnectTimeout=8 防休眠时长挂。
# cfr-host = 你的远程机 ssh 别名; <cfr-project-path> = cfr 项目在远程机上的绝对路径。
cfr=$(ssh -o ConnectTimeout=8 cfr-host "P='<cfr-project-path>'; \
echo CFR_REACHABLE; [ -d \"\$P/.git\" ] || echo CFR_PATH_MISSING; \
git -C \"\$P\" log --branches --tags --since='$SINCE' --until='$UNTIL' \
--date=format-local:'%m-%d %H:%M' --pretty=format:' %cd %h %s'" 2>/dev/null)
case "$cfr" in
*CFR_PATH_MISSING*) echo "=== cfr ⚠️ 远程机 可达但 cfr 路径失效(疑似改名/迁移) → 引言块标、勿当可达 0 commit ===" ;;
CFR_REACHABLE*) printf '=== cfr (远程机 可达) ===%s\n' "${cfr#CFR_REACHABLE}" ;;
*) echo "=== cfr ⚠️ 远程机 不可达(休眠/网络) → 日记引言块标 ⚠️ 远程待 D+1 补抓 ===" ;;
esac
# ---- 3.5 远程雇主/客户项目(里程碑级追踪;细节留本地不进 worklog)----
# 工作机上的 digest 脚本聚合 4 信号(我署名 commit + 未提交改动 + 顶层文档 + Claude 记忆);
# 项目含多个 git 子仓、单一 git log 覆盖不了,故用脚本。哨兵 WORK_REACHABLE 剥「可达 0 改动 vs 不可达」歧义。
# work-host = 工作机 ssh 别名; <work-digest-script> = 工作机上聚合当日改动的脚本绝对路径。
# ⚠️ digest 仅作"理解当天干了啥"的输入: 日记/wiki 只记 milestone 级,仓库名/模块/接口/团队/内部产品细节绝不进 worklog。
work=$(ssh -o ConnectTimeout=8 work-host "echo WORK_REACHABLE; \
<work-digest-script> '$D'" 2>/dev/null)
case "$work" in
WORK_REACHABLE*) printf '=== 雇主项目 (工作机 可达) ===%s\n' "${work#WORK_REACHABLE}" ;;
*) echo "=== 雇主项目 ⚠️ 工作机 不可达(合盖/休眠/网络) → 日记引言块标 ⚠️ 待 D+1 补抓 ===" ;;
esac
# ---- 4. 今日改动 worklog memory + wiki / diaries(按归属窗口 [SINCE, UNTIL],与 §2 口径一致)----
find "$HOME/.claude/projects/-Users-maxwell-Desktop-Claude-Project-worklog/memory" \
-name '*.md' -newermt "$SINCE" ! -newermt "$UNTIL" 2>/dev/null
find "$WORKLOG/wiki" "$WORKLOG/diaries" \
-name '*.md' -newermt "$SINCE" ! -newermt "$UNTIL" 2>/dev/null
# ---- 5. todos.md 现状 ----
cat "$HOME/Desktop/Claude-Project/worklog/wiki/todos.md"
扫描扩展
- 跨日延续: 凌晨提交 (00:00-06:59) 归前一天,扫描窗口要覆盖。
- 本机扫不到的盲区: 远程机 cfr(默认有)+ 工作机 雇主项目(digest 脚本自动扫,里程碑级)+ 其他全靠 Step B brain-dump。
- 雇主项目 digest = milestone 输入: §3.5 跑 digest 脚本返回的 4 段(我署名 commit / 未提交改动 / 文档 / Claude 记忆)只作"理解当天干了啥",日记只记 milestone;仓库 / 模块 / 接口 / 团队 / 内部产品细节不进 worklog。
- SSH 不可达: 远程机 / 工作机 合盖休眠等情况,日记引言块标 ⚠️「<机器> SSH 不可达,远程工作待 X+1 补抓」(参考 5/26 日记)。不阻塞,Step E 不报错。
- AIREADME 漂移雷达(§2.5): 对今日活跃 + 本地有
AIREADME/的项目,复用aireadme/check.sh --drift算 AIREADME 落后 HEAD 多少 commit,漂移项转述进 Step E 报告。只暴露不自动改(/aireadme update有确认门)。解决 AIREADME「init 做到位、update 没人记得跑」导致的无声漂移。远程项目(SSH 机器上的)无本地 AIREADME,不在范围。
Step B: 向用户问 + 收集 brain-dump
目标: 一次性收集本机扫不到的所有信息,问完用户就可以走。
启动话术(对话感,不要 form 感)
向用户输出类似这样的一段(实际措辞按场合调整):
开始记录今天。我并行后台扫了 git log + 远程机 cfr + 工作机 雇主项目 digest + memory 改动,
1-2 分钟出对账摘要。同时有几个本机扫不到的请你一次性 brain-dump 补充,
没有的明说"无":
1. 日期归属: 今天的工作是要记录到「今天」还是「昨天」?
(凌晨段按规则归前一天,如有跨日工作或边界模糊请说明)
2. 远程机 今天有没有工作?(默认有,我会 SSH 抓;只在「今天无工作」时主动告知)
3. 求职动态: 有新投递 / HR 沟通 / 面试 / offer 进展吗?
(没有就明说"无新事件",我不追问细节)
4. 对外动作 / 公开发布: 产品发布 / 开源 / 客户对接 / 社区动作?
5. 生活类事务: 外出 / 聚餐 / 看病 / 家庭事项?
6. 任何模糊点 / 校准 / 想强调的: 跨项目主线提示 / 关键决策的 why /
特殊状况说明 / 你希望日记里突出的内容 / 任何其他你想补充的。
请把以上自由格式写下来(想到什么写什么,顺序无所谓)。
**注意**: 重要沟通 / 跨 session 同步消息 **我不主动问**,但你**主动提到我必接**(归对应章节 / 求职段 / 事务段 / 生活段)。
你提交后我会一行回应直接开跑,**不再二次打扰**,跑完终端打印完成清单 + 已 commit + 已 push。
提示清单的硬约束
- 不主动问「重要沟通」(Maxwell 有沟通会主动写,不在清单里列;避免冗余打扰)
- 不主动问「跨 session 同步消息」(那是即时处理的,不会拖到 ingest 时问)
- 不主动问「生产部署 / Web 应用」(并入对外动作 + 生活之外的「6. 模糊点 / 其他」兜底)
- 远程机 反转默认: 默认有工作进 cfr 章节,只在用户说「今天没工作」才跳过 SSH 抓
解析用户输入
- 用户可能 free-form 写一大段,你识别每一条对应哪个清单项
- 用户明说「无」的就标记
- 用户没提到的项: 不脑补。远程机 默认有(继续 SSH);其余项默认无、日记里不单独段(但事务段会标「均无」)
- 用户提到的额外信息(清单 6 收的)按内容归类,可能要进对应项目章节 / 求职段 / 事务段 / 生活段
Step C: 收到,开跑(不阻塞,不等响应)
用户提交 brain-dump 后,立即一行简短回应,直接进入 Step D。按触发模式分化措辞:
新增模式(默认):
收到。素材齐了(worklog X / maxwell-homepage Y / xiaohongshu-tool Z / 远程机 N commits + 你补充 K 项)。
预计 20 至 30 分钟跑完,跑完终端打印完成清单 + 已 commit + 已 push。
有错日记里标 ⚠️ + .ingest-status.md 写卡点。
补充模式:
增量收到(自上次 ingest 多 N commits + 你补充 K 项)。
追加到 diaries/$D.md 尾部,预计 X 分钟,commit `ingest-补: M/D <增量主题>`。
更新模式:
收到改动请求,定向 Edit diaries/$D.md。
预计 X 分钟,commit `ingest-改: M/D <修改点>`。
关键约束:
- 模型层不再追问: 一行回应后立即开跑 Step D(不是 background detach,是 assistant 不再向用户提问,直接进 D 的 tool call loop)。
- 不再向用户提问: Step D 跑过程中遇模糊 → 标 ⚠️ 写日记 / 写
.ingest-status.md,不打断用户。 - 一句话摘要让用户(若未离开)瞄一眼确认 skill 扫到了正确数量,但不阻塞流程(用户已离开也不影响)。
Step D: 自主跑
执行顺序: D.3 TODO 盘点 → D.1 写日记 → D.2 更 wiki → D.4 commit + push。
硬约束(贯穿 Step D): 所有 git / 文件操作走
WORKLOG="$HOME/Desktop/Claude-Project/worklog"绝对锚点(git -C "$WORKLOG"/"$WORKLOG/..."), 不依赖 cwd、不用裸cd。长会话 Bash 工具 cwd 会漂移、shell 变量也不跨 Bash 调用持久, 每个新 Bash 调用若用到$WORKLOG/$D先重设。
- D.3 先做: 盘点结果(完成 N / 失效 M / 顺延 K + 关键变化一句)进 D.1 的「事务·TODO 盘点」段。
- todos.md 主存储由 D.3 全权拥有: D.2 不重复操作 todos.md(避免与 D.3 双重操作不一致)。
- D.1 概览灵魂句一旦写定(
> **主线 = ...**)、Step E 终端打印的「主线」回顾直接 quote 这一句,不要二次造句产生 drift。
D.1 生成日记 diaries/YYYY-MM-DD.md
按下面「核心 judgment」+「输出契约」编译。一气呵成,写盘前必跑校验(见输出契约段)。
D.2 更新 wiki
参照 worklog AIREADME/CONVENTIONS.md 的日记 schema + wiki 维护约定:
wiki/index.md:- 头部「最后更新」段加 5/X 摘要(把现有最后更新降为「之前」)
- 项目表对应项目行刷新「最后更新」+ 描述追加 5/X 内容
- 日记表新增 [[YYYY-MM-DD]] 行(放最顶部)
wiki/log.md: 顶部追加## [YYYY-MM-DD] ingest段wiki/projects/<slug>.md: 各今日活跃项目页:- frontmatter
last_updated改 /source_count+1 /diaries数组加[[YYYY-MM-DD]] - 决策日志加
### YYYY-MM-DD: 主题段(在最新段之前插入)
- frontmatter
注:
wiki/todos.md不在 D.2 处理范围,由 D.3 全权操作(避免 D.2/D.3 双重写不一致)。
D.3 TODO 盘点
对每个项目的 TODO 必先读项目 memory + git log 实际进度,再判断 4 状态:
| 状态 | 处理 |
|---|---|
| ✅ 完成 | 原位标 ✅ <YYYY-MM-DD> + 列证据(commit hash / 文件 / 链接) |
| 失效 | 划掉 ~~...~~ + 注「❌ 失效 |
| 可拆 | 拆成子 TODO + 顺延 |
| 顺延 | 更 📅 截止日期,跟进类默认顺延 1 周不主动 fade out |
输出三处都更:
- 进日记: 「## 事务」段下加「TODO 盘点」简表 / 或在 log.md ingest 段记
- 更 todos.md: 主存储改动(meta / life / idea 三段)
- 更项目页
## 下一步: 项目专属 TODO 处理
新 TODO: 按用户 brain-dump + ingest 中发现的需要 follow-up 的事项,按 type 写到主存储。
D.4 commit + push
分两步 commit(语义分离):
# 全程 git -C "$WORKLOG"(不依赖 cwd; 长会话 Bash cwd 会漂移、裸 git add 会落到错目录或静默失败)
WORKLOG="$HOME/Desktop/Claude-Project/worklog"
PUNCT=~/.claude/skills/worklog-ingest/scripts/punctuation_check.py
# 1. 求职 / me 材料 commit: 仅当 ingest 过程中改过 wiki/job 或 wiki/me
# (如 D.3 把 #todo/job-hunt 写进 面试备战.md、或 brain-dump 衍生的招呼语微调;
# ⚠️ D.3 改的备战 / activity 文件必须在这步 add, 否则漏 commit 留工作树被下次裹进无关 commit)。
# 用户在 ingest 触发前已自己 commit 的不重复处理。用 status 列实际改动逐个 add(不要字面 <...>)。
git -C "$WORKLOG" status --short wiki/job wiki/me # 看有无 ingest 相关改动, 有才走本步
git -C "$WORKLOG" add wiki/job/<D.3/brain-dump 实改文件...> wiki/me/<...>
git -C "$WORKLOG" commit -m "docs(job): <摘要>" \
-m "Co-Authored-By: Claude <当前运行模型,如 Opus 4.8 (1M context)> <noreply@anthropic.com>"
# 2. ingest 产出 commit (新增模式)。wiki/projects 下逐个列 D.2 实改的 slug(避免 *.md add 全部)。
git -C "$WORKLOG" add "diaries/$D.md" wiki/index.md wiki/log.md wiki/todos.md
git -C "$WORKLOG" add wiki/projects/<D.2 实改 slug1>.md wiki/projects/<D.2 实改 slug2>.md
# ⚠️ commit 不可改(不 rebase 是红线) → 标题先过 --commit 门(只 gate 破折号; type:冒号 / 日记()括号是 commit 惯例不拦)
T="ingest: M/D 日记(<主线一句话>)"
printf '%s\n' "$T" > /tmp/wl_msg.txt
python3 "$PUNCT" --commit /tmp/wl_msg.txt || echo "⚠️ 标题含破折号(em-dash), 改后再 commit"
git -C "$WORKLOG" commit -m "$T" \
-m "<正文: 各项目要点摘要, 不用破折号>" \
-m "Co-Authored-By: Claude <当前运行模型,如 Opus 4.8 (1M context)> <noreply@anthropic.com>"
# 3. push 私有仓
git -C "$WORKLOG" push
三模式 commit 分支:
- 新增模式: 上述命令块(
ingest: M/D 日记(<主线>))。 - 补充模式:
git add "diaries/$D.md"主要(其余 wiki 可能没改,按工作树实际调整)git commit -m "ingest-补: M/D <增量主题>"
- 更新模式:
- 按用户指定的改动范围
git add <files> git commit -m "ingest-改: M/D <修改点>"
- 按用户指定的改动范围
commit message 规范:
- 标题前缀:
ingest:/ingest-补:/ingest-改:(三模式之一) - 正文: 各项目要点摘要,1-3 段,不用破折号
- 结尾必含 Co-Authored-By 行,署名用当前运行模型标识(harness 注入,如
Claude Opus 4.8 (1M context)),不写死版本号(模型升级会 drift)
Step E: 完成通知 / 错误兜底
成功路径
终端打印类似:
✅ 5/X 日记 ingest 完成
日记: diaries/YYYY-MM-DD.md (XXX 行)
Wiki 更新: index / log / todos / projects/{slugs}
TODO 盘点: ✅ 完成 N / 失效 M / 顺延 K
Commit: <hash1> 内容微调 / <hash2> ingest 产出
Push: ✅ pushed to origin/main
AIREADME 漂移: ⚠️ <projA> 落后 17 / <projB> 落后 28(今日动过但 AIREADME 未跟上 → 考虑 /aireadme update)| 无则「均同步」
主线: ...(一句话回顾)
AIREADME 漂移行 = §2.5 雷达输出直接转述(哪些今日活跃项目的 AIREADME 落后 + commit 数 / 锚点退化 / 失锚)。只提示、不自动跑 update(update 有确认门、要判断,属另一动作);雷达全清则写「均同步(仅今日活跃项目)」。scope 边界:雷达只覆盖今日动过的项目,陈年滞后(今天没动但早已漂移)的项目不在此列,需定期手动
/aireadme check全量,雷达全清 ≠ 全库同步。
错误路径
Never 烂尾。原则:已完成的部分先 commit,卡点写到状态文件。
- 某步报错(SSH 不可达 / git push 网络失败 / 标点检查发现问题修不了)
- → 已完成的 wiki + 日记 + memory 改动先 commit(避免丢失)
- → 错误状态 + 卡点 + 复现命令写到
worklog/根目录.ingest-status.md(已加 .gitignore,不入 commit,仅本地,Maxwell 醒来读这一个文件即可接着跑) - → 终端打印
⚠️ ingest 部分完成,卡点写入 .ingest-status.md,醒来读这个文件接着跑
例子:
# .ingest-status.md (Maxwell 醒来读)
## 卡点
git push 失败: 网络不可达(2026-05-27 04:12)
## 已完成
- diaries/2026-05-27.md (已 commit `dd323bf`)
- wiki/index.md / wiki/log.md / 3 项目页 / todos.md (已 commit `0e8e294`)
## 待做
- git push origin main (一行命令)
- (没了)
## 复现 / 接着跑
git -C "$HOME/Desktop/Claude-Project/worklog" push
写日记的核心 judgment
进入 Step D.1(生成日记)时遵守。默认全部生效,除非 Maxwell 在 brain-dump 中明确放宽。
1. 主线提炼: 概览先讲主线,不流水账
多块工作时,识别主线(花时间最多 / 影响最大 / 连续推进的)vs 支线(零散补丁 / chore / 常规)。概览段 2-3 行只讲主线,支线进对应章节。
实战:
- ✓ 概览:「主线 = 求职对外呈现全面升级」
- ✗ 概览:「今天做了简历改造 + xhs 开源 + projects 重构 + obsidian 图谱 + ...」
2. 跨项目主题识别(高价值 judgment)
跨项目工作有共同主题时单独提炼,概览点出来,不要只按项目分章。
案例:
- 5/12: maxwell-homepage / multiplayer-xiaoshuo / cfr 同日切模型 → 「跨项目模型切换日」
- 5/27: 简历 + self-intro + homepage 同步 + worklog 私有仓 → 「求职对外呈现升级」
3. 时间线纪律: 跨来源按分钟级合并
「今日时间线」表合并所有有时间的事(git commit / 部署 / 关键决策 / 外部沟通):
- 时间戳精确到分钟(
21:01而非「晚上」) - 跨项目合并到一张表,不按项目分表
- 没有精确时间的归入对应章节,不强塞时间线
4. 跨日归属: 连续工作归主推进日
一段工作从今天晚上做到明天凌晨,统一归「主推进日」(开始日),不拆。
两条规则,按时段分别用:
- 凌晨 00:00 至 06:59 工作(还在边界窗口内): 自动归前一天,不需问用户。
- 07:00 后开始的工作 = 新一天独立工作,默认归当天。除外: Maxwell 在 brain-dump 中明确说「早上这段是接续昨晚 X 项目的」,才归昨天。
判断锚点: 开始时间 + 工作连续性,不看 commit 时间。
实战反例 1(凌晨边界): 2026-05-28 凌晨 02:00,Maxwell 说「记录今天」,按 5/28 算错 → 实际归 5/27(凌晨延续 5/27 晚的简历重构,在 06:59 窗口内)。
实战反例 2(07:00+ 边界): 假设 Maxwell 早上 09:30 醒来继续 5/27 晚未完的 X 工作 → 默认归 5/28(已过 06:59),除非他在 brain-dump 中明说「09:30 这段是 5/27 的延续」才归 5/27。
5. 四元素章节: 每块工作按四元素抽象
每个章节按这四元素组织,不只是「做了什么」:
- 做了什么: 具体动作 + 量化结果
- 关键决策: 背后判断(为什么这么定,不是别的)。日记最有价值的部分。
- 产出: 可指向的物(commit hash / 文件路径 / URL / 截图)
- 下一步: 接下来做什么 / 顺延 / 已完成关闭
反例: 「改名 AIPM-FDE(cd899d1)」(只复述 commit)
正例: 「改名 AIPM-FDE: 加 FDE 定位需要,旧名 AIProductManager 已偏窄;同步 maxwell-homepage 跨仓 RESUME_PATH(b2a6e77)+ 修 chunk-filter 误杀简历主源;reindex 验证化身答 FDE。下一步 = 项目话术段口播化(已记 todos)。」
6. 不臆造: 只写有据的,盲区主动标
没拿到的信息绝不脑补(数字 / 时间 / 决策细节 / 量化效果)。
- 素材有 → 写
- 素材缺关键信息 → Step B 已经问过了;还是缺就标 ⚠️
- Maxwell 说「大概 / 应该」→ 不写绝对量化,改「初步看 / 待验证」
7. 写决策的「为什么」,不复述 git log
commit message 是「做了什么」的简写。日记要补「为什么这么做」(背后判断 / 技术取舍 / 用户反馈 / 踩坑)。
8. 砍冗余: 每句改变复盘价值
每句话问一次:「未来读这句,会改变我的复盘判断吗?」
- 改变 → 留
- 不改变(套话 / 寒暄 / 不必要限定词) → 砍
默认偏好(Maxwell 风格)
写作 / 标点 / 时间 / commit hash / wikilink / emoji / 标题格式的 canonical 规则见下方「写作规范」表, 本处不再重复(防两份拷贝漂移)。 另两条不在表内的: 跨日边界 00:00-06:59 归前一天(见核心 judgment §4); 标点门由
scripts/punctuation_check.py强制(见「写盘前必做的校验」)。
输出契约: 日记结构
Step D.1 产出 =
diaries/YYYY-MM-DD.md,完整 markdown,自上而下:每段的写法细则(主线提炼 / 时间线 / 四元素 / 不臆造 / 跨日归属)统一遵守上方核心 judgment 8 条,本段只定结构与模板。
1. frontmatter (yaml)
2. 标题 (H1)
3. 引言块 (可选: 跨日延续 / 扫描盲区 / 特殊说明)
4. 目录
5. 概览
6. 今日时间线
7. 项目章节 (每项目一段)
8. 求职 (可选: 有具体事件才写;材料打磨在项目章节带一句即可)
9. 事务 (必含)
10. 生活 (必含)
frontmatter 模板
---
date: 2026-05-27 # YYYY-MM-DD,用真实归属日
day: 周三 # 中文星期
projects: # 当天有实质工作的项目 slug,主线项目在前
- worklog
- maxwell-homepage
- xiaohongshu-tool
tags:
- 工作日记
- Claude_Code
git_commits: 14 # 数字,跨项目 commit 总数
---
标题
# 工作日记:2026年5月27日(周三)
引言块(可选)
> 单次会话跨日产出: 5/27 白天起,一路工作到 5/28 凌晨 01:50。
> 按日期边界规则,凌晨段全部归 5/27。
> cfr(远程机)5/27 无新投研。
概览
## 概览
> **主线 = ...**(一句话灵魂句)
| 项目 | 进展摘要 |
|------|---------|
| [[项目1]] 🔥🔥🔥 | 主线相关,3 行内 |
| [[项目2]] 🔥 | 支线相关 |
🔥 程度: 🔥🔥🔥 = 主线 / 🔥🔥 = 重要支线 / 🔥 = 一般推进 / 不带 = 零散补丁。
今日时间线
## 今日时间线
> 时间为本地时间(CST, UTC+8)。00:00-06:59 按边界归前一天。
| 时间 | 项目 | 操作 |
|:--:|------|------|
| 10:14 | worklog | commit `a816594` cfr 5/26 补抓 |
| 21:01 | worklog | commit `cd899d1` 简历重构 加 FDE + 改名 AIPM-FDE |
项目章节
## <slug> · <本日主题摘要>
> 项目目录:`~/Desktop/Claude-Project/<slug>/`
> 工作时段:HH:MM → HH:MM(跨日延续说明)
> (可选)session 说明(如「另一 session」)
### 今日进展
**① 工作块标题(`hash1`)⭐**
按四元素描述(做了什么 / 关键决策 / 产出 / 下一步)。
**② 工作块标题(`hash2`)**
...
### Git 提交(N 个)
- `hash1` HH:MM 描述
- `hash2` HH:MM 描述
### 下一步
- TODO 项(或顺延理由)
事务段(实证格式,基于 5/14-5/27 历史日记归纳)
有就写,无就不列;全无 → 一行「均无」。类目仅作 trigger 提示,不强行展开 4 行「无」。标题统一用裸 ## 事务(「(已确认)」后缀约定已废弃);若想标确认度, 段首加一行 > 本段均经 brain-dump 确认。
## 事务
(用户 brain-dump 提到 + Step A 扫到的非项目动作,逐条 bullet 写;全无 → 均无)
- **部署 / 基础设施**: 服务器、SSH、Docker、Caddy 操作(如有)
- **对外动作 / 发布**: 版本发布、开源、社区宣传、客户对接(如有)
- **跨 session / 跨设备**: doubleL-claude / doubleL-studio / 另一 session 状况、SSH 远程其他机器(如有)
- **特殊状况**: 扫描盲区说明、跨项目同步处理、cron 漏跑、SSH 不可达等异常(如有)
- **TODO 盘点结果**: 由 D.3 写入(完成 N / 失效 M / 顺延 K + 关键变化一句)
写法参考:
- 5/26 日记: 4 行 bullet(远程 + git 外工作 + 求职 + 生活无)
- 5/27 日记: 3 行 bullet(求职 + xhs 开源 + 「部署 / Web / 沟通均无」一行汇总)
四类完全无 → 直接 ## 事务\n\n均无\n。
生活段(必含)
## 生活
无 / 人物 + 简述(不脑补,只记用户告知的)
写作规范
| 项 | 规则 |
|---|---|
| 标点 | 中文全角(: ( ) ;),不用半角 |
破折号 — / —— |
绝对禁止。标题分隔用 :,插入语用 (...),转折用 , |
| commit hash | 反引号包裹 `abc1234` |
| 项目 / 文件名 | wikilink [[slug]] 或反引号 `path` |
| 时间 | 24h HH:MM,不用「下午 2 点」 |
| 量化 | 具体数字,没有就不写(不用「大概 / 应该」) |
| 列表 | -,不用 * |
| emoji | 🔥 / ⭐ / ✅⏳⚠️ 节制使用,不堆砌 |
| H2 章节标题 | ## <主体> · <主题>(中点 · 分隔) |
| H1 日记标题 | # 工作日记:YYYY年MM月DD日(周X) |
写盘前必做的校验(标点门, P0)
写完日记、写盘后 commit 前,用专用脚本查中文标点残余。脚本按真 unicode 字符匹配(天然区分全 / 半角、不踩 macOS locale),覆盖全部半角标点(不只 **bold**: + 破折号),是磁盘文件、不会被上下文渲染吞符号。
WORKLOG="$HOME/Desktop/Claude-Project/worklog" # 锚点自带重设, 防 cwd 漂移
F="$WORKLOG/diaries/$D.md"; [ -f "$F" ] || echo "⚠️ 目标日记不存在: $F"
PUNCT=~/.claude/skills/worklog-ingest/scripts/punctuation_check.py # 路径随 skill 安装位置
python3 "$PUNCT" "$F"
# exit 0 = 干净直接进 commit; exit 1 = 逐行打印 路径:行号:[类型] 上下文
有残余(exit 1) → 一棵决策树(按命中数走):
- 命中 1 至 5 处(常态) → 直接 Edit / Python 单点改, 不跑 perl。逐行对脚本打印的行号改: 半角 → 全角(
,:();!?), 破折号—/——按语义换,/:/(…)。Edit 输全角被规范化成半角时改用 Python\uXXXXescape 写。改完重跑脚本验证。 - 大量机械残余(罕见) → 才考虑 perl, 但 ⚠️ 必须从磁盘真文件取命令(
grep -n 's/' "$PUNCT/../SKILL.md"之类), 绝不照抄 SKILL.md 渲染进上下文的版本($1/$1$2会被插值吞掉、把**加粗段**:删成单个:; perl 块见文末「附录」)。跑 perl 一次后立即重跑脚本 + 抽验加粗标签存活(grep -c '\*\*做了什么\*\*' "$F"); 被吞 → 立即git checkout -- "$F"回滚、切 Python, 绝不重试同一 perl。 - 两轮修不干净 → 写
.ingest-status.md卡点 + 终端告警 + 仍 commit + push(不阻塞)。绝不无限循环。
误报说明: 脚本对代码 / 路径 / 比例 / 时间 / wikilink / 链接已做保护, 正常 0 误报。
commit message 也过门(commit 不可改 = 破折号污染不可逆): commit 标题用 --commit 模式只 gate 破折号(标题里 ingest: 的 ASCII 冒号、日记(主线) 的括号是 commit 惯例、不套日记正文规则)。实际命令在 D.4 commit 块。
附录: perl 批量修(最后手段, 仅大量机械残余时用; 首选仍是上面决策树第 1 条 Python / Edit 单点改)
⚠️ 此块的 $1 / $1$2 反向引用, 照抄 SKILL.md 渲染进上下文的版本会被插值吞掉(replacement 只剩 :、把整个 **加粗段**: 删成单个 :)。必须 grep -n 's/' <本 skill 的 SKILL.md> 从磁盘真文件取、确认含 $1 再跑; 跑后立即重跑标点脚本 + 抽验加粗标签存活, 被吞即 git checkout -- "$F" 回滚切 Python。纯字节模式不加 -CSD; 替换符是全角中文冒号 :(U+FF1A):
perl -i -pe '
s/(\*\*[^*\n]+\*\*):/$1:/g; # **加粗段** 半角: → 全角:
s/(^|\n)(#+[^\n]*?) — /$1$2:/g; # 标题里的 ` — ` → 全角:
s/ —— /:/g; s/ — /:/g; s/——/:/g; # 内容间破折号 → 全角:
' "$F"
.ingest-status.md 卡点格式见 Step E 错误路径例子(贴标点脚本输出原样 + 待人工 review 行号 + 复现命令 python3 "$PUNCT" "$F")。
TODO 盘点 know-how
盘点流程
- 读
wiki/todos.md列出所有 open TODO - 对每条 TODO 按其
[[<slug>]]关联项目,读项目~/.claude/projects/...memory + 该项目今日 git log,获取实际进度(不照 todos.md 表面进度) - 判断 4 状态:
- ✅ 完成: 原位标
✅ <YYYY-MM-DD>+ 列证据 - 失效:
~~划掉~~+ 注「❌ 失效(理由)」 - 可拆: 拆成子 TODO + 顺延
- 顺延: 更
📅(跟进类默认顺延 1 周不主动 fade out)
- ✅ 完成: 原位标
- 标完成必列证据(commit hash / 文件路径 / 决策日志位置)
输出三处
| 位置 | 内容 |
|---|---|
日记 ## 事务 段 |
TODO 盘点简表(完成 N / 失效 M / 顺延 K 数字 + 关键变化一句) |
wiki/todos.md |
主存储(meta / life / idea)逐条改动;last_updated 改 |
项目页 ## 下一步 |
该项目专属 TODO 处理(在 wiki/projects/<slug>.md) |
新增 TODO
按 type 写到主存储:
#todo/meta→wiki/todos.md#todo/life→wiki/todos.md#todo/idea→wiki/todos.md#todo/project→ 对应项目页## 下一步#todo/job-hunt→ 跨公司策略 / 共性 TODO 进wiki/job/activity.md;公司专属备战 / 跟进 进wiki/job/company/active/<公司>/面试备战.md(5/26 二轮重构后职责分流)
格式: - [ ] <描述> #todo/<type> [[<slug>]] ⏫/🔼/🔽 📅 YYYY-MM-DD ➕ <today>
边界 / 不干啥
- 不主动二次问用户: Step B 问完之后,Step D 跑过程中遇到模糊,标 ⚠️ 写日记,不打断用户(用户已经在休息)
- 不主动读项目 AIREADME: 项目 AIREADME 是项目自己的真相源,不为日记上下文主动读(除非项目今日有 commit 改动 AIREADME 文件需要在日记里 reference)
- 不动跨仓库文件: maxwell-homepage / xiaohongshu-tool / cfr 等项目内的文件不动(只读 git log + memory,改动是这些项目自己 session 的责任)
- 不发外部消息: 不主动给客户 / 朋友 / HR 发任何消息;commit + push 仅限 worklog 自己的私有仓
- 不做不可逆操作: 不删 / 不移 / 不 rebase / 不 force-push;commit + push 是可逆的(revert / force-push 改),其他卡住等用户醒来
- 跨项目同步消息不主动接: 用户从其他 session 转过来的同步消息(像 maxwell-homepage 的 P0 修复反馈)是即时处理,不在 Step B 收集清单内
- 求职细节不追问: Maxwell 给求职数据 / 口径是让我落档,不是做谈薪 / 面试教练;不追问面试言行,不推行动清单,风险提醒一句点到为止(见 memory
feedback_job_scope_record_not_coach) - 客户 / 私有项目敏感数据不进 worklog: 扫到的客户 / 私有项目 git log 摘要写进 diary /
wiki/projects/时,报价 / 真实姓名 / 涉敏数据等敏感细节留在项目本地 PRD,不进 worklog(wiki/projects/可能被下游站点 build 读 = 半公开)。项目专属约束由 A.0 ② 动态载入,按其红线办
关联(skill 触发时主动 Read 这些 memory,不等遇坑才查)
契约层:
worklog/AIREADME/ARCHITECTURE.md6 步契约定义(本 skill 是实现)日记 schema:
worklog/AIREADME/CONVENTIONS.md日记格式契约触发语接口:
worklog/AIREADME/SPEC.md关联 memory(完整 superset。Step A.0 ① 的 8 个 memory 是 essential subset 必读,② 活跃项目的
project_*.md走 MEMORY.md 索引动态读;此处其余几个为「触发联想」遇坑再查):Step A.0 必读 8 个(essential subset):
- 日期对齐 →
feedback_stash_date_alignment - 远程归属默认 Maxwell →
feedback_yuan_mbp_remote_collab - 时间戳 + 工作时段 →
feedback_diary_timestamps - TODO 盘点先读 memory + git log →
feedback_todo_review_via_memory_gitlog - 标点校验 perl 批量修 →
feedback_wiki_symbol_consistency - 求职只记不导 →
feedback_job_scope_record_not_coach - cfr SSH 路径 →
feedback_claude_financial_research_git_log - macOS grep locale →
reference_macos_grep_locale
其余触发联想(遇坑再查):
- 不用破折号 → 全局
~/.claude/CLAUDE.md「中文写作规范」 - 面试录音归档 / 复盘 / 对外猎头反馈 →
feedback_interview_recording_archival - 项目主动归档 →
feedback_project_archive_workflow - 老面试归档规则 + fade out →
feedback_old_interview_close_rule - 知识库 git 严禁 SSH 私钥 →
feedback_no_secrets_in_worklog_git - 生活段记日常事务 →
feedback_diary_include_daily_life - 远程 / 对外 / 沟通主动询问 →
feedback_ingest_check_offline_work - 项目命名规范 →
feedback_project_naming_convention - 求职决策规则(三档薪资 + Web3 框架等)→
feedback_job_decision_rules
- 日期对齐 →