📚職涯停看聽・知識庫← 總部儀表板
📅最後更新:2026/05/03
📑 目錄

RCF-031:LINE AI 助理 Brief(inbox 手機自動化)

建立日期:2026-05-01 觸發條件:5(影響 2+ 技術系統的架構決策) 狀態:✅ Brief 定稿(v1.2),Phase 1.5 ✅ + Phase 2 ✅ + Phase 3 ⚠️ 部分通過(Gemini 429 BLOCKED Step 3-5,待 Phase 3.5 修 Bug 1+2 + Quota 重置後重測) 改版上限:v1.0 → v1.3(封存舊版 = git history) 版本:v1.2(2026-05-02 補記 Phase 3 偏離 spec 觀察) 產出依據:Session 81 Tim 七輪追問 / 60+ 缺口處理 / 4 項 WebSearch 驗證 / IMP-092 教訓對應 + Session 83 Phase 2 啟動前六輪追問 32+ 缺口處理(含技術棧質疑) Brief 檔位:本文件 = Brief 主檔,後續實作以本文件為單一參考源


v1.2 補記說明(2026-05-02,Phase 3 部分通過後)

依 Phase 3 端到端測試實際運行結果,補記三項 spec 偏離觀察 + 兩個 Bug + Phase 3.5 修補項目:

Phase 2 vs spec 偏離(已確認,補記不修 spec)

