[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M699MJRC76WWQMBAGP874TT7":3,"skill-same:01M699MJRC76WWQMBAGP874TT7":120},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":34,"publishedAt":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":44,"commitSha":45,"skillDirectory":46,"forksCount":47,"repositoryHtmlUrl":48,"repositoryHomepageUrl":49,"ownerHtmlUrl":50,"ownerBlogUrl":51,"ownerDescription":52,"updatedAt":53,"install":54,"resources":67},"01M699MJRC76WWQMBAGP874TT7","agent-academy-report",null,"Generate a full Agent Academy feedback report — extracting feedback from Excel files and GitHub issues, analyzing sentiment, generating charts, and producing a single styled PDF with a cover page, management summary, and detailed analysis. Use this skill when the user asks to generate an Agent Academy report, create a feedback analysis, build a course completion report, or wants to analyze Agent Academy survey data. Also triggers when the user mentions Agent Academy feedback, course grades, sentiment analysis of Agent Academy data, or exporting Agent Academy results to PDF.","microsoft\u002Fagent-academy","microsoft","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F6154722?v=4","01M698VYDXZ6JW5WH3CRV650R8","Microsoft","01M699MCPQNKZBY9K0MDHG9XC8",3704,"MIT","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fagent-academy\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fagent-academy-report\u002FSKILL.md",[18,23,26,29],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000002","文档处理","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000004","电子表格",{"categoryNo":27,"categoryName":28,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":30,"categoryName":31,"taxonomyType":32,"taxonomyTypeDesc":33},"01JBSEEDCAT000000000000034","行政与办公人员","PROFESSION","适用职业",[35,36,37,38],"agent academy report","PDF","xlsx","github","2026-11-10 10:12:30",false,"---\nname: agent-academy-report\ndescription: \"Generate a full Agent Academy feedback report — extracting feedback from Excel files and GitHub issues, analyzing sentiment, generating charts, and producing a single styled PDF with a cover page, management summary, and detailed analysis. Use this skill when the user asks to generate an Agent Academy report, create a feedback analysis, build a course completion report, or wants to analyze Agent Academy survey data. Also triggers when the user mentions Agent Academy feedback, course grades, sentiment analysis of Agent Academy data, or exporting Agent Academy results to PDF.\"\n---\n\n# Agent Academy Report Generator\n\nGenerate a comprehensive feedback analysis report for Agent Academy. The report combines data from Excel survey exports and GitHub issues, analyzes sentiment, generates charts, and produces a single styled PDF.\n\n## Folder Structure\n\nThe workspace folder should be organized as follows:\n\n```\n\u003Cworkspace>\u002Freport\u002F\n├── data\u002F            ← Excel files (.xlsx) with survey responses\n├── badges\u002F          ← Badge PNG images (downloaded from GitHub)\n├── charts\u002F          ← Generated chart PNG images (output)\n├── markdown\u002F        ← Generated markdown files (output)\n└── pdf\u002F             ← Generated PDF files (output)\n```\n\nIf the user provides a workspace path, use it. Otherwise, ask for it.\n\n## Overview\n\nThe report generation has 6 phases:\n\n1. **Extract feedback** from Excel files and GitHub issues\n2. **Analyze sentiment** using keyword-based scoring\n3. **Generate charts** with matplotlib\n4. **Build markdown** files (management summary + detailed analysis)\n5. **Export a single PDF** with cover page, management summary, and full analysis\n6. **Verify PDF formatting** — visually inspect and fix any layout issues\n\nRun the bundled Python scripts in order. Each script is self-contained and reads\u002Fwrites to the folder structure above.\n\n---\n\n## Phase 1: Extract Feedback\n\nRun `scripts\u002Fextract_feedback.py`:\n\n```bash\npython3 \u003Cskill-path>\u002Fscripts\u002Fextract_feedback.py \"\u003Cworkspace-path>\u002Freport\"\n```\n\nThis script:\n\n- Reads all `.xlsx` files from `\u003Cworkspace>\u002Freport\u002Fdata\u002F`\n- Maps filenames to human-readable course names\n- Extracts feedback text, completion dates, and respondent names\u002Femails\n- **Name normalization**: If only an email address is available, it converts it to a display name — e.g. `john.doe@example.com` → `\"John Doe\"` (split on dots\u002Funderscores, title-cased). If neither a name nor email is found, the name defaults to `\"Anonymous\"`.\n- Skips trivial feedback entries (e.g. \"no\", \"none\", \"n\u002Fa\", \"ok\", single punctuation)\n- For files without a feedback column (Operative, Recruit), it extracts completion dates only — their feedback comes from GitHub issues\n- Outputs `\u003Cworkspace>\u002Freport\u002Fdata\u002F_extracted.json`\n\n### GitHub Issues (Operative & Recruit)\n\nAfter running the extract script, fetch feedback from GitHub issues. **Do not use `mcp_github_mcp_search_issues`** — the search API caps results at 1,000, which is insufficient for Recruit (1,390+ issues). Instead, use `mcp_github_mcp_list_issues` which supports full GraphQL cursor pagination:\n\n**Recruit issues:**\n\n```\nowner: \"microsoft\", repo: \"agent-academy\", labels: [\"recruit-completed\"], state: \"all\", perPage: 100\n```\n\n**Operative issues:**\n\n```\nowner: \"microsoft\", repo: \"agent-academy\", labels: [\"operative-completed\"], state: \"all\", perPage: 100\n```\n\nPaginate through **all** pages using the `endCursor` from each response until `hasNextPage` is false. The API returns max 100 per page — Recruit requires ~14 pages, Operative ~4 pages. Do not stop early; collect every issue.\n\nFor each issue, parse the body for structured sections:\n\n- `### Key Learnings and Takeaways`\n- `### Challenges Faced`\n- `### Final Thoughts`\n\nCombine these sections as the feedback text. The `name` field should be a plain string (the GitHub username) — if the API returns a `user` object like `{\"login\": \"username\"}`, extract just the `login` value.\n\nSave the combined data (Excel + GitHub) to `\u003Cworkspace>\u002Freport\u002Fdata\u002F_all_feedback.json`.\n\nEach record should have: `{course, date, month, sentiment, text, name, type, source, is_closed}`.\n\n- `source`: `\"excel\"` (set automatically by extract script), `\"github_completed\"` (badge submission issues), or `\"github_issue\"` (non-badge issues)\n- `is_closed`: `true`\u002F`false` — for GitHub records only; indicates whether the issue is closed (closed = badge awarded for completed issues)\n\n### Non-Badge GitHub Issues\n\nAfter collecting badge submission issues, also fetch **all other open issues** that are NOT badge submissions. These are bug reports, questions, and general feedback that should be classified into the correct course.\n\nFetch issues without the completed labels:\n\n```\nowner: \"microsoft\", repo: \"agent-academy\", state: \"all\", perPage: 100\n```\n\nFilter out issues that already have `recruit-completed` or `operative-completed` labels. For each remaining issue, classify it to a course using this keyword map (match against issue title and labels, case-insensitive):\n\n| Keywords in title\u002Flabels           | Course                                       |\n| ---------------------------------- | -------------------------------------------- |\n| `recruit`                          | Recruit                                      |\n| `operative`                        | Operative                                    |\n| `commander`                        | Commander                                    |\n| `yaml`, `yaml specialist`          | Special Ops: YAML Specialist                 |\n| `copilot studio` AND `mcp`         | Special Ops: Microsoft Copilot Studio MCP    |\n| `learn docs`, `learn mcp`          | Special Ops: Microsoft Learn Docs MCP Server |\n| `cli`, `power platform cli`, `pac` | Special Ops: Power Platform CLI MCP Server   |\n| `badge check`                      | Cowork Collective: Badge Check               |\n| `compliance`                       | Cowork Collective: Compliance Packet         |\n| `out of office`, `vacay`           | Cowork Collective: Out of Office             |\n\nIf no match is found, skip the issue. Set `source: \"github_issue\"` and `type: \"feedback\"` for these records. Use the issue title + body as the feedback text.\n\n### How Non-Badge Issues Are Used\n\nNon-badge GitHub issues (`source: \"github_issue\"`) are **included** in:\n\n- Sentiment analysis (scored and themed)\n- Course grades (affect positive\u002Fnegative percentages)\n- Top themes (feed into per-course theme detection)\n- Representative quotes (can appear as selected quotes)\n- Next steps (negative themes from these issues drive recommendations)\n\nNon-badge GitHub issues are **excluded** from:\n\n- Submission\u002Fcompletion charts (completions over time, cumulative, monthly, per-course)\n- Monthly trend tables (submission counts)\n- Total completions count in the management summary\n\nThis is because they are feedback and bug reports, not actual course completions.\n\n### Recruit & Operative Comparison Data\n\nThe combined `_all_feedback.json` will contain records with different `source` values. The build script uses these to generate a **Submission Pipeline** comparison table for Recruit and Operative:\n\n| Metric                   | How to count                                                       |\n| ------------------------ | ------------------------------------------------------------------ |\n| GitHub Badge Submissions | Records where `source = \"github_completed\"`                        |\n| Excel Form Submissions   | Records where `source = \"excel\"`                                   |\n| Badges Awarded           | Records where `source = \"github_completed\"` AND `is_closed = true` |\n| Other GitHub Issues      | Records where `source = \"github_issue\"`                            |\n\n---\n\n## Phase 2: Analyze Sentiment\n\nRun `scripts\u002Fanalyze_sentiment.py`:\n\n```bash\npython3 \u003Cskill-path>\u002Fscripts\u002Fanalyze_sentiment.py \"\u003Cworkspace-path>\u002Freport\"\n```\n\nThis script:\n\n- Reads `\u003Cworkspace>\u002Freport\u002Fdata\u002F_all_feedback.json`\n- Scores each feedback item using regex-based sentiment analysis (word-boundary `\\b` matching, case-insensitive)\n- Detects common themes and adds a `themes` array to each record (list of matched theme names, e.g. `[\"Hands-on & Practical Learning\", \"MCP & Agent Development Skills\"]`)\n- Computes per-course grades using weighted average (positive=10, neutral=6, negative=2)\n- Outputs `\u003Cworkspace>\u002Freport\u002Fdata\u002F_analyzed.json` with sentiment labels, themes, and course stats\n\n### Output Structure\n\nThe `_analyzed.json` file contains:\n\n```json\n{\n  \"records\": [ ... ],        \u002F\u002F All records with added \"sentiment\" and \"themes\" fields\n  \"summary\": { \"total_records\", \"total_feedback\", \"positive\", \"neutral\", \"negative\", \"overall_grade\" },\n  \"course_stats\": {           \u002F\u002F Per-course: total, positive, neutral, negative, grade, themes (with counts)\n    \"Recruit\": { \"total\": 123, \"positive\": 100, ..., \"themes\": { \"Hands-on & Practical Learning\": 45, ... } }\n  }\n}\n```\n\n### Sentiment Keywords\n\nAll patterns use `\\b` word boundaries for precise matching (e.g. `\\bgreat\\b` matches \"great\" but not \"greater\").\n\n**Positive** patterns include: great, excellent, amazing, awesome, fantastic, wonderful, love\u002Floved, enjoy\u002Fenjoyed, helpful, useful, informative, well done, good job, thank\u002Fthanks, appreciate, impressive, learned, learning, eye-opening, recommend, looking forward, fun, excited, brilliant, clear, intuitive, practical, hands-on, well-structured, well-organized, good, nice, cool, neat, super, stellar, outstanding, perfect, phenomenal, beginner-friendly, easy to follow, straightforward, engaging, interesting, valuable, insightful, comprehensive, thorough, solid, smooth.\n\n**Positive emojis** (also scored as positive): ? ? ? ❤️ ? ? ⭐ ✨ ? ? ? ?\n\n**Negative** patterns include: error(s), issue(s), problem(s), bug(s)\u002Fbuggy, broke\u002Fbroken\u002Fcrash\u002Fcrashed, fail\u002Ffailed\u002Ffailure, didn't work, not work, couldn't, stuck, struggling\u002Fstruggle, missing, trouble, difficult\u002Fdifficulties, cumbersome, challenge(s), troubleshoot, confusing\u002Fconfused, frustrating\u002Ffrustrated, slow, complex, unclear, improve\u002Fimprovement, wish, lack\u002Flacking, disappoint\u002Fdisappointed.\n\n**Scoring rule:** If negative matches > positive matches → negative. Else if positive > 0 → positive. Else if negative > 0 → negative. Else → neutral.\n\n### Theme Detection\n\nThe analyzer detects 10 predefined themes by matching regex keywords against feedback text:\n\n| Theme                              | Keywords (regex)                                                                  |\n| ---------------------------------- | --------------------------------------------------------------------------------- |\n| Hands-on & Practical Learning      | hands-on, practical, interactive, step-by-step, real-world, exercise              |\n| Clear Instructions & Documentation | clear, well-document, well-explain, easy to follow, straightforward, instructions |\n| MCP & Agent Development Skills     | mcp, copilot studio, agent, connector, power automate, topic, action              |\n| Setup & Configuration Challenges   | setup, install, config, environment, prerequisite, authentication, credentials    |\n| VS Code Integration                | vs code, visual studio code, extension, editor, debug                             |\n| Valuable Learning Experience       | learn, knowledge, understand, skill, experience, educational, insight             |\n| Course Quality & Engagement        | well-design, engag, interest, quality, structure, organized, professional         |\n| Errors & Technical Issues          | error, bug, crash, broke, fail, fix, workaround                                   |\n| Improvement Suggestions            | improv, suggest, would be nice, could be, hope, wish, add more, future            |\n| Real-World Applicability           | real-world, production, business, enterprise, workplace, appl                     |\n\nA feedback item can match multiple themes. Themes are stored as `r['themes'] = [...]` on each record.\n\n---\n\n## Phase 3: Generate Charts\n\nRun `scripts\u002Fgenerate_charts.py`:\n\n```bash\npython3 \u003Cskill-path>\u002Fscripts\u002Fgenerate_charts.py \"\u003Cworkspace-path>\u002Freport\"\n```\n\nRequires `matplotlib` and `numpy`. Install if needed: `pip3 install matplotlib numpy`.\n\nThis generates overview charts plus individual per-course charts in `\u003Cworkspace>\u002Freport\u002Fcharts\u002F` at 180 DPI.\n\n**Note:** Submission\u002Fcompletion charts only count actual submissions (`source: \"excel\"` and `source: \"github_completed\"`). Non-badge GitHub issues (`source: \"github_issue\"`) are excluded from these charts — they are only used for sentiment analysis.\n\n### Course Grouping & Colors\n\nCharts group courses into 4 categories, each with a consistent color:\n\n| Group             | Color  | Hex     | Courses                        |\n| ----------------- | ------ | ------- | ------------------------------ |\n| Recruit           | Blue   | #3b82f6 | Recruit                        |\n| Operative         | Teal   | #14b8a6 | Operative                      |\n| Special Ops       | Orange | #f59e0b | All Special Ops missions       |\n| Cowork Collective | Purple | #a78bfa | All Cowork Collective missions |\n\n**Display order** (used in all charts): Recruit, Operative, Special Ops: YAML Specialist, Special Ops: Microsoft Copilot Studio MCP, Special Ops: Microsoft Learn Docs MCP Server, Special Ops: Power Platform CLI MCP Server, Cowork Collective: Badge Check, Cowork Collective: Compliance Packet, Cowork Collective: Out of Office.\n\n**Short names** used on chart axes (where full names are too long):\n\n| Full Name                                    | Short Name         |\n| -------------------------------------------- | ------------------ |\n| Special Ops: YAML Specialist                 | YAML Specialist    |\n| Special Ops: Microsoft Copilot Studio MCP    | Copilot Studio MCP |\n| Special Ops: Microsoft Learn Docs MCP Server | Learn Docs MCP     |\n| Special Ops: Power Platform CLI MCP Server   | PP CLI MCP         |\n| Cowork Collective: Badge Check               | Badge Check        |\n| Cowork Collective: Compliance Packet         | Compliance Packet  |\n| Cowork Collective: Out of Office             | Out of Office      |\n\n### Overview Charts\n\n| Chart                   | Filename                     | Description                                            |\n| ----------------------- | ---------------------------- | ------------------------------------------------------ |\n| Weekly completions      | `completions_over_time.png`  | Stacked area chart by course group                     |\n| Sentiment by course     | `sentiment_by_course.png`    | Horizontal stacked bar with positive\u002Fnegative % labels |\n| Course grades           | `grades_by_course.png`       | Lollipop chart sorted by grade (best → worst)          |\n| Cumulative completions  | `cumulative_completions.png` | Line chart with gradient fills and endpoint markers    |\n| Overall sentiment       | `sentiment_pie.png`          | Donut chart with total count in center                 |\n| Monthly feedback volume | `monthly_feedback.png`       | Stacked bar by month and course group                  |\n\n### Per-Course Charts\n\nFor each course, a `course_{slug}.png` file is generated (e.g. `course_recruit.png`, `course_operative.png`, `course_special_ops_yaml_specialist.png`). Each shows:\n\n- **Weekly submissions** as an area chart (primary axis)\n- **Cumulative total** as a dashed line (secondary axis)\n\nThe slug is the course name lowercased with spaces → underscores, colons removed, and ampersands → `\"and\"` (e.g. `\"Cowork Collective: Badge Check\"` → `course_cowork_collective_badge_check.png`).\n\nColor scheme (navy\u002Fteal theme matching cover): Blue (#3b82f6), Green (#22c55e), Red (#ef4444), Orange (#f59e0b), Purple (#a78bfa), Teal (#14b8a6). Charts use a consistent light background (#fafbfc), subtle grid (#e2e8f0), and navy (#111827) text.\n\n---\n\n## Phase 4: Build Markdown\n\nRun `scripts\u002Fbuild_markdown.py`:\n\n```bash\npython3 \u003Cskill-path>\u002Fscripts\u002Fbuild_markdown.py \"\u003Cworkspace-path>\u002Freport\"\n```\n\nThis generates three markdown files in `\u003Cworkspace>\u002Freport\u002Fmarkdown\u002F`:\n\n### management-summary.md\n\n- Title: \"Management Summary\"\n- Key metrics table (total completions, feedback count, courses, overall grade, sentiment percentages)\n  - **Total completions** excludes `source: \"github_issue\"` records (only counts actual submissions)\n- Highlights section (Recruit\u002FOperative counts, highest\u002Flowest rated courses)\n- Chart references (one per section with narrative text)\n- **4 main sections** — Recruit, Operative, Special Ops, Cowork Collective:\n  - **Single-course sections** (Recruit, Operative): spotlight content directly under the section heading\n  - **Multi-mission sections** (Special Ops, Cowork Collective): section-level summary first (combined grade, response count, cross-mission themes, section-level next steps), then individual mission spotlights as sub-sections with short names (e.g. \"YAML Specialist\" instead of \"Special Ops: YAML Specialist\")\n  - Each course\u002Fmission spotlight includes:\n    - Grade, response count, positive\u002Fnegative percentages\n    - Grade explanation — contextual note based on score range:\n      - ≥ 9.0: \"Exceptional satisfaction — one of the top-rated courses.\"\n      - ≥ 8.5: \"Strong satisfaction with consistently positive feedback.\"\n      - ≥ 8.0: \"Good satisfaction, though some participants encountered challenges.\"\n      - \u003C 8.0: \"Solid course, but a higher neutral\u002Fnegative ratio pulls the grade down.\"\n    - Top 3 themes with mention counts\n    - **Standout callout** — appears when positive % ≥ 85%: highlights most-praised theme\n    - **Watch area callout** — appears when negative % ≥ 15%: highlights top negative theme\n    - Representative quotes — **10 total**, split proportionally to the grade using formula: `num_positive = round(10 × grade \u002F 10)`. Grade 8.0\u002F10 → 8 positive, 2 negative. Quotes are selected by closest to ideal length (positive: ~250 chars, negative: ~200 chars).\n- Recommendations section (4 static recommendations: address setup challenges, expand Cowork Collective, scale Special Ops, continue monitoring)\n\n#### Quote Cleaning\n\nAll quotes in the report go through a cleaning pipeline before display:\n\n1. Newlines → spaces\n2. **Bold headers** (`**text**`) removed\n3. Markdown headers (`# ...`) removed\n4. Checkbox lines (`- [ ] ...`) removed\n5. Leading list dashes removed, inline dashes → periods\n6. HTML entities decoded (`&#39;` → `'`, `&amp;` → `&`)\n7. Collapsed whitespace\n8. Truncated at sentence boundary — positive quotes target ~250 chars max, negative quotes ~200 chars max (falls back to word boundary + `...` if no sentence break found above 80–100 chars)\n\n### feedback-analysis.md\n\n- Title: \"Detailed Feedback Analysis\"\n- Overall summary table (sentiment counts + percentages)\n- Course overview table (responses, sentiment breakdown, grade per course)\n- **Recruit & Operative: Submission Pipeline** — funnel-style comparison table showing GitHub badge submissions, badges awarded\u002Fpending with percentages, Excel form submissions, and other GitHub issues. Includes a note explaining that GitHub and Excel are independent channels.\n- **4 main sections** — Recruit, Operative, Special Ops, Cowork Collective:\n  - **Single-course sections** (Recruit, Operative): analysis content directly under the `## Section` heading (h2), with subsections as h3\n  - **Multi-mission sections** (Special Ops, Cowork Collective):\n    - **Section-level summary** (under h2): combined response count + grade, cross-mission themes (top 5 with positive\u002Fnegative indicators), section-level recommendations (up to 5 next steps based on aggregated data across all missions)\n    - **Per-mission blocks** (under h3): each mission gets its own analysis using the short name (e.g. \"YAML Specialist\", \"Badge Check\"), with sub-headings at h4 level\n  - Each course\u002Fmission block includes:\n    - Response counts and sentiment percentages\n    - **Submissions Over Time** chart (per-course chart reference)\n    - **Monthly trend table** showing submissions, sentiment breakdown, and grade per month\n    - **Top 5 themes** with mention counts and positive\u002Fnegative indicator\n    - **10 representative quotes** — balanced on grade using same formula as management summary (`round(10 × grade \u002F 10)` positive, remainder negative); each cleaned by the quote pipeline (see above); positive truncated to ~200 chars, negative to ~180 chars\n    - **Next Steps** — up to 5 prioritized, actionable recommendations generated algorithmically:\n\n#### Next Steps Algorithm\n\nEach course gets up to 5 next steps, generated in priority order:\n\n1. **Priority 1–2: Top negative themes** — The top 2 themes with the most negative mentions, but only if each has ≥ 3 negative mentions. Uses a theme→advice mapping:\n\n   | Theme                              | Advice                                                                                       |\n   | ---------------------------------- | -------------------------------------------------------------------------------------------- |\n   | Setup & Configuration Challenges   | Simplify setup — provide a pre-configured environment or improved quick-start guide...       |\n   | Errors & Technical Issues          | Fix reported bugs — audit the most common failure points and add troubleshooting guidance.   |\n   | Improvement Suggestions            | Act on improvement suggestions — review and prioritize the most-requested changes...         |\n   | Clear Instructions & Documentation | Improve documentation clarity — review step-by-step guides for completeness...               |\n   | VS Code Integration                | Improve VS Code experience — ensure extensions and tooling work seamlessly...                |\n   | MCP & Agent Development Skills     | Strengthen MCP\u002Fagent content — review labs where participants reported MCP-related issues... |\n   | Valuable Learning Experience       | Enhance learning depth — some participants felt the content could go deeper...               |\n   | Course Quality & Engagement        | Refine course structure — address pacing and engagement issues...                            |\n   | Hands-on & Practical Learning      | Improve hands-on exercises — ensure lab environments are reliable...                         |\n   | Real-World Applicability           | Add more real-world examples — participants want to see how skills apply to production...    |\n\n2. **Priority 3: Grade-based advice** — If grade \u003C 8.0: \"Boost course quality — current grade is below the 8.0 target.\" If grade \u003C 8.5: \"Target grade improvement — small refinements could push this above 8.5.\"\n3. **Priority 4: Leverage strengths** — Highlights the top positive theme: \"Double down on [theme] — most praised aspect ([count] positive mentions).\"\n4. **Priority 5: Engagement** — If \u003C 50 responses: \"Increase feedback volume — consider adding in-course feedback prompts.\" Otherwise: \"Continue monitoring — maintain the feedback loop and review sentiment trends monthly.\"\n\n### feedback.md\n\n- Curated positive-only feedback (excludes error-mentioning entries)\n- **Max 5 quotes per course** (~45 total), selected for ideal length (~250 chars)\n- Each item as a blockquote: `> ? \"text\" — Name (Course)`\n\n---\n\n## Phase 5: Export PDF\n\nRun `scripts\u002Fexport_pdf.py`:\n\n```bash\npython3 \u003Cskill-path>\u002Fscripts\u002Fexport_pdf.py \"\u003Cworkspace-path>\u002Freport\" \"\u003Creport-title>\"\n```\n\nExample: `python3 scripts\u002Fexport_pdf.py \"\u002Fpath\u002Fto\u002Fworkspace\u002Freport\" \"Agent Academy - Report April 2026\"`\n\nThis script:\n\n1. Downloads badge images from `https:\u002F\u002Fraw.githubusercontent.com\u002Fmicrosoft\u002Fagent-academy\u002Fmain\u002Fdocs\u002Fpublic\u002Fimages\u002F` to `\u003Cworkspace>\u002Freport\u002Fbadges\u002F` (if not already present)\n2. Builds a single HTML file with:\n   - **Cover page**: Dark navy gradient background with teal accent, grid overlay, Agent Academy logo, report title, all badge images\n     - **Title splitting**: The report title is split on `\" - \"` — the part before becomes the main title (large teal text), the part after becomes the subtitle (smaller slate text). E.g. `\"Agent Academy - Report April 2026\"` → main: `\"Agent Academy\"`, subtitle: `\"Report April 2026\"`.\n     - **Hardcoded elements**: \"Mission Report\" tag (top-right classification label), \"Microsoft Copilot Studio\" pre-title above the main title, \"Earned Badges\" label on the badge shelf, \"microsoft\u002Fagent-academy • Comprehensive Feedback & Completion Analysis\" footer text.\n   - **Management summary**: Converted from markdown with charts embedded as base64 images (H1 title stripped — the HTML provides its own)\n   - **Detailed analysis**: Concise per-course analysis with monthly trends, themes, and representative quotes (H1 title stripped)\n3. Exports to PDF using headless Microsoft Edge:\n   ```bash\n   \"\u002FApplications\u002FMicrosoft Edge.app\u002FContents\u002FMacOS\u002FMicrosoft Edge\" \\\n     --headless --disable-gpu --no-sandbox \\\n     --print-to-pdf=\"\u003Cworkspace>\u002Freport\u002Fpdf\u002F\u003Ctitle>.pdf\" \\\n     --no-pdf-header-footer \\\n     \"file:\u002F\u002F\u003Cworkspace>\u002Freport\u002F_report.html\"\n   ```\n4. Cleans up the temporary HTML file\n5. On macOS, automatically removes the `com.apple.quarantine` extended attribute so the PDF opens without a Gatekeeper warning\n\nThe output PDF lands in `\u003Cworkspace>\u002Freport\u002Fpdf\u002F`.\n\n### Page Break Rules\n\nThe HTML includes CSS rules to prevent content from splitting across pages:\n\n- Charts + their descriptions are wrapped in `.chart-block` divs with `page-break-inside: avoid`\n- Course spotlight sections (h3 + content) are wrapped in `.course-spotlight` divs\n- Headings (`h2`, `h3`, `h4`) use `page-break-after: avoid`\n- Tables, blockquotes, and images all have `page-break-inside: avoid`\n\n### Badge Images\n\nDownloaded from `microsoft\u002Fagent-academy` repo at `docs\u002Fpublic\u002Fimages\u002F`:\n\n- `logo.png` — Cover page logo\n- `mcs-agent-academy-recruit-badge.png`, `mcs-agent-academy-operative-badge.png`, `mcs-agent-academy-commander-badge.png` — Level badges\n- `YAML_Specialist_Badge.png`, `Academy_LearnMCP_Badge.png`, `CommandLine_Badge.png` — Special Ops badges\n- `BadgeBandit-badge.png`, `AuditAce-badge.png`, `Vacay-badge.png`, `MCP_Joker_Badge.png` — Cowork Collective badges\n\n### Edge Fallback\n\nThe script checks these browser paths in order and uses the first one found:\n\n1. `\u002FApplications\u002FMicrosoft Edge.app\u002FContents\u002FMacOS\u002FMicrosoft Edge` (macOS)\n2. `\u002Fusr\u002Fbin\u002Fmicrosoft-edge` (Linux)\n3. `\u002FApplications\u002FGoogle Chrome.app\u002FContents\u002FMacOS\u002FGoogle Chrome` (macOS)\n4. `\u002Fusr\u002Fbin\u002Fgoogle-chrome` (Linux)\n\n---\n\n## Phase 6: Verify PDF Formatting\n\nAfter generating the PDF, **always** open and visually inspect it to check for formatting issues. Use the `view_image` tool or open the PDF to review each page.\n\n### Verification Checklist\n\nCheck the following and fix any issues found:\n\n| Check                       | What to look for                                                                                 | Fix location                                                                      |\n| --------------------------- | ------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------- |\n| **Cover page**              | Logo centered, title\u002Fsubtitle readable, badges displayed in a row, no overflow                   | `export_pdf.py` CSS                                                               |\n| **Sentiment pie chart**     | Should be ~45% width, centered — NOT stretched full-width                                        | `export_pdf.py` `embed_md_images()` — use `max-width:45%` for `sentiment_pie`     |\n| **Per-course charts**       | Should be ~85% width, not full-width blowups                                                     | `export_pdf.py` `embed_md_images()` — use `max-width:85%` for `course_` charts    |\n| **h2 section starts**       | Each h2 (Recruit, Operative, Special Ops, Cowork Collective) should start on a new page in print | `export_pdf.py` `@media print` — `h2 { page-break-before: always }`               |\n| **First h2 after h1**       | Should NOT page-break (it follows right after the section title)                                 | `.content > h2:first-of-type { page-break-before: avoid }`                        |\n| **No orphan headings**      | h2\u002Fh3\u002Fh4 should not appear alone at bottom of a page                                             | `h2, h3, h4 { page-break-after: avoid }`                                          |\n| **Tables not split**        | Tables should not break across pages                                                             | `table { page-break-inside: avoid }`                                              |\n| **Blockquotes not split**   | Quotes should stay on one page                                                                   | `blockquote { page-break-inside: avoid }`                                         |\n| **Section-level summaries** | Cross-mission themes and next steps should use proper `###` headings, not bold inline text       | `build_markdown.py` — use `### Cross-Mission Themes` and `### Section Next Steps` |\n| **Line breaks**             | Stats line, themes, and next steps should be visually separated (not running together)           | `build_markdown.py` — ensure `\\n\\n` between sections                              |\n| **Funnel table**            | Submission pipeline table renders correctly with indented rows                                   | `build_markdown.py` `_build_comparison_table()`                                   |\n\n### Common Formatting Issues & Fixes\n\n**Chart too large \u002F stretched:**\nThe `embed_md_images()` function in `export_pdf.py` controls image sizing. It matches filenames to determine width:\n\n- `sentiment_pie` → `max-width:45%` (small donut chart)\n- `course_*` → `max-width:85%` (per-course charts)\n- Everything else → `max-width:100%` (overview charts)\n\nIf a chart looks wrong, adjust the `SMALL_CHARTS` or `MEDIUM_CHARTS` lists and the corresponding `max-width` percentages.\n\n**Heading appears alone at page bottom:**\nThis means `page-break-after: avoid` is not being respected (can happen with large content blocks). Wrap the heading + its following content in a `\u003Cdiv class=\"keep-together\">` block in `md_to_html()`.\n\n**Content runs together without spacing:**\nThe markdown-to-HTML converter treats `\\n\\n` as paragraph breaks (`\u003Cp>`). If content runs together, add an extra blank line in the markdown output (`build_markdown.py`). Use proper `###` headings instead of `**bold text:**` for visually distinct sections.\n\n**h2 doesn't start on new page:**\nOnly works in `@media print`. The `:first-of-type` selector prevents the first h2 in each `.content` div from page-breaking. If ALL h2s page-break when they shouldn't, check that the CSS selector is scoped correctly.\n\n### Re-export After Fixes\n\nIf any formatting issues are found and fixed in the Python scripts, re-run the affected steps:\n\n```bash\n# If build_markdown.py was changed:\npython3 \u003Cskill-path>\u002Fscripts\u002Fbuild_markdown.py \"\u003Cworkspace>\u002Freport\"\n\n# Always re-export PDF after any fix:\npython3 \u003Cskill-path>\u002Fscripts\u002Fexport_pdf.py \"\u003Cworkspace>\u002Freport\" \"\u003Creport-title>\"\n```\n\nThen verify again until all checks pass.\n\n---\n\nExcel filenames map to display names as follows:\n\n| Filename Pattern                                                                 | Course Name                                  |\n| -------------------------------------------------------------------------------- | -------------------------------------------- |\n| `Agent Academy - Special Ops_ YAML Specialist`                                   | Special Ops: YAML Specialist                 |\n| `Agent Academy - Special Ops_Microsoft Copilot Studio ❤️ MCP Mission Completion` | Special Ops: Microsoft Copilot Studio MCP    |\n| `Agent Academy - Special Ops_ Microsoft Learn Docs MCP Server`                   | Special Ops: Microsoft Learn Docs MCP Server |\n| `Agent Academy - Special Ops_⚡ Power Platform CLI MCP Server`                   | Special Ops: Power Platform CLI MCP Server   |\n| `Copilot Studio Agent Academy - Operative`                                       | Operative                                    |\n| `Copilot Studio Agent Academy - Recruit`                                         | Recruit                                      |\n| `Cowork Collective_ Badge Check Mission Completion`                              | Cowork Collective: Badge Check               |\n| `Cowork Collective_ Compliance Packet Mission Completion`                        | Cowork Collective: Compliance Packet         |\n| `Cowork Collective_ Out of Office Mission Completion`                            | Cowork Collective: Out of Office             |\n\nNote: filenames may contain non-breaking spaces (`\\xa0`) — normalize these to regular spaces before matching.\n\n---\n\n## Running the Full Pipeline\n\nTo generate a complete report in one go:\n\n```bash\n# 1. Extract from Excel\npython3 \u003Cskill-path>\u002Fscripts\u002Fextract_feedback.py \"\u003Cworkspace>\u002Freport\"\n\n# 2. Fetch GitHub issues via MCP tools:\n#    a. Badge submissions: recruit-completed + operative-completed labels (paginate ALL pages)\n#    b. Non-badge issues: all other issues, classified to courses by keyword\n#    c. Add source\u002Fis_closed fields, combine with Excel → _all_feedback.json\n\n# 3. Analyze sentiment\npython3 \u003Cskill-path>\u002Fscripts\u002Fanalyze_sentiment.py \"\u003Cworkspace>\u002Freport\"\n\n# 4. Generate charts\npython3 \u003Cskill-path>\u002Fscripts\u002Fgenerate_charts.py \"\u003Cworkspace>\u002Freport\"\n\n# 5. Build markdown\npython3 \u003Cskill-path>\u002Fscripts\u002Fbuild_markdown.py \"\u003Cworkspace>\u002Freport\"\n\n# 6. Export PDF\npython3 \u003Cskill-path>\u002Fscripts\u002Fexport_pdf.py \"\u003Cworkspace>\u002Freport\" \"Agent Academy - Report April 2026\"\n\n# 7. Verify PDF formatting\n#    Open the PDF and check: cover page, chart sizes, page breaks, spacing\n#    Fix any issues in export_pdf.py or build_markdown.py, then re-export\n```\n\nStep 2 requires the GitHub MCP tools and should be done interactively by the agent between steps 1 and 3.\n","# Agent Academy Report Generator\n\nGenerate a comprehensive feedback analysis report for Agent Academy. The report combines data from Excel survey exports and GitHub issues, analyzes sentiment, generates charts, and produces a single styled PDF.\n\n## Folder Structure\n\nThe workspace folder should be organized as follows:\n\n```\n\u003Cworkspace>\u002Freport\u002F\n├── data\u002F            ← Excel files (.xlsx) with survey responses\n├── badges\u002F          ← Badge PNG images (downloaded from GitHub)\n├── charts\u002F          ← Generated chart PNG images (output)\n├── markdown\u002F        ← Generated markdown files (output)\n└── pdf\u002F             ← Generated PDF files (output)\n```\n\nIf the user provides a workspace path, use it. Otherwise, ask for it.\n\n## Overview\n\nThe report generation has 6 phases:\n\n1. **Extract feedback** from Excel files and GitHub issues\n2. **Analyze sentiment** using keyword-based scoring\n3. **Generate charts** with matplotlib\n4. **Build markdown** files (management summary + detailed analysis)\n5. **Export a single PDF** with cover page, management summary, and full analysis\n6. **Verify PDF formatting** — visually inspect and fix any layout issues\n\nRun the bundled Python scripts in order. Each script is self-contained and reads\u002Fwrites to the folder structure above.\n\n---\n\n## Phase 1: Extract Feedback\n\nRun `scripts\u002Fextract_feedback.py`:\n\n```bash\npython3 \u003Cskill-path>\u002Fscripts\u002Fextract_feedback.py \"\u003Cworkspace-path>\u002Freport\"\n```\n\nThis script:\n\n- Reads all `.xlsx` files from `\u003Cworkspace>\u002Freport\u002Fdata\u002F`\n- Maps filenames to human-readable course names\n- Extracts feedback text, completion dates, and respondent names\u002Femails\n- **Name normalization**: If only an email address is available, it converts it to a display name — e.g. `john.doe@example.com` → `\"John Doe\"` (split on dots\u002Funderscores, title-cased). If neither a name nor email is found, the name defaults to `\"Anonymous\"`.\n- Skips trivial feedback entries (e.g. \"no\", \"none\", \"n\u002Fa\", \"ok\", single punctuation)\n- For files without a feedback column (Operative, Recruit), it extracts completion dates only — their feedback comes from GitHub issues\n- Outputs `\u003Cworkspace>\u002Freport\u002Fdata\u002F_extracted.json`\n\n### GitHub Issues (Operative & Recruit)\n\nAfter running the extract script, fetch feedback from GitHub issues. **Do not use `mcp_github_mcp_search_issues`** — the search API caps results at 1,000, which is insufficient for Recruit (1,390+ issues). Instead, use `mcp_github_mcp_list_issues` which supports full GraphQL cursor pagination:\n\n**Recruit issues:**\n\n```\nowner: \"microsoft\", repo: \"agent-academy\", labels: [\"recruit-completed\"], state: \"all\", perPage: 100\n```\n\n**Operative issues:**\n\n```\nowner: \"microsoft\", repo: \"agent-academy\", labels: [\"operative-completed\"], state: \"all\", perPage: 100\n```\n\nPaginate through **all** pages using the `endCursor` from each response until `hasNextPage` is false. The API returns max 100 per page — Recruit requires ~14 pages, Operative ~4 pages. Do not stop early; collect every issue.\n\nFor each issue, parse the body for structured sections:\n\n- `### Key Learnings and Takeaways`\n- `### Challenges Faced`\n- `### Final Thoughts`\n\nCombine these sections as the feedback text. The `name` field should be a plain string (the GitHub username) — if the API returns a `user` object like `{\"login\": \"username\"}`, extract just the `login` value.\n\nSave the combined data (Excel + GitHub) to `\u003Cworkspace>\u002Freport\u002Fdata\u002F_all_feedback.json`.\n\nEach record should have: `{course, date, month, sentiment, text, name, type, source, is_closed}`.\n\n- `source`: `\"excel\"` (set automatically by extract script), `\"github_completed\"` (badge submission issues), or `\"github_issue\"` (non-badge issues)\n- `is_closed`: `true`\u002F`false` — for GitHub records only; indicates whether the issue is closed (closed = badge awarded for completed issues)\n\n### Non-Badge GitHub Issues\n\nAfter collecting badge submission issues, also fetch **all other open issues** that are NOT badge submissions. These are bug reports, questions, and general feedback that should be classified into the correct course.\n\nFetch issues without the completed labels:\n\n```\nowner: \"microsoft\", repo: \"agent-academy\", state: \"all\", perPage: 100\n```\n\nFilter out issues that already have `recruit-completed` or `operative-completed` labels. For each remaining issue, classify it to a course using this keyword map (match against issue title and labels, case-insensitive):\n\n| Keywords in title\u002Flabels           | Course                                       |\n| ---------------------------------- | -------------------------------------------- |\n| `recruit`                          | Recruit                                      |\n| `operative`                        | Operative                                    |\n| `commander`                        | Commander                                    |\n| `yaml`, `yaml specialist`          | Special Ops: YAML Specialist                 |\n| `copilot studio` AND `mcp`         | Special Ops: Microsoft Copilot Studio MCP    |\n| `learn docs`, `learn mcp`          | Special Ops: Microsoft Learn Docs MCP Server |\n| `cli`, `power platform cli`, `pac` | Special Ops: Power Platform CLI MCP Server   |\n| `badge check`                      | Cowork Collective: Badge Check               |\n| `compliance`                       | Cowork Collective: Compliance Packet         |\n| `out of office`, `vacay`           | Cowork Collective: Out of Office             |\n\nIf no match is found, skip the issue. Set `source: \"github_issue\"` and `type: \"feedback\"` for these records. Use the issue title + body as the feedback text.\n\n### How Non-Badge Issues Are Used\n\nNon-badge GitHub issues (`source: \"github_issue\"`) are **included** in:\n\n- Sentiment analysis (scored and themed)\n- Course grades (affect positive\u002Fnegative percentages)\n- Top themes (feed into per-course theme detection)\n- Representative quotes (can appear as selected quotes)\n- Next steps (negative themes from these issues drive recommendations)\n\nNon-badge GitHub issues are **excluded** from:\n\n- Submission\u002Fcompletion charts (completions over time, cumulative, monthly, per-course)\n- Monthly trend tables (submission counts)\n- Total completions count in the management summary\n\nThis is because they are feedback and bug reports, not actual course completions.\n\n### Recruit & Operative Comparison Data\n\nThe combined `_all_feedback.json` will contain records with different `source` values. The build script uses these to generate a **Submission Pipeline** comparison table for Recruit and Operative:\n\n| Metric                   | How to count                                                       |\n| ------------------------ | ------------------------------------------------------------------ |\n| GitHub Badge Submissions | Records where `source = \"github_completed\"`                        |\n| Excel Form Submissions   | Records where `source = \"excel\"`                                   |\n| Badges Awarded           | Records where `source = \"github_completed\"` AND `is_closed = true` |\n| Other GitHub Issues      | Records where `source = \"github_issue\"`                            |\n\n---\n\n## Phase 2: Analyze Sentiment\n\nRun `scripts\u002Fanalyze_sentiment.py`:\n\n```bash\npython3 \u003Cskill-path>\u002Fscripts\u002Fanalyze_sentiment.py \"\u003Cworkspace-path>\u002Freport\"\n```\n\nThis script:\n\n- Reads `\u003Cworkspace>\u002Freport\u002Fdata\u002F_all_feedback.json`\n- Scores each feedback item using regex-based sentiment analysis (word-boundary `\\b` matching, case-insensitive)\n- Detects common themes and adds a `themes` array to each record (list of matched theme names, e.g. `[\"Hands-on & Practical Learning\", \"MCP & Agent Development Skills\"]`)\n- Computes per-course grades using weighted average (positive=10, neutral=6, negative=2)\n- Outputs `\u003Cworkspace>\u002Freport\u002Fdata\u002F_analyzed.json` with sentiment labels, themes, and course stats\n\n### Output Structure\n\nThe `_analyzed.json` file contains:\n\n```json\n{\n  \"records\": [ ... ],        \u002F\u002F All records with added \"sentiment\" and \"themes\" fields\n  \"summary\": { \"total_records\", \"total_feedback\", \"positive\", \"neutral\", \"negative\", \"overall_grade\" },\n  \"course_stats\": {           \u002F\u002F Per-course: total, positive, neutral, negative, grade, themes (with counts)\n    \"Recruit\": { \"total\": 123, \"positive\": 100, ..., \"themes\": { \"Hands-on & Practical Learning\": 45, ... } }\n  }\n}\n```\n\n### Sentiment Keywords\n\nAll patterns use `\\b` word boundaries for precise matching (e.g. `\\bgreat\\b` matches \"great\" but not \"greater\").\n\n**Positive** patterns include: great, excellent, amazing, awesome, fantastic, wonderful, love\u002Floved, enjoy\u002Fenjoyed, helpful, useful, informative, well done, good job, thank\u002Fthanks, appreciate, impressive, learned, learning, eye-opening, recommend, looking forward, fun, excited, brilliant, clear, intuitive, practical, hands-on, well-structured, well-organized, good, nice, cool, neat, super, stellar, outstanding, perfect, phenomenal, beginner-friendly, easy to follow, straightforward, engaging, interesting, valuable, insightful, comprehensive, thorough, solid, smooth.\n\n**Positive emojis** (also scored as positive): ? ? ? ❤️ ? ? ⭐ ✨ ? ? ? ?\n\n**Negative** patterns include: error(s), issue(s), problem(s), bug(s)\u002Fbuggy, broke\u002Fbroken\u002Fcrash\u002Fcrashed, fail\u002Ffailed\u002Ffailure, didn't work, not work, couldn't, stuck, struggling\u002Fstruggle, missing, trouble, difficult\u002Fdifficulties, cumbersome, challenge(s), troubleshoot, confusing\u002Fconfused, frustrating\u002Ffrustrated, slow, complex, unclear, improve\u002Fimprovement, wish, lack\u002Flacking, disappoint\u002Fdisappointed.\n\n**Scoring rule:** If negative matches > positive matches → negative. Else if positive > 0 → positive. Else if negative > 0 → negative. Else → neutral.\n\n### Theme Detection\n\nThe analyzer detects 10 predefined themes by matching regex keywords against feedback text:\n\n| Theme                              | Keywords (regex)                                                                  |\n| ---------------------------------- | --------------------------------------------------------------------------------- |\n| Hands-on & Practical Learning      | hands-on, practical, interactive, step-by-step, real-world, exercise              |\n| Clear Instructions & Documentation | clear, well-document, well-explain, easy to follow, straightforward, instructions |\n| MCP & Agent Development Skills     | mcp, copilot studio, agent, connector, power automate, topic, action              |\n| Setup & Configuration Challenges   | setup, install, config, environment, prerequisite, authentication, credentials    |\n| VS Code Integration                | vs code, visual studio code, extension, editor, debug                             |\n| Valuable Learning Experience       | learn, knowledge, understand, skill, experience, educational, insight             |\n| Course Quality & Engagement        | well-design, engag, interest, quality, structure, organized, professional         |\n| Errors & Technical Issues          | error, bug, crash, broke, fail, fix, workaround                                   |\n| Improvement Suggestions            | improv, suggest, would be nice, could be, hope, wish, add more, future            |\n| Real-World Applicability           | real-world, production, business, enterprise, workplace, appl                     |\n\nA feedback item can match multiple themes. Themes are stored as `r['themes'] = [...]` on each record.\n\n---\n\n## Phase 3: Generate Charts\n\nRun `scripts\u002Fgenerate_charts.py`:\n\n```bash\npython3 \u003Cskill-path>\u002Fscripts\u002Fgenerate_charts.py \"\u003Cworkspace-path>\u002Freport\"\n```\n\nRequires `matplotlib` and `numpy`. Install if needed: `pip3 install matplotlib numpy`.\n\nThis generates overview charts plus individual per-course charts in `\u003Cworkspace>\u002Freport\u002Fcharts\u002F` at 180 DPI.\n\n**Note:** Submission\u002Fcompletion charts only count actual submissions (`source: \"excel\"` and `source: \"github_completed\"`). Non-badge GitHub issues (`source: \"github_issue\"`) are excluded from these charts — they are only used for sentiment analysis.\n\n### Course Grouping & Colors\n\nCharts group courses into 4 categories, each with a consistent color:\n\n| Group             | Color  | Hex     | Courses                        |\n| ----------------- | ------ | ------- | ------------------------------ |\n| Recruit           | Blue   | #3b82f6 | Recruit                        |\n| Operative         | Teal   | #14b8a6 | Operative                      |\n| Special Ops       | Orange | #f59e0b | All Special Ops missions       |\n| Cowork Collective | Purple | #a78bfa | All Cowork Collective missions |\n\n**Display order** (used in all charts): Recruit, Operative, Special Ops: YAML Specialist, Special Ops: Microsoft Copilot Studio MCP, Special Ops: Microsoft Learn Docs MCP Server, Special Ops: Power Platform CLI MCP Server, Cowork Collective: Badge Check, Cowork Collective: Compliance Packet, Cowork Collective: Out of Office.\n\n**Short names** used on chart axes (where full names are too long):\n\n| Full Name                                    | Short Name         |\n| -------------------------------------------- | ------------------ |\n| Special Ops: YAML Specialist                 | YAML Specialist    |\n| Special Ops: Microsoft Copilot Studio MCP    | Copilot Studio MCP |\n| Special Ops: Microsoft Learn Docs MCP Server | Learn Docs MCP     |\n| Special Ops: Power Platform CLI MCP Server   | PP CLI MCP         |\n| Cowork Collective: Badge Check               | Badge Check        |\n| Cowork Collective: Compliance Packet         | Compliance Packet  |\n| Cowork Collective: Out of Office             | Out of Office      |\n\n### Overview Charts\n\n| Chart                   | Filename                     | Description                                            |\n| ----------------------- | ---------------------------- | ------------------------------------------------------ |\n| Weekly completions      | `completions_over_time.png`  | Stacked area chart by course group                     |\n| Sentiment by course     | `sentiment_by_course.png`    | Horizontal stacked bar with positive\u002Fnegative % labels |\n| Course grades           | `grades_by_course.png`       | Lollipop chart sorted by grade (best → worst)          |\n| Cumulative completions  | `cumulative_completions.png` | Line chart with gradient fills and endpoint markers    |\n| Overall sentiment       | `sentiment_pie.png`          | Donut chart with total count in center                 |\n| Monthly feedback volume | `monthly_feedback.png`       | Stacked bar by month and course group                  |\n\n### Per-Course Charts\n\nFor each course, a `course_{slug}.png` file is generated (e.g. `course_recruit.png`, `course_operative.png`, `course_special_ops_yaml_specialist.png`). Each shows:\n\n- **Weekly submissions** as an area chart (primary axis)\n- **Cumulative total** as a dashed line (secondary axis)\n\nThe slug is the course name lowercased with spaces → underscores, colons removed, and ampersands → `\"and\"` (e.g. `\"Cowork Collective: Badge Check\"` → `course_cowork_collective_badge_check.png`).\n\nColor scheme (navy\u002Fteal theme matching cover): Blue (#3b82f6), Green (#22c55e), Red (#ef4444), Orange (#f59e0b), Purple (#a78bfa), Teal (#14b8a6). Charts use a consistent light background (#fafbfc), subtle grid (#e2e8f0), and navy (#111827) text.\n\n---\n\n## Phase 4: Build Markdown\n\nRun `scripts\u002Fbuild_markdown.py`:\n\n```bash\npython3 \u003Cskill-path>\u002Fscripts\u002Fbuild_markdown.py \"\u003Cworkspace-path>\u002Freport\"\n```\n\nThis generates three markdown files in `\u003Cworkspace>\u002Freport\u002Fmarkdown\u002F`:\n\n### management-summary.md\n\n- Title: \"Management Summary\"\n- Key metrics table (total completions, feedback count, courses, overall grade, sentiment percentages)\n  - **Total completions** excludes `source: \"github_issue\"` records (only counts actual submissions)\n- Highlights section (Recruit\u002FOperative counts, highest\u002Flowest rated courses)\n- Chart references (one per section with narrative text)\n- **4 main sections** — Recruit, Operative, Special Ops, Cowork Collective:\n  - **Single-course sections** (Recruit, Operative): spotlight content directly under the section heading\n  - **Multi-mission sections** (Special Ops, Cowork Collective): section-level summary first (combined grade, response count, cross-mission themes, section-level next steps), then individual mission spotlights as sub-sections with short names (e.g. \"YAML Specialist\" instead of \"Special Ops: YAML Specialist\")\n  - Each course\u002Fmission spotlight includes:\n    - Grade, response count, positive\u002Fnegative percentages\n    - Grade explanation — contextual note based on score range:\n      - ≥ 9.0: \"Exceptional satisfaction — one of the top-rated courses.\"\n      - ≥ 8.5: \"Strong satisfaction with consistently positive feedback.\"\n      - ≥ 8.0: \"Good satisfaction, though some participants encountered challenges.\"\n      - \u003C 8.0: \"Solid course, but a higher neutral\u002Fnegative ratio pulls the grade down.\"\n    - Top 3 themes with mention counts\n    - **Standout callout** — appears when positive % ≥ 85%: highlights most-praised theme\n    - **Watch area callout** — appears when negative % ≥ 15%: highlights top negative theme\n    - Representative quotes — **10 total**, split proportionally to the grade using formula: `num_positive = round(10 × grade \u002F 10)`. Grade 8.0\u002F10 → 8 positive, 2 negative. Quotes are selected by closest to ideal length (positive: ~250 chars, negative: ~200 chars).\n- Recommendations section (4 static recommendations: address setup challenges, expand Cowork Collective, scale Special Ops, continue monitoring)\n\n#### Quote Cleaning\n\nAll quotes in the report go through a cleaning pipeline before display:\n\n1. Newlines → spaces\n2. **Bold headers** (`**text**`) removed\n3. Markdown headers (`# ...`) removed\n4. Checkbox lines (`- [ ] ...`) removed\n5. Leading list dashes removed, inline dashes → periods\n6. HTML entities decoded (`&#39;` → `'`, `&amp;` → `&`)\n7. Collapsed whitespace\n8. Truncated at sentence boundary — positive quotes target ~250 chars max, negative quotes ~200 chars max (falls back to word boundary + `...` if no sentence break found above 80–100 chars)\n\n### feedback-analysis.md\n\n- Title: \"Detailed Feedback Analysis\"\n- Overall summary table (sentiment counts + percentages)\n- Course overview table (responses, sentiment breakdown, grade per course)\n- **Recruit & Operative: Submission Pipeline** — funnel-style comparison table showing GitHub badge submissions, badges awarded\u002Fpending with percentages, Excel form submissions, and other GitHub issues. Includes a note explaining that GitHub and Excel are independent channels.\n- **4 main sections** — Recruit, Operative, Special Ops, Cowork Collective:\n  - **Single-course sections** (Recruit, Operative): analysis content directly under the `## Section` heading (h2), with subsections as h3\n  - **Multi-mission sections** (Special Ops, Cowork Collective):\n    - **Section-level summary** (under h2): combined response count + grade, cross-mission themes (top 5 with positive\u002Fnegative indicators), section-level recommendations (up to 5 next steps based on aggregated data across all missions)\n    - **Per-mission blocks** (under h3): each mission gets its own analysis using the short name (e.g. \"YAML Specialist\", \"Badge Check\"), with sub-headings at h4 level\n  - Each course\u002Fmission block includes:\n    - Response counts and sentiment percentages\n    - **Submissions Over Time** chart (per-course chart reference)\n    - **Monthly trend table** showing submissions, sentiment breakdown, and grade per month\n    - **Top 5 themes** with mention counts and positive\u002Fnegative indicator\n    - **10 representative quotes** — balanced on grade using same formula as management summary (`round(10 × grade \u002F 10)` positive, remainder negative); each cleaned by the quote pipeline (see above); positive truncated to ~200 chars, negative to ~180 chars\n    - **Next Steps** — up to 5 prioritized, actionable recommendations generated algorithmically:\n\n#### Next Steps Algorithm\n\nEach course gets up to 5 next steps, generated in priority order:\n\n1. **Priority 1–2: Top negative themes** — The top 2 themes with the most negative mentions, but only if each has ≥ 3 negative mentions. Uses a theme→advice mapping:\n\n   | Theme                              | Advice                                                                                       |\n   | ---------------------------------- | -------------------------------------------------------------------------------------------- |\n   | Setup & Configuration Challenges   | Simplify setup — provide a pre-configured environment or improved quick-start guide...       |\n   | Errors & Technical Issues          | Fix reported bugs — audit the most common failure points and add troubleshooting guidance.   |\n   | Improvement Suggestions            | Act on improvement suggestions — review and prioritize the most-requested changes...         |\n   | Clear Instructions & Documentation | Improve documentation clarity — review step-by-step guides for completeness...               |\n   | VS Code Integration                | Improve VS Code experience — ensure extensions and tooling work seamlessly...                |\n   | MCP & Agent Development Skills     | Strengthen MCP\u002Fagent content — review labs where participants reported MCP-related issues... |\n   | Valuable Learning Experience       | Enhance learning depth — some participants felt the content could go deeper...               |\n   | Course Quality & Engagement        | Refine course structure — address pacing and engagement issues...                            |\n   | Hands-on & Practical Learning      | Improve hands-on exercises — ensure lab environments are reliable...                         |\n   | Real-World Applicability           | Add more real-world examples — participants want to see how skills apply to production...    |\n\n2. **Priority 3: Grade-based advice** — If grade \u003C 8.0: \"Boost course quality — current grade is below the 8.0 target.\" If grade \u003C 8.5: \"Target grade improvement — small refinements could push this above 8.5.\"\n3. **Priority 4: Leverage strengths** — Highlights the top positive theme: \"Double down on [theme] — most praised aspect ([count] positive mentions).\"\n4. **Priority 5: Engagement** — If \u003C 50 responses: \"Increase feedback volume — consider adding in-course feedback prompts.\" Otherwise: \"Continue monitoring — maintain the feedback loop and review sentiment trends monthly.\"\n\n### feedback.md\n\n- Curated positive-only feedback (excludes error-mentioning entries)\n- **Max 5 quotes per course** (~45 total), selected for ideal length (~250 chars)\n- Each item as a blockquote: `> ? \"text\" — Name (Course)`\n\n---\n\n## Phase 5: Export PDF\n\nRun `scripts\u002Fexport_pdf.py`:\n\n```bash\npython3 \u003Cskill-path>\u002Fscripts\u002Fexport_pdf.py \"\u003Cworkspace-path>\u002Freport\" \"\u003Creport-title>\"\n```\n\nExample: `python3 scripts\u002Fexport_pdf.py \"\u002Fpath\u002Fto\u002Fworkspace\u002Freport\" \"Agent Academy - Report April 2026\"`\n\nThis script:\n\n1. Downloads badge images from `https:\u002F\u002Fraw.githubusercontent.com\u002Fmicrosoft\u002Fagent-academy\u002Fmain\u002Fdocs\u002Fpublic\u002Fimages\u002F` to `\u003Cworkspace>\u002Freport\u002Fbadges\u002F` (if not already present)\n2. Builds a single HTML file with:\n   - **Cover page**: Dark navy gradient background with teal accent, grid overlay, Agent Academy logo, report title, all badge images\n     - **Title splitting**: The report title is split on `\" - \"` — the part before becomes the main title (large teal text), the part after becomes the subtitle (smaller slate text). E.g. `\"Agent Academy - Report April 2026\"` → main: `\"Agent Academy\"`, subtitle: `\"Report April 2026\"`.\n     - **Hardcoded elements**: \"Mission Report\" tag (top-right classification label), \"Microsoft Copilot Studio\" pre-title above the main title, \"Earned Badges\" label on the badge shelf, \"microsoft\u002Fagent-academy • Comprehensive Feedback & Completion Analysis\" footer text.\n   - **Management summary**: Converted from markdown with charts embedded as base64 images (H1 title stripped — the HTML provides its own)\n   - **Detailed analysis**: Concise per-course analysis with monthly trends, themes, and representative quotes (H1 title stripped)\n3. Exports to PDF using headless Microsoft Edge:\n   ```bash\n   \"\u002FApplications\u002FMicrosoft Edge.app\u002FContents\u002FMacOS\u002FMicrosoft Edge\" \\\n     --headless --disable-gpu --no-sandbox \\\n     --print-to-pdf=\"\u003Cworkspace>\u002Freport\u002Fpdf\u002F\u003Ctitle>.pdf\" \\\n     --no-pdf-header-footer \\\n     \"file:\u002F\u002F\u003Cworkspace>\u002Freport\u002F_report.html\"\n   ```\n4. Cleans up the temporary HTML file\n5. On macOS, automatically removes the `com.apple.quarantine` extended attribute so the PDF opens without a Gatekeeper warning\n\nThe output PDF lands in `\u003Cworkspace>\u002Freport\u002Fpdf\u002F`.\n\n### Page Break Rules\n\nThe HTML includes CSS rules to prevent content from splitting across pages:\n\n- Charts + their descriptions are wrapped in `.chart-block` divs with `page-break-inside: avoid`\n- Course spotlight sections (h3 + content) are wrapped in `.course-spotlight` divs\n- Headings (`h2`, `h3`, `h4`) use `page-break-after: avoid`\n- Tables, blockquotes, and images all have `page-break-inside: avoid`\n\n### Badge Images\n\nDownloaded from `microsoft\u002Fagent-academy` repo at `docs\u002Fpublic\u002Fimages\u002F`:\n\n- `logo.png` — Cover page logo\n- `mcs-agent-academy-recruit-badge.png`, `mcs-agent-academy-operative-badge.png`, `mcs-agent-academy-commander-badge.png` — Level badges\n- `YAML_Specialist_Badge.png`, `Academy_LearnMCP_Badge.png`, `CommandLine_Badge.png` — Special Ops badges\n- `BadgeBandit-badge.png`, `AuditAce-badge.png`, `Vacay-badge.png`, `MCP_Joker_Badge.png` — Cowork Collective badges\n\n### Edge Fallback\n\nThe script checks these browser paths in order and uses the first one found:\n\n1. `\u002FApplications\u002FMicrosoft Edge.app\u002FContents\u002FMacOS\u002FMicrosoft Edge` (macOS)\n2. `\u002Fusr\u002Fbin\u002Fmicrosoft-edge` (Linux)\n3. `\u002FApplications\u002FGoogle Chrome.app\u002FContents\u002FMacOS\u002FGoogle Chrome` (macOS)\n4. `\u002Fusr\u002Fbin\u002Fgoogle-chrome` (Linux)\n\n---\n\n## Phase 6: Verify PDF Formatting\n\nAfter generating the PDF, **always** open and visually inspect it to check for formatting issues. Use the `view_image` tool or open the PDF to review each page.\n\n### Verification Checklist\n\nCheck the following and fix any issues found:\n\n| Check                       | What to look for                                                                                 | Fix location                                                                      |\n| --------------------------- | ------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------- |\n| **Cover page**              | Logo centered, title\u002Fsubtitle readable, badges displayed in a row, no overflow                   | `export_pdf.py` CSS                                                               |\n| **Sentiment pie chart**     | Should be ~45% width, centered — NOT stretched full-width                                        | `export_pdf.py` `embed_md_images()` — use `max-width:45%` for `sentiment_pie`     |\n| **Per-course charts**       | Should be ~85% width, not full-width blowups                                                     | `export_pdf.py` `embed_md_images()` — use `max-width:85%` for `course_` charts    |\n| **h2 section starts**       | Each h2 (Recruit, Operative, Special Ops, Cowork Collective) should start on a new page in print | `export_pdf.py` `@media print` — `h2 { page-break-before: always }`               |\n| **First h2 after h1**       | Should NOT page-break (it follows right after the section title)                                 | `.content > h2:first-of-type { page-break-before: avoid }`                        |\n| **No orphan headings**      | h2\u002Fh3\u002Fh4 should not appear alone at bottom of a page                                             | `h2, h3, h4 { page-break-after: avoid }`                                          |\n| **Tables not split**        | Tables should not break across pages                                                             | `table { page-break-inside: avoid }`                                              |\n| **Blockquotes not split**   | Quotes should stay on one page                                                                   | `blockquote { page-break-inside: avoid }`                                         |\n| **Section-level summaries** | Cross-mission themes and next steps should use proper `###` headings, not bold inline text       | `build_markdown.py` — use `### Cross-Mission Themes` and `### Section Next Steps` |\n| **Line breaks**             | Stats line, themes, and next steps should be visually separated (not running together)           | `build_markdown.py` — ensure `\\n\\n` between sections                              |\n| **Funnel table**            | Submission pipeline table renders correctly with indented rows                                   | `build_markdown.py` `_build_comparison_table()`                                   |\n\n### Common Formatting Issues & Fixes\n\n**Chart too large \u002F stretched:**\nThe `embed_md_images()` function in `export_pdf.py` controls image sizing. It matches filenames to determine width:\n\n- `sentiment_pie` → `max-width:45%` (small donut chart)\n- `course_*` → `max-width:85%` (per-course charts)\n- Everything else → `max-width:100%` (overview charts)\n\nIf a chart looks wrong, adjust the `SMALL_CHARTS` or `MEDIUM_CHARTS` lists and the corresponding `max-width` percentages.\n\n**Heading appears alone at page bottom:**\nThis means `page-break-after: avoid` is not being respected (can happen with large content blocks). Wrap the heading + its following content in a `\u003Cdiv class=\"keep-together\">` block in `md_to_html()`.\n\n**Content runs together without spacing:**\nThe markdown-to-HTML converter treats `\\n\\n` as paragraph breaks (`\u003Cp>`). If content runs together, add an extra blank line in the markdown output (`build_markdown.py`). Use proper `###` headings instead of `**bold text:**` for visually distinct sections.\n\n**h2 doesn't start on new page:**\nOnly works in `@media print`. The `:first-of-type` selector prevents the first h2 in each `.content` div from page-breaking. If ALL h2s page-break when they shouldn't, check that the CSS selector is scoped correctly.\n\n### Re-export After Fixes\n\nIf any formatting issues are found and fixed in the Python scripts, re-run the affected steps:\n\n```bash\n# If build_markdown.py was changed:\npython3 \u003Cskill-path>\u002Fscripts\u002Fbuild_markdown.py \"\u003Cworkspace>\u002Freport\"\n\n# Always re-export PDF after any fix:\npython3 \u003Cskill-path>\u002Fscripts\u002Fexport_pdf.py \"\u003Cworkspace>\u002Freport\" \"\u003Creport-title>\"\n```\n\nThen verify again until all checks pass.\n\n---\n\nExcel filenames map to display names as follows:\n\n| Filename Pattern                                                                 | Course Name                                  |\n| -------------------------------------------------------------------------------- | -------------------------------------------- |\n| `Agent Academy - Special Ops_ YAML Specialist`                                   | Special Ops: YAML Specialist                 |\n| `Agent Academy - Special Ops_Microsoft Copilot Studio ❤️ MCP Mission Completion` | Special Ops: Microsoft Copilot Studio MCP    |\n| `Agent Academy - Special Ops_ Microsoft Learn Docs MCP Server`                   | Special Ops: Microsoft Learn Docs MCP Server |\n| `Agent Academy - Special Ops_⚡ Power Platform CLI MCP Server`                   | Special Ops: Power Platform CLI MCP Server   |\n| `Copilot Studio Agent Academy - Operative`                                       | Operative                                    |\n| `Copilot Studio Agent Academy - Recruit`                                         | Recruit                                      |\n| `Cowork Collective_ Badge Check Mission Completion`                              | Cowork Collective: Badge Check               |\n| `Cowork Collective_ Compliance Packet Mission Completion`                        | Cowork Collective: Compliance Packet         |\n| `Cowork Collective_ Out of Office Mission Completion`                            | Cowork Collective: Out of Office             |\n\nNote: filenames may contain non-breaking spaces (`\\xa0`) — normalize these to regular spaces before matching.\n\n---\n\n## Running the Full Pipeline\n\nTo generate a complete report in one go:\n\n```bash\n# 1. Extract from Excel\npython3 \u003Cskill-path>\u002Fscripts\u002Fextract_feedback.py \"\u003Cworkspace>\u002Freport\"\n\n# 2. Fetch GitHub issues via MCP tools:\n#    a. Badge submissions: recruit-completed + operative-completed labels (paginate ALL pages)\n#    b. Non-badge issues: all other issues, classified to courses by keyword\n#    c. Add source\u002Fis_closed fields, combine with Excel → _all_feedback.json\n\n# 3. Analyze sentiment\npython3 \u003Cskill-path>\u002Fscripts\u002Fanalyze_sentiment.py \"\u003Cworkspace>\u002Freport\"\n\n# 4. Generate charts\npython3 \u003Cskill-path>\u002Fscripts\u002Fgenerate_charts.py \"\u003Cworkspace>\u002Freport\"\n\n# 5. Build markdown\npython3 \u003Cskill-path>\u002Fscripts\u002Fbuild_markdown.py \"\u003Cworkspace>\u002Freport\"\n\n# 6. Export PDF\npython3 \u003Cskill-path>\u002Fscripts\u002Fexport_pdf.py \"\u003Cworkspace>\u002Freport\" \"Agent Academy - Report April 2026\"\n\n# 7. Verify PDF formatting\n#    Open the PDF and check: cover page, chart sizes, page breaks, spacing\n#    Fix any issues in export_pdf.py or build_markdown.py, then re-export\n```\n\nStep 2 requires the GitHub MCP tools and should be done interactively by the agent between steps 1 and 3.\n",{"name":5,"description":7},"main","989277d271bbc8776ba09173471689ea151c193d",".github\u002Fskills\u002Fagent-academy-report",219,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fagent-academy","https:\u002F\u002Faka.ms\u002Fagent-academy","https:\u002F\u002Fgithub.com\u002Fmicrosoft","https:\u002F\u002Fopensource.microsoft.com","Open source projects and samples from Microsoft","2026-11-05 22:35:00",{"source":8,"skillName":5,"commands":55,"prompt":65,"zipAvailable":66},[56,59,62],{"tool":57,"command":58},"npx","npx skills add microsoft\u002Fagent-academy --skill agent-academy-report",{"tool":60,"command":61},"bunx","bunx skills add microsoft\u002Fagent-academy --skill agent-academy-report",{"tool":63,"command":64},"pnpm","pnpm dlx skills add microsoft\u002Fagent-academy --skill agent-academy-report","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fagent-academy\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fagent-academy-report\u002FSKILL.md",true,[68,74,78,82,86,90,94,98,104,108,112,116],{"path":69,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":72,"sourceHtmlUrl":73},"agents\u002Fcritic.md","REFERENCE","参考文档",1824,"https:\u002F\u002Fgithub.com\u002FSirTheOracle\u002Fforge-toolkit\u002Fblob\u002Fmain\u002Fskills\u002Fadversarial-proposal\u002Fagents\u002Fcritic.md",{"path":75,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":76,"sourceHtmlUrl":77},"agents\u002Fproposer.md",2955,"https:\u002F\u002Fgithub.com\u002FSirTheOracle\u002Fforge-toolkit\u002Fblob\u002Fmain\u002Fskills\u002Fadversarial-proposal\u002Fagents\u002Fproposer.md",{"path":79,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":80,"sourceHtmlUrl":81},"agents\u002Freconciler.md",4195,"https:\u002F\u002Fgithub.com\u002FSirTheOracle\u002Fforge-toolkit\u002Fblob\u002Fmain\u002Fskills\u002Fadversarial-proposal\u002Fagents\u002Freconciler.md",{"path":83,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":84,"sourceHtmlUrl":85},"agents\u002Fsynthesizer.md",4992,"https:\u002F\u002Fgithub.com\u002FSirTheOracle\u002Fforge-toolkit\u002Fblob\u002Fmain\u002Fskills\u002Fadversarial-proposal\u002Fagents\u002Fsynthesizer.md",{"path":87,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":88,"sourceHtmlUrl":89},"references\u002Fagent-teams-workflow.md",12627,"https:\u002F\u002Fgithub.com\u002FSirTheOracle\u002Fforge-toolkit\u002Fblob\u002Fmain\u002Fskills\u002Fadversarial-proposal\u002Freferences\u002Fagent-teams-workflow.md",{"path":91,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":92,"sourceHtmlUrl":93},"references\u002Fproposal-format.md",3376,"https:\u002F\u002Fgithub.com\u002FSirTheOracle\u002Fforge-toolkit\u002Fblob\u002Fmain\u002Fskills\u002Fadversarial-proposal\u002Freferences\u002Fproposal-format.md",{"path":95,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":96,"sourceHtmlUrl":97},"references\u002Fsubagent-fallback.md",11052,"https:\u002F\u002Fgithub.com\u002FSirTheOracle\u002Fforge-toolkit\u002Fblob\u002Fmain\u002Fskills\u002Fadversarial-proposal\u002Freferences\u002Fsubagent-fallback.md",{"path":99,"resourceType":100,"resourceTypeDesc":101,"sizeBytes":102,"sourceHtmlUrl":103},"scripts\u002Fanalyze_sentiment.py","SCRIPT","脚本",6994,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fagent-academy\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fagent-academy-report\u002Fscripts\u002Fanalyze_sentiment.py",{"path":105,"resourceType":100,"resourceTypeDesc":101,"sizeBytes":106,"sourceHtmlUrl":107},"scripts\u002Fbuild_markdown.py",33434,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fagent-academy\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fagent-academy-report\u002Fscripts\u002Fbuild_markdown.py",{"path":109,"resourceType":100,"resourceTypeDesc":101,"sizeBytes":110,"sourceHtmlUrl":111},"scripts\u002Fexport_pdf.py",17784,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fagent-academy\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fagent-academy-report\u002Fscripts\u002Fexport_pdf.py",{"path":113,"resourceType":100,"resourceTypeDesc":101,"sizeBytes":114,"sourceHtmlUrl":115},"scripts\u002Fextract_feedback.py",5691,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fagent-academy\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fagent-academy-report\u002Fscripts\u002Fextract_feedback.py",{"path":117,"resourceType":100,"resourceTypeDesc":101,"sizeBytes":118,"sourceHtmlUrl":119},"scripts\u002Fgenerate_charts.py",17388,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fagent-academy\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fagent-academy-report\u002Fscripts\u002Fgenerate_charts.py",[121,134,142,150,157,164],{"skillNo":122,"name":123,"nameZh":6,"description":124,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":125,"categories":126,"keywords":131,"publishedAt":39},"01M699N3CMNAZY11BM55YDB2VY","outlook-pre-onboarding-checklist-meeting","Create a 1-hour Outlook follow-up meeting for pre-onboarding after a successful Docusign workflow trigger, using the employee name and agreement effective date from workflow context.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fagent-academy\u002Fblob\u002Fmain\u002Fdocs\u002Fspecial-ops\u002Fdocusign-mcp\u002Fassets\u002Fsample-skill\u002FSKILL.md",[127,128],{"categoryNo":30,"categoryName":31,"taxonomyType":32,"taxonomyTypeDesc":33},{"categoryNo":129,"categoryName":130,"taxonomyType":32,"taxonomyTypeDesc":33},"01JBSEEDCAT000000000000038","人力资源",[132,133],"outlook pre onboarding checklist meeting","workflow",{"skillNo":135,"name":136,"nameZh":6,"description":137,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":138,"categories":139,"keywords":140,"publishedAt":39},"01M699N27KQF7X22QHFTYBCGH2","device-guidance-v1-0-4","Helps employees identify available device options based on their needs, using the `Get Employee Assets` tool.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fagent-academy\u002Fblob\u002Fmain\u002Fdocs\u002Frecruit-nextgen\u002F07-automate-with-workflows\u002Fassets\u002Fdevice-guidance-v1-0-4\u002FSKILL.md",[],[141],"device guidance v1 0 4",{"skillNo":143,"name":144,"nameZh":6,"description":145,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":146,"categories":147,"keywords":148,"publishedAt":39},"01M699N109HNVTY7D4TARZ6WCT","troubleshooting-procedure","Call this when a user states an IT issue and requests troubleshooting help. It provides step-by-step procedure for diagnosing and resolving IT issues, including escalation with a ticket summary.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fagent-academy\u002Fblob\u002Fmain\u002Fdocs\u002Frecruit-nextgen\u002F06-add-skills\u002Fassets\u002Fit-troubleshooting-procedure\u002FSKILL.md",[],[149],"troubleshooting procedure",{"skillNo":151,"name":152,"nameZh":6,"description":137,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":153,"categories":154,"keywords":155,"publishedAt":39},"01M699MZTEGG5Z9HJEPPWR8MX0","device-guidance-v1-0-3","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fagent-academy\u002Fblob\u002Fmain\u002Fdocs\u002Frecruit-nextgen\u002F06-add-skills\u002Fassets\u002Fdevice-guidance-v1-0-3\u002FSKILL.md",[],[156],"device guidance v1 0 3",{"skillNo":158,"name":159,"nameZh":6,"description":137,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":160,"categories":161,"keywords":162,"publishedAt":39},"01M699MY3MXWR14ZKG8J2S2W81","device-guidance-v1-0-2","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fagent-academy\u002Fblob\u002Fmain\u002Fdocs\u002Frecruit-nextgen\u002F06-add-skills\u002Fassets\u002Fdevice-guidance-v1-0-2\u002FSKILL.md",[],[163],"device guidance v1 0 2",{"skillNo":165,"name":166,"nameZh":6,"description":137,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":167,"categories":168,"keywords":169,"publishedAt":39},"01M699MWSGDSNKX7F5A9E9TC4K","device-guidance-v1-0-1","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fagent-academy\u002Fblob\u002Fmain\u002Fdocs\u002Frecruit-nextgen\u002F06-add-skills\u002Fassets\u002Fdevice-guidance-v1-0-1\u002FSKILL.md",[],[170],"device guidance v1 0 1"]