File size: 6,323 Bytes
612e777
5a79992
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
612e777
5a79992
 
 
 
 
 
 
 
 
 
 
 
 
 
 
612e777
5a79992
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
<article class="doc" id="doc-reference-operations" aria-hidden="true"><div class="strip"><span class="path">reference/operations.md</span><span class="tag">Engineering, reference</span><span class="meta">~2 min read</span></div>
<h1>16. Observability, Operations &amp; Configuration</h1>
<h2 id="doc-reference-operations--h1">16.1 Golden Signals &amp; Alerts (page unless noted)</h2>
<div class="tbl-wrap"><table class="col-table compact"><colgroup><col class="col-auto"/><col class="col-sm"/><col class="col-md"/></colgroup>
<thead>
<tr>
<th>Metric</th>
<th>Threshold</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td data-label="Metric">API p95 latency (patient/clinician GETs)</td>
<td data-label="Threshold">&gt; 2 s for 10 min</td>
<td data-label="Notes">Matches NFR; per-route dashboards.</td>
</tr>
<tr>
<td data-label="Metric">Suppression outbox lag</td>
<td data-label="Threshold">&gt; 45 s</td>
<td data-label="Notes">Guards the 60 s SLAs before breach.</td>
</tr>
<tr>
<td data-label="Metric">Compile SLA (discharge→published)</td>
<td data-label="Threshold">&gt; 10 min p95</td>
<td data-label="Notes">Ticket at 8 min (warn).</td>
</tr>
<tr>
<td data-label="Metric">Gate pass-rate drop</td>
<td data-label="Threshold">−15% vs 7-day baseline</td>
<td data-label="Notes">Model drift detector; blocks deploys.</td>
</tr>
<tr>
<td data-label="Metric">Notification delivery failure</td>
<td data-label="Threshold">&gt; 2% / 15 min; any safety-tier failure</td>
<td data-label="Notes">Safety tier pages immediately.</td>
</tr>
<tr>
<td data-label="Metric">Silent-deterioration detector health</td>
<td data-label="Threshold">No run in 30 min</td>
<td data-label="Notes">Beat liveness.</td>
</tr>
<tr>
<td data-label="Metric">Queue depth / age</td>
<td data-label="Threshold">llm &gt; 50 or age &gt; 10 min</td>
<td data-label="Notes">Scale worker-llm; investigate.</td>
</tr>
<tr>
<td data-label="Metric">ADT feed silence</td>
<td data-label="Threshold">No A03 in 6 business hours</td>
<td data-label="Notes">Likely interface outage; contact partner.</td>
</tr>
<tr>
<td data-label="Metric">Review queue</td>
<td data-label="Threshold">&gt; 20 items or oldest &gt; 12 h</td>
<td data-label="Notes">Ticket clinical lead (no page).</td>
</tr>
</tbody>
</table></div>
<h2 id="doc-reference-operations--h2">16.2 Tracing, Dashboards, Runbooks</h2>
<p>OpenTelemetry traces span API → Celery → Bedrock/Twilio (trace_id also in audit rows, enabling the “replay any instruction’s lineage” requirement). Dashboards-as-code in <code>ops/</code>: Activation Funnel, Episode Ops, Pipeline &amp; Gates, Notifications, Agents &amp; Kill State, Infra. Runbooks RB-01…RB-12 cover: ADT outage, Bedrock outage, Twilio failover, model rollback (RB-07), restore drill, break-glass, kill-switch use, DLQ drain, on-call handoff, incident comms, partner escalation, pilot safety event.</p>
<h2 id="doc-reference-operations--h3">16.3 Analytics Denominators (ADR-016, ADM-004/007)</h2>
<div class="tbl-wrap"><table class="col-table compact"><colgroup><col class="col-auto"/><col class="col-lg"/></colgroup>
<thead>
<tr>
<th>Population</th>
<th>Definition (frozen)</th>
</tr>
</thead>
<tbody>
<tr>
<td data-label="Population">Offered</td>
<td data-label="Definition (frozen)">Episode reached <code>offered</code> (candidate × cohort criteria), the only valid outcome-rate denominator.</td>
</tr>
<tr>
<td data-label="Population">Activated</td>
<td data-label="Definition (frozen)">Completed verification + consent (<code>activation_at</code> set).</td>
</tr>
<tr>
<td data-label="Population">Engaged</td>
<td data-label="Definition (frozen)">≥1 task response or med status event after activation.</td>
</tr>
<tr>
<td data-label="Population">Completed</td>
<td data-label="Definition (frozen)">Episode <code>closed_completed</code> at day 30.</td>
</tr>
</tbody>
</table></div>
<p>Every outcome report footer prints denominators, ADT/HIE coverage %, and the ADR-016 flag/suppress status. Execution report categories: required, attempted, completed, blocked, escalated, unresolved, mapped 1:1 from task states.</p>
<h2 id="doc-reference-operations--h4">16.4 Tenant Config &amp; Flags</h2>
<p><code>tenant_config</code> stores typed keys (defaults → tenant → cohort), versioned publishes, and kill-switch state; served via cached client (TTL 10 s) in api/workers. Key registry (non-exhaustive): <code>identity.factors</code>, <code>provenance.hierarchy</code>, <code>ops.tier</code>, <code>safety.silent_hours_*</code>, <code>brief.lead_hours</code>, <code>notify.quiet_hours</code>, <code>analytics.coverage_*</code>, <code>int008.enabled</code>, <code>ehr.trigger_mode</code>.</p>
<h2 id="doc-reference-operations--h5">16.5 Scheduled Jobs (beat)</h2>
<div class="tbl-wrap"><table class="col-table compact"><colgroup><col class="col-auto"/><col class="col-sm"/><col class="col-md"/></colgroup>
<thead>
<tr>
<th>Job</th>
<th>Cadence</th>
<th>Purpose</th>
</tr>
</thead>
<tbody>
<tr>
<td data-label="Job">fhir_document_poll</td>
<td data-label="Cadence">15 min</td>
<td data-label="Purpose">ADR-007 backstop ingestion.</td>
</tr>
<tr>
<td data-label="Job">silent_deterioration_scan</td>
<td data-label="Cadence">15 min</td>
<td data-label="Purpose">§13.3.</td>
</tr>
<tr>
<td data-label="Job">brief_precompute_scan</td>
<td data-label="Cadence">30 min</td>
<td data-label="Purpose">Appointments entering T−24 h window.</td>
</tr>
<tr>
<td data-label="Job">episode_day_boundaries</td>
<td data-label="Cadence">hourly</td>
<td data-label="Purpose">Day-30 closing, reminder anchoring, tz-aware.</td>
</tr>
<tr>
<td data-label="Job">outbox_drain (worker-notify)</td>
<td data-label="Cadence">5 s</td>
<td data-label="Purpose">60 s suppression SLA.</td>
</tr>
<tr>
<td data-label="Job">audit_archive_export</td>
<td data-label="Cadence">nightly</td>
<td data-label="Purpose">Partition → S3 Object-Lock.</td>
</tr>
<tr>
<td data-label="Job">golden_benchmark</td>
<td data-label="Cadence">nightly</td>
<td data-label="Purpose">§17.2 model regression.</td>
</tr>
<tr>
<td data-label="Job">access_review_export</td>
<td data-label="Cadence">weekly</td>
<td data-label="Purpose">§9.4 evidence.</td>
</tr>
</tbody>
</table></div>
<div class="pn"><a class="pn-prev" href="#"></a><a class="pn-next" href="#"></a></div></article>