From 4f6f2a1f48587b850da039f7a7a02ee87a43f9fc Mon Sep 17 00:00:00 2001 From: Mikhail Date: Sat, 29 Aug 2026 21:05:10 +0300 Subject: [PATCH] remediate local medium cognitive route --- dev/ACTIVE_TASK.json | 2 +- ...-001-qualify-and-promote-local-medium.json | 66 +++++++++++++++++++ .../domain/cognitive_registry_test.go | 17 +++++ 3 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 dev/tasks/GEN2-COGNITIVE-001-qualify-and-promote-local-medium.json diff --git a/dev/ACTIVE_TASK.json b/dev/ACTIVE_TASK.json index b044ed2..32edf20 100644 --- a/dev/ACTIVE_TASK.json +++ b/dev/ACTIVE_TASK.json @@ -1 +1 @@ -{"task_file":"dev/tasks/GEN2-027-production-canary-and-controlled-gen2-traffic-transition.json","task_id":"GEN2-027","task_revision":1} +{"task_file":"dev/tasks/GEN2-COGNITIVE-001-qualify-and-promote-local-medium.json","task_id":"GEN2-COGNITIVE-001","task_revision":1} diff --git a/dev/tasks/GEN2-COGNITIVE-001-qualify-and-promote-local-medium.json b/dev/tasks/GEN2-COGNITIVE-001-qualify-and-promote-local-medium.json new file mode 100644 index 0000000..82d4633 --- /dev/null +++ b/dev/tasks/GEN2-COGNITIVE-001-qualify-and-promote-local-medium.json @@ -0,0 +1,66 @@ +{ + "task_id": "GEN2-COGNITIVE-001", + "task_revision": 1, + "architecture_revision": "ARCH-GEN2-000", + "base_repo_revision": "gen2-integration", + "risk_tier": "E", + "intent": "Restore one governed, usable cognitive route for household traffic, preferably Local MEDIUM, without bypassing Capability ownership or activation governance.", + "requirement_ids": ["REQ-GEN2-COGNITIVE-001-QUALIFICATION", "REQ-GEN2-COGNITIVE-001-LIFECYCLE", "REQ-GEN2-COGNITIVE-001-ROUTING"], + "allowed_change_scope": { + "modules": ["capability", "cognitive-worker", "core-runtime", "configuration", "production deployment"], + "paths": [ + "adapters/postgres/capability_repository.go", + "cmd/cognitive-worker/**", + "cmd/core-runtime/**", + "contracts/capability/**", + "modules/capability/**", + "deploy/**", + "runtime/health/**", + "tests/**", + "docs/evidence/**", + "docs/**", + "dev/ACTIVE_TASK.json", + "dev/tasks/GEN2-COGNITIVE-001-qualify-and-promote-local-medium.json" + ] + }, + "forbidden_change_scope": { + "paths": ["architecture/**", "security/**", "database/**", "go.mod", "go.sum", ".gitea/workflows/**"] + }, + "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": ["Gen2 cognitive registry", "Capability repository boundary", "bounded cognitive gateway"], + "may_change": ["only typed qualification/selection wiring within the declared paths"] + }, + "semantic_owner": "Capability owns provider, model and binding lifecycle; cognitive-worker produces bounded observations; Supervisor controls production release.", + "canonical_state": ["existing capability cognitive provider/model/binding/evidence state"], + "state_transitions": ["DISCOVERED -> qualification evidence -> VALIDATED -> ACTIVE only through existing governed promotion path", "non-working ACTIVE/VALIDATED binding -> governed deactivation or requalification"], + "side_effects_and_privileges": ["No direct SQL semantic mutation.", "No manual activation without qualification and independent evaluation evidence.", "No provider call outside cognitive adapter/gateway boundaries.", "No production secret values in source, logs, evidence or commits."], + "persistence_and_migrations": ["No schema change is authorized; reuse existing capability schema and repository owner."], + "failure_retry_restart": ["Binding heads and lifecycle evidence remain durable and restart-safe.", "CPU/GPU unavailability must not block a usable Local MEDIUM route.", "Lifeboat remains fallback, not primary."], + "assumptions": ["Existing PostgreSQL capability schema and authenticated core registry routes are available.", "Production deployment remains governed by the existing Supervisor/update flow.", "No database migration or new role is required."], + "acceptance_scenarios": [ + "provider health and model discovery are observed through the governed worker path", + "Local MEDIUM bounded qualification records durable evidence", + "independent evaluation and activation promotion are accepted by existing Capability owner", + "ordinary cognitive request selects ACTIVE/VALIDATED Local MEDIUM when CPU/GPU are unavailable", + "production core and worker use the same qualified revision", + "restart preserves route usability and no stale binding is selected" + ], + "required_tests": [ + "FAST: go test ./cmd/cognitive-worker/... ./cmd/core-runtime/... ./modules/capability/... ./adapters/postgres/...", + "FAST: targeted PostgreSQL repository tests", + "FAST: go vet ./cmd/cognitive-worker/... ./cmd/core-runtime/... ./modules/capability/... ./adapters/postgres/...", + "FAST governance: go run ./cmd/devctl preflight -active dev/ACTIVE_TASK.json", + "FAST scope: go run ./cmd/devctl check-diff -active dev/ACTIVE_TASK.json", + "FAST independent: go run ./cmd/devctl/independent", + "FAST whitespace: git diff --check", + "production: bounded qualification, governed promotion and cognitive invocation" + ], + "terminal_gap_states": ["BLOCKED_BY_SPEC_GAP", "BLOCKED_BY_ARCHITECTURE_GAP", "BLOCKED_BY_MISSING_CAPABILITY", "BLOCKED_BY_CONFLICT", "REQUIRES_MIGRATION_DECISION"] +} diff --git a/modules/capability/domain/cognitive_registry_test.go b/modules/capability/domain/cognitive_registry_test.go index 1d502ac..e38fc32 100644 --- a/modules/capability/domain/cognitive_registry_test.go +++ b/modules/capability/domain/cognitive_registry_test.go @@ -102,3 +102,20 @@ func TestSelectCognitiveBindingUsesObjectiveAndCost(t *testing.T) { t.Fatalf("economy selection=%+v err=%v", selected, err) } } + +func TestSelectCognitiveBindingUsesMediumWhenFastProviderIsUnavailable(t *testing.T) { + quality := int64(800) + critical := int64(0) + candidate := func(id string, health capability.HealthState) capability.ResolvedCognitiveBinding { + return capability.ResolvedCognitiveBinding{ + Binding: capability.CognitiveBinding{ID: capability.CapabilityBindingID(id), Revision: 1, CapabilityID: "creator-advisory", OwnerPrincipalID: "owner", ProviderInstanceID: capability.ProviderInstanceID(id), ProviderRevision: 1, ModelDescriptorID: capability.ModelDescriptorID(id), ModelRevision: 1, DataPolicy: capability.DataPolicyLocalOnly, Qualification: capability.QualificationValidated, Activation: capability.ActivationActive, Health: health, LimitPolicyRef: "limits"}, + Provider: capability.ProviderInstance{ID: capability.ProviderInstanceID(id), Revision: 1, Kind: "openai-compatible-chat-v1", EndpointRef: capability.EndpointBindingRef(id), Enabled: true, Qualification: capability.QualificationValidated, Health: health, ObservedAtUnixMillis: 1}, + Model: capability.ModelDescriptor{ID: capability.ModelDescriptorID(id), Revision: 1, ProviderInstanceID: capability.ProviderInstanceID(id), ProviderModelID: capability.ProviderModelID(id), MaxContextBytes: 10000, Modalities: []capability.ModelModality{capability.ModalityText}, Capabilities: []capability.ModelCapability{capability.CapabilityAdvisory}, Qualification: capability.QualificationValidated, Health: health, ObservedAtUnixMillis: 1}, + Evaluation: &capability.EvaluatedCapability{ID: capability.EvaluationID("eval-" + id), Result: capability.EvaluationSupported, QualityScoreMillis: &quality, CriticalFailureMillis: &critical}, + } + } + selected, err := SelectCognitiveBinding(capability.CognitiveRequirement{CapabilityID: "creator-advisory", OwnerPrincipalID: "owner", DataPolicy: capability.DataPolicyLocalOnly, RequiredModalities: []capability.ModelModality{capability.ModalityText}, RequiredCapabilities: []capability.ModelCapability{capability.CapabilityAdvisory}, MaxOutputBytes: 10, Objective: capability.SelectionBalanced}, []capability.ResolvedCognitiveBinding{candidate("cpu-fast", capability.HealthUnavailable), candidate("local-medium", capability.HealthAvailable)}) + if err != nil || selected.Binding.ID != "local-medium" { + t.Fatalf("medium fallback selection=%+v err=%v", selected, err) + } +}