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 & Configuration</h1>
<h2 id="doc-reference-operations--h1">16.1 Golden Signals & 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">> 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">> 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">> 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">> 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 > 50 or age > 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">> 20 items or oldest > 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 & Gates, Notifications, Agents & 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 & 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>
|