Lesson 196: Leadership Dashboard Rehearsal Completion Slice Publish Coupling (2026)
Direct answer: Lesson 193 owns rehearsal_completion_v1.json and the rehearsal_completion_incomplete gate. Lesson 196 wires a leadership dashboard slice that reads the same rollup, paints red/yellow/green from truth—not from SLA tiles that ignore rehearsal state—and blocks publish when the slice says incomplete. Export REHEARSAL_COMPLETION_SLICE.json so October 2026 exec decks cannot show green above a failing rehearsal rollup.

Why this matters now (October 2026 executive readouts)
October 2026 planning decks still ship screenshots where:
- SLA breach tiles stay green because they query a different warehouse table than
rehearsal_completion_rollup. - Executives approve promotion while
rehearsal_completion_incompleteis still open in the publish pipeline. - Lesson 164 partner/leadership sync fixes column semantics—but not rehearsal completion as a first-class slice.
This lesson couples the exec dashboard publish path to Lesson 193 so misleading green is a pipeline failure, not a meeting debate.
Lesson objectives
You will implement:
- View
leadership_rehearsal_completion_slice_v1 - Tile contract:
rehearsal_completion_status(pass|fail|unknown) block_reasonpropagation into dashboard publish API- Export
REHEARSAL_COMPLETION_SLICE.json - Publish gate extension:
leadership_slice_rehearsal_mismatch
Prerequisites
- Lesson 193 —
rehearsal_completion_v1.json, materialized rollup - Lesson 164 — metric dictionary + UTC window parity for leadership exports
- Lesson 171 — publish-pipeline tuple-drift block (do not bypass with stale slice)
- Lesson 195 — optional; partner letter is separate lane
Slice data contract
CREATE VIEW leadership_rehearsal_completion_slice_v1 AS
SELECT
r.cert_window_id,
r.completion_score_percent,
r.pass AS rollup_pass,
CASE
WHEN g.open_gate = 'rehearsal_completion_incomplete' THEN 'fail'
WHEN r.pass = true THEN 'pass'
ELSE 'fail'
END AS rehearsal_completion_status,
COALESCE(g.block_reason, 'rollup_pass_false') AS block_reason,
r.exported_at_utc AS rollup_exported_at
FROM rehearsal_completion_export_staging r
LEFT JOIN governance_publish_gate g
ON g.cert_window_id = r.cert_window_id
AND g.open_gate = 'rehearsal_completion_incomplete';
Rule: rehearsal_completion_status must never be pass while rehearsal_completion_incomplete is open.
Dashboard tile wiring
| Tile ID | Query field | Green when | Red when |
|---|---|---|---|
tile_rehearsal_completion |
rehearsal_completion_status |
pass |
fail |
tile_completion_score |
completion_score_percent |
>= 100 |
< 100 |
tile_t_minus_14 |
phase row t_minus_14.pass_bit |
true |
false |
tile_t_minus_3 |
phase row t_minus_3.pass_bit |
true |
false |
Anti-pattern: wiring tile_sla_breach_forecast green independently—keep SLA tiles greyed when rehearsal slice is fail.
block_reason propagation
When publish API receives POST /dashboard/publish:
def validate_leadership_slice(cert_window_id: str) -> None:
row = fetch_slice("leadership_rehearsal_completion_slice_v1", cert_window_id)
if row["rehearsal_completion_status"] != "pass":
raise PublishBlocked(
gate="leadership_slice_rehearsal_mismatch",
reason=row["block_reason"],
remediation="Refresh rollup; clear rehearsal_completion_incomplete",
)
Surface block_reason in the BI tool subtitle so execs see why publish failed—not a generic 403.
REHEARSAL_COMPLETION_SLICE.json
{
"schema": "rehearsal_completion_slice_v1",
"cert_window_id": "q1_2027_meta_holiday",
"exported_at_utc": "2026-10-18T14:00:00Z",
"rehearsal_completion_status": "pass",
"completion_score_percent": 100.0,
"rollup_pass": true,
"open_gates": [],
"phases": [
{"rehearsal_phase": "t_minus_14", "pass_bit": true, "weighted_score": 91},
{"rehearsal_phase": "t_minus_3", "pass_bit": true, "weighted_score": 93}
],
"dashboard_tile_snapshot": {
"tile_rehearsal_completion": "pass",
"tile_completion_score": "pass"
}
}
Pin under release-evidence/05-operations/dashboard/ beside rehearsal_completion_v1.json.
Publish coupling checklist
- [ ] Slice query uses same
cert_window_idas Lesson 193 export - [ ]
rehearsal_completion_incompletecleared beforeleadership_slice_rehearsal_mismatchtest - [ ] Screenshot test: failing rollup forces red rehearsal tile
- [ ] SLA tiles do not show green when rehearsal tile red
- [ ]
REHEARSAL_COMPLETION_SLICE.jsonmatches live dashboard at export time - [ ] Lesson 171 tuple drift gate still runs after slice export
Troubleshooting
| Symptom | Fix |
|---|---|
| Dashboard green, publish blocked | Tile cached—hard refresh; verify slice view not stale BI extract |
| Slice pass, rollup fail | View join wrong window—align cert_window_id |
| Exec sees old October screenshot | Version REHEARSAL_COMPLETION_SLICE.json in deck footer |
| SLA green, rehearsal red | Delink SLA color from independent refresh job |
Mini exercise (25 minutes)
- Seed failing rollup (
pass: false). - Confirm dashboard rehearsal tile red and publish API returns
leadership_slice_rehearsal_mismatch. - Fix rollup; refresh slice export.
- Confirm tiles green and publish succeeds.
- Pin slice JSON next to rollup JSON.
Continuity
- Lesson 193 — rollup source of truth.
- Lesson 164 — metric dictionary for sibling SLA tiles.
- Lesson 171 — publish pipeline ordering.
- Next: Lesson 197 —
rehearsal_completion_v1schema semver + parser contract.
FAQ
Can we hide the rehearsal tile from exec view?
No—October 2026 reviews explicitly ask for rehearsal completion visibility next to SLA tiles.
Does partner letter (Lesson 195) replace this slice?
No—partner letter is redacted narrative; slice is internal exec + publish gate.
What if SLA is red but rehearsal passes?
Allowed—rehearsal gate is independent; document both block reasons.
How does Lesson 199 use this?
Attestation requires green REHEARSAL_COMPLETION_SLICE.json receipt among Lessons 194–198.
October 2026 executives stop getting fooled when green SLA tiles float above a yellow rehearsal rollup—the publish pipeline now fails closed on the slice that tells the truth.