Skip to content

πŸ›πŸ§‘β€πŸ’» - Improve diagnostics and recovery for unsupported PR configuration schemasΒ #635

Closed

Description

@efraespada

Is there an existing issue for this?

  • I have searched the existing issues.

Which actions are affected?

Pull Request (durable configuration loading and the final error boundary)

Which platforms are affected?

Linux (observed; the schema-validation path is platform-independent)

Description

When a PR contains an old Copilot configuration block without schemaVersion: 3, rejecting that state is correct. The defect is that the action reports a generic workflow failure and misleading retry advice instead of explaining the unsupported configuration and a safe recovery path.

Observed output:

Unable to read issue configuration.
GitHub Action execution failed.
Error code: workflow.failed
Retryable: Yes

The underlying error is Unsupported configuration schema. Expected 3.. In ConfigurationHandler.get, a configuration.invalid error is logged, but the original exception is rethrown. The outer Action boundary consequently falls back to workflow.failed, whose default retryability is true. Rerunning the unchanged PR cannot resolve this deterministic validation failure.

The consumer PR has a hidden copilot-configuration block containing the JSON below. Its HTML comment delimiters are omitted here because the current reader would otherwise interpret this fenced example as this issue’s own stored configuration.

{
    "branchType": "feature"
}

The missing schema version is the cause. The absence of a v3 issue-managed branch is not, by itself, an error: the same unlinked PR initializes successfully with no configuration block.

Required behavior

  1. Continue rejecting present blocks with missing, malformed, old, or future/unsupported schema values. Keep the workflow/check failed until the configuration is deliberately corrected; do not migrate, infer a version, silently discard state, or convert rejection into a successful skip.
  2. Preserve a typed configuration.invalid failure, retryable: false, and its correlation identity through the final Action boundary. Describe retryability as requiring configuration correction before another run can help.
  3. In the failure annotation and Job Summary, identify the affected PR, distinguish a missing version from an unsupported or malformed version using bounded safe facts, state the expected version, explain the impact, and link to recovery documentation.
  4. Give two explicit recovery branches: for a verified unmanaged PR with only an obsolete marker and no managed operation/state to retain, a maintainer may preserve the original body in history/a copy, remove only that obsolete block, and rerun; if the block may contain managed branch, release, hotfix, or orchestration state, stop and require maintainer review and verified restoration of supported state. Never recommend blindly adding schemaVersion: 3, deleting unknown managed state, or an automatic reset.
  5. Leave the PR body and configuration untouched on validation failure. Preserve supported current-schema and absent-block behavior. Keep provider read/authorization failures distinguishable from schema validation failures.

Representative failure content

PR automation could not continue because its stored configuration is unsupported.
Cause: The configuration block has no schema version; version 3 is required.
Action: Review the PR configuration using the linked recovery guide. Remove an
obsolete block only after confirming that no managed state needs to be retained.
Retained state: The PR body and stored configuration were not changed.
Error code: configuration.invalid
Retryable without correcting configuration: No
Reference: <correlation ID>

Use existing error presentation and locale/fallback rules (including English and Spanish); keep the primary action readable in a narrow GitHub view. Raw JSON, arbitrary schema text, provider exceptions, tokens, and stack traces must not be rendered. No additional issue/PR comments or notification stream is required.

Reproducing the issue

  1. Use a same-repository PR whose body contains the exact block above; the observed PR is codex/integrity-audit β†’ develop, without an associated issue.
  2. Run the generated Copilot - Pull Request workflow using vypdev/copilot@v3 by pushing a commit.
  3. Observe the generic workflow.failed / Retryable: Yes output instead of an actionable configuration failure.
  4. Rerun without changing the block: the failure remains.

Reproduction run Β· Consumer PR #144 Β· Repository setup commit

copilot Version

v3, resolved in the reproduction run to f7f68e699a7f7cea46e0da62388ec1a643908ae9.

Relevant Log Output