# 項目 spec 描述(v1.1) Phase 2 實作 處置
1 KV 全文存檔(>200 字) Section 6.1 #3 規定長訊息存 KV 未實作,所有訊息一律 sanitize 後 200 字截斷寫入 inbox 補 P3 任務「Phase 2.5 KV 全文存檔」
2 escapeMarkdown 範圍 Section 6.2 未明示範圍 line-webhook.js L399-402 只 escape 首字 ^[#\->\*] spec 未明示,行為合理(避免 # 被當標題、* 被當粗體),保留
3 PII detection 對 IG/Threads @ 帳號 Section 5 未明示 @ 帳號是否視為個資 Gemini 把 @betweengos 識別為個資 → 攔截 保守攔截 + !force 例外為完整退路,符合 D3-A 設計精神,保留

Phase 3 發現的 Bug(進 Phase 3.5 修)

Bug 描述 修法 優先級
Bug 1 classify Gemini 429/500 catch 後無 pushMessage 通知 → Tim 不知道訊息掉了 catch 加 pushMessage('⚠️ 訊息分類服務暫時故障,請稍後重試或加 !force') P2.5
Bug 2 M5 圖片無寫入 inbox 也無錯誤訊息(可能與 Bug 1 同源,或圖片 handler 獨立 bug) Quota 重置後重測 M5;若 Bug 1 修了仍不寫入 → 查 line-webhook.js L99-143 圖片處理路徑 P2.5

Phase 3 確認通過項目(Phase 4 不啟動,先過 Phase 3.5)

  • ✅ Step 1:HMAC-SHA256 簽章驗證(無 sig + 偽造 sig 皆 401)
  • ✅ Step 2 部分:M1(網頁URL)+ M3(PII 攔截)+ M4(研究主題)三條核心路徑通過
  • ✅ Step 6:commit author = Tim-LINE-Bot <247732825+shoppy09@users.noreply.github.com> + format feat(inbox): LINE [類型] YYYY-MM-DD HH:MM
  • ✅ Step 7:SYS-10 進 inventory.json,status = deployed_unverified(不可標 live)

Phase 3.5 啟動條件

  • Gemini quota 重置(次日台灣時間 ~16:00 PT 重置)
  • Bug 1 修法 + deploy
  • 完整重跑 Step 2-5(M2/M5 + Step 3 PII / Step 4 !force / Step 4.5 Markdown / Step 5 並發)

v1.2 不影響項目

  • Section 1-5 帳號方案/閉環機制/技術架構/userId 防守/資安要求 = 不變
  • Section 6.1 #1-#2、Section 7 之後 = 不變
  • 5 Phase 結構 = 不變(Phase 3 內含 Phase 3.5 子階段,不單獨計數)

v1.1 修訂說明(2026-05-01)

依 Phase 2 啟動前 Session 83 六輪追問共 32+ 盲點處理結果,重大方向變更:

變更 v1.0 v1.1
技術棧 Google Apps Script (GAS) Vercel Serverless Function(Tim 已熟 5 系統 + 解決 GAS 多項限制)
inbox.md schema 多行 H2 區塊 單行 - [ ] 對齊 inbox 既有 5 類路由表
資安 - signature 驗證 GAS 限制無法實作 Vercel 提供 HTTP headers,可實作
資安 - 個資攔截(D3-A 新增) Gemini 兩階段偵測 + Tim 白名單 + !force 例外
doPost 處理流程 GAS 同步 + Time-trigger 補 push Vercel async/await + reply 立即 + push 補後續
Idempotency cache PropertiesService 50 keys Vercel KV (Upstash Redis) 256MB / 500K cmd/月
Phase 結構 Phase 1 ✅ → Phase 2 新增 Phase 1.5 GAS→Vercel 遷移

v1.0 封存方式:採 git history(git log knowledge/decisions/RCF-031-line-ai-assistant.md)即視為封存,無需另存 archived 副本(RCF-001 慣例補入)


Section 1:問題定義 + 帳號方案決策 + 閉環機制決策

1.1 問題定義

RCF-023「整理知識庫」SKILL 後續行動明列「LINE AI 助理(inbox 手機自動化)」為待開發任務。當前 Tim 需電腦端開 Claude Code 才能寫入 knowledge/inbox.md,手機端無便捷捕捉路徑 → Tim 在外靈感、文章連結、待辦觀察容易遺失。

1.2 帳號方案決策:方案 B(新開內部用 LINE OA 帳號)

維度 方案 A 共用 SYS-05 方案 B 新帳號 ⭐
客戶體驗風險 高(程式 bug 影響所有客戶) (新帳號無客戶)
既有 3 組關鍵字保留 需處理 無此問題
開發迭代心理門檻 高(影響營運帳號)
申請成本 0 5-10 分鐘
月費 NT$0 NT$0(同一 Business ID 可建 100 個 OA)

選 B 理由:風險隔離原則 + 簡化 Brief 結構 + 對應 IMP-092 教訓

1.3 閉環機制決策:39-B 短期 + 39-A 長期混合

階段 機制 觸發
短期(v1.0) 39-B:每次對話收尾自查時 Claude 主動掃 inbox 提報 RCF-032 已升規
中長期(v1.1+) 39-A:Vercel Cron Job 排程每日 07:00 自動讀 inbox + Gemini 分類路由 Phase 5 衍生 P3

Section 2:三層架構圖 + inbox.md schema + 訊息類型路由

2.1 架構圖(v1.1:GAS → Vercel Function)

Tim 手機 LINE
    ↓ 傳訊息
新 LINE OA Bot「Tim 知識管家」(內部用)
    ↓ Webhook event POST + x-line-signature header
Vercel Serverless Function /api/line-webhook(Hobby 60s 上限)
    ↓ 1. signature 驗證(HMAC-SHA256,Vercel 提供 headers)
    ↓ 2. userId 過濾(非 Tim → 不處理)
    ↓ 3. Vercel KV 查 idempotency key(防 LINE retry 重複)
    ↓ 4. reply「✅ 收到,整理中」立即返回 LINE
    ↓ ─── async 後續處理 ───
    ↓ 5. Gemini API 兩階段:① 個資偵測 ② 分類摘要
    ↓ 6. GitHub Contents API 寫入 knowledge/inbox.md(SHA 樂觀鎖 + retry 3 次)
    ↓ 7. LINE pushMessage 回 Tim「✅ 已記入 inbox [類型]」或「⚠️ 個資攔截」

2.2 inbox.md schema(v1.1:對齊既有單行格式)

每條條目固定格式(對齊 inbox.md 既有路由表 + 「整理知識庫」SKILL Step 6):

- [ ] [LINE YYYY-MM-DD HH:MM] [類型] 主要內容 // Gemini 摘要

類型 5 類字串(嚴格對齊 inbox.md 路由表):

  • 網頁URL / YouTube / IG-Threads帳號 / 研究主題 / 本機文件

寫入位置## 待處理項目\n\n 之後、第一個 --- 之前 第一次寫入:偵測「(空,等待第一筆記錄)」字串並一併移除

桌機/手機統一(M 缺口處理):

  • 手機端 Bot 寫入:- [ ] [LINE 日期 時間] [類型] 內容 // 摘要
  • 桌機端 Claude 寫入:- [ ] [Tim-桌機 日期 時間] [類型] 內容 // 摘要
  • 兩者皆使用相同 5 類類型字串,差異只在來源標籤(LINE vs Tim-桌機)

WHY 對齊既有格式

  • 「整理知識庫」SKILL Step 6 路由邏輯依「項目類型」字串對應 → 新格式直接相容無需修改 SKILL(RCF-033 不觸發)
  • RCF-032 收尾自查 N 計數仍以 - [ ] 開頭計數,新格式相容
  • Tim 桌機端既有寫法(無前綴)改為加前綴,整體一致性高 + 來源可追溯

2.3 訊息類型路由

message.type 處理
text 走 Gemini 兩階段(個資偵測 + 分類)→ inbox(主路徑)
image 寫入 [image] + 媒體 ID 到 inbox(暫不下載),Tim 之後手動處理
sticker / file / audio / video / location reply「⚠️ 此類型暫不支援整理」+ 不寫 inbox

Section 3:外部 SaaS 設定清單(v1.1:5 項 + Vercel KV)

# 項目 設定要點
1 新 LINE OA 帳號(Phase 1 ✅ 已完成) 「Tim 知識管家」@655aqyqv
2 LINE Developers Console(Phase 1 ✅ 已完成) Channel Secret + Channel Access Token + 停用 Auto-reply / Greeting
3 Vercel Project(Phase 1.5 新建) 獨立 project 名 tzlth-line-bot不加入既有 5 系統),repo shoppy09/tzlth-line-bot 新建空 Next.js
4 Vercel KV / Upstash Redis(Phase 1.5 新建) Vercel Marketplace 安裝 Upstash Redis;free tier 256MB + 500K commands/月 + 10 databases free(Tim 用量遠低於上限)
5 Gemini API(Phase 1 ✅ 已取得 key) Google AI Studio 取得;Phase 1.5 從 GAS PropertiesService 移轉至 Vercel env vars
6 GitHub Fine-grained PAT(Phase 1 ✅ 已取得) scope Contents: Read & Write + repo 限定 shoppy09/tzlth-hq;30 天輪替計畫(Phase 5 加入 weekly-schedule.md 月底任務)

