|
| 1 | +--- |
| 2 | +title: "Operate the Teams Meeting Pipeline" |
| 3 | +description: "Runbook, go-live checklist, and operator worksheet for the Microsoft Teams meeting pipeline" |
| 4 | +--- |
| 5 | + |
| 6 | +# Operate the Teams Meeting Pipeline |
| 7 | + |
| 8 | +Use this guide after you have already enabled the feature from [Teams Meetings](/docs/user-guide/messaging/teams-meetings). |
| 9 | + |
| 10 | +This page covers: |
| 11 | +- operator CLI flows |
| 12 | +- routine subscription maintenance |
| 13 | +- failure triage |
| 14 | +- go-live checks |
| 15 | +- rollout worksheet |
| 16 | + |
| 17 | +## Core Operator Commands |
| 18 | + |
| 19 | +### Validate the config snapshot |
| 20 | + |
| 21 | +```bash |
| 22 | +hermes teams-pipeline validate |
| 23 | +``` |
| 24 | + |
| 25 | +Use this first after any config change. |
| 26 | + |
| 27 | +### Inspect token health |
| 28 | + |
| 29 | +```bash |
| 30 | +hermes teams-pipeline token-health |
| 31 | +hermes teams-pipeline token-health --force-refresh |
| 32 | +``` |
| 33 | + |
| 34 | +Use `--force-refresh` when you suspect stale auth state. |
| 35 | + |
| 36 | +### Inspect subscriptions |
| 37 | + |
| 38 | +```bash |
| 39 | +hermes teams-pipeline subscriptions |
| 40 | +``` |
| 41 | + |
| 42 | +### Renew near-expiry subscriptions |
| 43 | + |
| 44 | +```bash |
| 45 | +hermes teams-pipeline maintain-subscriptions |
| 46 | +hermes teams-pipeline maintain-subscriptions --dry-run |
| 47 | +``` |
| 48 | + |
| 49 | +### Inspect recent jobs |
| 50 | + |
| 51 | +```bash |
| 52 | +hermes teams-pipeline list |
| 53 | +hermes teams-pipeline list --status failed |
| 54 | +hermes teams-pipeline show <job-id> |
| 55 | +``` |
| 56 | + |
| 57 | +### Replay a stored job |
| 58 | + |
| 59 | +```bash |
| 60 | +hermes teams-pipeline run <job-id> |
| 61 | +``` |
| 62 | + |
| 63 | +### Dry-run meeting artifact fetches |
| 64 | + |
| 65 | +```bash |
| 66 | +hermes teams-pipeline fetch --meeting-id <meeting-id> |
| 67 | +hermes teams-pipeline fetch --join-web-url "<join-url>" |
| 68 | +``` |
| 69 | + |
| 70 | +## Routine Runbook |
| 71 | + |
| 72 | +### After first setup |
| 73 | + |
| 74 | +Run these in order: |
| 75 | + |
| 76 | +```bash |
| 77 | +hermes teams-pipeline validate |
| 78 | +hermes teams-pipeline token-health --force-refresh |
| 79 | +hermes teams-pipeline subscriptions |
| 80 | +``` |
| 81 | + |
| 82 | +Then trigger or wait for a real meeting event and confirm: |
| 83 | + |
| 84 | +```bash |
| 85 | +hermes teams-pipeline list |
| 86 | +hermes teams-pipeline show <job-id> |
| 87 | +``` |
| 88 | + |
| 89 | +### Daily or periodic checks |
| 90 | + |
| 91 | +- run `hermes teams-pipeline maintain-subscriptions --dry-run` |
| 92 | +- inspect `hermes teams-pipeline list --status failed` |
| 93 | +- verify the Teams delivery target is still the correct chat or channel |
| 94 | + |
| 95 | +### Before changing webhook URLs or delivery targets |
| 96 | + |
| 97 | +- update the public notification URL or Teams target config |
| 98 | +- run `hermes teams-pipeline validate` |
| 99 | +- renew or recreate affected subscriptions |
| 100 | +- confirm new events land in the expected sink |
| 101 | + |
| 102 | +## Failure Triage |
| 103 | + |
| 104 | +### No jobs are being created |
| 105 | + |
| 106 | +Check: |
| 107 | +- `msgraph_webhook` is enabled |
| 108 | +- the public notification URL points to `/msgraph/webhook` |
| 109 | +- the client state in the subscription matches `MSGRAPH_WEBHOOK_CLIENT_STATE` |
| 110 | +- subscriptions still exist remotely and are not expired |
| 111 | + |
| 112 | +### Jobs stay in retry or fail before summarization |
| 113 | + |
| 114 | +Check: |
| 115 | +- transcript permissions and availability |
| 116 | +- recording permissions and artifact availability |
| 117 | +- `ffmpeg` availability if recording fallback is enabled |
| 118 | +- Graph token health |
| 119 | + |
| 120 | +### Summaries are produced but not delivered to Teams |
| 121 | + |
| 122 | +Check: |
| 123 | +- `platforms.teams.enabled: true` |
| 124 | +- `delivery_mode` |
| 125 | +- `incoming_webhook_url` for webhook mode |
| 126 | +- `chat_id` or `team_id` plus `channel_id` for Graph mode |
| 127 | +- Teams auth config if Graph posting is used |
| 128 | + |
| 129 | +### Duplicate or unexpected replays |
| 130 | + |
| 131 | +Check: |
| 132 | +- whether you manually replayed a job with `hermes teams-pipeline run` |
| 133 | +- whether the sink record already exists for that meeting |
| 134 | +- whether you intentionally enabled a resend path in your local config |
| 135 | + |
| 136 | +## Go-Live Checklist |
| 137 | + |
| 138 | +- [ ] Graph credentials are present and correct |
| 139 | +- [ ] `msgraph_webhook` is enabled and reachable from the public internet |
| 140 | +- [ ] `MSGRAPH_WEBHOOK_CLIENT_STATE` is set and matches subscriptions |
| 141 | +- [ ] transcript subscription is created |
| 142 | +- [ ] recording subscription is created if STT fallback is required |
| 143 | +- [ ] `ffmpeg` is installed if recording fallback is enabled |
| 144 | +- [ ] Teams outbound delivery target is configured and verified |
| 145 | +- [ ] Notion and Linear sinks are configured only if actually needed |
| 146 | +- [ ] `hermes teams-pipeline validate` returns an OK snapshot |
| 147 | +- [ ] `hermes teams-pipeline token-health --force-refresh` succeeds |
| 148 | +- [ ] a real end-to-end meeting event has produced a stored job |
| 149 | +- [ ] at least one summary has reached the intended delivery sink |
| 150 | + |
| 151 | +## Delivery-Mode Decision Guide |
| 152 | + |
| 153 | +| Mode | Use when | Tradeoff | |
| 154 | +|------|----------|----------| |
| 155 | +| `incoming_webhook` | you only need simple posting into Teams | simplest setup, less control | |
| 156 | +| `graph` | you need channel or chat posting through Graph | more control, more auth and target config | |
| 157 | + |
| 158 | +## Operator Worksheet |
| 159 | + |
| 160 | +Fill this out before rollout: |
| 161 | + |
| 162 | +| Item | Value | |
| 163 | +|------|-------| |
| 164 | +| Public notification URL | | |
| 165 | +| Graph tenant ID | | |
| 166 | +| Graph client ID | | |
| 167 | +| Webhook client state | | |
| 168 | +| Transcript resource subscription | | |
| 169 | +| Recording resource subscription | | |
| 170 | +| Teams delivery mode | | |
| 171 | +| Teams chat ID or team/channel | | |
| 172 | +| Notion database ID | | |
| 173 | +| Linear team ID | | |
| 174 | +| Store path override, if any | | |
| 175 | +| Owner for daily checks | | |
| 176 | + |
| 177 | +## Change Review Worksheet |
| 178 | + |
| 179 | +Use this before changing the deployment: |
| 180 | + |
| 181 | +| Question | Answer | |
| 182 | +|----------|--------| |
| 183 | +| Are we changing the public webhook URL? | | |
| 184 | +| Are we rotating Graph credentials? | | |
| 185 | +| Are we changing Teams delivery mode? | | |
| 186 | +| Are we moving to a new Teams chat or channel? | | |
| 187 | +| Do subscriptions need to be recreated or renewed? | | |
| 188 | +| Do we need a fresh end-to-end verification run? | | |
| 189 | + |
| 190 | +## Related Docs |
| 191 | + |
| 192 | +- [Teams Meetings setup](/docs/user-guide/messaging/teams-meetings) |
| 193 | +- [Microsoft Teams bot setup](/docs/user-guide/messaging/teams) |
0 commit comments