Skip to content

docs(teams): split meetings setup from operator runbook (salvage of #21412)#22042

Merged
teknium1 merged 3 commits into
mainfrom
hermes/hermes-f0bc99f0
May 8, 2026
Merged

docs(teams): split meetings setup from operator runbook (salvage of #21412)#22042
teknium1 merged 3 commits into
mainfrom
hermes/hermes-f0bc99f0

Conversation

@teknium1

@teknium1 teknium1 commented May 8, 2026

Copy link
Copy Markdown
Contributor

Summary

Salvage of #21412 onto current main, with the subscription-renewal cron recipe, sidebar wiring, and a rewritten SKILL.md on top.

Fifth and final slice of the MS Teams meeting pipeline stack. @dlkakbs's split (setup page + operator runbook + skill asset) lands cleanly; we add the three things needed to make the docs actually work in practice.

Credit to @dlkakbs — her two commits are preserved via rebase-merge.

Changes

From @dlkakbs (unchanged):

  • website/docs/user-guide/messaging/teams-meetings.md (new, 227 lines) — full setup page: prerequisites, Graph credentials, webhook listener, delivery config, subscription creation, validation, troubleshooting.
  • website/docs/guides/operate-teams-meeting-pipeline.md (new, 193 lines) — operator runbook: core commands, routine runbook, failure triage, go-live checklist, delivery-mode decision guide, operator worksheet, change review worksheet.
  • website/docs/user-guide/messaging/teams.md — cross-link to the meetings page.
  • website/docs/user-guide/messaging/index.md — meetings entry in the platform index.
  • skills/productivity/teams-meeting-pipeline/SKILL.md (new) — initial agent-facing skill.
  • tests/gateway/test_teams.py@pytest.mark.asyncio@pytest.mark.anyio consistency fix across the file.

Follow-ups added on top during salvage:

  1. Subscription renewal cron recipe (the Terminal tool #1 operational footgun).
    Microsoft Graph caps webhook subscriptions at 72 hours and does NOT auto-renew. Without a scheduled maintain-subscriptions job, any production deployment silently stops ingesting meetings three days after go-live. Added an "Automating subscription renewal (REQUIRED for production)" section to the operator runbook with three concrete options (Hermes cron, systemd timer, plain crontab), copy-pasteable configs, and a verification block. Go-Live Checklist gains a bolded mandatory item. teams-meetings.md gets a :::warning::: admonition next to the manual subscribe examples so any operator creating a subscription manually is told the same day that it will expire.

  2. Sidebar wiring. Shela's two new docs pages weren't in website/sidebars.ts, so they were orphaned URLs — reachable only by knowing the path. Wired teams-meetings into Messaging Platforms next to the existing teams entry, and operate-teams-meeting-pipeline into Guides & Tutorials next to microsoft-graph-app-registration. Adjacent placement keeps related pages cross-discoverable.

  3. SKILL.md rewrite (v1.0.0 → v1.1.0). The original skill had five Turkish-only trigger phrases. Rewrote the skill to:

    • Describe triggers by intent with explicit multilingual framing and example phrases in English and Turkish.
    • Add a Decision Tree section covering the three most common user asks (missing summary, setup verification, re-run request) with exact CLI command sequences.
    • Add a dedicated "Critical pitfall: Graph subscriptions expire in 72 hours" section so the agent knows what to do when a user reports "worked yesterday, nothing today."
    • Split commands into three labeled groups (Status/inspection, Re-running/debugging, Subscription management).
    • Cross-link to all four related docs pages.

What this PR enables end-to-end

Merging this closes the entire #21408-#21412 stack. The pipeline is now:

  • Installed: hermes teams-pipeline is a real CLI, the skill teaches the agent to use it, the webhook listener ingests Graph notifications.
  • Discoverable: every new page lives in the sidebar. Setup flow is Azure app registration → webhook listener → pipeline setup → operator runbook, all cross-linked.
  • Operable: the renewal automation is documented with three working options — no operator goes to production without knowing their subscriptions will silently expire at 72h.

Validation

  • scripts/run_tests.sh on the relevant suites (tests/gateway/test_teams.py, tests/plugins/, tests/gateway/test_msgraph_webhook.py, tests/hermes_cli/test_teams_pipeline_plugin_cli.py) — 607/607 passed.
  • npm run build in website/ — new pages route at /docs/user-guide/messaging/teams-meetings and /docs/guides/operate-teams-meeting-pipeline, anchor #automating-subscription-renewal-required-for-production resolves from both the TOC and the cross-link from teams-meetings.md, no new warnings or errors.

Closes #21412. Closes the entire stack.

dlkakbs and others added 3 commits May 8, 2026 12:01
Fifth and final slice polish on top of @dlkakbs's docs + skill. Three
things ship here:

1. Subscription renewal cron recipe (the #1 operational footgun).

   Microsoft Graph webhook subscriptions expire at 72 hours max and
   don't auto-renew. The shipped operator runbook mentioned
   `maintain-subscriptions --dry-run` as a "daily or periodic check"
   but never told operators how to actually automate it. Without a
   scheduled job, any production deployment silently stops ingesting
   meetings three days after go-live.

   Adds an "Automating subscription renewal (REQUIRED for production)"
   section to website/docs/guides/operate-teams-meeting-pipeline.md
   with three concrete options and copy-pasteable configs:

   - Option 1: Hermes cron (`hermes cron add --schedule "0 */12 * * *"
     --script-only --command "hermes teams-pipeline maintain-subscriptions"`)
   - Option 2: systemd service + timer (12h cadence, Persistent=true
     so missed runs catch up after reboots)
   - Option 3: plain crontab with a wrapper that sources .env for
     credentials

   Go-Live Checklist gains a bolded mandatory item for the schedule
   being in place, with a cross-link to the section.

   website/docs/user-guide/messaging/teams-meetings.md adds a
   `:::warning:::` admonition right after the manual `subscribe`
   examples so anyone who creates a subscription manually is told
   the same day that it will silently expire in 72 hours.

2. Sidebar wiring. Shela's new docs pages (teams-meetings.md and
   operate-teams-meeting-pipeline.md) weren't in website/sidebars.ts,
   so they were orphaned URLs — reachable only if someone knew the
   path. Wired teams-meetings into Messaging Platforms next to the
   existing teams entry, and operate-teams-meeting-pipeline into
   Guides & Tutorials next to microsoft-graph-app-registration from
   PR #21922. Adjacent placement keeps the related pages discoverable
   from each other.

3. SKILL.md rewrite (v1.0.0 → v1.1.0).

   The original skill had five Turkish-only trigger phrases, which
   works in a Turkish-speaking session but doesn't match English
   triggers. Rewrote the skill to:

   - Describe triggers by intent instead of exact phrases, with
     explicit "works in any language" framing and example phrases
     in both English and Turkish.
   - Add a Decision Tree section covering the three most common user
     asks (missing summary, setup verification, re-run request) and
     the specific CLI command sequence for each.
   - Add a dedicated "Critical pitfall: Graph subscriptions expire
     in 72 hours" section that tells the agent exactly what to do
     when a user reports "worked yesterday, nothing today" — the
     most common operational failure mode.
   - Expand the command reference into three labeled groups (Status
     and inspection / Re-running and debugging / Subscription
     management) so the agent can reach for the right command
     without scanning.
   - Add cross-links to all four related docs pages (Azure app
     registration, webhook listener setup, full pipeline setup,
     operator runbook).

Validation:
- npm run build: all new pages route, anchor to
  #automating-subscription-renewal-required-for-production resolves
  from both the runbook TOC and the teams-meetings.md admonition.
- scripts/run_tests.sh on the relevant test suites (607 tests): all
  pass.
@github-actions

github-actions Bot commented May 8, 2026

Copy link
Copy Markdown
Contributor

🔎 Lint report: hermes/hermes-f0bc99f0 vs origin/main

ruff

Total: 0 on HEAD, 0 on base (➖ 0)

🆕 New issues: none

✅ Fixed issues: none

Unchanged: 0 pre-existing issues carried over.

ty (type checker)

Total: 7797 on HEAD, 7797 on base (➖ 0)

🆕 New issues (3):

Rule Count
invalid-argument-type 3
First entries
run_agent.py:12805: [invalid-argument-type] invalid-argument-type: Argument to function `_is_oauth_token` is incorrect: Expected `str`, found `str | dict[Unknown | str, Unknown | str | dict[str, str]] | Any | ... omitted 3 union elements`
run_agent.py:6811: [invalid-argument-type] invalid-argument-type: Argument to function `build_anthropic_client` is incorrect: Expected `str`, found `str | dict[Unknown | str, Unknown | str | dict[str, str]] | Any | ... omitted 3 union elements`
run_agent.py:12808: [invalid-argument-type] invalid-argument-type: Argument to function `len` is incorrect: Expected `Sized`, found `(str & ~AlwaysFalsy) | (dict[Unknown | str, Unknown | str | dict[str, str]] & ~AlwaysFalsy) | (Any & ~AlwaysFalsy) | ... omitted 3 union elements`

✅ Fixed issues (3):

Rule Count
invalid-argument-type 3
First entries
run_agent.py:12805: [invalid-argument-type] invalid-argument-type: Argument to function `_is_oauth_token` is incorrect: Expected `str`, found `str | dict[Unknown, Unknown] | Any | ... omitted 3 union elements`
run_agent.py:6811: [invalid-argument-type] invalid-argument-type: Argument to function `build_anthropic_client` is incorrect: Expected `str`, found `str | dict[Unknown, Unknown] | Any | ... omitted 3 union elements`
run_agent.py:12808: [invalid-argument-type] invalid-argument-type: Argument to function `len` is incorrect: Expected `Sized`, found `(str & ~AlwaysFalsy) | (dict[Unknown, Unknown] & ~AlwaysFalsy) | (Any & ~AlwaysFalsy) | ... omitted 3 union elements`

Unchanged: 4092 pre-existing issues carried over.

Diagnostics are surfaced as warnings — this check never fails the build.

@teknium1 teknium1 merged commit 242da9d into main May 8, 2026
12 of 13 checks passed
@teknium1 teknium1 deleted the hermes/hermes-f0bc99f0 branch May 8, 2026 19:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants