487 lines
23 KiB
Markdown
487 lines
23 KiB
Markdown
# EwoooC(原 MOMO Pro System)- 專案憲法 (CONSTITUTION)
|
||
|
||
> 本文件定義專案開發的核心準則與不可違反的規範
|
||
> **建立日期**: 2026-01-12
|
||
> **當前版本**: V10.56 (Health-safe monitoring runtime)
|
||
> **最後更新**: 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 冒充已完成。
|
||
- ❌ **禁止**: 為了符合原型畫面而改寫或捏造業務數字。
|
||
|
||
---
|
||
|
||
## 第五章:系統架構規範
|
||
|
||
### 第 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。
|
||
|
||
---
|
||
|
||
## 第六章:版本管理規範
|
||
|
||
### 第 19 條:版本號更新(強制要求)
|
||
- ✅ **正確**: 每次功能更新必須修改 `app.py` 的 `SYSTEM_VERSION`
|
||
- ✅ **格式**: `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(採集層)**: `192.168.0.111` Ollama,負責 embedding、去重、品質分數計算。成本 = $0
|
||
- **NemoTron(處理層)**: NVIDIA NIM Llama 3.1 8B,負責 tool calling 邏輯路由與 DB 寫入。限額 80 次/天
|
||
- **OpenClaw / Gemini(應用層)**: 負責最終 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`)掛載在 Hermes 主機 `192.168.0.111` Ollama
|
||
- ❌ **禁止**:呼叫外部 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` | 主程式 | `SYSTEM_VERSION`, `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(統帥批准,加入第十三、十四章)
|