diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index e1d325f3..52735f8d 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -96,6 +96,27 @@ jobs: fi echo "✅ ADR 檢查通過" + # Phase 14.2 #96: 後端分層檢查 (輕量版 import-linter) + - name: API Layer Check + run: | + echo "🔍 檢查後端分層規則..." + # 檢查 1: services 層禁止引用 api/routers 層 (反向依賴) + if grep -rE "from src\.(api|routers)" apps/api/src/services/ 2>/dev/null; then + echo "❌ 分層違規: services 禁止引用 api/routers 層" + exit 1 + fi + # 檢查 2: repositories 層禁止引用 services 層 + if grep -rE "from src\.services" apps/api/src/repositories/ 2>/dev/null; then + echo "❌ 分層違規: repositories 禁止引用 services 層" + exit 1 + fi + # 檢查 3: models 層禁止引用業務層 + if grep -rE "from src\.(services|api|routers)" apps/api/src/models/ 2>/dev/null; then + echo "❌ 分層違規: models 禁止引用業務層" + exit 1 + fi + echo "✅ 後端分層檢查通過" + # ==================== Test ==================== test: name: Test @@ -282,14 +303,15 @@ jobs: uv sync uv run pytest tests/test_action_parsing.py -v --tb=short || echo "⚠️ 部分測試失敗" - - name: Prompt Validation Test - working-directory: apps/api - env: - PYTHONPATH: ${{ github.workspace }}/apps/api - OLLAMA_URL: http://192.168.0.188:11434 + # 🔴 LLM 測試移至 Nightly (2026-03-26) + # 原因: CPU 推理需 300+ 秒/測試,不適合每次 commit + # 完整測試: .github/workflows/nightly-llm.yaml + - name: LLM Test (Skip - See Nightly) run: | - echo "📝 Prompt 品質驗證..." - uv run pytest tests/test_prompt_validation.py::test_prompt_quality_report -v --tb=short || echo "⚠️ Prompt 驗證略過" + echo "⏭️ LLM 測試已移至 Nightly workflow" + echo " - test_model_regression.py" + echo " - test_prompt_validation.py" + echo " 原因: CPU 推理 ~300s/測試" # ==================== OpenAPI Validation ==================== openapi-validate: diff --git a/apps/api/src/core/__init__.py b/apps/api/src/core/__init__.py index 3e83c630..f65d6356 100644 --- a/apps/api/src/core/__init__.py +++ b/apps/api/src/core/__init__.py @@ -1 +1,30 @@ # Core module +# ADR-027: Incident-Approval 同步架構 (2026-03-26) + +from .constants import ( + APPROVAL_TO_INCIDENT_STATUS, + APPROVAL_TTL_SECONDS, + DECISION_TTL_SECONDS, + INCIDENT_ACTIVE_STATUSES, + INCIDENT_TTL_SECONDS, + REDIS_KEY_APPROVAL, + REDIS_KEY_DECISION, + REDIS_KEY_INCIDENT, + REDIS_KEY_PENDING, +) +from .unit_of_work import UnitOfWork + +__all__ = [ + # Constants (ADR-027) + "INCIDENT_TTL_SECONDS", + "APPROVAL_TTL_SECONDS", + "DECISION_TTL_SECONDS", + "REDIS_KEY_INCIDENT", + "REDIS_KEY_APPROVAL", + "REDIS_KEY_PENDING", + "REDIS_KEY_DECISION", + "APPROVAL_TO_INCIDENT_STATUS", + "INCIDENT_ACTIVE_STATUSES", + # Unit of Work (ADR-027) + "UnitOfWork", +]