Skip to content

Project implementation - #2735

Closed
Lee Yee Shian (yeeshian) wants to merge 61 commits into
microsoft:mainfrom
asiapartners:Project-Implementation
Closed

Project implementation#2735
Lee Yee Shian (yeeshian) wants to merge 61 commits into
microsoft:mainfrom
asiapartners:Project-Implementation

Conversation

@yeeshian

@yeeshian Lee Yee Shian (yeeshian) commented Aug 19, 2026

Copy link
Copy Markdown

Pull Request

Description

Related Issue(s)

Type of Change

Select all that apply:

Code & Documentation:

  • Bug fix (non-breaking change fixing an issue)
  • 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:

  • Reviewed contribution with hve-builder and addressed all actionable findings
  • Copilot instructions (.github/instructions/*.instructions.md)
  • Copilot prompt (.github/prompts/*.prompt.md)
  • Copilot agent (.github/agents/*.agent.md)
  • Copilot skill (.github/skills/*/SKILL.md)
  • Copilot hook (.github/hooks/*/*.json)
  • 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.
  • 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 and Model Version Requirements.

Other:

  • Script/automation (.ps1, .sh, .py)
  • Other (please describe):

Sample Prompts (for AI Artifact Contributions)

User Request:

Execution Flow:

Output Artifacts:

Success Indicators:

For detailed contribution requirements, see:

Testing

Checklist

Required Checks

  • Documentation is updated (if applicable)
  • Files follow existing naming conventions
  • Changes are backwards compatible (if applicable)
  • Tests added for new functionality (if applicable)

AI Artifact Contributions

  • Used hve-builder review mode to review contribution
  • Addressed all actionable findings from the hve-builder review
  • 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
  • Documentation validation (if docs changed): npm run validate:docs
  • 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
  • [ x ] Any new dependencies have been reviewed for security issues
  • [ x ] Security-related scripts follow the principle of least privilege

Additional Notes

Lee Yee Shian (yeeshian) and others added 30 commits August 11, 2026 21:44
* feat(docs): update getting started documentation for HVE Partner Workshop

- revise titles and descriptions for clarity
- enhance workshop structure and role exercises
- add new capstone and publishing follow-up documents
- improve setup instructions for Codespaces and local VS Code

* feat(agents): enhance AI Discovery Cards integration in coaching and learning materials

- update dt-coach and dt-learning-tutor to recommend AI Discovery Cards for ideation
- improve documentation for AI Discovery Cards workshop integration
- add AI Discovery Cards context in brainstorming and RPI integration guides

🧠 - Generated by Copilot

* feat(docs): add AI Discovery Cards workshop guidance for Design Thinking

* docs: update metadata dates and sidebar positions in design-thinking documents

🔄 - Generated by Copilot

* docs: update agent bundle section and fix typo in publishing guide

- add header for agent bundle clarification
- correct "sideload" to "side load" in publishing steps

🔧 - Generated by Copilot

* style(docs): format tables for consistency in multiple documentation files

🔧 - Generated by Copilot

* style(docs): update links in README for consistency and clarity

🔗 - Generated by Copilot

* style(docs): format table for consistency in README
…2657)

<!-- markdownlint-disable-file -->
<!-- PR title: docs(devcontainer): document restricted-network overrides
-->

# Pull Request

## Description

Documented the DevContainer overrides available to organizations that
route images, packages, release downloads, APIs, or PowerShell modules
through approved enterprise endpoints.

The DevContainer README now provides a concise inventory and directs
readers to the detailed guidance. The validation guide contains the
complete Bash and PowerShell examples and distinguishes host-side
`${localEnv:...}` values from runtime-only `dev.containers.containerEnv`
settings.

## Related Issue(s)

Fixes microsoft#2600

## Type of Change

Select all that apply:

**Code & Documentation:**

* [ ] Bug fix (non-breaking change fixing an issue)
* [ ] 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:**

* [ ] Reviewed contribution with `hve-builder` and addressed all
actionable findings
* [ ] Copilot instructions (`.github/instructions/*.instructions.md`)
* [ ] Copilot prompt (`.github/prompts/*.prompt.md`)
* [ ] Copilot agent (`.github/agents/*.agent.md`)
* [ ] Copilot skill (`.github/skills/*/SKILL.md`)
* [ ] Copilot hook (`.github/hooks/*/*.json`)
* [ ] 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:**

* [ ] Script/automation (`.ps1`, `.sh`, `.py`)
* [ ] Other (please describe):

## Sample Prompts (for AI Artifact Contributions)

<!-- If you checked any boxes under "AI Artifacts" above, provide a
sample prompt showing how to use your contribution -->
<!-- Delete this section if not applicable -->

**User Request:**
<!-- What natural language request would trigger this
agent/prompt/instruction? -->

**Execution Flow:**
<!-- Step-by-step: what happens when invoked? Include tool usage,
decision points -->

**Output Artifacts:**
<!-- What files/content are created? Show first 10-20 lines as preview
-->

**Success Indicators:**
<!-- How does user know it worked correctly? What validation should they
perform? -->

For detailed contribution requirements, see:

* Common Standards:
[docs/contributing/ai-artifacts-common.md](../docs/contributing/ai-artifacts-common.md)
- Shared standards for XML blocks, markdown quality, RFC 2119,
validation, and testing
* Agents:
[docs/contributing/custom-agents.md](../docs/contributing/custom-agents.md)
- Agent configurations with tools and behavior patterns
* Prompts:
[docs/contributing/prompts.md](../docs/contributing/prompts.md) -
Workflow-specific guidance with template variables
* Instructions:
[docs/contributing/instructions.md](../docs/contributing/instructions.md)
- Technology-specific standards with glob patterns
* Skills: [docs/contributing/skills.md](../docs/contributing/skills.md)
- Task execution utilities with cross-platform scripts

## Testing

* Confirmed `git diff --check` passes.
* Confirmed both documents cover every supported DevContainer override.
* Confirmed the changed frontmatter dates and Markdown table alignment.
* Manual testing was not applicable to this documentation-only change.

## Checklist

### Required Checks

* [x] Documentation is updated (if applicable)
* [x] Files follow existing naming conventions
* [x] Changes are backwards compatible (if applicable)
* [ ] Tests added for new functionality (N/A - documentation-only
change)

### AI Artifact Contributions
<!-- If contributing an agent, prompt, instruction, or skill, complete
these checks -->
* [ ] Used `hve-builder` review mode to review contribution
* [ ] Addressed all actionable findings from the `hve-builder` review
* [ ] 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`
* [ ] Documentation validation (if docs changed): `npm run
validate:docs`
* [ ] Spell checking: `npm run spell-check`
* [ ] Link validation: `npm run lint:md-links`

## Security Considerations

<!-- ⚠️ WARNING: Do not commit sensitive information such as API keys,
passwords, or personal data -->
* [x] This PR does not contain any sensitive or NDA information
* [ ] Any new dependencies have been reviewed for security issues (N/A -
no dependency changes)
* [ ] Security-related scripts follow the principle of least privilege
(N/A - no security script changes)

## Additional Notes

No DevContainer behavior changed.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Jamie Kim <jamiekim500@gmail.com>
…plan.md output (microsoft#2590)

# Pull Request

## Description

Refresh `docs/agents/rai-planning/phase-reference.md` to reflect the
phase-file consolidation completed in PR microsoft#2568, which merged the eight
per-phase artifacts into a single `rai-plan.md` with named sections.

Changes across the whole file:

* Phase Summary table: replace per-phase filenames in the "Key output"
column with the corresponding `rai-plan.md` sections and subsections.
* Phase 1-6 Outputs sections: point every bullet to a `rai-plan.md`
section anchor while preserving the descriptive content.
* Phase 2-6 Inputs sections: update references to prior-phase artifacts
(for example, "System definition pack from Phase 1" → "`rai-plan.md` `##
System Definition` section from Phase 1") so the doc is internally
consistent with the updated Outputs. This is slightly beyond the strict
scope of the issue but leaving Inputs stale would contradict the Outputs
on the same page.
* Phase 5 footer prose: reference the Control Surface Catalog, Evidence
Register, and Tradeoffs sections instead of the standalone artifact
names.
* Bump `ms.date`.

Verified against `.github/agents/rai-planning/rai-planner.agent.md`
(Artifacts lines per phase) to make sure every section name and
subsection matches the current output contract.

## Related Issue(s)

Fixes microsoft#2569

## Type of Change

**Code & Documentation:**

* [x] Documentation update

## Testing

Verified section names against ground truth:

* `.github/agents/rai-planning/rai-planner.agent.md` Artifacts lines for
each phase (`## System Definition`, `## Stakeholder Impact`, `### Risk
Classification Screening`, `## Standards Mapping`, `## Threat Addendum`,
`## Control Surface Catalog`, `## Evidence Register`, `## Tradeoffs`,
`## Review Summary`).
* Grepped the file for the old standalone filenames and the
pre-consolidation conceptual names to confirm none remain.

## Checklist

### Required Checks

* [x] Documentation is updated (if applicable)
* [x] Files follow existing naming conventions
* [x] Changes are backwards compatible (if applicable)

### Required Local Checks

* [x] Spell checking: `npm run spell-check`
* [x] Link validation: `npm run lint:md-links`

## Security Considerations

* [x] This PR does not contain any sensitive or NDA information

Co-authored-by: Jamie Kim <jamiekim500@gmail.com>
Co-authored-by: Bill Berry <WilliamBerryiii@users.noreply.github.com>
…icrosoft#2619)

# Pull Request

## Description

Update `docs/planning/prds/brd-builder-agent-prd.md` and
`docs/planning/prds/prd-builder-agent-prd.md` to remove stale references
to the old collection-based packaging architecture (removed in microsoft#2577).
Both PRDs now describe the current model where
`.github/plugin/marketplace.json` is the sole package recipe authority.

Changes in each PRD:

* Frontmatter: replace "project-planning collection" with
"project-planning package" and bump `ms.date`.
* Product Context: replace "bundled into collections" with "defined
through marketplace package recipes".
* External constraints: replace "collection/plugin/extension
regeneration" with "marketplace recipe, plugin, and extension
regeneration".
* `CON-002`: replace `collections/*.collection.yml`/`.md` with the
`.github/plugin/marketplace.json` recipe and name the current scripts
(`plugin:generate`, `extension:prepare`, validated by
`plugin:validate`).
* Risk item: replace "collection/plugin/extension outputs drift" with
"marketplace recipe, plugin, and extension outputs drift".
* brd-builder only: stakeholder row "Owns collections, plugins,
extension packaging" becomes "Owns marketplace recipes, plugins,
extension packaging".

No remaining `collection` references exist in either file.

## Related Issue(s)

Fixes microsoft#2604

## Type of Change

**Code & Documentation:**

* [x] Documentation update

## Testing

* Verified no `collection` references remain in either PRD via grep.
* Confirmed replacement terminology matches the current architecture
documented in `docs/customization/packages.md` and
`.github/plugin/marketplace.json`.

## Checklist

### Required Checks

* [x] Documentation is updated (if applicable)
* [x] Files follow existing naming conventions
* [x] Changes are backwards compatible (if applicable)

## Security Considerations

* [x] This PR does not contain any sensitive or NDA information

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Jamie Kim <jamiekim500@gmail.com>
Co-authored-by: Emmeline Hoops <108825895+chaosdinosaur@users.noreply.github.com>
…consolidation (microsoft#2588)

# Pull Request

## Description

Refresh the RAI Planner agent overview to reflect the skill
consolidation completed in microsoft#2062, and add the RAI reviewer agent and
skill-assessor subagent introduced alongside that change.

Specific updates in `docs/agents/rai-planning/agent-overview.md`:

* Operational Constraints: NIST AI RMF 1.0 standards are now referenced
from the `rai-standards` skill, not an instruction file.
* Related Files: describe the remaining instruction files accurately
(identity and licensing) rather than "phase-specific", and add rows for
`.github/agents/rai-planning/rai-reviewer.agent.md` and
`.github/agents/rai-planning/subagents/rai-skill-assessor.agent.md`.
* Bump `ms.date`.

Note: the issue described `rai-skill-assessor.agent.md` as sitting at
the top level of the collection; it actually lives under `subagents/`.
The Related Files table uses the accurate path.

## Related Issue(s)

Fixes microsoft#2079

## Type of Change

**Code & Documentation:**

* [x] Documentation update

## Testing

Verified all three documented locations against the current tree:

* `.github/skills/rai/rai-standards/` exists (skill consolidation
confirmed).
* `.github/instructions/rai-planning/` contains only
`rai-identity.instructions.md` and
`rai-license-posture.instructions.md`.
* `.github/agents/rai-planning/` contains `rai-planner.agent.md`,
`rai-reviewer.agent.md`, and `subagents/rai-skill-assessor.agent.md`.

## Checklist

### Required Checks

* [x] Documentation is updated (if applicable)
* [x] Files follow existing naming conventions
* [x] Changes are backwards compatible (if applicable)

### Required Local Checks

* [x] Spell checking: `npm run spell-check`
* [x] Link validation: `npm run lint:md-links`

## Security Considerations

* [x] This PR does not contain any sensitive or NDA information

---------

Co-authored-by: Bill Berry <WilliamBerryiii@users.noreply.github.com>
Co-authored-by: Jamie Kim <jamiekim500@gmail.com>
Co-authored-by: Jamie Kim <jkim121@uw.edu>
…icrosoft#2656)

<!-- markdownlint-disable-file -->
<!-- PR title: docs(planning): remove stale collection references from
planner PRDs -->

# Pull Request

## Description

Updated the requirements-author and Privacy Planner PRDs to reflect the
current package architecture. The documents now identify
`.github/plugin/marketplace.json` as the recipe authority and use the
current marketplace recipe, plugin, and extension terminology.

The changes also name the current generation and validation commands
where the requirements-author PRD defines packaging consistency. Privacy
lifecycle references to data collection remain unchanged because they
describe personal-data processing rather than package distribution.

## Related Issue(s)

Fixes microsoft#2605

## Type of Change

Select all that apply:

**Code & Documentation:**

* [ ] Bug fix (non-breaking change fixing an issue)
* [ ] 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:**

* [ ] Reviewed contribution with `hve-builder` and addressed all
actionable findings
* [ ] Copilot instructions (`.github/instructions/*.instructions.md`)
* [ ] Copilot prompt (`.github/prompts/*.prompt.md`)
* [ ] Copilot agent (`.github/agents/*.agent.md`)
* [ ] Copilot skill (`.github/skills/*/SKILL.md`)
* [ ] Copilot hook (`.github/hooks/*/*.json`)
* [ ] 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:**

* [ ] Script/automation (`.ps1`, `.sh`, `.py`)
* [ ] Other (please describe):

## Sample Prompts (for AI Artifact Contributions)

<!-- If you checked any boxes under "AI Artifacts" above, provide a
sample prompt showing how to use your contribution -->
<!-- Delete this section if not applicable -->

**User Request:**
<!-- What natural language request would trigger this
agent/prompt/instruction? -->

**Execution Flow:**
<!-- Step-by-step: what happens when invoked? Include tool usage,
decision points -->

**Output Artifacts:**
<!-- What files/content are created? Show first 10-20 lines as preview
-->

**Success Indicators:**
<!-- How does user know it worked correctly? What validation should they
perform? -->

For detailed contribution requirements, see:

* Common Standards:
[docs/contributing/ai-artifacts-common.md](../docs/contributing/ai-artifacts-common.md)
- Shared standards for XML blocks, markdown quality, RFC 2119,
validation, and testing
* Agents:
[docs/contributing/custom-agents.md](../docs/contributing/custom-agents.md)
- Agent configurations with tools and behavior patterns
* Prompts:
[docs/contributing/prompts.md](../docs/contributing/prompts.md) -
Workflow-specific guidance with template variables
* Instructions:
[docs/contributing/instructions.md](../docs/contributing/instructions.md)
- Technology-specific standards with glob patterns
* Skills: [docs/contributing/skills.md](../docs/contributing/skills.md)
- Task execution utilities with cross-platform scripts

## Testing

* Confirmed `git diff --check` passes.
* Confirmed obsolete collection-packaging phrases no longer appear in
the affected PRDs.
* Confirmed the changed frontmatter dates and Markdown table column
alignment.
* Manual testing was not applicable to this documentation-only change.

## Checklist

### Required Checks

* [x] Documentation is updated (if applicable)
* [x] Files follow existing naming conventions
* [x] Changes are backwards compatible (if applicable)
* [ ] Tests added for new functionality (N/A - documentation-only
change)

### AI Artifact Contributions
<!-- If contributing an agent, prompt, instruction, or skill, complete
these checks -->
* [ ] Used `hve-builder` review mode to review contribution
* [ ] Addressed all actionable findings from the `hve-builder` review
* [ ] 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`
* [ ] Documentation validation (if docs changed): `npm run
validate:docs`
* [ ] Spell checking: `npm run spell-check`
* [ ] Link validation: `npm run lint:md-links`

## Security Considerations

<!-- ⚠️ WARNING: Do not commit sensitive information such as API keys,
passwords, or personal data -->
* [x] This PR does not contain any sensitive or NDA information
* [ ] Any new dependencies have been reviewed for security issues (N/A -
no dependency changes)
* [ ] Security-related scripts follow the principle of least privilege
(N/A - no security script changes)

## Additional Notes

No runtime behavior changed.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Bill Berry <WilliamBerryiii@users.noreply.github.com>
Co-authored-by: Jamie Kim <jamiekim500@gmail.com>
…2599)

# Pull Request

## Description

Skills and instructions referenced sibling artifacts by relative
filesystem path — for example
`../../../prompts/accessibility/accessibility-coverage-matrix.prompt.md`
and `../../../../docs/agents/mural/credentials.md`. Those paths only
resolve when the referenced artifact happens to be installed alongside
the referring one. A user who installs a single package, or consumes
artifacts through extension or plugin packaging, gets a reference
pointing at nothing, and the failure is silent.

This PR establishes a portability rule in `hve-builder.instructions.md`
and applies it across the affected artifacts. A cross-artifact reference
now names the target artifact and the section wanted, and states what
happens when the target is unavailable.

Relative paths within a skill to its own `references/` and `scripts/`
are correct and unchanged.

Two skills also exceeded a reasonable single-file size and are split
into references in the same pass, since the split is what makes their
cross-references nameable rather than positional.

## Related Issue(s)

Fixes microsoft#2598

## Type of Change

Select all that apply:

**Code & Documentation:**

* [x] Bug fix (non-breaking change fixing an issue)
* [x] New feature (non-breaking change adding functionality)
* [x] 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`)
* [ ] Eval spec added/updated for changed AI artifacts (`evals/`)

**Other:**

* [ ] Script/automation (`.ps1`, `.sh`, `.py`)
* [ ] Other (please describe):

## Changes

### Portability rule

| File | Change |
|------|--------|
| `.github/instructions/hve-core/hve-builder.instructions.md` | Adds the
cross-artifact reference rule and a `Handling an Unavailable Reference`
section defining availability by an observable condition: an artifact is
available only when its content is actually present in the current turn
|

The rule is stated in terms the agent can check. It does not assert that
a host exposes a search-installed-artifacts-by-name capability, because
none is documented.

### Reference conversions

| File | Change |
|------|--------|
| `.github/instructions/skill-security-model.instructions.md` | Names
the `mural`, `jira`, and `gitlab` skills and defers their location to
the registry in `docs/security/security-model.md` |
| `.github/skills/accessibility/accessibility/SKILL.md` | Names the
`accessibility-coverage-matrix.prompt.md` prompt by filename, since it
carries no `name:` field, and the `Accessibility Surface Inventory`
subagent by name |
|
`.github/skills/accessibility/accessibility/references/frameworks/wcag-22.md`
| Named reference |
|
`.github/skills/accessibility/accessibility/references/frameworks/coga.md`
| Named reference |
|
`.github/skills/accessibility/accessibility/references/frameworks/en-301-549.md`
| Named reference |
|
`.github/skills/coding-standards/code-review/references/emission-modes.md`
| Named reference |
|
`.github/skills/coding-standards/code-review/references/output-formats.md`
| Named reference |
|
`.github/skills/design-thinking/dt-coaching-foundation/references/canonical-deck.md`
| Named reference |
| `.github/skills/experimental/customer-card-render/SKILL.md` |
Activates the `powerpoint` skill by name at all three sites that
previously hard-coded its directory |
| `.github/skills/experimental/customer-card-render/SECURITY.md` | Named
reference |
| `.github/skills/experimental/mural/SKILL.md` | Credentials guide and
LICENSE referenced by location description rather than relative path |
|
`.github/skills/project-planning/rai-planner/references/security-model.md`
| Named reference |
| `.github/skills/security/vex/SECURITY.md` | Names
`skill-security-model.instructions.md` |
| `.github/skills/shared/backlog-templates/SKILL.md` | Normalizes
`compatibility` to a string and states the consuming planner supplies
tracker access |

### Size splits

Measured against `origin/main`:

| File | Before | After |
|------|--------|-------|
| `.github/skills/installer/hve-core-installer/SKILL.md` | 988 lines |
491 lines |
| `.github/skills/experimental/powerpoint/SKILL.md` | 412 lines | 260
lines |

New reference files:

* `installer/references/installation-methods.md`
* `installer/references/post-installation-setup.md`
* `installer/references/component-installation.md`
* `powerpoint/references/script-reference.md`

The installer split is **not** a pure relocation. `main` landed a Phase
7 rewrite during this branch's life — "Agent Customization" became
"Component Installation", `agent-copy` scripts became `component-copy`,
the tracking manifest moved to `schemaVersion` 2, and eject became
component-level. `references/component-installation.md` is built from
that rewritten content, so the extracted file differs from anything that
existed at the branch point. Reviewers should read it as new prose, not
as moved prose.

### Behavior fixes found while reviewing the split

| File | Fix |
|------|-----|
| `installer/SKILL.md` | Ten reference-relative script links were broken
by the extraction (`scripts/` needed to become `../scripts/`) |
| `installer/SKILL.md` | Restored the MCP capability table, the
`/jira-setup` note, and six settings entries dropped during extraction |
| `installer/SKILL.md` | Phase 6 and Phase 7 pointers were bare
declaratives over phases that write into a user repository; both now
direct the agent to read the reference, follow it, and stop when it is
unavailable |
| `installer/references/component-installation.md` | Adds an Upgrade
Confirmation Gate. Upgrade mode previously displayed a summary and
proceeded, so a `modified` or `ejected` file could be overwritten
without a per-file decision |

## Review remediation (commit 6ff085c)

All twelve review threads from @katriendg are addressed in `6ff085c`,
with a per-thread reply naming the specific fix.

| Change | Sites |
|--------|-------|
| Unavailable-reference prose added | 11 |
| Sites the review missed, also fixed | 2 (`aria-apg.md` repo-root path,
`mural/SKILL.md` trailing newline) |
| `ms.date` refreshed | 4 |
| `metadata.last_updated` refreshed | 6 |

Two changes deserve explicit call-outs.

**The LICENSE suggestion was declined.** Restoring
`[LICENSE](../../../../LICENSE)` would reintroduce a skill-root-escaping
path, which is the pattern this PR removes. No skill in the repo links
LICENSE. The prose now falls back to the `license: MIT` frontmatter
field, which is portable. Rationale is on the thread.

**`<powerpoint-skill-dir>` is gone.** Step 2 of
`customer-card-render/SKILL.md` now delegates the build to the
`powerpoint` skill by name with three named inputs, instead of invoking
a script at a path it never explained how to resolve. This also removes
a contradiction: the skill's Overview already stated that
`Invoke-PptxPipeline.ps1` "is not reimplemented here" while the code
fence invoked it directly.

### Known scope boundary: mixed reference conventions in two SECURITY.md
files

`vex/SECURITY.md` and `customer-card-render/SECURITY.md` each now
contain both a converted bare-name reference and an unconverted
repo-root-relative link. In `customer-card-render` the two sit on
adjacent lines of the same References list.

This is deliberate. `skill-security-model.instructions.md` mandates the
"See also: repo-wide STRIDE model" callout linking
`docs/security/security-model.md`, and 34 of the 68 skill-root-escaping
links in the repository exist to satisfy that requirement across 11
SECURITY.md files. Removing them requires changing that instruction
first, which is a rule-design decision spanning files this PR does not
touch.

Tracked in microsoft#2646.

### Follow-ups filed

| Issue | Scope |
|-------|-------|
| microsoft#2646 | SECURITY.md convention conflicts with the portability rule (34
instances, 11 files) |
| microsoft#2647 | No CI lane validates reference content under the four ignored
artifact globs |
| microsoft#2648 | `metadata.last_updated` has no freshness validator |
| microsoft#2649 | `hve-builder.instructions.md` ships with 2 of 7 packages
containing affected skills |
| microsoft#2650 | `nvd.nist.gov` needs a link-check ignore pattern |

microsoft#2649 is the one worth reading: the rule this PR establishes ships with
only two of the seven packages containing the affected skills, which is
why the per-site prose is functionally required rather than redundant.

## Testing

Validation lanes owning the changed areas, all passing on the current
head:

| Command | Result |
|---------|--------|
| `npm run validate:skills` | 0 errors, 0 warnings |
| `npm run lint:frontmatter` | 0 errors |
| `npm run lint:md` | 518 files, 0 issues |
| `npm run lint:tables` | Pass |
| `npm run plugin:validate` | Pass, marketplace validated, 14 plugins |
| `npm run lint:json` | Pass |
| `npm run lint:ai-artifacts` | Pass |

CI run `31066517582` (PR Validation) completed with conclusion
`success`.

Note on link-check signal strength: `pr-validation.yml` sets `soft-fail:
true` on the markdown link check, and `markdown-link-check.yml` reports
success regardless of findings. A green check on that lane carries no
information. The ten broken installer links fixed here would have passed
CI untouched; they were caught by manual resolution of every relative
link in the diff.

Note on `lint:md` coverage: `.markdownlint-cli2.jsonc` ignores
`.github/instructions/**`, `.github/agents/**`, `.github/prompts/**`,
and `.github/skills/**`. Every file in this PR lives under one of those
globs, so `lint:md` reports zero issues without inspecting any of them.

## Checklist

### Required Checks

* [x] Documentation is updated (if applicable)
* [x] Files follow existing naming conventions
* [x] Changes are backwards compatible (if applicable)
* [ ] Tests added for new functionality (if applicable) — not
applicable; this PR changes documentation only and adds no executable
behavior

### 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

* [x] Local validation aggregate: `npm run validate:local`
* [x] Documentation validation (if docs changed): `npm run
validate:docs`
* [x] Spell checking: `npm run spell-check`
* [x] Link validation: `npm run lint:md-links`

## Security Considerations

* [x] This PR does not contain any sensitive or NDA information
* [x] Any new dependencies have been reviewed for security issues
* [x] Security-related scripts follow the principle of least privilege

## Additional Notes

**Review state.** An `hve-builder` static review was run across four
lanes and its High findings on phase-pointer imperativeness, the missing
upgrade confirmation gate, and the two remaining path-resolved
references are fixed in this branch. The behavior gate was **not** run —
`hve-builder-tester` dispatch was unavailable in the authoring host. The
`hve-builder` checkboxes above are checked to reflect that the static
review ran and its actionable findings were addressed; the behavior gate
remains outstanding and is tracked as follow-up. Rerun it when tester
dispatch is available.

**Known open findings, deliberately not fixed here.** Medium and Low
findings remain on Phase 7 naming consistency,
`builder`/`builder-tester` versus `hve-builder`/`hve-builder-tester`
naming, missing Stop rules in two skills, and missing `Use when`
triggers. These are follow-up work.

Items from the original list that are now resolved in this branch:
failure behavior at the previously-absent reference sites, the
`mural/SKILL.md` reference wording, trailing-blank-line hygiene, and
`metadata.last_updated` currency across every edited skill file.

**Not implemented.** No validator enforces the portability rule. A
`lint:skill-path-scope` check was designed during this work but not
built, so the rule is currently convention-only and will drift. A
`vally-tests` eval spec covering the unavailable-reference behavior is
likewise outstanding. Both are worth filing before this rule accumulates
more dependents.

**Relationship to the topology PR.** This branch has merged current
`origin/main` and is mergeable. The parallel
collection-topology-consolidation PR (microsoft#2602) is still open and has
**not** merged, so the two do stack: both touch
`hve-core-installer/SKILL.md`. Whichever merges second will need a
regeneration pass rather than a hand merge of generated files.

**Reviewable decision.** The substance to review is the rule in
`hve-builder.instructions.md` — whether a cross-artifact reference
should name its target and state failure behavior, and whether
"available only when content is present in the current turn" is the
right availability test. The line-count of the installer split is large
but secondary.
microsoft#2593 (microsoft#2659)

Reverts only the `.github/dependabot.yml` change from merged PR microsoft#2593
(`Pin GitHub Actions to full-length commit SHAs`), restoring the file to
its state at `db450a8e`. GitHub Actions SHA pins and all other files are
untouched.

## The added block was invalid YAML

PR microsoft#2593 appended a second `github-actions` entry *after* the top-level
`version: 2` key, outside the `updates:` sequence:

```yaml
version: 2
  - package-ecosystem: "github-actions"
    directory: "/"
    groups:
      github-actions:
        patterns: ["*"]
    schedule:
      interval: "weekly"
    cooldown:
      default-days: 7
```

Parsing the pre-revert file with `powershell-yaml` fails: `While
scanning a plain scalar value, found invalid mapping.` Since Dependabot
could not parse this file, the config was likely inert from the moment
microsoft#2593 merged — this revert plausibly restores Dependabot rather than
only dropping a cooldown. Worth confirming against Dependabot run
history.

## Changes

- **`.github/dependabot.yml`** — removed the 9 appended lines; file
restored byte-for-byte to the parent of microsoft#2593.

## Notes

- The block was duplicative regardless of syntax: an existing
`github-actions` entry already defines grouping and `gh-aw-actions`
exclusions.
- No `scripts/` reference `dependabot.yml`, so there is no existing test
infrastructure for it; validated by parser round-trip (`version: 2`, 3
entries, no `cooldown`) rather than adding new tooling.
- The automated `code_review` tool errored with `prompt too big after
adding system message` — an infra limit, unrelated to this diff. This
change has not had an automated review pass, so a human eye is worth
having here.

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: jkim323 <46459431+jkim323@users.noreply.github.com>
Co-authored-by: Jamie Kim <jamiekim500@gmail.com>
…ugin sourcing (microsoft#2618)

## Description

This branch replaced the snapshot-based plugin distribution model and
the single-branch release flow with a reviewed two-hop release ladder,
and it retired the projected `plugins/` tree as a source of truth.
Releases now walk `main` to `release/prerelease` to `release/stable`,
each hop gated by a human-merged promotion PR and a release-please
managed PR. Along the way the marketplace catalog moved to canonical
`.github`-root-relative component paths, plugin generation moved out of
the repository entirely, and VS Code Marketplace publication was split
into privilege-tiered jobs.

> Every release identity is now decided before a tag exists. The
promotion workflow computes the version deterministically, proves the
candidate tag and release are unoccupied, and records the intent in a
digest-backed candidate record that later stages replay rather than
recompute.

### Release channel ladder

The old model published pre-releases on demand from an operator-supplied
commit SHA and pushed orphan `plugins-v<version>` snapshot commits. That
model is gone.

- Added **release-prerelease-prepare.yml**, which runs on every merge to
`main` and prepares the `main` to `release/prerelease` promotion PR. It
resolves the next odd-minor version, probes the candidate tag and GitHub
release identity fail-closed (only an HTTP 404 counts as available),
refreshes the promotion head without force-push, restores target-owned
release files, writes the candidate record, and sets `release-as`.
Auto-merge is deliberately not enabled.
- Rewrote **release-prerelease.yml** to trigger on
`pull_request[closed]` against *release/prerelease* instead of
`workflow_dispatch`. Release-please now runs PR-only when the promotion
head merges and tag-only when the managed release head merges. The
removed `resolve-source`, `create-prerelease`, and
`plugin-snapshot-production` jobs were replaced by `sync-release-pr` and
`validate-release`.
- Rewrote **release-stable.yml** from a push-to-`main` validation
workflow into a two-job promotion preparer triggered by a published
PreRelease release. It validates the source tag is a published non-draft
PreRelease, verifies the canonical plugin evidence document, and
confirms the source commit is contained in *release/prerelease*.
Promotion heads are tag-scoped, so two promotions from different source
tags can never share a branch.
- Extended **release-stable-publish.yml** with a `validate-trigger` job
that classifies the merged head as `promotion` or `managed`,
published-asset verification, a cross-channel package-set consistency
check, and candidate record verification. The `open-main-sync-pr` job
was removed; `main` is now a ref-less development tip with no
post-release catalog sync.
- Extended **pr-validation.yml** to accept the two release branches as
PR targets and to enforce two new gates: Stable promotion branch grammar
with baseline advancement, and managed-release-head reproduction of its
retained candidate record.
- Tag namespaces changed. `hve-core-v*` and `plugins-v*` are historical;
PreRelease publishes `prerelease-v<version>` on odd minors and Stable
publishes `v<version>` on even minors, backed by a new
*release-please-prerelease-config.json* and
*.release-please-prerelease-manifest.json* seeded at `3.3.101`.

### Deterministic versioning and the candidate record

- Added **Resolve-ReleasePromotionVersion.ps1**, a pure computation with
no repository or network access. PreRelease advances the minor by two;
Stable advances the promoted odd minor by one and refuses to regress
against the current Stable baseline.
- Reworked **Update-VersionFiles.ps1** around a required `-Channel`
parameter and a `-CandidateAction` lifecycle. *Record* captures SHA-256
digests of the immutable source catalog and its deterministic transform
without touching the committed catalog, *Apply* replays and rebuilds
from the retained record, and *Verify* reads committed state only and
writes nothing.
- Digests are taken over compressed UTF-8 no-BOM bytes, so producer and
verifier compare byte-for-byte rather than structurally. The reserved
`OMITTED` locator represents the ref-less bootstrap catalog before the
first channel tag exists.

### Canonical marketplace component paths

- Migrated **marketplace.json** membership from package form
(`agents/*.md`, `commands/*`, `rules/*`) to canonical
`.github`-root-relative form (`agents/*.agent.md`,
`prompts/*.prompt.md`, `instructions/*.instructions.md`) across all
thirteen packages, including `componentMaturity` keys and starter
profiles. Each `source` is now `{ path: ".github" }` with no `ref`, and
`pluginRoot` was dropped from metadata.
- Taught **MarketplaceHelpers.psm1** the two-level identity model:
`Get-MarketplaceComponentSourceRoot` gained a `CatalogRoot` field,
`Resolve-MarketplaceComponentSource` accepts either form and returns
`CatalogPath`, and `Test-MarketplaceEntryContract` gained a
`-CanonicalMembership` switch that enforces strict canonical form.
- Updated **Validate-Marketplace.ps1** and the manifest schema so `ref`
is optional and channel-namespaced, and added catalog-wide uniformity
checks that reject a catalog mixing ref presence or channel namespaces
across entries.
- Added path projection to both installer scripts
(`ConvertTo-PackageComponentPath` in PowerShell,
`to_package_component_path` in Bash) so the installer keeps writing
package-form manifests while reading canonical catalog identities.

### Plugin snapshot retirement

- Deleted **plugin-snapshot-publish.yml** in full. Its evidence and
verification responsibilities moved into *plugin-package.yml* and
*pr-validation.yml*.
- Rewrote **Assert-PluginReleaseEvidence.ps1** from generated-tree
digesting to canonical git-tracked source digesting. Evidence is now
reproducible from a clean checkout of the tagged commit with no staging
directory, and the document schema advanced to
`hve-core/plugin-release-evidence/v2` with a pathless locator. Untracked
working-tree files cannot enter a digest.
- Added a `publish-evidence` job to **plugin-package.yml** that records
evidence, verifies it reproduces, attests it, and uploads it as a
release asset.
- Made the external staging root mandatory. **Generate-Plugins.ps1**
lost `-ReleaseTag` and `-MarketplaceOutputPath`, gained `-StagingRoot`,
and now resolves output through the new `Assert-PluginStagingRoot`,
which rejects any path equal to, inside, or containing the repository
root.

### Marketplace publication privilege separation

> The single `publish` job previously held `id-token: write`, ran
tag-sourced helper scripts, and installed its toolchain in the same
context. Those responsibilities are now separated.

- Split **extension-marketplace-publish.yml** into `validate-inputs`,
`verify`, `collect`, `prepare-publisher`, and `publish`. Only `publish`
holds `id-token: write` and the `marketplace` environment, and it
consumes nothing but immutable artifacts.
- `validate-inputs` runs with `contents: read` and no checkout; it
validates the caller-supplied matrix structurally, enforces tag
namespace and minor-parity channel pairing, and resolves both the
release digest and the protected-main publisher digest through the API.
- `collect` builds the publication matrix from same-attempt artifacts
only, using a sentinel artifact so a zero-success verify matrix fails
deterministically instead of silently producing an empty publish set.
- `prepare-publisher` builds the pinned toolchain from protected `main`
in an unprivileged context and archives it, so the privileged job never
runs `npm` or tag-sourced code.
- Replaced the optional `verify-attestation` boolean with a required
`attestation-signer-workflow` string, making callers declare which
workflow attested the release. **extension-provenance.yml** now requires
`source-ref` to be a full 40-character SHA equal to `github.sha`.
- Added **scripts/extension/marketplace-publisher/** with a private
manifest pinning `@vscode/vsce@3.9.2`, its lockfile, and an *.npmrc*
that fixes the canonical public registry, exact saves,
`audit-level=moderate`, and `ignore-scripts=true`. Dependabot now tracks
that directory.

### Hooks, tests, and documentation

- Changed every command in **telemetry.json** from a hardcoded
`.github/` prefix to `${CLAUDE_PLUGIN_ROOT:-.github}` in bash and the
PowerShell null-coalescing equivalent, so one manifest resolves from
both a repository checkout and an installed plugin. The materializer
strips the fallback for the installed form.
- Rebuilt **Workflow-PackagingContracts.Tests.ps1** around the five-job
publish model and the two-PR promotion model, asserting job permission
sets, needs closure, artifact naming, and step ordering. Forbidden
patterns in the privileged job are enumerated and asserted to be absent,
making the privilege boundary a testable contract.
- Expanded **Update-VersionFiles.Tests.ps1** with candidate digest
semantics, fail-closed tamper scenarios, and managed-head verification
that proves nothing is written. Added
**Resolve-ReleasePromotionVersion.Tests.ps1** and rewrote the plugin
evidence, generation, locator, and marketplace validation suites for
canonical paths and channel locators.
- Rewrote the release, architecture, security, and getting-started
documentation for the branch ladder, per-channel attestation topology,
canonical evidence verification, and the three registration options:
ref-less `main`, moving channel branches, and immutable exact tags.

## Related Issue(s)

None

## Type of Change

Select all that apply:

**Code & Documentation:**

* [x] Bug fix (non-breaking change fixing an issue)
* [x] New feature (non-breaking change adding functionality)
* [x] Breaking change (fix or feature causing existing functionality to
change)
* [x] Documentation update

**Infrastructure & Configuration:**

* [x] GitHub Actions workflow
* [x] Linting configuration (markdown, PowerShell, etc.)
* [ ] Security configuration (N/A — no `scripts/security/` changes)
* [ ] DevContainer configuration (N/A — no `.devcontainer/` changes)
* [x] Dependency update

**AI Artifacts:**

* [ ] Reviewed contribution with `hve-builder` and addressed all
actionable findings
* [ ] Copilot instructions (`.github/instructions/*.instructions.md`)
* [ ] Copilot prompt (`.github/prompts/*.prompt.md`)
* [ ] Copilot agent (`.github/agents/*.agent.md`)
* [x] Copilot skill (`.github/skills/*/SKILL.md`)
* [x] Copilot hook (`.github/hooks/*/*.json`)
* [ ] 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:**

"Install the hve-core RPI package into this repository using the starter
profile."

**Execution Flow:**

1. The `hve-core-installer` skill loads
`.github/plugin/marketplace.json` and builds a component index.
2. For a custom selection, the skill now calls
`Get-MarketplaceComponentIndex` and
`Resolve-MarketplaceComponentSelection` rather than passing raw catalog
entry values into collision detection.
3. `component-copy.ps1` or `component-copy.sh` projects each canonical
catalog identity (`agents/rpi/rpi-planner.agent.md`) into the installer
package form (`agents/rpi/rpi-planner.md`) through
`ConvertTo-PackageComponentPath` or `to_package_component_path`. Entries
outside the four installable roots pass through unprojected, so hook and
metadata fields never fail catalog load.
4. Membership validation, maturity lookup, and manifest filtering all
operate on the projected package form.
5. Installed hooks resolve their command paths through
`${CLAUDE_PLUGIN_ROOT:-.github}`, so the same `telemetry.json` works
from a repository checkout and from an installed plugin root.

**Output Artifacts:**

The installer writes its component manifest with package-form paths, for
example:

```text
agents/rpi/rpi-planner.md
prompts/rpi/rpi-plan.md
instructions/shared/hve-core-location.instructions.md
skills/rpi/rpi-research/
```

**Success Indicators:**

The written manifest component list matches the resolved starter closure
exactly, and the Bash and PowerShell paths produce identical selections.
A new Bash parity test in `component-copy.Tests.ps1` runs the starter
profile against the live catalog and asserts that equivalence.

> [!NOTE]
> Human review is recommended for the agent-populated content in this
section.

For detailed contribution requirements, see:

* Common Standards:
[docs/contributing/ai-artifacts-common.md](../docs/contributing/ai-artifacts-common.md)
- Shared standards for XML blocks, markdown quality, RFC 2119,
validation, and testing
* Agents:
[docs/contributing/custom-agents.md](../docs/contributing/custom-agents.md)
- Agent configurations with tools and behavior patterns
* Prompts:
[docs/contributing/prompts.md](../docs/contributing/prompts.md) -
Workflow-specific guidance with template variables
* Instructions:
[docs/contributing/instructions.md](../docs/contributing/instructions.md)
- Technology-specific standards with glob patterns
* Skills: [docs/contributing/skills.md](../docs/contributing/skills.md)
- Task execution utilities with cross-platform scripts

## Testing

Automated validation was intentionally deferred at the author's request
and will be run after this PR is opened. No local validation commands
were executed during PR generation, so every entry under Required Local
Checks is left unchecked.

Diff-based assessment performed during generation:

* Reviewed all 50 diff chunks across 78 files through parallel review
lanes and reconciled the findings into a single analysis log.
* Confirmed no secrets, tokens, or credentials appear in the diff. The
new *.npmrc* contains registry and audit settings only.
* Confirmed the new dependency surface is a single pinned package,
`@vscode/vsce@3.9.2`, with a committed lockfile and
`ignore-scripts=true` by default.
* Confirmed permission changes are reductions: `id-token: write` and the
`marketplace` environment are now confined to one job that imports no
tag-sourced scripts.
* Confirmed test coverage accompanies the behavioral changes, including
new suites for promotion version resolution, staging root validation,
and candidate record semantics.

Test suites were extended rather than merely updated. New coverage
includes fail-closed candidate tamper scenarios, staging root rejection
cases, canonical evidence digest stability, and workflow privilege
boundary assertions.

> [!NOTE]
> Manual testing was not performed as part of PR generation.

## Checklist

### Required Checks

* [x] Documentation is updated (if applicable)
* [x] Files follow existing naming conventions
* [ ] Changes are backwards compatible (if applicable)
* [x] Tests added for new functionality (if applicable)

### AI Artifact Contributions
<!-- If contributing an agent, prompt, instruction, or skill, complete
these checks -->
* [ ] Used `hve-builder` review mode to review contribution
* [ ] Addressed all actionable findings from the `hve-builder` review
* [ ] 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`
* [ ] Documentation validation (if docs changed): `npm run
validate:docs`
* [ ] Spell checking: `npm run spell-check`
* [ ] Link validation: `npm run lint:md-links`

## Security Considerations
<!-- ⚠️ WARNING: Do not commit sensitive information such as API keys,
passwords, or personal data -->
* [x] This PR does not contain any sensitive or NDA information
* [x] Any new dependencies have been reviewed for security issues
* [ ] Security-related scripts follow the principle of least privilege
(N/A — no `scripts/security/` changes; workflow privilege scoping is
described above)

## GHCP Artifact Maturity

| File | Type | Maturity | Notes |

|-----------------------------------------------|-------|-----------------|------------------|
| `.github/skills/installer/hve-core-installer` | Skill | ✅ stable | All
builds |
| `.github/hooks/shared/telemetry.json` | Hook | ⚠️ experimental |
Pre-release only |

### GHCP Maturity Acknowledgment

* [ ] I acknowledge this PR includes non-stable GHCP artifacts
* [ ] Non-stable artifacts are intentional for this change

## Additional Notes

Breaking changes are intentional and are the point of the branch:

* `plugin-snapshot-publish.yml` was deleted, and the
`plugins-v<version>` and `hve-core-v<version>` tag namespaces are now
historical only. Existing marketplace registrations pinned to a
`plugins-v*` ref continue to resolve against the historical tag but will
not receive new releases.
* `Generate-Plugins.ps1` requires `-StagingRoot` or
`HVE_PLUGIN_STAGING_ROOT` and refuses any path inside the repository. A
repository-root `plugins/` directory is no longer a valid output
location.
* `New-MarketplaceManifestContent`, `Write-MarketplaceManifest`,
`Test-PluginGitRefName`, and `Assert-PluginSnapshotTarget` were removed
from `PluginHelpers.psm1`. `New-PluginReleaseLocator` now requires
`-Channel` and no longer returns `PathPrefix`.
* `Update-VersionFiles.ps1` requires `-Channel`, and
`Assert-PluginReleaseEvidence.ps1` replaced `-PluginsDir` with
`-CatalogPath` and `-Channel`. The evidence schema advanced to v2 and
its locator no longer carries a `path` field, so v1 documents will not
compare cleanly.
* `extension-marketplace-publish.yml` made `tag` required and replaced
the `verify-attestation` boolean with a required
`attestation-signer-workflow` input.

Follow-up worth tracking separately:

* `prebuild-install@7.1.3` reaches the dependency graph only through the
optional `keytar` path used by `@vscode/vsce`, and it carries an
upstream deprecation notice. It does not block installation but will
appear in audit output.
* `open-main-sync-pr` was removed without a replacement. `main` is
documented as a ref-less development tip, so confirm no downstream
tooling still expects a post-release catalog sync PR.
…deration in the version-updates group across 1 directory (microsoft#2670)

Bumps the version-updates group with 1 update in the
/scripts/evals/moderation directory:
[ruff](https://github.com/astral-sh/ruff).

Updates `ruff` from 0.16.1 to 0.16.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/astral-sh/ruff/releases">ruff's
releases</a>.</em></p>
<blockquote>
<h2>0.16.2</h2>
<h2>Release Notes</h2>
<p>Released on 2026-08-06.</p>
<h3>Bug fixes</h3>
<ul>
<li>[<code>flake8-pyi</code>] Avoid false positives on
<code>singledispatch</code> functions (<code>PYI041</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/27335">#27335</a>)</li>
</ul>
<h3>Server</h3>
<ul>
<li>Register formatting capabilities dynamically to exclude TOML files
(<a
href="https://redirect.github.com/astral-sh/ruff/pull/27332">#27332</a>)</li>
</ul>
<h3>Contributors</h3>
<ul>
<li><a
href="https://github.com/MeGaGiGaGon"><code>@​MeGaGiGaGon</code></a></li>
<li><a
href="https://github.com/charliermarsh"><code>@​charliermarsh</code></a></li>
<li><a href="https://github.com/epage"><code>@​epage</code></a></li>
<li><a href="https://github.com/sharkdp"><code>@​sharkdp</code></a></li>
<li><a href="https://github.com/ntBre"><code>@​ntBre</code></a></li>
</ul>
<h2>Install ruff 0.16.2</h2>
<h3>Install prebuilt binaries via shell script</h3>
<pre lang="sh"><code>curl --proto '=https' --tlsv1.2 -LsSf
https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-installer.sh
| sh
</code></pre>
<h3>Install prebuilt binaries via powershell script</h3>
<pre lang="sh"><code>powershell -ExecutionPolicy Bypass -c &quot;irm
https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-installer.ps1
| iex&quot;
</code></pre>
<h2>Download ruff 0.16.2</h2>
<table>
<thead>
<tr>
<th>File</th>
<th>Platform</th>
<th>Checksum</th>
</tr>
</thead>
<tbody>
<tr>
<td><a
href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-aarch64-apple-darwin.tar.gz">ruff-aarch64-apple-darwin.tar.gz</a></td>
<td>Apple Silicon macOS</td>
<td><a
href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-aarch64-apple-darwin.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-x86_64-apple-darwin.tar.gz">ruff-x86_64-apple-darwin.tar.gz</a></td>
<td>Intel macOS</td>
<td><a
href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-x86_64-apple-darwin.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-aarch64-pc-windows-msvc.zip">ruff-aarch64-pc-windows-msvc.zip</a></td>
<td>ARM64 Windows</td>
<td><a
href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-aarch64-pc-windows-msvc.zip.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-i686-pc-windows-msvc.zip">ruff-i686-pc-windows-msvc.zip</a></td>
<td>x86 Windows</td>
<td><a
href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-i686-pc-windows-msvc.zip.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-x86_64-pc-windows-msvc.zip">ruff-x86_64-pc-windows-msvc.zip</a></td>
<td>x64 Windows</td>
<td><a
href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-x86_64-pc-windows-msvc.zip.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-aarch64-unknown-linux-gnu.tar.gz">ruff-aarch64-unknown-linux-gnu.tar.gz</a></td>
<td>ARM64 Linux</td>
<td><a
href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-i686-unknown-linux-gnu.tar.gz">ruff-i686-unknown-linux-gnu.tar.gz</a></td>
<td>x86 Linux</td>
<td><a
href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-i686-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-powerpc64-unknown-linux-gnu.tar.gz">ruff-powerpc64-unknown-linux-gnu.tar.gz</a></td>
<td>PPC64 Linux</td>
<td><a
href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-powerpc64le-unknown-linux-gnu.tar.gz">ruff-powerpc64le-unknown-linux-gnu.tar.gz</a></td>
<td>PPC64LE Linux</td>
<td><a
href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-riscv64gc-unknown-linux-gnu.tar.gz">ruff-riscv64gc-unknown-linux-gnu.tar.gz</a></td>
<td>RISCV Linux</td>
<td><a
href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-riscv64gc-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a
href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-s390x-unknown-linux-gnu.tar.gz">ruff-s390x-unknown-linux-gnu.tar.gz</a></td>
<td>S390x Linux</td>
<td><a
href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-s390x-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
</tbody>
</table>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md">ruff's
changelog</a>.</em></p>
<blockquote>
<h2>0.16.2</h2>
<p>Released on 2026-08-06.</p>
<h3>Bug fixes</h3>
<ul>
<li>[<code>flake8-pyi</code>] Avoid false positives on
<code>singledispatch</code> functions (<code>PYI041</code>) (<a
href="https://redirect.github.com/astral-sh/ruff/pull/27335">#27335</a>)</li>
</ul>
<h3>Server</h3>
<ul>
<li>Register formatting capabilities dynamically to exclude TOML files
(<a
href="https://redirect.github.com/astral-sh/ruff/pull/27332">#27332</a>)</li>
</ul>
<h3>Contributors</h3>
<ul>
<li><a
href="https://github.com/MeGaGiGaGon"><code>@​MeGaGiGaGon</code></a></li>
<li><a
href="https://github.com/charliermarsh"><code>@​charliermarsh</code></a></li>
<li><a href="https://github.com/epage"><code>@​epage</code></a></li>
<li><a href="https://github.com/sharkdp"><code>@​sharkdp</code></a></li>
<li><a href="https://github.com/ntBre"><code>@​ntBre</code></a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/astral-sh/ruff/commit/5b48a040974781ba90b47c8df628f8fd9b6c95dd"><code>5b48a04</code></a>
Bump 0.16.2 (<a
href="https://redirect.github.com/astral-sh/ruff/issues/27555">#27555</a>)</li>
<li><a
href="https://github.com/astral-sh/ruff/commit/1b9e5fc483b95a01fe02ff104820280b1b32e8ae"><code>1b9e5fc</code></a>
Update Swatinem/rust-cache action to v2.9.2 (<a
href="https://redirect.github.com/astral-sh/ruff/issues/27568">#27568</a>)</li>
<li><a
href="https://github.com/astral-sh/ruff/commit/c4e86fc0394c92a9334ba2eb026c77c21db403be"><code>c4e86fc</code></a>
[ty] Add helper extension methods for half-range and equality
constraints (<a
href="https://redirect.github.com/astral-sh/ruff/issues/2">#2</a>...</li>
<li><a
href="https://github.com/astral-sh/ruff/commit/17a00de2e298612201a8fe30790e9399204af1b9"><code>17a00de</code></a>
[ty] Reuse primer commands in memory reports (<a
href="https://redirect.github.com/astral-sh/ruff/issues/27553">#27553</a>)</li>
<li><a
href="https://github.com/astral-sh/ruff/commit/6ea296b96923e142eb13af2bc6ad261c280d8eb1"><code>6ea296b</code></a>
[ty] Normalize type labels in structured docstrings (<a
href="https://redirect.github.com/astral-sh/ruff/issues/26923">#26923</a>)</li>
<li><a
href="https://github.com/astral-sh/ruff/commit/2fc445f0053f4ec27c717fae0de3671d73c103be"><code>2fc445f</code></a>
[ty] Diagnose invalid <strong>getattr</strong> calls (<a
href="https://redirect.github.com/astral-sh/ruff/issues/27502">#27502</a>)</li>
<li><a
href="https://github.com/astral-sh/ruff/commit/22c7823c4e8bffcca97688d8438c9b567d6817d8"><code>22c7823</code></a>
[ty] Enable (but downrank) auto-import completion suggestions from
stub-only ...</li>
<li><a
href="https://github.com/astral-sh/ruff/commit/05160d507f05345a72db9c28ab4edf7c92334819"><code>05160d5</code></a>
[ty] Diagnose invalid descriptor <code>__get__</code> calls (<a
href="https://redirect.github.com/astral-sh/ruff/issues/27400">#27400</a>)</li>
<li><a
href="https://github.com/astral-sh/ruff/commit/baea3d0dcec6d6f6d1659321940f3725771c5f45"><code>baea3d0</code></a>
[ty] Expose strict analysis options in the playground (<a
href="https://redirect.github.com/astral-sh/ruff/issues/27543">#27543</a>)</li>
<li><a
href="https://github.com/astral-sh/ruff/commit/c88946ebeb92be6d276087f0d528cd6471df4ead"><code>c88946e</code></a>
[ty] Bump ecosystem-analyzer for strict project settings (<a
href="https://redirect.github.com/astral-sh/ruff/issues/27542">#27542</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/astral-sh/ruff/compare/0.16.1...0.16.2">compare
view</a></li>
</ul>
</details>
<br />

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
… project-planning (microsoft#2602)

# Pull Request

## Description

Azure DevOps, GitHub, and Jira each carried their own package, their own
backlog manager agent, and near-duplicate copies of the same backlog
protocol — discovery, triage, sprint planning, PRD-to-work-item
planning, and execution. GitLab carried its own package and skill, but
never a backlog manager agent.

What actually differs between trackers is small: the command surface,
the field vocabulary, the reference-ID prefix, and the action verbs.
Everything structural was common and duplicated four ways.

This PR consolidates backlog capability into `project-planning`. The
shared protocol is owned by skills, and each platform contributes only
its delta as a skill reference. A single `backlog-manager` agent
resolves the target platform before dispatching, so a team using more
than one tracker no longer has to pick a collection per tracker.

## Related Issue(s)

Fixes microsoft#2601

## Type of Change

Select all that apply:

**Code & Documentation:**

* [ ] Bug fix (non-breaking change fixing an issue)
* [ ] New feature (non-breaking change adding functionality)
* [x] Breaking change (fix or feature causing existing functionality to
change)
* [x] Documentation update

**Infrastructure & Configuration:**

* [x] GitHub Actions workflow
* [x] Linting configuration (markdown, PowerShell, etc.)
* [ ] Security configuration
* [ ] DevContainer configuration
* [ ] Dependency update

**AI Artifacts:**

* [ ] 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/`)

**Other:**

* [x] Script/automation (`.ps1`, `.sh`, `.py`)
* [ ] Other (please describe):

## Changes

### Read this first: the diff is mostly relocation

The file count is large because four packages were dissolved and their
contents relocated. Most changed paths are the same bytes at a new
address. Ninety-eight files carry real edits.

```text
  369 changed paths
  ┌────────────────────────────────────────────────────────────────────────────┐
  │ relocated  ████████████████████████████████████████████████   119   32%    │ skim
  │ retired    █████████████████████████████████                   83   22%    │ skim
  │ generated  ████████████████████████████                        69   19%    │ skip
  │ edited     █████████████████████████                           61   17%    │ REVIEW
  │ new        ███████████████                                     37   10%    │ REVIEW
  └────────────────────────────────────────────────────────────────────────────┘
     relocated = 103 byte-identical moves + 16 moved-and-edited paths
     generated = docs/reference/, owned entirely by npm run docs:generate
     retired   = deletions whose capability is superseded, not lost
```

GitHub collapses each rename pair into one entry, so the PR view shows
roughly 250 entries rather than 369 paths.

### Where things moved

Paths below are relative to `.github/` unless they start with `docs/` or
`evals/`. `SAME` counts pairs whose content is byte-identical across the
move.

```text
  SOURCE  (on main)                         DESTINATION  (this branch)          PAIRS  SAME
  -----------------------------------------------------------------------------------------
  skills/gitlab/gitlab/                ---> skills/project-planning/gitlab/        54    53
  skills/jira/jira/                    ---> skills/project-planning/jira/          47    45
  skills/github/gh-code-scanning/      ---> skills/security/gh-code-scanning/       5     5
  prompts/ado/ado-{pr,build-info}      ---> prompts/hve-core/                       2     0
  instructions/ado/ado-{pr,build-info} ---> skills/**/backlog-mgmt/references/      2     0
  instructions/github/community-*      ---> instructions/project-planning/          1     0
  evals/**/ado-backlog-manager.yml     ---> evals/**/backlog-manager.yml            1     0
  docs/reference/**  (generated)       ---> docs/reference/**  (regenerated)        7     0
  -----------------------------------------------------------------------------------------
                                            TOTAL                                 119   103
```

The two large blocks — 101 pairs across `gitlab` and `jira` — are Python
skill packages moving intact: scripts, tests, fuzz corpora, and
lockfiles. Only three files in those blocks differ, and each difference
is a path string inside a `SKILL.md` or corpus `README.md`.

### What replaced the retired packages

```text
  RETIRED PACKAGES                   CONSOLIDATED INTO
  ───────────────────                ─────────────────

    ado    ──┐                       project-planning/
    github ──┤                         │
    jira   ──┼──────────────────────▶  ├─ agents/     backlog-manager        (resolves platform)
    gitlab ──┘                         │              functional-planner     (PRD → hierarchy)
                                       │  subagents/  ado-backlog-executor
     7 agents  ──▶  5 agents           │              github-backlog-executor
    18 prompts ──▶  0 prompts          │              jira-backlog-executor
    18 instrs  ──▶  1 instruction      │
                                       ├─ skills/     backlog-management     (shared protocol)
                                       │              backlog-plan           (read-only)
                                       │              backlog-execute        (mutating)
                                       │              functional-planner
                                       │
                                       └─ skills/     gitlab/  jira/         (relocated intact)

                                     security/
                                       └─ skills/     gh-code-scanning/      (relocated intact)

                                     hve-core/
                                       └─ prompts/    ado-create-pull-request
                                                      ado-get-build-info
```

Platform deltas that survive live as skill references under
`backlog-management/references/{ado,github,jira}.md`, loaded on demand
rather than through always-on `applyTo` globs.

### Packages

Ten packages remain in `.github/plugin/marketplace.json`. `ado`,
`github`, `jira`, and `gitlab` are retired and their capability folded
into `project-planning`.

| Change | Detail |
|--------|--------|
| Retired | `ado`, `github`, `jira`, `gitlab` catalog entries and their
`docs/plugins/` pages |
| Rewired | `marketplace.json` package recipes,
`docs/plugins/project-planning.md`, `.vscode/settings.json` |

The `.vscode/settings.json` change is broader than the four retired
packages: it reconciles every artifact discovery location with the
current directory topology, including accessibility, data-science, and
privacy locations. No entry is retained for a directory that does not
exist.

### New skills and agents

| Artifact | Role |
|----------|------|
| `backlog-management` | Platform-agnostic core: planning-file
lifecycle, planning-type enum, scope normalization, reference-ID scheme,
similarity assessment, three-tier autonomy, content sanitization,
resumable state |
| `backlog-plan` | Read-only half: discovery, triage, sprint, my-work,
task-plan |
| `backlog-execute` | Mutating half: add, run |
| `functional-planner` | PRD-to-hierarchy planning, no tracker mutation
|
| `backlog-manager` agent | Resolves platform, classifies workflow,
dispatches |
| `functional-planner` agent | PRD hierarchy planning |
| `{ado,github,jira}-backlog-executor` subagents | Apply a dispatched
operation set against one confirmed tracker |
| `backlog-guardrails` instruction | Always-on mutation guardrail over
backlog tracking roots |

Per-platform deltas live in
`backlog-management/references/{ado,github,jira}.md`.

### Retired artifacts

| Kind | Deleted | Of which content relocated | Retired outright |

|--------------|---------|-----------------------------|------------------|
| Agents | 7 | 0 | 7 |
| Prompts | 18 | 0 | 18 |
| Instructions | 18 | 2 | 16 |

Net totals: agents 64 to 62 (7 deleted, 5 added), prompts 67 to 49,
instruction files 79 to 62 (18 deleted, 1 added).

All 18 deleted instruction files carried an `applyTo` glob, and 14 of
those attached to a backlog tracking root
(`.copilot-tracking/workitems/**`, `github-issues/**`, or
`jira-issues/**`); the remaining four attached elsewhere. Their content
is now reached through skill references, so it loads on demand rather
than against the always-on context budget. A new
`backlog-guardrails.instructions.md` keeps mutation safety attached to
those three roots for consumers that never load a backlog skill.
Separately, `community-interaction.instructions.md` is relocated from
`instructions/github/` to `instructions/project-planning/` and remains
an instruction.

### Preserved ADO workflows

Pull request creation and build information have no cross-platform
equivalent and are preserved as skill references rather than retired:

| From | To |
|------|-----|
| `instructions/hve-core/ado-create-pull-request.instructions.md` |
`backlog-management/references/ado-pull-request.md` |
| `instructions/hve-core/ado-get-build-info.instructions.md` |
`backlog-management/references/ado-build-info.md` |

### Documentation

`docs/agents/ado-backlog/` and `docs/agents/github-backlog/` are
replaced by a unified `docs/agents/backlog/`. Azure DevOps pages with no
cross-platform equivalent — build monitoring, PR creation, PRD planning
— are retained under an `Azure DevOps Delivery Workflows` sidebar
category and linked from the agents catalog. `docs/plugins/` package
pages and Docusaurus configuration are updated.

### Other

`.github/workflows/gh-code-scanning.yml` is corrected to
`.github/skills/security/gh-code-scanning/`, following that skill's
relocation. `scripts/evals/New-AgentSurfaceSignatures.ps1` emits an
alternation covering every declared tracking root, which the
multi-platform `backlog-manager` requires. Its call site is wrapped in
`@()` so zero-scope and single-scope results stay arrays, and the
Windows drive-letter disallow is unchanged from `main` because the
relaxed form could be defeated by unrelated same-line text.

## Testing

The validation suite ran once against the final tree.

| Command | Result |

|-----------------------------------------------------|---------------------------------------------------------------|
| `npm run validate:local` | 24 of 25 lanes pass. See the note below on
`lint:md-links` |
| `npm run validate:docs` | Pass. Typecheck clean, 101 tests in 10
suites |
| `npm run spell-check` | Pass. 0 issues in 805 files |
| `npm run test:ps -- -TestPath scripts/tests/evals/` | Pass. 453
passed, 0 failed, 1 skipped |
| `Build-AgentBehaviorSpec.ps1 -WhatIf` | Pass. No drift |
| `npx vally lint --eval-spec evals/` | Pass. Pre-existing
`regression-without-baseline` warnings only |
| `npm run docs:generate:check` | Pass. Non-blocking `ms.date` drift
only |

Two lanes are unchecked above and both are stated rather than implied.
`lint:md-links` was not run against the remediation tree; its two known
local failures are external URLs returning `Status: 0`, a connection
failure rather than a 404, in files this PR does not modify.
`validate:local` is unchecked because it is a sequential aggregate whose
`lint:md-links` stage would abort it; every other lane in it was run
individually against the remediation tree and passes, including
`lint:tables`, `lint:md`, `lint:ps`, `lint:yaml`, `lint:json`,
`lint:frontmatter`, `lint:marketplace`, `lint:hooks`,
`lint:permissions`, `lint:dangerous-workflow`,
`lint:dependency-pinning`, `lint:pr-gate`, `lint:py`, `validate:skills`,
`lint:ai-artifacts`, `lint:asset-docs`, and `lint:models`. CI re-checks
the link lane from a runner with unrestricted egress.

Acceptance criteria were independently re-verified rather than accepted
from the implementation record: package count, absence of residual
retired-package paths across `.github/` and `extension/`,
`user-invocable` values on the five affected skills, story-quality
levels, sprint-planning platform neutrality, and Docusaurus package
coverage.

### Known limitations

* Jira reads route through `Jira Backlog Executor` because Jira's only
command surface is a CLI reached through a terminal. Azure DevOps and
GitHub reads do not need that round trip. This is the accepted cost of
keeping the orchestrator free of terminal access.
* Azure DevOps exposes no tool that lists a project's process types, so
work-item types are confirmed with the user and recorded as unvalidated
rather than discovered.
* GitHub exposes no milestone-list tool, so milestones with zero open
issues are undiscoverable by the sprint workflow.
* `docs/plugins/` sidebar positions are non-contiguous after the four
package pages were deleted. Docusaurus tolerates gaps.


## Checklist

### Required Checks

* [x] Documentation is updated (if applicable)
* [x] Files follow existing naming conventions
* [ ] 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

* [ ] 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
* [x] Any new dependencies have been reviewed for security issues
* [x] Security-related scripts follow the principle of least privilege

Content sanitization guards run before any platform-bound mutation, and
an inferred platform requires explicit user confirmation before the
first mutating call. The `Backlog Manager` orchestrator holds no tracker
write tool and no terminal tool, so a mutation it is asked to perform
directly is unreachable rather than merely disallowed. Each executor
carries exactly one platform's write surface.

## Release Communication

The breaking change is communicated through Conventional Commits, not a
hand-edited CHANGELOG. Each commit that removes or narrows a public
surface carries a `!` marker and a `BREAKING CHANGE:` footer, so
release-please derives the version bump and the release notes from the
commit history.

## Additional Notes

Opened as a draft. This branch is rebased onto current `main` as a
single linear history; `collections/` and `plugins/` no longer exist
there after microsoft#2577.

**The reviewable surface is 98 files.** See the change-shape chart at
the top of Changes: 119 relocated paths, 69 generated `docs/reference/`
pages, and 83 retirements need no line-by-line reading. The 37 new and
61 edited files carry every substantive decision. `collections/` and
`plugins/` no longer appear in this diff — both were removed from `main`
by microsoft#2577.

**Parallel PR.** This is one of two cut from the same working tree,
alongside microsoft#2599 (artifact portability). Both branch from `main` and do
not stack. Whichever merges second should resolve generated conflicts by
discarding both sides and re-running `plugin:generate`, `docs:generate`,
and `extension:prepare` rather than merging generated files by hand.

**Known follow-ups**, recorded and not blocking:

* `docusaurus.config.js` hardcodes the package list and omits
`installer` and `rpi` — pre-existing at merge-base
* `docs:generate` stamps `ms.date` on every page it touches regardless
of content change, requiring a manual revert pass after every
regeneration
* The four retired Marketplace identities are orphaned with no tombstone
mechanism
* `docs/agents/project-planning/arch-diagram-builder.md` and
`security-plan-creator.md` document agents that no longer exist —
pre-existing at merge-base, not introduced here
* A cross-platform Windows-path signature exemption needs its own change
with mixed-token regression cases

---------

Co-authored-by: Jamie Kim <jamiekim500@gmail.com>
# Pull Request

## Description

Update `docs/architecture/agentic-workflows.md` to reflect the current
manual
PR Review workflow.

Changes across the document:

* Replace automatic PR-open and ready-for-review triggers with an
authorized
user's `/review` command in a PR conversation or inline review comment.
* Update both Mermaid diagrams to show the manual transition into PR
review.
* Distinguish clean, blocking non-maintainer, and comment-only review
outcomes.
* Remove obsolete `skip-review` guidance.
* Replace remaining automated-pipeline wording that contradicted the
manual
  review trigger.
* Bump `ms.date`.

## Related Issue(s)

Fixes microsoft#1547

## Type of Change

**Code & Documentation:**

* [x] Documentation update

## Testing

Verified the documentation against `.github/workflows/pr-review.md`:

* Confirmed the `slash_command` trigger, supported comment events, and
  authorized roles.
* Confirmed clean reviews add `review-passed`, blocking non-maintainer
findings
add `needs-revision`, and advisory or non-blocking findings use
`COMMENT`
  without an outcome label.
* Confirmed no stale automatic-trigger or `skip-review` wording remains.
* Confirmed canonical table formatting with the repository's pinned
  `markdown-table-prettify` 3.7.0 formatter.
* Ran `git diff --check`.

## Checklist

### Required Checks

* [x] Documentation is updated (if applicable)
* [x] Files follow existing naming conventions
* [x] Changes are backwards compatible (if applicable)

## Security Considerations

* [x] This PR does not contain any sensitive or NDA information

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Jamie Kim <jamiekim500@gmail.com>
Copilot-Session: cd770fd5-126c-407f-b990-397b33243f6f
Copilot-Session: bdf33ccb-b040-4aa7-ae24-05180c9a1161
…tainers (microsoft#2673)

# Pull Request

## Description

Added the official GitHub Copilot CLI Dev Container Feature so
contributors receive the `copilot` command after building or rebuilding
the development container. Locked the feature artifact to an immutable
SHA-256 digest and documented the installed command-line tool.

## Related Issue(s)

Fixes microsoft#2672

## 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)
* [ ] Documentation update

**Infrastructure & Configuration:**

* [ ] GitHub Actions workflow
* [ ] Linting configuration (markdown, PowerShell, etc.)
* [ ] Security configuration
* [x] DevContainer configuration
* [ ] Dependency update

**AI Artifacts:**

* [ ] Reviewed contribution with `hve-builder` and addressed all
actionable findings
* [ ] Copilot instructions (`.github/instructions/*.instructions.md`)
* [ ] Copilot prompt (`.github/prompts/*.prompt.md`)
* [ ] Copilot agent (`.github/agents/*.agent.md`)
* [ ] Copilot skill (`.github/skills/*/SKILL.md`)
* [ ] Copilot hook (`.github/hooks/*/*.json`)
* [ ] 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:**

* [ ] Script/automation (`.ps1`, `.sh`, `.py`)
* [ ] Other (please describe):

## Sample Prompts (for AI Artifact Contributions)

<!-- If you checked any boxes under "AI Artifacts" above, provide a
sample prompt showing how to use your contribution -->
<!-- Delete this section if not applicable -->

**User Request:**
<!-- What natural language request would trigger this
agent/prompt/instruction? -->

**Execution Flow:**
<!-- Step-by-step: what happens when invoked? Include tool usage,
decision points -->

**Output Artifacts:**
<!-- What files/content are created? Show first 10-20 lines as preview
-->

**Success Indicators:**
<!-- How does user know it worked correctly? What validation should they
perform? -->

For detailed contribution requirements, see:

* Common Standards:
[docs/contributing/ai-artifacts-common.md](../docs/contributing/ai-artifacts-common.md)
- Shared standards for XML blocks, markdown quality, RFC 2119,
validation, and testing
* Agents:
[docs/contributing/custom-agents.md](../docs/contributing/custom-agents.md)
- Agent configurations with tools and behavior patterns
* Prompts:
[docs/contributing/prompts.md](../docs/contributing/prompts.md) -
Workflow-specific guidance with template variables
* Instructions:
[docs/contributing/instructions.md](../docs/contributing/instructions.md)
- Technology-specific standards with glob patterns
* Skills: [docs/contributing/skills.md](../docs/contributing/skills.md)
- Task execution utilities with cross-platform scripts

## Testing

* Passed `npm run validate:devcontainer-lockfile`.
* Passed `npm run validate:docs` after installing the documentation
package dependencies: 10 suites and 105 tests passed.
* Passed `npm run spell-check`: 844 files checked with no issues.
* Rebuilt the development container and confirmed
`/usr/local/bin/copilot --version` reports GitHub Copilot CLI 1.0.79.
* `npm run validate:local` reached link validation and reported
unrelated failures in three RAI documentation files.
* Deferred the standalone `npm run lint:md-links` result to hosted CI.

## Checklist

### Required Checks

* [x] Documentation is updated (if applicable)
* [x] Files follow existing naming conventions
* [x] Changes are backwards compatible (if applicable)
* [ ] Tests added for new functionality (N/A - the change uses a
declarative Dev Container Feature and existing lock validation)

### AI Artifact Contributions
<!-- If contributing an agent, prompt, instruction, or skill, complete
these checks -->
* [ ] Used `hve-builder` review mode to review contribution
* [ ] Addressed all actionable findings from the `hve-builder` review
* [ ] 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` (pending
hosted CI; local run was blocked by unrelated RAI link failures)
* [x] Documentation validation (if docs changed): `npm run
validate:docs`
* [x] Spell checking: `npm run spell-check`
* [ ] Link validation: `npm run lint:md-links` (pending hosted CI)

## Security Considerations

* [x] This PR does not contain any sensitive or NDA information
* [x] Any new dependencies have been reviewed for security issues
* [ ] Security-related scripts follow the principle of least privilege
(N/A - no security scripts changed)

## Additional Notes

The feature release is pinned by OCI digest, while the feature's CLI
version option retains its default of `latest`. The rebuilt container
installed GitHub Copilot CLI 1.0.79. Pinning the CLI version separately
can be considered if deterministic CLI binaries become a requirement.

Co-authored-by: Bill Berry <WilliamBerryiii@users.noreply.github.com>
Co-authored-by: Jamie Kim <jamiekim500@gmail.com>
…te (microsoft#2621)

## Description

Issue Triage has been failing on every issue opened by an organization
member whose effective repository permission is `read`. Five `[aw]`
failure issues across four triggering issues over eight days, consuming
183.4 AIC and producing zero triage outcomes.

### Root cause

The workflow declared no `tools:` block, so it inherited gh-aw's
automatic public-repository guard policy of `min-integrity: approved`.
That threshold requires write access or public organization membership.
Meanwhile the workflow's own `roles: [admin, maintainer, write, triage]`
gate admits `read`-level authors.

From the gateway log of run 31106008135:

```text
[integrity] issue:microsoft#2613: author_association floor below writer (rank=2), checking collaborator permission for Salazander
get_collaborator_permission: microsoft/hve-core user Salazander -> permission=Some("read")
integrity=["none:public", "unapproved:public"]
Integrity CheckFlow denied: source missing required tags=[approved:public]
```

`author_association` reports `NONE` because the Actions token cannot
observe private `microsoft` organization membership, so the guard falls
back to the collaborator-permission path and lands on `read`, one level
below the required `approved`.

The activation gate and the integrity gate disagreed. The workflow
started on issues it was then forbidden to read.

### Amplifiers found while investigating

| Amplifier | Evidence |
|---|---|
| The agent had no fallback source for issue content. The prompt
supplied only `issue-number`, so the filtered `issue_read` left nothing
to triage. | Run artifact `aw-prompts/prompt.txt` |
| The agent retried the blocked read across MCP, the `gh` CLI, and
search. Run 30873207503 reached 406.5k tokens and 61 AIC before the
copilot engine terminated. | microsoft#2595, microsoft#2596 |
| Each triggering issue ran triage twice. `opened` and the
template-applied `needs-triage` `labeled` event fire within one second,
and the compiled concurrency group had no `cancel-in-progress`. | Runs
30873207503 and 30873208337, both created at 02:55:10-11Z for issue
microsoft#2594 |
| `report_incomplete` was not the only failure category. microsoft#2596 also
emitted `missing_data`, which carries its own independent
report-as-failure flag. | microsoft#2596 |

### Changes

| Change | Effect |
|---|---|
| `tools.github.min-integrity: unapproved` | Admits the same author
class the `roles` gate already admits. Also restores duplicate
detection, which was silently dropping community-authored issues from
search results. |
| `tools.github.allowed-repos: public` | Preserves the scope the runtime
previously resolved. Declaring `tools.github` without it compiles
`repos` to `all`. |
| `tools.github.toolsets: [context, repos, issues]` | Drops the unused
`pull_requests` toolset, which had no matching `pull-requests: read`
permission. Clears a compile warning without granting a new permission.
|
| `safe-outputs.report-failure-as-issue: ["!report_incomplete",
"!missing_data"]` | Stops both categories from creating failure issues.
`agent_failure`, `timed_out`, `missing_tool`, and `missing_safe_outputs`
continue to report. |
| `${{ steps.sanitized.outputs.text }}` in the prompt body | Delivers
the triggering issue title and body outside the MCP guard, removing the
single point of failure. Mirrors the existing pattern in
`issue-implement.md`. |
| `## When Issue Content Is Unavailable` section | One read attempt, no
cross-path retry, leave `needs-triage`, post one comment, `noop`. Caps
the cost blowup and removes the failure signal. |
| Explicit `concurrency` block with `cancel-in-progress: true` |
Collapses the duplicate run. The group is prefixed with
`contains(github.actor, '[bot]') && github.run_id` so labels applied by
this workflow cannot cancel the run still applying them, per the gh-aw
compiler's self-cancellation guidance. |

`issue-triage.lock.yml` is regenerated output from `gh aw compile`
(pinned to v0.83.1, matching the existing lock metadata). Do not
hand-edit it.

## Related Issue(s)

Fixes microsoft#2614
Fixes microsoft#2596
Fixes microsoft#2595
Fixes microsoft#2575
Fixes microsoft#2563

## Type of Change

Select all that apply:

**Code & Documentation:**

* [x] Bug fix (non-breaking change fixing an issue)
* [ ] New feature (non-breaking change adding functionality)
* [ ] Breaking change (fix or feature causing existing functionality to
change)
* [ ] Documentation update

**Infrastructure & Configuration:**

* [x] GitHub Actions workflow
* [ ] Linting configuration (markdown, PowerShell, etc.)
* [ ] Security configuration
* [ ] DevContainer configuration
* [ ] Dependency update

**AI Artifacts:**

* [ ] Reviewed contribution with `hve-builder` and addressed all
actionable findings
* [ ] Copilot instructions (`.github/instructions/*.instructions.md`)
* [ ] Copilot prompt (`.github/prompts/*.prompt.md`)
* [ ] Copilot agent (`.github/agents/*.agent.md`)
* [ ] Copilot skill (`.github/skills/*/SKILL.md`)
* [ ] Copilot hook (`.github/hooks/*/*.json`)
* [ ] 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:**

* [ ] Script/automation (`.ps1`, `.sh`, `.py`)
* [ ] Other (please describe):

## Sample Prompts (for AI Artifact Contributions)

<!-- If you checked any boxes under "AI Artifacts" above, provide a
sample prompt showing how to use your contribution -->
<!-- Delete this section if not applicable -->

**User Request:**
<!-- What natural language request would trigger this
agent/prompt/instruction? -->

**Execution Flow:**
<!-- Step-by-step: what happens when invoked? Include tool usage,
decision points -->

**Output Artifacts:**
<!-- What files/content are created? Show first 10-20 lines as preview
-->

**Success Indicators:**
<!-- How does user know it worked correctly? What validation should they
perform? -->

For detailed contribution requirements, see:

* Common Standards:
[docs/contributing/ai-artifacts-common.md](../docs/contributing/ai-artifacts-common.md)
- Shared standards for XML blocks, markdown quality, RFC 2119,
validation, and testing
* Agents:
[docs/contributing/custom-agents.md](../docs/contributing/custom-agents.md)
- Agent configurations with tools and behavior patterns
* Prompts:
[docs/contributing/prompts.md](../docs/contributing/prompts.md) -
Workflow-specific guidance with template variables
* Instructions:
[docs/contributing/instructions.md](../docs/contributing/instructions.md)
- Technology-specific standards with glob patterns
* Skills: [docs/contributing/skills.md](../docs/contributing/skills.md)
- Task execution utilities with cross-platform scripts

## Testing

Automated validation run locally:

| Check | Command | Result |
|---|---|---|
| Workflow compilation | `gh aw compile issue-triage` | 0 errors, 0
warnings. The pre-change file also compiled with 0 warnings, so no
regression was introduced. |
| Action version consistency |
`scripts/security/Test-ActionVersionConsistency.ps1 -FailOnMismatch` |
Pass. 602 SHA-pinned actions scanned, 0 mismatches, 0 missing version
comments. |
| Dependency pinning | `scripts/security/Test-DependencyPinning.ps1
-FailOnUnpinned` | Pass. 652 dependencies, 0 unpinned, 100% compliance.
|
| Workflow permissions | `scripts/security/Test-WorkflowPermissions.ps1
-FailOnViolation` | Pass. All workflows and jobs passed. |
| Markdown custom rules | Mechanical check against `.markdownlint.json`
| 0 em dashes, 0 bolded-prefix list items, 0 trailing whitespace, 0
lines over the 500-character limit, 0 new violations relative to the
base file. |

Compiled guard policy verified in the regenerated lock file:

```json
"min-integrity": "unapproved",
"repos": "public"
```

Not performed:

* `npm run validate:local` and the other Node-based lint lanes could not
run in this environment. The npm registry is unreachable
(`ERR_SSL_SSL/TLS_ALERT_HANDSHAKE_FAILURE`) and `node_modules/.bin` is
absent. Markdown conformance was verified mechanically against the
repository lint configuration instead. **Please run `npm run
validate:local` on a working network before merging.**
* No runtime execution of the workflow. Behavior is asserted from the
compiled lock file and from the run artifacts of the five failing runs.

## Checklist

### Required Checks

* [ ] Documentation is updated (if applicable) (N/A — no user-facing
documentation changed; rationale is captured in workflow frontmatter
comments)
* [x] Files follow existing naming conventions
* [x] Changes are backwards compatible (if applicable)
* [ ] Tests added for new functionality (if applicable) (N/A — agentic
workflow behavior is not covered by the Pester or pytest suites)

### AI Artifact Contributions
<!-- If contributing an agent, prompt, instruction, or skill, complete
these checks -->
* [ ] Used `hve-builder` review mode to review contribution
* [ ] Addressed all actionable findings from the `hve-builder` review
* [ ] 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` (blocked
locally — npm registry unreachable; must be run by a reviewer)
* [ ] Documentation validation (if docs changed): `npm run
validate:docs` (N/A — no docs changed)
* [ ] Spell checking: `npm run spell-check` (blocked locally — npm
registry unreachable)
* [ ] Link validation: `npm run lint:md-links` (blocked locally — npm
registry unreachable)

## Security Considerations

<!-- ⚠️ WARNING: Do not commit sensitive information such as API keys,
passwords, or personal data -->
* [x] This PR does not contain any sensitive or NDA information
* [x] Any new dependencies have been reviewed for security issues (N/A —
no dependency changes)
* [x] Security-related scripts follow the principle of least privilege
(N/A — no security scripts modified)

### Reviewer attention: this PR intentionally lowers an integrity
threshold

`min-integrity` moves from the inherited default of `approved` to
`unapproved`. Reviewers should weigh this deliberately.

Why it is acceptable here:

* gh-aw documentation recommends `unapproved` for community triage and
planning workflows, and the upstream `repo-assist` example applies the
same override for the same reason.
* Activation is already gated by `roles: [admin, maintainer, write,
triage]`, so the workflow does not run for arbitrary authors.
* Safe outputs remain narrow: comments capped at 3 on the triggering
issue, labels restricted to a fixed allow-list with `admin-only` and
`do-not-triage` blocked, and `needs-triage` as the only removable label.
No code, branch, or pull request writes.
* The one escalation path, the `agent-ready` label consumed by
`issue-implement.md`, is already cut off by that workflow's `skip-bots:
["github-actions[bot]"]`.

Compensating changes in this PR:

* `allowed-repos: public` is now explicit rather than left to default to
`all`.
* `toolsets` is narrowed from four to three, removing a toolset that had
no matching permission.

### Out-of-scope change deliberately reverted

`gh aw compile` rewrites the shared `github/gh-aw-actions/setup` entry
in `.github/aw/actions-lock.json` from v0.81.6 to v0.83.1. That entry is
still referenced by `vex-draft.lock.yml`, which was compiled with
v0.81.6. The file was reverted and is not part of this PR. Bumping it
should be a deliberate change that also recompiles `vex-draft`.

## Additional Notes

### Not addressed here

The same latent contradiction exists fleet-wide. No workflow under
`.github/workflows/*.md` declares a `tools:` block, so `pr-review`,
`dependency-pr-review`, `issue-implement`, and `doc-update-check` all
inherit `min-integrity: approved`. They gate on write-or-above so they
do not hit the activation mismatch, but their reads of comments authored
by read-level accounts are still being silently filtered. Worth a
follow-up issue.

### Superseded failure issues

The five `[aw]` issues listed under Related Issues are bot-generated and
carry gh-aw expiry checkboxes. They can be closed once this merges, or
left to expire.

---------

Co-authored-by: Jamie Kim <kimjimin@microsoft.com>
…crosoft#2633)

## Description

Makes CQ-6 an enforceable, deterministic control rather than a
documented aspiration.

`Test-DangerousWorkflow.ps1` gains a second rule,
`dangerous-workflow/direct-input-interpolation`, which resolves every
`inputs.<name>` reference found in a `run:` body or an
`actions/github-script` `script:` body against the type declared in
`on.workflow_call.inputs` or `on.workflow_dispatch.inputs`, and reports
any reference whose type is not `boolean`. The rule is type-driven
rather than text-driven, and an input whose type cannot be resolved is
reported so the gate fails closed.

`boolean` is the sole exception, because GitHub constrains that type to
the literals `true` and `false`, so the substituted text can carry no
shell metacharacters.

The fleet was migrated to satisfy the rule: 26 step contexts across 13
workflows and 1 composite action now route caller-controlled values
through step-level `env:` mappings named `INPUT_<UPPER_SNAKE>` and read
native shell variables. The inventory went from 64 input references
across 37 contexts to 24 references across 17 contexts, all `boolean`.

### Two things reviewers should look at

One behavior change. `weekly-security-maintenance.yml` previously
substituted a caller value into bare, unquoted PowerShell source
(`$thresholdDays = ${{ inputs.max-age-days || 30 }}`), the worst-shaped
interpolation in the repository. Two report lines there also lacked the
`|| 30` fallback that five sibling lines had, so scheduled runs rendered
`Stale SHAs (> days)`. Consolidating on one `env:` mapping applies the
default uniformly, so that text now reads `>30 days`.

Scope slightly wider than the issue. microsoft#2623 frames CQ-6 around reusable
workflows. This PR also covers `workflow_dispatch` inputs and composite
action metadata, because the injection mechanics are identical and
`type: number` is only strictly validated on the `workflow_call` path.
Composite actions are held to a stricter rule with no exception: the
action metadata schema gives `inputs.<input_id>` only `description`,
`required`, `default`, and `deprecationMessage`, so no action input can
declare itself boolean. T-3 was broadened to match the enforced control.

### Commits

| Commit | Change |

|------------|-----------------------------------------------------------------|
| `201db9cc` | `fix(workflows)` — 12 reusable workflows migrated |
| `8248580f` | `fix(actions)` — `setup-ps-modules` migrated |
| `7df947d3` | `feat(scripts)` — CQ-6 rule, composite action scanning,
CI wiring |
| `27c7d8fb` | `docs(security)` — CQ-6 boundary and T-3 posture |
| `7374daf4` | `fix(scripts)` — multi-line expression matching |

The final commit fixes a pre-existing bug: `Get-ExpressionMatches`
lacked `RegexOptions.Singleline`, so an expression whose body spans
lines was invisible to both rules, including template-injection.
Verified with a fixture that scanned clean before and fails now.

## Related Issue(s)

Fixes microsoft#2623

Follow-up tracked in microsoft#2632 (provenance tracking through `matrix` and job
outputs — no current exposure, blocked on a suppression-semantics design
decision).

## Type of Change

Select all that apply:

**Code & Documentation:**

* [x] 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:**

* [x] GitHub Actions workflow
* [ ] Linting configuration (markdown, PowerShell, etc.)
* [x] Security configuration
* [ ] DevContainer configuration
* [ ] Dependency update

**AI Artifacts:**

No AI artifacts changed. No agents, prompts, instructions, skills,
hooks, or eval specs are touched by this PR.

**Other:**

* [x] Script/automation (`.ps1`, `.sh`, `.py`)
* [ ] Other (please describe):

## Testing

| Check | Result |

|----------------------------------------------------------------------------------------|-----------------------------|
| `npm run test:ps -- -TestPath
scripts/tests/security/Test-DangerousWorkflow.Tests.ps1` | 31 passed, 0
failed |
| `npm run test:ps -- -TestPath scripts/tests/security/` | 612 passed, 0
failed |
| `npm run lint:dangerous-workflow` | 67 files, no findings, exit 0 |
| `npm run lint:yaml` | pass |
| `npm run lint:ps` | pass |

Beyond the suites:

* Ran the gate before migration and confirmed exactly 26 findings,
matching a count derived independently from a structured inventory. This
cross-validates the rule against the classification rather than assuming
they agree.
* Parsed every migrated `pwsh` `run:` body with
`System.Management.Automation.Language.Parser`. No parse failures
introduced; two pre-existing failures in `eval-validation.yml` reproduce
identically on `main`.
* Verified each commit leaves `dangerous-workflow-check` green by
running the CI invocation in a throwaway worktree at the intermediate
commits.
* 19 new Pester fixtures covering pwsh and bash, `string` / `number` /
`boolean` / undeclared / untyped inputs, github-script bodies, compound
and multi-line expressions, composite and non-composite actions,
multi-root scanning, and both documented passing shapes.

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

Backwards-compatibility note: `Test-DangerousWorkflow.ps1 -Path` changed
from `[string]` to `[string[]]` and its default now includes
`.github/actions`. Existing single-path callers bind unchanged. Any
external caller passing an array previously would have failed anyway.

### AI Artifact Contributions

Not applicable. No AI artifacts changed.

### Required Local Checks

The following local-safe validation commands must pass before merging:

* [ ] Local validation aggregate: `npm run validate:local`
* [ ] Documentation validation (if docs changed): `npm run
validate:docs`
* [ ] 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
* [x] Any new dependencies have been reviewed for security issues — no
new dependencies
* [x] Security-related scripts follow the principle of least privilege —
no permission changes

### Review of this diff

This branch was reviewed for security before submission. Three findings
resulted; two are fixed here and one is deferred with no current
exposure.

| ID  | Severity | Finding | Disposition |
|-----|----------|---------|-------------|
| F-1 | High | The CI wiring that scans `.github/actions` was originally
committed two commits before the `[string[]]$Path` change that makes it
valid. `dangerous-workflow-check` is a required check, and it failed at
those commits with a parameter-binding error. | Fixed. The wiring now
sits in `7df947d3` alongside the parameter change. Verified by running
the CI invocation in a throwaway worktree at the intermediate commit:
exit 0, previously exit 1. |
| F-2 | Medium | `Get-ExpressionMatches` lacked
`RegexOptions.Singleline`, so an expression whose body spans lines was
invisible to both rules, including the pre-existing template-injection
rule. | Fixed in `7374daf4`, with regression fixtures for both rules and
an assertion that findings report the expression on one line. |
| F-3 | Low | A caller-controlled value that passes through
`strategy.matrix` or a job output is not tracked, so a future `run:`
body consuming it would bypass CQ-6. | Tracked in microsoft#2632. No current
exposure: the one job whose matrix derives directly from an input
consumes it only in `env:` and artifact-name positions, and all 24
run-body matrix references resolve to repository-controlled generation.
|

The review was a targeted control assessment rather than the full
multi-skill pipeline. That pipeline filters `*.yml`, `*.yaml`, and
`*.md` out of diff scope, which would have excluded all 15 workflows,
the composite action, and both documentation files, leaving only the two
PowerShell files.

## Additional Notes

No caller currently passes a workflow input into `setup-ps-modules`, so
the composite action portion closes a latent detection gap rather than
an active exposure. Stating that plainly rather than overselling it.

The prior automated attempt on this issue (branch
`feat/cq6-caller-input-isolation-*`, and the comment on microsoft#2623) claims
the enforcement and Pester coverage were already in place. That is not
true against `main`; there was no `inputs.*` handling anywhere in the
scanner. This work was built against `main` and does not reuse that
branch.
…d the runtime harness (microsoft#2566)

# fix(docs): resolve documentation site accessibility defects and extend
the runtime harness

## Description

This branch closes out the documentation site accessibility follow-ups
and extends the accessibility skill's runtime harness with the machinery
those fixes needed. Three of the changes are genuine product defects on
the published docs site; the rest is permanent regression coverage plus
the harness work that made the defects reproducible in the first place.

> A recurring theme in this work: several behaviors previously
classified as "manual only" turned out to be automatable once the right
measurement was found. Text zoom is the clearest example — it had been
recorded as undriveable from Playwright, but browser zoom is equivalent
to a scaled viewport at a matching `deviceScaleFactor`, which makes it a
deterministic matrix.

### Documentation site fixes

Three defects were reproduced against a locally served build before any
fix was written, and each fix is now locked by a test proven to fail
without it.

- Fixed the **search clear button** in *src/theme/SearchBar/index.jsx*.
The swizzled component looked for `button[type="reset"],
button[class*="clear"]`, but the upstream theme renders the control as
`<button class="searchClearButton_qk4g">` with no `type` attribute. CSS
attribute matching is case-sensitive, so `[class*="clear"]` never
matched `searchClearButton`. The selector now carries the
case-insensitive flag.
- This one had been masked: the product code and its test shared the
same faulty selector, so the test took a skip branch instead of failing.
- Fixed **navbar overlap at narrow viewports** in *src/css/custom.css*.
The search plugin's container is absolutely positioned and sits outside
the flex flow, so no flex rule on its siblings could resolve the
overlap. The brand title is now visually hidden below 420px while
retaining its accessible name.
- Fixed **search placeholder clipping under text zoom** in the same
file. The keyboard shortcut badge is hidden below 996px, which restores
usable width for the placeholder.

### Regression coverage

- Added *e2e/text-zoom.spec.ts*, which exercises a zoom matrix from 100%
through 250% by pairing scaled viewports with matching device scale
factors, then measures required placeholder width against usable width.
- Added table, search keyboard, arrow navigation, and search page status
specs.
- Extended *e2e/contrast.spec.ts* so every prose link must carry a
non-color cue, and *e2e/focus-management.spec.ts* so every visible
focusable draws an indicator of at least 2 CSS pixels.
- Added `waitForHydration` to *e2e/_helpers/a11yInvariants.ts* and
applied it across twelve specs. Docusaurus sets `data-has-hydrated` on
the document element after React hydration; several specs were asserting
against click handlers, focus styles, and axe results before that point,
which is what produced the intermittent failures.

### Accessibility skill runtime harness

- Split AT case execution, calibration, and visual review into discrete
modules under *scripts/runtime_a11y/runner/*, replacing a single
monolithic path.
- Added an **ARIA-AT catalog** with a JSON Schema and SHA-pinned
upstream provenance covering five patterns. The public posture is
deliberately conservative: entries default to manual-only and JAWS
remains human-led.
- Added `render-artifacts`, `capture-visual-review`, `run-calibration`,
and `run-at-plan` subcommands, along with output-path containment
checks.
- Fixed a **stray browser window leak**. The harness previously invoked
`chrome.exe --version` to read the browser version; on Windows that
opens a window rather than printing and exiting, and the call was made
twice in one expression. Version detection now reads file metadata
instead.
- Introduced a **method-adequacy taxonomy** distinguishing criteria that
static analysis can decide from those it can only inform, with CI
enforcement graduated by tier.

### Documentation

- Added a manual validation guide under *docs/contributing/* organizing
per-behavior steps into seven workstreams with a traceability register
and evidence template.
- Added a shared real screen reader testing runbook under
*docs/planning/runbooks/accessibility/*.

## Related Issue(s)

None

## Type of Change

Select all that apply:

**Code & Documentation:**

* [x] 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:**

* [ ] Reviewed contribution with `prompt-builder` agent and addressed
all feedback
* [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`)
* [ ] 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: Only contributions targeting the **latest Anthropic
and OpenAI models** will be accepted. Older model versions (e.g.,
GPT-3.5, Claude 3) will be rejected.
> * 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:**

"Generate the accessibility coverage matrix for this project and render
the evidence bundle."

**Execution Flow:**

The coverage matrix prompt builds a surface inventory across surfaces
and interaction states, then classifies each criterion by method
adequacy — whether static analysis can decide it or only inform it. It
invokes the runtime harness `render-artifacts` subcommand to produce the
evidence bundle. Criteria in the announcement, interaction, and
adaptive-rendering classes are routed to manual verification rather than
reported as automated passes. Unresolved assistive-technology work is
routed to the shared real screen reader runbook.

**Output Artifacts:**

A six-file bundle: coverage matrix as JSON and Markdown, an EARL JSON-LD
report, manual test plans in Markdown and YAML, and a manifest. For
example, the manual plan opens with the surface and state inventory,
followed by per-criterion steps and an evidence template with a
four-value result vocabulary.

**Success Indicators:**

The manifest lists all six artifacts, the EARL report maps informs-only
methods to `earl:cantTell` rather than a pass, and every criterion that
cannot be decided statically appears in the manual plan rather than
being silently marked as covered.

For detailed contribution requirements, see:

* Common Standards:
[docs/contributing/ai-artifacts-common.md](../docs/contributing/ai-artifacts-common.md)
- Shared standards for XML blocks, markdown quality, RFC 2119,
validation, and testing
* Agents:
[docs/contributing/custom-agents.md](../docs/contributing/custom-agents.md)
- Agent configurations with tools and behavior patterns
* Prompts:
[docs/contributing/prompts.md](../docs/contributing/prompts.md) -
Workflow-specific guidance with template variables
* Instructions:
[docs/contributing/instructions.md](../docs/contributing/instructions.md)
- Technology-specific standards with glob patterns
* Skills: [docs/contributing/skills.md](../docs/contributing/skills.md)
- Task execution utilities with cross-platform scripts

## Testing

Automated validation captured on this branch **before** the most recent
merge from `main`:

| Check | Result |
|-------|--------|
| `npm run test:node` | Passed, 120 of 120 |
| Playwright e2e suite | Passed, 248 passed and 2 skipped |
| Docusaurus `npm run typecheck` | Passed |
| `npm run lint:md` | Passed |
| `npm run lint:frontmatter` | Passed, 823 files with no errors or
warnings |

Re-run **after** the merge, on the tree as proposed:

| Check | Result |
|-------|--------|
| `npm run lint:frontmatter` | Passed |
| `npm run validate:skills` | Passed, 56 skills with no errors or
warnings |

Each new lock was proven non-vacuous by confirming it fails before the
corresponding fix and passes after. The contrast lock moved from 0 to 19
offenders when the fix was reverted; the focus indicator lock moved from
0 to 77; the zoom matrix moved from 4 passing to 2 failing.

The e2e suite went from 217 passing with 16 skips to 248 passing with 2
skips, and full-suite runtime dropped from 12.0 minutes with 4 failures
to 2.9 minutes with none.

> [!IMPORTANT]
> The Node-based checks could not be re-run after the merge. A TLS
handshake failure between this workstation and the public npm registry
currently blocks dependency installation, which leaves both the
repository root and `docs/docusaurus` without a complete `node_modules`.
That is an environment fault on the authoring machine, not a defect in
this branch. CI installs from a clean environment and should be treated
as the authoritative signal for every unchecked item below.

Manual testing has not yet been performed. A manual validation pass
covering the remaining behaviors is planned as a follow-up using the
runbook added in this branch.

Security review of the diff found no secrets, tokens, credentials, or
personal data, and no non-inclusive language. All new Python and Node
modules carry Microsoft copyright and SPDX identifiers. The skill-local
lockfile resolves from the public npm registry.

## 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
<!-- If contributing an agent, prompt, instruction, or skill, complete
these checks -->
* [ ] Used `/prompt-analyze` to review contribution
* [ ] Addressed all feedback from `prompt-builder` review
* [ ] Verified contribution follows common standards and type-specific
requirements

### Required Automated Checks

The following validation commands must pass before merging:

* [ ] Markdown linting: `npm run lint:md`
* [ ] Spell checking: `npm run spell-check`
* [x] Frontmatter validation: `npm run lint:frontmatter`
* [x] Skill structure validation: `npm run validate:skills`
* [ ] Link validation: `npm run lint:md-links`
* [ ] PowerShell analysis: `npm run lint:ps`
* [ ] Eval spec schema and coverage (if AI artifacts changed): `npm run
eval:lint:schema`
* [ ] Plugin freshness: `npm run plugin:generate`
* [ ] Docusaurus tests: `npm run docs:test`

## Security Considerations
<!-- ⚠️ WARNING: Do not commit sensitive information such as API keys,
passwords, or personal data -->
* [x] This PR does not contain any sensitive or NDA information
* [x] Any new dependencies have been reviewed for security issues
* [x] Security-related scripts follow the principle of least privilege

## GHCP Artifact Maturity

> [!WARNING]
> This PR includes **experimental** GHCP artifacts that may have
breaking changes.
>
> - `.github/agents/accessibility/accessibility-planner.agent.md`
> - `.github/agents/accessibility/accessibility-reviewer.agent.md`
> -
`.github/agents/accessibility/subagents/accessibility-framework-assessor.agent.md`
> -
`.github/instructions/accessibility/accessibility-identity.instructions.md`
> -
`.github/prompts/accessibility/accessibility-coverage-matrix.prompt.md`
> - `.github/skills/accessibility/accessibility/SKILL.md`

| File | Type | Maturity | Notes |

|---------------------------------------------|--------------|-----------------|------------------|
| `accessibility-planner.agent.md` | Agent | ⚠️ experimental |
Pre-release only |
| `accessibility-reviewer.agent.md` | Agent | ⚠️ experimental |
Pre-release only |
| `accessibility-framework-assessor.agent.md` | Agent | ⚠️ experimental
| Pre-release only |
| `accessibility-identity.instructions.md` | Instructions | ⚠️
experimental | Pre-release only |
| `accessibility-coverage-matrix.prompt.md` | Prompt | ⚠️ experimental |
Pre-release only |
| `accessibility/SKILL.md` | Skill | ⚠️ experimental | Pre-release only
|

### GHCP Maturity Acknowledgment

- [ ] I acknowledge this PR includes non-stable GHCP artifacts
- [ ] Non-stable artifacts are intentional for this change

## Additional Notes

**Known limitation — live-region announcement capture.** Spoken
verification of live regions through the guidepup and NVDA path did not
capture announcements across repeated settle windows, including runs
against a positive-control fixture that updated every two seconds over
settle windows up to eight seconds. Timing, capture clearing, focus
placement, screen reader configuration, and browser accessibility flags
were each eliminated as causes. The two docs-site journeys that depend
on announcements are therefore recorded as manual-boundary items rather
than reported as product failures. The positive-control fixture added in
*docs/docusaurus/static/a11y-positive-control.html* exists to validate
the oracle before any silent live region is attributed to the product.

**Behavior change in the harness.** The runtime harness now requires
`npm ci` in its skill-local directory before probe execution, replacing
the previous ephemeral `npx` approach. The workflow template documents
this step.

**Follow-up work.** A manual assistive-technology pass remains
outstanding for the behaviors that automation cannot decide. A runbook
comment with per-behavior steps will be added to this PR to support that
pass.

---------

Co-authored-by: Jamie Kim <jamiekim500@gmail.com>
…#2689)

## Description

This PR fixed Copilot CLI installation from the HVE Core marketplace by
adding the shared manifest resolved from the canonical `.github` Git
source. Marketplace entries continued to own package-specific component
membership, while repository validation, fixtures, tests, and
documentation now use the same shared-source contract.

* Added `.github/plugin.json` with the `hve-core` source identity and
explicit empty component defaults.
* Replaced optional generated `plugins/<name>/plugin.json` validation
with a required shared-manifest check.
* Updated fixture repositories and focused tests for accepted and absent
shared manifests.
* Documented complete source-tree copying, entry-selected component
loading, unchanged channel refs, and the separate role of generated
release ZIPs.

## Related Issue(s)

None.

## Type of Change

Select all that apply:

**Code & Documentation:**

* [x] 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:**

* [ ] Reviewed contribution with `hve-builder` and addressed all
actionable findings
* [ ] Copilot instructions (`.github/instructions/*.instructions.md`)
* [ ] Copilot prompt (`.github/prompts/*.prompt.md`)
* [ ] Copilot agent (`.github/agents/*.agent.md`)
* [ ] Copilot skill (`.github/skills/*/SKILL.md`)
* [ ] Copilot hook (`.github/hooks/*/*.json`)
* [ ] 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)

<!-- If you checked any boxes under "AI Artifacts" above, provide a
sample prompt showing how to use your contribution -->
<!-- Delete this section if not applicable -->

**User Request:**
<!-- What natural language request would trigger this
agent/prompt/instruction? -->

**Execution Flow:**
<!-- Step-by-step: what happens when invoked? Include tool usage,
decision points -->

**Output Artifacts:**
<!-- What files/content are created? Show first 10-20 lines as preview
-->

**Success Indicators:**
<!-- How does user know it worked correctly? What validation should they
perform? -->

For detailed contribution requirements, see:

* Common Standards:
[docs/contributing/ai-artifacts-common.md](../docs/contributing/ai-artifacts-common.md)
- Shared standards for XML blocks, markdown quality, RFC 2119,
validation, and testing
* Agents:
[docs/contributing/custom-agents.md](../docs/contributing/custom-agents.md)
- Agent configurations with tools and behavior patterns
* Prompts:
[docs/contributing/prompts.md](../docs/contributing/prompts.md) -
Workflow-specific guidance with template variables
* Instructions:
[docs/contributing/instructions.md](../docs/contributing/instructions.md)
- Technology-specific standards with glob patterns
* Skills: [docs/contributing/skills.md](../docs/contributing/skills.md)
- Task execution utilities with cross-platform scripts

## Testing

Fast validation was run against the changed surfaces after merging
current `origin/main`:

* `npm run test:ps -- -TestPath
"scripts/tests/plugins/Validate-Marketplace.Tests.ps1"` - passed, 71
tests
* `npm run lint:marketplace` - passed, 10 plugins
* `npm run lint:plugin-output` - passed, no tracked plugin output or
symbolic links
* `npm exec -- markdownlint-cli2 "scripts/plugins/README.md"
"docs/getting-started/methods/cli-plugins.md"` - passed, 0 issues
* `git diff --check origin/main...HEAD` - passed

Security analysis found no sensitive data, dependency changes,
permission changes, or privilege expansion. Manual testing was not
performed.

## Checklist

### Required Checks

* [x] Documentation is updated (if applicable)
* [x] Files follow existing naming conventions
* [ ] Changes are backwards compatible (if applicable)
* [x] Tests added for new functionality (if applicable)

### AI Artifact Contributions
<!-- If contributing an agent, prompt, instruction, or skill, complete
these checks -->
* [ ] Used `hve-builder` review mode to review contribution
* [ ] Addressed all actionable findings from the `hve-builder` review
* [ ] 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` (skipped by
caller direction; changed-surface checks passed)
* [ ] Documentation validation (if docs changed): `npm run
validate:docs` (skipped by caller direction; targeted Markdown lint
passed)
* [ ] Spell checking: `npm run spell-check` (skipped by caller
direction)
* [ ] Link validation: `npm run lint:md-links` (skipped by caller
direction)

## Security Considerations

* [x] This PR does not contain any sensitive or NDA information
* [ ] Any new dependencies have been reviewed for security issues (N/A -
no dependency changes)
* [ ] Security-related scripts follow the principle of least privilege
(N/A - no security-related script changes)

## Additional Notes

The branch was merged with current `origin/main` before PR generation.
The broad template validation commands were intentionally not run;
validation was limited to fast checks that own the changed files and
behavior.
…t Records (microsoft#2611)

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.

Closes microsoft#2609

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

**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 -->

* Project: renewal-flow
* Subject: Returning customer
* Mode: map-journey
* Status: current
* Source references: .copilot-tracking/ux-coaching/renewal-flow/problem-framing.md

* Users reach the renewal screen from the account menu. Source: M6 problem-framing, session notes.

* Support reports confusion at the payment-method step. Source: M6 problem-framing.

* Users recognise the renewal date format. Unvalidated.

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

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.

* [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)

* [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

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`

* [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.

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
…-primary coach jobs (microsoft#2612)

# Pull Request

## Description

Consolidates the Data Science workstream from an agent-primary surface
into a skill-primary one governed by `data-workstream-coach`.

The five Data Science specialist agents delegated work that either
belongs to a skill (durable, reusable conventions) or is already served
by built-in VS Code Copilot tooling (notebook and dashboard
scaffolding). Research confirmed the durable capability in those agents
was authoring convention, not orchestration, so it is absorbed into
skills and the retired agent surfaces are dropped rather than rehomed.

### Retired agents

Removes five specialist agents under `.github/agents/data-science/`:

* `eval-dataset-creator`
* `gen-data-spec`
* `gen-jupyter-notebook`
* `gen-streamlit-dashboard`
* `test-streamlit-dashboard`

### New skills

* `ds-analysis-authoring` — EDA notebook sequencing and analytical
dashboard authoring conventions, including a plot-selection table,
axis-scale thresholds, `cache_data` versus `cache_resource` guidance,
and interaction latency budgets.
* `ds-evaluation-design` — evaluation dataset design for AI systems,
including an interview and review protocol, metric selection, provenance
requirements, and a dataset contract template. It sets a 30-pair floor
and a category distribution with a per-category floor, and deliberately
does not freeze an evaluator catalog.

### Extended skills

* `ds-catalog` gains dataset profile contract coverage.
* `ds-dataops` gains persistence and versioning coverage.

### Coach and registry

* `data-workstream-coach` reduces its `agents:` frontmatter from six
entries to one (`Experiment Designer`), and now states that coaching
governs decision ownership rather than abstention from producing work.
* The job registry replaces the `analysis` job target with
`ds-analysis-authoring`, adds an `evaluation` job routed to
`ds-evaluation-design`, and moves from five-skill to seven-skill
boundaries.

### Catalog and evals

* `marketplace.json` updates the `data-science` and `hve-core-all`
packages to the new membership, with matching component maturity across
both packages.
* Behavior conformance stimuli, expectations, and surface signatures for
the retired agents are removed; sixteen skill stimuli cover the new and
extended surfaces.

## Related Issue(s)

Closes microsoft#2610

## 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)
* [x] 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:**

* [ ] Reviewed contribution with `hve-builder` and addressed all
actionable findings
* [ ] Copilot instructions (`.github/instructions/*.instructions.md`)
* [ ] 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/`)

**Other:**

* [ ] Script/automation (`.ps1`, `.sh`, `.py`)
* [x] Other: marketplace package membership and component maturity

## Sample Prompts (for AI Artifact Contributions)

**User Request:**

"Help me build an evaluation dataset for our retrieval-augmented support
assistant."

**Execution Flow:**

1. `data-workstream-coach` matches the request to the `evaluation` job
in the job registry.
2. The registry routes the job to `ds-evaluation-design`.
3. The skill runs its interview protocol to establish the system
boundary, failure modes, and success criteria.
4. It applies the category distribution and per-category floor to size
the dataset, then selects metrics against the declared failure modes.
5. It emits the dataset contract and supporting documents, recording
provenance for every pair.

**Output Artifacts:**

An evaluation dataset contract from
`templates/evaluation-dataset-contract.md`, covering system boundary,
category distribution, metric selection with rationale, provenance, and
review disposition.

**Success Indicators:**

The contract meets the 30-pair floor, every category satisfies its
floor, each selected metric ties to a declared failure mode, and every
pair carries provenance.

## Testing

Local validation on the merged branch:

* `npm run lint:marketplace` — pass
* `npm run lint:plugin-output` — pass
* `npm run validate:skills` — pass
* `npm run lint:frontmatter` — pass
* `npm run lint:md` — pass
* `npm run lint:yaml` — pass
* `npm run lint:json` — pass
* `npm run lint:asset-docs` — pass

Diff hygiene:

* No date-only Markdown changes at any level. Staged (125 modified
Markdown files), unstaged, and the full PR diff against `main` (35
modified Markdown files) each report zero date-only diffs.
* `docs/reference/` pages are regenerated through `npm run
docs:generate`; generated regions are not hand-edited.

CI-owned lanes are deferred to this PR's checks rather than run locally:
the eval lint lanes (`vally`, schema, text, safety), stimulus presence,
changed-artifact execution, and content moderation.

## Checklist

### Required Checks

* [x] Documentation is updated (if applicable)
* [x] Files follow existing naming conventions
* [ ] Changes are backwards compatible (if applicable) (No: five Data
Science agents are intentionally removed)
* [x] Tests added for new functionality (if applicable)

### AI Artifact Contributions

* [ ] Used `hve-builder` review mode to review contribution
* [ ] 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` (Targeted
checks were run individually; the aggregate was not accepted as final
evidence)
* [ ] Documentation validation (if docs changed): `npm run
validate:docs` (Docusaurus installation not current in this working
tree)
* [ ] Spell checking: `npm run spell-check` (Introduced findings were
fixed; the repository-wide run has pre-existing failures from other
in-flight work)
* [ ] Link validation: `npm run lint:md-links` (Not accepted as final
aggregate evidence)

## Security Considerations

* [x] This PR does not contain any sensitive or NDA information
* [ ] Any new dependencies have been reviewed for security issues (N/A:
no dependency added)
* [x] Security-related scripts follow the principle of least privilege

## Additional Notes

* This branch merges current `origin/main`, including the
immutable-snapshot packaging migration from microsoft#2577. The `collections/`
and `plugins/` trees deleted by that migration were accepted as deleted;
package membership for this change lives solely in
`.github/plugin/marketplace.json`.
* Three open PRs touch adjacent surfaces and may need ordering against
this one: microsoft#2578 (eval guide consolidation, which documents the retired
`eval-dataset-creator`), microsoft#2602 (collection topology), and microsoft#2599
(artifact portability).
* Post-implementation review recorded a conformant outcome with zero
defects and three low-severity observations, none blocking.

---------

Co-authored-by: Jamie Kim <jamiekim500@gmail.com>
…s-voiceover, and mural (microsoft#2687)

# Pull Request

## Description


Remediates CVEs found in transitive dependencies across three skills:
• powerpoint:  Pillow  (unbound) resolved to vulnerable 12.2.0
(CVE-2026-54058/54059/54060/55379/55798/59199/59205); pinned to
 >=12.3.0,<13.0 .
• tts-voiceover: same  Pillow  CVEs (transitive via  python-pptx ), plus
 cryptography@49.0.0  (CVE-2026-69247, Bleichenbacher oracle in PKCS7
decrypt, transitive via  azure-identity / msal / pyjwt[crypto] ); both
pinned ( Pillow>=12.3.0,<13.0 ,  cryptography>=50.0.0,<51.0 ).
• mural: same  cryptography@49.0.0  CVE-2026-69247, transitive via
 keyring → secretstorage  on Linux; pinned to
 cryptography>=50.0.0,<51.0 .
All three pins follow the repo's existing bounded/reviewed pattern
(matching  powerpoint 's  pymupdf  pin), with quarterly-review-policy
comments. Also normalized  Pillow → pillow  casing in  pyproject.toml 
to match PEP 503-normalized lockfile naming.

## Related Issue(s)

Related to microsoft#2517

This does **not** close microsoft#2517: the Scorecard finding also lists
`GHSA-5p2g-fcmc-qvqq` / `GHSA-w3rx-r6r6-pgpr` (`image-size@2.0.2`,
transitively pulled in via `@docusaurus/core`), which has **no upstream
fix published yet** (latest `image-size` release on npm is still
`2.0.2`, and the advisory-recommended `2.0.3` was never published —
confirmed via web search). That vulnerability is already tracked
separately in microsoft#2283 and remains open until `image-size` ships a patched
release.

## Type of Change

Select all that apply:

**Code & Documentation:**

* [ ] Bug fix (non-breaking change fixing an issue)
* [ ] New feature (non-breaking change adding functionality)
* [ ] Breaking change (fix or feature causing existing functionality to
change)
* [ ] Documentation update

**Infrastructure & Configuration:**

* [ ] GitHub Actions workflow
* [ ] Linting configuration (markdown, PowerShell, etc.)
* [ ] Security configuration
* [ ] DevContainer configuration
* [x] Dependency update

**AI Artifacts:**

* [ ] Reviewed contribution with `hve-builder` and addressed all
actionable findings
* [ ] Copilot instructions (`.github/instructions/*.instructions.md`)
* [ ] Copilot prompt (`.github/prompts/*.prompt.md`)
* [ ] Copilot agent (`.github/agents/*.agent.md`)
* [ ] Copilot skill (`.github/skills/*/SKILL.md`)
* [ ] Copilot hook (`.github/hooks/*/*.json`)
* [ ] Eval spec added/updated for changed AI artifacts (`evals/`)

**Other:**

* [ ] Script/automation (`.ps1`, `.sh`, `.py`)
* [ ] Other (please describe):

## Testing

* `uvx pip-audit` in both `powerpoint` and `tts-voiceover` skills now
reports **"No known vulnerabilities found"** (previously 7 high-severity
findings each for Pillow).
* `uv run pytest -q`: `powerpoint` — 800 passed, 2 skipped;
`tts-voiceover` — 40 passed. No regressions from the Pillow bump.
* `npm run validate:skills`: all 62 skills pass with 0 errors/warnings.
* Manually ran both skills' real `scripts/embed_audio.py` CLIs
end-to-end against freshly generated `.pptx`/`.wav` fixtures (exercising
the actual `PIL.Image` code path used to synthesize the embedded
audio-icon PNG). Both succeeded, confirmed `PIL.__version__ == 12.3.0`
in each skill's venv, and verified the output decks contain valid
embedded MEDIA shapes.
* Confirmed via `git stash` that an unrelated pre-existing `ValueError`
in `tts-voiceover/scripts/generate_voiceover.py --help` (argparse
`%`-formatting bug in help text) exists on `main` prior to this change
and is out of scope here.
*
mural
•  uvx pip-audit  (via  uv export --format requirements-txt ): 0 known
vulnerabilities.
•  uv run pytest -q : 804 passed, 121 skipped.
•  uv lock --check : lockfile in sync with  pyproject.toml .
•  npm run validate:skills : mural passes (62/62 overall).
• Runtime smoke test: imported  cryptography ,  keyring , and
 scripts.mural._credentials  to confirm the
 keyring → secretstorage → cryptography  chain loads correctly at
 cryptography==50.0.0 .

## Checklist

### Required Checks

* [x] Documentation is updated (if applicable) — N/A, no documentation
changes required
* [x] Files follow existing naming conventions
* [x] Changes are backwards compatible (if applicable)
* [x] Tests added for new functionality (if applicable) — N/A,
dependency version bump only; existing test suites re-validated

### AI Artifact Contributions

* [ ] Used `hve-builder` review mode to review contribution
* [ ] Addressed all actionable findings from the `hve-builder` review
* [ ] Verified contribution follows common standards and type-specific
requirements

### Required Local Checks

* [x] Local validation aggregate: `npm run validate:local` — not run in
full (dependency-only change scoped to two skills); ran targeted
equivalents instead (`uv run pytest`, `uvx pip-audit`, `npm run
validate:skills`) covering the changed files
* [ ] Documentation validation (if docs changed): `npm run
validate:docs`
* [ ] 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
* [x] Any new dependencies have been reviewed for security issues —
Pillow 12.3.0 is the latest published release and fixes all 7 CVEs
present in 12.2.0
* [x] Security-related scripts follow the principle of least privilege

## Additional Notes

Scope was limited to the two skills flagged by Scorecard/OSV as
depending on vulnerable Pillow. The remaining `image-size` finding under
the same Scorecard alert (microsoft#2517) is unrelated to Pillow, has no
available upstream fix, and is tracked separately in microsoft#2283 — so microsoft#2517
should stay open until that is resolved.

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Bill Berry <WilliamBerryiii@users.noreply.github.com>
…ng CI (microsoft#2702)

# Pull Request

## Description

`docs/docusaurus` transitively depended on `nanoid@3.3.17` (via
`postcss`), which is vulnerable to
[GHSA-2v37-7h3g-55p8](GHSA-2v37-7h3g-55p8):
`customAlphabet`/`customRandom` loop indefinitely when given `size=0`,
causing a denial-of-service. This advisory was failing PR CI pipelines.

Added a `nanoid: 3.3.18` entry to the existing `overrides` block in
`docs/docusaurus/package.json` (same pattern as other pinned overrides)
and regenerated `package-lock.json`.

## Related Issue(s)

Fixes microsoft#2701

## Type of Change

Select all that apply:

**Code & Documentation:**

* [x] Bug fix (non-breaking change fixing an issue)
* [ ] New feature (non-breaking change adding functionality)
* [ ] Breaking change (fix or feature causing existing functionality to
change)
* [ ] Documentation update

**Infrastructure & Configuration:**

* [ ] GitHub Actions workflow
* [ ] Linting configuration (markdown, PowerShell, etc.)
* [ ] Security configuration
* [x] DevContainer configuration
* [x] Dependency update

**AI Artifacts:**

* [ ] Reviewed contribution with `hve-builder` and addressed all
actionable findings
* [ ] Copilot instructions (`.github/instructions/*.instructions.md`)
* [ ] Copilot prompt (`.github/prompts/*.prompt.md`)
* [ ] Copilot agent (`.github/agents/*.agent.md`)
* [ ] Copilot skill (`.github/skills/*/SKILL.md`)
* [ ] Copilot hook (`.github/hooks/*/*.json`)
* [ ] Eval spec added/updated for changed AI artifacts (`evals/`)

**Other:**

* [ ] Script/automation (`.ps1`, `.sh`, `.py`)
* [ ] Other (please describe):

## Testing

* `cd docs/docusaurus && npm install` - lockfile regenerated, nanoid
resolved to 3.3.18
* `npm run docs:test` - 10 test suites, 101 tests, all passed
* `npm run docs:build` - production build completed successfully
* `npm audit` (in `docs/docusaurus`) - GHSA-2v37-7h3g-55p8 no longer
reported (17 unrelated pre-existing `@docusaurus/*` advisories remain,
out of scope)

## Checklist

### Required Checks

* [x] Documentation is updated (if applicable)
* [x] Files follow existing naming conventions
* [x] Changes are backwards compatible (if applicable)
* [ ] Tests added for new functionality (if applicable)

### Required Local Checks

* [x] Local validation aggregate: `npm run validate:local`
* [x] Documentation validation (if docs changed): `npm run
validate:docs`
* [ ] 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
* [x] Any new dependencies have been reviewed for security issues
* [x] Security-related scripts follow the principle of least privilege

## Additional Notes

Patch-level bump only (3.3.17 -> 3.3.18), no breaking changes expected
or observed.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…microsoft#2685)

# Pull Request

## Description

Fixes `npm run lint:dependency-pinning` (and 10 sibling npm scripts)
intermittently failing on Windows PowerShell hosts due to fragile `pwsh
-NoProfile -Command "& '...'"` quoting. The nested single/double quotes
in the `-Command` payload can be mis-parsed by the host shell (`cmd.exe`
on Windows), causing the script to abort mid-execution even though the
underlying `.ps1` logic reports 100% compliance when invoked directly.

Converted all affected npm scripts to the `pwsh -NoProfile -File ...`
invocation form, which avoids the nested-quoting layer entirely and
matches the convention already used by the majority of `pwsh` scripts in
`package.json`. No `.ps1` script logic was changed — only the shell
invocation shape.

Left `clean:logs` and `ci:eval:agent:changed` on `-Command`, since both
use pipelines/dynamic expressions that aren't expressible as a single
`-File` script call.

Also updated one documentation example (`scripts/linting/README.md`)
that quoted the old `-Command` invocation verbatim for
`lint:ai-artifacts`.

## Related Issue(s)

Fixes microsoft#1489

## Type of Change

Select all that apply:

**Code & Documentation:**

* [x] Bug fix (non-breaking change fixing an issue)
* [ ] 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
* [x] Linting configuration (markdown, PowerShell, etc.)
* [ ] Security configuration
* [ ] DevContainer configuration
* [ ] Dependency update

**AI Artifacts:**

* [ ] Reviewed contribution with `hve-builder` and addressed all
actionable findings
* [ ] Copilot instructions (`.github/instructions/*.instructions.md`)
* [ ] Copilot prompt (`.github/prompts/*.prompt.md`)
* [ ] Copilot agent (`.github/agents/*.agent.md`)
* [ ] Copilot skill (`.github/skills/*/SKILL.md`)
* [ ] Copilot hook (`.github/hooks/*/*.json`)
* [ ] 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:**

* [ ] Script/automation (`.ps1`, `.sh`, `.py`)
* [ ] Other (please describe):

## Sample Prompts (for AI Artifact Contributions)

<!-- Not applicable: no AI artifacts (.instructions.md, .prompt.md,
.agent.md, SKILL.md) were changed in this PR. -->

## Testing

* `npm run lint:dependency-pinning` — exit 0, 100% compliance (675
dependencies, 0 unpinned).
* Ran each of the 11 modified npm scripts individually — all exit 0 with
expected output:
`lint:links`, `lint:frontmatter`, `lint:version-consistency`,
`lint:permissions`, `lint:dangerous-workflow`,
`lint:dependency-pinning`, `lint:pr-gate`, `lint:ai-artifacts`,
`validate:devcontainer-lockfile`, `validate:skills`,
`validate:ai-artifacts`.
* Ran all 11 scripts chained together in `validate:local`'s order — exit
0, no regressions.
* `npm run lint:tables` — passes after the README.md edit (table
formatting intact).
* Verified `package.json` remains valid JSON (`node -e
"JSON.parse(...)"`).
* Confirmed CI workflows invoke the underlying `.ps1` scripts directly
via parameter splatting (not through this npm `-Command` wrapper), so
this change has no effect on CI and only affects local `npm run`
invocations.
* Root cause not reproducible on this Linux devcontainer (pwsh 7.6.4
exits 0 under both `-Command` and `-File`); the reported failure is
specific to Windows PowerShell hosts per the issue. The `-File` fix was
validated by direct invocation working correctly both here and as
documented by the issue reporter.

## Checklist

### Required Checks

* [x] Documentation is updated (if applicable)
* [x] Files follow existing naming conventions
* [x] Changes are backwards compatible (if applicable)
* [ ] Tests added for new functionality (if applicable) (N/A —
invocation-shape fix only, no new script logic to test)

### AI Artifact Contributions
<!-- Not applicable: no AI artifacts changed in this PR. -->

### Required Local Checks

The following local-safe validation commands must pass before merging:

* [x] Local validation aggregate: `npm run validate:local` (ran the 11
modified scripts individually and chained; full aggregate also exercised
`lint:ps`/`lint:md` unaffected by this change)
* [ ] Documentation validation (if docs changed): `npm run
validate:docs`
* [ ] 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
* [x] Any new dependencies have been reviewed for security issues (N/A —
no dependency changes)
* [x] Security-related scripts follow the principle of least privilege
(invocation shape only; script logic and permissions unchanged)

## Additional Notes

Three remediation options were proposed in the issue. This PR implements
Option 1 (preferred): switch to `-File`. Option 2 (diagnose the
`-Command` host defect) was not pursued because it requires a Windows
PowerShell host to reproduce and the root cause lives at the
shell-invocation layer rather than in script logic. Option 3 (append `;
exit $LASTEXITCODE`) was rejected per the issue's own guidance that it
masks the symptom, and likely wouldn't help regardless since the
reporter's log shows the process aborting mid-script rather than
completing with a discarded exit code.

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Bill Berry <WilliamBerryiii@users.noreply.github.com>
Co-authored-by: Jamie Kim <jamiekim500@gmail.com>
microsoft#2668)

# Pull Request

## Description


Fixes the devcontainer's `UV_DEFAULT_INDEX` default so it matches uv's
own canonical index spelling, restoring `uv sync --locked` for the
moderation eval restore. Codespaces supplies the canonical PyPI URL with
a trailing slash, while the committed lock records it without one. `uv
sync --locked` treats those equivalent index spellings as different lock
inputs and aborts container creation. The resulting `onCreateCommand`
failure sends both new Codespaces and rebuilt Codespaces into recovery
mode.

**Root cause:** `.devcontainer/Dockerfile` was setting a default of
`https://pypi.org/simple/` (trailing slash) for `UV_DEFAULT_INDEX`.
Every committed `uv.lock` in the repo (moderation eval and all 12
`.github/skills/*` skills) records the registry as
`https://pypi.org/simple` (no trailing slash) — which is uv's own
built-in default when no index env var is set at all. Confirmed
directly:
unset both index env vars -> uv's own built-in default
$ env -u UV_DEFAULT_INDEX -u PIP_INDEX_URL uv lock --dry-run
No lockfile changes detected with the Dockerfile's old default (trailing
slash) -> reproduces the failure
$ env UV_DEFAULT_INDEX="https://pypi.org/simple/" uv sync --locked
--dry-run
The lockfile at `uv.lock` needs to be updated, but `--locked` was
provided.

with the trailing slash removed -> --locked succeeds
$ env UV_DEFAULT_INDEX="https://pypi.org/simple" uv sync --locked
--dry-run
Would make no changes
​

So the mismatch was self-inflicted by this repo's own devcontainer
default, not an inherent Codespaces/PyPI behavior.


## Related Issue(s)

Fixes microsoft#2665

## Type of Change

**Code & Documentation:**

* [x] Bug fix (non-breaking change fixing an issue)
* [ ] New feature (non-breaking change adding functionality)
* [ ] Breaking change (fix or feature causing existing functionality to
change)
* [ ] Documentation update

**Infrastructure & Configuration:**

* [ ] GitHub Actions workflow
* [ ] Linting configuration (markdown, PowerShell, etc.)
* [ ] Security configuration
* [x] DevContainer configuration
* [ ] Dependency update

**AI Artifacts:**

* [ ] Reviewed contribution with `hve-builder` and addressed all
actionable findings
* [ ] Copilot instructions (`.github/instructions/*.instructions.md`)
* [ ] Copilot prompt (`.github/prompts/*.prompt.md`)
* [ ] Copilot agent (`.github/agents/*.agent.md`)
* [ ] Copilot skill (`.github/skills/*/SKILL.md`)
* [ ] Copilot hook (`.github/hooks/*/*.json`)
* [ ] Eval spec added/updated for changed AI artifacts (`evals/`)

**Other:**

* [x] Script/automation (`.ps1`, `.sh`, `.py`)
* [ ] Other (please describe):

## Testing

* Rebuilt the Codespace and confirmed `onCreateCommand` completed in the
normal Ubuntu container instead of recovery mode.
* Ran `uv sync --frozen` and imported the moderation runtime
dependencies.
* Verified the lockfile checksum remained unchanged during the frozen
restore.
* Ran the moderation test suite: 10 tests passed.
* Ran canonical `uv sync --locked --dry-run` with an index-clean
environment.
* Confirmed a deliberately drifted manifest is still rejected by locked
validation.
* Ran `npm run validate:local`.
* Ran `npm run spell-check`.
* Ran `npm run lint:md-links`.
* Ran `npm run lint:public-dependency-feeds`.

## 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

* [ ] Used `hve-builder` review mode to review contribution
* [ ] Addressed all actionable findings from the `hve-builder` review
* [ ] Verified contribution follows common standards and type-specific
requirements

### Required Local Checks

The following local-safe validation commands must pass before merging:

* [x] Local validation aggregate: `npm run validate:local`
* [ ] Documentation validation (if docs changed): `npm run
validate:docs`
* [x] Spell checking: `npm run spell-check`
* [x] 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
* [ ] Security-related scripts follow the principle of least privilege

## Additional Notes

Other approaches investigated:

* Switching to --frozen instead of --locked, but would remove safeguards
provided by --locked checking for stale
* Regenerating the moderation lockfile under the Codespaces index
setting changed only PyPI source URLs by adding a trailing slash. It did
not change resolved dependencies and would move the mismatch to
environments using the non-trailing-slash spelling.
* Regenerating with the exact pinned `uv 0.10.8` and Python 3.11
toolchain did not produce a dependency-resolution change.
* Testing a newer uv release still reproduced the index URL identity
mismatch under `--locked`.
* Keeping `--locked` for canonical CI validation continues to detect
genuine manifest drift, while `--frozen` makes dev-container startup a
non-mutating restore operation.

This is the smallest validated fix found so far. Alternative fixes that
preserve deterministic restores without depending on index URL spelling
are welcome.

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Bill Berry <WilliamBerryiii@users.noreply.github.com>
Co-authored-by: Bill Berry <wberry@microsoft.com>
…microsoft#2684)

# Pull Request

## Description

Adds GitHub Copilot CLI (`copilot`) to the DevContainer **Default Tool
Stack** section of `docs/customization/environment.md`. This tool was
added to the DevContainer via the
`ghcr.io/devcontainers/features/copilot-cli:1` feature in commit
`10e7fd1` (PR microsoft#2673) and `.devcontainer/README.md` was updated at that
time, but `docs/customization/environment.md` was not, leaving it stale.

## Related Issue(s)

Fixes microsoft#2683

## Type of Change

**Code & Documentation:**

* [x] Documentation update

## Testing

* `npm run validate:docs` — passed (10 suites, 101 tests)
* `npm run spell-check` — 0 issues found

## Checklist

### Required Checks

* [x] Documentation is updated (if applicable)
* [x] Files follow existing naming conventions
* [x] Changes are backwards compatible (if applicable)
* [ ] Tests added for new functionality (if applicable) — N/A, docs-only
change

### AI Artifact Contributions

Not applicable — this change only edits prose documentation
(`docs/customization/environment.md`), not an instruction, prompt,
agent, skill, or hook artifact, so `hve-builder` review was not run.

### Required Local Checks

* [x] Documentation validation (if docs changed): `npm run
validate:docs`
* [x] Spell checking: `npm run spell-check`
* [ ] Local validation aggregate: `npm run validate:local` — not run
(full-repo aggregate out of scope for this docs-only single-line change)
* [ ] Link validation: `npm run lint:md-links` — not run (full-repo scan
out of scope; no links were added or modified in this change)

## Security Considerations

* [x] This PR does not contain any sensitive or NDA information
* [x] Any new dependencies have been reviewed for security issues — N/A
* [x] Security-related scripts follow the principle of least privilege —
N/A

## Additional Notes

Single-line addition, mirroring the existing `.devcontainer/README.md`
entry for consistency.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Jamie Kim <jamiekim500@gmail.com>
Co-authored-by: Bill Berry <WilliamBerryiii@users.noreply.github.com>
… with 4 updates (microsoft#2695)

Bumps the npm-dependencies group with 1 update in the / directory:
@microsoft/vally-cli.
Bumps the npm-dependencies group with 3 updates in the /docs/docusaurus
directory:
[@happy-dom/jest-environment](https://github.com/capricorn86/happy-dom),
[@testing-library/jest-dom](https://github.com/testing-library/jest-dom)
and
[@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser).

Updates `@microsoft/vally-cli` from 0.11.0 to 0.13.0

Updates `@happy-dom/jest-environment` from 20.11.1 to 20.11.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/capricorn86/happy-dom/releases">@​happy-dom/jest-environment's
releases</a>.</em></p>
<blockquote>
<h2>v20.11.2</h2>
<h3>:construction_worker_man: Patch fixes</h3>
<ul>
<li>MutationObserver callback being GC'd due to orphaned WeakRef - By
<strong><a
href="https://github.com/mixelburg"><code>@​mixelburg</code></a></strong>
in task <a
href="https://redirect.github.com/capricorn86/happy-dom/issues/2264">#2264</a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/capricorn86/happy-dom/commit/576a8bcf8cc7857428955ec14bebb768855eaf95"><code>576a8bc</code></a>
fix: <a
href="https://redirect.github.com/capricorn86/happy-dom/issues/2264">#2264</a>
MutationObserver callback being GC'd due to orphaned WeakRef (<a
href="https://redirect.github.com/capricorn86/happy-dom/issues/2">#2</a>...</li>
<li><a
href="https://github.com/capricorn86/happy-dom/commit/084afd6773bedc99903e04a693b69b7eb375dec6"><code>084afd6</code></a>
chore: <a
href="https://redirect.github.com/capricorn86/happy-dom/issues/2251">#2251</a>
Updates the contribution guidelines (<a
href="https://redirect.github.com/capricorn86/happy-dom/issues/2252">#2252</a>)</li>
<li>See full diff in <a
href="https://github.com/capricorn86/happy-dom/compare/v20.11.1...v20.11.2">compare
view</a></li>
</ul>
</details>
<br />

Updates `@testing-library/jest-dom` from 7.0.0 to 7.0.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/testing-library/jest-dom/releases">@​testing-library/jest-dom's
releases</a>.</em></p>
<blockquote>
<h2>v7.0.1</h2>
<h2><a
href="https://github.com/testing-library/jest-dom/compare/v7.0.0...v7.0.1">7.0.1</a>
(2026-08-09)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>declare vitest as an optional peer dependency (<a
href="https://redirect.github.com/testing-library/jest-dom/issues/733">#733</a>)
(<a
href="https://github.com/testing-library/jest-dom/commit/3782c78b3dc9824675afe0cb8f1722f8c96f494d">3782c78</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/testing-library/jest-dom/commit/3782c78b3dc9824675afe0cb8f1722f8c96f494d"><code>3782c78</code></a>
fix: declare vitest as an optional peer dependency (<a
href="https://redirect.github.com/testing-library/jest-dom/issues/733">#733</a>)</li>
<li>See full diff in <a
href="https://github.com/testing-library/jest-dom/compare/v7.0.0...v7.0.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `@typescript-eslint/parser` from 8.65.0 to 8.66.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/releases">@​typescript-eslint/parser's
releases</a>.</em></p>
<blockquote>
<h2>v8.66.0</h2>
<h2>8.66.0 (2026-08-03)</h2>
<h3>🚀 Features</h3>
<ul>
<li><strong>typescript-estree:</strong> handle import.defer() as
ImportExpression (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12609">#12609</a>)</li>
</ul>
<h3>🩹 Fixes</h3>
<ul>
<li><strong>eslint-plugin:</strong> [no-unnecessary-type-conversion]
ignore shadowed built-ins (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12590">#12590</a>)</li>
<li><strong>eslint-plugin:</strong> [prefer-nullish-coalescing] handle
shadowed Boolean calls (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12591">#12591</a>)</li>
<li><strong>eslint-plugin:</strong> [no-useless-default-assignment]
don't report defaults used by other overloads (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12607">#12607</a>)</li>
<li><strong>eslint-plugin:</strong> [no-unnecessary-type-parameters]
check MappedType key remapping (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12588">#12588</a>)</li>
<li><strong>eslint-plugin:</strong> [class-literal-property-style]
preserve type annotations and don't drop decorators (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12617">#12617</a>)</li>
<li><strong>website:</strong> list
<code>onUnsupportedTypeScriptVersion</code> in parser options (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12585">#12585</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Evyatar Daud <a
href="https://github.com/StyleShit"><code>@​StyleShit</code></a></li>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
<li>Steffen Schroeder</li>
<li>송재욱</li>
</ul>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.66.0">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md">@​typescript-eslint/parser's
changelog</a>.</em></p>
<blockquote>
<h2>8.66.0 (2026-08-03)</h2>
<p>This was a version bump only for parser to align it with other
projects, there were no code changes.</p>
<p>See <a
href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.66.0">GitHub
Releases</a> for more information.</p>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/typescript-eslint/typescript-eslint/commit/e51b11ba3ab31837762c675f62f0d4dcb1abc4fb"><code>e51b11b</code></a>
chore(release): publish 8.66.0</li>
<li>See full diff in <a
href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.66.0/packages/parser">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Jamie Kim <jamiekim500@gmail.com>
Co-authored-by: Bill Berry <WilliamBerryiii@users.noreply.github.com>
…bility (microsoft#2674)

# Pull Request

## Description

Convert `model:` frontmatter from a YAML array to a scalar string in 5
subagent files so they load correctly under the Copilot CLI. VS Code
Copilot Chat accepts a `model` array for fallback, but the Copilot CLI's
frontmatter parser rejects it (`model: Expected string, received array`)
and silently drops the agent, making it unavailable. Tracked upstream in
[github/copilot-cli#2133](github/copilot-cli#2133).

Following review feedback (jkim323), this PR now also:

* Closes the validation gap that let array-form `model` regress silently
on `.agent.md` files.
* Reconciles the hve-builder governing docs, which previously mandated
an ordered three-model fallback array for all artifacts, with the new
scalar-only rule for agents/subagents (prompts keep the ordered fallback
list).
* Runs the affected artifacts through `hve-builder` review mode and
resolves all findings.

## Related Issue(s)

Fixes microsoft#2066

## Type of Change

**Code & Documentation:**

* [x] Bug fix (non-breaking change fixing an issue)
* [ ] New feature (non-breaking change adding functionality)
* [ ] Breaking change (fix or feature causing existing functionality to
change)
* [x] Documentation update

**Infrastructure & Configuration:**

* [x] Linting configuration (markdown, PowerShell, etc.)
* [ ] GitHub Actions workflow
* [ ] Security configuration
* [ ] DevContainer configuration
* [ ] Dependency update

**AI Artifacts:**

* [x] Reviewed contribution with `hve-builder` and addressed all
actionable findings
* [ ] Copilot instructions (`.github/instructions/*.instructions.md`)
* [x] Copilot agent (`.github/agents/*.agent.md`)
* [ ] Copilot prompt (`.github/prompts/*.prompt.md`)
* [ ] Copilot skill (`.github/skills/*/SKILL.md`)
* [ ] Copilot hook (`.github/hooks/*/*.json`)
* [ ] Eval spec added/updated for changed AI artifacts (`evals/`)

**Other:**

* [ ] Script/automation (`.ps1`, `.sh`, `.py`)
* [ ] Other (please describe):

## Testing

**Validation gap fix** (schema + validator + tests):

* `scripts/linting/schemas/agent-frontmatter.schema.json`: `model` is
now `type: string` only for `.agent.md`.
* `scripts/linting/Test-ModelReferences.ps1`: added
`Test-ModelValueIsArray`; array-form `model` on `.agent.md` now fails
validation. `.prompt.md` array behavior is unchanged.
* `scripts/tests/linting/Test-ModelReferences.Tests.ps1`: added coverage
for the new agent-only restriction; existing array-model fixtures moved
to `.prompt.md` context where the array form is still valid.

**Governing docs reconciled**: `hve-builder.instructions.md`,
`requirements-catalog.md`, `artifact-types.md`, `review-rubric.md` now
state agents/subagents use a single canonical scalar per responsibility
profile (High = `Claude Opus 5 (copilot)`, Medium = `GPT-5.6 Terra
(copilot)`, Low = `GPT-5.6 Luna (copilot)`), while prompts may still use
the ordered three-model fallback list.

**hve-builder review mode**: ran a static review across all 11 changed
files (5 agent files + 4 governing docs + 2 contributor-facing docs).
Findings: `codebase-profiler.agent.md` and `report-generator.agent.md`
were pinned to a non-canonical Low-tier model that didn't match their
actual (Medium) responsibility — corrected to `GPT-5.6 Terra (copilot)`.
`docs/contributing/custom-agents.md` and
`docs/customization/custom-agents.md` had stale model/description
contract language — rewritten. All findings resolved and
closure-verified; final verdict Pass. Evidence:
`.copilot-tracking/hve-builder/2026-08-12/subagent-model-scalar-review-1.md`.

**Manual reproduction against the real Copilot CLI (v1.0.79)**:
extracted the pre-fix array-model `codebase-profiler.agent.md` into an
isolated `.github/agents/` directory and ran `copilot --agent "Codebase
Profiler"` with debug logging — reproduced the exact reported failure
(`custom agent markdown frontmatter is malformed: model: Expected
string, received array`, agent absent from the available list). Re-ran
with the post-fix scalar file — agent loaded and responded normally with
no parse error.

**Automated checks**:

* `npm run lint:frontmatter` — 861/861 pass
* `npm run lint:models` — 19/19 valid
* `npm run lint:tables` — clean after `npm run format:tables`
* `npx markdownlint-cli2` on all changed markdown files — 0 issues
* `npm run test:ps -- -TestPath "scripts/tests/linting/"` — 1142/1142
pass

## 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

* [ ] Local validation aggregate: `npm run validate:local` (not run in
full; ran targeted equivalents scoped to changed files instead —
frontmatter, models, markdown lint, table format, and the linting Pester
suite all pass; see Testing section)
* [x] Documentation validation (if docs changed): markdown lint clean on
all changed docs
* [ ] Spell checking: `npm run spell-check` (not run)
* [ ] Link validation: not run; no new links introduced in this diff

## Security Considerations

* [x] This PR does not contain any sensitive or NDA information
* [x] Any new dependencies have been reviewed for security issues
* [x] Security-related scripts follow the principle of least privilege

## Additional Notes

Addresses all three points of reviewer feedback from jkim323: validation
gap, governing-docs conflict, and hve-builder review-mode pass.

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Bill Berry <WilliamBerryiii@users.noreply.github.com>
## Description

Hardened the HVE Core installer across its remaining file, command,
manifest, and source trust boundaries while preserving Bash and
PowerShell parity.

### Installer scripts

* Excluded `.git`, `.env` variants, `.DS_Store`, and `Thumbs.db` from
copied and tracked skill files in both component-copy implementations.
* Preserved newline-containing filenames in Bash by carrying component
file plans through NUL-delimited temporary files.
* Restricted extension validation to the `code` and `code-insiders`
command names before execution.
* Replaced the PowerShell ejection manifest through a same-directory
temporary file and cleaned up temporary files after successful and
failed operations.

### Installation guidance

* Added an upstream `origin` check for mounted and multi-root source
clones before collision detection or copying.
* Documented accepted Microsoft HVE-Core HTTPS and SSH forms and
required explicit confirmation when the origin is missing or unexpected,
allowing intentional forks and local clones to continue.

### Regression coverage

* Added focused coverage for copy exclusions, newline-containing
filenames, CLI rejection before execution, temporary-file cleanup,
failed manifest writes, and failed manifest replacement.

## Related Issue(s)

Fixes microsoft#2663

## Type of Change

Select all that apply:

**Code & Documentation:**

* [x] Bug fix (non-breaking change fixing an issue)
* [ ] New feature (non-breaking change adding functionality)
* [ ] Breaking change (fix or feature causing existing functionality to
change)
* [ ] Documentation update

**Infrastructure & Configuration:**

* [ ] GitHub Actions workflow
* [ ] Linting configuration (markdown, PowerShell, etc.)
* [ ] Security configuration
* [ ] DevContainer configuration
* [ ] Dependency update

**AI Artifacts:**

* [ ] Reviewed contribution with `hve-builder` and addressed all
actionable findings
* [ ] Copilot instructions (`.github/instructions/*.instructions.md`)
* [ ] Copilot prompt (`.github/prompts/*.prompt.md`)
* [ ] Copilot agent (`.github/agents/*.agent.md`)
* [x] Copilot skill (`.github/skills/*/SKILL.md`)
* [ ] Copilot hook (`.github/hooks/*/*.json`)
* [ ] Eval spec added/updated for changed AI artifacts (`evals/`)

**Other:**

* [x] Script/automation (`.ps1`, `.sh`, `.py`)
* [ ] Other (please describe):

## Sample Prompts (for AI Artifact Contributions)

**User Request:**

Install selected HVE Core components from an existing mounted or
multi-root checkout.

**Execution Flow:**

1. Select installation Method 3 or Method 5 and resolve
`HveCoreBasePath`.
2. Read the source clone's `origin` before collision detection or copy
operations.
3. Continue automatically for expected Microsoft HVE-Core origins, or
warn and request explicit confirmation for a missing or unexpected
origin.
4. Copy selected components with the existing containment,
package-membership, schema, symlink, and collision checks.

**Output Artifacts:**

* Selected HVE Core components in the target workspace or user profile
* Updated `.hve-tracking.json` entries for copied files
* A warning and confirmation prompt when a pre-existing source has no
expected upstream origin

**Success Indicators:**

* Excluded VCS, environment, and OS metadata files are absent from
targets and tracking manifests.
* Supported VS Code command names validate installed extensions;
unsupported values fail before execution.
* Newline-containing filenames remain one copied and tracked file on
supported Unix hosts.
* Interrupted PowerShell manifest updates leave the original manifest
unchanged and no temporary file behind.

## Testing

Implementation validation completed before PR generation:

* Focused component-copy baseline: passed, with 54 tests passed and one
platform-inapplicable test skipped.
* Installer test directory: changed semantic suites passed; the package
run reported 149 passed, one skipped, and one unrelated
environment-fixture failure.
* ShellCheck for changed Bash scripts: passed.
* Repository PowerShell lint: passed.
* Skill structure validation: passed for all 58 skills.
* Documentation generation and drift check: passed with no generated
delta.
* Generated installer reference Markdown lint and editor diagnostics:
passed.
* Final diff checks: passed.

## 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

<!-- If contributing an agent, prompt, instruction, or skill, complete
these checks -->
* [ ] Used `hve-builder` review mode to review contribution
* [ ] Addressed all actionable findings from the `hve-builder` review
* [ ] Verified contribution follows common standards and type-specific
requirements

### Required Local Checks

The following local-safe validation commands must pass before merging:

* [x] 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` (skipped: N/A)

## Security Considerations

* [x] This PR does not contain any sensitive or NDA information
* [ ] Any new dependencies have been reviewed for security issues (N/A -
no dependency changes)
* [ ] Security-related scripts follow the principle of least privilege
(N/A - no `scripts/security/` changes)

## GHCP Artifact Maturity

| File | Type | Maturity | Notes |

|--------------------------------------------------------|-------|----------|------------|
| `.github/skills/installer/hve-core-installer/SKILL.md` | Skill |
stable | All builds |

## Additional Notes

The existing target-root containment implementation was intentionally
left unchanged. The package-level Pester failure came from the unchanged
detect-environment fixture observing the current devcontainer after
clearing only selected marker variables; all changed semantic owners
passed during implementation.

Co-authored-by: Bill Berry <WilliamBerryiii@users.noreply.github.com>
…iews (microsoft#2691)

## Description

Resolves the three tractable findings collected on issue microsoft#2645, which
gathered review findings deferred from PR microsoft#2602. Each turned out to be
smaller than its original framing suggested: the fix text already
existed, or the infrastructure already existed, or the content already
existed and had been deleted.

### 1. The dry-run path had no compliant record target

Three statements in the backlog execution protocol could not all hold at
once. Destination Binding required recording the verified binding in
`handoff-logs.md` before the first mutation. Binding was required to run
in dry run as well, so a simulated run exercises the same rejection
path. And dry-run entries were forbidden from `handoff-logs.md`, because
that file is the resume authority for live runs and must contain no
simulated result. An implementer following the dry-run path had nowhere
compliant to write.

The rule now names two targets explicitly: a live run records in
`handoff-logs.md`, a dry run records in `handoff-dryrun.md`. Both
original intents survive. The ADO and Jira executor contracts each
restated the rule in their own words, so both were updated; the GitHub
executor was confirmed not to restate it and needed no change.

### 2. Generated backlog handoffs carried no human-review gate

`backlog-execute` halts on any unchecked human-review checkbox, and
states explicitly that absence of a gate is not an unchecked gate. The
shared `handoff.md` template created only operation checkboxes, so a
generated handoff passed straight through with nothing to halt on.

The gate infrastructure already existed and is config-driven, so this is
classification work rather than new gate design. The template gained a
`## Human Review` section carrying the canonical AI-content note and an
unchecked checkbox, kept separate from operation checkboxes so the two
are never confused. The `human-facing` tier in `footer-with-review.yml`
gained artifact basename `handoff` and the three backlog tracking-root
scopes.

**Classification alone was not enough, and this is the part most worth a
reviewer's attention.** The validator could not discover a generated
handoff at all. It enumerated only `*.instructions.md`, and its file
walker honored `.gitignore`, which excludes `.copilot-tracking/`
entirely. A direct run against a deliberately non-compliant fixture
reported `Files scanned: 0` and exited green. Discovery in
`Test-AIArtifactValidation` now enumerates markdown recursively, with a
comment explaining that every scan path is caller-supplied. Without that
change the gate would have been configured and would never have fired.

The standing rule that no agent checks a human-review checkbox is
preserved: the template ships the box unchecked, and the validator
checks for presence rather than trusting an assertion.

### 3. A getting-started page promised a migration map that did not
exist

Four package identities were retired with no single table mapping them
to replacements. The mapping had been authored and deleted inside PR
microsoft#2602 and never reached `main`, while `cli-plugins.md` continued to link
to a guide that did not contain it.

`package-migration.md` gained a `## Retired Package Identities` section
covering four retired extension identities, eleven read-only command
replacements, five mutation command replacements, two absorbed commands,
two relocated commands, three relocated skills, seven retired agents,
and three behaviors that got wider under runtime tracker resolution. The
non-obvious two-extension `hve-github` row is preserved and explained,
since its skills split across two packages. The inbound link now targets
the specific section anchor.

## Related Issue(s)

Refs microsoft#2645

This PR does **not** close microsoft#2645. Seven of its ten items remain open by
design: four are genuine design work (audit-record schema, data
governance for tracking artifacts, the triage-to-execution handoff
contract, and idempotency for mutating operations), and three are
pending decisions. The issue body has been updated so items 5, 7, and 9
appear under a branch-scoped Resolved section while the rest stay open
with their original numbering.

## Type of Change

Select all that apply:

**Code & Documentation:**

* [x] Bug fix (non-breaking change fixing an issue)
* [ ] 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:**

* [ ] Reviewed contribution with `hve-builder` and addressed all
actionable findings
* [ ] Copilot instructions (`.github/instructions/*.instructions.md`)
* [ ] 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`)
* [ ] 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:**

> Plan the backlog work for this milestone and give me a dry run before
anything is created.

**Execution Flow:**

1. `backlog-plan` resolves the platform, builds the planning files, and
assembles `handoff.md` from the shared template in
`backlog-management/references/workflows.md`.
2. Assembly now emits a `## Human Review` section with its checkbox
unchecked. The agent never checks it.
3. `backlog-execute` inspects the handoff before processing. The
unchecked checkbox halts it and reports the artifact path and the
specific unchecked item.
4. A human reviews the planned operations and checks the box.
5. On re-run, execution proceeds. Destination Binding hydrates every
target, compares it to the normalized confirmed destination, and rejects
the whole set on any mismatch. It records the verified binding in
`handoff-logs.md` for a live run, or in `handoff-dryrun.md` for a dry
run.

**Output Artifacts:**

`handoff.md` now ends with:

```markdown
## Human Review

This section is the execution gate. It is not an operation checkbox, and execution halts while the box below is unchecked. Only a human may check it.

> **Note** — The author created this content with assistance from AI. All outputs should be reviewed and validated by a qualified human reviewer before use.

> - [ ] Reviewed and validated by a qualified human reviewer
```

**Success Indicators:**

* A freshly generated handoff contains the Human Review section with an
unchecked box.
* `backlog-execute` refuses to process that handoff and names the
unchecked item.
* Running the validator against the containing tracking directory
reports a failure before the box is added and passes after:

  ```powershell
pwsh scripts/linting/Validate-PlannerArtifacts.ps1 -Paths
'.copilot-tracking/github-issues/<scope>' -FailOnMissing
  ```

* A dry run writes its binding record to `handoff-dryrun.md` and leaves
`handoff-logs.md` untouched.

> [!NOTE]
> Human review is recommended for agent-populated Sample Prompts
content.

For detailed contribution requirements, see:

* Common Standards:
[docs/contributing/ai-artifacts-common.md](../docs/contributing/ai-artifacts-common.md)
- Shared standards for XML blocks, markdown quality, RFC 2119,
validation, and testing
* Agents:
[docs/contributing/custom-agents.md](../docs/contributing/custom-agents.md)
- Agent configurations with tools and behavior patterns
* Prompts:
[docs/contributing/prompts.md](../docs/contributing/prompts.md) -
Workflow-specific guidance with template variables
* Instructions:
[docs/contributing/instructions.md](../docs/contributing/instructions.md)
- Technology-specific standards with glob patterns
* Skills: [docs/contributing/skills.md](../docs/contributing/skills.md)
- Task execution utilities with cross-platform scripts

## Testing

### Automated validation

| Check | Result |
|-------|--------|
| `npm run test:ps -- -TestPath
"scripts/tests/linting/Validate-PlannerArtifacts.Tests.ps1"` | Passed.
42 tests, 0 failed, up from 36 before this change. |
| `npm run validate:local` | Exited 1 at `lint:md-links` on a file not
in this PR. See note below. |
| `npm run spell-check` | Passed. 807 files, 0 issues. |
| `npm run lint:md-links` | Every link in this PR's changed files
resolved. |
| `npm run docs:generate:check` | Passed, exit 0. |
| `npm run lint:ai-artifacts` | Passed. 63 files, 0 issues. |

The `validate:local` failure is a transient network fault, not a defect.
All four external links in
`.github/skills/project-planning/requirements-author/references/prd/product-discovery.md`
reported `Status: 0`, which is a connection failure rather than a 404.
One of them, the Creative Commons license URL, had succeeded moments
earlier in a different file within the same run. All four return `200`
on retry. That file is not part of this PR.

Every other stage of the aggregate passed: plugin output, tables,
markdown, PowerShell analyzer, YAML, and JSON.

### Test coverage added

A new `Describe 'Backlog handoff classification'` block in
`Validate-PlannerArtifacts.Tests.ps1` runs against the **real repository
footer config** rather than a synthetic fixture, so the shipped
classification is what gets proven. Four `It` blocks yield six executed
cases:

* Three scope-classification cases, one per backlog tracking root,
asserting the `human-facing` tier and the required
`human-review-checkbox` footer.
* A missing-checkbox case asserting failure.
* A present-checkbox case asserting a clean pass.
* An end-to-end discovery case proving a suffix-less `handoff.md` is
found at all, which is the regression that would otherwise silently
return.

### Diff-based assessment

* No public API or behavior surface removed; template and config changes
are additive.
* All paths referenced in changed content resolve, including the new
`#retired-package-identities` anchor.
* Every changed file maps to a bullet in the commit message.
* Marketplace maturity confirmed `stable` for all three changed AI
artifact sources via `Get-MarketplaceSourceMaturity`.

### Manual testing

Not performed. Validation was automated plus diff-based assessment.

## 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
<!-- If contributing an agent, prompt, instruction, or skill, complete
these checks -->
* [ ] Used `hve-builder` review mode to review contribution
* [ ] Addressed all actionable findings from the `hve-builder` review
* [ ] 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` (failed on a
transient external-link fault in a file outside this PR; all other
stages passed)
* [ ] Documentation validation (if docs changed): `npm run
validate:docs`
* [x] Spell checking: `npm run spell-check`
* [x] Link validation: `npm run lint:md-links` (every link in this PR's
changed files resolved)

## Security Considerations
<!-- ⚠️ WARNING: Do not commit sensitive information such as API keys,
passwords, or personal data -->
* [x] This PR does not contain any sensitive or NDA information
* [ ] Any new dependencies have been reviewed for security issues (N/A —
no dependency changes in this PR)
* [ ] Security-related scripts follow the principle of least privilege
(N/A — no files under `scripts/security/` were modified)

## GHCP Artifact Maturity

| File                                | Type  | Maturity | Notes      |
|-------------------------------------|-------|----------|------------|
| `ado-backlog-executor.agent.md`     | Agent | ✅ stable | All builds |
| `jira-backlog-executor.agent.md`    | Agent | ✅ stable | All builds |
| `backlog-management` (skill)        | Skill | ✅ stable | All builds |

No non-stable artifacts are included.

## Additional Notes

### Two things a reviewer should decide, not merge blindly

**The new gate applies to dry runs too.** `backlog-execute` halts on any
unchecked review checkbox before processing a handoff, and the template
now always emits one. A dry run is exactly what someone would reach for
to inspect a handoff *before* approving it, so preview now requires the
approval first. That may well be intended, since the gate is
deliberately unconditional and an agent must never check the box. It is
called out here because the planning artifacts do not record that the
interaction was considered. Exempting dry run would be a
`backlog-execute` contract change and belongs in its own change.

**No automated lane ever scans a generated handoff.**
`.copilot-tracking/` is gitignored, so no handoff is ever committed for
CI to see, and `lint:ai-artifacts` defaults to `.github/instructions`.
The classification, the discovery fix, and the tests are all correct,
but practical enforcement rests on the `backlog-execute` halt rule at
execution time rather than on CI. Worth knowing before treating "the
validator enforces it" as CI coverage. A committed template-shaped
fixture would be the only way to close that gap.

### Scope notes

* The "Copilot skill" box is checked because this materially changes
`backlog-management` behavior, though the edits are in the skill-owned
`references/workflows.md` rather than `SKILL.md` itself.
* The validator discovery change widens enumeration and no longer honors
`.gitignore` for caller-supplied paths. This is deliberate and
commented, since the artifacts it must reach live under an ignored
directory. It is worth knowing if a future caller ever points `-Paths`
at a repository root.
* Generated reference pages under `docs/reference/` are intentionally
untouched. The two changed executor agents carry no agent body text in
their generated pages, so regeneration produced only an `ms.date`
frontmatter bump across all 230 pages. That churn is unrelated to this
work and was reverted; `npm run docs:generate:check` exits 0.
…urity-planning (microsoft#2574)

Adds deterministic Microsoft Threat Modeling Tool (`.tm7`) generation
and a native validation harness to the `security-planning` skill, so a
threat model authored as a declarative spec becomes a model TMT can
open, laid out legibly, without hand-building diagrams.

The skill previously produced threat-model content as prose. It could
not emit a `.tm7` that opens cleanly, lays out readably, and can be
validated without a human driving the tool by hand.

What lands:

* **Generation.** `generate_tm7.py` builds a `.tm7` from a YAML spec:
one diagram surface per scope, trust-boundary rectangles containing
their nodes, and data flows between them. `generate_markdown.py` renders
the same spec as a markdown report. `generate_tb7.py` emits a template.
* **Layout.** Text-aware node sizing, gutter spacing scaled to node
size, and containment-preserving placement so nodes stay inside their
owning trust boundary. Output is deterministic under input reordering:
GUIDs derive from stable spec identifiers rather than randomness, and
members serialize in canonical order.
* **Validation harness.** `validate_tm7_with_tmt.py` drives native TMT
through UI Automation, captures per-surface geometry metrics and
pane-scoped screenshots, and writes a redacted evidence bundle with a
schema-versioned manifest. Windows-only and opt-in; portable generation
does not require TMT.
* **Layout overlay.** A schema for reproducible manual layout
adjustments, guarded by three fingerprints (spec, generator profile,
surface identity) so a stale overlay is rejected rather than silently
replayed onto a changed model. Overlays are always emitted
`approval_state: pending`; no runtime path promotes them to approved.
* **Threat-model spec under version control.**
`docs/planning/threat-models/hve-core-comprehensive.yaml` is hve-core's
own spec, previously living only in gitignored working state. Generated
`.tm7` and markdown outputs are build artifacts and are deliberately not
committed.

Agent and instruction changes route the capability: the security planner
and reviewer gain a TM7 workflow requiring explicit human confirmation
before a generated model is treated as authored, plus an operator
hands-off contract that stops and waits for confirmation before the UI
automation run takes over mouse and keyboard. `identity.instructions.md`
establishes the spec as source of truth with markdown rendered from it,
so the model is edited at the spec and re-rendered rather than edited in
the rendered artifact.

Closes microsoft#2567

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.)
* [x] Security configuration
* [ ] DevContainer configuration
* [x] Dependency update

**AI Artifacts:**

* [ ] Reviewed contribution with `hve-builder` and addressed all
actionable findings
* [x] Copilot instructions (`.github/instructions/*.instructions.md`)
* [ ] 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):

**User Request:**

> Generate a TM7 threat model from our threat-model spec.

**Execution Flow:**

1. The security planner loads the `security-planning` skill and reads
`references/tm7-generation.md` for the input schema and generation
modes.
2. The agent presents the input spec and asks the user to confirm scope
and generation mode before running anything.
3. `generate_tm7.py` reads the spec, resolves a template profile, builds
the model, and applies layout: nodes sized to their text, placed inside
their owning trust boundary, spaced by a gutter proportional to node
size.
4. The agent presents the generated model for explicit human
confirmation. A generated model is never treated as authored or final
without it.
5. If the user requests native validation and is on Windows with the
pinned TMT version, the agent states the operator hands-off contract,
waits for explicit confirmation that the desktop is clear, then runs the
harness and reports the evidence bundle location. The harness emits
notices but does not itself block, so this gate lives in agent behavior.

**Output Artifacts:**

A `.tm7` file (Microsoft `SerializableModelData` DataContract XML).
First lines of a generated model:

```xml
<?xml version='1.0' encoding='utf-8'?>
<ThreatModel xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/ThreatModeling.Model">
  <DrawingSurfaceList>
    <DrawingSurfaceModel>
      <Header>System context and trust boundaries</Header>
```

A native harness run additionally produces an evidence bundle:

```text
<evidence-dir>/
  manifest.json          schema-versioned run metadata and per-surface metrics
  status.json            exit state and last successful action
  action.log             redacted human-auditable action trail
  screenshots/           pane-scoped renders, one per surface
  uia/                   UI Automation traces
  iterations/00-baseline through iterations/03
  overlay.json           approval_state: pending
```

**Success Indicators:**

The model opens in TMT without template-upgrade or repair prompts. Nodes
render inside their trust boundaries. Regenerating from an unchanged
spec produces byte-identical output. The harness exits 0 with
`automated-ready-pending-human` and `gate_failure_count: 0`.

* `uv run pytest tests/test_generate_tm7.py` — 185 tests, zero failures.
Covers containment (nodes stay inside their owning zone), determinism
under input reordering, node overlap, rank ordering, and lane separation
across 8 layout archetypes.
* Six further pytest modules cover template generation, threat
population, the threat DataContract, visual-feedback geometry and
convergence, and the TMT harness. Full suite: 517 passed.
* `Deserialize-Tm7.ps1` checks generated models against TMT assemblies
for round-trip fidelity.
* `fuzz_harness.py` provides an Atheris polyglot entry point for OSSF
Scorecard fuzzing.
* Native harness executed end to end against TMT 7.3.51110.1 on Windows:
exit code 0, zero gate failures, per-surface metrics and screenshots
captured across 8 surfaces.
* `uv run ruff check .` and `uv run ruff format --check .` — both clean
across 14 files, matching the commands the owning CI lane runs.

* [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)

* [ ] Used `hve-builder` review mode to review contribution
* [ ] Addressed all actionable findings from the `hve-builder` review
* [x] Verified contribution follows common standards and type-specific
requirements

The following local-safe validation commands must pass before merging:

* [ ] Local validation aggregate: `npm run validate:local`
* [ ] Documentation validation (if docs changed): `npm run
validate:docs`
* [ ] Spell checking: `npm run spell-check`
* [ ] Link validation: `npm run lint:md-links`

* [x] This PR does not contain any sensitive or NDA information
* [x] Any new dependencies have been reviewed for security issues
* [x] Security-related scripts follow the principle of least privilege

This PR adds an executable runtime to a skill that previously shipped
only reference material, so the security surface is new. `SECURITY.md`
in the skill carries the full STRIDE model over three trust buckets (TMT
process automation and UI Automation, local screenshots and evidence,
overlay manifest and path handling) with risk ratings and ten open
enterprise-readiness gaps.

Observed properties of the runtime:

* No network egress. The runtime opens no sockets and imports no HTTP
client. `urllib.parse` is imported for `urlsplit`/`urlunsplit`, used to
strip credential-bearing query strings during evidence redaction; it
performs no I/O.
* XML parsing rejects `<!DOCTYPE` and `<!ENTITY` before parse and routes
every reader through one hardened `defusedxml` boundary, closing the XXE
path on specs, models, and templates.
* Untrusted input is parsed with `yaml.safe_load` and `json.load` only.
No `eval`, `exec`, `pickle`, or dynamic import.
* The single subprocess launch targets a version-validated executable
whose Authenticode signature must carry the accepted publisher CN, with
stdout and stderr discarded.
* Evidence paths are confined to the evidence directory, and
sensitive-key and sensitive-value redaction is applied to every
persisted text sink.
* Screenshot capture is refused unless the host can isolate a single
native window; where it cannot, no screenshot is written and a run
requiring complete evidence fails closed. Captured pixels are never
redacted and are not represented as such.
* Overlays are emitted `approval_state: pending` and are never
auto-promoted, so visual scores stay advisory rather than becoming
silent approval.

Dependencies added: `pyyaml==6.0.3` and `defusedxml==0.7.1` at runtime;
`pytest`, `pytest-cov`, `ruff`, and `pillow` for development; `atheris`
isolated in a `fuzz` group because macOS wheels are unavailable;
`pywinauto` in a Windows-only group for UI Automation. `uv.lock` is
committed so Dependabot resolves through the `.github/skills/**` glob.
`THIRD-PARTY-NOTICES` records MIT attribution for the bundled Microsoft
threat-modeling templates and for the tm7-cli sample fixture.

**The committed threat-model spec is marked DRAFT and has not had human
security review.** `docs/planning/threat-models/README.md` states this
explicitly so neither the spec nor anything generated from it is
mistaken for a reviewed artifact.

**Generated models are intentionally not committed.** A `.tm7` for this
repository is roughly 1.8 MB of XML, and any layout change rewrites
geometry across every surface, so committing outputs would produce large
unreviewable diffs on one-line source changes. The spec is the versioned
source; `README.md` documents the regeneration command.

**The native harness is Windows-only and opt-in.** It requires TMT
7.3.51110.1 and takes exclusive control of mouse and keyboard for the
duration of a run. Generation and markdown rendering are portable and
require neither.

Known open items are tracked in the skill's `SECURITY.md` rather than
left implicit. The ones most worth a reviewer's attention:
`Bundle.path()` does not reject `..` components, which is unreachable
from current callers because they all pass hardcoded relative paths but
could be reintroduced by a refactor; evidence bundles carry no integrity
signature, so post-run tampering is not detectable without a comparison
run; and the pinned TMT version is a module constant, so a tool upgrade
requires a code change or the diagnostic override.

Two markdown link-check failures appear in `npm run validate:local` and
are pre-existing on `main`, in files this PR does not touch:
`https://www.omg.org/spec/DMN/1.4/` (HTTP 522) in `requirements-author`
and `https://dev.azure.com` (unreachable) in `extension/PACKAGING.md`.
Verified by reproducing both on a clean checkout of `origin/main`.

---------

Co-authored-by: Jamie Kim <jamiekim500@gmail.com>
Lee Yee Shian (yeeshian) and others added 26 commits August 16, 2026 22:03
- Modify partner workshop setup instructions and dates
- Add context pack, requirements, experience, architecture, backlog, and publication readiness documents for FSI
- Introduce context pack for Retail scenario
- Ensure all documents are structured for collaborative workshop use

📚 - Generated by Copilot
- Introduce a detailed workshop agenda for the partner workshop setup
- Update the partner workshop documentation to clarify access and approval processes
- Expand the architecture draft for the FSI relationship manager with MVP details
- Create a publication readiness draft outlining key requirements and user experience
- Add a traceability matrix draft linking requirements to architecture and backlog items

📚 - Generated by Copilot
- replace "capstone" with "solution" in multiple instances
- add new solution guide for integrating role outputs
- refine participant flow steps for better guidance

📚 - Generated by Copilot
- correct link text for role exercises
- enhance phrasing for better understanding
- ensure consistency in document references

🔗 - Generated by Copilot
…r clarity and structure

- Enhance formatting for better readability
- Add bullet points for key features and requirements
- Clarify roles and responsibilities in the publication checklist
- Improve traceability matrix for better alignment with user needs

📄 - Generated by Copilot
- add detailed setup instructions for GitHub Codespaces and local VS Code
- include workshop agenda and role exercise guidelines
- refine requirements, architecture, backlog, and publication readiness drafts

📚 - Generated by Copilot
… documents

- standardize titles and descriptions across multiple documents
- remove draft indicators for clarity
- ensure consistency in terminology

✍️ - Generated by Copilot
… setup instructions

- change ms.date to 2026-08-17
- enhance table formatting for better readability
- consolidate note and tip sections for clarity

🔧 - Generated by Copilot
…arity

- rename HVE Core section for consistency
- enhance onboarding instructions for Microsoft Partner Workshop
- remove redundant headings in context pack samples

📚 - Generated by Copilot
- update HVE Core description for better understanding
- correct phrasing in publication readiness checklist
- enhance clarity in context pack retail document

🔍 - Generated by Copilot
- add sidebar position to README
- remove redundant header from README
- improve table formatting in publication readiness document

📝 - Generated by Copilot
- revise README and partner workshop files to enhance readability
- standardize workshop agenda format across multiple documents
- add new implementation guide and role tracks documentation
- update publication readiness section for better guidance

📚 - Generated by Copilot
@yeeshian
Lee Yee Shian (yeeshian) requested a review from a team as a code owner August 19, 2026 10:51
@yeeshian

Copy link
Copy Markdown
Author

Discard pull request, this was incorrectly intended for my local

@codecov-commenter

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 83.22%. Comparing base (1d7de1c) to head (94ed173).
⚠️ Report is 5 commits behind head on main.

Additional details and impacted files

Impacted file tree graph

@@           Coverage Diff           @@
##             main    #2735   +/-   ##
=======================================
  Coverage   83.22%   83.22%           
=======================================
  Files         180      180           
  Lines       32310    32310           
  Branches       25       25           
=======================================
  Hits        26889    26889           
  Misses       5418     5418           
  Partials        3        3           
Flag Coverage Δ
docusaurus 89.92% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

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.

9 participants