diff --git a/cmd/cognitive-worker/main.go b/cmd/cognitive-worker/main.go index 8a825f4..a3eac54 100644 --- a/cmd/cognitive-worker/main.go +++ b/cmd/cognitive-worker/main.go @@ -85,6 +85,7 @@ func main() { gateway := cognitiveGateway{resolver: resolver, providers: providers, builtinLocal: builtinLocal, externalRecovery: externalRecovery, now: time.Now, allowCanary: os.Getenv("COGNITIVE_ALLOW_CANARY") == "true", canaryMaxOutputBytes: 4096, admission: newHTTPAdmissionClient(envOr("CORE_RUNTIME_URL", "http://core-runtime:8080"), &http.Client{Timeout: 5 * time.Second})} mux.Handle("/healthz", health.Handler{Runtime: "cognitive-worker", SemanticGeneration: 1, ArchitectureGeneration: 1}) readinessClient := &http.Client{Timeout: 2 * time.Second} + cpuReadinessClient := &http.Client{Timeout: 10 * time.Second} lifeboatURL := strings.TrimSuffix(strings.TrimRight(envOr("LOCAL_LIFEBOAT_PROVIDER_URL", "http://cognitive-lifeboat:8086/v1"), "/"), "/v1") + "/health" fleetClient := &http.Client{Timeout: 2 * time.Second} preferredFleet := capability.FleetTier(envOr("COGNITIVE_PREFERRED_FLEET_TIER", string(capability.FleetTierHeavy))) @@ -93,7 +94,7 @@ func main() { cpuFleetHeaders["Authorization"] = "Bearer " + cpuAPIKey } cpuEndpoint := strings.TrimRight(envOr("LOCAL_CPU_PROVIDER_URL", "http://docker.cin.su:18082/v1"), "/") + "/models" - cpuHealthProbe := health.OptionalHTTPProbeWithHeaders(readinessClient, cpuEndpoint, cpuFleetHeaders) + cpuHealthProbe := health.OptionalHTTPProbeWithHeaders(cpuReadinessClient, cpuEndpoint, cpuFleetHeaders) cpuHealthProbe.Timeout = 10 * time.Second readinessProbes := []health.Probe{ health.HTTPProbe(readinessClient, strings.TrimRight(envOr("CORE_RUNTIME_URL", "http://core-runtime:8080"), "/")+"/healthz"), diff --git a/dev/ACTIVE_TASK.json b/dev/ACTIVE_TASK.json index 54927b7..5c79bd2 100644 --- a/dev/ACTIVE_TASK.json +++ b/dev/ACTIVE_TASK.json @@ -1,5 +1,5 @@ { - "task_file": "dev/tasks/DEV-000166-per-provider-readiness-timeouts.json", - "task_id": "DEV-000166", + "task_file": "dev/tasks/DEV-000167-cpu-readiness-client-timeout.json", + "task_id": "DEV-000167", "task_revision": 1 } diff --git a/dev/tasks/DEV-000167-cpu-readiness-client-timeout.json b/dev/tasks/DEV-000167-cpu-readiness-client-timeout.json new file mode 100644 index 0000000..03588c0 --- /dev/null +++ b/dev/tasks/DEV-000167-cpu-readiness-client-timeout.json @@ -0,0 +1,23 @@ +{ + "task_id": "DEV-000167", + "task_revision": 1, + "architecture_revision": "ADR-0018", + "base_repo_revision": "c7b57daaf8233b0f0e79c77c02e92040378921d5", + "risk_tier": "E", + "intent": "Use the bounded CPU provider HTTP client for the authenticated readiness probe so /readyz reports the same truthful result as fleet readiness.", + "requirement_ids": ["WP-601", "Model fleet/failover"], + "allowed_change_scope": {"modules": ["cognitive-worker"], "paths": ["cmd/cognitive-worker/main.go", "dev/ACTIVE_TASK.json", "dev/tasks/DEV-000167-cpu-readiness-client-timeout.json"]}, + "forbidden_change_scope": {"paths": ["architecture/**", "security/**", "database/**", "deploy/**", "contracts/**", "adapters/**", ".gitea/**"]}, + "allowed_architecture_delta": {"new_cross_module_dependencies": 0, "new_canonical_owners": 0, "new_privileges": 0, "new_third_party_dependencies": 0, "new_database_owner_roles": 0}, + "contracts": {"consume": ["existing readiness Probe contract", "existing authenticated CPU fleet endpoint"], "may_change": []}, + "semantic_owner": "cognitive-worker", + "canonical_state": [], + "state_transitions": ["CPU provider response -> consistent /readyz and fleet readiness state"], + "side_effects_and_privileges": ["no new privilege; existing provider auth only"], + "persistence_and_migrations": ["none"], + "failure_retry_restart": ["CPU readiness remains bounded at 10 seconds; opportunistic GPU remains 2 seconds"], + "assumptions": ["The CPU provider is authenticated with the existing file-backed API key"], + "acceptance_scenarios": ["/readyz can report CPU AVAILABLE when fleet readiness reports CPU AVAILABLE", "GPU remains bounded", "Lifeboat fallback remains unchanged"], + "required_tests": ["go test ./...", "go vet ./...", "preflight", "check-diff", "check-architecture", "independent", "git diff --check", "CI", "production /readyz and fleet readiness"], + "terminal_gap_states": ["BLOCKED_BY_MISSING_CAPABILITY", "BLOCKED_BY_CONFLICT"] +}