69 lines
4.5 KiB
JSON
69 lines
4.5 KiB
JSON
{
|
|
"task_id": "DEV-000041",
|
|
"task_revision": 1,
|
|
"architecture_revision": "ADR-0005",
|
|
"base_repo_revision": "45fb5f8709ef9f327c5e41e7f9adb0d7a7d06866",
|
|
"risk_tier": "E",
|
|
"intent": "Implement the non-user-facing foundation for ADR-0005: Capability-owned versioned receiver binding, typed Commit notification evidence, a durable idempotent receipt receiver, and a strict HTTPS executor/reconciler adapter without enabling a Creator mutation route or installing credentials.",
|
|
"requirement_ids": ["INV-AUTH-001", "INV-OWN-001", "INV-TOPO-001", "ADR-0005"],
|
|
"allowed_change_scope": {
|
|
"modules": ["capability", "commit"],
|
|
"paths": [
|
|
"contracts/capability/types.go",
|
|
"contracts/commit/types.go",
|
|
"modules/capability/domain/binding.go",
|
|
"modules/capability/domain/binding_test.go",
|
|
"modules/capability/ports/repository.go",
|
|
"adapters/postgres/capability_repository.go",
|
|
"adapters/postgres/capability_repository_test.go",
|
|
"adapters/postgres/commit_repository.go",
|
|
"adapters/notificationexecutor/executor.go",
|
|
"adapters/notificationexecutor/executor_test.go",
|
|
"cmd/core-runtime/main.go",
|
|
"cmd/core-runtime/main_test.go",
|
|
"cmd/notification-receiver/main.go",
|
|
"cmd/notification-receiver/server.go",
|
|
"cmd/notification-receiver/server_test.go",
|
|
"database/migrations/010_capability_notification_binding.sql",
|
|
"database/migrations/011_commit_notification_envelope.sql",
|
|
"database/bootstrap/001_roles_and_schemas.sql",
|
|
"dev/ACTIVE_TASK.json",
|
|
"dev/tasks/DEV-000041-notification-delivery-foundation.json"
|
|
]
|
|
},
|
|
"forbidden_change_scope": {
|
|
"paths": [
|
|
"architecture/**",
|
|
"ci/**",
|
|
".gitea/**",
|
|
"modules/identity/**",
|
|
"modules/authority/**",
|
|
"modules/work/**",
|
|
"modules/continuity/**",
|
|
"cmd/creator-web/**",
|
|
"deploy/**",
|
|
"security/**"
|
|
]
|
|
},
|
|
"allowed_architecture_delta": {
|
|
"new_cross_module_dependencies": 0,
|
|
"new_canonical_owners": 0,
|
|
"new_privileges": 0,
|
|
"new_third_party_dependencies": 0
|
|
},
|
|
"contracts": {
|
|
"consume": ["contracts.identity@v1", "contracts.capability@v1", "contracts.commit@v1", "ADR-0005 fixed receipt protocol"],
|
|
"may_change": ["CapabilityBinding V1", "Commit prospective notification evidence V1"]
|
|
},
|
|
"semantic_owner": "Capability owns binding state; Commit owns immutable action evidence; receiver storage is external adapter receipt state",
|
|
"canonical_state": ["capability.notification_bindings", "future Commit envelope columns only; no action rows created by this task"],
|
|
"state_transitions": ["CapabilityBinding ACTIVE to RETIRED with monotonic revision", "receiver receipt absent to immutable present"],
|
|
"side_effects_and_privileges": ["receiver PUT writes only its isolated receipt directory", "receiver GET/list are read-only", "HTTPS adapter accepts only a validated fixed binding", "no credentials installed and no route exposed to Creator"],
|
|
"persistence_and_migrations": ["add Capability-owned binding table", "add backward-compatible notification evidence columns to Commit envelope", "receiver uses atomic create and immutable receipt files"],
|
|
"failure_retry_restart": ["same intent and digest returns the original receipt", "same intent with different digest is conflict", "timeout or malformed success is unknown", "GET reconciliation never writes", "restart rebuilds receiver truth from durable receipt files"],
|
|
"assumptions": ["The public TLS reverse proxy is configured only in a later deployment task", "secret references are identifiers and never secret bytes", "docker-test remains prohibited"],
|
|
"acceptance_scenarios": ["binding validation rejects HTTP, non-fixed paths, invalid revisions, unhealthy or retired state", "owner-local binding load cannot return a foreign principal binding", "receiver authorization separates writer and reader", "receiver survives restart and keeps one receipt per action intent", "executor disables redirects, bounds response size, verifies receipt identity and digest, and classifies ambiguous failures as unknown", "historical Commit rows remain readable after additive migration", "no Creator command can invoke the new executor in this task"],
|
|
"required_tests": ["unit", "receiver restart and conflict", "TLS executor and reconciliation", "PostgreSQL repository contract where available", "architecture preflight", "exact diff scope", "go test", "go vet", "CI"],
|
|
"terminal_gap_states": ["BLOCKED_BY_ARCHITECTURE_GAP", "BLOCKED_BY_SPEC_GAP", "BLOCKED_BY_CONFLICT", "BLOCKED_BY_MISSING_CAPABILITY"]
|
|
}
|