Skip to content

Make ask_user extensible, skill-aware, and repository-governed #347751

Open

Description

Support repository-defined ambiguity resolution and approval workflows

Summary

Allow repositories to customize, extend, or replace the default ask_user experience with repository-defined Skills and approval protocols.

Repositories can already influence how work is performed through instructions and Skills. The same should be possible for how ambiguity is resolved, approvals are obtained, and human-AI decisions are made.

Background

I have been using a custom ambiguity-resolution protocol since before ask_user existed.

Over time that protocol evolved into a repository Skill called
gated-alignment. It has served as the primary human-in-the-loop workflow
for AI-assisted changes and has required very little evolution over time.

The protocol was designed around a simple observation: ambiguity resolution
is not just about collecting an answer from the operator. It is an
opportunity for the AI and the human to develop a shared understanding of
the problem before deciding how to proceed.

When ambiguity is encountered, the Skill requires the model to present:

  • multiple viable options
  • rationale for each option
  • trade-offs
  • expected impacts
  • a recommendation

This gives the operator a much better understanding of what is actually
being decided and what alternatives exist.

More importantly, it also improves the quality of the model's reasoning.
To present meaningful options, trade-offs, impacts, and recommendations,
the model must explore the solution space and develop a broader
understanding of the problem before asking for a decision.

In practice, some of the most valuable discoveries emerge during that
exploration process. Risks, assumptions, design alternatives, maintenance
concerns, and implementation constraints frequently surface before any
decision is made. Many of those insights would likely remain undiscovered
in a simple task-focused execution flow.

Because this protocol already exists and depends on these behaviors, the
Skill explicitly instructs Copilot not to use ask_user as the decision
gate itself.

The issue is therefore not that ask_user exists. The issue is that
repositories currently have no way to declare that they already have a
governance protocol for ambiguity resolution and approval workflows, or to
allow that protocol to drive the interaction experience.

Problem

Today, ambiguity resolution is effectively controlled by a generic platform workflow.

This works well for simple confirmations, but becomes limiting when repositories define their own governance protocols for:

  • ambiguity resolution
  • architectural decisions
  • human-in-the-loop approvals
  • edit authorization
  • change review workflows

Repository-defined protocols can conflict with the built-in ask_user experience, especially when decisions require specific sequencing, rationale, or approval semantics.

Examples of issues include:

  • Multiple unresolved approval requests being queued simultaneously.
  • Generic approval prompts replacing repository-defined decision workflows.
  • Loss of protocol-specific requirements such as "one active decision at a time".
  • Inability to distinguish decision approval from edit authorization.
  • Repository Skills having no control over how approval UX is presented.

Proposal

1. Allow repositories to disable automatic ask_user

Provide a repository-level option to manage ambiguity resolution through repository-defined Skills and instructions.

2. Allow Skills to register as ambiguity resolvers

A repository should be able to designate one or more Skills that handle ambiguity resolution and approval workflows.

When ambiguity is detected, Copilot should invoke the configured resolver instead of falling back to the generic experience.

3. Make ask_user skill-aware

Allow Skills to define interaction requirements such as:

  • single active decision gate
  • chat-first interaction
  • option-based decisions (A/B/C/D)
  • multi-stage approvals
  • explicit edit-plan approval
  • decision documentation requirements

The platform should preserve these requirements rather than reducing them to a generic confirmation prompt.

4. Allow custom approval UX

Skills should be able to influence how decisions are presented and resolved.

The default ask_user experience should remain available, but repositories should not be limited to it.

5. Separate decision state from execution state

Decision workflows and queued edit operations should be managed independently.

Resolving ambiguity should not require discarding pending edits, and pending edits should not create ambiguity about which decision is being approved.

These workflows are increasingly repository-specific. The platform should allow repositories to define their own ambiguity-resolution and approval contracts instead of forcing all workflows through a generic interaction model.

Example: Repository-defined ambiguity resolver

The repository below defines a custom ambiguity-resolution Skill.

---
name: gated-alignment
description: "Conduct gated alignment one decision at a time: present viable options, trade-offs and recommendations, resolve human decisions, and obtain separate edit-plan approval. Use when: invoked by repository ambiguity instructions or explicitly requested."
argument-hint: "Describe the ambiguity or decision that needs resolution"
---

# Gated Alignment Skill

Structured protocol for resolving one ambiguity at a time with the human
operator before continuing work.

## Applicability

Follow the repository's
[ambiguity instructions](../../instructions/.ambiguity.instructions.md)
for invocation policy. This skill defines the alignment protocol, not an
independent set of applicability rules.

## Chat-First Interaction

