# EwoooC（原 MOMO Pro System）- 專案憲法 (CONSTITUTION)

> 本文件定義專案開發的核心準則與不可違反的規範
> **建立日期**: 2026-01-12
> **當前版本**: V10.64 (Keep only latest 50 AI product picks pending)
> **最後更新**: 2026-05-01

---

## 🗣️ 第零章：溝通與語法原則
### 第 0.1 條：語言使用
- **所有溝通一律使用繁體中文**。包含：程式碼註解、文檔說明、Commit 訊息、錯誤訊息、日誌輸出、使用者介面文字。

### 第 0.2 條：文檔規範
- 所有文檔使用 Markdown 格式。
- 檔案名稱優先使用英文大寫加底線（例：`CONSTITUTION.md`）。
- 重要變更需記錄在對應正式文件中：入口變更寫 `AGENTS.md`，架構決策寫 ADR，長期專案知識寫 `docs/memory/README.md` 對應條目。

---

## 📜 憲法總綱

本專案憲法旨在確保系統的**穩定性**、**一致性**與**可維護性**。所有開發者（包括 AI 助手）在進行任何程式碼修改前，**必須**詳細閱讀並嚴格遵守本憲法的所有條款。

---

## 第一章：資料庫與模型層規範

### 第 1 條：商品 ID 命名規範（絕對禁止違反）
- ✅ **正確**: 使用 `product.i_code` 作為商品唯一識別碼
- ❌ **禁止**: 使用 `product.momo_id`（此屬性不存在）
- **理由**: Product 模型定義為 `i_code = Column(String(50), unique=True)`
- **影響範圍**: 所有查詢、API、前端顯示

### 第 2 條：時間戳處理規範（絕對禁止違反）
- ✅ **正確**: 使用 `datetime.now(TAIPEI_TZ).replace(tzinfo=None)`
- ❌ **禁止**: 直接使用 `datetime.now()` 或保留 tzinfo
- **理由**: SQLite 不支援時區感知的 datetime，資料庫存儲必須為 naive datetime
- **影響範圍**: 所有涉及時間比對的查詢（價格變動、統計計算）

### 第 3 條：價格變動邏輯（絕對禁止違反）
- ✅ **正確**: 比對「今日最新價格」與「今日之前的最後一筆價格」
- ❌ **禁止**: 僅查詢「昨天 00:00-23:59」的價格記錄
- **理由**: 爬蟲可能跳過某些日期，必須容錯處理
- **實作方式**:
  ```python
  # 取得今日之前的最後一筆價格
  yesterday_prices_subq = session.query(
      PriceRecord.product_id,
      func.max(PriceRecord.id).label('max_id')
  ).filter(
      PriceRecord.product_id.in_(product_ids),
      PriceRecord.timestamp < today_start  # 不限定昨天
  ).group_by(PriceRecord.product_id).subquery()
  ```

### 第 4 條：查詢效能優化（強制要求）
- ✅ **正確**: 使用批次查詢（如 `yesterday_prices_map`）
- ❌ **禁止**: N+1 查詢模式（在迴圈內執行單筆查詢）
- **理由**: 商品數量可達數千筆，N+1 查詢會導致嚴重效能問題
- **影響範圍**: 儀表板、API、統計計算

---

## 第二章：爬蟲與資料採集規範

### 第 5 條：商品圖片 URL 構造（絕對禁止違反）
- ✅ **正確**: 使用 CDN 直接構造
  ```python
  image_url = f"https://m.momoshop.com.tw/moscdn/goods/{i_code}_m.webp"
  ```
- ❌ **禁止**: 使用複雜的 DOM 查詢（8+ CSS 選擇器）
- **理由**: CDN URL 格式固定且穩定，DOM 查詢速度慢且易失效
- **效能提升**: 速度提升 20-30%

### 第 6 條：爬蟲頻率與禮貌性（強制要求）
- ✅ **正確**: 每次請求間隔至少 1 秒
- ❌ **禁止**: 高頻率無間隔爬取
- **理由**: 避免被 MOMO 封鎖 IP

### 第 7 條：錯誤處理與重試機制（強制要求）
- ✅ **正確**: 所有爬蟲函式必須使用 try-except 包裹
- ✅ **正確**: 記錄失敗原因至日誌系統
- ❌ **禁止**: 靜默失敗（吞掉例外）

---

## 第三章：API 設計規範