Section 4:userId 防守邏輯 + 程式碼範例(v1.1:TypeScript / Vercel Function)

// /api/line-webhook.ts (Vercel Serverless Function, Node.js runtime)
import { NextApiRequest, NextApiResponse } from 'next';
import crypto from 'crypto';
import { kv } from '@vercel/kv';

export default async function handler(req: NextApiRequest, res: NextApiResponse) {
  // ① Signature 驗證(v1.1 新增 — Vercel 提供 HTTP headers)
  const signature = req.headers['x-line-signature'] as string;
  const rawBody = JSON.stringify(req.body);
  const hash = crypto.createHmac('sha256', process.env.CHANNEL_SECRET!).update(rawBody).digest('base64');
  if (signature !== hash) return res.status(401).end();

  const event = req.body.events[0];

  // ② userId 過濾
  if (event.source.userId !== process.env.TIM_USER_ID) {
    await replyMessage(event.replyToken, '此帳號為內部使用,無法回應外部訊息');
    return res.status(200).end();
  }

  // ③ Idempotency 防 retry 重複(Vercel KV)
  const eventKey = `evt:${event.webhookEventId}`;
  if (await kv.get(eventKey)) return res.status(200).end();
  await kv.set(eventKey, '1', { ex: 30 * 24 * 60 * 60 }); // 30 天 TTL,自動過期免手動清理

  // ④ 立即 reply「✅ 收到」(避免冷啟動 + Gemini 兩階段超時 LINE 5 秒上限)
  if (event.message.type === 'text') {
    await replyMessage(event.replyToken, '✅ 收到,整理中...');
    res.status(200).end(); // 200 後 Vercel Function 仍可繼續執行(Hobby 60s)

    // ⑤ async 後續:Gemini 兩階段
    try {
      const piiCheck = await detectPII(event.message.text); // D3-A 個資攔截
      if (piiCheck.hasPII && !event.message.text.startsWith('!force')) {
        await pushMessage(event.source.userId, `⚠️ 訊息含疑似個資(${piiCheck.detected}),未寫入。如為公開資訊請加 \`!force\` 重傳`);
        return;
      }

      const cleanText = event.message.text.startsWith('!force') ? event.message.text.slice(6).trim() : event.message.text;
      const { category, summary } = await classifyAndSummarize(cleanText);
      await writeToInbox({ category, summary, original: cleanText, timestamp: new Date() });
      await pushMessage(event.source.userId, `✅ 已記入 inbox [${category}]`);
    } catch (err) {
      await pushMessage(event.source.userId, `❌ 處理失敗:${err.message}`);
    }
  } else {
    await replyMessage(event.replyToken, `⚠️ 此類型 (${event.message.type}) 暫不支援整理`);
    res.status(200).end();
  }
}