Present the complete gate in the chat: context, question, lettered options,
trade-offs and recommendation. The operator can reply directly in chat with
an option letter, an adjustment, a question or other free text. Do not require
a form submission or special response syntax.

Do not use `ask_user`, `vscode_askQuestions` or another picker/form as the gate
itself or as the required response channel. An optional `ask_user` control may
offer only the already-explained A/B/C/D choices as a selection convenience;
the complete gate must still be visible in chat. Do not put adjustment or
question collection in that control, or make it a prerequisite for continuing
the conversation. Declining, dismissing or not using it is not acceptance.

Handle adjustments, follow-up questions and edit-plan discussion through
typed chat replies.

## Protocol

### Step 1 — Frame the Decision Gate

Present exactly one decision at a time using this structure:

Decision gate: <short decision title>
Question: ❓ <single concrete question>

Option A — <label>

- Why: <why this option is relevant now>
- ✅ Pro: <at least one>
- ⚠️ Con: <at least one>
- 📈 Impact: <speed / risk / maintenance effect>

Option B — <label>

- Why: ...
- ✅ Pro: ...
- ⚠️ Con: ...
- 📈 Impact: ...

(Optional Option C / D — same structure)

⭐ Recommendation: <option + one sentence justification>
Default if no response yet: <option or "none — explicit choice required">
Reply in chat with A/B/C/D, an adjustment, or a question.

### Step 2 — Wait for Resolution

Do not continue implementation or document finalization until the gate is
resolved.

### Step 3 — Handle Response

Follow the repository's
[Read-Only and Edit Authorization policy](../../instructions/.authorization.instructions.md).
Gate acceptance resolves a decision; edit-plan approval is handled in Step 4.

| User response                         | Agent action                                     |
| ------------------------------------- | ------------------------------------------------ |
| Option letter (e.g. `A`)              | Record decision, close gate, continue to Step 4. |
| `accept: <option>`                    | Record decision, close gate, continue to Step 4. |
| Adjustment, with or without `other:`  | Refine options, re-present the same gate.        |
| Question, with or without `question:` | Answer in chat, then re-present the gate.        |
| Free-text with clear acceptance       | Record acceptance of the matching option.        |
| Unclear or noncommittal reply         | Clarify in chat; keep the same gate open.        |

Accept letters case-insensitively. A proposed adjustment is not acceptance of
an existing option; confirm the revised choice before closing the gate.
Silence or a displayed default does not resolve a pending gate.

### Step 4 — Summarize Decisions and Obtain Edit-Plan Approval

If multiple ambiguities exist, resolve them one gate at a time. After all
relevant gates are resolved:

1. Summarize accepted decisions in a compact checklist.
2. If file changes are proposed, present an edit plan identifying the files,
   intended changes, scope boundaries, and verification steps.
3. Invite the operator to comment on the plan or approve it for editing. Revise
   the plan in response to feedback and resolve any new material ambiguity.
4. Wait for explicit approval of the edit plan before editing. Acceptance of
   earlier gates is not edit-plan approval. Implement only the approved scope;
   obtain approval before expanding it.

If no file changes are proposed, state that no edits are needed and conclude
with the decision summary.

## Rules

1. Ask exactly one decision question at a time.
2. Provide 2–4 mutually exclusive options, labeled `A | B | C | D`.
3. Each option must include rationale, at least one pro, at least one con,
   and delivery impact.
4. Include one explicit recommendation grounded in repository context,
   existing code, instruction files, and available artifacts.
5. State the default action (or "none — explicit choice required") for
   low-risk cases.
6. Prioritize readability: clear headings, short bullets, visual separation.
7. Keep the complete gate in chat and accept typed replies. Forms/pickers must
   not replace the gate; optional `ask_user` use is limited to selection of
   already-explained options as described above.

This workflow depends on protocol guarantees that the current generic ask_user experience cannot express, including:

  • single active decision gate
  • chat-first interaction
  • separation of decision approval and edit authorization
  • prohibition of parallel unresolved ambiguities
  • structured multi-stage approval flows

The proposal would allow Skills such as this to define and drive the ambiguity-resolution experience instead of being forced into a generic approval workflow.

Such workflows are difficult to implement reliably when the platform can independently inject generic approval prompts and queue multiple unresolved requests.

Expected outcome

Repositories should be able to define not only how AI performs work, but also how AI and humans make decisions together.

Instructions and Skills already allow repositories to govern execution. This proposal extends the same principle to ambiguity resolution, approvals, and human-in-the-loop decision making.

This would enable repository-governed ambiguity resolution, approval workflows, and human-in-the-loop controls while preserving the default experience for repositories that do not require additional governance.

Metadata

Metadata

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions