plugins/workiq-productivity/skills/planner-status-report/SKILL.md
Generates a Microsoft Planner status report for one plan, using task status, owners, dates, priorities, buckets, risks, wins, progress, upcoming commitments, and milestones.
npx skillsauth add microsoft/work-iq planner-status-reportInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Generate an AI status report from live Microsoft Planner plan data. Use this for a single Planner plan when the user asks to create, draft, generate, pull, prepare, or write a status report, project update, progress report, executive summary, recap, or briefing.
This skill mirrors the Planner DA StatusReport behavior: resolve one plan, extract the user's report intent, fetch Planner plan and task data, categorize tasks into mutually exclusive status-report buckets, compute overall and period statistics, then compose a Markdown report with an insight-first project-management narrative.
Pattern: Fetch + Local Analysis, with Ask as fallback. Use
fetch_work_iqwith deterministic Microsoft Graph-style paths for plan discovery and structured JSON. Useask_work_iqonly for semantic context or after the canonical structured plan-resolution paths are exhausted, unavailable, or policy-blocked. Do the report specification extraction, task categorization, statistics, and final composition locally in the skill. Do not invent data.
fetch_work_iq (
entityUrls: ["/me?$select=id,displayName,mail"]
)
Use the current date supplied by the runtime as the authoritative "today". If no reporting period is specified, default to a 14-day window ending today.
If the plan ID is already available from context, use it directly. Otherwise follow the canonical named-plan resolution workflow in Tasks (Planner). That shared guidance is authoritative for lookup order, paging, group-backed plans, filtering requirements, and semantic fallback behavior.
If the user's request does not identify a single plan:
Build a complete report specification from the user's request. Do not ask clarification questions for missing report details; apply defaults. Only ask when the target plan is missing or ambiguous.
Extract:
| Field | Default | Notes |
|---|---|---|
| start_date | today minus 14 days | Convert user periods like "last week", "March", "since Monday" to dates. |
| end_date | today | Use runtime current date. |
| audience | general | Map leadership, executives, skip-level -> executive; team leads -> team_lead; engineers/myself -> ic; external/customer -> client. |
| grouping | none | One of none, assignee, bucket, priority, status. |
| filters | none | Assignees, priorities, buckets, statuses, include/exclude. Resolve "me/my/mine" to the user's display name when possible. |
| special_instructions | empty | Preserve explicit structural instructions such as "one paragraph", "table only", "no charts", "focus on risks". |
| section_specifications | all default sections | Include exactly what the user requested when they name sections/topics. |
Default sections:
Section selection rules:
Fetch the plan:
fetch_work_iq (
entityUrls: ["/planner/plans/{planId}"]
)
Fetch tasks:
fetch_work_iq (
entityUrls: ["/planner/plans/{planId}/tasks"]
)
For each plannerTask, capture only these Microsoft Graph properties when available:
idtitlepercentCompleteprioritycreatedDateTimestartDateTimedueDateTimecompletedDateTimecompletedByassignmentsbucketIdappliedCategoriesWhen using $select, limit it to the supported plannerTask properties listed above;
do not invent additional properties or use derived display values in $select or
$expand. Derive status locally from percentComplete. Resolve assignee display
names from the user IDs in assignments. Resolve bucket names by fetching the plan's
buckets and joining on bucketId:
fetch_work_iq (
entityUrls: ["/planner/plans/{planId}/buckets"]
)
For richer grounding if needed, fetch task details for tasks that are overdue, recently completed, high priority, or specifically requested:
fetch_work_iq (
entityUrls: ["/planner/tasks/{taskId}/details"]
)
Use only the description, checklist, and references properties returned by
plannerTaskDetails, or semantic context summarized by ask_work_iq. Do not
request history or dependencies as structured Planner fields, and do not fabricate
blockers, dependencies, or narrative context from a task title alone.
Normalize status:
| Planner value | Status |
|---|---|
| percentComplete = 100 | Completed |
| percentComplete = 50 | In Progress |
| percentComplete = 0 | Not Started |
Normalize priority:
| Planner priority | Label |
|---|---|
| 1 | Urgent |
| 3 | Important |
| 5 | Medium |
| 9 | Low |
Apply user filters before categorization.
Categorize every task into exactly one bucket, in this order:
start_date and end_date, inclusive.start_date.Every task must appear in exactly one bucket. No duplication.
Compute:
overall_statistics:
total = all tasks
completed = completed_in_period + completed_before
overdue = overdue
in_progress = in_progress
not_started = not_started + upcoming + uncategorized
period_statistics:
total
completed_in_period
completed_before
overdue
in_progress
not_started
upcoming
uncategorized
Use the most severe applicable verdict:
| Verdict | Condition | |---|---| | Off Track | Critical blocker, completion more than 20 points behind expected pace, or more than 30% of tasks overdue. | | At Risk | Non-critical blocker, more than 10% overdue, or completion 10-20 points behind expected pace. | | Delayed | 1-10% overdue with no blockers, or minor schedule delay. | | On Track | No overdue/blockers and completion is within 10 points of expected pace. | | Not Started | All tasks are not started. |
If blocker information is not present in data, do not infer blockers. Base the verdict on overdue percentage, completion, derived task status, and explicit task-detail content.
If the user explicitly requested grouping, use it for the whole report.
Otherwise use this priority cascade for Progress and Project milestones:
Render up to 8 groups. If there are more, show the top 8 by task count and aggregate the rest into "Other".
Write the report directly in Markdown. Never expose internal JSON field names, category names, pipeline steps, or implementation details.
For this WorkIQ skill, follow the user's requested output surface:
contentToOmit includes charts, visualizations, pie charts, Gantt charts, or timeline,
skip chart blocks and use tables/counter lines. This explicit opt-out takes precedence
over confirmed Mermaid support.MCP initialization identifies the client and negotiates protocol features such as roots, sampling, and elicitation. Standard MCP capabilities do not advertise Markdown, HTML, Mermaid, or other response-renderer features. The WorkIQ tools also do not expose the MCP initialization handshake to this skill.
Determine Mermaid support in this order:
Do not infer renderer support from the presence of an MCP server, clientInfo.name
alone, tool availability, or generic Markdown support. Do not ask a clarification
question only to determine renderer support; use the fallback when the signal is
missing. Never use inline HTML or SVG for charts.
Use this structure unless the user's explicit section spec replaces it:
# Status report for [Plan Name]
**Date of report:** [Month DD, YYYY] | **Reporting period:** [Start Date] - [End Date]
[**Project Owner:** [Owner Name] - only when an individual owner can be resolved]
---
## Overall status
[RAG] **[Verdict]** - **[Completion %]% Complete** - [Total] tasks
[One sentence: insight first, numbers second.]
---
## Executive summary
[One 3-4 sentence paragraph: top risk theme, top win theme, top ask/next horizon, velocity signal if material.]
**[TOTAL]** Total - Completed **[N]** - In Progress **[N]** - Delayed **[N]** - Not Started **[N]**
[Task Completion Chart when Mermaid support is confirmed and charts were not omitted;
see chart rules below.]
**Key risks**
- **[Risk]:** [impact + owner when known].
**Key wins**
- **[Outcome]:** [delivered item + impact]. Resolved [Month DD] when known.
**Decisions / Asks**
- **[Action]:** [why + owner]. Omit this sub-heading if there are no asks.
---
## Risks and blockers
| # | Item | Status | Due date | Details | Action needed |
|---|---|---|---|---|---|
| 1 | [Task title] | [RAG status] | [date or -] | [impact and evidence] | [specific next step or -] |
---
## Achievements ([period label])
- **[Outcome framing]:** [specific completed item]. Resolved [Month DD].
---
## Progress ([period label])
[1-2 sentence narrative naming the dominant pattern across groups.]
**+[N]** Completed this period - **+[N]** Started or in progress - **[N]** Overdue
**Progress by [Bucket / Priority / Team Member / Overall]**
| Group | Status | Completed | In Progress | Delayed | Not Started | % Complete | Delta this period |
|---|---|---|---|---|---|---|---|
| [Group] | [RAG] | [N] | [N] | [N] | [N] | [PCT]% | +[N] |
---
## Upcoming commitments ([period label])
| # | Task | Due date | Owner | Description |
|---|---|---|---|---|
| 1 | [Task title] | [date or -] | [owner or Unassigned] | [grounded one-line reason this matters] |
---
## Project milestones
| Phase / Group | Start | End | Status as of today | Items |
|---|---|---|---|---|
| [Group] | [Month YYYY or -] | [Month YYYY or -] | [status] | [done] / [total] |
| **- Today -** | **[Month DD, YYYY]** | - | - | - |
[Gantt timeline when Mermaid support is confirmed, charts were not omitted, and the
grounded milestone data supports a meaningful timeline; see chart rules below.]
---
*This report was generated from Microsoft Planner plan data as of [Date of report]. Content reflects task data available at generation time. Verify facts before distribution.*
Task Completion Chart
Use overall_statistics exactly:
overall_statistics.completedoverall_statistics.overdueoverall_statistics.in_progressoverall_statistics.not_startedIf Mermaid support is confirmed by the renderer capability policy and the user did not opt out of charts, emit this chart by default:
**Task Completion Chart:**
```mermaid
pie title Project Task Status
"Completed" : [count]
"Overdue" : [count]
"In Progress" : [count]
"Not Started" : [count]
```
If Mermaid support is unknown or unavailable, use the counter line only:
**[TOTAL]** Total - Completed **[N]** - In Progress **[N]** - Delayed **[N]** - Not Started **[N]**
Gantt Timeline
When rendering a Gantt:
gantt.YYYY-MM-DD.Example format:
```mermaid
gantt
title [Plan Name]
dateFormat YYYY-MM-DD
axisFormat %b, %Y
excludes weekends
section [Phase Name]
[Task Name] :task_id, 2026-05-01, 10d
[Milestone] :milestone, milestone_id, 2026-05-15, 0d
```
Composition rules:
Default delivery is inline in chat.
If the user asks to email, post to Teams, or create a document, first show a preview and ask for explicit confirmation before sending or creating content visible to other people.
| Parameter | Required | Default | Description | |---|---|---|---| | Plan | Yes | - | Planner plan name, plan ID, or unambiguous context reference. | | Reporting period | No | Last 14 days ending today | Period for completed/progress sections. | | Audience | No | General | Executive, team lead, IC, client, or general. | | Sections | No | Default full report | User-selected standard/custom sections. | | Filters | No | None | Assignee, priority, bucket, status, include/exclude. | | Grouping | No | Auto | Assignee, bucket, priority, status, or auto cascade. | | Length | No | Standard | Concise, standard, or detailed. | | Delivery | No | Inline | Inline, draft email, Teams post, or document. |
| MCP Server | Tool | Purpose |
|---|---|---|
| workiq | ask_work_iq | Fallback semantic plan matching, person resolution, and richer contextual lookup. |
| workiq | fetch_work_iq | Fetch user profile, Planner plans, tasks, task details, buckets, and user lookups. |
| workiq | create_entity_work_iq | Optional: create email drafts, Teams posts, or other outbound entities after confirmation. |
List likely plans and ask the user to pick one. Do not guess.
Explain that this skill handles one Planner plan at a time. Ask the user which plan to report on first, or suggest using a multi-plan/project snapshot skill.
Generate a minimal report with the title, date, period, and a factual note that the plan has no tasks. Do not invent risks, milestones, or upcoming commitments.
Put undated incomplete tasks in Not started or Uncategorized as appropriate. Mention significant undated work in the summary if it affects planning confidence.
Render as Unassigned or Unknown user rather than dropping the task.
Use whatever structured data is available, acknowledge the limitation briefly, and avoid sections that depend on missing data. Do not retry silently.
Preview the exact recipient and content before using create_entity_work_iq to send or post. If the report includes private Planner data, warn the user before sending.
"Generate a status report for the Apollo Planner plan."
The skill resolves the Apollo plan, fetches plan tasks, defaults to the last 14 days, categorizes tasks, computes health, and returns the full Markdown report.
"Create a concise executive update focused on risks and blockers since Monday."
The skill uses Monday through today as the period, shapes the language for leadership, emphasizes risks/blockers, and keeps the output concise while preserving critical task evidence.
"Draft a status report grouped by owner, only for urgent and important tasks."
The skill filters to urgent/important tasks, groups the full report by assignee, and reports progress, risks, upcoming commitments, and milestones by owner.
tools
Adds Microsoft Entra SSO (single sign-on, no OBO) to a Microsoft 365 Copilot declarative agent whose tools are served by an MCP server — for BOTH widget standards: (1) the MCP Apps standard (from create-mcp-app / the MCP Apps SDK): a plugin manifest such as readiness_plugin.json (or another *_plugin.json with a runtimes[] block) and an EXPRESS-based MCP server; and (2) the OpenAI Apps (OAI Apps) layout from the ui-widget-developer skill: appPackage/mcpPlugin.json and a raw-http MCP server. When the layout is ambiguous, DEFAULT to the MCP Apps standard (most projects use it). The skill auto-detects the layout, reuses the existing named devtunnel + env/.env.local (never creates a second tunnel), registers the Entra app + ATK OAuth (MicrosoftEntra), patches the plugin manifest's runtimes[] auth to OAuthPluginVault, injects a minimal JWKS bearer-token guard into the existing server (an EXPRESS middleware for MCP Apps, or a raw-http guard WITHOUT rewriting to Express for OAI Apps), validates, sideloads, and prints an app-registration summary. SSO only — no OBO. Triggered by: "add sso to my mcp server", "wire entra sso for my copilot agent", "setup sso for mcp apps", "add sso after create-mcp-app", "add sso after ui-widget-developer", "add entra auth to my express mcp server", "configure only sso no obo"
tools
WorkIQ - Microsoft 365 tool surface for agents. Use for any workplace question or write action where data lives in M365. Supports semantic `ask` plus tools (`fetch`, create/update/delete, actions, functions, fetch_blob, path/schema discovery) for mail, meetings/calendar, documents/files, Teams chats/channels, OneDrive/SharePoint, and people. Read triggers, "what did [person] say", priorities/top of mind, meeting decisions/action items, summarize thread/chat, find emails/docs, list meetings/messages/files/channels, project status/updates, "what changed since", download file content. Write triggers, send/reply/forward email, create/update/accept/decline meetings, mark read, delete drafts/items, send/post/reply/react in Teams, set presence. Discovery triggers, available endpoints/paths, fields, request body, schema/data model. Prefer `ask` for synthesis; use entity tools for exact reads/writes.
tools
WorkIQ tools for Microsoft 365 workplace data and actions. Use for email, calendar events and meetings, files, SharePoint, OneDrive, Teams, people, Planner, and other M365 requests. Triggers include cancel meeting or event, accept or decline meetings, create or update events, create an upload session or replace an existing OneDrive file, find or summarize workplace content, send or reply to mail, manage or download files, manage tasks, and discover M365 paths or schemas. Prefer `ask` for synthesis and structured entity tools for exact reads, writes, and binary downloads with `fetch_blob`.
tools
Build MCP servers for Copilot Chat using the OpenAI Apps SDK or MCP Apps SDK widget rendering support (any language). Use this skill when: - Creating MCP servers that integrate with M365 Copilot declarative agents - Building rich interactive widgets (React + Fluent UI) that render in Copilot Chat - Implementing tools that return structuredContent for widget rendering - Adapting an existing MCP server to support Copilot widget rendering - Setting up devtunnels for localhost MCP server exposure - Configuring mcpPlugin.json manifests with RemoteMCPServer runtime Do NOT use this skill for general agent development (scaffolding, manifests, deployment) — use declarative-agent-developer instead. This skill is ONLY for MCP server + widget development. Triggers: "MCP server for Copilot", "OpenAI Apps SDK", "Copilot widget", "structuredContent", "MCP plugin", "devtunnels MCP", "OAI app", "widget rendering", "UI widget"