Compare commits

...
Author SHA1 Message Date
m 4f89c46545 fix: authenticate cognitive readiness probe
CI / test (push) Successful in 36s
CI / test (pull_request) Successful in 34s
2026-08-22 20:46:03 +03:00
m 5d5afc8888 Merge pull request 'fix: authenticate fleet readiness probe' (#137) from codex/authorized-fleet-readiness into main
CI / test (push) Successful in 48s
2026-08-22 17:41:55 +00:00
m 79ce5a0b82 fix: authenticate fleet readiness probe
CI / test (push) Successful in 36s
CI / test (pull_request) Successful in 32s
2026-08-22 20:40:33 +03:00
m 65a60d5f06 Merge pull request 'test: cover operations status surfaces' (#136) from codex/operations-ui-contract-refresh into main
CI / test (push) Successful in 49s
2026-08-22 17:36:54 +00:00
m 4739a22f7b test: cover operations status surfaces
CI / test (push) Successful in 32s
CI / test (pull_request) Successful in 33s
2026-08-22 20:35:33 +03:00
m c25a6346d0 Merge pull request 'docs: refresh completion evidence revision' (#135) from codex/status-after-completion-matrix into main
CI / test (push) Successful in 47s
2026-08-22 17:31:57 +00:00
m 5f71fa8dc4 docs: refresh completion evidence revision
CI / test (push) Successful in 33s
CI / test (pull_request) Successful in 32s
2026-08-22 20:30:37 +03:00
m bda71caece Merge pull request 'docs: publish audit completion matrix' (#134) from codex/completion-audit-matrix into main
CI / test (push) Successful in 44s
2026-08-22 17:27:36 +00:00
m 0656f88fd0 docs: publish audit completion matrix
CI / test (push) Successful in 34s
CI / test (pull_request) Successful in 32s
2026-08-22 20:26:14 +03:00
m 3cf44ada8a Merge pull request 'docs: refresh bridge wiring status' (#133) from codex/status-after-bridge-wiring into main
CI / test (push) Successful in 49s
2026-08-22 17:22:32 +00:00
m ca00377bec docs: refresh bridge wiring status
CI / test (push) Successful in 33s
CI / test (pull_request) Successful in 32s
2026-08-22 20:21:13 +03:00
m ada2da0c6c Merge pull request 'chore: wire optional agent bridge URL' (#132) from codex/agent-bridge-config-wiring into main
CI / test (push) Successful in 46s
2026-08-22 17:17:58 +00:00
15 changed files with 261 additions and 11 deletions
+4
View File
@@ -17,6 +17,7 @@ type fleetEndpoint struct {
ModelID string
Tier capability.FleetTier
URL string
Headers map[string]string
}
type fleetStatusResponse struct {
@@ -37,6 +38,9 @@ func fleetReadinessHandler(client *http.Client, preferred capability.FleetTier,
}
request, err := http.NewRequestWithContext(r.Context(), http.MethodGet, endpoint.URL, nil)
if err == nil {
for name, value := range endpoint.Headers {
request.Header.Set(name, value)
}
response, requestErr := client.Do(request)
if requestErr == nil {
response.Body.Close()
+19
View File
@@ -25,3 +25,22 @@ func TestFleetReadinessSelectsLifeboatWhenPrimaryTiersUnavailable(t *testing.T)
t.Fatalf("status=%d body=%s", recorder.Code, recorder.Body.String())
}
}
func TestFleetReadinessSendsConfiguredProviderHeaders(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") != "Bearer fleet-key" {
t.Fatalf("authorization=%q", r.Header.Get("Authorization"))
}
w.WriteHeader(http.StatusOK)
}))
defer server.Close()
handler := fleetReadinessHandler(server.Client(), capability.FleetTierFast, []fleetEndpoint{{
ProviderID: "cpu", ModelID: "cpu-model", Tier: capability.FleetTierFast, URL: server.URL,
Headers: map[string]string{"Authorization": "Bearer fleet-key"},
}})
recorder := httptest.NewRecorder()
handler.ServeHTTP(recorder, httptest.NewRequest(http.MethodGet, "/v1/fleet/readiness", nil))
if recorder.Code != http.StatusOK || !strings.Contains(recorder.Body.String(), `"ready":true`) {
t.Fatalf("status=%d body=%s", recorder.Code, recorder.Body.String())
}
}
+13 -7
View File
@@ -86,16 +86,22 @@ func main() {
mux.Handle("/healthz", health.Handler{Runtime: "cognitive-worker", SemanticGeneration: 1, ArchitectureGeneration: 1})
readinessClient := &http.Client{Timeout: 2 * time.Second}
lifeboatURL := strings.TrimSuffix(strings.TrimRight(envOr("LOCAL_LIFEBOAT_PROVIDER_URL", "http://cognitive-lifeboat:8086/v1"), "/"), "/v1") + "/health"
mux.Handle("/readyz", health.ReadinessHandler{Runtime: "cognitive-worker", Probes: []health.Probe{
health.HTTPProbe(readinessClient, strings.TrimRight(envOr("CORE_RUNTIME_URL", "http://core-runtime:8080"), "/")+"/healthz"),
health.OptionalHTTPProbe(readinessClient, strings.TrimRight(envOr("LOCAL_CPU_PROVIDER_URL", "http://docker.cin.su:18082/v1"), "/")+"/models"),
health.HTTPProbe(readinessClient, lifeboatURL),
health.OptionalHTTPProbe(readinessClient, strings.TrimRight(envOr("LOCAL_GPU_PROVIDER_URL", "http://192.168.220.91:11434"), "/")+"/api/tags"),
}})
fleetClient := &http.Client{Timeout: 2 * time.Second}
preferredFleet := capability.FleetTier(envOr("COGNITIVE_PREFERRED_FLEET_TIER", string(capability.FleetTierHeavy)))
cpuFleetHeaders := map[string]string{}
if cpuAPIKey != "" {
cpuFleetHeaders["Authorization"] = "Bearer " + cpuAPIKey
}
cpuHealthProbe := health.OptionalHTTPProbeWithHeaders(readinessClient, strings.TrimRight(envOr("LOCAL_CPU_PROVIDER_URL", "http://docker.cin.su:18082/v1"), "/")+"/models", cpuFleetHeaders)
readinessProbes := []health.Probe{
health.HTTPProbe(readinessClient, strings.TrimRight(envOr("CORE_RUNTIME_URL", "http://core-runtime:8080"), "/")+"/healthz"),
cpuHealthProbe,
health.HTTPProbe(readinessClient, lifeboatURL),
health.OptionalHTTPProbe(readinessClient, strings.TrimRight(envOr("LOCAL_GPU_PROVIDER_URL", "http://192.168.220.91:11434"), "/")+"/api/tags"),
}
mux.Handle("/readyz", health.ReadinessHandler{Runtime: "cognitive-worker", Probes: readinessProbes})
mux.Handle("/v1/fleet/readiness", fleetReadinessHandler(fleetClient, preferredFleet, []fleetEndpoint{
{ProviderID: "local-cpu-primary", ModelID: "local-cpu-model", Tier: capability.FleetTierFast, URL: strings.TrimRight(envOr("LOCAL_CPU_PROVIDER_URL", "http://docker.cin.su:18082/v1"), "/") + "/models"},
{ProviderID: "local-cpu-primary", ModelID: "local-cpu-model", Tier: capability.FleetTierFast, URL: strings.TrimRight(envOr("LOCAL_CPU_PROVIDER_URL", "http://docker.cin.su:18082/v1"), "/") + "/models", Headers: cpuFleetHeaders},
{ProviderID: "local-medium-unconfigured", ModelID: "medium-unconfigured", Tier: capability.FleetTierMedium},
{ProviderID: "local-gpu-opportunistic", ModelID: "gpu-opportunistic", Tier: capability.FleetTierHeavy, URL: strings.TrimRight(envOr("LOCAL_GPU_PROVIDER_URL", "http://192.168.220.91:11434"), "/") + "/api/tags"},
{ProviderID: "cognitive-lifeboat", ModelID: "qwen3-8b-lifeboat", Tier: capability.FleetTierLifeboat, URL: lifeboatURL},
+2 -2
View File
@@ -1,5 +1,5 @@
{
"task_file": "dev/tasks/DEV-000159-agent-bridge-config-wiring.json",
"task_id": "DEV-000159",
"task_file": "dev/tasks/DEV-000165-authorized-cpu-health-probe.json",
"task_id": "DEV-000165",
"task_revision": 1
}
@@ -0,0 +1,23 @@
{
"task_id": "DEV-000160",
"task_revision": 1,
"architecture_revision": "ADR-0010",
"base_repo_revision": "ada2da0c6c93d630f7699bd05abd32031c11544c",
"risk_tier": "E",
"intent": "Synchronize project status with the latest bridge wiring deployment and preserve the explicit external capability gap.",
"requirement_ids": ["AUDIT-TRUTHFUL-STATUS", "WP-301"],
"allowed_change_scope": {"modules": [], "paths": ["docs/PROJECT_STATUS.md", "dev/ACTIVE_TASK.json", "dev/tasks/DEV-000160-status-after-bridge-wiring.json"]},
"forbidden_change_scope": {"paths": ["architecture/**", "security/**", "cmd/**", "modules/**", "contracts/**", "adapters/**", "database/**", "deploy/**", ".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": ["production revision", "optional bridge configuration state"], "may_change": []},
"semantic_owner": "none; documentation projection",
"canonical_state": [],
"state_transitions": ["evidence projection only"],
"side_effects_and_privileges": ["none"],
"persistence_and_migrations": ["none"],
"failure_retry_restart": ["not applicable"],
"assumptions": ["unset bridge URL remains truthful recovery-only state"],
"acceptance_scenarios": ["current production revision is shown", "bridge wiring and missing runtime are distinguished", "no secret value appears"],
"required_tests": ["JSON validation", "go test", "go vet", "preflight", "check-diff", "check-architecture", "independent", "git diff --check", "CI"],
"terminal_gap_states": ["BLOCKED_BY_MISSING_CAPABILITY", "BLOCKED_BY_CONFLICT"]
}
@@ -0,0 +1,23 @@
{
"task_id": "DEV-000161",
"task_revision": 1,
"architecture_revision": "ADR-0010",
"base_repo_revision": "3cf44ada8afd75fb008cf8d5965caf9c3f5b0462",
"risk_tier": "E",
"intent": "Publish a requirement-by-requirement completion matrix for the audit objective, distinguishing repository proof, production proof and external gaps.",
"requirement_ids": ["AUDIT-COMPLETION-TRUTH", "WP-301", "WP-601", "WP-800"],
"allowed_change_scope": {"modules": [], "paths": ["docs/evidence/**", "dev/ACTIVE_TASK.json", "dev/tasks/DEV-000161-completion-audit-matrix.json"]},
"forbidden_change_scope": {"paths": ["architecture/**", "security/**", "cmd/**", "modules/**", "contracts/**", "adapters/**", "database/**", "deploy/**", ".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": ["audit roadmap", "committed task packets", "production evidence artifacts"], "may_change": []},
"semantic_owner": "none; audit evidence projection",
"canonical_state": [],
"state_transitions": ["evidence projection only"],
"side_effects_and_privileges": ["none"],
"persistence_and_migrations": ["immutable JSON evidence artifact only"],
"failure_retry_restart": ["not applicable"],
"assumptions": ["unknown or externally blocked requirements are not marked complete", "matrix claims are limited to cited evidence scope"],
"acceptance_scenarios": ["all seven objective areas have a status", "production and repository proof are distinguished", "remaining external gaps are explicit", "no secret value appears"],
"required_tests": ["JSON validation", "go test", "go vet", "preflight", "check-diff", "check-architecture", "independent", "git diff --check", "CI"],
"terminal_gap_states": ["BLOCKED_BY_MISSING_CAPABILITY", "BLOCKED_BY_CONFLICT"]
}
@@ -0,0 +1,23 @@
{
"task_id": "DEV-000162",
"task_revision": 1,
"architecture_revision": "ADR-0010",
"base_repo_revision": "bda71caecece67e5ef225ac250a7a80c4bc84d94",
"risk_tier": "E",
"intent": "Refresh current production revision in project status and completion evidence after the audit matrix deployment.",
"requirement_ids": ["AUDIT-TRUTHFUL-STATUS"],
"allowed_change_scope": {"modules": [], "paths": ["docs/PROJECT_STATUS.md", "docs/evidence/audit-completion-matrix-2026-08-22-v1.json", "dev/ACTIVE_TASK.json", "dev/tasks/DEV-000162-status-after-completion-matrix.json"]},
"forbidden_change_scope": {"paths": ["architecture/**", "security/**", "cmd/**", "modules/**", "contracts/**", "adapters/**", "database/**", "deploy/**", ".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": ["current production revision", "completion matrix evidence"], "may_change": []},
"semantic_owner": "none; documentation projection",
"canonical_state": [],
"state_transitions": ["evidence projection only"],
"side_effects_and_privileges": ["none"],
"persistence_and_migrations": ["none"],
"failure_retry_restart": ["not applicable"],
"assumptions": ["matrix remains NOT_COMPLETE until external gaps are actually verified"],
"acceptance_scenarios": ["status and matrix point to bda71ca", "no completion claim is widened", "no secret value appears"],
"required_tests": ["JSON validation", "go test", "go vet", "preflight", "check-diff", "check-architecture", "independent", "git diff --check", "CI"],
"terminal_gap_states": ["BLOCKED_BY_MISSING_CAPABILITY", "BLOCKED_BY_CONFLICT"]
}
@@ -0,0 +1,23 @@
{
"task_id": "DEV-000163",
"task_revision": 1,
"architecture_revision": "ADR-0018",
"base_repo_revision": "c25a6346d0615f66ddb411450fcc7a36c62d2b48",
"risk_tier": "E",
"intent": "Extend authenticated cabinet contract tests to cover truthful model-fleet and Agent Execution status surfaces already implemented in Creator Web.",
"requirement_ids": ["WP-801", "WP-802", "WP-805", "Authenticated cabinet acceptance"],
"allowed_change_scope": {"modules": ["creator-web"], "paths": ["tests/creator_web/cabinet_acceptance_contract_test.go", "dev/ACTIVE_TASK.json", "dev/tasks/DEV-000163-operations-ui-contract-refresh.json"]},
"forbidden_change_scope": {"paths": ["architecture/**", "security/**", "deploy/**", "database/**", "cmd/**", "contracts/**", ".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 authenticated Creator Web status routes and static cabinet"], "may_change": ["acceptance tests only"]},
"semantic_owner": "creator-web",
"canonical_state": ["none; tests inspect existing UI contract"],
"state_transitions": ["authenticated session gates truthful status requests"],
"side_effects_and_privileges": ["no external mutation; no credentials embedded"],
"persistence_and_migrations": ["none"],
"failure_retry_restart": ["missing status surface fails CI"],
"assumptions": ["live authenticated browser visual acceptance remains a separate production verification"],
"acceptance_scenarios": ["fleet and executor status controls exist", "server exposes authenticated routes", "console renders actual selected tier and worker mode", "responsive/reduced-motion tests remain active"],
"required_tests": ["go test ./...", "go vet ./...", "preflight", "check-diff", "check-architecture", "independent", "git diff --check", "CI"],
"terminal_gap_states": ["BLOCKED_BY_AUTHENTICATED_BROWSER_SESSION", "BLOCKED_BY_CONFLICT"]
}
@@ -0,0 +1,23 @@
{
"task_id": "DEV-000164",
"task_revision": 1,
"architecture_revision": "ADR-0018",
"base_repo_revision": "65a60d5f068e3d8f70733c4ee96bfbb9d9943d5e",
"risk_tier": "E",
"intent": "Make live model-fleet readiness use the existing file-backed CPU provider API key so FAST status reflects the authenticated provider path.",
"requirement_ids": ["WP-601", "Model fleet/failover"],
"allowed_change_scope": {"modules": ["cognitive-worker", "capability"], "paths": ["cmd/cognitive-worker/main.go", "cmd/cognitive-worker/fleet_status.go", "cmd/cognitive-worker/fleet_status_test.go", "dev/ACTIVE_TASK.json", "dev/tasks/DEV-000164-authorized-fleet-readiness.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 provider API key resolver", "fleet readiness response"], "may_change": ["fleet readiness probe request headers"]},
"semantic_owner": "capability/cognitive-worker",
"canonical_state": [],
"state_transitions": ["authenticated provider probe -> truthful FAST readiness"],
"side_effects_and_privileges": ["uses existing in-memory resolved key only for the internal provider probe; no key logging or persistence"],
"persistence_and_migrations": ["none"],
"failure_retry_restart": ["401 remains a typed unavailable result when key is absent or rejected; GPU/Medium behavior unchanged"],
"assumptions": ["OpenAI-compatible local provider uses Bearer authentication as the existing model adapter does"],
"acceptance_scenarios": ["fleet readiness sends Bearer header when CPU key is configured", "FAST is ready when authenticated /models succeeds", "no Authorization header is sent without a key", "Lifeboat fallback remains unchanged"],
"required_tests": ["go test ./...", "go vet ./...", "preflight", "check-diff", "check-architecture", "independent", "git diff --check", "CI", "production fleet readiness"],
"terminal_gap_states": ["BLOCKED_BY_MISSING_CAPABILITY", "BLOCKED_BY_CONFLICT"]
}
@@ -0,0 +1,23 @@
{
"task_id": "DEV-000165",
"task_revision": 1,
"architecture_revision": "ADR-0018",
"base_repo_revision": "5d5afc88883c7f79e3b051c790642e41386666ec",
"risk_tier": "E",
"intent": "Use the existing file-backed CPU provider API key in cognitive-worker readiness probes so /readyz and fleet readiness report consistent provider state.",
"requirement_ids": ["WP-601", "Model fleet/failover"],
"allowed_change_scope": {"modules": ["cognitive-worker", "platform-health"], "paths": ["runtime/health/server.go", "runtime/health/server_test.go", "cmd/cognitive-worker/main.go", "dev/ACTIVE_TASK.json", "dev/tasks/DEV-000165-authorized-cpu-health-probe.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 health Probe contract", "existing provider API key resolver"], "may_change": ["health probe header support"]},
"semantic_owner": "cognitive-worker/platform health",
"canonical_state": [],
"state_transitions": ["authenticated CPU probe -> consistent readiness evidence"],
"side_effects_and_privileges": ["resolved key is used only in outbound probe header; never logged or persisted"],
"persistence_and_migrations": ["none"],
"failure_retry_restart": ["provider timeout or rejected key remains degraded; no fallback behavior changed"],
"assumptions": ["the local provider uses Bearer authentication"],
"acceptance_scenarios": ["health probe sends configured header", "cognitive /readyz uses authenticated CPU probe", "GPU remains optional", "no key is sent when absent"],
"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"]
}
+2 -2
View File
@@ -2,11 +2,11 @@
## Current audit delta — 2026-08-22
- `CURRENT_PRODUCTION_REVISION = 3a52c18bef7e29a0369ad1edf05adeed1be5935e`; public `/healthz` is healthy.
- `CURRENT_PRODUCTION_REVISION = bda71caecece67e5ef225ac250a7a80c4bc84d94`; public `/healthz` is healthy.
- `FAST_PROVIDER_STATUS = LIVE_SMOKE_SUPPORTED`: local CPU gateway authentication is configured through a protected file reference; four bounded local-only advisory cases completed through cognitive-worker. Evidence: `docs/evidence/wp-601-fast-gateway-live-smoke-2026-08-22-v1.json`.
- `MEDIUM_PROVIDER_STATUS = NOT_CONFIGURED`; no medium runtime is registered in production.
- `HEAVY_PROVIDER_STATUS = UNAVAILABLE`; GPU endpoint `192.168.220.91:11434` timed out during live discovery.
- `AGENT_EXECUTION_STATUS = RECOVERY_ONLY`; `AGENT_EXECUTION_BRIDGE_URL` is not configured and no Codex/bridge runtime is deployed. Durable recovery and status endpoints remain active.
- `AGENT_EXECUTION_STATUS = RECOVERY_ONLY`; optional `AGENT_EXECUTION_BRIDGE_URL` is wired into production compose but remains unset, and no Codex/bridge runtime is deployed. Durable recovery and status endpoints remain active.
- `FLEET_EXECUTION_EVIDENCE = docs/evidence/wp-200-wp-301-fleet-execution-status-2026-08-22-v1.json`; current selection is LIFEBOAT, with Medium not configured and Heavy unavailable by timeout.
- `BACKUP_RESTORE_EVIDENCE = docs/evidence/wp-002-postgres-restore-2026-08-22-v1.json`; latest backup checksum and isolated restore verified with 11 schemas and 60 tables.
- `UI_AUTHENTICATED_ACCEPTANCE = PENDING`; public login UI is reachable, but no authenticated browser session was available for cabinet visual acceptance.
@@ -0,0 +1,18 @@
{
"evidence_id": "audit-completion-matrix-2026-08-22-v1",
"captured_at": "2026-08-22",
"production_revision": "bda71caecece67e5ef225ac250a7a80c4bc84d94",
"objective": "Dovести оставшиеся пункты аудита Domovoy до проверяемого состояния",
"matrix": [
{"area":"Agent Execution runtime and recovery","status":"PARTIAL_EXTERNAL_GAP","repository_proof":["dev/tasks/DEV-000145-agent-execution-bridge-runtime.json","adapters/agentbridge/http.go","cmd/agent-worker/main.go"],"production_proof":["docs/evidence/wp-200-wp-301-fleet-execution-status-2026-08-22-v1.json"],"missing":"independently operated bridge endpoint is not configured; live worker is recovery-only"},
{"area":"Multi-Agent Work Graph","status":"REPOSITORY_AND_RUNTIME_FOUNDATION_VERIFIED","repository_proof":["dev/tasks/DEV-000131-work-graph-harness.json","dev/tasks/DEV-000146-work-graph-runtime.json","tests/agent_execution/graph_runtime_test.go"],"production_proof":["docs/PROJECT_STATUS.md"],"missing":"no claim of external agent execution fan-out is made while bridge is absent"},
{"area":"Truth/Research runtime","status":"REPOSITORY_AND_RUNTIME_FOUNDATION_VERIFIED","repository_proof":["dev/tasks/DEV-000134-truth-bundle-compiler.json","dev/tasks/DEV-000143-research-runtime-orchestration.json","tests/research_runtime"],"production_proof":["docs/PROJECT_STATUS.md"],"missing":"authenticated end-to-end research acceptance is not claimed here"},
{"area":"Learning reflection loop","status":"REPOSITORY_AND_RUNTIME_FOUNDATION_VERIFIED","repository_proof":["dev/tasks/DEV-000135-reflection-worker.json","cmd/reflection-worker/main.go","tests/research_contracts/reflection_worker_sql_test.go"],"production_proof":["docs/PROJECT_STATUS.md"],"missing":"no claim of fully closed historical candidate backlog"},
{"area":"Model fleet/failover","status":"PARTIAL_EXTERNAL_GAP","repository_proof":["dev/tasks/DEV-000144-fleet-readiness-runtime.json","cmd/cognitive-worker/fleet_status.go"],"production_proof":["docs/evidence/wp-200-wp-301-fleet-execution-status-2026-08-22-v1.json"],"missing":"Medium is not configured; Heavy GPU probe times out; Lifeboat is selected fallback"},
{"area":"Governed self-development","status":"REPOSITORY_FOUNDATION_VERIFIED","repository_proof":["dev/tasks/DEV-000137-governed-self-development-gate.json","tests/semantic_evolution"],"production_proof":["docs/PROJECT_STATUS.md"],"missing":"real bridge-backed self-development execution is not claimed"},
{"area":"UI/operations acceptance","status":"PARTIAL_EXTERNAL_GAP","repository_proof":["dev/tasks/DEV-000138-ui-operations-acceptance-contract.json","tests/creator_web/cabinet_acceptance_contract_test.go","dev/tasks/DEV-000150-agent-operations-ui.json","dev/tasks/DEV-000151-agent-worker-status-ui.json"],"production_proof":["docs/PROJECT_STATUS.md"],"missing":"authenticated browser visual acceptance is pending because no signed-in session is available"}
],
"overall_status":"NOT_COMPLETE",
"completion_rule":"The objective is not complete until every PARTIAL_EXTERNAL_GAP has live evidence for its missing capability and authenticated UI acceptance is recorded.",
"secrets":"No secret values included."
}
+13
View File
@@ -82,11 +82,18 @@ func (h ReadinessHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
}
func HTTPProbe(client *http.Client, endpoint string) Probe {
return HTTPProbeWithHeaders(client, endpoint, nil)
}
func HTTPProbeWithHeaders(client *http.Client, endpoint string, headers map[string]string) Probe {
return Probe{Name: endpoint, Check: func(ctx context.Context) error {
req, err := http.NewRequestWithContext(ctx, http.MethodGet, endpoint, nil)
if err != nil {
return err
}
for name, value := range headers {
req.Header.Set(name, value)
}
response, err := client.Do(req)
if err != nil {
return err
@@ -108,6 +115,12 @@ func OptionalHTTPProbe(client *http.Client, endpoint string) Probe {
return probe
}
func OptionalHTTPProbeWithHeaders(client *http.Client, endpoint string, headers map[string]string) Probe {
probe := HTTPProbeWithHeaders(client, endpoint, headers)
probe.Optional = true
return probe
}
func TCPProbe(name, host, port string) Probe {
return Probe{Name: name, Check: func(ctx context.Context) error {
connection, err := (&net.Dialer{}).DialContext(ctx, "tcp", net.JoinHostPort(host, port))
+14
View File
@@ -27,6 +27,20 @@ func TestReadinessReturns200WhenAllProbesPass(t *testing.T) {
}
}
func TestHTTPProbeWithHeadersSendsHeaders(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") != "Bearer health-key" {
t.Fatalf("authorization=%q", r.Header.Get("Authorization"))
}
w.WriteHeader(http.StatusOK)
}))
defer server.Close()
probe := HTTPProbeWithHeaders(server.Client(), server.URL, map[string]string{"Authorization": "Bearer health-key"})
if err := probe.Check(context.Background()); err != nil {
t.Fatal(err)
}
}
func TestReadinessStaysAvailableWithOptionalDependencyDegraded(t *testing.T) {
handler := ReadinessHandler{Runtime: "test", Probes: []Probe{
{Name: "lifeboat", Check: func(context.Context) error { return nil }},
@@ -52,3 +52,41 @@ func TestCreatorCabinetResponsiveAndReducedMotionRulesExist(t *testing.T) {
}
}
}
func TestCreatorCabinetExposesFleetAndExecutorTruthfulStatusSurfaces(t *testing.T) {
markupBytes, err := os.ReadFile("../../cmd/creator-web/static/index.html")
if err != nil {
t.Fatal(err)
}
markup := string(markupBytes)
for _, marker := range []string{
`id="fleet-summary"`, `id="fleet-selected"`, `id="fleet-list"`,
`id="agent-worker-state"`, `id="agent-worker-message"`,
} {
if !strings.Contains(markup, marker) {
t.Fatalf("operations cabinet missing truthful status surface %q", marker)
}
}
serverBytes, err := os.ReadFile("../../cmd/creator-web/server.go")
if err != nil {
t.Fatal(err)
}
server := string(serverBytes)
for _, marker := range []string{`r.URL.Path == "/api/fleet/readiness"`, `r.URL.Path == "/api/agent-worker/status"`} {
if !strings.Contains(server, marker) {
t.Fatalf("creator server missing authenticated status route %q", marker)
}
}
consoleBytes, err := os.ReadFile("../../cmd/creator-web/static/assets/console.js")
if err != nil {
t.Fatal(err)
}
console := string(consoleBytes)
for _, marker := range []string{`request("/api/fleet/readiness")`, `request("/api/agent-worker/status")`, `result.selected_tier || "не выбран"`, `status.mode || "UNKNOWN"`} {
if !strings.Contains(console, marker) {
t.Fatalf("console missing truthful status rendering %q", marker)
}
}
}