WHY Serverless 而非 Edge:Gemini 兩階段(個資偵測 + 分類)可能 > 10 秒,Edge Function 10s 上限太緊,Serverless 60s 上限充裕


Section 5:資安要求(v1.1 升級)

5.1 基礎防護(v1.0 既有)

  • ✅ Webhook signature 驗證(HMAC-SHA256,Vercel 提供 headers,v1.1 已可實作
  • ✅ 5 項憑證全部放 Vercel env vars(CHANNEL_SECRET / CHANNEL_ACCESS_TOKEN / TIM_USER_ID / GEMINI_API_KEY / GITHUB_PAT),零硬編碼
  • ✅ GitHub Fine-grained PAT scope 最小化:contents:write + repo 限定 shoppy09/tzlth-hq
  • ✅ PAT 30 天輪替計畫(Phase 5 加入 weekly-schedule.md 月底任務)
  • ✅ Logger 過濾:error log 只記 error.message + stack 首 3 行,不寫 user input / token / userId

5.2 個資攔截規則(v1.1 新增 D3-A)

目的:防止 Tim 諮詢中順手手機筆記時,客戶識別資料誤入 Gemini API(依其條款可能用於模型訓練)+ 永久存於 hq repo

Gemini 兩階段流程

  1. 階段 1:個資偵測(prompt:「偵測此訊息是否含人名、公司名、email、電話、身分證號。回傳 JSON: {hasPII: bool, detected: string[]}」)
  2. 階段 2:分類摘要(僅當階段 1 通過或 !force 時執行)

Tim 白名單 seed(Vercel env var WHITELIST_SEEDS,可由 Tim 自訂擴充):

蒲朝棟,Tim,蒲老師,蒲顧問,職涯停看聽,shoppy09,
Anthropic,Claude,Google,Gemini,Vercel,Render,GitHub,LINE,
Microsoft,Notion,NotebookLM,OpenAI,YouTube,Threads,Instagram,Facebook

Gemini prompt 強制忽略白名單(白名單詞出現不算個資)

!force 例外:訊息開頭加 !force → 跳過個資偵測直接寫入(用於公開資訊或 Tim 確認過的內容)

攔截後行為:reply「⚠️ 訊息含疑似個資(XX),未寫入。如為公開資訊請加 !force 重傳」+ 不寫 inbox

5.3 殘留風險聲明

  • Webhook URL 一旦洩漏 → 攻擊者可送假 webhook(signature 驗證可擋;此為第二道防線)
  • Gemini API 處理時依其條款可能保留 — 個資攔截為主要防護
  • Tim userId 已洩漏(Phase 1 截圖事件)→ Phase 4 觀察期通過後 Revoke + Re-issue Channel Access Token 一次性收斂

Section 6:Vercel Function 處理流程(v1.1 重寫)

6.1 響應時間策略

階段 時間 動作
Webhook 收到 → Signature 驗證 → userId/idempotency check < 200ms Vercel Edge 路由
Reply「✅ 收到,整理中」 < 1s LINE replyMessage(5 秒上限內必達)
Async 後續:Gemini 兩階段 + GitHub 寫入 + pushMessage 3-30s Vercel Hobby 60s 上限內

為何 reply + push 雙階段

  • LINE replyToken 僅 1 分鐘有效 + 一次用 → 不能等所有處理完才 reply
  • Gemini latency 不可預測(WebSearch 顯示有 5-30s 案例)→ 同步處理風險過高
  • Vercel async/await 模型支援 reply 後繼續執行(vs GAS 同步限制)

6.2 冷啟動緩解

  • Vercel Hobby Serverless 冷啟動 0.5-2s → 第一個訊息可能逼近 5 秒上限
  • 緩解 1:reply「✅ 收到」設為固定字串(不需 Gemini,最快響應)
  • 緩解 2:Vercel Cron Job 每 5 分鐘 ping /api/keepalive 保暖(可選)

6.3 GitHub Contents API SHA 衝突處理

  • LockService 不再需要(Vercel Function 並發由 Vercel runtime 管理)
  • 422 conflict → re-GET sha + retry 3 次指數退避(1s/2s/4s)
  • 與 Tim 桌機端 Claude Edit 並發:Bot 端 retry,Tim 桌機端 Claude Edit 失敗時自動 re-Read 重試

Section 6.1:邊界處理(v1.1 新增)

# 邊界 處理
1 第一次寫入「(空,等待第一筆記錄)」placeholder 存在 寫入時一併移除 placeholder
2 Markdown 注入(訊息含 --- / ## 標題 / 行首特殊字元) escape:行首 #/-/*/> prepend \ 或全文用 inline code 包裹(v1.1 採前者)
3 訊息超長(LINE 上限 5000 字) Gemini summary 限 80 字;原文超過 200 字 → inbox 只存「[原文 200 字摘要...] (full text saved to evt:XXX)」+ Vercel KV 存全文
4 Gemini 分類字串對齊 prompt 強制回傳 5 類字串之一(網頁URL / YouTube / IG-Threads帳號 / 研究主題 / 本機文件),不在範圍 → 預設「研究主題」
5 commit author email Tim-LINE-Bot <[ID]+shoppy09@users.noreply.github.com>(Phase 1.5 啟動時 Tim 從 GitHub Settings → Email 取得確切 ID)
6 smoke test 訊息語法 Tim 直接傳一般訊息(無需特殊語法),Gemini 自動分類;!force 為個資攔截例外,非必要前綴
7 Vercel KV 50 keys 上限 不適用(Upstash Redis 256MB / 500K cmd/月,無 keys 數量上限;TTL 30 天自動過期)
8 Phase 4 完成標準 — line-keys-temp.txt 處理 Phase 4 觀察期通過 → Tim 刪除本機 C:\Users\USER\Desktop\tzlth-hq\line-keys-temp.txt(憑證已移轉至 Vercel env vars)

Section 7:成本評估(v1.1 更新)

項目 月費 來源
新 LINE OA Free Plan NT$0 100 個 OA 全免費
LINE Webhook 接收 NT$0 免費(核心 API)
LINE replyMessage + pushMessage NT$0 內部用量 << 500/月 push 配額
Vercel Hobby Plan NT$0 Serverless Function 100 GB-Hr/月(內部用量遠低)
Vercel KV (Upstash Redis) Free Tier NT$0 256MB + 500K commands/月 + 10 databases free
Gemini API (gemini-2.5-flash) NT$0 Free tier 充裕(兩階段每天 < 100 calls)
GitHub PAT 寫入 NT$0 既有帳號
總計 NT$0/月 完全免費架構(v1.1 維持)

Section 8:Tim 現況實測前置(Phase 1 ✅ 已完成)

Step 任務 狀態
0-A 申請新 LINE OA ✅ 「Tim 知識管家」@655aqyqv
0-B 命名 / 頭像
0-C 加 Bot 為好友 + 撈 Tim userId ✅ U172248ed05cdcfc150f6d266939c774a(Phase 4 後 Revoke Token 收斂洩漏風險)
1 LINE Developers Console 建 channel + 取 Secret/Token ✅ 存 line-keys-temp.txt
2 Google Apps Script 建專案 ✅(v1.1 將廢棄,Phase 1.5 移轉)
3 Gemini API key + GitHub PAT ✅ 兩項已取

Section 8.5:Phase 1.5 GAS→Vercel 遷移 Tim 操作 checklist(v1.1 新增)

啟動條件:v1.1 Brief 通過後立即執行 預估時間:Tim 操作 30-45 分鐘

Step 任務 預估時間
1 廢棄既有 GAS 部署:開「LINE 知識管家 Bot」GAS 專案 → Manage Deployments → 選既有 Web App → Archive(保留專案不刪除,記錄存查) 3 分鐘
2 新建 GitHub repo:shoppy09/tzlth-line-bot(空 Next.js + 未來 webhook 程式碼用) 3 分鐘
3 Vercel 新建 project:Vercel Dashboard → Add New → Project → Import shoppy09/tzlth-line-bot → 命名 tzlth-line-bot → Deploy 5 分鐘
4 Vercel Marketplace 安裝 Upstash Redis:Vercel Project → Storage → Marketplace → Upstash → Add Integration → 選 Free tier → 安裝至 tzlth-line-bot project 5 分鐘
5 設定 Vercel env vars 7 項:Vercel Project → Settings → Environment Variables → 依序新增(值來自 line-keys-temp.txt + 白名單 seed + Upstash 自動注入) 10 分鐘
Env vars 清單:CHANNEL_SECRET / CHANNEL_ACCESS_TOKEN / TIM_USER_ID / GEMINI_API_KEY / GITHUB_PAT / WHITELIST_SEEDS(白名單 seed) / KV_URL+KV_REST_API_TOKEN(Upstash 安裝時自動注入)
6 部署空殼程式(暫時 reply「⚠️ Bot 尚未實作(Phase 2 啟動前)」)→ 取得 Vercel webhook URL(如 https://tzlth-line-bot.vercel.app/api/line-webhook 5 分鐘
7 LINE Developers Console「Tim 知識管家」channel → Messaging API → Webhook URL → 從 GAS URL 改為 Vercel URL → Verify 3 分鐘
8 Smoke test:手機傳一條訊息給 Bot → 預期 reply「⚠️ Bot 尚未實作」 1 分鐘

Phase 1.5 完成標準:步驟 8 smoke test 通過 → Phase 2 啟動條件達成


Section 9:風險與回滾(v1.1 更新)

風險 緩解
Vercel deployment 出錯 Vercel Dashboard 一鍵 rollback 至前一版本(保留所有 deployment 歷史)
Vercel Hobby 100 deployments/day 上限 Tim 既有 5 系統用量 < 50/day,加 LINE Bot 後仍 < 60/day;極端情況升 Pro $20/月
inbox.md 寫錯 git revert + push(既有 cron 用 git pull --rebase --autostash 不衝突)
並發寫入(Bot vs Tim 桌機端 Claude) GitHub SHA 422 conflict → Bot 端 retry 3 次;Tim 桌機端 Claude Edit 失敗自動 re-Read 重試
高頻 commit 污染 git log Phase 4 觀察期統計實際量 → > N/天 才升級為 batch(無預設閾值,依實況決策)
Webhook URL 洩漏 signature 驗證為主要防線;緊急時重新部署 → 取新 URL → 更新 LINE webhook
Gemini API quota 用完 / 服務中斷 攔截 fallback:若 Gemini call 失敗 → 跳過分類直接以「研究主題」類型寫入;個資偵測失敗 → 預設不寫入並 reply 警告
GAS 完全棄用 Phase 1.5 完成後 GAS 專案 Archive 保留;本機 line-keys-temp.txt Phase 4 後刪除
Tim userId 洩漏 Phase 4 觀察期通過 → Revoke + Re-issue Token + 更新 Vercel env var 一次性收斂

Section 10:實作 P3 衍生條目(v1.1 更新:5 → 6 Phase)

Phase 任務 啟動條件 預估時間 狀態
Phase 1 Tim 現況實測 6 項憑證 Brief 通過 Tim 40 min ✅ 2026-05-01
Phase 1.5(v1.1 新增) GAS→Vercel 遷移 Tim 操作 8 步驟(Section 8.5) v1.1 通過 Tim 30-45 min
Phase 2 Vercel Function 程式碼實作(Section 4 邏輯 + Gemini 兩階段 + GitHub Contents API + Upstash KV) Phase 1.5 完成 Claude 1.5-2 hr
Phase 3 端到端測試(signature 偽造 + 多類型 message + 並發寫入 + 個資攔截)+ SYS-10 inventory.json 新增 + deploy-verify Phase 2 完成 Tim 30 min + Claude 1 hr
Phase 4 上線 + 觀察期 ✅ 2026-05-04 完成(提前通過);Phase 4 END:舊 Token Revoke + 新 Token 發行(expires ~2026-06-03)+ Vercel CHANNEL_ACCESS_TOKEN 更新 Redeploy ✅ + Tim 驗證 Bot 正常 ✅ + line-keys-temp.txt 刪除 ✅;零中斷輪替設計驗證通過;deploy-verify SYS-10-2026-05-04-phase4.md ✅ Phase 3 完成
Phase 5 閉環自動化升級(39-A:Vercel Cron Job 每日 07:00 排程讀 inbox + Gemini 分類路由)+ PAT 30 天輪替加入 weekly-schedule Phase 4 觀察期通過 Claude 3-4 hr ⏳ 啟動條件達成

並行衍生

  • RCF-032 ✅ 已完成(CLAUDE.md 收尾自查掃 inbox HARD STOP,39-B 短期閉環)
  • SYS-10(inventory.json 新增「LINE 知識管家 Bot」內部工具)— Phase 3 完成後執行
  • RCF-033 ❌ 不觸發(Read SKILL Step 6 確認新格式相容)

Section 11:SYS-05 零影響聲明(v1.0 既有,維持)

本案完全不動 SYS-05(既有品牌 LINE OA)的任何設定,驗證方法:Phase 4 觀察期內每週查 SYS-05 LINE OA Manager「自動回應訊息」設定截圖比對。


Section 12:SYS-10 治理決策 + RCF-032 並行升規

12.1 SYS-10 inventory.json 新增(Phase 3 完成後執行)

{
  "id": "SYS-10",
  "name": "LINE 知識管家 Bot",
  "category": "employee",
  "type": "saas-integration",
  "tech_stack": ["LINE Messaging API", "Vercel Serverless Function", "Upstash Redis (Vercel KV)", "Gemini 2.5 Flash API", "GitHub Contents API"],
  "status": "live",
  "owner": "Tim 個人",
  "purpose": "手機端 inbox.md 自動寫入閉環"
}

12.2 RCF-032 ✅ 已完成(2026-05-01 Session 81 升規)


Section 13:RCF 觸發判斷

  • 本 RCF-031:條件 5(影響 LINE OA + Vercel Function + Vercel KV + Gemini API + GitHub API + hq repo 6 系統)✅ 觸發
  • v1.0 → v1.1 修訂:屬內部版本迭代,不觸發新 RCF(封存方式 = git history,RCF-001 慣例補入)
  • 衍生 RCF-032 ✅ 已完成
  • 衍生 RCF-033 ❌ 不觸發(SKILL Step 6 新格式相容)

Section 14:v1.1 修訂跨系統影響聲明(v1.1 新增)

本次 v1.1 修訂涉及以下系統與文件:

系統/文件 影響 處理
RCF-031 主檔 大改 12 段 + 新增 6.1/8.5/14 ✅ 本次完成
RCF-001 補入 v1.0→v1.1 封存慣例(git history) 同步處理
inbox.md 頂部說明 桌機/手機格式統一 同步 Edit
.claude/skills/整理知識庫.md Step 6 ✅ 新格式相容(5 類字串對齊) 不需修訂
knowledge/drive-inventory.md ✅ inbox 不在 Drive 不需修訂
主 CLAUDE.md 步驟 6 第 4 子項 - [ ] 計數規則仍適用 不變
12 部門 CLAUDE.md ✅ RCF-031 屬 KM 範圍非 HARD STOP 不需同步
dev/tasks.md L588 Phase 1 + L589 Phase 2 Phase 1 維持 ✅;Phase 2 啟動條件改為「Phase 1.5 完成」;新增 Phase 1.5 行 同步 Edit
knowledge/CLAUDE.md 最近修改記錄 +1 行 收尾步驟 1
knowledge/decisions/README.md RCF-031 → v1.1 同步 Edit
dev/audit-log.md 改善追溯記錄(規格層 Brief 第一輪未質疑技術棧) 同步 Edit
knowledge/improvements.md IMP-093/094 候選(收尾時) 收尾處理

對 Phase 5(39-A)影響:v1.1 schema 變更後續讀取邏輯需對齊,但 Phase 5 尚未實作,啟動前自然會對齊 ✅ 對既有 GitHub Actions cron 影響:✅ 無(cron 用 git pull --rebase --autostash 處理並發;Bot 用 GitHub Contents API 不衝突)


執行記錄

日期 動作 備註
2026-05-01 RCF-031 Brief v1.0 建立 Session 81,七輪追問 60+ 缺口處理
2026-05-01 Phase 1 完成 ✅ Session 82,5 項憑證齊全 + GAS 撈 userId 測試版
2026-05-01 RCF-031 v1.0 → v1.1 修訂 Session 83,Phase 2 啟動前六輪追問 32+ 盲點處理;重大方向變更:技術棧 GAS → Vercel;新增 Phase 1.5;個資攔截 D3-A;inbox schema 對齊既有格式
待定 Phase 1.5 啟動 v1.1 通過後
← 返回 決策記錄