From deaddbca12277726a8d5093c88d2e8a746caf249 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Sun, 23 Aug 2026 18:34:43 +0300 Subject: [PATCH] fix(cognitive): satisfy qualification advisory contract --- cmd/cognitive-worker/model_qualification.go | 2 +- .../model_qualification_test.go | 3 +++ dev/ACTIVE_TASK.json | 4 ++-- .../DEV-000236-qualification-locale-fix.json | 23 +++++++++++++++++++ 4 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 dev/tasks/DEV-000236-qualification-locale-fix.json diff --git a/cmd/cognitive-worker/model_qualification.go b/cmd/cognitive-worker/model_qualification.go index 27e3d00..6d1580e 100644 --- a/cmd/cognitive-worker/model_qualification.go +++ b/cmd/cognitive-worker/model_qualification.go @@ -89,7 +89,7 @@ func qualifyModels(ctx context.Context, registration providerRegistration, owner go func(index int, model models.DiscoveredModel) { defer wg.Done() started := time.Now() - request := cognitive.AdvisoryRequest{Version: cognitive.CreatorAdvisoryV1, RequestID: cognitive.RequestID(fmt.Sprintf("qualification:%s:%d", model.ProviderModelID, started.UnixNano())), ActorID: identity.ActorID("qualification-runtime"), PrincipalID: identity.PrincipalID(owner), ScopeID: authority.ScopeID("qualification-scope"), Message: prompt, MaxOutputBytes: maxOutputBytes, ProviderBindingID: "qualification-binding-v1", ProviderBindingRevision: 1, ProviderInstanceID: registration.ProviderInstanceID, ModelDescriptorID: capability.ModelDescriptorID("qualification-" + string(model.ProviderModelID)), ProviderModelID: model.ProviderModelID} + request := cognitive.AdvisoryRequest{Version: cognitive.CreatorAdvisoryV1, RequestID: cognitive.RequestID(fmt.Sprintf("qualification:%s:%d", model.ProviderModelID, started.UnixNano())), ActorID: identity.ActorID("qualification-runtime"), PrincipalID: identity.PrincipalID(owner), ScopeID: authority.ScopeID("qualification-scope"), Message: prompt, Locale: "en-US", MaxOutputBytes: maxOutputBytes, ProviderBindingID: "qualification-binding-v1", ProviderBindingRevision: 1, ProviderInstanceID: registration.ProviderInstanceID, ModelDescriptorID: capability.ModelDescriptorID("qualification-" + string(model.ProviderModelID)), ProviderModelID: model.ProviderModelID} response, err := registration.Provider.Advise(ctx, request) result := modelQualificationResult{ProviderModelID: model.ProviderModelID, LatencyMillis: time.Since(started).Milliseconds(), QualityAssessed: false, Category: capability.ModelRatingUnrated} if err != nil { diff --git a/cmd/cognitive-worker/model_qualification_test.go b/cmd/cognitive-worker/model_qualification_test.go index 5ce42fc..3043b88 100644 --- a/cmd/cognitive-worker/model_qualification_test.go +++ b/cmd/cognitive-worker/model_qualification_test.go @@ -21,6 +21,9 @@ func (qualificationProvider) Discover(context.Context) ([]models.DiscoveredModel return []models.DiscoveredModel{{ProviderModelID: "model-a"}, {ProviderModelID: "model-b"}}, models.ProviderProbe{Health: capability.HealthAvailable} } func (qualificationProvider) Advise(_ context.Context, request cognitive.AdvisoryRequest) (cognitive.AdvisoryResponse, error) { + if err := models.ValidateAdvisoryRequest(request); err != nil { + return cognitive.AdvisoryResponse{}, err + } return cognitive.AdvisoryResponse{Version: request.Version, RequestID: request.RequestID, AdvisoryText: "reachable", FinishReason: cognitive.FinishCompleted}, nil } diff --git a/dev/ACTIVE_TASK.json b/dev/ACTIVE_TASK.json index 594bc05..69b3022 100644 --- a/dev/ACTIVE_TASK.json +++ b/dev/ACTIVE_TASK.json @@ -1,5 +1,5 @@ { - "task_file": "dev/tasks/DEV-000235-model-qualification-probe.json", - "task_id": "DEV-000235", + "task_file": "dev/tasks/DEV-000236-qualification-locale-fix.json", + "task_id": "DEV-000236", "task_revision": 1 } diff --git a/dev/tasks/DEV-000236-qualification-locale-fix.json b/dev/tasks/DEV-000236-qualification-locale-fix.json new file mode 100644 index 0000000..858d022 --- /dev/null +++ b/dev/tasks/DEV-000236-qualification-locale-fix.json @@ -0,0 +1,23 @@ +{ + "task_id": "DEV-000236", + "task_revision": 1, + "architecture_revision": "ADR-0018", + "risk_tier": "E", + "base_repo_revision": "b20611590a075e3574efddbdba6e1ace312d11a8", + "intent": "Make the bounded model qualification invocation satisfy the canonical advisory contract and keep a regression test for the required locale.", + "requirement_ids": ["model qualification smoke", "advisory contract"], + "allowed_change_scope": {"modules": ["cognitive-worker"], "paths": ["cmd/cognitive-worker/model_qualification.go", "cmd/cognitive-worker/model_qualification_test.go", "dev/ACTIVE_TASK.json", "dev/tasks/DEV-000236-qualification-locale-fix.json"]}, + "forbidden_change_scope": {"paths": ["architecture/**", "security/**", "database/**", "deploy/**", "LLM-local/**", "modules/work/secrets/**", "contracts/**"]}, + "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": ["Creator advisory request validation"], "may_change": []}, + "semantic_owner": "Cognitive worker qualification observation", + "canonical_state": ["none; qualification remains an operational observation"], + "state_transitions": ["invalid advisory invocation -> valid bounded invocation"], + "side_effects_and_privileges": ["read-only bounded provider invocation; no promotion or routing mutation"], + "persistence_and_migrations": ["none"], + "failure_retry_restart": ["one bounded probe failure remains isolated"], + "assumptions": ["provider credentials remain protected inside cognitive-worker"], + "acceptance_scenarios": ["live qualification invocation passes advisory validation", "quality remains UNRATED"], + "required_tests": ["go test ./cmd/cognitive-worker/...", "go vet ./cmd/cognitive-worker/...", "preflight", "check-diff", "check-architecture", "independent", "git diff --check", "CI", "production health smoke"], + "terminal_gap_states": ["BLOCKED_BY_MISSING_CAPABILITY", "BLOCKED_BY_SPEC_GAP"] +} -- 2.54.0