Task — engineering-spec@1

"obs-router: Alertmanager → CUO triage-alert → CHAT or PagerDuty"

doneTASK-OBS-007
module obs · class product · priority p0 · created 2026-05-15 · shipped null
depends on TASK-OBS-002, TASK-OBS-003 · blocks TASK-KB-008

TASK-OBS-007: obs-router Alertmanager → CUO → CHAT/PagerDuty

Summary

Route Alertmanager webhook fires through CUO's obs.triage-alert@1 skill to CHAT (confidence ≥ 0.70) or PagerDuty, with sev-1 always paging both channels. As-built surface is the services/obs-router/ crate (handle.rs orchestration — not ack_handler.rs), pure routing in route.rs (CONFIDENCE_FLOOR = 0.70), the skill at modules/skill/obs-triage-alert/SKILL.md, and deploy/obs/alertmanager-config.yaml (added in this batch).

Problem

The original engineering-spec claimed skills/obs.triage-alert/SKILL.md, a standalone ack_handler.rs, phantom integration test filenames (triage_test.rs, sev1_always_pages_test.rs), and live PagerDuty/CHAT network tests. The live skill lives under modules/skill/; ack is a minimal stub on main.rs /ack/:fingerprint; routing correctness is proven by handle.rs and route.rs unit tests plus route_decision_test.rs. FM-004 blocked re-entry (## §N body + wrong paths).

Proposed Solution

Adopt the as-built layout:

Alternatives Considered

Success Metrics

Scope

In scope (as-built):

Out of scope / Non-Goals

Dependencies

depends_on: [TASK-OBS-002, TASK-OBS-003]. Soft: TASK-OBS-005 (trace_id on alert labels for CHAT/audit links); TASK-CUO-101 (CUO runtime); TASK-KB-008 (runbook corpus the skill RAG-searches).

1. Description (normative)

Acceptance criteria

Verification

cd services && cargo test -p cyberos-obs-router
cd services && cargo test -p cyberos-obs-router --test route_decision_test --test alertmanager_wiring_test
PathCovers
tests/route_decision_test.rsFull routing table + no-silent-drop grid
tests/alertmanager_wiring_test.rsdeploy/obs/alertmanager-config.yaml residual gate
src/route.rs (inline tests)CONFIDENCE_FLOOR, clamp, sev-1 Both
src/handle.rs (inline tests)End-to-end route_alert + fallback chain + runbook allowlist
src/severity.rs (inline tests)Label parsing
modules/skill/obs-triage-alert/SKILL.mdCUO skill contract
deploy/obs/alertmanager-config.yamlAlertmanager → obs-router webhook

AI Authorship Disclosure


batch/9b-obs adopt — TASK-OBS-007 re-spec against as-built obs-router.