diff --git a/dev/ACTIVE_TASK.json b/dev/ACTIVE_TASK.json index fedfd2f..f83385f 100644 --- a/dev/ACTIVE_TASK.json +++ b/dev/ACTIVE_TASK.json @@ -1 +1 @@ -{"task_file":"dev/tasks/GEN2-DEPLOY-004-candidate-commit-runtime-releaseset.json","task_id":"GEN2-DEPLOY-004","task_revision":1} +{"task_file":"dev/tasks/GEN2-DEPLOY-004-candidate-commit-runtime-releaseset.json","task_id":"GEN2-DEPLOY-004","task_revision":2} diff --git a/dev/tasks/GEN2-DEPLOY-004-candidate-commit-runtime-releaseset.json b/dev/tasks/GEN2-DEPLOY-004-candidate-commit-runtime-releaseset.json index 62af884..6944dc5 100644 --- a/dev/tasks/GEN2-DEPLOY-004-candidate-commit-runtime-releaseset.json +++ b/dev/tasks/GEN2-DEPLOY-004-candidate-commit-runtime-releaseset.json @@ -1,13 +1,13 @@ { "task_id": "GEN2-DEPLOY-004", - "task_revision": 1, + "task_revision": 2, "architecture_revision": "ARCH-GEN2-000", "base_repo_revision": "gen2-integration", "risk_tier": "E", - "intent": "Extend the isolated candidate slot and typed Supervisor ReleaseSet with Commit runtime, without recreating the stable ReleaseSet or changing semantic ownership, so the already implemented delegated Authority path can be accepted against an isolated five-component release.", - "requirement_ids": ["REQ-GEN2-DEPLOY-004-CANDIDATE-COMMIT", "REQ-GEN2-AUTHORITY-001-ISOLATED-COMMIT", "REQ-GEN2-DEPLOY-003-STABLE-ID-GUARD"], + "intent": "Close the isolated candidate slot over all versioned Assistant runtime dependencies of its candidate components, extend the typed Supervisor ReleaseSet accordingly, and keep stable containers untouched so the delegated Authority path can be accepted without candidate-to-stable runtime shortcuts.", + "requirement_ids": ["REQ-GEN2-DEPLOY-004-DEPENDENCY-CLOSURE", "REQ-GEN2-DEPLOY-004-CANDIDATE-COMMIT", "REQ-GEN2-AUTHORITY-001-ISOLATED-COMMIT", "REQ-GEN2-DEPLOY-003-STABLE-ID-GUARD"], "allowed_change_scope": { - "modules": ["deployment control", "runtime supervisor", "candidate Commit runtime deployment wiring", "inherited delegated Authority prerequisite only"], + "modules": ["deployment control", "runtime supervisor", "candidate Assistant runtime dependency closure", "inherited delegated Authority prerequisite only"], "paths": [ "deploy/docker-compose.candidate-slot.yml", "deploy/run-production-canary.sh", @@ -47,17 +47,17 @@ }, "allowed_architecture_delta": {"new_cross_module_dependencies": 1, "new_canonical_owners": 0, "new_privileges": 1, "new_third_party_dependencies": 0, "new_database_owner_roles": 1}, "contracts": { - "consume": ["existing typed Supervisor ReleaseSet and ComponentRelease", "existing Commit runtime health/readiness/revision endpoints", "existing delegated Authority service credential and task-scoped grant contracts", "existing shared PostgreSQL and external secret volumes"], - "may_change": ["typed Supervisor required component set and ReleaseSet evidence", "candidate Compose dependency wiring", "candidate deployment control script"] + "consume": ["existing typed Supervisor ReleaseSet and ComponentRelease", "existing runtime health/readiness/revision endpoints", "existing delegated Authority service credential and task-scoped grant contracts", "existing shared PostgreSQL and external secret volumes"], + "may_change": ["typed Supervisor explicit required ComponentKind set and ReleaseSet evidence", "candidate Compose dependency wiring", "candidate deployment control script"] }, "semantic_owner": "Operations/Supervisor owns operational ReleaseSet evidence; Commit remains the sole canonical owner of durable Commit state; Authority and Capability ownership do not change.", - "canonical_state": ["candidate and stable Commit instances use the same transactional canonical Commit repository and do not form two semantic owners", "no direct stable container recreation", "no new canonical writer, schema, role, credential value, or provider routing owner", "pre-existing GEN2-AUTHORITY-001 paths are inherited only so devctl can validate the committed prerequisite diff against gen2-integration; this packet grants no new write authority for them"], - "state_transitions": ["stable five-component evidence retained -> isolated candidate five-component start -> all component health/readiness/revision observation -> Supervisor canary -> promote or whole ReleaseSet rollback", "candidate Commit failure -> candidate ReleaseSet unhealthy -> traffic stable without stable container recreation"], - "side_effects_and_privileges": ["production operations are limited to Docker/Compose candidate slot B and Supervisor control endpoints", "candidate Core and Creator point only to candidate Commit", "candidate Commit receives only required existing SecretRefs through read-only protected mounts", "stable IDs are captured before every candidate operation and any change aborts before canary"], + "canonical_state": ["stable and candidate instances of each owner use the same transactional canonical repository and do not form two semantic owners", "no direct stable container recreation", "no new canonical writer, schema, role, credential value, or provider routing owner", "pre-existing GEN2-AUTHORITY-001 paths are inherited only so devctl can validate the committed prerequisite diff against gen2-integration; this packet grants no new write authority for them"], + "state_transitions": ["stable dependency-closed ReleaseSet evidence retained -> isolated candidate dependency closure start -> all component health/readiness/revision and dependency-target observation -> Supervisor canary -> promote or whole ReleaseSet rollback", "missing, unhealthy, mixed-revision, or stable-targeted candidate component -> candidate ReleaseSet unhealthy -> traffic stable without stable container recreation"], + "side_effects_and_privileges": ["production operations are limited to Docker/Compose candidate slot B and Supervisor control endpoints", "candidate Creator, Core, Commit, Continuity, Agent Worker, Agent Execution Bridge, Work Graph and Task Verifier use only candidate Assistant runtime URLs", "PostgreSQL, protected secret volumes, model/gateway services and other explicitly classified non-Assistant infrastructure remain shared", "candidate components receive only required existing SecretRefs through read-only protected mounts", "stable IDs are captured before every candidate operation and any change aborts before canary"], "persistence_and_migrations": ["no migration or durable semantic schema change", "shared PostgreSQL and existing protected volumes remain external resources and are never deleted", "Supervisor persists stable/candidate/LKG ReleaseSet evidence across restart"], - "failure_retry_restart": ["missing, unhealthy, or revision-mismatched Commit rejects the entire candidate ReleaseSet", "rollback changes Supervisor traffic only and retains stable containers", "Supervisor restart reloads Commit-inclusive LKG and candidate state", "candidate and stable Commit rely on existing repository idempotency/revision preconditions for bounded test resources"], - "assumptions": ["GEN2-AUTHORITY-001 implementation commits through a8be998 remain unmodified prerequisites on this task branch", "the protected control-plane secret artifact exists and can be mounted read-only without displaying it", "existing Commit repository concurrency/idempotency contracts support separate stable and candidate runtime processes against bounded test resources"], - "acceptance_scenarios": ["candidate ReleaseSet contains creator-web, core-runtime, cognitive-worker, research-runtime, and commit-runtime with one revision", "missing, unhealthy, or revision-mismatched candidate Commit prevents release READY", "candidate Core and candidate Creator resolve Commit only through commit-runtime-candidate while stable topology remains unchanged", "candidate start/update leaves all five captured stable container IDs unchanged", "forced candidate Commit failure causes whole ReleaseSet rollback to stable traffic without recreating stable", "Supervisor restart preserves Commit-inclusive LKG and candidate evidence", "candidate Commit readiness proves database and Authority endpoint readiness without emitting a secret"], - "required_tests": ["FAST: targeted go test ./runtime/supervisor ./cmd/supervisor", "FAST: targeted go vet ./runtime/supervisor ./cmd/supervisor", "FAST: compose config candidate slot", "FAST: targeted deployment shell regression for stable ID invariance", "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 gen2-integration --", "PRODUCTION: isolated five-component ReleaseSet health, revision, candidate Commit failure rollback, Supervisor restart/LKG, and stable-ID drill"], + "failure_retry_restart": ["missing, unhealthy, revision-mismatched, or stable-targeted candidate component rejects the whole candidate ReleaseSet", "rollback changes Supervisor traffic only and retains stable containers", "Supervisor restart reloads the complete dependency-closed LKG and candidate state", "candidate and stable owner runtimes rely on existing repository idempotency/revision preconditions for bounded test resources"], + "assumptions": ["GEN2-AUTHORITY-001 implementation commits through a8be998 remain unmodified prerequisites on this task branch", "the protected control-plane secret artifact exists and can be mounted read-only without displaying it", "existing owner repositories support concurrent stable/candidate instances over bounded test resources", "any runtime target absent from the static configuration graph is classified before it is admitted as shared infrastructure"], + "acceptance_scenarios": ["candidate ReleaseSet contains the transitive closure of creator-web, core-runtime, cognitive-worker, research-runtime, commit-runtime, continuity-runtime, agent-worker, agent-execution-bridge, work-graph-runtime, and task-verifier, each at one revision", "every candidate Assistant runtime URL targets a component in the same candidate ReleaseSet; stable Assistant runtime URLs abort before canary", "missing, unhealthy, or revision-mismatched required component prevents release READY", "candidate Core -> Commit -> Continuity and Creator -> Continuity/Agent Worker remain within candidate topology while stable topology is unchanged", "candidate start/update leaves every captured stable Assistant runtime container ID unchanged", "forced candidate Continuity or Commit failure causes whole ReleaseSet rollback to stable traffic without recreating stable", "Supervisor restart preserves the complete component set in LKG and candidate evidence", "Commit readiness proves database and Authority endpoint readiness without emitting a secret"], + "required_tests": ["FAST: targeted go test ./runtime/supervisor ./cmd/supervisor", "FAST: targeted go vet ./runtime/supervisor ./cmd/supervisor", "FAST: compose config candidate slot", "FAST: targeted deployment shell regression for dependency isolation and stable ID invariance", "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 gen2-integration --", "PRODUCTION: isolated dependency-closed ReleaseSet health, revision, candidate Continuity/Commit rollback, Supervisor restart/LKG, and stable-ID drill"], "terminal_gap_states": ["BLOCKED_BY_DEPLOYMENT_CONTROL", "BLOCKED_BY_SPEC_GAP", "BLOCKED_BY_ARCHITECTURE_GAP", "BLOCKED_BY_MISSING_CAPABILITY", "BLOCKED_BY_CONFLICT", "REQUIRES_MIGRATION_DECISION"] } diff --git a/docs/evidence/gen2-deploy-004-dependency-closure-gap-2026-08-31.md b/docs/evidence/gen2-deploy-004-dependency-closure-gap-2026-08-31.md new file mode 100644 index 0000000..909c0bd --- /dev/null +++ b/docs/evidence/gen2-deploy-004-dependency-closure-gap-2026-08-31.md @@ -0,0 +1,60 @@ +# GEN2-DEPLOY-004 r2 — candidate dependency-closure finding + +## Decision and graph evidence + +The owner-approved r2 rule requires every versioned Assistant runtime reached +by normal candidate operation to be in the candidate ReleaseSet. Static +runtime configuration establishes this candidate closure: + +```text +creator-web -> core-runtime, continuity-runtime, commit-runtime, + cognitive-worker, agent-worker +core-runtime -> cognitive-worker, research-runtime, continuity-runtime, + commit-runtime +commit-runtime -> core-runtime, continuity-runtime +continuity-runtime -> core-runtime, commit-runtime +agent-worker -> task-verifier, agent-execution-bridge +agent-execution-bridge -> cognitive-worker, work-graph-runtime, task-verifier +work-graph-runtime -> core-runtime +``` + +Therefore the static closure is: Creator Web, Core Runtime, Cognitive Worker, +Research Runtime, Commit Runtime, Continuity Runtime, Agent Worker, Agent +Execution Bridge, Work Graph Runtime, and Task Verifier. + +PostgreSQL, protected secret volumes, the local model gateway/lifeboat, and +the configured web-search endpoint are classified as shared durable +infrastructure or shared external services. They do not contain an Assistant +semantic/runtime release revision. + +## Blocking dynamic dependency + +Commit's normal prospective-notification operation obtains the exact active +notification Capability binding from Core. The binding's immutable +`HTTPSOrigin`, delivery path, and revision select the receiver. This is not a +Compose environment URL and cannot be safely redirected by a container alias. + +Consequently, with the existing active binding, a candidate Commit executing a +normal notification operation would call the stable notification receiver. A +candidate notification-receiver container alone does not solve the problem: +the candidate would still resolve the stable binding. Reusing the stable name +would create ambiguous network routing, and changing the active binding would +mutate Capability-owned canonical state. + +No runtime, Capability state, migration, secret, or production container was +changed while establishing this finding. + +## Required owner decision + +Choose one governed boundary before DEPLOY-004 implementation can prove full +dependency isolation: + +1. authorize a bounded Capability-owned candidate binding/shadow-binding + lifecycle, including its authority, rollback and selection semantics; or +2. explicitly classify the notification receiver as a shared external service + for this ReleaseSet, despite it being an Assistant-managed runtime. + +The first option requires a new packet revision with the exact Capability +contract/owner paths. The second changes the release-boundary policy and must +be accepted explicitly. No direct binding update, stable alias reuse, or +candidate-to-stable shortcut is an acceptable substitute.