# Worklog Ingest

> worklog 自主 ingest agent。用户睡前说「记录今天 / 记录昨天 / 记录 5 月 X 日 / 补充今天 / 更新日记」+ 附带当天信息时触发,把一天工作素材(本机 git log + yuenan-mbp 工作机桌面所有项目远程扫 + memory + wiki 改动 + 触发消息附带信息)编译成结构化日记 + 更新 wiki + TODO 盘点 + commit + push。全程无人值守、永不阻塞提问: 触发消息即全部输入、没提到的走默认值、用户发完即可去睡。

- **Type:** Skill
- **Install:** `agentstack add skill-iyuenan3-personal-skills-worklog-ingest`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [iyuenan3](https://agentstack.voostack.com/s/iyuenan3)
- **Installs:** 0
- **Category:** [Agent Skills](https://agentstack.voostack.com/c/agent-skills)
- **Latest version:** 0.1.0
- **License:** Apache-2.0
- **Upstream author:** [iyuenan3](https://github.com/iyuenan3)
- **Source:** https://github.com/iyuenan3/personal-skills/tree/main/worklog-ingest

## Install

```sh
agentstack add skill-iyuenan3-personal-skills-worklog-ingest
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

# 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 解析（不提问） | D.1 写日记 | D.2 更 wiki | D.3 TODO 盘点 | D.4 commit message |
|---|---|---|---|---|---|---|
| **新增** | 完整跑 | 解析触发消息附带信息 + 默认值填空 | 整篇 Write（**前置：文件不存在**） | 全跑（index 头部 / 项目表 / 日记表 + log + 各活跃项目页决策日志） | 全跑（4 态盘点） | `ingest: M/D 日记()` |
| **补充** | 全窗口扫（无增量锚点，靠 D.1 与现有日记比对去重、只 append 未记的） | 解析触发消息的增量信息 + 默认 | append 到现有日记尾部 | **有实质增量工作才跑增量**：刷 index 头部当日摘要 + 触及项目页决策日志 + log 追加补记说明；trivial 补充（如补 1 个 docs commit）可只动 diary + 该项目页计数 | 有 TODO 状态变化才跑，否则塌指针（见 E2） | `ingest-补: M/D ` |
| **更新** | Skip A | 解析触发消息里要改什么（信息不全则按字面理解 + 标 ⚠️，不提问） | 定向 Edit 已有日记 | 默认 **diary-only 不动 wiki**；除非订正的是已镜像到 wiki 的事实（计数 / 项目页摘要 / 日期归属），则同步那一处保持一致 | 默认不跑；除非订正本身涉及 TODO 状态 | `ingest-改: M/D ` |

> **补充模式的 wiki 永久漂移注意**：次日 ingest 只记次日、不会回捕今天补充时漏更的 wiki 增量 → 补充模式当下该更的 index 摘要 / 项目页决策日志若跳过，就**永久漏记**（不像 diary 还能再补充）。所以补充模式的 D.2「有实质工作才跑」要从严判断：宁可多刷一句 index 摘要，别留 wiki 与 diary 不一致。trivial 跳过的也要在 commit message 里说清跳了什么。

**触发后立刻进入 5 步流程（A–E，= `AIREADME/ARCHITECTURE` 6 步契约的实现），全程无人值守、永不阻塞提问**：

```
Step A: 后台自扫数据源
   │
Step B: 解析触发消息附带的信息 = brain-dump,没提到的项用默认值填空(不向用户提问)
   │
Step C: 一行回执「收到、按这些信息开跑」(回显解析到的 + 默认假设,立即进 Step D)
   │
Step D: 自主跑 (生成日记 / 更新 wiki / TODO 盘点 / commit + push)
   │
Step E: 终端打印完成清单 / 错误状态(用户晨起读)
```

### 核心交互模型：睡前无人值守、触发消息即全部输入（2026-06-27 用户定）

**使用场景**： Maxwell 在**睡前**触发本 skill，触发消息里**附带当天信息**（「有什么工作 / 哪台机器没工作 / 发生什么事」），**敲回车发送后即去睡觉、不在线**。由此：

- **铁律：永不以提问结尾、永不阻塞等用户回话**，一律一口气跑到 commit + push。问一句 = 挂一整晚、什么都不会跑 = 失败。
- **触发消息 = 完整 brain-dump**： 用户说的就是全部输入，直接解析、不回问；纯「记录今天」无任何附带信息时也照默认跑、不挂起（Step E 标一句「未附带信息、按默认跑、请核对」）。
- **没提到的项一律走默认值**（见下表），不追问、不臆造。
- **遇到任何歧义**： 用规则 / 默认自己拍 + 日记标 ⚠️ + 必要时写 `.ingest-status.md`，**绝不停下提问**。
- **Step C 一行回执不是提问**，是「边确认边开跑」，用户在不在都不影响。

### 默认值表（触发消息没提到时按此处理，全部不追问；2026-06-27 用户逐项确认）

| 项 | 默认 |
|---|---|
| **日期归属** | 永远 **7:00 为分割线**（00:00-06:59 归前一天，否则当天）；连续跨日工作归主推进日。**从不询问**，有歧义自己拍 + 日记标一句 |
| **本机各项目** | 始终扫 git log（窗口内 commit）|
| **Yuan-MBP / cfr** | **默认无工作、不 SSH**（cfr 维护模式收尾中、将归档）；日记记「cfr 今日无工作」。**仅当用户明说「yuan-mbp 有工作」才** SSH §3 抓 |
| **yuenan-mbp（工作机）** | **默认有工作**；§3.5 跑 `yuenan-scan.sh` 扫**整个桌面所有工作项目**（auto-discover、含新建项目）。仅当用户明说「yuenan-mbp 没工作」才跳过 |
| **求职动态** | 无新事件，不单列求职段 |
| **对外动作 / 发布** | 无（除非扫描有明显发布类 commit）|
| **生活类事务** | 无，生活段写「无」 |
| **特殊强调 / 校准** | 无，主线由我按 judgment 提炼 |
| **前几天缺口日记** | **默认不补、不追问**（用户不在、不替他决定补哪天）；§2.1 检测到只在报告里被动标一句 |
| **commit + push** | 始终做（无人值守闭环）|

> 上表 = 「用户没说时」的默认。**用户在触发消息里明说的一律覆盖默认**（如「今天 petslog 发版了」→ 对外段记；「yuenan 今天没干活」→ 跳过 §3.5；「yuan-mbp 有工作」→ 反转抓 cfr）。

---

## Step A: 自扫数据源

**目标**：拿到本机 / 远程能扫到的客观素材，与触发消息附带信息对账。

**与 Step B 关系**： Step A 扫描 + Step B 解析触发消息**同回合内连着做**（不向用户提问、不等待）：后台跑扫描，同时解析用户触发消息里附带的信息，扫完即对账，直接进 Step C/D。客观数据以扫描为准、用户独有信息（求职 / 生活等）以触发消息为准、没说的走默认值表。

### 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/.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_.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` 占位字面**。

```bash
# ---- 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 闭区间( petslog \
  short-story  xiaohongshu-tool personal-skills 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 则告警(防双写漂移, banks-data 即此漏网)
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 全量)。雷达全清 ≠ 全库同步。
# 远程项目(cfr / CarysCloud)无本地 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
    # E1 内容新鲜度门(2026-06-27): 该项目 AIREADME/ 今日窗口内有 commit = 项目自己(自有 session, 如 petslog 等)在维护 AIREADME
    #   → 抑制「落后」噪音。根因: worklog 侧 last-synced 锚点不由 worklog bump、对自有 session 项目恒报「落后 N」+ 建议「/aireadme update」(那是项目 session 职责、对 ingest 操作者不可执行)。
    #   用「AIREADME 真实新鲜度」替代「按所有权手维护 skip 名单」: 自动覆盖未来任意自有 session 项目, 且不误伤 worklog 自身这类真该 ingest 维护的(它今日 AIREADME 没 commit → 不抑制)。wc -l 恒 exit 0 防截断。
    aireadme_fresh=$(git -C "$d" log --branches --tags --since="$SINCE" --until="$UNTIL" --oneline -- AIREADME/ 2>/dev/null | wc -l | tr -d ' ')
    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*) : ;;
      *落后*) [ "${aireadme_fresh:-0}" -gt 0 ] || 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 漏记前几天缺口检测（非阻塞；逻辑属 D 计算后，置此因依赖 SCAN_PROJECTS 作用域）----
# 6/17 拖到 6/18 才补、靠用户提醒的教训。最近 7 天内逐日查: 无日记但各项目当天有 commit → Step E 被动标一行(默认不补、不追问、晨起自行决定)。
# 逐日查日记存在性(非「最后一篇之后」), 尾部缺口 + 中间空洞(6/15、6/17 有但 6/16 无)都能抓。
# ⚠️ B2 局限(2026-06-27 标注): gtot 只数本地 .git commit, 对「只做了远程主线(CarysCloud / cfr)、本地 0 commit」的缺口日恒判 gtot=0、原本静默 = 假 all-clear(漏记最高价值工作流)。
#   故对每个无日记缺口日: gtot>0 → 报本地 commit 数; gtot==0 → 仍打一行常驻提示(本地无 commit 不等于没干活、远程未计入), 让用户自行回忆远程是否漏记。无 git 项目同理只能靠这行兜。
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" /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
    # 默认不补、不追问(用户睡前不在、不替他决定补哪天, 2026-06-27 定): 只在 Step E 报告被动标一行供晨起参考
    if [ "$gtot" -gt 0 ]; then
      echo "ℹ️ 缺口: $g 无日记但各项目当天本地共 $gtot 个 commit → Step E 被动标一句(默认不补、不追问、晨起自行决定)"
    else
      echo "ℹ️ 缺口: $g 无日记、本地 0 commit → 仅基于本地 git、远程未计入(默认不补、不追问)"
    fi
  fi
  g="$gend"
done

# ---- 3. Yuan-MBP cfr 远程（默认无工作、不 SSH；2026-06-27 用户定：cfr 维护模式收尾、将归档）----
# 默认: 直接记「cfr 今日无工作」、跳过本块 SSH。仅当触发消息明说「yuan-mbp 有工作」, agent 把 CFR_SCAN=1 才跑下面的块抓 cfr git log。
# 哨兵 CFR_REACHABLE 剥「可达 0 commit vs 不可达」; ConnectTimeout=8 防休眠挂; cfr 路径见 memory 。
CFR_SCAN=""   # 仅当用户明说 yuan-mbp 有工作时由 agent 置 1（默认空 = 不 SSH）
if [ -n "$CFR_SCAN" ]; then
  cfr=$(ssh -o ConnectTimeout=8 yuan-mbp "P=''; \
    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 ⚠️ Yuan-MBP 可达但 cfr 路径失效(疑似改名/迁移) → 引言块标、勿当可达 0 commit ===" ;;
    CFR_REACHABLE*) printf '=== cfr (Yuan-MBP 可达) ===%s\n' "${cfr#CFR_REACHABLE}" ;;
    *) echo "=== cfr ⚠️ Yuan-MBP 不可达(休眠/网络) → 日记引言块标 ⚠️ 远程待 D+1 补抓 ===" ;;
  esac
else
  echo "=== cfr 默认无工作(维护模式收尾)、未 SSH; 用户未提 yuan-mbp 有工作 → 日记记『cfr 今日无工作』 ==="
fi

# ---- 3.5 yuenan-mbp 工作机（默认有工作，自动发现桌面所有工作项目）----
# 调 yuenan-mbp 上的 yuenan-scan.sh（glob ~/Desktop/* 自动发现所有工作项目）。yuenan-mbp = 工作机, 桌面所有项目都是雇主团队工作项目。
# 2026-06-27 起根治：取代原 §3.5/§3.5b/§3.5c「每新增 CarysCloud 工作区粘一块 §3.5x」的跑步机 + 桌面新目录/新项目首日盲（6/12 AllinOne、6/27 DAG 两次首日漏扫）。
# 脚本结构: 每个项目 = 多 git 子仓容器(若干后端/前端子仓, 不写死、*/.git glob 自动发现)。
# 口径分流: 有 daily-digest.sh 的工作区(旧 CarysCloud)跑 digest 4 信号; 其余枚举子仓跑 yuenan 分支 git-log:
#   --branches='*yuenan*' glob 抓所有名字含 yuenan 的分支(只我的分支、排除同事/基线/dev、跨多分支单次 walk 去重) + 越南/yuenan 署名过滤(团队共享仓必须过滤排除同事) + AIREADME/CHANGELOG 头部。LC_ALL=C 防漏 CJK 署名。
# 默认有工作 = 始终跑; 仅当触发消息明说「yuenan-mbp 没工作」, agent 把 YUENAN_SKIP=1 才跳过。
# 哨兵 YUENAN_REACHABLE 剥「可达 0 改动 vs 不可达」; 脚本尾 YUENAN_SCAN_WORKSPACES=N 确认真跑到 + 发现 N 个工作区; YUENAN_SCAN_MISSING = 可达但脚本没部署/坏。
# ⚠️ 2026-06-08 起雇主项目私仓内与其他项目同等详记（日记 + caryscloud.md/对应项目页）；保留：① 项目页 RAG 排除(挡公开主页) ② 团队成员真名抽象
#    ③ 公开镜像同步时按既定脱敏策略处理。
# 脚本本体只活在 yuenan-mbp（含雇主目录/仓名/分支模式/署名），不进 worklog 仓、不进公开镜像（同 daily-digest.sh 先例）；改扫描逻辑改远端脚本、新项目零改 skill（auto-discover）。
YUENAN_SKIP=""   # 仅当用户明说 yuenan-mbp 没工作时由 agent 置 1（默认空 = 始终扫）
if [ -z "$YUENAN_SKIP" ]; then
  yc=$(ssh -o ConnectTimeout=8 yuenan-mbp "echo YUENAN_REACHABLE; \
    if [ -x ~/Desktop/yuenan-scan.sh ]; then ~/Desktop/yuenan-scan.sh '$D'; else echo YUENAN_SCAN_MISSING; fi" 2>/dev/null)
  case "$yc" in
    *YUENAN_SCAN_MISSING*) echo "=== yuenan-mbp ⚠️ 可达但 yuenan-scan.sh 缺失/不可执行 → 引言块标、勿当 0 改动 ===" ;;
    YUENAN_REACHABLE*) printf '=== yuenan-mbp 工作机 (可达) ===%s\n' "${yc#YUENAN_REACHABLE}" ;;
    *) echo "=== yuenan-mbp ⚠️ 不可达(合盖/休眠/网络) → 日记引言块标 ⚠️ 待 D+1 补抓 ===" ;;
  esac
else
  echo "=== yuenan-mbp 用户明说今日无工作 → 跳过扫描、日记记无 ==="
fi

# ---- 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) 归前一天，扫描窗口要覆盖。
- **本机扫不到的盲区**： Yuan-MBP cfr（**默认无、维护收尾**，仅用户提才抓）+ yuenan-mbp 工作机（**默认有**，yuenan-scan.sh 自动发现桌面所有工作项目扫，私仓详记）+ 其他全靠触发消息附带信息。
- **yuenan-mbp scan = 输入**： §3.5 调远端 `yuenan-scan.sh $D` 返回的各工作项目段（有 digest 的工作区跑 digest 4 信号 / 其余跑 yuenan 分支 git-log + CHANGELOG）作当天理解输入；**2026-06-08 起与其他项目同等详记（私仓）**，保留对应项目页 RAG 排除 + 团队成员真名抽象 + 公开镜像脱敏。
- **yuenan-mbp 桌面 auto-discover（2026-06-27 起根治）**： yuenan-mbp = 工作机，桌面工作项目会持续增多（现 3 个 CarysCloud 工作区，每个含多 git 子仓；未来会建新项目）。**不再每新增一个工作区粘一块 §3.5x**（6/12 AllinOne、6/27 DAG 两次首日漏扫的教训）：远端 `yuenan-scan.sh` glob `~/Desktop/*` 自动发现所有工作项目 + 按口径分流（digest / yuenan 分支 git-log）+ `*/.git` glob 自动发现子仓，**新项目 / 新仓零改 skill 自动纳入**；非工作区目录（如 feishu 文档缓存）自动跳过。CarysCloud 系归 [[caryscloud]] 项目页分子线记；新发现的非 CarysCloud 项目按内容判断归属（caryscloud 子线 vs 新建项目页），拿不准 Step E 标一句让用户晨起定，默认按工作机私有处理。**脚本本体只活在 yuenan-mbp**（雇主目录 / 仓名 / 分支模式 / 署名都在远端），故 SKILL.md 内无逐项目雇主坐标，公开镜像 personal-skills 只需脱敏 §3.5 一块的主机名 + 脚本名。
- **SSH 不可达**： Yuan-MBP / yuenan-mbp 合盖休眠等情况，日记引言块标 ⚠️「 SSH 不可达，远程工作待 X+1 补抓」（参考 5/26 / 6/4 日记）。不阻塞，Step E 不报错。
- **AIREADME 漂移雷达（§2.5）**： 对今日活跃 + 本地有 `AIREADME/` 的项目，复用 `aireadme/check.sh --drift` 算 AIREADME 落后 HEAD 多少 commit，漂移项转述进 Step E 报告。**只暴露不自动改**（`/aireadme update` 有确认门）。解决 AIREADME「init 做到位、update 没人记得跑」导致的无声漂移。远程项目（cfr / CarysCloud）无本地 AIREADME，不在范围。**内容新鲜度门（2026-06-27 加）**： 报「落后」前先查该项目 `AIREADME/` 今日窗口内有无 commit，有则抑制（= 自有 session 项目如 [[petslog]] / [[]] 自己在维护 AIREADME、worklog 侧锚点不 bump 致恒报「落后」是噪音；建议的 `/aireadme update` 也是项目 session 职责、非 ingest 操作者能跑）。用真实新鲜度替代按所有权手维护 skip 名单，自动覆盖未来项目，且不误伤 worklog 自身（今日 AIREADME 没 commit → 照常报）。

---

## Step B: 解析触发消息（不提问、不等待）

**目标**：把用户触发消息里附带的信息解析成 brain-dump，没提到的项用上方[默认值表](#默认值表触发消息没提到时按此处理全部不追问2026-06-27-用户逐项确认)填空。**绝不向用户提问、绝不等待回话**（用户睡前发完即离线，见「核心交互模型」）。

### 解析触发消息

触发消息形如「记录今天 + 」，附带信息自由格式（「有什么工作 / 哪台机器没工作 / 发生什么事」）。逐句识别对应项：

- **机器工作状态**：「yuan-mbp 有工作」→ agent 置 `CFR_SCAN=1`（默认空 = 不抓）；「yuenan-mbp 没工作」→ 置 `YUENAN_SKIP=1`（默认空 = 扫）；没提 = 按默认（cfr 不抓 / yuenan 扫）。
- **当天主线 / 项目提示**：「今天主要在 X 项目 / 新建了 Y」→ 作主线识别 + 归属判断输入（auto-discover 已兜底发现，用户点一句更准）。
- **求职 / 对外 / 生活 / 特殊强调**：用户提到的归对应段；没提到的按默认（无）。
- **日期 / 模式**：「记录昨天 / 5 月 X 日」→ 对应归属日；「补充 / 更新」→ 对应模式。日期边界永远 7:00、从不问。

### 解析规则

- **客观数据以扫描为准、用户独有信息以触发消息为准**：扫描扫到的项目工作照常记（不依赖用户提）；用户独有、扫不到的信息（求职 / 生活 / 对外 / 强调）只认触发消息说的。
- **用户明说的覆盖默认**（「petslog 今天发版」→ 对外段记；「yuan-mbp 有工作」→ 反转抓 cfr）。
- **用户没提到的项一律走默认值表**，不脑补、不追问；日记对应段写「无」/「均无」。
- **纯「记录今天」无任何附带信息** → 全部走默认（cfr 无 / yuenan 扫 / 求职·对外·生活无），照跑，Step E 标一句「未附带信息、按默认跑、请核对」。
- **重要沟通 / 跨 session 同步**：不主动找，但用户在触发消息里提到的必接（归对应段）。
- **遇到任何歧义**：用规则 / 默认自己拍 + 日记标 ⚠️，**绝不停下提问**。
- **§2.1 报缺口**（前几天有 comm

…

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [iyuenan3](https://github.com/iyuenan3)
- **Source:** [iyuenan3/personal-skills](https://github.com/iyuenan3/personal-skills)
- **License:** Apache-2.0

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-iyuenan3-personal-skills-worklog-ingest
- Seller: https://agentstack.voostack.com/s/iyuenan3
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
