Skip to content

Agent Platform Advisor v2#14

Open
RobStand wants to merge 138 commits into
mainfrom
apa-v2
Open

Agent Platform Advisor v2#14
RobStand wants to merge 138 commits into
mainfrom
apa-v2

Conversation

@RobStand
Copy link
Copy Markdown
Member

@RobStand RobStand commented Apr 1, 2026

Massive update to Agent Platform Advisor

RobStand and others added 30 commits March 12, 2026 09:41
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>
…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>
RobStand and others added 15 commits April 1, 2026 11:05
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>
…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>
@RobStand RobStand requested a review from Copilot April 1, 2026 21:46
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment on lines +729 to +747
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
Copy link

Copilot AI Apr 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Suggested change
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)

Copilot uses AI. Check for mistakes.
}

function renderRecommendation() {
clearAnswersFromStorage();
Copy link

Copilot AI Apr 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Suggested change
clearAnswersFromStorage();

Copilot uses AI. Check for mistakes.
Comment on lines +561 to +568
.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);
}
Copy link

Copilot AI Apr 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

.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).

Copilot uses AI. Check for mistakes.
Comment on lines +179 to +186
<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>
Copy link

Copilot AI Apr 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copilot uses AI. Check for mistakes.
Comment on lines +265 to +268
- 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.
Copy link

Copilot AI Apr 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Suggested change
- 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.

Copilot uses AI. Check for mistakes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants