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>+ formatfeat(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:個資偵測(prompt:「偵測此訊息是否含人名、公司名、email、電話、身分證號。回傳 JSON:
{hasPII: bool, detected: string[]}」) - 階段 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 通過後 |