Files
ewoooc/CONSTITUTION.md
OoO b3d00a011c
All checks were successful
CD Pipeline / deploy (push) Successful in 3m37s
fix(dashboard): warm cache after AI pick refresh
2026-05-01 16:16:39 +08:00

487 lines
23 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# EwoooC原 MOMO Pro System- 專案憲法 (CONSTITUTION)
> 本文件定義專案開發的核心準則與不可違反的規範
> **建立日期**: 2026-01-12
> **當前版本**: V10.63 (Warm dashboard cache after AI pick regeneration)
> **最後更新**: 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 不寫 KMRAG 無法語意搜尋)
- ❌ **禁止**:只寫 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統帥批准加入第十三、十四章