feat(plan-01): Phase 2 — relocate level5/agentops config + init-options to package

Move the harness-config files out of the mixed .specify/level5 and .specify/agentops
dirs (which also hold governance/domain/state) into packages/casan-harness, leaving a
per-file compat symlink at each old path. Runtime state and governance stay in place.

Moved (+ .specify symlink each):
  level5:   drift-policy.yaml kpi-schema.yaml model-fallback.yaml tool-registry.yaml
            harness-package.json project-registry.json provider-usage-sample.json
  agentops: alerts.yaml hallucination-tracking.yaml metrics.yaml rate-limits.yaml tracking.yaml
  top:      init-options.json
Stays in .specify: level5/central-governance (governance), level5/golden-runs (domain,
  Phase 3), agentops/alerts.log (state), traceability-map.json (domain, Phase 3).

Full gate: PASS=64 FAIL=0 SKIP=3 (CASAN_CI_STEP_TIMEOUT_SEC=1200).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
thanhnv
2026-07-08 00:36:06 +09:00
co-authored by Claude Opus 4.8
parent 664bd1f00c
commit d54d7f5f4c
28 changed files with 568 additions and 555 deletions
@@ -1,86 +0,0 @@
version: 1.0
description: AgentOps Alert Rules
alerts:
- id: ALERT-001
name: High Latency
condition: latency_ms > 5000
severity: medium
action:
- log
- notify
- id: ALERT-002
name: High Retry
condition: retry_count > 2
severity: medium
action:
- log
- notify
- id: ALERT-003
name: Failure Detected
condition: status == "failed"
severity: high
action:
- log
- notify
- escalate
- id: ALERT-004
name: High Cost Spike
condition: cost_estimate > 0.05
severity: medium
action:
- log
- id: ALERT-005
name: Hallucination Risk
condition: output contains ("maybe" or "might be incorrect")
severity: low
action:
- log
- flag
- id: ALERT-006
name: Token Overuse
condition: total_tokens > 5000
severity: medium
action:
- log
- notify
notification:
channels:
- type: log
path: ".specify/agentops/alerts.log"
- type: console
enabled: true
# future integration
# - type: slack
# webhook: "https://hooks.slack.com/..."
escalation:
enabled: true
rules:
- severity: high
action: immediate_alert
- severity: medium
action: batched_alert
- severity: low
action: log_only
level4_gate:
alert_log_must_exist: true
failed_step_must_emit_alert: true
retry_threshold_must_emit_alert: true
cost_spike_must_emit_alert: true
+1
View File
@@ -0,0 +1 @@
../../packages/casan-harness/agentops/alerts.yaml
@@ -1,76 +0,0 @@
version: 1.0
description: CASAN H6 per-step hallucination signal tracking
tracking:
enabled: true
method: cross_reference_check
log_path: .specify/logs/cost/metrics.jsonl
field_name: hallucination_signals
steps_with_tracking:
- step: step-1-srs
reference_docs:
- docs/input/okr-requirement.md
signals:
- ungrounded_feature_claim
- invented_requirement
- undefined_acronym
keywords_indicating_hallucination:
- "I assume"
- "typically"
- "usually includes"
- "standard practice suggests"
- step: step-3-spec
reference_docs:
- docs/output/ipa-docs/srs/
- docs/output/ipa-docs/bd/
signals:
- invented_api_endpoint
- schema_mismatch
- undefined_term
- ungrounded_business_rule
keywords_indicating_hallucination:
- "assumed from context"
- "common pattern would be"
- "likely the intent is"
- step: step-6-plan
reference_docs:
- docs/output/specs/
signals:
- invented_dependency
- wrong_module_assignment
- unspecified_library
keywords_indicating_hallucination:
- "might need"
- "could potentially use"
- "I believe"
- step: step-10-implement
reference_docs:
- docs/output/specs/
signals:
- undocumented_endpoint
- wrong_field_type
- missing_required_field
- hardcoded_value_not_in_spec
keywords_indicating_hallucination:
- "// TODO: confirm"
- "// assumed"
- "// placeholder"
- step: step-11-review-code
reference_docs:
- docs/output/specs/
- backend/
- frontend/
signals:
- false_security_clearance
- invented_test_result
- unverified_compliance_claim
thresholds:
warn: 3
block: 7
note: "warn=log warning; block=force retry of step"
@@ -0,0 +1 @@
../../packages/casan-harness/agentops/hallucination-tracking.yaml
@@ -1,52 +0,0 @@
version: 1.0
description: CASAN H6 AgentOps metrics and scoring configuration
collection:
enabled: true
trace_format: json
metrics_format: jsonl
trace_dir: ".specify/logs/trace"
metrics_log: ".specify/logs/cost/metrics.jsonl"
alert_log: ".specify/agentops/alerts.log"
dimensions:
- trace_id
- timestamp
- agent
- step
- status
- exit_code
- latency_ms
- retry_count
- input_tokens
- output_tokens
- total_tokens
- cost_estimate
- alerts
- input_hash
- output_hash
cost_model:
default_cost_per_1k_tokens_usd: 0.002
override_env: CASAN_COST_PER_1K
thresholds:
latency_alert_ms: 5000
retry_alert_threshold: 2
token_alert_threshold: 5000
failure_alert: true
level4_gate:
required: true
minimum_evidence:
traces_per_pipeline_step: 1
metrics_log_present: true
alert_rules_present: true
failure_status_recorded: true
level5_readiness:
required_additions:
- drift_detection_against_golden_runs
- model_fallback_routing
- live_dashboard
- business_outcome_metrics
+1
View File
@@ -0,0 +1 @@
../../packages/casan-harness/agentops/metrics.yaml
@@ -1,36 +0,0 @@
version: 1.0
description: CASAN H2 Tool rate limits — prevent runaway agent loops
limits:
- tool: deploy
max_per_pipeline: 3
window: pipeline_run
note: "Max 3 deploy attempts per pipeline run before escalation"
- tool: migration
max_per_pipeline: 5
window: pipeline_run
note: "Max 5 migration runs — includes retries"
- tool: db_write
max_per_pipeline: 10
window: pipeline_run
- tool: write_code
max_per_pipeline: 50
window: pipeline_run
note: "50 write_code calls covers BE+FE implementation + up to 5 retry cycles"
- tool: external_api
max_per_hour: 100
window: rolling_60min
- tool: agent_step
max_per_pipeline: 200
window: pipeline_run
note: "Covers all 13 steps × max retries"
enforcement:
on_limit_exceeded: deny
log_denials: true
log_path: .specify/logs/audit/rate-limit-denials.jsonl
@@ -0,0 +1 @@
../../packages/casan-harness/agentops/rate-limits.yaml
@@ -1,62 +0,0 @@
version: 1.0
description: Agent Tracking & Tracing Configuration
tracking:
enabled: true
trace:
fields:
- trace_id
- timestamp
- user_input
- processed_input
- output
- latency_ms
- tokens_input
- tokens_output
- total_tokens
- cost_estimate
- retry_count
- status
- error
correlation:
enable: true
key: trace_id
stages:
- name: input_received
log: true
- name: security_checked
log: true
- name: governance_checked
log: true
- name: llm_called
log: true
- name: output_filtered
log: true
storage:
type: file
path: ".specify/logs/trace/"
format: json
retention:
days: 30
logging:
level: info
include_input: true
include_output: true
+1
View File
@@ -0,0 +1 @@
../../packages/casan-harness/agentops/tracking.yaml
@@ -1,11 +0,0 @@
{
"ai": "claude",
"ai_commands_dir": ".claude/commands",
"ai_skills": false,
"branch_numbering": "sequential",
"here": true,
"offline": true,
"preset": null,
"script": "sh",
"speckit_version": "0.4.0"
}
+1
View File
@@ -0,0 +1 @@
../packages/casan-harness/init-options.json
@@ -1,20 +0,0 @@
version: 1.0
description: CASAN Level 5 drift detection policy
golden_dir: .specify/level5/golden-runs
evidence_dir: docs/output/casan/level5-evidence
thresholds:
minimum_similarity: 0.85
maximum_length_delta_ratio: 0.30
actions:
pass: allow
warn: require_review
fail: block_or_fallback
metrics:
- similarity_ratio
- length_delta_ratio
- golden_hash
- candidate_hash
@@ -0,0 +1 @@
../../packages/casan-harness/level5/drift-policy.yaml
@@ -1,24 +0,0 @@
{
"package": "fpt-casan-sdd-harness",
"version": "1.0.0",
"capabilities": [
"H4-security",
"H5-governance",
"H6-agentops",
"L5-drift-detection",
"L5-model-fallback",
"L5-tool-registry",
"L5-rollback",
"L5-business-feedback"
],
"compatibility": {
"speckit": ">=1.0.0",
"shell": "bash",
"python": ">=3.9"
},
"entrypoints": {
"wrapper": ".specify/scripts/bash/casan-harness.sh",
"test": ".specify/tests/run-casan4-harness-tests.sh",
"dashboard": "docs/output/casan/agentops-dashboard.html"
}
}
@@ -0,0 +1 @@
../../packages/casan-harness/level5/harness-package.json
@@ -1,27 +0,0 @@
version: 1.0
description: CASAN Level 5 business KPI feedback schema
kpis:
- id: cycle_time_minutes
direction: lower_is_better
baseline: 180
target: 90
- id: review_rejection_rate
direction: lower_is_better
baseline: 0.30
target: 0.10
- id: defect_leakage_rate
direction: lower_is_better
baseline: 0.15
target: 0.05
- id: manual_rework_hours
direction: lower_is_better
baseline: 12
target: 4
evidence:
input: docs/output/casan/level5-evidence/business-kpi-input.json
output: docs/output/casan/level5-evidence/business-kpi-report.json
+1
View File
@@ -0,0 +1 @@
../../packages/casan-harness/level5/kpi-schema.yaml
@@ -1,33 +0,0 @@
version: 1.0
description: CASAN Level 5 model/tool fallback policy
routes:
- step_pattern: "review|test|security"
primary: primary-model
fallback: verifier-model
max_attempts: 2
fallback_on:
- nonzero_exit
- empty_output
- timeout
- step_pattern: "implement|write_code|deploy"
primary: primary-model
fallback: conservative-model
max_attempts: 1
fallback_on:
- nonzero_exit
- policy_reject
governance_required: true
default_route:
primary: primary-model
fallback: fallback-model
max_attempts: 2
fallback_on:
- nonzero_exit
- empty_output
evidence:
trace_dir: .specify/logs/trace
fallback_log: .specify/logs/level5/fallback.jsonl
@@ -0,0 +1 @@
../../packages/casan-harness/level5/model-fallback.yaml
@@ -1,26 +0,0 @@
{
"registry": "fpt-casan-harness-adoption",
"projects": [
{
"project_id": "AINative_OKR_CASAN4",
"domain": "SDD OKR",
"harness_package": "fpt-casan-sdd-harness",
"harness_version": "1.0.0",
"status": "active"
},
{
"project_id": "CASAN_DEMO_PROJECT_A",
"domain": "Demo SDLC",
"harness_package": "fpt-casan-sdd-harness",
"harness_version": "1.0.0",
"status": "registered"
},
{
"project_id": "CASAN_DEMO_PROJECT_B",
"domain": "Demo QA",
"harness_package": "fpt-casan-sdd-harness",
"harness_version": "1.0.0",
"status": "registered"
}
]
}
@@ -0,0 +1 @@
../../packages/casan-harness/level5/project-registry.json
@@ -1,12 +0,0 @@
{
"provider": "sample-provider",
"model": "sample-model-large",
"run_id": "provider-run-001",
"step": "speckit.implement",
"input_tokens": 1842,
"output_tokens": 936,
"total_tokens": 2778,
"cost_usd": 0.08334,
"latency_ms": 4210,
"status": "success"
}
@@ -0,0 +1 @@
../../packages/casan-harness/level5/provider-usage-sample.json
@@ -1,90 +0,0 @@
version: 1.0
description: CASAN Level 5 tool registry with ownership, schema, risk, idempotency, and rollback metadata
tools:
- id: agent_step
owner: ai-platform
risk_level: low
side_effect: false
idempotency_required: false
timeout_seconds: 600
- id: write_code
owner: engineering
risk_level: high
side_effect: true
idempotency_required: true
timeout_seconds: 900
allowed_agents: "boss,implement-agent"
rollback:
strategy: git_patch_reverse
script: .specify/scripts/bash/rollback-manager.sh
- id: migration
owner: database-owner
risk_level: high
side_effect: true
idempotency_required: true
timeout_seconds: 900
allowed_agents: "boss,implement-agent"
rollback:
strategy: migration_down_or_restore
script: .specify/scripts/bash/rollback-manager.sh
- id: deploy
owner: release-manager
risk_level: high
side_effect: true
idempotency_required: true
timeout_seconds: 1200
rate_limit_per_run: 2
allowed_agents: "boss,release-manager"
rollback:
strategy: previous_release
script: .specify/scripts/bash/rollback-manager.sh
- id: external_api
owner: platform-team
risk_level: medium
side_effect: true
idempotency_required: true
timeout_seconds: 120
allowed_agents: "boss,implement-agent"
rollback:
strategy: compensating_request
script: .specify/scripts/bash/rollback-manager.sh
- id: db_write
owner: database-owner
risk_level: high
side_effect: true
idempotency_required: true
timeout_seconds: 300
allowed_agents: "boss,implement-agent"
rollback:
strategy: restore_from_backup
script: .specify/scripts/powershell/rollback-manager.ps1
- id: write_file
owner: engineering
risk_level: medium
side_effect: true
idempotency_required: false
timeout_seconds: 60
allowed_agents: "boss,implement-agent,design-agent"
rollback:
strategy: delete_or_restore
script: .specify/scripts/bash/rollback-manager.sh
level5_gate:
required_fields:
- id
- owner
- risk_level
- side_effect
- idempotency_required
- timeout_seconds
side_effecting_tools_require:
- idempotency_key
- audit_record
- rollback_strategy
@@ -0,0 +1 @@
../../packages/casan-harness/level5/tool-registry.yaml
@@ -0,0 +1,86 @@
version: 1.0
description: AgentOps Alert Rules
alerts:
- id: ALERT-001
name: High Latency
condition: latency_ms > 5000
severity: medium
action:
- log
- notify
- id: ALERT-002
name: High Retry
condition: retry_count > 2
severity: medium
action:
- log
- notify
- id: ALERT-003
name: Failure Detected
condition: status == "failed"
severity: high
action:
- log
- notify
- escalate
- id: ALERT-004
name: High Cost Spike
condition: cost_estimate > 0.05
severity: medium
action:
- log
- id: ALERT-005
name: Hallucination Risk
condition: output contains ("maybe" or "might be incorrect")
severity: low
action:
- log
- flag
- id: ALERT-006
name: Token Overuse
condition: total_tokens > 5000
severity: medium
action:
- log
- notify
notification:
channels:
- type: log
path: ".specify/agentops/alerts.log"
- type: console
enabled: true
# future integration
# - type: slack
# webhook: "https://hooks.slack.com/..."
escalation:
enabled: true
rules:
- severity: high
action: immediate_alert
- severity: medium
action: batched_alert
- severity: low
action: log_only
level4_gate:
alert_log_must_exist: true
failed_step_must_emit_alert: true
retry_threshold_must_emit_alert: true
cost_spike_must_emit_alert: true
@@ -0,0 +1,76 @@
version: 1.0
description: CASAN H6 per-step hallucination signal tracking
tracking:
enabled: true
method: cross_reference_check
log_path: .specify/logs/cost/metrics.jsonl
field_name: hallucination_signals
steps_with_tracking:
- step: step-1-srs
reference_docs:
- docs/input/okr-requirement.md
signals:
- ungrounded_feature_claim
- invented_requirement
- undefined_acronym
keywords_indicating_hallucination:
- "I assume"
- "typically"
- "usually includes"
- "standard practice suggests"
- step: step-3-spec
reference_docs:
- docs/output/ipa-docs/srs/
- docs/output/ipa-docs/bd/
signals:
- invented_api_endpoint
- schema_mismatch
- undefined_term
- ungrounded_business_rule
keywords_indicating_hallucination:
- "assumed from context"
- "common pattern would be"
- "likely the intent is"
- step: step-6-plan
reference_docs:
- docs/output/specs/
signals:
- invented_dependency
- wrong_module_assignment
- unspecified_library
keywords_indicating_hallucination:
- "might need"
- "could potentially use"
- "I believe"
- step: step-10-implement
reference_docs:
- docs/output/specs/
signals:
- undocumented_endpoint
- wrong_field_type
- missing_required_field
- hardcoded_value_not_in_spec
keywords_indicating_hallucination:
- "// TODO: confirm"
- "// assumed"
- "// placeholder"
- step: step-11-review-code
reference_docs:
- docs/output/specs/
- backend/
- frontend/
signals:
- false_security_clearance
- invented_test_result
- unverified_compliance_claim
thresholds:
warn: 3
block: 7
note: "warn=log warning; block=force retry of step"
@@ -0,0 +1,52 @@
version: 1.0
description: CASAN H6 AgentOps metrics and scoring configuration
collection:
enabled: true
trace_format: json
metrics_format: jsonl
trace_dir: ".specify/logs/trace"
metrics_log: ".specify/logs/cost/metrics.jsonl"
alert_log: ".specify/agentops/alerts.log"
dimensions:
- trace_id
- timestamp
- agent
- step
- status
- exit_code
- latency_ms
- retry_count
- input_tokens
- output_tokens
- total_tokens
- cost_estimate
- alerts
- input_hash
- output_hash
cost_model:
default_cost_per_1k_tokens_usd: 0.002
override_env: CASAN_COST_PER_1K
thresholds:
latency_alert_ms: 5000
retry_alert_threshold: 2
token_alert_threshold: 5000
failure_alert: true
level4_gate:
required: true
minimum_evidence:
traces_per_pipeline_step: 1
metrics_log_present: true
alert_rules_present: true
failure_status_recorded: true
level5_readiness:
required_additions:
- drift_detection_against_golden_runs
- model_fallback_routing
- live_dashboard
- business_outcome_metrics
@@ -0,0 +1,36 @@
version: 1.0
description: CASAN H2 Tool rate limits — prevent runaway agent loops
limits:
- tool: deploy
max_per_pipeline: 3
window: pipeline_run
note: "Max 3 deploy attempts per pipeline run before escalation"
- tool: migration
max_per_pipeline: 5
window: pipeline_run
note: "Max 5 migration runs — includes retries"
- tool: db_write
max_per_pipeline: 10
window: pipeline_run
- tool: write_code
max_per_pipeline: 50
window: pipeline_run
note: "50 write_code calls covers BE+FE implementation + up to 5 retry cycles"
- tool: external_api
max_per_hour: 100
window: rolling_60min
- tool: agent_step
max_per_pipeline: 200
window: pipeline_run
note: "Covers all 13 steps × max retries"
enforcement:
on_limit_exceeded: deny
log_denials: true
log_path: .specify/logs/audit/rate-limit-denials.jsonl
@@ -0,0 +1,62 @@
version: 1.0
description: Agent Tracking & Tracing Configuration
tracking:
enabled: true
trace:
fields:
- trace_id
- timestamp
- user_input
- processed_input
- output
- latency_ms
- tokens_input
- tokens_output
- total_tokens
- cost_estimate
- retry_count
- status
- error
correlation:
enable: true
key: trace_id
stages:
- name: input_received
log: true
- name: security_checked
log: true
- name: governance_checked
log: true
- name: llm_called
log: true
- name: output_filtered
log: true
storage:
type: file
path: ".specify/logs/trace/"
format: json
retention:
days: 30
logging:
level: info
include_input: true
include_output: true
@@ -0,0 +1,11 @@
{
"ai": "claude",
"ai_commands_dir": ".claude/commands",
"ai_skills": false,
"branch_numbering": "sequential",
"here": true,
"offline": true,
"preset": null,
"script": "sh",
"speckit_version": "0.4.0"
}
@@ -0,0 +1,20 @@
version: 1.0
description: CASAN Level 5 drift detection policy
golden_dir: .specify/level5/golden-runs
evidence_dir: docs/output/casan/level5-evidence
thresholds:
minimum_similarity: 0.85
maximum_length_delta_ratio: 0.30
actions:
pass: allow
warn: require_review
fail: block_or_fallback
metrics:
- similarity_ratio
- length_delta_ratio
- golden_hash
- candidate_hash
@@ -0,0 +1,24 @@
{
"package": "fpt-casan-sdd-harness",
"version": "1.0.0",
"capabilities": [
"H4-security",
"H5-governance",
"H6-agentops",
"L5-drift-detection",
"L5-model-fallback",
"L5-tool-registry",
"L5-rollback",
"L5-business-feedback"
],
"compatibility": {
"speckit": ">=1.0.0",
"shell": "bash",
"python": ">=3.9"
},
"entrypoints": {
"wrapper": ".specify/scripts/bash/casan-harness.sh",
"test": ".specify/tests/run-casan4-harness-tests.sh",
"dashboard": "docs/output/casan/agentops-dashboard.html"
}
}
@@ -0,0 +1,27 @@
version: 1.0
description: CASAN Level 5 business KPI feedback schema
kpis:
- id: cycle_time_minutes
direction: lower_is_better
baseline: 180
target: 90
- id: review_rejection_rate
direction: lower_is_better
baseline: 0.30
target: 0.10
- id: defect_leakage_rate
direction: lower_is_better
baseline: 0.15
target: 0.05
- id: manual_rework_hours
direction: lower_is_better
baseline: 12
target: 4
evidence:
input: docs/output/casan/level5-evidence/business-kpi-input.json
output: docs/output/casan/level5-evidence/business-kpi-report.json
@@ -0,0 +1,33 @@
version: 1.0
description: CASAN Level 5 model/tool fallback policy
routes:
- step_pattern: "review|test|security"
primary: primary-model
fallback: verifier-model
max_attempts: 2
fallback_on:
- nonzero_exit
- empty_output
- timeout
- step_pattern: "implement|write_code|deploy"
primary: primary-model
fallback: conservative-model
max_attempts: 1
fallback_on:
- nonzero_exit
- policy_reject
governance_required: true
default_route:
primary: primary-model
fallback: fallback-model
max_attempts: 2
fallback_on:
- nonzero_exit
- empty_output
evidence:
trace_dir: .specify/logs/trace
fallback_log: .specify/logs/level5/fallback.jsonl
@@ -0,0 +1,26 @@
{
"registry": "fpt-casan-harness-adoption",
"projects": [
{
"project_id": "AINative_OKR_CASAN4",
"domain": "SDD OKR",
"harness_package": "fpt-casan-sdd-harness",
"harness_version": "1.0.0",
"status": "active"
},
{
"project_id": "CASAN_DEMO_PROJECT_A",
"domain": "Demo SDLC",
"harness_package": "fpt-casan-sdd-harness",
"harness_version": "1.0.0",
"status": "registered"
},
{
"project_id": "CASAN_DEMO_PROJECT_B",
"domain": "Demo QA",
"harness_package": "fpt-casan-sdd-harness",
"harness_version": "1.0.0",
"status": "registered"
}
]
}
@@ -0,0 +1,12 @@
{
"provider": "sample-provider",
"model": "sample-model-large",
"run_id": "provider-run-001",
"step": "speckit.implement",
"input_tokens": 1842,
"output_tokens": 936,
"total_tokens": 2778,
"cost_usd": 0.08334,
"latency_ms": 4210,
"status": "success"
}
@@ -0,0 +1,90 @@
version: 1.0
description: CASAN Level 5 tool registry with ownership, schema, risk, idempotency, and rollback metadata
tools:
- id: agent_step
owner: ai-platform
risk_level: low
side_effect: false
idempotency_required: false
timeout_seconds: 600
- id: write_code
owner: engineering
risk_level: high
side_effect: true
idempotency_required: true
timeout_seconds: 900
allowed_agents: "boss,implement-agent"
rollback:
strategy: git_patch_reverse
script: .specify/scripts/bash/rollback-manager.sh
- id: migration
owner: database-owner
risk_level: high
side_effect: true
idempotency_required: true
timeout_seconds: 900
allowed_agents: "boss,implement-agent"
rollback:
strategy: migration_down_or_restore
script: .specify/scripts/bash/rollback-manager.sh
- id: deploy
owner: release-manager
risk_level: high
side_effect: true
idempotency_required: true
timeout_seconds: 1200
rate_limit_per_run: 2
allowed_agents: "boss,release-manager"
rollback:
strategy: previous_release
script: .specify/scripts/bash/rollback-manager.sh
- id: external_api
owner: platform-team
risk_level: medium
side_effect: true
idempotency_required: true
timeout_seconds: 120
allowed_agents: "boss,implement-agent"
rollback:
strategy: compensating_request
script: .specify/scripts/bash/rollback-manager.sh
- id: db_write
owner: database-owner
risk_level: high
side_effect: true
idempotency_required: true
timeout_seconds: 300
allowed_agents: "boss,implement-agent"
rollback:
strategy: restore_from_backup
script: .specify/scripts/powershell/rollback-manager.ps1
- id: write_file
owner: engineering
risk_level: medium
side_effect: true
idempotency_required: false
timeout_seconds: 60
allowed_agents: "boss,implement-agent,design-agent"
rollback:
strategy: delete_or_restore
script: .specify/scripts/bash/rollback-manager.sh
level5_gate:
required_fields:
- id
- owner
- risk_level
- side_effect
- idempotency_required
- timeout_seconds
side_effecting_tools_require:
- idempotency_key
- audit_record
- rollback_strategy