### 第 8 條：API 邏輯一致性（絕對禁止違反）
- ✅ **正確**: API 的資料處理邏輯必須與儀表板**完全一致**
- ❌ **禁止**: API 與前端使用不同的計算邏輯
- **理由**: 避免前後端資料不一致，造成使用者困惑
- **實例**: `/api/price_change_details` 必須使用與 `get_consolidated_data()` 相同的價格比對邏輯

### 第 9 條：API 錯誤處理（強制要求）
- ✅ **正確**: 所有 API 必須使用 try-except-finally 結構
- ✅ **正確**: 錯誤時返回 JSON 格式: `{'products': []}, 500`
- ✅ **正確**: 記錄詳細錯誤日誌: `sys_log.error()`
- ❌ **禁止**: 返回 HTML 錯誤頁面或純文字錯誤

### 第 10 條：API 效能優化（強制要求）
- ✅ **正確**: 使用批次查詢與預先計算
- ❌ **禁止**: 在迴圈中執行資料庫查詢
- **實例**: 建立 `yesterday_prices_map` 一次性查詢所有商品的歷史價格

---

## 第四章：前端 UI/UX 規範

### 第 11 條：前端 V2 視覺基準（絕對禁止違反）
- ✅ **正式基準**: 前端相關視覺呈現風格與 UI/UX，以 `MOMO Pro/` 新版原型為主要依據。
- ✅ **設計語言**: 米色工作台背景、暖墨文字、焦糖橘 accent、細線框、克制陰影、側邊欄 + 頂部工具列。
- ✅ **資料字體**: 數字、商品 ID、時間、價格與表格欄位標籤優先使用等寬字體。
- ✅ **漲價**: 使用新版 token 的 danger 色系（紅色）。
- ✅ **降價**: 使用新版 token 的 success 色系（綠色）。
- ❌ **禁止**: 新增頁面或更版頁面回到舊紫藍漸層主題、彩色表頭、厚重 KPI 卡片或五彩按鈕風格。
- **依據**: `MOMO Pro/HANDOFF.md`、`MOMO Pro/design-tokens.css`、`docs/guides/frontend_upgrade_roadmap.md`

### 第 12 條：響應式設計（強制要求）
- ✅ **正確**: 所有頁面必須支援手機版（< 768px）
- ✅ **正確**: 既有 Flask/Jinja 頁面可沿用 Bootstrap 5.3.3，但新版 UI 優先使用 V2 tokens 與新版 shell 規範。
- ✅ **正確**: 表格與圖表必須支援橫向滾動（手機版）
- ❌ **禁止**: 僅針對桌面版設計

### 第 13 條：互動體驗（強制要求）
- ✅ **正確**: 所有按鈕、導覽項、表格列與可點擊卡片必須有 hover / active 狀態。
- ✅ **正確**: 使用 V2 token 的 transition，保持快速、安靜、克制。
- ❌ **禁止**: 靜態無互動的 UI 元素

### 第 14 條：字體與可讀性（強制要求）
- ✅ **正確**: 主要文字使用新版暖墨色 token，避免純黑造成刺眼。
- ✅ **正確**: 表格表頭使用米色 paper 底 + 等寬小字標籤；活動 hero 等深色區塊才使用反白文字。
- ❌ **禁止**: 使用純黑色 `#000`（刺眼）
- ❌ **禁止**: 使用低對比度顏色組合

### 第 14.1 條：真實資料與真實頁面（絕對禁止違反）
- ✅ **正確**: 所有新版頁面內容必須接正式後端資料、既有 route/service/API 或明確可追溯的資料來源。
- ✅ **正確**: 尚未完成串接的功能，應顯示真實空狀態、錯誤狀態或「尚未提供資料來源」的可診斷訊息。
- ❌ **禁止**: 使用 mock data、假商品、假 KPI、假排程、假使用者、假頁面或純展示用 placeholder 冒充已完成。
- ❌ **禁止**: 為了符合原型畫面而改寫或捏造業務數字。

### 第 14.2 條：前端文案與工作溝通隔離（絕對禁止違反）
- ✅ **正確**: 前端頁面只放使用者完成任務所需的產品文案、狀態、操作入口與可診斷錯誤。
- ✅ **正確**: 施工紀錄、版本發布說明、AI 工作視窗判斷、Session 溝通、TODO 內容，只能放在文件、日誌或提交訊息，不得搬到使用者可見頁面。
- ❌ **禁止**: 在模板、靜態 JS/CSS 可見文案中放入「本輪已完成」「剛剛修正」「Codex/Claude 評估」「V10.x hotfix」「推到 Gitea」等工作視窗溝通內容。
- ❌ **禁止**: 用內部工程語氣代替產品語氣，例如把頁面寫成施工報告、交接紀錄或 agent 工作摘要。

