diff --git a/apps/api/scripts/test_nemotron_tool_calling.py b/apps/api/scripts/test_nemotron_tool_calling.py index cb11c3133..f57704b5e 100644 --- a/apps/api/scripts/test_nemotron_tool_calling.py +++ b/apps/api/scripts/test_nemotron_tool_calling.py @@ -28,7 +28,7 @@ except ImportError: # ============================================================================ NVIDIA_API_KEY = os.getenv("NVIDIA_API_KEY") -OLLAMA_BASE_URL = os.getenv("OLLAMA_BASE_URL", "http://192.168.0.110:11435") +OLLAMA_BASE_URL = os.getenv("OLLAMA_BASE_URL", "http://192.168.0.111:11434") if not NVIDIA_API_KEY: print("❌ 請設定 NVIDIA_API_KEY 環境變數") diff --git a/apps/api/src/services/platform_operator_service.py b/apps/api/src/services/platform_operator_service.py index 89e1185a2..c97cd215a 100644 --- a/apps/api/src/services/platform_operator_service.py +++ b/apps/api/src/services/platform_operator_service.py @@ -4479,12 +4479,6 @@ def _ai_route_repair_playbook_recommendation( "scope": "systemd_ollama", "mode": "manual_or_approved", }) - if live_probe.get("proxy_110_11435") == "http_502": - steps.append({ - "step": "verify_110_proxy_after_gcp_a_recovery", - "scope": "nginx_proxy_readback", - "mode": "read_only_verification", - }) steps.append({ "step": "verify_ai_route_status_returns_primary", "scope": "awooop_ai_route_status", diff --git a/apps/api/tests/test_ollama_prod_manifest_order.py b/apps/api/tests/test_ollama_prod_manifest_order.py index 9719f7fce..4014958e8 100644 --- a/apps/api/tests/test_ollama_prod_manifest_order.py +++ b/apps/api/tests/test_ollama_prod_manifest_order.py @@ -54,6 +54,25 @@ def test_retired_host110_ollama_proxy_is_absent_from_runtime_manifests() -> None assert "192.168.0.110:11437" not in text +def test_retired_host110_ollama_proxy_is_absent_from_active_operator_surfaces() -> None: + for relative in ( + "apps/api/src/services/platform_operator_service.py", + "apps/web/src/app/[locale]/awooop/runs/page.tsx", + "apps/web/messages/en.json", + "apps/web/messages/zh-TW.json", + ): + text = (ROOT / relative).read_text(encoding="utf-8") + assert "proxy_110_11435" not in text + assert "proxy_110_11436" not in text + assert "proxy_110_11437" not in text + + manual_probe = ( + ROOT / "apps/api/scripts/test_nemotron_tool_calling.py" + ).read_text(encoding="utf-8") + assert '"http://192.168.0.111:11434"' in manual_probe + assert "192.168.0.110:11435" not in manual_probe + + def test_prod_network_policy_allows_only_canonical_ollama_egress() -> None: policy = _load_named_doc( ROOT / "k8s/awoooi-prod/02-network-policy.yaml", diff --git a/apps/api/tests/test_sre_k3s_controlled_automation_work_items_api.py b/apps/api/tests/test_sre_k3s_controlled_automation_work_items_api.py index cd688bea4..d6902a1b7 100644 --- a/apps/api/tests/test_sre_k3s_controlled_automation_work_items_api.py +++ b/apps/api/tests/test_sre_k3s_controlled_automation_work_items_api.py @@ -155,9 +155,9 @@ def test_loader_returns_fixed_architecture_provider_order_and_agent99_bridge() - "active_or_completed_commitments": 68, "by_status": { "analysis_or_governance_complete": 6, - "source_implemented_runtime_pending": 23, + "source_implemented_runtime_pending": 24, "in_progress": 32, - "not_started_or_no_current_evidence": 7, + "not_started_or_no_current_evidence": 6, "superseded": 2, }, "product_runtime_closed_commitments": 0, @@ -168,6 +168,9 @@ def test_loader_returns_fixed_architecture_provider_order_and_agent99_bridge() - assert commitments["AIA-CONV-012"]["title"].startswith("Claude API") assert commitments["AIA-CONV-013"]["title"].startswith("Gemini API") assert "Host112" in commitments["AIA-CONV-049"]["title"] + assert commitments["AIA-CONV-050"]["status"] == ( + "source_implemented_runtime_pending" + ) assert commitments["AIA-CONV-060"]["status"] == "superseded" diff --git a/apps/web/messages/en.json b/apps/web/messages/en.json index 7bc9ed95c..3af8b3611 100644 --- a/apps/web/messages/en.json +++ b/apps/web/messages/en.json @@ -11758,7 +11758,6 @@ "gcloud_projects_get_iam_policy_missing": "缺 GCP IAM 讀取權限", "gcp_a_ssh_refused": "GCP-A SSH 拒絕連線", "gcp_a_ollama_11434_refused": "GCP-A Ollama 11434 拒絕", - "proxy_110_11435_http_502": "provider proxy 11435 回 502", "unknown": "{blocker}" }, "probes": { @@ -11767,9 +11766,6 @@ "gcp_a_direct_22": "GCP-A SSH 22", "gcp_a_direct_11434": "GCP-A 11434", "gcp_b_direct_11434": "GCP-B 11434", - "proxy_110_11435": "provider proxy 11435", - "proxy_110_11436": "provider proxy 11436", - "proxy_110_11437": "provider proxy 11437", "unknown": "{probe}" } } diff --git a/apps/web/messages/zh-TW.json b/apps/web/messages/zh-TW.json index aea42bcca..db42b429c 100644 --- a/apps/web/messages/zh-TW.json +++ b/apps/web/messages/zh-TW.json @@ -11758,7 +11758,6 @@ "gcloud_projects_get_iam_policy_missing": "缺 GCP IAM 讀取權限", "gcp_a_ssh_refused": "GCP-A SSH 拒絕連線", "gcp_a_ollama_11434_refused": "GCP-A Ollama 11434 拒絕", - "proxy_110_11435_http_502": "provider proxy 11435 回 502", "unknown": "{blocker}" }, "probes": { @@ -11767,9 +11766,6 @@ "gcp_a_direct_22": "GCP-A SSH 22", "gcp_a_direct_11434": "GCP-A 11434", "gcp_b_direct_11434": "GCP-B 11434", - "proxy_110_11435": "provider proxy 11435", - "proxy_110_11436": "provider proxy 11436", - "proxy_110_11437": "provider proxy 11437", "unknown": "{probe}" } } diff --git a/apps/web/src/app/[locale]/awooop/runs/page.tsx b/apps/web/src/app/[locale]/awooop/runs/page.tsx index fe3430af8..e11ecd133 100644 --- a/apps/web/src/app/[locale]/awooop/runs/page.tsx +++ b/apps/web/src/app/[locale]/awooop/runs/page.tsx @@ -4019,7 +4019,6 @@ const AI_ROUTE_REPAIR_BLOCKER_KEYS = new Set([ "gcloud_projects_get_iam_policy_missing", "gcp_a_ssh_refused", "gcp_a_ollama_11434_refused", - "proxy_110_11435_http_502", ]); const AI_ROUTE_REPAIR_PROBE_KEYS = new Set([ @@ -4028,9 +4027,6 @@ const AI_ROUTE_REPAIR_PROBE_KEYS = new Set([ "gcp_a_direct_22", "gcp_a_direct_11434", "gcp_b_direct_11434", - "proxy_110_11435", - "proxy_110_11436", - "proxy_110_11437", ]); const AI_ROUTE_REPAIR_SIDE_EFFECT_KEYS = [ diff --git a/docs/operations/sre-ai-agent-conversation-commitments.snapshot.json b/docs/operations/sre-ai-agent-conversation-commitments.snapshot.json index 6ae93f482..82c79c7a3 100644 --- a/docs/operations/sre-ai-agent-conversation-commitments.snapshot.json +++ b/docs/operations/sre-ai-agent-conversation-commitments.snapshot.json @@ -1,7 +1,7 @@ { "schema_version": "sre_ai_agent_conversation_commitments_v1", "program_id": "AIA-SRE-P0-20260715", - "generated_at": "2026-07-19T11:18:00+08:00", + "generated_at": "2026-07-19T11:40:41+08:00", "source_scope": "This Codex AI Agent task only; cross-task delegation envelopes are excluded.", "authoritative_for_execution_order": false, "raw_conversation_embedded": false, @@ -69,7 +69,7 @@ {"id":"AIA-CONV-048","category":"knowledge_closure","status":"source_implemented_runtime_pending","title":"Telegram、callback、learning receipt 使用 durable production readback","linked_work_items":["AIA-SRE-015","AIA-SRE-017"],"terminal_condition":"source flag、HTTP 200 或 configured state 不得取代 production durable acknowledgement。"}, {"id":"AIA-CONV-049","category":"infrastructure","status":"not_started_or_no_current_evidence","title":"查明 Host112 為何不開機並納入 ru4vm4 線索","linked_work_items":["AIA-SRE-006","AIA-SRE-009"],"terminal_condition":"Agent99/VMware typed check 取得 power、guest、Wazuh 與 boot verifier receipt;不做任意命令。"}, - {"id":"AIA-CONV-050","category":"infrastructure","status":"not_started_or_no_current_evidence","title":"Host110 Ollama 退役後清除 inventory、health check、fallback 與告警來源","linked_work_items":["AIA-SRE-002","AIA-SRE-004"],"terminal_condition":"保留 retired tombstone;任何 process/proxy/listener/target/route recurrence 建 drift item。"}, + {"id":"AIA-CONV-050","category":"infrastructure","status":"source_implemented_runtime_pending","title":"Host110 Ollama 退役後清除 inventory、health check、fallback 與告警來源","linked_work_items":["AIA-SRE-002","AIA-SRE-004"],"terminal_condition":"保留 retired tombstone;任何 process/proxy/listener/target/route recurrence 建 drift item。"}, {"id":"AIA-CONV-051","category":"infrastructure","status":"in_progress","title":"Host111 Ollama 補健康度、模型、LaunchAgent 與容量證據","linked_work_items":["AIA-SRE-002","AIA-SRE-008","AIA-SRE-013"],"terminal_condition":"host111 本機與 host120/121 獨立 origin 讀回 exact model、service 與 sensor。"}, {"id":"AIA-CONV-052","category":"infrastructure","status":"source_implemented_runtime_pending","title":"Host99 Agent99 串入 typed dispatch、主機操作、rollback 與 verifier","linked_work_items":["AIA-SRE-006","AIA-SRE-009","AIA-SRE-014"],"terminal_condition":"production allowlisted run 與 cross-domain denial 都有同 run callback/receipt。"}, {"id":"AIA-CONV-053","category":"infrastructure","status":"in_progress","title":"查核 infrastructure_inventory.md 的遺漏與過期資訊","linked_work_items":["AIA-SRE-001","AIA-SRE-002"],"terminal_condition":"每個 imported/omitted asset 與 live canonical registry 對帳並標示 drift。"}, @@ -98,9 +98,9 @@ "active_or_completed_commitments": 68, "by_status": { "analysis_or_governance_complete": 6, - "source_implemented_runtime_pending": 23, + "source_implemented_runtime_pending": 24, "in_progress": 32, - "not_started_or_no_current_evidence": 7, + "not_started_or_no_current_evidence": 6, "superseded": 2 }, "product_runtime_closed_commitments": 0