Event: pull_request, actor: efraespada, repo: vypdev/zstandard, debug: true
βœ… No previous runs active. Continuing...
Unable to read issue configuration.
GitHub Action execution failed.
Impact: The workflow could not complete the requested operation.
Error code: workflow.failed
Retryable: Yes
Reference: 96fa4661-ff8e-4420-a9c7-8f2c512d16e4

Additional context and comments

Verification already performed

Local reproduction through the real configuration reader and execution-setup workflow, with provider I/O replaced by deterministic fakes:

Same unlinked PR, different body Observed result
No configuration block Configured successfully
Exact legacy block above Rejected: expected schema 3
Current-schema block Configured successfully
Explicit schema 2 Rejected: expected schema 3
Malformed JSON Rejected

The two existing configuration-handler and execution-setup test suites also pass: 21 tests. These controls establish the cause; they do not establish that a manually version-tagged block is safe managed state.

Implementation boundaries and documentation

Keep validation in the configuration reader, propagate the existing semantic error contract through orchestration, and render reviewed recovery content through the existing presentation/localization boundary. Do not expose raw exception prose or broaden provider permissions. No new public setting, compatibility parser, schema bump, migration path, or automatic state mutation is in scope.

Update the owning execution/error SDD and catalog evidence together with tests and the configuration, error-reference, and troubleshooting documentation when implementing. Recovery documentation must distinguish absence of a block, an obsolete unmanaged marker, and potentially valuable managed state. Schema rejection remains a fixed invariant.

References:

Acceptance and verification budget

Minimum 15 distinct deterministic cases, with no double counting:

Area Cases Required evidence
Payload/routing 6 No block; missing schema; old schema; future schema; malformed JSON; valid current schema
Error propagation/provider mapping 3 Semantic code/retryability/correlation survive to the Action boundary; authorization failure retains its category; transient provider failure retains its category
Presentation/security 4 English output; Spanish output/fallback; malicious or oversized schema/body text is not echoed; managed-state recovery guidance forbids blind deletion/version edits
Recovery/replay 2 Unchanged invalid state fails again without writes; verified obsolete-marker removal lets an unlinked PR configure without fabricated issue linkage

Acceptance: unsupported-state cases remain failed and non-retryable without correction, with the expected schema and a concrete recovery action visible; supported/absent-state cases retain their existing behavior. Tests must assert structured semantics and absence of writes, not only snapshots. Preserve repository coverage thresholds and existing architecture/error-redaction guards; run focused tests, type checking, documentation checks, and specification validation for the implementation. Record one narrow GitHub annotation/Job Summary review with a working recovery link. Pending/completed presentation follows existing behavior; partial mutation, new workflows/setup, and cancellation machinery are outside this early validation change.

This issue replaces the original compatibility/migration expectation with a diagnostic and recovery improvement. Rejection of old configurations is intentional and must remain.