---

## 第五章：系統架構規範

### 第 15 條：服務端口（絕對禁止違反）
- ✅ **正確**: Flask 使用 **Port 80**
- ❌ **禁止**: 使用 5888 或其他端口（已廢棄）
- **配置位置**: `config.py` 的 `PUBLIC_URL`

### 第 16 條：資料庫路徑（絕對禁止違反）
- ✅ **正確**: `data/momo_database.db`
- ❌ **禁止**: 更改資料庫位置或名稱
- **配置位置**: `config.py` 的 `DATABASE_PATH`

### 第 17 條：時區設定（絕對禁止違反）
- ✅ **正確**: 使用 `TAIPEI_TZ = pytz.timezone('Asia/Taipei')`
- ❌ **禁止**: 使用 UTC 或其他時區
- **理由**: 所有業務邏輯基於台北時間

### 第 18 條：日誌系統（強制要求）
- ✅ **正確**: 使用 `sys_log.info()` / `sys_log.error()` 記錄關鍵操作
- ✅ **正確**: 日誌格式必須包含 `[模組] [功能] 狀態 | 詳細資訊`
- ❌ **禁止**: 使用 `print()` 輸出日誌

### 第 18.1 條：健康檢查與監控目標（強制要求）
- ✅ **正確**: Docker healthcheck、CD health check、Blackbox HTTP 監控必須打 `/health`，不可打 Dashboard 首頁 `/` 作為可用性探測。
- ✅ **正確**: Gunicorn runtime 必須保留可併發回應輕量 health check 的 worker 設定，例如 `gthread` + `GUNICORN_THREADS`。
- ❌ **禁止**: 用會觸發大量 DB 查詢或模板渲染的頁面作為探測目標，避免監控流量本身造成 worker starvation。

### 第 18.2 條：AI / LLM 路由主機紅線（絕對禁止違反）
- ✅ **正確**: 所有 AI Agent、LLM 推理與 embedding 預設必須走 Ollama 三主機級聯：GCP-A `34.87.90.216:11434` → GCP-B `34.21.145.224:11434` → 111 `192.168.0.111:11434`。
- ✅ **正確**: 所有通用文字生成、Q&A 第一響應、Hermes、NemoTron qwen3 路徑、AiderHeal 與 embedding 必須透過 `services/ollama_service.resolve_ollama_host()` 或同等核准 wrapper 取得主機。
- ✅ **正確**: Gemini 只能作為 Ollama 主路徑失敗後的備援，或 ADR-028 明確鎖定的低頻特殊場景。
- ✅ **正確**: `GEMINI_API_HARD_DISABLED` 預設必須為 `true`，`GEMINI_FALLBACK_ENABLED` 預設必須為 `false`；即使 `GEMINI_API_KEY` 存在，也不得出站呼叫 Gemini，除非操作員明確解除 hard switch 並開啟緊急備援。
- ❌ **禁止**: 將 `AI_PROVIDER`、`OLLAMA_HOST`、`HERMES_URL`、`EMBEDDING_HOST`、`OLLAMA_API_BASE` 指向非 GCP-A / GCP-B / 111 的 Ollama 端點。
- ❌ **禁止**: 新增 Gemini-first 的 AI Agent、LLM caller 或把 Gemini 設為通用預設 provider；新增 Gemini caller 必須走 ADR review。
- ❌ **禁止**: 繞過 `services.gemini_guard` 直接初始化 Gemini SDK 或直接用 `GEMINI_API_KEY` 打 Google Gemini REST API。
- ❌ **禁止**: 使用 188 主機作為 Ollama 節點；188 只作為 App/DB/容器宿主與 AutoHeal target。

---

## 第六章：版本管理規範

### 第 19 條：版本號更新（強制要求）
- ✅ **正確**: 每次功能更新必須修改 `config.py` 的 `SYSTEM_VERSION`；`app.py` 僅從 config 匯入顯示。
- ✅ **格式**: `V主版本.次版本` (例如: V9.4)
- ❌ **禁止**: 修改功能但不更新版本號

