# 04 — 任務層：六個檔，各答一個問題

上一層：[03 記憶層](03-memory.md)　下一層：[05 四層防線](05-guards.md)　模板：[templates/](templates/)

---

## 核心判準

> **寫任何一句話之前，先問「它在回答哪個問題」—— 答案就是它的家。**
> 寫錯地方的代價不是亂，是**兩份日後一定會漂移**，而且沒有人會發現。

| 這句話在回答 | 它的家 | 性質 |
|---|---|---|
| 接下來做什麼、**還要花多少時間** | `work.txt` | 存量表，唯一權威，**一列一行** |
| 那天發生什麼、當下為什麼那樣選 | `2026Q3.txt`（當季日誌） | **append-only**，季末凍結 |
| 做完了嗎、怎麼證明 | `version1.txt`（證據帳本） | 每列＝結論＋**實測數字**＋指回日誌 |
| 點哪顆按鈕、手把手怎麼做 | `todo.txt`（操作手冊） | **消耗品**，做完就刪 |
| 我自己用的時候撞到什麼 | `dogfood.txt` | **raw inbox**，當場丟一行、不整理不判斷 |
| 我學到什麼、怎麼對外講 | `interview/*.md` | 知識庫，不換季 |
| 設計上為什麼是這個形狀 | 規格（`openspec/**`） | — |
| 事故的來龍去脈與教訓 | `POSTMORTEMS.md` | 永久、可證偽的具體事故 |
| 被否決／被取代的決策 | 記憶層作廢紀錄 | 見 [03](03-memory.md) |

> 🚨 **年度資料夾就是那幾個檔，不要開第七個。**
> 新資訊沒有家的時候，正確動作是**回答上表那句話**，不是開新檔。

---

## 排程表（`work.txt`）：唯一回答「還要花多少時間」的地方

它是整套系統唯一的排程權威。結構分成六節，但**核心只有兩層**：

```
§三  兩張索引  ← 只回答「還要花多少時間」，一列一行，不准長出續行
       ├─ 未完成工作包（存量表：只放還沒做完的）
       └─ 技術債索引
§五  技術債細節（T 系列）
§六  工作包細節
```

**§三 是索引，細節住 §五／§六 —— 雙向對齊由守衛檢查。做完＝兩邊都移出。**

### 🚨 一列一行：一條被違反三次的規則

排程表的每個工作包必須是**一行**：

```
FN  推播上線      8h   後端 job ＋ 前端訂閱 ＋ 兩平台測試
GP  養成綁帳號    6h   資料搬遷 ＋ 三支端點 ＋ 回歸
```

而不是：

```
FN  推播上線      8h   後端 job ＋ 前端訂閱
      ↳ 注意 iOS 要另外處理憑證
      ↳ 這個可能會拖到下週
```

理由：**續行會讓人必須逐列重讀，才知道哪些還算數。** 而這張表的存在目的就是「三秒看完剩餘工時」。

這條規則被違反三次之後才補上守衛。**這是全套系統最有代表性的一課**（見 [02](02-rules-file.md)）：
規則寫得再清楚，都不如一支會數的腳本。

---

## 🧾 交付當下就登記（HARD RULE）

> **判準：沒寫進檔案的進度＝不存在的進度；寫錯的進度＝存在的假進度，更毒。**

**這是交付的一部分，不是可選收尾。** 每次交付（功能完成／migration 套用／端點新增／技術債清償），
在**同一個工作階段內**做完這四件事：

```
1. 排程表 §三  整列移出（做完的不留在存量表裡）
2. 當季日誌    補一則敘事（那天發生什麼、為什麼那樣選）
3. 證據帳本    補一列（結論 ＋ 當下實測的數字 ＋ 指回日誌）
4. 索引        涉及擴充點就更新
```

### 五條配套判準

1. **存量表只放還沒做完的。** 做完整列移出，〈已完成〉補一行（`X ✅日期 一句話`）。
2. **✅ 的唯一標準＝「實際做到 ＋ 驗過」**，數字必須是當下實測的，不是計畫值。
   每列都要能回答「**這個狀態最後一次驗證是什麼時候**」。
