TenantAtlas/specs/242-operational-controls/contracts/operational-controls.contract.yaml
ahmido d96abc65fb
Some checks failed
Main Confidence / confidence (push) Failing after 1m23s
Remove Findings lifecycle backfill operational surface (controls slice) (#280)
Removes the Findings lifecycle backfill from the Operational Controls UI and OperationalControlCatalog.

This patch is a safe, controls-only change; runbooks, jobs and other runtime artifacts are NOT removed yet. Follow-up work will delete the runbook service/scope, jobs, commands, and update tests.

Files changed:
- apps/platform/app/Filament/System/Pages/Ops/Controls.php
- apps/platform/app/Support/OperationalControls/OperationalControlCatalog.php
- apps/platform/tests/Feature/System/OpsControls/OperationalControlManagementTest.php
- apps/platform/tests/Unit/Support/OperationalControls/OperationalControlCatalogTest.php
- apps/platform/tests/Unit/Support/OperationalControls/OperationalControlScopeResolutionTest.php

Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de>
Reviewed-on: #280
2026-04-26 15:43:47 +00:00

153 lines
4.9 KiB
YAML

version: 1
kind: operational-controls
catalog:
control_keys:
findings.lifecycle.backfill:
label: Findings lifecycle backfill
supported_scopes:
- global
- workspace
operation_types:
- findings.lifecycle.backfill
affected_surfaces:
- system.ops.runbooks
- tenant.findings.list
restore.execute:
label: Restore execution
supported_scopes:
- global
- workspace
operation_types:
- restore.execute
affected_surfaces:
- tenant.restore_runs.create
activation_record:
table: operational_control_activations
fields:
id: integer
control_key: string
scope_type:
type: string
allowed:
- global
- workspace
workspace_id:
type: integer
nullable: true
reason_text: string
expires_at:
type: datetime
nullable: true
created_by_platform_user_id: integer
updated_by_platform_user_id:
type: integer
nullable: true
display_rules:
owner_actor: updated_by_platform_user_id when present, otherwise created_by_platform_user_id
invariants:
- one active row per control_key + scope_type + workspace_id
- workspace_id is null for global rows
- enabled state is derived from no active matching row
persistence_notes:
- enforce one active global row per control_key with a partial unique index where scope_type = global
- enforce one active workspace row per control_key + workspace_id with a partial unique index where scope_type = workspace
- delete expired conflicting rows before inserting a new activation for the same control/scope
- do not use this table as an archive of expired activations
management_commands:
pause_control:
required_platform_capabilities:
- platform.access_system_panel
- platform.ops.controls.manage
safety_flow:
- configure scope and reason
- preview scope impact
- confirm mutation
input:
control_key: string
scope_type: global|workspace
workspace_id: integer|null
reason_text: string
expires_at: datetime|null
outcome:
activation_created_or_updated: true
audit_action: operational_control.paused|operational_control.updated
resume_control:
required_platform_capabilities:
- platform.access_system_panel
- platform.ops.controls.manage
safety_flow:
- review current scope impact
- confirm mutation
input:
control_key: string
scope_type: global|workspace
workspace_id: integer|null
outcome:
activation_removed: true
audit_action: operational_control.resumed
decision_output:
fields:
control_key: string
effective_state: enabled|paused
matched_scope_type: none|global|workspace
workspace_id: integer|null
reason_text: string|null
expires_at: datetime|null
source_activation_id: integer|null
guarantees:
- returned before any in-scope start is allowed to continue
- blocked decisions create no queued execution OperationRun, no queued execution RestoreRun, no queued job, and no provider-backed execution
- control activation governs new starts only and does not mutate previously accepted runs
evaluation_rules:
precedence:
- active global activation wins over any workspace activation for the same control key
- workspace activation applies only when no active global activation matches
expiry:
- expired activations are ignored
disclosure:
- tenant/admin surfaces disclose control-state details only after membership and capability scope are resolved
enforcement_targets:
- control_key: findings.lifecycle.backfill
target:
seam: service.runbooks.findings_lifecycle_backfill.start
callers:
- system.ops.runbooks
- tenant.findings.list
- console.tenantpilot.findings.backfill-lifecycle
- console.tenantpilot.run-deploy-runbooks
action: Start findings lifecycle backfill
operation_type: findings.lifecycle.backfill
- control_key: restore.execute
target:
surface: tenant.restore_runs.create
action: Execute restore
operation_type: restore.execute
audit_expectations:
action_ids:
- operational_control.paused
- operational_control.updated
- operational_control.resumed
- operational_control.execution_blocked
required_metadata:
- control_key
- scope_type
- workspace_id
- reason_text
- expires_at
- actor_id
event_specific_metadata:
blocked_system_all_tenant_execution_events:
- requested_scope
ownership:
global_control_changes: platform-plane event with null workspace_id and null tenant_id
workspace_control_changes: workspace-scoped event
blocked_execution_events: scoped to the affected workspace and tenant when a tenant is in context
blocked_system_all_tenant_execution_events: platform-plane event with null workspace_id and null tenant_id plus requested_scope metadata