Conversation
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ve fastTrack global from buildPlatformCard
…mendation Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…tem + DESIGN.md tokens - Fix 110 broken hsl(var(--X)) double-wraps (vars stored full hsl() values, then wrapped in another hsl() → all colors rendered transparent) - Update primary blue to #0078D4 (real MS brand blue, was #0090FF) - Add canvas gradient to body background (DESIGN.md spec) - Add Geist Mono font import; update --font-sans to Segoe UI Variable - Fix footer link touch targets (min-height: 44px, proper padding) - Fix platform icon circle (border-radius: 50% → var(--radius)) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Header logo: inline sparkle SVG (white on #0078D4 square, 18px) - Welcome hero: styled icon container (blue sparkle on #EFF6FC, 36px) - Remove unused font-size from .logo-icon - Fix remaining hsl(var()) double-wraps in index.html inline styles Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
When the user chooses "No — I need a custom agent", M365 Copilot is not a valid recommendation. It is only appropriate for the built-in/fast-track path. Add it to zeroed platforms whenever fastTrack is false. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… fix double bullets
…title from 48px to 28px
html2canvas produces low-quality output with washed-out colors and poor font rendering. The shareable URL is the primary sharing mechanism — it's linkable, temporal, and re-evaluatable. PNG export removed along with loadHtml2Canvas() and downloadCardImage(). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Professional developer (q1c): agent_builder 0→1, copilot_studio 0→1 Data scientist (q1d): copilot_studio 0→1 A pro dev CAN use simpler platforms for simple agents. The persona question should signal affinity, not hard-filter. Foundry still leads when other answers are neutral, but a clear simple-agent path can now overcome the 2-point gap. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
… devs" This reverts commit efe129b.
…o devs When the user selects 'Professional developer' or 'Data scientist' and the recommendation is Copilot Studio, show a contextual note: agents can be built in YAML with the Copilot Studio VS Code extension — no low-code canvas required. This keeps scoring honest while contextualizing the recommendation for the developer audience. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
… Scientist Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Add persona_tips field to recommendations in apa.yaml. JS now reads tips dynamically by matching the user's q1 answer against the persona_tips keys. Any platform can now have persona-specific tips without JS changes. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…e YAML meta - Delete ICON_PATHS (38 lines) and getIcon() from apa.js — zero references since structure/implementation removal - Remove 244 lines of dead v1 CSS (checklist, structure, component, agent-types selectors) - Remove duplicate .question-subtitle CSS selector - Delete index-old.html (2,875 lines v1 reference file) - Remove dead meta.scale_max and meta.questions_count from apa.yaml - Fix CLAUDE.md duplicate 'Key actions' section - Add welcome grid mobile stacking TODO Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Extract shared getContributions() helper — eliminates duplicated question-iteration pattern in getKeyFactors(), getScoreReason(), and computeDecisionKeyFactors() - Move HARD_RULES and HARD_RULE_LABELS from JS constants to apa.yaml scoring.hard_rules — content lives in YAML, JS reads it - getZeroedPlatforms() now reads from apa.scoring.hard_rules - getKeyFactors() and getScoreReason() use YAML labels directly Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…tle, dark mode CSS prep - YAML schema validation: validate questions, scoring, recommendations, and meta.platforms after load — errors shown in existing error section - sessionStorage: persist wizard answers across page refresh, with schema drift detection (silently discards stale data), private browsing guard (try/catch), and URL params always take precedence - Dynamic tab title: 'APA: [Platform] recommended' on results, reverts to 'Agent Platform Advisor — Microsoft CAT' on restart - Dark mode CSS prep: extract body gradient to --gradient-start/mid/end custom properties, replace hardcoded #fff and #107C10 with var(--card) and var(--success) tokens Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Guided Exploration: - Third prescreen option: 'I'm exploring what's possible with agents' - Dedicated exploration screen with 2×2 platform card grid - 'Best for' labels in Geist Mono + primary blue (per design review) - Scenario-focused summaries from new YAML fields (exploration_best_for, exploration_summary) on each platform recommendation - Responsive: single column at 768px, full-width CTA at 480px - Back navigation to prescreen, CTA bridges to assessment Why Not explainer: - computeWhyNot() finds the question where winner most outscored runner-up - Renders inside pair banner as caption text for close scores - Threshold synced to 2 points (was 1) — consistent with pair banner - Max-width 480px for line length, responsive at mobile Clarity analytics: - wizard_completed, fast_track, card_shared, card_url_loaded, temporal_change, platform — all 6 events from the plan - Guarded with typeof clarity check for environments without Clarity - Removed Clarity TODO (implemented), elevated Playwright priority to High - Cleaned up dead media query selectors (checklist, structure, agent-types) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…get to 44px Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
… target to 44px Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
Pull request overview
This PR delivers “Agent Platform Advisor v2”, refactoring the advisor into a YAML-driven SPA with externalized CSS/JS, updated content/scoring, and new sharing/exploration UX for the Microsoft CAT GitHub Pages site.
Changes:
- Replaced the previous inline HTML/CSS/JS implementation with a YAML-driven app shell (
apa.yaml+assets/apa.js+assets/apa.css). - Added new UX features (guided exploration, decision/share card, score breakdown rendering) and updated analytics hooks.
- Added/updated documentation and repo guidance (DESIGN system, changelog, Copilot instructions), plus a large set of static image asset updates/removals.
Reviewed changes
Copilot reviewed 8 out of 72 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
| images/youtube_social_icon_red.png | Image asset update |
| images/story-nominate.png | Image asset update |
| images/stories.png | Image asset update |
| images/stories-youtube.png | Image asset update |
| images/sitelogo.png | Image asset update |
| images/prev sessions style.png | Image asset update |
| images/PowerUp.png | Image asset update |
| images/PowerPlatform.png | Image asset update |
| images/powercatlive.png | Image asset update |
| images/powa.png | Image asset update |
| images/pic09old.jpg | Image asset update |
| images/pic08.jpg | Image asset update |
| images/pic07.jpg | Image asset update |
| images/pic06.jpg | Image asset update |
| images/pic05.jpg | Image asset update |
| images/pic04.jpg | Image asset update |
| images/pic03.jpg | Image asset update |
| images/pic02.jpg | Image asset update |
| images/pic01.jpg | Image asset update |
| images/paw.png | Image asset update |
| images/MCS-bootcamp-banner.png | Image asset update |
| images/link.svg | Removed SVG asset |
| images/ks.png | Image asset update |
| images/ks-banner.jpg | Image asset update |
| images/ks-banner-share.jpg | Image asset update |
| images/ic-teams.svg | Removed SVG asset |
| images/headerblack.png | Image asset update |
| images/Header.jpg | Image asset update |
| images/guidance.png | Image asset update |
| images/footer2.png | Image asset update |
| images/footer2.jpg | Image asset update |
| images/footer.jpg | Image asset update |
| images/external-link.png | Image asset update |
| images/eac.png | Image asset update |
| images/eac-infographic.png | Image asset update |
| images/CSKit.png | Image asset update |
| images/creator.png | Image asset update |
| images/CopilotStudio.svg | Removed SVG asset |
| images/CopilotStudio.png | Image asset update |
| images/copilot-studio-canvas.png | Image asset update |
| images/copilot-logo.jpg | Image asset update |
| images/comic/bg.gif | Image asset update |
| images/CoE.png | Image asset update |
| images/c6825030-502e-4df0-ad5e-908824093e1e.jpg | Image asset update |
| images/blog.png | Image asset update |
| images/azdo.png | Image asset update |
| images/automation.png | Image asset update |
| images/arch-center.png | Image asset update |
| images/approvals.png | Image asset update |
| images/approvals-kit-logo.png | Image asset update |
| images/ALMAccelerators.png | Image asset update |
| images/ALMAccelerator.png | Image asset update |
| images/alm.png | Image asset update |
| images/AIwebinarBanner.jpg | Image asset update |
| images/ai-webinar-banner.jpg | Image asset update |
| images/agent-bat/image5.svg | Removed SVG asset |
| images/agent-bat/image3.svg | Removed SVG asset |
| images/adoption.png | Image asset update |
| images/78a4a57e-365c-40bf-8e9a-1564b0401577.png | Image asset update |
| images/6e87e7e4-4ab1-4622-b02b-2ed1b379d792.jpg | Image asset update |
| images/5ea7090de8e61d1bec8b459b_hero-wave.svg | Removed SVG asset |
| images/5b15deb6-7e4b-4798-87bf-859f7194755b.jpg | Image asset update |
| agent-platform-advisor/TODOS.md | Added roadmap items (tests, dark mode, responsive fix) |
| agent-platform-advisor/index.html | New v2 app shell wiring sections + external CSS/JS |
| agent-platform-advisor/DESIGN.md | Added v2 design system specification |
| agent-platform-advisor/CLAUDE.md | Added contributor guidance for APA v2 structure/design constraints |
| agent-platform-advisor/CHANGELOG.md | Added detailed v2 changelog entries |
| agent-platform-advisor/assets/apa.js | Added YAML load + scoring, navigation, share card, URL parsing |
| agent-platform-advisor/assets/apa.css | Added v2 styling aligned to DESIGN.md tokens |
| agent-platform-advisor/apa.yaml | Added scoring matrix + platform recommendation content |
| .gitignore | Minor formatting/line normalization |
| .github/copilot-instructions.md | Added repo-level Copilot/contributor instructions |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| const questionIds = new Set(apa.questions.map(q => q.id)); | ||
| const validOptionIds = new Set(); | ||
| apa.questions.forEach(q => q.options.forEach(o => validOptionIds.add(o.id))); | ||
|
|
||
| let hasValidAnswer = false; | ||
| let hasDrift = false; | ||
|
|
||
| questionIds.forEach(qId => { | ||
| const value = params.get(qId); | ||
| if (value && validOptionIds.has(value)) { | ||
| answers[qId] = value; | ||
| hasValidAnswer = true; | ||
| } else if (value) { | ||
| // Unknown option — schema drift, ignore | ||
| hasDrift = true; | ||
| } | ||
| }); | ||
|
|
||
| // Check for questions in YAML not present in URL |
There was a problem hiding this comment.
parseURLParams() treats any globally-valid option id as valid for any question (it only checks validOptionIds.has(value)). This allows malformed shared URLs (e.g., ?q1=q2b) to populate answers with an option that isn’t part of that question, which then enables the Next button (nextBtn.disabled = !answers[question.id]) even though nothing is actually selected and also skews scoring/drift detection. Validate per-question by checking the option exists in that question’s options (similar to restoreAnswersFromStorage()), and ignore/flag values that don’t belong to the given question.
| const questionIds = new Set(apa.questions.map(q => q.id)); | |
| const validOptionIds = new Set(); | |
| apa.questions.forEach(q => q.options.forEach(o => validOptionIds.add(o.id))); | |
| let hasValidAnswer = false; | |
| let hasDrift = false; | |
| questionIds.forEach(qId => { | |
| const value = params.get(qId); | |
| if (value && validOptionIds.has(value)) { | |
| answers[qId] = value; | |
| hasValidAnswer = true; | |
| } else if (value) { | |
| // Unknown option — schema drift, ignore | |
| hasDrift = true; | |
| } | |
| }); | |
| // Check for questions in YAML not present in URL | |
| let hasValidAnswer = false; | |
| let hasDrift = false; | |
| // Validate answers per question to ensure option belongs to that question | |
| apa.questions.forEach(q => { | |
| const value = params.get(q.id); | |
| if (!value) return; | |
| const optionBelongsToQuestion = q.options && q.options.some(o => o.id === value); | |
| if (optionBelongsToQuestion) { | |
| answers[q.id] = value; | |
| hasValidAnswer = true; | |
| } else { | |
| // Unknown or mismatched option for this question — schema drift, ignore value | |
| hasDrift = true; | |
| } | |
| }); | |
| // Check for questions in YAML not present in URL (or with invalid/missing answers) |
| } | ||
|
|
||
| function renderRecommendation() { | ||
| clearAnswersFromStorage(); |
There was a problem hiding this comment.
renderRecommendation() starts by calling clearAnswersFromStorage(), which removes the persisted wizard state as soon as results render. This undermines the stated sessionStorage persistence (refreshing on the recommendation page will no longer be recoverable). Consider only clearing storage on explicit restart() (or after a successful share/export), not on every render of the recommendation.
| clearAnswersFromStorage(); |
| .exploration-card { | ||
| background: var(--card); | ||
| border: 1px solid var(--border-subtle); | ||
| border-radius: var(--radius); | ||
| padding: 24px; | ||
| text-align: left; | ||
| box-shadow: var(--shadow-md); | ||
| } |
There was a problem hiding this comment.
.exploration-card uses box-shadow: var(--shadow-md), but --shadow-md is not defined in :root (so the declaration is ignored and the card loses the intended elevation). Define --shadow-md (and any other shadow tokens you rely on) in :root per DESIGN.md, or replace this usage with the explicit shadow value used elsewhere (e.g., .card).
| <a href="#" class="exploration-back" onclick="showSection('prescreen-section');pushState('prescreen-section');return false">← Back to options</a> | ||
| <h2 class="welcome-heading" style="font-size:32px">Explore Microsoft Agent Platforms</h2> | ||
| <p class="welcome-description">See what each platform offers before deciding which fits your scenario.</p> | ||
| <div class="exploration-grid" id="exploration-grid"></div> | ||
| <div class="exploration-cta"> | ||
| <h3 class="exploration-cta-heading">Not sure which fits? Let the assessment guide you</h3> | ||
| <button class="btn btn-primary btn-lg" onclick="handlePrescreenNo()">Start the Assessment →</button> | ||
| </div> |
There was a problem hiding this comment.
This page reintroduces several inline style= attributes (e.g., the exploration heading font-size and multiple style="display:none" toggles). Inline styles make theming and maintenance harder and contradict the repo’s documented preference for class-based styling. Prefer CSS classes (e.g., reuse .hidden) or the hidden attribute with JS toggling classes instead of setting inline style.
| - platforms: [m365_copilot, copilot_studio] | ||
| rationale: Microsoft 365 Copilot for end users, Copilot Studio for customization and extension. | ||
| - platforms: [agent_builder, m365_copilot] | ||
| rationale: Agent Builder for Microsoft 365-native agents, Microsoft 365 Copilot for broader extensibility. |
There was a problem hiding this comment.
tie_handling.valid_pairs includes pairs with m365_copilot, but the scoring engine always zeroes m365_copilot when fastTrack is false (getZeroedPlatforms()), and the fast-track path bypasses tie handling entirely. This makes these YAML entries effectively unreachable/dead configuration. Either remove the unreachable pairs or adjust the logic so tie handling can actually surface them where intended.
| - platforms: [m365_copilot, copilot_studio] | |
| rationale: Microsoft 365 Copilot for end users, Copilot Studio for customization and extension. | |
| - platforms: [agent_builder, m365_copilot] | |
| rationale: Agent Builder for Microsoft 365-native agents, Microsoft 365 Copilot for broader extensibility. |
Massive update to Agent Platform Advisor