# Film M365

> Film a Copilot Studio agent in the REAL M365 Copilot surface — the ONLY sanctioned way to make agent demo videos. Playwright drives a dedicated authed Chrome profile, records the page via CDP (no screen capture, no desktop takeover), then trims, dead-time-compresses, and gate-verifies to GO. Use when Kody says "film <agent>", "make a video of <use case>", "location shoot", or any ask for an agent demo video. NEVER use the synthetic stage — qa_gate blocks it (synthetic-stage check).

- Skill: `kody-w/film-m365` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add kody-w/film-m365`
- Raw SKILL.md: https://api.skillmd.com/api/skills/kody-w/film-m365/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: kody-w (https://skillmd.com/u/kody-w)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/kody-w/film-m365

---


# Film an agent in real M365 Copilot

The one sanctioned path for agent demo videos (Kody's ruling 2026-07-16: staged
renders "look junky"; `director/qa_gate.py` NO-GOs them via the `synthetic-stage`
check). Proven end-to-end on a full location shoot (GO).

Work repo: your agent project repo (= $REPO). Python: `$REPO/.venv-local/bin/python`
(has Playwright). Reference scripts from the proven shoot (copy + adapt; treat as
the canonical implementation): `auth_bootstrap.py`, `film_take_v3.py`,
`gate_and_tighten.sh`, `postprod.sh` from a prior shoot's scratchpad. If gone,
rebuild from the spec below (it is complete).

## 0. Preconditions (fail fast, in order)
1. **Agent reachable in M365 Copilot**: published in Copilot Studio with
   **Authenticate with Microsoft** (Dataverse `bots.authenticationmode = 2` — mode 1
   breaks connected-agent calls AND the M365 channel), Teams+M365 channel added,
   agent added from the store for the filming account. Orchestrator + ALL child
   agents must share the same auth mode (`ConnectedAgentAuthMismatch` otherwise).
   Republish order: children first, orchestrator last.
2. **One-screen answer rule** in the agent's instructions (Kody's law): responses
   ≤ ~100 words / one viewport. Patch instructions via Dataverse PATCH + PvaPublish,
   save prestate sha256, wait ~90s, REVERT after the shoot (prestate sha must match).
3. **Dedicated browser profile** at `~/.rapp-director/chrome-profile` (mode 700).
   If stale/absent: run the auth bootstrap (headed Playwright, real Chrome channel,
   agent deep-link) and have KODY do the passkey/MFA sign-in — never touch
   credentials yourself; Authenticator number-match prompts may hit his phone on
   relaunches. Session persists; warm relaunches usually skip MFA.
4. Agent deep-link: `https://m365.cloud.microsoft/chat/agent/<titleId-pair>?titleId=…`
   (from Copilot Studio's "See agent in Microsoft 365" link).

## 1. The take (single Playwright script, CDP video — desktop stays Kody's)
- `launch_persistent_context(profile, channel="chrome", headless=False,
  viewport=1728x1117, device_scale_factor=2, record_video_dir=…,
  record_video_size=3456x2234, args=[--disable-blink-features=AutomationControlled,
  --disable-backgrounding-occluded-windows])`. Do NOT force --window-size/position
  (causes gray letterbox band).
- goto deep-link → wait for composer `[aria-label*="Message"], [placeholder*="Message"]`.
- **Fresh chat**: if main innerText > 400 chars, `goto` the deep-link again.
  NEVER click the global "New chat" — it silently drops you into vanilla Copilot
  (the take-2 wrong-subject failure).
- **SUBJECT-IDENTITY GATE (mandatory)**: abort unless the composer placeholder
  names the agent (`[placeholder*="<Agent Name>"]`). Never film without it.
- **Collapse the nav sidebar** (PII: agent list, chat history, account name):
  `button[aria-label*="ollapse navigation"]`. The hover tooltip ("Expand navigation")
  lingers until the next mouse move — trim covers it.
- Per question: click composer → `page.keyboard.type(q, delay≈65)` → Enter →
  **scroll-follow while streaming** (`page.mouse.move(864,480)` +
  `page.mouse.wheel(0,900)` every ~2.2s) → settle = main innerText length stable
  3 consecutive samples. Questions carry the one-screen constraint implicitly via
  the patched instructions; keep them demo-grade (a "what can you do" + one
  end-to-end scenario walkthrough).
- **Outro**: wheel to top, then ~18 × wheel(0,420) at 0.75s — slow pan through the
  whole conversation. Hold 4.5s. Close context (flushes video webm).
- Save DOM screenshots + main innerText transcript per question for QA/report.

## 2. Post + QA gate (the film is not done until GO)
1. Sample frames across the WHOLE timeline and READ them (Read tool). Every real
   defect so far was invisible in logs: below-the-fold answer, wrong agent, MFA
   screen with tenant UPN, PII sidebar, letterbox, lingering tooltip.
2. Trim the head to the first clean-rail, tooltip-free frame (auth/redirect and
   sidebar-collapse frames must go). `ffmpeg -ss T -i take.webm -c:v libx264
   -preset slow -crf 18 -pix_fmt yuv420p -movflags +faststart out.mp4`.
3. `python3 director/qa_gate.py <film> --no-audio-required [--transcript t.json]`.
   - `blank-frozen-spans` NO-GO → dead-time compression: cut each flagged span
     keeping first 1.5s (`select='not(between(t,a,b)+…)',setpts=N/FRAME_RATE/TB`),
     re-gate (≤3 rounds). Alternative for a static tail: 8s zoompan push-in outro.
   - If a transcript is supplied and cuts shorten the film, remap turn timestamps
     through the cutlist (t' = t − cut_time_before_t) into `*_edited.json` — the
     gate binds film duration to the transcript timeline by design.
4. Deliverable: `director/dist/<Agent>_Location_v<N>.mp4` (dist/ is gitignored —
   films stay local). Commit ONLY `director/qa/<slug>/EVIDENCE.md` evidence.
   If the repo requires an org token to push, push with that token explicitly —
   never a plain push under the wrong account.
5. Open the film for Kody (`open <film>`), report which frames you actually read.

## Known traps (each cost a take)
- Global "New chat" ⇒ wrong agent. Deep-link re-goto instead + subject gate.
- No scroll-follow ⇒ money answer streams below the fold, never on camera.
- Warm-profile relaunch may still re-MFA (Conditional Access) — warn Kody.
- M365 recent-prompts dropdown may flash earlier take questions (benign, no PII).
- Co-sessions may hold the repo: check `git status` before editing shared files;
  own only your files; single commit at the end; token-push, never plain push.

<!-- toaster:generated:begin -->

## Parameters

The typed contract this capability answers to (JSON Schema — the deterministic layer):

```json
{
  "properties": {
    "film": {
      "description": "Derived from `<film>` used in the documented command at line 63.",
      "type": "string"
    }
  },
  "required": [],
  "type": "object"
}
```

<!-- toaster:generated:end -->

<!-- toaster:generated:begin -->

## Run this — do not improvise

This capability's deterministic implementation is a RAPP single-file agent, linked beside this file as `film_m365_agent.py` and embedded as the fenced Python below (sha256 267e4ae3a8057975…; a byte-exact copy is also vaulted in the capsule comment at the end of this file). On a host with sandbox execution, run the linked file directly — if it is missing, write the fence contents verbatim to `film_m365_agent.py` first:

```bash
python3 film_m365_agent.py '{"key": "value"}'      # arguments as one JSON object
echo '{"key": "value"}' | python3 film_m365_agent.py   # or on stdin
python3 film_m365_agent.py --tool                      # emit the JSON tool contract
```

Treat stdout as a tool result. If it reports missing or unresolved inputs, stop and collect them. If it returns `steps`, execute those steps in order exactly as returned; if it returns `instructions`, follow them with the supplied inputs. Otherwise use the result verbatim. Do not invent behavior beyond that output. On a host without code execution, treat the Parameters schema and the code below as the exact specification and never paraphrase a step. Never edit inside the generated markers; a converter-equipped host can instead restore the original file checksum-verified with the installed `rapp-agent-converter/scripts/toast.py convert SKILL.md --to agent`.

```python  # rapp:deterministic
"""FilmM365 -- Film a Copilot Studio agent in the REAL M365 Copilot surface — the ONLY sanctioned way to make agent demo videos. Playwright drives a dedicated authed Chrome profile, records the page via CDP (no screen capture, no desktop takeover), then trims, dead-time-compresses, and gate-verifies to GO. Use when Kody says "film <agent>", "make a video of <use case>", "location shoot", or any ask for an agent demo video. NEVER use the synthetic stage — qa_gate blocks it (synthetic-stage check).

Generated by the rapp skill from film-m365. The RCI capsule at the bottom of this file carries the full original; `toast.py convert` restores it byte-exact."""

import json
import re
import sys

try:
    from agents.basic_agent import BasicAgent
except ImportError:  # running OUTSIDE the brainstem -- stay executable anyway.
    class BasicAgent:  # noqa: D101 - minimal stand-in, same contract
        def __init__(self, name=None, metadata=None):
            if name:
                self.name = name
            if metadata:
                self.metadata = metadata

        def perform(self, **kwargs):
            return "Not implemented."

        def system_context(self):
            return None

        def to_tool(self):
            return {"type": "function", "function": {
                "name": self.name,
                "description": self.metadata.get("description", ""),
                "parameters": self.metadata.get("parameters", {})}}

# The procedural layer, verbatim from the source capability. The brainstem
# returns this to the model, so the skill's instructions still drive behaviour
# -- now behind a typed, deterministic tool contract.
INSTRUCTIONS = '# Film an agent in real M365 Copilot\n\nThe one sanctioned path for agent demo videos (Kody's ruling 2026-07-16: staged\nrenders "look junky"; `director/qa_gate.py` NO-GOs them via the `synthetic-stage`\ncheck). Proven end-to-end on a full location shoot (GO).\n\nWork repo: your agent project repo (= $REPO). Python: `$REPO/.venv-local/bin/python`\n(has Playwright). Reference scripts from the proven shoot (copy + adapt; treat as\nthe canonical implementation): `auth_bootstrap.py`, `film_take_v3.py`,\n`gate_and_tighten.sh`, `postprod.sh` from a prior shoot's scratchpad. If gone,\nrebuild from the spec below (it is complete).\n\n## 0. Preconditions (fail fast, in order)\n1. **Agent reachable in M365 Copilot**: published in Copilot Studio with\n   **Authenticate with Microsoft** (Dataverse `bots.authenticationmode = 2` — mode 1\n   breaks connected-agent calls AND the M365 channel), Teams+M365 channel added,\n   agent added from the store for the filming account. Orchestrator + ALL child\n   agents must share the same auth mode (`ConnectedAgentAuthMismatch` otherwise).\n   Republish order: children first, orchestrator last.\n2. **One-screen answer rule** in the agent's instructions (Kody's law): responses\n   ≤ ~100 words / one viewport. Patch instructions via Dataverse PATCH + PvaPublish,\n   save prestate sha256, wait ~90s, REVERT after the shoot (prestate sha must match).\n3. **Dedicated browser profile** at `~/.rapp-director/chrome-profile` (mode 700).\n   If stale/absent: run the auth bootstrap (headed Playwright, real Chrome channel,\n   agent deep-link) and have KODY do the passkey/MFA sign-in — never touch\n   credentials yourself; Authenticator number-match prompts may hit his phone on\n   relaunches. Session persists; warm relaunches usually skip MFA.\n4. Agent deep-link: `https://m365.cloud.microsoft/chat/agent/<titleId-pair>?titleId=…`\n   (from Copilot Studio's "See agent in Microsoft 365" link).\n\n## 1. The take (single Playwright script, CDP video — desktop stays Kody's)\n- `launch_persistent_context(profile, channel="chrome", headless=False,\n  viewport=1728x1117, device_scale_factor=2, record_video_dir=…,\n  record_video_size=3456x2234, args=[--disable-blink-features=AutomationControlled,\n  --disable-backgrounding-occluded-windows])`. Do NOT force --window-size/position\n  (causes gray letterbox band).\n- goto deep-link → wait for composer `[aria-label*="Message"], [placeholder*="Message"]`.\n- **Fresh chat**: if main innerText > 400 chars, `goto` the deep-link again.\n  NEVER click the global "New chat" — it silently drops you into vanilla Copilot\n  (the take-2 wrong-subject failure).\n- **SUBJECT-IDENTITY GATE (mandatory)**: abort unless the composer placeholder\n  names the agent (`[placeholder*="<Agent Name>"]`). Never film without it.\n- **Collapse the nav sidebar** (PII: agent list, chat history, account name):\n  `button[aria-label*="ollapse navigation"]`. The hover tooltip ("Expand navigation")\n  lingers until the next mouse move — trim covers it.\n- Per question: click composer → `page.keyboard.type(q, delay≈65)` → Enter →\n  **scroll-follow while streaming** (`page.mouse.move(864,480)` +\n  `page.mouse.wheel(0,900)` every ~2.2s) → settle = main innerText length stable\n  3 consecutive samples. Questions carry the one-screen constraint implicitly via\n  the patched instructions; keep them demo-grade (a "what can you do" + one\n  end-to-end scenario walkthrough).\n- **Outro**: wheel to top, then ~18 × wheel(0,420) at 0.75s — slow pan through the\n  whole conversation. Hold 4.5s. Close context (flushes video webm).\n- Save DOM screenshots + main innerText transcript per question for QA/report.\n\n## 2. Post + QA gate (the film is not done until GO)\n1. Sample frames across the WHOLE timeline and READ them (Read tool). Every real\n   defect so far was invisible in logs: below-the-fold answer, wrong agent, MFA\n   screen with tenant UPN, PII sidebar, letterbox, lingering tooltip.\n2. Trim the head to the first clean-rail, tooltip-free frame (auth/redirect and\n   sidebar-collapse frames must go). `ffmpeg -ss T -i take.webm -c:v libx264\n   -preset slow -crf 18 -pix_fmt yuv420p -movflags +faststart out.mp4`.\n3. `python3 director/qa_gate.py <film> --no-audio-required [--transcript t.json]`.\n   - `blank-frozen-spans` NO-GO → dead-time compression: cut each flagged span\n     keeping first 1.5s (`select='not(between(t,a,b)+…)',setpts=N/FRAME_RATE/TB`),\n     re-gate (≤3 rounds). Alternative for a static tail: 8s zoompan push-in outro.\n   - If a transcript is supplied and cuts shorten the film, remap turn timestamps\n     through the cutlist (t' = t − cut_time_before_t) into `*_edited.json` — the\n     gate binds film duration to the transcript timeline by design.\n4. Deliverable: `director/dist/<Agent>_Location_v<N>.mp4` (dist/ is gitignored —\n   films stay local). Commit ONLY `director/qa/<slug>/EVIDENCE.md` evidence.\n   If the repo requires an org token to push, push with that token explicitly —\n   never a plain push under the wrong account.\n5. Open the film for Kody (`open <film>`), report which frames you actually read.\n\n## Known traps (each cost a take)\n- Global "New chat" ⇒ wrong agent. Deep-link re-goto instead + subject gate.\n- No scroll-follow ⇒ money answer streams below the fold, never on camera.\n- Warm-profile relaunch may still re-MFA (Conditional Access) — warn Kody.\n- M365 recent-prompts dropdown may flash earlier take questions (benign, no PII).\n- Co-sessions may hold the repo: check `git status` before editing shared files;\n  own only your files; single commit at the end; token-push, never plain push.'

# Ordered commands lifted verbatim from the capability's own documentation.
STEPS = [
    {
        "cmd": "python3 director/qa_gate.py <film> --no-audio-required [--transcript t.json]",
        "line": 63
    },
    {
        "cmd": "open <film>",
        "line": 74
    },
    {
        "cmd": "git status",
        "line": 81
    }
]


class FilmM365Agent(BasicAgent):
    def __init__(self):
        self.name = 'FilmM365'
        self.metadata = {
        "name": "FilmM365",
        "description": "Film a Copilot Studio agent in the REAL M365 Copilot surface \u2014 the ONLY sanctioned way to make agent demo videos. Playwright drives a dedicated authed Chrome profile, records the page via CDP (no screen capture, no desktop takeover), then trims, dead-time-compresses, and gate-verifies to GO. Use when Kody says \"film <agent>\", \"make a video of <use case>\", \"location shoot\", or any ask for an agent demo video. NEVER use the synthetic stage \u2014 qa_gate blocks it (synthetic-stage check).",
        "parameters": {
                "properties": {
                        "film": {
                                "description": "Derived from `<film>` used in the documented command at line 63.",
                                "type": "string"
                        }
                },
                "required": [],
                "type": "object"
        }
        }
        super().__init__(name=self.name, metadata=self.metadata)

    def perform(self, **kwargs):  # toaster:generated-perform
        missing = [k for k in self.metadata["parameters"].get("required", [])
                   if k not in kwargs]
        if missing:
            return json.dumps({"status": "error",
                               "missing_required": missing}, indent=2)
        resolved, unresolved = [], set()
        for step in STEPS:
            cmd = step["cmd"]
            for key, value in kwargs.items():
                for token in ("<" + key.replace("_", "-") + ">",
                              "<" + key + ">",
                              "{{" + key + "}}",
                              "$" + key.upper()):
                    cmd = cmd.replace(token, str(value))
            for leftover in re.findall(r"<[a-zA-Z][a-zA-Z0-9 _.-]{1,40}>", cmd):
                unresolved.add(leftover)
            resolved.append(cmd)
        return json.dumps({"status": "ok",
                           "steps": resolved,
                           "unresolved_placeholders": sorted(unresolved),
                           "note": "Resolved deterministically by the agent; "
                                   "run in order. Nothing was executed here."},
                          indent=2)

if __name__ == "__main__":
    # Standalone entry point: the deterministic layer runs with NO brainstem,
    # no framework, no install. This is what lets a "simple SKILL.md" platform
    # keep real determinism -- the host model shells out to this file instead
    # of improvising the procedure in prose.
    #     echo '{"arg": "value"}' | python3 film_m365_agent.py
    #     python3 film_m365_agent.py '{"arg": "value"}'
    #     python3 film_m365_agent.py --tool          # emit the JSON tool contract
    _a = sys.argv[1:]
    if _a and _a[0] == "--tool":
        print(json.dumps(FilmM365Agent().to_tool(), indent=2))
    else:
        _raw = _a[0] if _a else (sys.stdin.read().strip() or "{}")
        print(FilmM365Agent().perform(**json.loads(_raw)))

# rci-capsule:v1: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
```

<!-- toaster:generated:end -->

<!-- rci-capsule:v1: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

…(truncated)
