From a2d0a3bf19727b7f496575156e248498f1b741f7 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Sun, 23 Aug 2026 21:07:02 +0300 Subject: [PATCH] fix(reflection): preserve cognition-required candidates --- adapters/postgres/epistemics_repository.go | 2 +- dev/ACTIVE_TASK.json | 4 ++-- ...V-000251-reflection-cognition-routing.json | 23 +++++++++++++++++++ 3 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 dev/tasks/DEV-000251-reflection-cognition-routing.json diff --git a/adapters/postgres/epistemics_repository.go b/adapters/postgres/epistemics_repository.go index 2befe1b..3f1a9bf 100644 --- a/adapters/postgres/epistemics_repository.go +++ b/adapters/postgres/epistemics_repository.go @@ -150,7 +150,7 @@ func (r *EpistemicsRepository) ClaimReflectionCandidate(ctx context.Context, wor var value epistemics.ReflectionCandidate err = tx.QueryRow(ctx, `SELECT reflection_candidate_id,trigger,state,source_experience_id,original_intent_id,source_utterance_id,summary,evidence_refs,requires_cognition,recorded_at_unix_millis,revision,claimed_by,claim_expires_at_unix_millis FROM epistemics.reflection_candidates - WHERE state='OPEN' AND (claim_expires_at_unix_millis=0 OR claim_expires_at_unix_millis < $1) + WHERE state='OPEN' AND requires_cognition=false AND (claim_expires_at_unix_millis=0 OR claim_expires_at_unix_millis < $1) ORDER BY recorded_at_unix_millis,reflection_candidate_id FOR UPDATE SKIP LOCKED LIMIT 1`, nowUnixMillis).Scan(&value.ID, &value.Trigger, &value.State, &value.SourceExperienceID, &value.OriginalIntentID, &value.SourceUtteranceID, &value.Summary, &value.EvidenceRefs, &value.RequiresCognition, &value.RecordedAtUnixMillis, &value.Revision, &value.ClaimedBy, &value.ClaimExpiresAtUnixMillis) if err != nil { diff --git a/dev/ACTIVE_TASK.json b/dev/ACTIVE_TASK.json index 0aff802..2f31d37 100644 --- a/dev/ACTIVE_TASK.json +++ b/dev/ACTIVE_TASK.json @@ -1,5 +1,5 @@ { - "task_file": "dev/tasks/DEV-000250-task-evaluation-terminal-callback.json", - "task_id": "DEV-000250", + "task_file": "dev/tasks/DEV-000251-reflection-cognition-routing.json", + "task_id": "DEV-000251", "task_revision": 1 } diff --git a/dev/tasks/DEV-000251-reflection-cognition-routing.json b/dev/tasks/DEV-000251-reflection-cognition-routing.json new file mode 100644 index 0000000..9578c7e --- /dev/null +++ b/dev/tasks/DEV-000251-reflection-cognition-routing.json @@ -0,0 +1,23 @@ +{ + "task_id": "DEV-000251", + "task_revision": 1, + "architecture_revision": "ADR-0018", + "base_repo_revision": "c1cde67bcfff8e0e80553ce0562f9841f6c00b30", + "risk_tier": "E", + "intent": "Prevent the reflection worker from resolving cognition-required candidates before a governed reflection path evaluates them.", + "requirement_ids": ["learning reflection loop", "durable candidate routing", "no false resolution"], + "allowed_change_scope": {"modules": ["epistemics"], "paths": ["adapters/postgres/epistemics_repository.go", "cmd/reflection-worker/**", "modules/epistemics/domain/**", "dev/ACTIVE_TASK.json", "dev/tasks/DEV-000251-reflection-cognition-routing.json"]}, + "forbidden_change_scope": {"paths": ["architecture/**", "security/**", "database/**", "deploy/**", "contracts/**", "LLM-local/**", "modules/work/**", "cmd/cognitive-worker/**"]}, + "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 ReflectionCandidate state and requires_cognition field", "existing Epistemics repository"], "may_change": []}, + "semantic_owner": "Epistemics reflection candidate lifecycle", + "canonical_state": ["existing epistemics.reflection_candidates rows only"], + "state_transitions": ["OPEN deterministic -> EVALUATING -> RESOLVED", "OPEN cognition-required remains OPEN until governed evaluator"], + "side_effects_and_privileges": ["existing epistemics owner updates only; no cognition call or proposal promotion"], + "persistence_and_migrations": ["none"], + "failure_retry_restart": ["cognition-required candidates remain durable and claimable only by a future cognition evaluator; stale deterministic claims recover"], + "assumptions": ["reflection worker is the deterministic close loop and must not impersonate a cognitive evaluator"], + "acceptance_scenarios": ["worker resolves deterministic candidate", "worker does not claim cognition-required candidate", "OPEN cognition candidate survives restart", "status remains healthy when only cognition candidates are pending"], + "required_tests": ["go test ./cmd/reflection-worker ./adapters/postgres ./modules/epistemics/domain", "go vet ./cmd/reflection-worker ./adapters/postgres ./modules/epistemics/domain", "go run ./cmd/devctl preflight -active dev/ACTIVE_TASK.json", "go run ./cmd/devctl check-diff -active dev/ACTIVE_TASK.json", "go run ./cmd/devctl check-architecture", "git diff --check", "independent", "CI", "production health smoke", "live reflection-worker status"], + "terminal_gap_states": ["BLOCKED_BY_MISSING_CAPABILITY", "BLOCKED_BY_SPEC_GAP"] +} -- 2.54.0