What's New in M365 Copilot — Monthly Pack Playbook¶
Deep playbook for the
whats-new-copilot-packskill (~/.copilot/skills/whats-new-copilot-pack/). Read the SKILL.md for the operational steps; read this for the why behind every design + engineering decision, and for the QA discipline. Born 25 Jun 2026 building the first (June 2026) pack. Expanded 22 Jul 2026 with the blog/screenshot pipeline, revised 24 Jul 2026 with the complete July pack retrospective + August fast path, then revised 31 Jul 2026 with the full-edition LinkedIn carousel workflow.Monthly production pipeline: research → blog (§9) → screenshots (§10, reused by the pack) → pack (§§1-7) → LinkedIn carousel. The blog is the content source for the pack; do it first and finalise it before building slides.
1. Origin & purpose¶
Shelly Blackley maintained the internal monthly "What's New & rolling out — Microsoft 365 Copilot" pack at Microsoft for two years. She left in June 2026; Sush picked up creating it going forward, public-facing under his own name on aguidetocloud.com. The brief evolved from "replicate Shelly's template" → "build a premium editorial monthly publication readers eagerly wait for."
The deck is generated programmatically with python-pptx from the month's blog recap (/blog/microsoft-365-copilot-<month>-2026-updates/). The design engine is stable, but the content module and hardcoded special slides change each month. The final July scripts are the current baseline.
2. Design philosophy¶
- Editorial, not a press release. It reads like a curated monthly magazine: cover with "Inside this issue", an editor's note, a dashboard, sections, a closing.
- Two-panel rhythm. Every content slide = LEFT white text column / RIGHT ivory notebook-grid panel (screenshots or designed visuals). Boundary at x = 4.975".
- Restraint = premium. Muted ink/navy/brass on warm ivory paper; soft shadows for depth; small status pills. Editor's picks are impact-based — at most one per major content section when they genuinely help navigation. Earlier "stripped bare" and "busy/funky" iterations were both rejected — the landing zone is crafted but quiet.
- Every element earns its place. No masthead strip, no logo clutter, no kicker noise, no footer cruft. (These were explicitly removed during iteration.)
- Sush's voice throughout. Humble curious-intern, plain English, no jargon, no brag. A "Why it matters" note in his voice on every feature and section.
3. Design DNA (the non-negotiables)¶
| Element | Value |
|---|---|
| Slide | 13.333"×7.5" (16:9), rendered 1280×720 |
| Palette | ink #1B1B1B · paper #F4EFE3 · navy #22385C · brass #A6824C · card #FDFBF6 · hairline #E4DFD3 |
| Fonts | Segoe UI Semibold (titles) · Segoe UI (body 11pt) · Ink Free (handwritten "Why it matters" + "— Sush") |
| Fixed anchors | title 0.5" · why-card 3.45" · do-next 5.82" · links 6.92" → identical alignment on every feature slide |
| Panel | full-bleed grid-panel.png (ivory + faint notebook lines) gives subtle depth under screenshots |
| Pills | small; filled navy = GA/Available, outline = Rolling out/Preview |
4. Technical architecture¶
build_pack_<month>.py CONTENT (changes monthly) → imports the engine, defines the data, saves+cleans
└─ deckbuild.py template load · _new_slide · text helpers · estimate_title_lines (size-aware) ·
│ est_body11 · new_deck (strips slides + sections) · set_core_props · clean_app_xml
└─ premium.py base helpers: P.ASSETS, card(), fit_in_box()
└─ premium4.py crafted engine + hardcoded cover: feature4, cover4, why_card, place_framed, add_shadow,
│ small_pill, navy_links, page_number, fixed anchors, palette
└─ premium4_slides.py hardcoded monthly special slides: editor4, dashboard4, opener4, matrix4, whatchanged4,
roundup4, divider4, closing4, feature_visual + vis_* designed visuals
New-Object -ComObject PowerPoint.Application → .Slides.Item(i).Export(png,"PNG",1280,720)). python-pptx's thumbnail.py fails on Windows (AF_UNIX). Render time scales with the issue; July's 46 slides remained practical.
- Blank template (assets/template_blank.pptx, 70 KB) = Shelly's template with all content slides stripped (master + layouts only; layout "3-Item-Template" carries the panel). Avoids bundling her content + keeps the skill tiny. Verified to produce pixel-identical output to building from the full template.
- Engine paths are env-overridable: WNP_TEMPLATE, WNP_ASSETS, WNP_OUT.
5. Gotchas (every one cost real debugging — don't relearn them)¶
- Title overflow / title-touching-body is the recurring bug CLASS. Root cause (found 25 Jun):
estimate_title_linesmeasured at a 24pt-calibrated font, but titles render at 27pt (features) / 28pt (dividers). Long titles were under-counted as 1 line →body_yplaced too high → title and body touched (e.g. "The Work IQ APIs are GA"). Fix: the estimator is now size-aware (size=param scales the measured width); every caller passes its true render size. This prevents the whole class for all future months. If a title still wraps to 3 lines (e.g. "Copilot inside model-driven Power Apps"), shorten the title ("inside"→"in") — don't shrink the font. - PowerPoint sections leak from the template. "Default Section" / "Microsoft 365 Copilot" / "ADMIN" showed in the slide pane.
deckbuild.strip_sections()removes thep14:sectionLstext innew_deck(). - Stale metadata. The template carried
dc:creator = Shelly Blackley, revision 96, and anapp.xmlclaiming 44 slides + May titles + a 4349-min edit timer.set_core_props()(author=Susanth Sutheesh, title, revision 1, fresh dates) +clean_app_xml()(minimal app.xml, correct slide count) run at save. - Unsaved-edits quirk. If the user has the pptx open in PowerPoint: COM render shows their unsaved edits, but python-pptx reads stale disk (measure intent from renders). And
Copy-Itemto an open file fails ("being used by another process") → deliver under a fresh versioned name (...PREMIUM v2/v3/v4.pptx). - Multiple images per feature →
place_framedlays them side-by-side / in a grid to fill the panel, not squished. Single thin/portrait shots inherently leave some panel space — acceptable (matches Shelly's original). - Screenshot bleed. Source screenshots can include faint background content past the UI element (e.g. the Claude model-picker had chat letters bleeding outside the dropdown). Crop to the actual UI card with PIL before placing.
- Chrome vs month assets.
m365-logo.png+grid-panel.pngare reusable (skillassets/chrome/); the QR is per-month (encodes that month's blog URL — regenerate); screenshots are per-month. All live together in the month'sWNP_ASSETSfolder at build time.
6. QA discipline (paid-quality, customer-facing surface)¶
- Vision-QA every screenshot (Rule #8). Open each with the
viewtool, write a one-line observation of what's literally pictured, confirm it matches its section. Filenames lie; text-only agents can't see images. - Fresh-eyes subagent over every rendered slide. You've stared at the code — a subagent finds what you can't. Priority: title touching/over the 4.975 boundary, title↔body gap, body hidden behind the fixed Why-card, weak screenshot crops, thin left columns, overlaps, page numbers and alignment consistency. Then re-render fixed slides and re-verify (one fix often spawns another).
- SME fact-check (background
researchagent). Verify every product name, roadmap ID, GA status, and factual claim against Microsoft Learn release notes (GA source of truth — roadmap status lags) + the roadmap. Customer-facing content under Sush's name = accuracy matters. - Privacy pass. Blur colleague identities in any shared screenshot (keep Sush's own name). Flag "INTERNAL" badges for a keep/clone-out decision before customer use.
7. Monthly workflow (short form)¶
gather blog + screenshots + fresh QR → copy the latest proven month reference → swap MONTH/ISSUE/BLOG + special slides + feature/roundup data → set WNP_* env → build → COM-render every slide → vision-QA + fresh-eyes subagent + SME fact-check → fix/re-verify → deliver to Downloads under a fresh name.
8. June 2026 first-issue facts¶
17 features + 4 roundups; editor's note pairs with a blurred colleague Teams note; Cowork = editor's pick; dashboard shows 2026-so-far + June; closing QR → the June blog. Actual reference deck = 33 slides, including the public disclaimer slide (the early docs incorrectly said 32). First pack built + shipped 25 Jun 2026.
9. The blog phase (the pack's content source) — added 22 Jul 2026¶
The monthly recap blog comes first; the pack is built from it. File: aguidetocloud-revamp/content/blog/microsoft-365-copilot-<month>-2026-updates.md.
- Mirror the previous month's blog exactly as the template. Open last month's
.mdside-by-side and match structure, frontmatter shape, section rhythm, FAQ, founder_note. Consistency = the monthly-publication feel. - Research sources (run in parallel):
- M365 Copilot release notes on Microsoft Learn = GA source of truth. Published in ~2 batches/month (~1st and ~15th) — cover both. Roadmap status lags the notes; when they disagree, trust the notes.
- M365 roadmap (roadmap site / API) — for feature IDs to cite (
📖 Roadmap NNNNNN). - WorkIQ sweep — ask "what's new in Microsoft 365 Copilot this month" to catch anything the notes buried (EULA must be accepted once; get user OK).
- Official Tech Community monthly roundup from the
Microsoft365CopilotBlogboard — a separate mandatory source gate below, not covered by a generic "blogs" search. - Other Microsoft blogs (
microsoft.com/microsoft-365/blog+ individual Tech Community launch posts) for GA-day announcements and reusable official infographics. - Pricing/licensing: use the official Microsoft pricing page for list price, then a scoped Partner Center announcement for channel/eligibility/promo dates. Every number says USD + billing/term/seat scope.
Official monthly-roundup source gate — mandatory from August 2026¶
The official "What's New in Microsoft 365 Copilot |
Discovery — current month + previous two months¶
Use all three methods; one empty search is not proof:
- Exact web search:
site:techcommunity.microsoft.com/blog/microsoft365copilotblog "What's New in Microsoft 365 Copilot" "<Month Year>". - Inspect the official Microsoft 365 Copilot Blog board.
- Ask Work IQ whether a true official monthly roundup exists; distinguish it from internal/community decks and single-feature announcements.
For each month, record: URL · title · published date · modified date · retrieval timestamp · FOUND / NOT_YET_PUBLISHED.
If the current-month roundup is not published yet: do not invent a URL and do not block forever. Record NOT_YET_PUBLISHED, continue with the other official sources, then recheck at:
- month-end;
- +7 days;
- +14 days;
- the next monthly recap run.
If the page's modified date changes, rerun the diff. June's article was published 30 June and revised 14 July — a one-time scrape would still have missed later additions.
Semantic source matrix — blocking content gate¶
Extract every capability as an atomic row. Split rows when the product surface, actor, rollout timing or action differs (for example: Cowork creates visuals and Cowork uses branded PowerPoint templates are two capabilities).
Required columns:
source month · app/surface · capability · actor · rollout month/status · source URL · FULL/PARTIAL/HORIZON_ONLY/ABSENT · blog disposition · blog location · defer/out-of-scope reason
Definitions:
FULL— same capability, surface, actor and timing are materially covered.PARTIAL— the exact item is present but a material detail is missing.HORIZON_ONLY— named only as future/watchlist; this does not count as delivered coverage.ABSENT— not materially covered. Adjacent use of the same word in another app does not count.
Do not lock the blog or start the pack until every row is dispositioned as:
- included now;
- explicitly deferred to a labelled catch-up;
- out of scope, with a reason.
Month purity + late catch-up¶
- Never silently relabel a June feature as an August launch.
- A late official roundup may feed:
- the correct prior-month recap via a staged backpatch; or
- a clearly labelled "Late catch-up from Microsoft's official monthly roundup" block in the next issue when the item remains useful.
- The current issue still leads with genuinely current releases. Catch-up is a small reconciliation layer, not permission to dump every older bullet into the new month.
Official-image harvest¶
Extract every image URL + Microsoft alt text from the roundup into the issue's image inventory. For every candidate:
source URL · Microsoft-owned proof · literal pixel observation · intended section · USE/SKIP reason · tenant-variance caption
Rule #8 still applies: open the pixels with view; filenames and alt text are not vision QA. Reuse only Microsoft-owned imagery or Sush's demo-tenant captures.
July 2026 audit — why this gate exists¶
- Sush's June recap published 24 June.
- Microsoft's June roundup published 30 June, then changed 14 July.
- The official post contained 42 atomic capabilities and 30 images.
- Strict exact-surface comparison across Sush's June + July recaps: 8 FULL · 1 PARTIAL · 5 HORIZON_ONLY · 28 ABSENT.
- This is not a quality ranking: Sush's recaps also covered many important updates absent from Microsoft's post. It proves the late official roundup held a large different set of app-level details that needed reconciliation.
-
As of 24 July 2026, no official July monthly roundup could be verified after exact web search, official-board inspection and Work IQ search. Status:
NOT_YET_PUBLISHED; recheck at month-end, +7, +14 and during the August run. -
Scope defaults Sush picked: include every material numbered update rather than targeting an arbitrary count; licensing/pricing mid-list; cover through the latest available release-notes batch; text-first (screenshots added after copy is locked).
- Feature block shape:
## N. <title>·*For: <product> · <platforms>*italic line · body · a<blockquote class="callout callout-tip">💡 <strong>Why it matters:</strong>…</blockquote>in Sush's voice ·📖 [Roadmap NNNNNN](…)links. Then Agents roundup · Admin roundup · On-the-horizon · FAQ. ~5-6k words. - Validation gates (all must pass, staged only):
node scripts/check-blog-html.mjs→ 0 errors; SEO (title ≤60, description ≤155, validog_glyph, OG image exists on disk —npm run build:og:blogif missing); Hugo viapwsh scripts\hugo-safe.ps1(never barehugo). Generate the OG image. - SME fact-check = background
researchagent verifying every roadmap ID + product name + GA status vs the release notes. Real July fixes: dropped an unverifiable UI detail, corrected a model "For:" line, removed a horizon item that turned out to be a prior-month GA. Precision > volume. - 🔴 STAGED, NOT LIVE until Sush signs off after multiple quality reviews (Rule #14). Don't deploy the recap the moment it builds.
10. Capturing real screenshots from a demo/lab tenant — added 22 Jul 2026¶
Real product shots from a Microsoft demo tenant (Contoso/Zava demo data — nothing confidential) beat official marketing images. Two modes:
A. Manual (Sush captures): he shoots on his signed-in tenant → dumps PNG in C:\Users\ssutheesh\Downloads\ → I view (Rule #8), convert to webp, place. Give him a per-feature Downloads\<month>-shots\_CAPTURE-GUIDE.md + the exact demo prompts (below) so he knows precisely what to shoot.
B. Automated (Playwright over CDP) — for features I can drive myself:
- Edge persistent profile at <session>/files/edge-lab-profile, launched with --remote-debugging-port=9222. SSO caches in the profile → sign in once, reuse across sessions.
- Connect Playwright chromium via CDP at http://127.0.0.1:9222 — NOT localhost (resolves to IPv6 ::1 → refuses). Chromium binary from aguidetocloud-revamp/node_modules/playwright.
- Reusable helper <session>/files/_labhelp.cjs (connect / log / sh / settle). Account-picker → click the tenant-admin tile.
- ⚠️ NEVER call browser.close() over CDP — it kills the whole browser. Keep it running detached. Close spare tabs via http://127.0.0.1:9222/json/close/{id}. Office web apps (Word/PPT) are CPU-heavy and bog CDP down with many tabs open.
- Lab tenant = an M365 Copilot (Premium) demo tenant with admin creds, no MFA. Creds live with Sush — ask him to paste if the profile signs out.
🔴 Rule #8 filename trap (cost time twice in July — now a permanent user memory): the screen-capture tool (Greenshot) names files with the WRONG/stale window title. NEVER judge a shot by filename — always view the pixels. A file named "…Tam Bagnall…Teams.png" was actually a clean PowerPoint Work IQ output deck.
Capturability reality (what a demo tenant can / can't show): - ✅ Chat/Cowork model picker, Outlook Chat, PPT Agent Mode (prompt-driven, Agent Mode is Windows-desktop), image-model picker, Search-by-department, admin center (Prompts for Contoso, Agent Store, DLP/Copilot Control System), Chat image gen / brand kit. - ❌ Not yet rolled out to the tenant (July: Notebooks→Office quick-create + mind maps — the new-notebook menu only had "New Page"). Confirm 2× before marking CANT. - ❌ iPhone/iOS-only (multimodal capture, iOS action button/Siri) → Sush captures on device. - ❌ Needs a special role/license (Viva Copilot Dashboard analyst view, Viva Glint) → usually inaccessible in a lab. - 📝 Text-only (sensitivity-label inheritance behaviour, pricing/SKUs) → no clean product UI; leave as text.
Conventions: lab-NN-desc.webp (tenant) / official-NN-desc.webp (MS official). Convert: Image.open(src).convert('RGB').save(dest,'WEBP',quality=88,method=6). Place with the standard block: <p><img src="/images/blog/copilot-<month>-2026/…" alt="…" loading="lazy" style="max-width:100%;border:1px solid var(--border);border-radius:var(--radius-md);margin:var(--space-4) 0;" /></p>. Input+output pairs read well (prompt shot + result shot).
Model-name nuance: the release-note name may differ from the live tenant picker (July: notes said "MAI-Image-2-Efficient"; tenant showed "MAI Image 2.5 Flash / Flux.2 Flex / GPT-Image"). Keep the release-note fact AND describe what the picker shows — honest to both.
Reusable demo prompts (trigger a feature so it can be captured):
| Feature | Prompt / action |
|---|---|
| Open file in Chat | "Summarise the Office Move Plan and list the key dates" → click the cited file → opens in the side pane |
| Outlook whole-inbox | "Summarize the latest updates about <topic> across my whole inbox, and list any action items." |
| PPT Agent Mode / Work IQ | "Create a presentation about <topic> using my recent files, meetings and emails." |
| Teams → deck | "create a deck from my Teams meeting about <topic> using the style of this presentation." |
| Reuse existing deck | attach a deck → "…using the style of this presentation." |
| Image model in PPT | "add an image of <x> to this slide" → open the Auto model dropdown |
| Search by department | "people in <Dept> department." |
| Word Audio Overview | Word web → Audio Overview → generate → ask a question while it plays |
| Brand kit from doc | upload a brand-guidelines doc → "Create a brand kit from this document." |
| Scheduled prompt | Chat → an agent → schedule a recurring prompt ("every Monday 9am summarise my week") |
11. Red-box annotation — make the "what's new" pop — added 22 Jul 2026¶
Busy screenshots hide the point. Draw a red rounded-rectangle around the ONE key detail (the new model name, the "whole inbox" phrase, the referenced deck, the department query). Matches Sush's demo-design red-callout convention (red = deliberate "look here"; never for structural chrome). In July this made 7 shots instantly legible.
- PIL:
ImageDraw.Draw(im).rounded_rectangle([x0,y0,x1,y1], radius=8, outline=(220,30,30), width=4). - Get real dims first (
Image.open(p).size) — theviewtool renders at native res, so coords you read off a viewed image map ~1:1 to pixels. Estimate the box, then verify + adjust. - Always save a clean backup (
*.clean.webpin<session>/files/lab-shots/clean-backups/) before overwriting, so a box can be repositioned. - Verify after (Rule #8):
viewthe annotated image; nudge coords if it clips or misses. Mention the highlight in the alt text. - Annotate in-place (same webp filename) → no blog markdown edit needed. For prompt shots, box the referenced phrase (e.g. underline/box "from my Teams meeting about the office move").
12. July 2026 issue facts¶
Final blog¶
- 31 numbered sections + Agents roundup + Admin roundup + On the horizon + FAQ.
- 38 placed images after fresh-eyes cleanup: 7 misleading/weak/unused shots stayed uncommitted.
- Mixed image sources: Sush's demo tenant + official Microsoft product imagery. Visible global note says tenant UI/availability may differ by rollout.
- Three editorial picks: Notebooks (headlines), MCP agents in Office + Catalyst (Agents), company-wide Prompt Gallery publishing (Admin).
- Company-wide prompts are an Admin/governance feature. Agents content closes after #22 Sales Agent; Agents roundup appears before #23.
- LIVE 24 Jul 2026, commit
4faded47; desktop/mobile 0 overflow, 38/38 images 200, OG/listing/practice/smoke green.
Final pack¶
- Sush explicitly chose all 31 numbered sections — no trimming.
- Final shape = 46 slides:
- 6 front matter
- 4 dividers
- 31 numbered feature slides
- 3 roundup/watchlist slides
- closing
- public disclaimer
- Slide-count formula for the full edition: N numbered features + 15. For July:
31 + 15 = 46. - Final shared file:
Downloads\Whats New in M365 Copilot - July 2026.pptx(byte-identical to the v9 copy; SHA-256D2797FAD...F5F3). - 3 editor's picks: Notebooks (slide 9), MCP agents (28), company-wide prompts (33).
- Every screenshot slide carries: "Demo tenant or official Microsoft imagery · UI and availability may vary by tenant and rollout."
- Final disclaimer slide covers own opinions, public sources, demo/official imagery, no customer data, and tenant/rollout variance.
Final LinkedIn carousel¶
- Final shape = 33 portrait cards: cover + all 31 numbered updates in blog order + closing.
- Full-edition formula: N numbered updates + 2.
- Output = 1080×1350 design, rendered at 2160×2700 for a crisp PDF.
- Final shared file:
Downloads\AGTC-Whats-New-July-2026-LinkedIn-Carousel-v2.pdf— 33 pages, 10.8 MB. - The carousel reused the final pack builder as structured content instead of manually re-authoring all 31 updates.
- Microsoft's official July monthly roundup was still
NOT_YET_PUBLISHEDat the 31 Jul month-end recheck; the live blog + final v9 pack remained the approved source. - LinkedIn state: ready for Sush to upload as a document post; not posted by Atlas.
Final facts that changed late¶
- OpenAI-operated models became tenant-controlled/auto-enabled for eligible commercial tenants on 24 Jul unless admins choose No users.
- Capture requires Microsoft 365 Copilot + commercial work/school account + active SharePoint/OneDrive licensing; Windows Capture is Office Insiders Beta.
- MCP agents include Catalyst as well as Word, Excel, PowerPoint and Outlook.
- Agent 365 Block-mode real-time protection rules must be redefined at cutover.
- Copilot Business promotions: Partner Center (updated 23 Jul) confirms standalone + Business Basic bundle through 31 Dec 2026. The generic Sep footnote is a different Copilot offer.
- Every price must say USD and include term/billing/seat scope beside the number.
13. July tuition — mistakes to never repay¶
| What cost time | Root cause | Permanent fix |
|---|---|---|
| Started from "32 slides / 15–17 features" | Skill docs described June's curated intent, not Sush's July full-edition preference | Default to full edition / all numbered sections unless Sush explicitly asks to curate |
| June reference said 33 while docs said 32 | Disclaimer slide wasn't counted | Count the actual reference PPTX before planning; formula = N + 15 for full edition |
| July cover/front matter still said June | cover4, editor4, dashboard4, opener4, matrix4, whatchanged4, closing4 are hardcoded across 2 engine files |
Patch three surfaces before feature authoring: content module + premium4.py cover + premium4_slides.py specials |
| Special slides had invented annual stats | Dashboard examples encouraged unsupported running totals | Use only counts provable from the issue: numbered updates, roundups, actions, picks, status counts |
| Long model/pricing body disappeared behind Why-card | Fixed body/Why anchors + copy too long; renderer clips silently | If body approaches Why-card, shorten copy. Never move the anchors or shrink below 11pt |
| Right panels looked empty | Raw screenshots had whitespace or two mismatched aspect ratios | Crop to the UI card; create a vertical composite for related images; verify at 1280×720 |
| Cursor/background clutter | Screenshots captured transient cursor/toast background | Make deck-only clean crops; never alter meaning, only empty surrounding pixels |
| Watermark setting unreadable | Full-window image preserved too much dim context | Crop to the exact control if the section is about one setting |
| Roadmap tags wrapped | Tag column fixed at 1.35" | vis_cards(..., tag_w=...); use 1.85" for detailed Preview/GA labels |
| Pricing dates looked contradictory | Generic pricing footnote and SMB Partner Center offer were different scopes | Resolve pricing by product + channel + eligibility, not date alone |
| Company-wide prompts sat in Agents | Blog order and divider placement were treated as classification | Agents closes after Sales; Prompt Gallery publishing starts Admin |
| One issue-wide editor pick wasn't enough | Full edition needs navigation inside each large section | Up to one meaningful pick per major content section; never badge filler |
| Demo/official image provenance was implicit | Readers can mistake screenshots for universal tenant state | Blog-wide screenshot note + per-slide screenshot note + final disclaimer |
| First image QA passed but mobile overflow remained | Fixed max-width: Npx expanded the document on narrow screens |
For blog image caps: width:Npx;max-width:100%;height:auto;box-sizing:border-box |
Local main was hundreds of commits behind |
Dirty/stale umbrella worktree polluted build and cache guards | Deploy from a fresh clone of origin/main, overlay only referenced files, explicit-path commit |
| SEO workflow failed during July deploy | Pre-existing ROI page missing OG/long description; strict scan is whole-blog | Prove failure is baseline, keep July diff clean, verify Build/OG + live production + post-deploy smoke |
| Carousel copy contradicted its screenshot | The extractor kept only paragraph one; the model-name disclosure lived in paragraph two | Add a small explicit LEAD_OVERRIDES map and compare every rendered claim with the pixels |
| A correct scheduling screenshot looked expired | Its visible May/June dates made a July feature appear stale | Use a handwritten statement card when dates or rollout context weaken otherwise-correct proof |
| Carousel content was at risk of being authored twice | June's generator used a manual UPDATES list |
Extract feature4 + feature_visual records from the final pack builder; manually maintain only image decisions, pull-quotes and rare copy overrides |
Reference code preserved¶
The exact working July scripts are stored at:
~/.copilot/skills/whats-new-copilot-pack/scripts/reference_july_2026/
Contains: build_pack_july.py, deckbuild.py, premium.py, premium4.py, premium4_slides.py.
For August: copy this directory first. Do not start from the June worked example.
14. August fast path — target 90–120 minutes after blog/screenshots are locked¶
Gate 0 — don't start the deck early¶
The pack begins only when:
- Blog copy is SME-clean and section order is final.
- All numbered sections are known.
- Screenshot set is final and has a Rule #8 audit.
- Image source note (demo vs official) is decided.
Changing blog order after deck authoring creates double work in titles, anchors, page numbers, sections and carousel.
Step 1 — choose edition shape (2 minutes)¶
- Default for Sush: full edition.
slide count = numbered features + 15.- Curated edition only if Sush explicitly says to trim.
- Decide section boundaries before code:
- Headlines/user features
- Agents
- Admin/governance/security
- Horizon
Step 2 — copy latest reference (3 minutes)¶
Copy scripts/reference_july_2026/ to the session working folder.
Patch, in this order:
premium4.py— issue/month + cover highlights.premium4_slides.py— editor, dashboard, what-changed, opener, matrix, closing.build_pack_<month>.py— all numbered features, roundups, divider placement, links.
Run python -m py_compile before the first build.
Step 3 — assets (10–15 minutes)¶
- Parse image references from the final blog; convert only referenced webp files to PNG.
- Copy
m365-logo.png,grid-panel.png. - Generate a fresh month QR.
- Create deck-only crops/composites where needed; do not modify blog originals.
- Add the standard screenshot variance note through
place_framed.
Step 4 — author without re-researching (35–50 minutes)¶
- Deck mirrors the final blog.
- One numbered blog section = one feature slide in full edition.
- Feature copy:
- 1–2 short body paragraphs
- one Why-it-matters sentence
- optional Do next
- Microsoft source + blog deep-link
- Text-only feature → designed visual, never a fake screenshot.
- Admin classification is based on who acts, not on where the feature appeared in release notes.
Step 5 — first build + mechanical checks (10 minutes)¶
- Fresh versioned filename.
- Verify metadata, slide count, no sections, no stale month text.
- COM-render every slide at 1280×720.
- Generate contact sheets.
Step 6 — parallel QA (15–20 minutes)¶
Run together:
- Fresh-eyes visual agent over all rendered slides.
- SME/deck-to-blog research agent.
Fix deck divergence immediately. If the blog itself needs a fact update, update blog + deck together, then rerun blog gates.
Step 7 — one focused fix cycle (10–20 minutes)¶
Common fixes:
- Shorten clipped body text.
- Crop/compose weak right panels.
- Widen roundup tag column.
- Clarify pricing scope.
- Re-render only affected slides.
Then run one final all-slide fresh-eyes pass.
Step 8 — deliver¶
- Leave only the newest deck in Downloads; move intermediates to the session folder.
- Blog deploy and pack sharing are separate decisions.
- Never call blog LIVE until production URL + markers + images + mobile/desktop + smoke test are verified.
August kickoff line¶
Hey Atlas — build the August What's New pack. Read the final August blog, the monthly-pack playbook §14, and copy scripts/reference_july_2026 as the starting point. Full edition unless I say trim.
15. LinkedIn carousel fast path — added 31 Jul 2026¶
The carousel is a distribution layer, not a second editorial project. The blog owns the facts and order; the final pack builder already contains the concise title, status, lead and why-it-matters copy. Reuse that structure.
Gate 0 — recheck the official monthly roundup¶
Before carousel authoring, rerun the official-roundup discovery gate from §9.
- If a new official roundup appeared after the blog/pack locked, disposition its atomic capabilities before publishing the carousel.
- If it is still
NOT_YET_PUBLISHED, record the recheck date and continue from the approved live blog + final pack. - Never let a late official source silently create blog/pack/carousel divergence.
Step 1 — extract, do not retype¶
Execute the final build_pack_<month>.py against recorder stubs:
- Stub
deckbuild.new_deck, metadata and save calls. - Record each
premium4.feature4(...). - Record each
premium4_slides.feature_visual(...). - Track the current divider title as the section.
- Ignore front matter, roundups, closing and disclaimer.
- Assert the extracted count equals the blog's numbered-section count.
This gives one record per numbered update:
section · title · status · filled/outline pill · first body paragraph · why
Efficiency win: July extracted all 31 cards directly from the final v9 pack builder. No second 31-item content module.
Step 2 — keep only three small manual maps¶
| Map | Purpose |
|---|---|
IMAGE_BY_TITLE |
Pick one approved screenshot or None for a statement card |
PULLS |
Short handwritten line for statement cards |
LEAD_OVERRIDES |
Preserve a caveat/disclosure that the compact extractor would otherwise lose |
Use an override when:
- the screenshot's live UI label differs from the release-note name;
- paragraph two contains a licensing, region, pricing or rollout caveat needed to interpret paragraph one;
- the compact first paragraph becomes misleading without the omitted context.
Do not solve this by automatically adding every second paragraph. That makes most cards too dense.
Step 3 — screenshot decision gate¶
For every update, choose one:
- Screenshot card — the pixels directly prove the feature and remain current.
- Statement card — no clean image, the image is only adjacent/partial, or visible dates make it look stale.
Red flags:
- UI label contradicts the card copy.
- A schedule, expiry or rollout date predates the issue and dominates the image.
- The relevant control is unreadably small even after a truthful crop.
- The screenshot needs a long disclaimer to explain why it is only partial.
Under-representation is better than misleading proof.
Step 4 — build format¶
- 1080×1350 portrait card; render at 2× = 2160×2700.
- Full edition = cover + every numbered update in blog order + closing.
- Formula:
carousel pages = numbered updates + 2. - Reuse
scripts/carousel_build.pyfor CSS/HTML andcarousel_render.mjsfor Playwright rendering. - Deliver under a fresh versioned PDF name. If QA finds a blocker, create
v2; do not overwrite a possibly open file.
Step 5 — required QA stack¶
Run all five:
- Rule #8 source-image audit — open every used screenshot and write literal pixel observations.
- Contact sheets — four cards per sheet for rhythm, hierarchy and stale-month review.
- Fresh-eyes visual agent — every card; prioritize contradictory evidence, dated screenshots, clipping and weak crops.
- DOM QA — assert exact card count, sequential
01 / NNnumbering, 1080×1350 card boxes, no broken images, no previous-month text and no meaningful overflow. - PDF QA — page count equals rendered-card count, every PNG is 2160×2700, file remains below LinkedIn's document limit.
If a reviewer finds a blocker, prove it directly from the card/source pixels, fix it, and ask the same reviewer to recheck only the affected cards.
Step 6 — short LinkedIn caption¶
Apply the Voice Rule first: ask Sush which honest angle he wants.
Proven short shape:
- Service hook: "Every month I read every release note, roadmap update and official announcement — so you don't have to."
- State the update count.
- Give three useful picks as short bullets.
- Say the full month is in the carousel.
- Put the blog URL near the end.
- Use two relevant hashtags.
Upload the PDF as a LinkedIn document, not 33 separate images. Atlas drafts only; Sush posts.
Next-carousel kickoff line¶
Hey Atlas — build the <Month> What's New LinkedIn carousel. Read the final blog, use the final pack builder as the structured source, and follow the monthly-pack playbook §15. Full edition unless I say trim.