### 第 20 條：備份系統（強制要求）
- ✅ **正確**: 重大更新前必須執行 `python backup_system.py`
- ✅ **排除目錄**: `['backups', '__pycache__', '.git', '.idea', '.vscode', 'bin', 'bin 2']`
- ❌ **禁止**: 跳過備份直接上線

### 第 21 條：TODO 文件維護（強制要求）
- ✅ **正確**: 完成功能後更新 `TODO_NEXT_STEPS.txt` 標記 ✅
- ✅ **正確**: 記錄修改的檔案與行數
- ❌ **禁止**: 完成任務但不更新文件

---

## 第六之一章：模組化治理規範

### 第 21.1 條：模組分層與大檔治理（強制要求）
- ✅ **正確**：新功能必須先放入對應層級：`routes/` 只處理 HTTP/Blueprint glue，`services/` 放商業邏輯與外部 API client，`database/` 放 ORM/DB access，`utils/` 放無狀態共用工具，`templates/` 放 UI。
- ✅ **正確**：`app.py` 只保留 Flask 初始化、Blueprint 註冊、啟動自檢、版本與全域設定；禁止新增 route、長函式或商業邏輯。
- ✅ **正確**：現有超過 800 行的 Python 檔案視為拆分技術債，只能做 bugfix / 安全修補 / 搭橋式抽離；新增功能前應優先抽 shared service 或子模組。
- ✅ **正確**：新增或修改導致 Python 檔案超過 600 行時，必須先評估拆模組；超過 800 行必須更新 `docs/memory/code_modularization_inventory_20260430.md` 與對應測試，並寫出拆分計畫。
- ❌ **禁止**：把可共用邏輯藏在 route、template helper 或單一巨檔內，造成其他模組只能複製貼上。
- **依據**：ADR-017、`docs/guides/modularization_governance.md`

---

## 第七章：程式碼品質規範

### 第 22 條：命名規範（強制要求）
- ✅ **函式名稱**: 使用 `snake_case` (例如: `get_price_change_details`)
- ✅ **類別名稱**: 使用 `PascalCase` (例如: `PriceRecord`)
- ✅ **變數名稱**: 使用有意義的描述性名稱
- ❌ **禁止**: 使用 `a`, `b`, `temp`, `data` 等無意義名稱

### 第 23 條：註解規範（強制要求）
- ✅ **正確**: 在複雜邏輯前加上中文註解說明「為什麼」
- ✅ **正確**: 修復 Bug 時標註 `V-Fix:`
- ✅ **正確**: 新增功能時標註 `V-New:`
- ❌ **禁止**: 完全不寫註解或寫無意義註解

### 第 24 條：DRY 原則（強制要求）
- ✅ **正確**: 重複邏輯必須抽取為函式
- ❌ **禁止**: 複製貼上相同程式碼超過 2 次
- **實例**: `get_consolidated_data()` 封裝了通用的資料查詢邏輯

---

## 第八章：測試與除錯規範

### 第 25 條：修改前測試（強制要求）
- ✅ **正確**: 修改程式碼前，先了解現有功能的行為
- ✅ **正確**: 修改後必須測試相關功能是否正常
- ❌ **禁止**: 修改後直接提交，未經測試

### 第 26 條：錯誤修復流程（強制要求）
1. 閱讀錯誤日誌 (`logs/system.log`)
2. 定位問題程式碼位置
3. 理解根本原因（不是表面症狀）
4. 修復問題並添加註解
5. 測試修復是否有效
6. 檢查是否有相同問題的其他地方

### 第 27 條：日誌檢查（強制要求）
- ✅ **正確**: 修改 API 後檢查日誌是否有錯誤
- ✅ **正確**: 使用 `tail -f logs/system.log` 即時監控
- ❌ **禁止**: 盲目修改不看日誌

---

## 第九章：效能優化規範

### 第 28 條：資料庫查詢優化（強制要求）
- ✅ **正確**: 使用 subquery 與 JOIN 減少查詢次數
- ✅ **正確**: 使用 `options(joinedload())` 預載關聯資料
- ❌ **禁止**: 在迴圈中執行查詢（N+1 問題）

### 第 29 條：前端效能優化（強制要求）
- ✅ **正確**: 圖表使用 CDN 載入 Chart.js
- ✅ **正確**: 大表格使用分頁或虛擬滾動
- ❌ **禁止**: 一次渲染超過 1000 筆資料