Activity

  1. added
    bugSomething isn't working
    bugfixSomething isn't working
    priority: highCritical issue, needs immediate attention.
    on Oct 21, 2026
  2. changed the title [-]Pull Request action fails on existing PR after v3 setup[/-] [+]Improve diagnostics and recovery for unsupported PR configuration schemas[/+] on Oct 21, 2026
  3. added theissue type on Oct 21, 2026
  4. moved this to Todo in vypdevon Oct 21, 2026
  5. moved this from Todo to In Progress in vypdevon Oct 21, 2026
  6. added
    branchedIndicates that a branch has been created for this issue.
    on Oct 21, 2026
  7. changed the title [-]Improve diagnostics and recovery for unsupported PR configuration schemas[/-] [+]πŸ›πŸ§‘β€πŸ’» - Improve diagnostics and recovery for unsupported PR configuration schemas[/+] on Oct 21, 2026
  8. added
    state:workingWork can proceed on the verified branch or without a branch.
    on Oct 21, 2026
  9. vypbot commented on Oct 21, 2026

    @vypbot
    Contributor

    Implementation plan

    Current status: Ready to start. No action is required from maintainers before implementation.

    1. Preserve the schema rejection contract
      • Keep `requireCurrentConfigurationPayload` strict for missing, malformed, old, and future schema versions; leave absent-block behavior unchanged.
      • Map validation failures to typed `configuration.invalid` errors while preserving retryability and correlation identity through orchestration and the Action boundary.
    2. Add safe, actionable failure presentation
      • Use the existing presentation and localization boundary to identify the PR, distinguish missing from unsupported or malformed versions using bounded facts, state the expected version and impact, and link to recovery guidance.
      • Provide English and Spanish content with the existing fallback rules; do not render raw JSON, arbitrary schema text, provider exceptions, tokens, or stack traces.
    3. Document guarded recovery paths
      • Update the execution/error SDD and catalog evidence, plus configuration, error-reference, and troubleshooting documentation.
      • For verified obsolete unmanaged markers, allow preserving the original body before removing only the marker; require maintainer review and verified restoration when managed state may exist. Never recommend blind version edits, deletion, or automatic reset.
    4. Add deterministic regression coverage
      • Cover payload routing, typed error propagation and provider categories, localized and redacted presentation, and recovery/replay behavior.
      • Assert failed status and no writes for invalid state, unchanged supported and absent-block behavior, and successful configuration after verified obsolete-marker removal.
    5. Review the rendered GitHub failure
      • Check the annotation and Job Summary in a narrow view with a working recovery link; confirm the PR body and configuration remain untouched on validation failure.
      • Run focused tests, type checking, documentation checks, and specification validation while preserving coverage thresholds and existing architecture and redaction guards.

    Acceptance: A missing, malformed, old, or future schema remains a failed, non-retryable `configuration.invalid` result with its correlation identity preserved; the annotation and Job Summary state that version 3 is expected and give safe, localized recovery guidance without exposing raw configuration, and invalid-state handling performs no writes. Current-schema and absent-block cases retain their existing behavior.

    Need something else? Mention the bot with a question or use /copilot help.

  10. 1 remaining item

  11. added
    size: XXLIndicates an extremely large task or issue that requires significant time and effort to complete.
    90%Progress: 90%
    and removed on Oct 21, 2026
  12. vypbot commented on Oct 21, 2026

    @vypbot
    Contributor

    Issue closed β€” historical progress

    Current status: closed as completed.

    The last estimate is retained below as history. Closure does not certify a new percentage, tests, or branch alignment.

    Action required: none for this closed issue. If work continues, reopen the issue; a fresh assessment can update this same card.

    Last assessment before closure (historical)

    Progress: 90% β€” in progress

    > Current status: The comparison shows the core implementation, localized diagnostics, guarded recovery guidance, regression coverage, and requested documentation/spec updates. The supplied evidence does not establish that tests, type checks, documentation validation, generated artifacts, or the required GitHub annotation and Job Summary review succeeded.

    Next: Run the required validation and narrow GitHub presentation review; confirm generated catalog/build artifacts are current.

  13. vypbot commented on Oct 21, 2026

    @vypbot
    Contributor

    Issue closed: synchronization recommendation retired

    No branch synchronization is required for this closed issue.

    The previous recommendation is historical. Issue closure does not certify that the branches are synchronized.

  14. vypbot commented on Oct 21, 2026

    @vypbot
    Contributor

    Branch synchronization needs attention. Open the current status.

  15. vypbot commented on Oct 21, 2026

    @vypbot
    Contributor

    Branch synchronization needs attention. Open the current status.

  16. moved this from In Progress to Done in vypdevon Oct 21, 2026
  17. added
    100%Progress: 100%
    and removed
    in-progressStart work on an admitted issue.
    state:workingWork can proceed on the verified branch or without a branch.
    on Oct 21, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

100%Progress: 100%branchedIndicates that a branch has been created for this issue.bugSomething isn't workingbugfixSomething isn't workingpriority: highCritical issue, needs immediate attention.size: XXLIndicates an extremely large task or issue that requires significant time and effort to complete.

Type

Projects

  • Status
    Done

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions