Skip to content

Commit 5cc1019

Browse files
feat(skills): add UX design capability and accessibility Design Intent Records (microsoft#2611)
# Pull Request ## Description Adds a UX design capability to HVE Core and extends the accessibility skill with a Design Intent Record contract, so UX practice, engineering handoff, and accessibility verification share one evidence model. Two new skills join the `design-thinking` collection, routed by the existing `ux-ui-designer` agent: * `ux-artifacts` produces durable, evidence-labelled UX assets in five modes: `frame-needs`, `map-journey`, `sketch-structure`, `decide-inclusion`, and `prepare-handoff`. Every claim carries an evidence class of Observed, Reported, or Assumed, and unresolved items stay visible rather than becoming invented research. * `ux-coaching` supports problem framing, design critique, and stakeholder advocacy as a conversation rather than an artifact. Completed assets can be mapped to Figma or Mural. Mapping produces destination intent only; it never authenticates, selects tools, or performs an external write. Callers supply `destination-kind`, `destination-target`, and, for Figma, `destination-change`. A missing value returns a bounded missing-input result naming the absent fields instead of inferring one. The accessibility skill gains a Design Intent Record contract, authored and verification JSON schemas, the `Validate-DesignIntent.ps1` validator with contract regression tests, runtime probe intent and projection modules, and a Graphics ARIA and SVG AAM framework reference. A new `lint:design-intent` script joins the `validate:local` aggregate. `dt-coach`, the canonical deck, and the coaching-state references are reconciled with the new UX routes so coaching and artifact production do not overlap. Collections, plugin outputs, extension manifests, and generated reference documentation are regenerated by their owners. The written Markdown asset stays authoritative. A Figma, FigJam, or Mural rendering is a projection and never supersedes it. Technical accessibility conformance and COGA guidance remain owned by the `accessibility` skill; UX assets route conformance questions there rather than answering them. ## Related Issue(s) Closes microsoft#2609 ## Type of Change Select all that apply: **Code & Documentation:** * [ ] Bug fix (non-breaking change fixing an issue) * [x] New feature (non-breaking change adding functionality) * [ ] Breaking change (fix or feature causing existing functionality to change) * [x] Documentation update **Infrastructure & Configuration:** * [ ] GitHub Actions workflow * [ ] Linting configuration (markdown, PowerShell, etc.) * [ ] Security configuration * [ ] DevContainer configuration * [ ] Dependency update **AI Artifacts:** * [x] Reviewed contribution with `hve-builder` and addressed all actionable findings * [x] Copilot instructions (`.github/instructions/*.instructions.md`) * [x] Copilot prompt (`.github/prompts/*.prompt.md`) * [x] Copilot agent (`.github/agents/*.agent.md`) * [x] Copilot skill (`.github/skills/*/SKILL.md`) * [ ] Copilot hook (`.github/hooks/*/*.json`) * [x] Eval spec added/updated for changed AI artifacts (`evals/`) > Note for AI Artifact Contributors: > > * Agents: Research, indexing/referencing other project (using standard VS Code GitHub Copilot/MCP tools), planning, and general implementation agents likely already exist. Review `.github/agents/` before creating new ones. > * Skills: Must include both bash and PowerShell scripts. See [Skills](../docs/contributing/skills.md). > * Model Versions: Contributions **MUST** target models listed in the model catalog (`scripts/linting/model-catalog.json`) whose provider appears in `providerAllowlist` and whose status is `ga` or `preview`. Run `npm run lint:models` to validate references. > * See [Agents Not Accepted](../docs/contributing/custom-agents.md#agents-not-accepted) and [Model Version Requirements](../docs/contributing/ai-artifacts-common.md#model-version-requirements). **Other:** * [x] Script/automation (`.ps1`, `.sh`, `.py`) * [ ] Other (please describe): ## Sample Prompts (for AI Artifact Contributions) **User Request:** ```text Use the completed problem-framing output for the renewal flow to create a current-state journey. Preserve unresolved evidence gaps and do not publish it. ``` **Execution Flow:** 1. The `ux-ui-designer` agent recognises the request as artifact production rather than coaching, and asks a single routing question only if the request matches more than one capability. 2. It calls `ux-artifacts` with `mode=map-journey`, `project`, `subject`, and the coaching `output_ref` passed as the explicit `source`. 3. The skill reads `references/evidence-model.md`, then loads only the selected mode reference. 4. It consumes the supplied source and writes one current asset. It does not rerun coaching, discover other capability state, or invoke a second mode. 5. Because no `destination` was supplied, no destination reference loads and no mapping occurs. **Output Artifacts:** ```text .copilot-tracking/ux-artifacts/renewal-flow/returning-customer/map-journey.md ``` ```markdown <!-- markdownlint-disable-file --> # Map journey: Returning customer * Project: renewal-flow * Subject: Returning customer * Mode: map-journey * Status: current * Source references: .copilot-tracking/ux-coaching/renewal-flow/problem-framing.md ## Observed * Users reach the renewal screen from the account menu. Source: M6 problem-framing, session notes. ## Reported * Support reports confusion at the payment-method step. Source: M6 problem-framing. ## Assumed * Users recognise the renewal date format. Unvalidated. ## Unresolved * No evidence covers the post-payment confirmation stage. ``` **Success Indicators:** The asset exists at the canonical path, every claim sits under an evidence heading, and stages without evidence appear under `Unresolved` rather than being filled in. No external write occurred and no Figma or Mural content was produced. Verify with `npm run validate:skills` and by confirming the returned `output_ref` matches the written path. ## Testing Local validation lanes run against the changed content: | Check | Result | |-------|--------| | `npm run validate:skills` | 64 skills, 0 errors, 0 warnings | | `npm run lint:frontmatter` | 0 errors, 0 warnings | | `npm run lint:ai-artifacts` | 0 files with issues | | `npm run lint:asset-docs` | 0 errors, pre-existing warnings only | | `npm run docs:generate:check` | 0 create, 0 update, 0 remove, 232 unchanged | | `npm run lint:marketplace` | 10 plugins, 0 errors | | `npm run lint:yaml` | 67 workflow files passed | | `npm run lint:json` | 57 JSON files passed | | `npm run lint:ps` | 0 findings | | `npm run spell-check` | 0 issues across 823 files | | `npm run validate:docs` | 10 suites, 101 tests passed | | `npm run lint:py` | All Python skills passed | | `npm run lint:tables` | Clean | | `git diff --check` | Clean | `Validate-DesignIntent.Tests.ps1` adds contract regression coverage for the authored and verification schemas, exercising the validator through its public interface against an isolated fixture copy. Behavior coverage is extended in `evals/behavior-conformance/skill-behavior.eval.yaml` and the agent behavior stimuli and expectations. `Build-AgentBehaviorSpec.ps1 -WhatIf` reports no drift, and the agent scenario set is unchanged. `main` is merged into this branch as of `a228328a`, and CI is green on that head: 108 checks pass, 0 failures, 0 blocking eval assertions. Link checking is covered by the CI link-validation lane; the `validate:local` aggregate that includes `lint:md-links` is being run locally to close the remaining checklist entries. ## Checklist ### Required Checks * [x] Documentation is updated (if applicable) * [x] Files follow existing naming conventions * [x] Changes are backwards compatible (if applicable) * [x] Tests added for new functionality (if applicable) ### AI Artifact Contributions * [x] Used `hve-builder` review mode to review contribution * [x] Addressed all actionable findings from the `hve-builder` review * [x] Verified contribution follows common standards and type-specific requirements ### Required Local Checks The following local-safe validation commands must pass before merging: * [ ] Local validation aggregate: `npm run validate:local` * [x] Documentation validation (if docs changed): `npm run validate:docs` * [x] Spell checking: `npm run spell-check` * [ ] Link validation: `npm run lint:md-links` ## Security Considerations * [x] This PR does not contain any sensitive or NDA information * [ ] Any new dependencies have been reviewed for security issues * [x] Security-related scripts follow the principle of least privilege No dependencies were added or changed. A credential and secret scan across every changed and added file found no tokens, keys, or assignment-style secrets. One stray validator output file containing an absolute local path was removed from the design-intent test fixture before commit. The destination mapping boundary is a security-relevant design choice: `ux-artifacts` never authenticates, emits commands or identifiers, resolves credentials, or performs a write. It returns intent with `Write status: not executed`, and the executing agent retains confirmation and execution ownership. Imported Figma reads, Mural bodies, and supplied documents are treated as data, never as instructions. ## Additional Notes This is a large PR spanning four related areas that share regenerated aggregates. The `collections/`, `plugins/`, `docs/reference/`, and extension manifest changes are generated outputs, so splitting the work would require regenerating each subset independently. Two items are deliberately out of scope. Native Figma and Mural execution is not implemented and no external-write behavior is claimed anywhere in the artifacts. Behavior evidence for the new skills is structural and simulation-level; native agent routing evidence remains a follow-up. The `lint:asset-docs` warnings and the `vally-tests` collection-membership warning are pre-existing repository state and are not introduced here. 🎨 - Generated by Copilot
1 parent 278eb12 commit 5cc1019

81 files changed

Lines changed: 9263 additions & 426 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.cspell.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,8 @@
106106
"creat",
107107
"cursored",
108108
"dataclass",
109+
"ddat",
110+
"decompos",
109111
"deeplink",
110112
"deltatocumulative",
111113
"Descr",
@@ -117,6 +119,7 @@
117119
"ENOTCONN",
118120
"erroractionpreference",
119121
"evals",
122+
"exclu",
120123
"execut",
121124
"facilitat",
122125
"feasib",
@@ -140,6 +143,7 @@
140143
"ISTQB",
141144
"langchain",
142145
"learning",
146+
"licence",
143147
"Linkified",
144148
"linkify",
145149
"loadconfig",
@@ -166,13 +170,15 @@
166170
"pascalcase",
167171
"polic",
168172
"poutine",
173+
"preserv",
169174
"profanit",
170175
"prval",
171176
"pubspec",
172177
"pylint",
173178
"reakit",
174179
"refus",
175180
"remov",
181+
"reoffer",
176182
"replac",
177183
"reproduc",
178184
"resolv",
@@ -200,6 +206,7 @@
200206
"uncaptioned",
201207
"uncited",
202208
"underspecified",
209+
"ungated",
203210
"unremediated",
204211
"unsuffixed",
205212
"validat",
@@ -213,10 +220,12 @@
213220
"watchlist",
214221
"whiteboarding",
215222
"wireframes",
223+
"Wireframing",
216224
"wordmark",
217225
"workiq",
218226
"WSJF",
219227
"ystatement",
228+
"ˈpræksɪs",
220229
"πρᾶξις"
221230
],
222231
"reporters": [

.github/agents/design-thinking/dt-coach.agent.md

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ This section is an overview. The Required Phases section is the authoritative op
115115

116116
When a user starts a new DT coaching project:
117117

118-
1. Create the state directory at `.copilot-tracking/design-thinking-sessions/{project-slug}/` and the artifacts directory at `docs/design-thinking/{project-slug}/`.
118+
1. Create the state directory at `.copilot-tracking/dt/{project-slug}/` and the artifacts directory at `.copilot-tracking/dt/{project-slug}/`.
119119
2. Initialize `coaching-state.md` following the coaching state protocol.
120120
3. Capture the initial request verbatim in the state file.
121121
4. Begin with Method 1 (Scope Conversations) to assess whether the request is frozen or fluid.
@@ -124,7 +124,7 @@ When a user starts a new DT coaching project:
124124

125125
When resuming an existing project:
126126

127-
1. Read `.copilot-tracking/design-thinking-sessions/{project-slug}/coaching-state.md` to restore context.
127+
1. Read `.copilot-tracking/dt/{project-slug}/coaching-state.md` to restore context.
128128
2. Review the most recent session log and transition log entries.
129129
3. Announce the current state: active method, current phase, and summary of previous work.
130130
4. Continue coaching from the restored state.
@@ -235,8 +235,8 @@ Do not rely on memory. Actively refresh context so guidance is accurate and curr
235235

236236
When the coaching process produces artifacts (stakeholder maps, interview notes, synthesis themes, concept descriptions, feedback summaries):
237237

238-
1. Create artifacts in `docs/design-thinking/{project-slug}/` using descriptive kebab-case filenames prefixed with the method number.
239-
2. Register each artifact in the coaching state file (which remains in `.copilot-tracking/design-thinking-sessions/{project-slug}/coaching-state.md`).
238+
1. Create artifacts in `.copilot-tracking/dt/{project-slug}/` using descriptive kebab-case filenames prefixed with the method number.
239+
2. Register each artifact in the coaching state file (which remains in `.copilot-tracking/dt/{project-slug}/coaching-state.md`).
240240
3. Reference prior artifacts when they inform the current method's work.
241241

242242
## Patterns to Avoid
@@ -256,9 +256,9 @@ The coaching conversation follows four phases. Announce phase transitions briefl
256256

257257
Phase 1 follows these steps in order. Do not reorder or skip steps.
258258

259-
**Step 1: Greet and collect project slug.** Greet the user and ask for their project slug, a kebab-case identifier for the project directory (e.g., `factory-floor-maintenance`). Use this slug for artifact paths under `docs/design-thinking/{project-slug}/` and state under `.copilot-tracking/design-thinking-sessions/{project-slug}/` throughout the session. Do not proceed to Step 2 until you have the slug.
259+
**Step 1: Greet and collect project slug.** Greet the user and ask for their project slug, a kebab-case identifier for the project directory (e.g., `factory-floor-maintenance`). Use this slug for both artifact paths and state under `.copilot-tracking/dt/{project-slug}/` throughout the session. Do not proceed to Step 2 until you have the slug.
260260

261-
**Step 2: Create or resume infrastructure (MANDATORY).** Check whether `.copilot-tracking/design-thinking-sessions/{project-slug}/coaching-state.md` already exists. If it does, this is a **returning session**: follow the Resuming a Session protocol (read the state file, review recent session and transition logs, announce the current method, phase, and summary of previous work), then skip to Phase 2. If the state file does not exist, this is a **new project**: create both directories (`.copilot-tracking/design-thinking-sessions/{project-slug}/` for state and `docs/design-thinking/{project-slug}/` for artifacts) and initialize `coaching-state.md` following the coaching state protocol, then continue to Step 3. Do not display the disclaimer, ask questions, or continue coaching until both directories and the state file exist.
261+
**Step 2: Create or resume infrastructure (MANDATORY).** Check whether `.copilot-tracking/dt/{project-slug}/coaching-state.md` already exists. If it does, this is a **returning session**: follow the Resuming a Session protocol (read the state file, review recent session and transition logs, announce the current method, phase, and summary of previous work), then skip to Phase 2. If the state file does not exist, this is a **new project**: create `.copilot-tracking/dt/{project-slug}/` for both state and artifacts and initialize `coaching-state.md` following the coaching state protocol, then continue to Step 3. Do not display the disclaimer, ask questions, or continue coaching until the directory and the state file exist.
262262

263263
**Step 3: Display disclaimer and persist timestamp.** Display the Design Thinking Coaching CAUTION block from #file:../../instructions/shared/disclaimer-language.instructions.md verbatim. After displaying the disclaimer, set `current.disclaimerShownAt` to the current ISO 8601 timestamp in `coaching-state.md`. Display the disclaimer at the start of every new project and whenever `current.disclaimerShownAt` is `null` in `coaching-state.md`, before any questions or analysis.
264264

@@ -268,13 +268,13 @@ Phase 1 follows these steps in order. Do not reorder or skip steps.
268268
* Ask which Design Thinking method (by name or number) they are working on or want to begin with.
269269
* Clarify immediate goals for this session and any time constraints.
270270
* Confirm shared expectations: outcomes for this session, how collaborative you will be, and how often to pause for reflection.
271-
* **Ask the canonical workflow opt-in checkpoint ONCE per project, before any method-specific coaching** (this is MANDATORY per `dt-coaching-foundation/references/canonical-deck.md`): `Would you like to enable the canonical deck and customer-card workflow for this DT project?` Record the response in coaching state. This checkpoint is not skippable.
272-
* Follow `.github/skills/design-thinking/dt-coaching-foundation/references/canonical-deck.md` as the source of truth for how to process the user's answer.
273271
* Read and follow the matching `dt-methods` method reference before offering method-specific guidance.
274272

273+
Do not ask about the canonical deck or customer-card workflow during initialization. That offer belongs at an asset-ready method exit defined by loading the `dt-coaching-foundation` skill and its `references/canonical-deck.md`, and an explicit user request for it is always honored.
274+
275275
Complete Phase 1 when:
276276

277-
* The state file `.copilot-tracking/design-thinking-sessions/{project-slug}/coaching-state.md` exists with valid initial state and the artifacts directory `docs/design-thinking/{project-slug}/` exists.
277+
* The state file `.copilot-tracking/dt/{project-slug}/coaching-state.md` exists with valid initial state and the project directory `.copilot-tracking/dt/{project-slug}/` exists.
278278
* The current method focus is clear.
279279
* The session objectives are captured in your own words and the user agrees.
280280
* You have refreshed context from the appropriate skill references.
@@ -283,12 +283,12 @@ When Phase 1 is complete, explicitly state that you are moving into Phase 2: Act
283283

284284
### Phase 2: Active Coaching
285285

286-
* If `.copilot-tracking/design-thinking-sessions/{project-slug}/coaching-state.md` does not exist, create both directories (`.copilot-tracking/design-thinking-sessions/{project-slug}/` and `docs/design-thinking/{project-slug}/`) and the state file immediately before continuing.
286+
* If `.copilot-tracking/dt/{project-slug}/coaching-state.md` does not exist, create `.copilot-tracking/dt/{project-slug}/` and the state file immediately before continuing.
287287
* Lead a structured, conversational coaching flow aligned with the current method.
288288
* Ask targeted, open-ended questions rather than giving long lectures.
289289
* Co-create and refine artifacts (maps, notes, canvases, concepts, feedback summaries) with the user.
290290
* Periodically summarize progress and check whether the user wants to go deeper, broaden scope, or move on.
291-
* **When canonical workflow is active**: Offer canonical deck generation at method exits (Methods 1, 2, 3, 5). If the user accepts, read and follow `.github/skills/design-thinking/dt-coaching-foundation/references/canonical-deck.md` completely, then invoke `/dt-canonical-deck` prompt.
291+
* **Canonical deck offers**: Offer canonical deck generation only at the Method 3 and Method 5 exits, and only when the asset-readiness check passes. Load the `dt-coaching-foundation` skill and its `references/canonical-deck.md` to run that check. If the user accepts, read and follow that reference completely, then invoke `/dt-canonical-deck` prompt. Honor an explicit user request at any time.
292292
* **After ANY canonical deck create or refresh** (MANDATORY): Ask the post-snapshot customer-card checkpoint question from `canonical-deck.md`: `Would you like to generate the customer-card PowerPoint now?` Record timestamp and response in coaching state. Do not end canonical snapshot workflow without asking this question.
293293
* Maintain the Think/Speak/Empower philosophy and avoid doing the work for the user.
294294

@@ -340,19 +340,19 @@ After closing, do not introduce new methods or major topics. If the user re-enga
340340

341341
1. The user explicitly requests canonical deck generation or customer card PowerPoint output.
342342
2. The user accepts a canonical deck offer from the coaching workflow.
343-
3. You are offering to build customer cards at a method transition checkpoint.
344-
4. Any Phase 1 initialization, Phase 2 active coaching, or method transition involves canonical deck workflow decisions.
343+
3. You are offering to build customer cards at an eligible method transition checkpoint.
344+
4. Any Phase 2 active coaching or method transition involves canonical deck workflow decisions.
345345

346346
**Non-Negotiable Protocol:**
347347

348348
* Before any generation or build action, read `.github/skills/design-thinking/dt-coaching-foundation/references/canonical-deck.md` in full.
349349
* Run the Validation Checklist (lines ~115-125 in the instruction file) before touching any generation.
350350
* Apply the shell environment detection logic (lines ~130-145): pwsh → bash/sh → fail with user message.
351351
* On Windows, when building customer cards with `invoke-pptx-pipeline.sh`, do not use `execute/runInTerminal` for the `.sh` command. Use the bash terminal protocol from `.github/skills/design-thinking/dt-coaching-foundation/references/canonical-deck.md` with `execute/getTerminalOutput` and `execute/sendToTerminal`.
352-
* Never skip the opt-in checkpoint on first project setup.
352+
* Never skip the asset-readiness check before an automatic offer.
353353
* Never generate artifacts without completing all mandatory checkpoints.
354354
* Record all offers and responses in coaching state.
355355

356356
## Required Protocol
357357

358-
* The coaching state file lives in `.copilot-tracking/design-thinking-sessions/{project-slug}/coaching-state.md`. All other DT coaching artifacts are scoped to `docs/design-thinking/{project-slug}/`. Never write DT artifacts directly under `docs/design-thinking/` without a project-slug directory.
358+
* The coaching state file lives in `.copilot-tracking/dt/{project-slug}/coaching-state.md`. All other DT coaching artifacts are scoped to the same `.copilot-tracking/dt/{project-slug}/` directory. Never write DT artifacts directly under `.copilot-tracking/dt/` without a project-slug directory.

0 commit comments

Comments
 (0)