### 第 30 條：快取策略（建議執行）
- ✅ **建議**: 對不常變動的資料實作快取（5-10 分鐘）
- ✅ **建議**: 使用 `get_consolidated_data()` 的結果快取
- ⚠️ **注意**: 快取必須有過期機制

---

## 第十章：安全性規範

### 第 31 條：敏感資訊保護（絕對禁止違反）
- ✅ **正確**: 所有 API Token、密碼存放於 `config.py`
- ❌ **禁止**: 硬編碼敏感資訊於程式碼中
- ❌ **禁止**: 提交 `config.py` 至公開 Git 倉庫

### 第 32 條：SQL 注入防護（絕對禁止違反）
- ✅ **正確**: 使用 SQLAlchemy ORM 的參數化查詢
- ❌ **禁止**: 使用字串拼接建構 SQL 查詢
- **範例**:
  ```python
  # ✅ 正確
  session.query(Product).filter(Product.i_code == user_input)

  # ❌ 禁止
  session.execute(f"SELECT * FROM products WHERE i_code = '{user_input}'")
  ```

### 第 33 條：XSS 防護（強制要求）
- ✅ **正確**: Jinja2 模板自動跳脫 HTML
- ✅ **正確**: JavaScript 中使用 `textContent` 而非 `innerHTML`
- ❌ **禁止**: 直接插入未驗證的使用者輸入

---

## 第十一章：部署與維運規範

### 第 34 條：伺服器啟動（強制要求）
- ✅ **正確**: 使用 `nohup python3 app.py > /dev/null 2>&1 &` 背景執行
- ✅ **正確**: 部署前檢查 Port 80 是否已被佔用
- ❌ **禁止**: 直接執行 `python3 app.py`（關閉終端機會停止服務）

### 第 35 條：伺服器重啟（強制要求）
- ✅ **正確步驟**:
  1. `pkill -9 -f "python3 app.py"` (停止舊程序)
  2. `sleep 2` (等待端口釋放)
  3. `nohup python3 app.py > /dev/null 2>&1 &` (啟動新程序)
  4. `ps aux | grep "[p]ython3 app.py"` (確認運行)

### 第 36 條：日誌輪替（建議執行）
- ✅ **建議**: 定期清理過大的日誌檔案 (> 100MB)
- ✅ **建議**: 使用 logrotate 自動管理日誌

---

## 第十二章：協作開發規範

### 第 37 條：Git Commit 規範（強制要求）
- ✅ **正確格式**: `[版本號] 功能描述 | 修改的檔案`
- **範例**: `[V9.4] 修正彈窗無資料問題 | app.py, dashboard.html`
- ❌ **禁止**: `fix`, `update`, `修改` 等無意義訊息

### 第 38 條：程式碼審查（強制要求）
- ✅ **正確**: 重大修改前與 AI 助手討論方案
- ✅ **正確**: 提供清晰的需求描述與預期結果
- ❌ **禁止**: 直接要求 AI 「修改成...」而不解釋原因

### 第 39 條：憲法修訂（特別規定）
- ✅ **修訂權限**: 僅限專案負責人（統帥）
- ✅ **修訂流程**: 提出修訂 → 討論評估 → 更新文件 → 通知全員
- ⚠️ **重要**: 本憲法不可輕易修改，除非有重大架構變更

---

## 第十三章：AI 四 Agent 自主學習與自動化架構規範（2026-04-29 修訂）

### 第 40 條：四 Agent 分工架構（絕對禁止違反）
- **Hermes（採集層）**: Ollama 三主機級聯（GCP-A → GCP-B → 111），負責 embedding、去重、品質分數計算。成本 = $0
- **NemoTron（處理層）**: qwen3:14b Ollama-first，NVIDIA NIM Llama 3.1 8B 僅作備援，負責 tool calling 邏輯路由與 DB 寫入。NIM 限額 80 次/天
- **OpenClaw（應用層）**: Ollama-first；Gemini 僅作備援或 ADR-028 鎖定場景，負責最終 PPT 生成、洞察報告對外輸出。
- **ElephantAlpha（編排層）**: 負責跨 Agent orchestration、HITL、AutoHeal bridge 與受控執行計畫，不可繞過安全入口
- ❌ **禁止**：讓 OpenClaw 做 Hermes 層的苦力工作（高算力浪費）
- ❌ **禁止**：讓 Hermes 直接生成對外報告（品質不足）
- ❌ **禁止**：讓 ElephantAlpha 直接繞過 EventRouter / AutoHeal / ADR-011 執行高風險副作用

### 第 41 條：AI 學習數據雙寫（絕對禁止違反）
- ✅ **正確**：所有 AI 產出（PPT 洞察、競品分析、對話記錄、Agent action、自癒紀錄）必須**雙寫** PostgreSQL `ai_insights` + pgvector embedding
- ❌ **禁止**：只寫 DB 不寫 KM（RAG 無法語意搜尋）
- ❌ **禁止**：只寫 KM 不寫 DB（精確 period/sku 查詢無法命中）
- **理由**：DB 是精準命中，KM 是語意搜尋，兩者互補缺一不可（ADR-007）
- **入口**：`store_insight()` 或 raw insert + `enqueue_insight_embedding()` → 同步寫 DB → 異步排隊給 Hermes 做 embedding

### 第 42 條：KM 向量庫技術選型（絕對禁止違反）
- ✅ **唯一選擇**：pgvector（與現有 PostgreSQL `192.168.0.188` 同一 DB）
- ❌ **禁止**：引入 ChromaDB、Qdrant 等獨立向量庫
- **理由**：混合查詢（`WHERE` 結構化 + `ORDER BY embedding <->` 語意）只有 pgvector 能一條 SQL 搞定（ADR-002）

### 第 43 條：Embedding 本地化（強制要求）
- ✅ **正確**：使用 `bge-m3`（或 `nomic-embed-text`）掛載在 Ollama 三主機級聯（GCP-A → GCP-B → 111）
- ❌ **禁止**：呼叫外部 Embedding API（成本與隱私雙重問題）
- **維度**：1024 dim（`vector(1024)` 欄位）（ADR-003）

### 第 44 條：NemoTron 配額 Fallback 機制（強制要求）
- ✅ **正確**：當 NIM 缺 API key、HTTP 429、timeout、network/HTTP error 或 0 tool call 時，立刻 fallback 至 `_hermes_rule_fallback()` rule-based 派發
- ❌ **禁止**：配額耗盡時讓告警管線中斷
- **標記**：降級模式告警須帶 `🟡` 前綴，讓統帥識別（ADR-004）

### 第 45 條：KM 品質分數時間衰減（強制要求）
- ✅ **公式**：`effective_score = base_score × e^(-decay_rate × days_passed)`
- **decay_rate**：`0.005`（預設）；`decay_exempt=True` 用於結構性/憲法類知識
- **理由**：確保 RAG 優先抓取最新、最適用的洞察，避免歷史偏誤（ADR-005）

### 第 45.1 條：AI 自動化安全閉環（絕對禁止違反）
- ✅ **正確**：EventRouter 是告警、降級、去重、通知 replay 與 L2 safe action 的入口
- ✅ **正確**：AutoHeal 是自癒副作用入口，失敗時必須安全降級為 alert / log / file queue
- ✅ **正確**：L2 safe action 必須可審計、可回放、低副作用
- ✅ **正確**：AI 自動化觀測變更需同步 `/metrics`、Smoke dashboard 與 Grafana provisioning，避免告警閉環變成黑盒
- ❌ **禁止**：自動 restart / stop / recreate `momo-db` 或 `momo-postgres`
- ❌ **禁止**：AI 分析失敗導致 Telegram 告警完全不送出
- **依據**：ADR-012、ADR-013、ADR-018

---

## 第十四章：Codex 工作規則（2026-04-29 修訂）

### 第 46 條：正式規範來源必須精簡且唯一（絕對禁止違反）
- **入口**：`AGENTS.md` — Codex 專案工作入口與讀取順序
- **紅線**：`CONSTITUTION.md` — 不可違反規則
- **ADR**：`docs/adr/ADR-XXX-*.md` — 架構決策，只增不刪
- **Memory**：`docs/memory/README.md` + 單篇 memory — 跨 session 的高重用記憶
- **SOT**：`docs/AI_INTELLIGENCE_MODULE_SOT.md` — 當前架構事實
- ❌ **禁止**：讓多份文件同時扮演正式入口，造成規則重複與 token 浪費

### 第 47 條：Session 開始採最小必要讀取（強制要求）
```
每次 Codex Session 開始必做：
1. 讀 AGENTS.md
2. 讀 CONSTITUTION.md 的相關章節
3. 讀 docs/adr/README.md，僅打開命中的 ADR
4. 讀 docs/memory/README.md，僅打開命中的 memory
```

