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.

Lesson hero for leadership dashboard rehearsal completion slice coupling

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_incomplete is 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_reason propagation into dashboard publish API
  • Export REHEARSAL_COMPLETION_SLICE.json
  • Publish gate extension: leadership_slice_rehearsal_mismatch

Prerequisites

  • Lesson 193rehearsal_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_id as Lesson 193 export
  • [ ] rehearsal_completion_incomplete cleared before leadership_slice_rehearsal_mismatch test
  • [ ] Screenshot test: failing rollup forces red rehearsal tile
  • [ ] SLA tiles do not show green when rehearsal tile red
  • [ ] REHEARSAL_COMPLETION_SLICE.json matches 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)

  1. Seed failing rollup (pass: false).
  2. Confirm dashboard rehearsal tile red and publish API returns leadership_slice_rehearsal_mismatch.
  3. Fix rollup; refresh slice export.
  4. Confirm tiles green and publish succeeds.
  5. 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 197rehearsal_completion_v1 schema 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.