3. **重排前先重驗進度表**：逐列問「最後驗證是何時」，超過兩週沒驗的要重驗再排。
4. 🚨 **登記的對象不只「完成品」，還包括「新產生的工作量與落差」。**
   只要一場對話產出新提案／新估時／新落差，同一個工作階段內就要進排程表。
   **寫進規格或證據帳本不算數** —— 那兩個檔答的是「為什麼這樣設計」與「做完了嗎」，
   **都不是「還要花多少時間」**。少登記一次就憑空少算數十小時。
5. **沒有觸發條件的不是技術債，是還沒做的工作。** 技術債每一筆都要寫 `時機＝…`
   （例：「時機＝第一個真實使用者註冊後」），否則它會永遠躺在那裡假裝有人在管。

---

## ⚠️ 並行寫入：一個很難發現的坑

多個 AI 對話同時開著、或你自己開著一個舊版的編輯器 —— **它任何一次存檔都會把整個舊內容寫回去**，
靜默蓋掉別人剛寫進去的東西。

三條防法：

```
1. 每一個寫入步驟後都 grep -c 驗一次識別字，不是最後驗一次。
   （最後跑守衛是綠的，證明不了中間那一步還在）
2. 讀取端也要驗：讀完到寫入之間那幾分鐘就夠別人寫進新東西了；
   照記憶裡的行號整檔覆寫 ＝ 把它靜默刪掉。
3. 大檔案一律用精確的字串替換，不要整檔重寫。
```

這在 AI 協作裡特別容易發生，因為 agent 很習慣「讀進來、改一改、整份寫回去」。

---

## 換季儀式

日誌檔按季切（`2026Q2.txt` / `2026Q3.txt`），**季末凍結，不再修改**。
排程表、證據帳本、操作手冊則是**連續的**，不換季。

分界很簡單：

> **會不會隨時間失效？** 會的（日誌、課表）就換季；不會的（知識庫、證據帳本）就不換。

換季的時候只做三件事：開新日誌檔、在舊檔最後寫一行「已凍結，後續見 QN+1」、
把排程表裡「已完成」那一區壓縮成一行摘要。

---

## 技術債的兩個入口

技術債要**同時**登記在兩個地方，而且由守衛檢查兩邊對齊：

```
§三 技術債索引：T87  DB 連線池未調校          時機＝並發 >50
§五 技術債細節：T87  ...症狀／影響／怎麼修／為什麼現在不修（5-10 行）
```

為什麼要兩份？因為它們回答不同問題：索引回答「還有幾筆、各要多久」，細節回答「怎麼修」。
**兩份會漂移，所以必須有守衛去對。** 這是整套系統裡唯一刻意允許的重複，代價是配一支檢查。

---

## 為什麼不用專案管理工具

這一問很合理。用純文字檔的四個理由：

1. **AI 讀得到。** Jira / Notion / Linear 的內容要透過 API 或 MCP 才進得了上下文，
   純文字檔 `cat` 一下就有，而且 diff 看得懂。
2. **它在版控裡。** 「三週前這個工作包估幾小時」是 `git log` 一行就答得出來的問題。
3. **守衛能驗它。** 一列一行、兩張表對齊、日期格式 —— 這些都是 20 行 Python 就檢查得完的事。
4. **零延遲。** 登記進度的摩擦力越低，越可能真的登記。

⚠️ **誠實邊界**：這個選擇在**多人團隊**會立刻失效（併發編輯、通知、看板視圖）。
它是「單人 ＋ AI」這個特定形狀的解，不是通用建議。

---

## 接下來

- 四層防線的實作 → [05-guards.md](05-guards.md)
- 任務檔模板 → [templates/work.txt](templates/work.txt)、[templates/journal.txt](templates/journal.txt)、[templates/evidence.txt](templates/evidence.txt)
- 交付登記的 prompt → [prompts/05-delivery-registration.md](prompts/05-delivery-registration.md)