### 第 48 條：Session 結束沉澱採最小必要更新（強制要求）
```
每次 Session 結束前必做 checklist：
□ 有新架構決策？→ 新建 ADR-XXX.md + 更新 docs/adr/README.md
□ 有長期有效的專案知識？→ 新增或更新 docs/memory/*.md + docs/memory/README.md
□ 有 SOT 變更？→ 更新 AI_INTELLIGENCE_MODULE_SOT.md
□ 有硬性紅線變更？→ 更新 CONSTITUTION.md
□ 有入口或工作方式變更？→ 更新 AGENTS.md
```

### 第 49 條：本專案不以本地 Skills 作為正式治理層（強制要求）
- ✅ **正確**：重複流程優先寫成 `docs/guides/*.md`、腳本、測試或 ADR
- ✅ **正確**：AI 自動化重複流程以 `docs/guides/ai_automation_session_sop.md` 維護
- ❌ **禁止**：把 `.claude/skills`、私有 agent 腳本、外部平台工作流當成本專案正式規範來源

### 第 50 條：角色派工以 AGENTS 入口為準（強制要求）
- ✅ **正確**：預設派工與角色選路以 `AGENTS.md` 的一頁式 dispatch 表為準
- ✅ **正確**：角色詳細說明以 `docs/guides/codex_agent_roles.md` 為準
- ❌ **禁止**：把歷史上的私有 agent 腳本、舊 onboarding 或散落文件當成更高優先級的派工真相

### 第 51 條：專案範圍邊界（絕對禁止違反）
- ✅ **本憲法範圍**：`momo-pro-system`（EwoooC）**唯一**
- ❌ **禁止**：將 AWOOOI / WOOO AIOps SaaS 的決策混入本文件
- ❌ **禁止**：跨專案邊界做架構決策

---

## 附錄 A：常見錯誤與解決方案

### 錯誤 1: 'Product' object has no attribute 'momo_id'
- **原因**: 使用錯誤的屬性名稱
- **解決**: 改用 `product.i_code`

### 錯誤 2: API 返回空資料
- **原因**: 價格比對邏輯錯誤（只查昨天）
- **解決**: 使用「今日之前最後一筆」邏輯

### 錯誤 3: 時間戳比對失敗
- **原因**: 時區感知 datetime 與 naive datetime 混用
- **解決**: 使用 `.replace(tzinfo=None)` 統一為 naive

### 錯誤 4: 彈窗顯示「無資料」
- **原因**: API 邏輯與前端不一致
- **解決**: 確保使用相同的 `yesterday_prices_map` 查詢

---

## 附錄 B：關鍵檔案索引

| 檔案路徑 | 用途 | 禁止修改項目 |
|---------|------|------------|
| `config.py` | 系統配置 | `DATABASE_PATH`, `PUBLIC_URL` |
| `database/models.py` | 資料模型 | `Product.i_code` 定義 |
| `app.py` | 主程式 | `TAIPEI_TZ` |
| `dashboard.html` | 商品看板 | 主題色系、響應式設計 |
| `daily_sales.html` | 業績看板 | 行事曆邏輯、圖表配置 |
| `scheduler.py` | 排程爬蟲 | 商品圖 CDN URL 構造 |
| `backup_system.py` | 備份系統 | 排除目錄清單 |

---

## 附錄 C：版本更新檢查清單

每次發布新版本前，必須確認以下項目：

- [ ] `SYSTEM_VERSION` 已更新
- [ ] 相關功能已測試正常運作
- [ ] 日誌無錯誤訊息
- [ ] `TODO_NEXT_STEPS.txt` 已更新
- [ ] 已執行系統備份
- [ ] API 邏輯與前端一致
- [ ] 響應式設計正常（手機版測試）
- [ ] 資料庫查詢效能正常（無 N+1 問題）

---

## 結語

本憲法的目的是維護專案的**長期穩定性**與**開發效率**。所有開發者（包括 AI 助手）在遇到與憲法條款衝突的需求時，應優先遵守憲法，並與專案負責人討論是否需要修訂憲法。

**記住**: 一個穩定運行的系統，遠比一個功能豐富但 Bug 頻出的系統更有價值。

---

**專案憲法版本**: 2.0
**生效日期**: 2026-01-12
**最後審核**: 2026-04-18（統帥批准，加入第十三、十四章）
