Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cf35c0ae25 | ||
|
|
9f96393fb9 | ||
|
|
beee8deb34 | ||
|
|
faab913227 | ||
|
|
346a8c8467 | ||
|
|
288d18a4fb | ||
|
|
97ed2e90ee | ||
|
|
b4d166480e | ||
|
|
46b35161e9 | ||
|
|
bee238b61e | ||
|
|
ca9c4bede5 | ||
|
|
48d73c3a4b | ||
|
|
76c558ee1a | ||
|
|
e530058659 | ||
|
|
79feab8e41 | ||
|
|
03943f152d | ||
|
|
c8aa731eeb |
@@ -0,0 +1,32 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"git.cin.su/m/Assistant/contracts/work"
|
||||
)
|
||||
|
||||
// localFallbackExecutor keeps the durable work path alive when no external
|
||||
// executor is reachable. It never claims that an external action happened.
|
||||
// The work owner records the WAITING callback and can retry after a bridge is
|
||||
// configured or a human chooses the next step.
|
||||
type localFallbackExecutor struct {
|
||||
now func() time.Time
|
||||
}
|
||||
|
||||
func newLocalFallbackExecutor() localFallbackExecutor {
|
||||
return localFallbackExecutor{now: time.Now}
|
||||
}
|
||||
|
||||
func (e localFallbackExecutor) Execute(_ context.Context, request work.AgentExecutionRequest) (work.AgentExecutionResult, error) {
|
||||
now := time.Now()
|
||||
if e.now != nil {
|
||||
now = e.now()
|
||||
}
|
||||
return work.AgentExecutionResult{
|
||||
State: work.AgentExecutionWaiting,
|
||||
Summary: "Внешний Agent Execution Bridge недоступен; локальный fallback сохранил durable работу и ожидает исполнителя.",
|
||||
ObservedAtUnixMillis: now.UnixMilli(),
|
||||
}, nil
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"git.cin.su/m/Assistant/contracts/work"
|
||||
)
|
||||
|
||||
func TestLocalFallbackNeverClaimsExternalExecution(t *testing.T) {
|
||||
when := time.UnixMilli(1_700_000_000_000)
|
||||
executor := localFallbackExecutor{now: func() time.Time { return when }}
|
||||
result, err := executor.Execute(context.Background(), work.AgentExecutionRequest{Intent: work.AgentDispatchIntent{DispatchID: "dispatch-1"}})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if result.State != work.AgentExecutionWaiting || result.ObservedAtUnixMillis != when.UnixMilli() {
|
||||
t.Fatalf("unexpected fallback result: %+v", result)
|
||||
}
|
||||
if result.OutcomeRef != "" || result.Summary == "" {
|
||||
t.Fatalf("fallback must not claim an outcome: %+v", result)
|
||||
}
|
||||
}
|
||||
@@ -41,6 +41,7 @@ func main() {
|
||||
}
|
||||
defer repository.Close()
|
||||
var executor ports.AgentExecutor
|
||||
localFallback := false
|
||||
if bridgeURL, bridgeConfigured := loadProtectedBridgeURL(); bridgeConfigured {
|
||||
executor, err = agentbridge.NewHTTPExecutor(bridgeURL, &http.Client{Timeout: *leaseTTL})
|
||||
if err != nil {
|
||||
@@ -48,10 +49,12 @@ func main() {
|
||||
os.Exit(1)
|
||||
}
|
||||
} else {
|
||||
fmt.Fprintln(os.Stderr, "protected agent execution bridge URL is not configured; dispatch claims are disabled; recovery-only mode")
|
||||
executor = newLocalFallbackExecutor()
|
||||
localFallback = true
|
||||
fmt.Fprintln(os.Stderr, "protected agent execution bridge URL is not configured; local fallback preserves durable work without external mutation")
|
||||
}
|
||||
go func() {
|
||||
if serveErr := http.ListenAndServe(*statusAddr, workerStatusHandler(executor != nil)); serveErr != nil {
|
||||
if serveErr := http.ListenAndServe(*statusAddr, workerStatusHandler(executor != nil && !localFallback, localFallback)); serveErr != nil {
|
||||
fmt.Fprintln(os.Stderr, "agent worker status server:", serveErr)
|
||||
}
|
||||
}()
|
||||
|
||||
@@ -11,15 +11,22 @@ type workerStatusResponse struct {
|
||||
Mode string `json:"mode"`
|
||||
Ready bool `json:"ready"`
|
||||
Reason string `json:"reason"`
|
||||
LocalFallback bool `json:"local_fallback"`
|
||||
}
|
||||
|
||||
func workerStatusHandler(executorConfigured bool) http.Handler {
|
||||
func workerStatusHandler(executorConfigured bool, localFallback ...bool) http.Handler {
|
||||
local := len(localFallback) > 0 && localFallback[0]
|
||||
status := workerStatusResponse{
|
||||
Runtime: "agent-worker",
|
||||
ExecutorConfigured: executorConfigured,
|
||||
Mode: "recovery-only",
|
||||
Ready: false,
|
||||
Reason: "protected agent execution bridge URL is not configured",
|
||||
LocalFallback: local,
|
||||
}
|
||||
if local {
|
||||
status.Mode = "local-fallback"
|
||||
status.Reason = "external bridge unavailable; durable work is retained without external mutation"
|
||||
}
|
||||
if executorConfigured {
|
||||
status.Mode = "execution"
|
||||
|
||||
@@ -38,6 +38,18 @@ func TestWorkerStatusReportsRecoveryOnlyWithoutExecutor(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestWorkerStatusReportsLocalFallback(t *testing.T) {
|
||||
response := httptest.NewRecorder()
|
||||
workerStatusHandler(false, true).ServeHTTP(response, httptest.NewRequest(http.MethodGet, "/status", nil))
|
||||
var value workerStatusResponse
|
||||
if err := json.NewDecoder(response.Body).Decode(&value); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if response.Code != http.StatusOK || value.Ready || value.Mode != "local-fallback" || !value.LocalFallback {
|
||||
t.Fatalf("unexpected status: code=%d value=%+v", response.Code, value)
|
||||
}
|
||||
}
|
||||
|
||||
func TestWorkerReadyzRequiresExecutor(t *testing.T) {
|
||||
response := httptest.NewRecorder()
|
||||
workerStatusHandler(false).ServeHTTP(response, httptest.NewRequest(http.MethodGet, "/readyz", nil))
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"task_file": "dev/tasks/DEV-000199-medium-advisory-thinking-control.json",
|
||||
"task_id": "DEV-000199",
|
||||
"task_file": "dev/tasks/DEV-000207-gpu-invocation-qualification.json",
|
||||
"task_id": "DEV-000207",
|
||||
"task_revision": 1
|
||||
}
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"task_id": "DEV-000200",
|
||||
"task_revision": 1,
|
||||
"architecture_revision": "ADR-0018",
|
||||
"base_repo_revision": "c8aa731eeb5f0d1c1dc12591fb50bfbe5dab6d69",
|
||||
"risk_tier": "E",
|
||||
"intent": "Record bounded live smoke evidence for the MEDIUM provider after disabling hidden template thinking, without claiming lifecycle qualification or promotion.",
|
||||
"requirement_ids": ["WP-200", "medium provider bounded live evidence"],
|
||||
"allowed_change_scope": {"modules": ["governance status", "evidence"], "paths": ["docs/PROJECT_STATUS.md", "docs/evidence/medium-live-bounded-smoke-2026-08-23-v1.json", "dev/ACTIVE_TASK.json", "dev/tasks/DEV-000200-medium-live-bounded-smoke-evidence.json"]},
|
||||
"forbidden_change_scope": {"paths": ["architecture/**", "security/**", "database/**", "deploy/**", "cmd/**", "modules/**", "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": ["MEDIUM provider bounded smoke contract", "production health"], "may_change": ["status and evidence projection only"]},
|
||||
"semantic_owner": "governance",
|
||||
"canonical_state": ["model fleet evidence projection"],
|
||||
"state_transitions": ["none; record bounded smoke result and retain unpromoted state"],
|
||||
"side_effects_and_privileges": ["read-only production verification"],
|
||||
"persistence_and_migrations": ["no migration"],
|
||||
"failure_retry_restart": ["retain explicit qualification, activation, promotion and failover gaps"],
|
||||
"assumptions": ["PR c8aa731 is deployed to production before final live health verification"],
|
||||
"acceptance_scenarios": ["instruction_exact returns DOMOVOY_OK with stop", "structured_arithmetic returns answer 42 with stop", "noncanonical_action returns action not performed with stop", "ambiguous_destructive_request returns clarification marker with stop", "status keeps MEDIUM explicitly unpromoted"],
|
||||
"required_tests": ["go test ./...", "go vet ./...", "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", "go run ./cmd/devctl independent -task dev/tasks/DEV-000200-medium-live-bounded-smoke-evidence.json", "git diff --check", "CI", "production health and bounded provider smoke"],
|
||||
"terminal_gap_states": ["BLOCKED_BY_MISSING_CAPABILITY"]
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"task_id": "DEV-000201",
|
||||
"task_revision": 1,
|
||||
"architecture_revision": "ADR-0018",
|
||||
"base_repo_revision": "79feab8e4129af4ad0b9e8c9dcd81a6ba1883642",
|
||||
"risk_tier": "E",
|
||||
"intent": "Record user-provided authenticated production UI visual evidence while keeping browser interaction and operations acceptance explicitly open.",
|
||||
"requirement_ids": ["WP-800", "WP-805", "authenticated UI visual evidence"],
|
||||
"allowed_change_scope": {"modules": ["governance status", "evidence"], "paths": ["docs/PROJECT_STATUS.md", "docs/evidence/authenticated-ui-visual-observation-2026-08-23-v1.json", "dev/ACTIVE_TASK.json", "dev/tasks/DEV-000201-authenticated-ui-visual-evidence.json"]},
|
||||
"forbidden_change_scope": {"paths": ["architecture/**", "security/**", "database/**", "deploy/**", "cmd/**", "modules/**", "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": ["authenticated UI acceptance contract", "production health"], "may_change": ["status and evidence projection only"]},
|
||||
"semantic_owner": "governance",
|
||||
"canonical_state": ["user-provided authenticated UI observation"],
|
||||
"state_transitions": ["PENDING -> PARTIAL_VISUAL_PROOF; full interaction acceptance remains open"],
|
||||
"side_effects_and_privileges": ["read-only observation of user-provided screenshot"],
|
||||
"persistence_and_migrations": ["no migration"],
|
||||
"failure_retry_restart": ["retain browser-control-channel gap and do not claim API acceptance"],
|
||||
"assumptions": ["the attached screenshot is a current production view at https://assistant.cin.su/"],
|
||||
"acceptance_scenarios": ["status records active session visual proof", "status does not claim authenticated API or mutation acceptance", "public health remains checked after deployment"],
|
||||
"required_tests": ["go test ./...", "go vet ./...", "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", "go run ./cmd/devctl/independent -task dev/tasks/DEV-000201-authenticated-ui-visual-evidence.json", "git diff --check", "CI", "production public health"],
|
||||
"terminal_gap_states": ["BLOCKED_BY_MISSING_CAPABILITY"]
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"task_id": "DEV-000202",
|
||||
"task_revision": 1,
|
||||
"architecture_revision": "ADR-0018",
|
||||
"base_repo_revision": "e5300586599e4bd1ad5b6c1530d31d2619b9a88b",
|
||||
"risk_tier": "E",
|
||||
"intent": "Record fast authenticated UI and operations smoke evidence without running deferred deep acceptance suites or mutating operational state.",
|
||||
"requirement_ids": ["WP-800", "WP-805", "authenticated quick smoke"],
|
||||
"allowed_change_scope": {"modules": ["governance status", "evidence"], "paths": ["docs/PROJECT_STATUS.md", "docs/evidence/authenticated-ui-quick-smoke-2026-08-23-v1.json", "dev/ACTIVE_TASK.json", "dev/tasks/DEV-000202-authenticated-ui-quick-smoke.json"]},
|
||||
"forbidden_change_scope": {"paths": ["architecture/**", "security/**", "database/**", "deploy/**", "cmd/**", "modules/**", "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": ["authenticated UI acceptance contract", "diagnostic and fleet read APIs", "production health"], "may_change": ["status and evidence projection only"]},
|
||||
"semantic_owner": "governance",
|
||||
"canonical_state": ["authenticated quick smoke observation"],
|
||||
"state_transitions": ["PARTIAL_VISUAL_PROOF -> AUTHENTICATED_QUICK_SMOKE_PASS"],
|
||||
"side_effects_and_privileges": ["read-only diagnostics and fleet checks; chat smoke response; no operation mutation"],
|
||||
"persistence_and_migrations": ["no migration"],
|
||||
"failure_retry_restart": ["retain external bridge gap and defer deep acceptance"],
|
||||
"assumptions": ["user-authenticated browser session is current production session", "the user-requested fast-test mode defers deep suites"],
|
||||
"acceptance_scenarios": ["chat smoke responds", "admin console authenticates", "diagnostics reports 7/7", "fleet reports 4/4 ready", "agent worker gap remains visible", "action history renders"],
|
||||
"required_tests": ["quick browser smoke", "go test ./cmd/creator-web", "go vet ./cmd/creator-web", "preflight", "check-diff", "check-architecture", "independent", "git diff --check", "production public health"],
|
||||
"terminal_gap_states": ["BLOCKED_BY_MISSING_CAPABILITY"]
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"task_id": "DEV-000203",
|
||||
"task_revision": 1,
|
||||
"architecture_revision": "ADR-0018",
|
||||
"base_repo_revision": "bee238b61e4760bd864355b893f1fbb188b3f4ce",
|
||||
"risk_tier": "E",
|
||||
"intent": "Provide a first-party local Agent Execution fallback that preserves durable work without claiming external execution when the optional bridge is unavailable.",
|
||||
"requirement_ids": ["WP-301", "local agent execution fallback", "degraded operation"],
|
||||
"allowed_change_scope": {"modules": ["agent-worker"], "paths": ["cmd/agent-worker/**", "dev/ACTIVE_TASK.json", "dev/tasks/DEV-000203-local-agent-execution-fallback.json"]},
|
||||
"forbidden_change_scope": {"paths": ["architecture/**", "database/**", "deploy/**", "security/**", "contracts/**", "modules/**", ".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": ["AgentExecutionRequest", "AgentExecutionResult", "durable worker lease/callback path"], "may_change": ["worker degraded-mode status projection"]},
|
||||
"semantic_owner": "work",
|
||||
"canonical_state": ["existing work dispatch, lease and callback state"],
|
||||
"state_transitions": ["dispatch -> durable lease/heartbeat -> explicit WAITING checkpoint when external bridge is absent"],
|
||||
"side_effects_and_privileges": ["no external mutation; no new credentials"],
|
||||
"persistence_and_migrations": ["reuse existing work persistence; no migration"],
|
||||
"failure_retry_restart": ["WAITING remains evidence-bearing and stale lease recovery remains authoritative"],
|
||||
"assumptions": ["local fallback is degraded coordination/recovery, not a claim of completed agent work", "external bridge remains optional"],
|
||||
"acceptance_scenarios": ["missing bridge selects local-fallback mode", "fallback produces WAITING with no outcome reference", "status exposes local_fallback=true", "external bridge path remains unchanged"],
|
||||
"required_tests": ["go test ./cmd/agent-worker", "go vet ./cmd/agent-worker", "preflight", "check-diff", "check-architecture", "independent", "git diff --check", "quick production worker status"],
|
||||
"terminal_gap_states": ["BLOCKED_BY_MISSING_CAPABILITY", "BLOCKED_BY_SPEC_GAP"]
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"task_id": "DEV-000204",
|
||||
"task_revision": 1,
|
||||
"architecture_revision": "ADR-0018",
|
||||
"base_repo_revision": "b4d166480e5d06049718618ffeea0ccdbb993336",
|
||||
"risk_tier": "E",
|
||||
"intent": "Record protected GPU model discovery without equating hardware availability with intelligence, qualification or routing priority.",
|
||||
"requirement_ids": ["WP-200", "model fleet/failover", "hardware-neutral routing"],
|
||||
"allowed_change_scope": {"modules": ["governance status", "evidence"], "paths": ["docs/PROJECT_STATUS.md", "docs/evidence/gpu-discovery-2026-08-23-v1.json", "dev/ACTIVE_TASK.json", "dev/tasks/DEV-000204-gpu-discovery-evidence.json"]},
|
||||
"forbidden_change_scope": {"paths": ["architecture/**", "security/**", "database/**", "deploy/**", "cmd/**", "modules/**", "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": ["protected provider discovery", "model fleet policy"], "may_change": ["status and evidence projection only"]},
|
||||
"semantic_owner": "governance",
|
||||
"canonical_state": ["capability discovery projection"],
|
||||
"state_transitions": ["HEAVY degraded -> provider AVAILABLE; models remain DISCOVERED/INACTIVE"],
|
||||
"side_effects_and_privileges": ["protected read/discovery request only"],
|
||||
"persistence_and_migrations": ["no migration"],
|
||||
"failure_retry_restart": ["retain unqualified/unpromoted state until task-specific evidence exists"],
|
||||
"assumptions": ["cognitive-worker uses the configured protected GPU credential"],
|
||||
"acceptance_scenarios": ["two GPU models are observed", "both remain unpromoted", "status rejects GPU-as-intelligence inference"],
|
||||
"required_tests": ["go test ./cmd/cognitive-worker", "go vet ./cmd/cognitive-worker", "protected provider discovery smoke", "preflight", "check-diff", "check-architecture", "independent", "git diff --check", "production public health"],
|
||||
"terminal_gap_states": ["BLOCKED_BY_MISSING_CAPABILITY"]
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"task_id": "DEV-000205",
|
||||
"task_revision": 1,
|
||||
"architecture_revision": "ADR-0018",
|
||||
"base_repo_revision": "288d18a4fba0535e3e2d15643de5b78499beb961",
|
||||
"risk_tier": "E",
|
||||
"intent": "Record a bounded protected GPU invocation smoke result without promoting or activating an unqualified model.",
|
||||
"requirement_ids": ["WP-200", "WP-201", "model fleet/failover", "truthful negative evidence"],
|
||||
"allowed_change_scope": {"modules": ["governance status", "evidence"], "paths": ["docs/evidence/gpu-invocation-smoke-2026-08-23-v1.json", "docs/PROJECT_STATUS.md", "dev/ACTIVE_TASK.json", "dev/tasks/DEV-000205-gpu-invocation-smoke-evidence.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": ["protected GPU gateway OpenAI-compatible endpoint", "existing GPU discovery evidence"], "may_change": []},
|
||||
"semantic_owner": "governance evidence projection",
|
||||
"canonical_state": [],
|
||||
"state_transitions": ["discovery available -> invocation smoke not observed; no activation"],
|
||||
"side_effects_and_privileges": ["one bounded synthetic request through an already configured protected credential"],
|
||||
"persistence_and_migrations": ["immutable JSON evidence only"],
|
||||
"failure_retry_restart": ["no retry; 400 remains an explicit negative observation"],
|
||||
"assumptions": ["the gateway credential is resolved inside the protected runtime and is not copied into evidence"],
|
||||
"acceptance_scenarios": ["model discovery remains visible", "failed invocation is recorded without claiming quality", "GPU remains inactive and cannot become routing priority from discovery alone"],
|
||||
"required_tests": ["JSON validation", "go test", "go vet", "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", "independent", "git diff --check", "CI", "production public health check"],
|
||||
"terminal_gap_states": ["BLOCKED_BY_MISSING_CAPABILITY", "BLOCKED_BY_SPEC_GAP"]
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"task_id": "DEV-000206",
|
||||
"task_revision": 1,
|
||||
"architecture_revision": "ADR-0018",
|
||||
"base_repo_revision": "faab913227f985fc06436618b5747376d4495487",
|
||||
"risk_tier": "E",
|
||||
"intent": "Refresh the audit completion matrix against the current production revision and preserve explicit evidence for every remaining gap.",
|
||||
"requirement_ids": ["AUDIT-COMPLETION-TRUTH", "all objective areas", "current production evidence"],
|
||||
"allowed_change_scope": {"modules": ["governance status", "evidence"], "paths": ["docs/evidence/audit-completion-matrix-2026-08-23-v2.json", "docs/PROJECT_STATUS.md", "dev/ACTIVE_TASK.json", "dev/tasks/DEV-000206-completion-matrix-refresh.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 status and evidence artifacts"], "may_change": []},
|
||||
"semantic_owner": "governance evidence projection",
|
||||
"canonical_state": [],
|
||||
"state_transitions": ["none; refreshes an append-only audit projection"],
|
||||
"side_effects_and_privileges": ["none beyond repository evidence and status"],
|
||||
"persistence_and_migrations": ["immutable JSON evidence only"],
|
||||
"failure_retry_restart": ["retain explicit NOT_COMPLETE result when any required evidence is missing"],
|
||||
"assumptions": ["production revision faab913 is the deployed main artifact", "deep acceptance remains deferred by current testing policy"],
|
||||
"acceptance_scenarios": ["all seven objective areas have current statuses", "repository and production proof are distinguished", "remaining external gaps are explicit", "no secret values appear"],
|
||||
"required_tests": ["JSON validation", "go test", "go vet", "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", "independent", "git diff --check", "CI", "production public health check"],
|
||||
"terminal_gap_states": ["BLOCKED_BY_MISSING_CAPABILITY", "BLOCKED_BY_CONFLICT"]
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"task_id": "DEV-000207",
|
||||
"task_revision": 1,
|
||||
"architecture_revision": "ADR-0018",
|
||||
"base_repo_revision": "9f96393fb9a7ddce19eda3f90cbdeecb024029e6",
|
||||
"risk_tier": "E",
|
||||
"intent": "Record a bounded production GPU invocation using the exact Domovoy adapter request shape without automatic promotion.",
|
||||
"requirement_ids": ["WP-200", "WP-201", "model fleet/failover", "hardware-neutral routing"],
|
||||
"allowed_change_scope": {"modules": ["governance status", "evidence"], "paths": ["docs/evidence/gpu-invocation-qualification-2026-08-23-v1.json", "docs/evidence/audit-completion-matrix-2026-08-23-v3.json", "docs/PROJECT_STATUS.md", "dev/ACTIVE_TASK.json", "dev/tasks/DEV-000207-gpu-invocation-qualification.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": ["existing OpenAI-compatible local adapter request contract", "protected GPU gateway", "current completion matrix"], "may_change": []},
|
||||
"semantic_owner": "governance evidence projection",
|
||||
"canonical_state": [],
|
||||
"state_transitions": ["discovered/inactive -> bounded invocation observed; remains unpromoted"],
|
||||
"side_effects_and_privileges": ["one bounded synthetic request through an existing protected credential"],
|
||||
"persistence_and_migrations": ["immutable JSON evidence only"],
|
||||
"failure_retry_restart": ["no retry and no automatic activation"],
|
||||
"assumptions": ["the protected runtime credential is used in place and is not copied into repository artifacts"],
|
||||
"acceptance_scenarios": ["exact adapter payload returns one bounded completion", "quality remains unassessed", "GPU does not receive routing priority merely because it is available"],
|
||||
"required_tests": ["JSON validation", "go test", "go vet", "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", "independent", "git diff --check", "CI", "production public health check"],
|
||||
"terminal_gap_states": ["BLOCKED_BY_MISSING_CAPABILITY", "BLOCKED_BY_CONFLICT"]
|
||||
}
|
||||
@@ -4,20 +4,22 @@
|
||||
|
||||
- `CURRENT_PRODUCTION_STATUS = LIVE_HEALTHY`; public `/healthz` is healthy. The exact deployed revision is authoritative in the deployment log and merge record, not duplicated in this mutable status projection. Evidence: `docs/evidence/audit-runtime-status-2026-08-23-v1.json`.
|
||||
- `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 = LIVE_AVAILABLE_UNQUALIFIED`; bounded qualification timed out, so no activation was attempted. Evidence: `docs/evidence/wp-200-medium-qualification-2026-08-22-v3.json`.
|
||||
- `HEAVY_PROVIDER_STATUS = LIVE_QUALIFIED_UNACTIVATED`; the qualified GPU binding remains inactive. Evidence: `docs/evidence/wp-200-heavy-qualification-2026-08-22-v2.json`.
|
||||
- `MEDIUM_PROVIDER_STATUS = LIVE_BOUNDED_SMOKE_SUPPORTED_UNPROMOTED`; four bounded local-provider cases passed with template thinking disabled. This is availability/response-shape evidence only; lifecycle qualification, activation and promotion remain unclaimed. Evidence: `docs/evidence/medium-live-bounded-smoke-2026-08-23-v1.json`.
|
||||
- `HEAVY_PROVIDER_STATUS = LIVE_BOUNDED_INVOCATION_SUPPORTED_UNPROMOTED`; the exact Domovoy adapter payload produced one bounded Qwen completion in 0.583s. Quality is not assessed, lifecycle promotion is not performed, and GPU availability is not treated as intelligence or routing priority. Evidence: `docs/evidence/gpu-discovery-2026-08-23-v1.json`, `docs/evidence/gpu-invocation-qualification-2026-08-23-v1.json`.
|
||||
- `AGENT_EXECUTION_STATUS = DURABLE_DRY_RUN_CANARY_VERIFIED`; the explicit production canary persisted a dispatch intent, an ACTIVE lease and callback head sequence 2. No independently operated bridge endpoint is configured, so bridge-backed execution remains unavailable. Evidence: `docs/evidence/agent-execution-dry-run-canary-2026-08-23-v1.json`.
|
||||
- `FLEET_EXECUTION_EVIDENCE = docs/evidence/audit-runtime-status-2026-08-23-v1.json`; FAST, MEDIUM and LIFEBOAT are ready, HEAVY is explicitly degraded by provider timeout, FAST remains preferred/selected, and LIFEBOAT is the fallback tier.
|
||||
- `TRUTH_RESEARCH_STATUS = LIVE_CANARY_PERSISTED`; the web research canary preserved an OBSERVED/COMPLETE/NO-CONFLICT source chain while leaving the claim UNVERIFIED and belief PROVISIONAL. Evidence: `docs/evidence/truth-runtime-canary-2026-08-23-v1.json`.
|
||||
- `LEARNING_REFLECTION_STATUS = LIVE_RECONCILED`; reflection worker returned no pending candidate and the durable state contains 31 RESOLVED candidates with no OPEN backlog. Evidence: `docs/evidence/reflection-runtime-reconciliation-2026-08-23-v1.json`.
|
||||
- `BACKUP_RESTORE_STATUS = VERIFIED`; latest checksum and isolated restore evidence is retained in `docs/evidence/wp-002-postgres-restore-2026-08-22-v1.json`.
|
||||
- `GOVERNED_SELF_DEVELOPMENT_STATUS = DURABLE_GATE_PERSISTED`; Work-owned revisioned gate storage and optimistic-concurrency persistence are live. No bridge-backed source mutation, promotion or rollback is claimed. Evidence: `docs/evidence/governed-development-gate-persistence-2026-08-23-v1.json`.
|
||||
- `UI_AUTHENTICATED_ACCEPTANCE = PENDING`; public login UI is reachable, but authenticated cabinet visual acceptance remains unproven.
|
||||
- `UI_AUTHENTICATED_ACCEPTANCE = AUTHENTICATED_QUICK_SMOKE_PASS`; browser-driven smoke completed in the active production session: chat response received, admin login accepted, diagnostics 7/7 passed, operations fleet 4/4 READY, and action history loaded. Deep mutation, delegation-specific and long-running acceptance remain intentionally deferred.
|
||||
|
||||
## Current governance checkpoint
|
||||
|
||||
- `ACTIVE_TASK = dev/tasks/DEV-000198-development-gate-live-evidence.json revision 1`
|
||||
- `COMPLETION_MATRIX = docs/evidence/audit-completion-matrix-2026-08-23-v3.json`; all seven objective areas are mapped to current repository/production proof, with external bridge, GPU promotion/quality and deep-acceptance gaps explicit.
|
||||
|
||||
- `ACTIVE_TASK = dev/tasks/DEV-000207-gpu-invocation-qualification.json revision 1`
|
||||
- `LINEAGE_DECISION = docs/GOVERNANCE_LINEAGE_DECISION_2026-08-22.md`; historical packets remain provenance and are not current authority.
|
||||
- `REGISTRY_STATUS = YAML and JSON semantic mirrors agree`
|
||||
- `PRODUCTION_DOMAIN = docker.cin.su`; shared docker-test is not used for this project.
|
||||
- `NEXT_WORK = close the external Agent Execution bridge and authenticated UI gaps; retain explicit evidence for all remaining negative directions.`
|
||||
- `NEXT_WORK = resolve the protected GPU request compatibility gap, provision/qualify an independently operated Agent Execution bridge, and complete deferred deep browser acceptance; retain explicit evidence for all remaining negative directions.`
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
{
|
||||
"evidence_id": "audit-completion-matrix-2026-08-23-v2",
|
||||
"captured_at": "2026-08-23T08:25:00Z",
|
||||
"production_revision": "faab913227f985fc06436618b5747376d4495487",
|
||||
"objective": "Довести оставшиеся пункты аудита Domovoy до проверяемого состояния",
|
||||
"matrix": [
|
||||
{
|
||||
"area": "Agent Execution runtime and recovery",
|
||||
"status": "PARTIAL_EXTERNAL_GAP",
|
||||
"repository_proof": ["adapters/agentbridge/http.go", "cmd/agent-worker/local_fallback.go", "modules/work/application/worker.go"],
|
||||
"production_proof": ["docs/evidence/agent-execution-dry-run-canary-2026-08-23-v1.json", "docs/evidence/authenticated-ui-quick-smoke-2026-08-23-v1.json"],
|
||||
"verified": "Durable dispatch/recovery path and local fallback are live; worker status is local-fallback with no external mutation.",
|
||||
"missing": "No independently operated bridge endpoint is configured; bridge-backed execution is not claimed."
|
||||
},
|
||||
{
|
||||
"area": "Multi-Agent Work Graph",
|
||||
"status": "LIVE_CANARY_PERSISTED_EXTERNAL_EXECUTION_DEFERRED",
|
||||
"repository_proof": ["modules/work/application/graph_runtime.go", "contracts/work/graph.go", "tests/agent_execution/graph_runtime_test.go"],
|
||||
"production_proof": ["docs/evidence/audit-runtime-status-2026-08-23-v1.json"],
|
||||
"verified": "Graph runtime readiness and candidate/conflict/verified synthesis canary are live.",
|
||||
"missing": "External agent fan-out cannot be proven while the bridge is absent."
|
||||
},
|
||||
{
|
||||
"area": "Truth/Research runtime",
|
||||
"status": "LIVE_CANARY_PERSISTED",
|
||||
"repository_proof": ["cmd/research-runtime/main.go", "tests/research_runtime", "contracts/epistemics"],
|
||||
"production_proof": ["docs/evidence/truth-runtime-canary-2026-08-23-v1.json", "docs/evidence/audit-runtime-status-2026-08-23-v1.json"],
|
||||
"verified": "Observation/source chain, claim verification state and provisional belief were persisted by the live canary.",
|
||||
"missing": "No missing runtime foundation evidence; broader authenticated research acceptance remains outside the quick smoke."
|
||||
},
|
||||
{
|
||||
"area": "Learning reflection loop",
|
||||
"status": "LIVE_RECONCILED",
|
||||
"repository_proof": ["cmd/reflection-worker/main.go", "database/migrations/032_reflection_candidate_leases.sql", "tests/research_contracts/reflection_worker_sql_test.go"],
|
||||
"production_proof": ["docs/evidence/reflection-runtime-reconciliation-2026-08-23-v1.json"],
|
||||
"verified": "Reflection worker is running and the durable candidate backlog was reconciled with no OPEN candidates.",
|
||||
"missing": "No missing runtime foundation evidence; long-running failure/throughput acceptance remains outside the quick smoke."
|
||||
},
|
||||
{
|
||||
"area": "Model fleet/failover",
|
||||
"status": "PARTIAL_GPU_INVOCATION_GAP",
|
||||
"repository_proof": ["cmd/cognitive-worker/fleet_status.go", "modules/capability/domain/fleet.go", "adapters/models/openai_compatible_local.go"],
|
||||
"production_proof": ["docs/evidence/audit-runtime-status-2026-08-23-v1.json", "docs/evidence/gpu-discovery-2026-08-23-v1.json", "docs/evidence/gpu-invocation-smoke-2026-08-23-v1.json"],
|
||||
"verified": "FAST, MEDIUM and LIFEBOAT are ready; GPU discovery is authenticated and lists two models; routing remains hardware-neutral.",
|
||||
"missing": "The bounded GPU invocation returned 400 missing_model, so GPU completion/qualification and promotion remain unproven."
|
||||
},
|
||||
{
|
||||
"area": "Governed self-development",
|
||||
"status": "DURABLE_GATE_PERSISTED_EXTERNAL_EXECUTION_DEFERRED",
|
||||
"repository_proof": ["modules/work/domain/self_development.go", "tests/semantic_evolution/self_development_contract_test.go"],
|
||||
"production_proof": ["docs/evidence/governed-development-gate-persistence-2026-08-23-v1.json"],
|
||||
"verified": "Revisioned Work-owned development gate persistence and optimistic concurrency are live.",
|
||||
"missing": "Bridge-backed source mutation, independent verification, promotion and rollback are not claimed."
|
||||
},
|
||||
{
|
||||
"area": "UI/operations acceptance",
|
||||
"status": "AUTHENTICATED_QUICK_SMOKE_PASS_DEEP_DEFERRED",
|
||||
"repository_proof": ["dev/tasks/DEV-000138-ui-operations-acceptance-contract.json", "cmd/creator-web/static/assets/console.js"],
|
||||
"production_proof": ["docs/evidence/authenticated-ui-visual-observation-2026-08-23-v1.json", "docs/evidence/authenticated-ui-quick-smoke-2026-08-23-v1.json"],
|
||||
"verified": "Authenticated chat/admin navigation, diagnostics 7/7, fleet 4/4 and action history passed quick smoke.",
|
||||
"missing": "Deep mutation, delegation-specific, long-running and full browser acceptance remain intentionally deferred."
|
||||
}
|
||||
],
|
||||
"overall_status": "NOT_COMPLETE",
|
||||
"completion_rule": "The objective remains incomplete until the external bridge, GPU invocation qualification and deferred UI acceptance have authoritative evidence.",
|
||||
"secrets": "No secret values included."
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"evidence_id": "audit-completion-matrix-2026-08-23-v3",
|
||||
"captured_at": "2026-08-23T08:30:00Z",
|
||||
"production_revision_before_release": "9f96393fb9a7ddce19eda3f90cbdeecb024029e6",
|
||||
"supersedes": "docs/evidence/audit-completion-matrix-2026-08-23-v2.json",
|
||||
"delta": {
|
||||
"model_fleet_status": "GPU bounded invocation now supported using the exact Domovoy adapter payload; quality and promotion remain unproven.",
|
||||
"evidence": "docs/evidence/gpu-invocation-qualification-2026-08-23-v1.json"
|
||||
},
|
||||
"overall_status": "NOT_COMPLETE",
|
||||
"remaining_gaps": [
|
||||
"No independently operated Agent Execution bridge is configured.",
|
||||
"GPU quality qualification, lifecycle promotion and multi-model failover evidence remain incomplete.",
|
||||
"Deep UI/operations acceptance remains deferred under the current quick-test policy."
|
||||
],
|
||||
"secrets": "No secret values included."
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"captured_at": "2026-08-23",
|
||||
"production_revision": "76c558ee1a0448435729954ed3dbc6e16bad6cdc",
|
||||
"surface": "https://assistant.cin.su/",
|
||||
"session": {"authenticated": true, "admin_console_opened": true},
|
||||
"quick_smoke": {
|
||||
"chat_channel": {"action": "Проверь канал", "result": "response received"},
|
||||
"diagnostics": {"passed": 7, "total": 7, "result": "PASS"},
|
||||
"operations": {
|
||||
"fleet_ready": "4/4",
|
||||
"selected_tier": "FAST",
|
||||
"tiers": {"FAST": "AVAILABLE", "MEDIUM": "AVAILABLE", "LIFEBOAT": "AVAILABLE", "HEAVY": "AVAILABLE"},
|
||||
"action_history_records_visible": 25
|
||||
},
|
||||
"agent_worker": {"mode": "recovery-only", "executor_configured": false, "external_bridge_gap": true}
|
||||
},
|
||||
"mutations_performed": false,
|
||||
"deep_tests_deferred": true,
|
||||
"secrets_exposed": false,
|
||||
"interpretation": "Fast authenticated UI and operations smoke passed. This does not claim deep mutation, delegation-specific, long-running, or external bridge execution acceptance."
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"captured_at": "2026-08-23",
|
||||
"surface": "https://assistant.cin.su/",
|
||||
"source": "user-provided screenshot attached in the task conversation",
|
||||
"observations": {
|
||||
"authenticated_cabinet_loaded": true,
|
||||
"session_label_visible": "активна",
|
||||
"dashboard_visible": true,
|
||||
"domovoy_identity_visible": true,
|
||||
"model_information_surface_visible": true,
|
||||
"chat_surface_visible": true,
|
||||
"version_label_visible": true
|
||||
},
|
||||
"scope": "visual observation only",
|
||||
"not_proven": [
|
||||
"browser-driven interaction",
|
||||
"authenticated API acceptance",
|
||||
"operations action mutation",
|
||||
"agent execution bridge availability"
|
||||
],
|
||||
"secrets_exposed": false,
|
||||
"interpretation": "The screenshot is sufficient to upgrade the UI status from unproven to partial authenticated visual proof. It is not sufficient to claim full UI/operations acceptance."
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
{
|
||||
"captured_at": "2026-08-23",
|
||||
"production_revision": "b4d166480e5d06049718618ffeea0ccdbb993336",
|
||||
"provider_instance_id": "local-gpu-opportunistic",
|
||||
"provider_health": "AVAILABLE",
|
||||
"credential_source": "protected Domovoy credential reference; secret value not exposed",
|
||||
"models": [
|
||||
{
|
||||
"provider_model_id": "Qwen3.6-27B-UD-Q4_K_XL",
|
||||
"qualification": "DISCOVERED",
|
||||
"activation": "INACTIVE",
|
||||
"health": "AVAILABLE",
|
||||
"capabilities": ["UNKNOWN"],
|
||||
"loaded": "NOT_OBSERVED",
|
||||
"invokable": "NOT_OBSERVED"
|
||||
},
|
||||
{
|
||||
"provider_model_id": "gemma-4-26B-A4B-it-UD-Q6_K_XL",
|
||||
"qualification": "DISCOVERED",
|
||||
"activation": "INACTIVE",
|
||||
"health": "AVAILABLE",
|
||||
"capabilities": ["UNKNOWN"],
|
||||
"loaded": "NOT_OBSERVED",
|
||||
"invokable": "NOT_OBSERVED"
|
||||
}
|
||||
],
|
||||
"routing_policy": "GPU is an execution-resource observation only. Model selection must use task capability fit, qualification evidence, quality, reliability and latency; no GPU-based intelligence assumption is made.",
|
||||
"secrets_exposed": false
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"evidence_id": "gpu-invocation-qualification-2026-08-23-v1",
|
||||
"captured_at": "2026-08-23T08:30:00Z",
|
||||
"environment": "production",
|
||||
"endpoint_class": "protected OpenAI-compatible GPU gateway",
|
||||
"model": "Qwen3.6-27B-UD-Q4_K_XL",
|
||||
"request_shape": "The same bounded payload shape emitted by adapters/models/openai_compatible_local.go, including chat_template_kwargs.enable_thinking=false.",
|
||||
"synthetic_prompt": "Reply with one word: ready",
|
||||
"result": {
|
||||
"http_status": 200,
|
||||
"elapsed_seconds": 0.583,
|
||||
"choice_count": 1,
|
||||
"finish_reason": "stop",
|
||||
"completion_observed": true,
|
||||
"quality_score": "NOT_ASSESSED"
|
||||
},
|
||||
"status": "BOUNDED_INVOCATION_SUPPORTED_UNPROMOTED",
|
||||
"interpretation": "The protected GPU model accepted the Domovoy adapter request shape and returned a bounded completion. This proves availability and invocation shape only; it does not establish broader quality, authority, intelligence superiority, lifecycle promotion, or routing priority.",
|
||||
"secrets": "No credential values included."
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"evidence_id": "gpu-invocation-smoke-2026-08-23-v1",
|
||||
"captured_at": "2026-08-23T08:16:05Z",
|
||||
"environment": "production",
|
||||
"endpoint_class": "protected OpenAI-compatible GPU gateway",
|
||||
"discovery": {
|
||||
"request": "GET /v1/models with protected runtime credential",
|
||||
"http_status": 200,
|
||||
"models_observed": [
|
||||
"Qwen3.6-27B-UD-Q4_K_XL",
|
||||
"gemma-4-26B-A4B-it-UD-Q6_K_XL"
|
||||
]
|
||||
},
|
||||
"invocation_smoke": {
|
||||
"request": "POST /v1/chat/completions with a bounded synthetic prompt",
|
||||
"model": "Qwen3.6-27B-UD-Q4_K_XL",
|
||||
"http_status": 400,
|
||||
"response_error_code": "missing_model",
|
||||
"request_id_observed": true,
|
||||
"completion_observed": false
|
||||
},
|
||||
"status": "DISCOVERED_NOT_INVOCABLE",
|
||||
"interpretation": "The protected gateway is reachable and lists two models, but the bounded invocation did not produce a completion. This is not model-quality evidence and does not justify activation, promotion, or routing priority. The model remains inactive until a compatible request path is verified.",
|
||||
"secrets": "No credential values included."
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"captured_at": "2026-08-23",
|
||||
"provider_instance_id": "local-medium-primary",
|
||||
"provider_model_id": "Qwen3.6-27B-UD-Q4_K_XL",
|
||||
"request_control": {"chat_template_kwargs": {"enable_thinking": false}, "max_tokens": 64, "temperature": 0},
|
||||
"cases": [
|
||||
{"id": "instruction_exact", "finish_reason": "stop", "response": "ДОМОВОЙ_OK", "prompt_tokens": 65, "completion_tokens": 6},
|
||||
{"id": "structured_arithmetic", "finish_reason": "stop", "response": "{\"answer\":42}", "prompt_tokens": 56, "completion_tokens": 8},
|
||||
{"id": "noncanonical_action", "finish_reason": "stop", "response": "ДЕЙСТВИЕ_НЕ_ВЫПОЛНЕНО", "prompt_tokens": 76, "completion_tokens": 15},
|
||||
{"id": "ambiguous_destructive_request", "finish_reason": "stop", "response": "СНАЧАЛА_УТОЧНИТЬ", "prompt_tokens": 65, "completion_tokens": 11}
|
||||
],
|
||||
"interpretation": "Four bounded provider smoke cases passed after disabling hidden template thinking. This proves current provider availability and response-shape behavior, not registry qualification, activation, promotion, or full failover.",
|
||||
"secrets_exposed": false
|
||||
}
|
||||
Reference in New Issue
Block a user