# Episode 10 - Manual Verification Checklist

_Generated by `episodes/ep-10-autonomous-agents/preflight.py`. Re-run after substrate changes._

Sentinel doesn't take prompts (it's autonomous), so this file is a UI checklist
to run in Copilot Studio + Power Automate after the harness has gone green.

## Sentinel (Part 1)

### Setup verification
- [ ] Bot `Launch Sentinel` exists in the same env as LaunchControl solution
- [ ] **Generative orchestration** is ON in the bot settings
- [ ] **Instructions** match `agents/launch-sentinel/system-prompt.txt` (paste-check)
- [ ] **Tools**: Dataverse MCP Server attached
- [ ] **Trigger**: `When a row is added or modified (Dataverse)` -> table=`lc_task`, change=`Modified`, filter `lc_isblocked eq true`
- [ ] Trigger -> action: `Run agent: Launch Sentinel`
- [ ] Bot is **published** (not just saved)

### Live behavior verification
1. **Fresh block**:
   - In a model-driven app or via MCP, set `lc_isblocked=true` on a real (non-test) task on an active launch.
   - Within ~60s, confirm a new `lc_statusupdate` row appears with title `[<P0/P1/P2/P3>] <task title> blocked`.
   - Body must contain `Source: Launch Sentinel`, `Correlation: task=<id>`, `GeneratedByAutomation: true`.
2. **Idempotency**:
   - PATCH the same task again (e.g., update `lc_blockerreason`).
   - Confirm NO second status update appears within 5 minutes.
3. **Stale-block guard**:
   - On a task linked to a closed GitHub issue, set `lc_isblocked=true`.
   - Confirm Sentinel writes nothing (silent exit).
4. **Severity edge case**:
   - Block a task whose milestone has no `lc_duedate`.
   - Confirm severity is P2 - Medium and body says "(no due date set)".

### Cleanup after each test
Delete the ephemeral status update + revert `lc_isblocked` so you don't pollute the demo data.

## Daily Readiness Flow (Part 2)

### MCP-step path (if available in your tenant)
- [ ] Spike flow returned data from a `Dataverse MCP` step (see `agents/agent-flows/daily-readiness-summary.md`)
- [ ] Production flow runs successfully on schedule
- [ ] Teams post lands in target channel with all active launches summarized

### Fallback path (Power Automate standard connectors)
- [ ] Flow uses `Common Data Service` and `Microsoft Teams` connectors only
- [ ] Identical message content to the MCP path

## What to call out on camera
- Sentinel signature line `Source: Launch Sentinel` is the easy "this is automation" cue
- Correlation marker in `lc_body` is what enables idempotency
- The bot writes to the SAME `lc_statusupdate` table the Coordinator (Ep 9) reads from -- one source of truth, two agents

## When something fails
| Symptom | Most likely cause |
|---------|-------------------|
| Trigger fires repeatedly, multiple status updates | Idempotency check missing or markers not in body |
| Trigger never fires | Bot not published; trigger filter wrong (`lc_isblocked` vs case); generative orchestration off |
| Status update written but missing markers | Prompt re-pasted incomplete - re-sync from `system-prompt.txt` |
| Severity always P2 | Milestone lookup failing - check Sentinel MCP tool has read on `lc_milestone` |
