You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Enhance Markdown artifact review in Wizard and SDD canvases - #29
Enhance Markdown viewing inside the existing Wizard and SDD canvas previews, without introducing another plugin or canvas.
Add a shared GFM reader with a heading outline, responsive TOC drawer, related-artifact selection, local-reference navigation, history, and revision-aware refresh.
Keep reading and navigation separate from workflow execution. Bind reads and clarification controls to the existing canvas workspace, context, artifact, revision, and owning command.
Package the reader and parser independently in both plugins, with dependency notices and source/hash/import-closure verification. Installed plugins do not need reader development dependencies or a sibling checkout.
SDD retains feature targeting, constitution, progress, optional quality gates, new-feature flow, targeted clarification, and artifact deep links.
Regression checks cover conventional template paths, active composition-stack preset overrides, and workflow progress/focus restoration after returning from the reader.
Intentional behavior changes: existing documents are readable while setup or execution is gated; Run/Rerun remains gated. Clarification markers in code examples or HTML comments are inert, and stale reviewed answers require refresh/reconfirmation.
Scope And Review Guide
Reader-only changes for both canvases. No repository browsing/authentication/cloning, preview installers or distribution, generated agent files, historical release records, branding, version bumps, or changes to unrelated plugins/skills/presets.
No upstream files deleted.
94 files total, including 16 generated runtime/copy/notice files and one build lockfile. Generated payloads are marked linguist-generated; canonical implementation remains visible for review.
39 actual-shell browser journeys passed, including responsive layout, navigation, freshness, clarification, focus, and bounded-document performance.
Typecheck, lint, build, package verification, Markdown links, and CI configuration checks passed. Both dependency audits report zero vulnerabilities. No candidate tests skipped.
Untouched upstream-test replay: all 281 Wizard tests passed; 3 of 4 SDD tests passed. The remaining static assertion required hiding feature cards before setup and is intentionally replaced by coverage for readable artifacts with execution still gated.
Native And Hosted Acceptance
Final candidate: 5e3b459a1666ec28a3087f3595ca68e60efc44bc.
Hosted Windows and Linux validation: both jobs passed on this exact candidate. These are fork-hosted checks; upstream PR check runs are not currently attached.
Tested in GitHub Copilot App 1.1.20 on Windows using an owned synthetic repository and real project-local Wizard and SDD providers. Served payloads were hash-verified; normal installed plugins and real projects were not modified.
Both original artifact entry points, rendered revisions/GFM, related-document navigation/history, and return focus passed.
Native compact SDD pointer close and restored focus passed after fixing the reader stacking context. Wizard compact visibility and accessibility dismissal passed; its pointer hit-testing is covered by actual-shell browser tests, not claimed as a completed native pointer check.
Real SDD Analyze ran once through the generated skill: all 146 tracked files remained unchanged, with no additions.
Real targeted SDD clarification ran once with 30 days.: only the synthetic specification changed; 145 other tracked files remained unchanged, with no additions. Its resolved question disappeared.
Wizard draft save/reopen/cancel/back-discard passed without workflow dispatch. All 37 source/configuration files remained unchanged; only expected Wizard control-plane state changed.
Explicit native Refresh recovered evicted contexts in both final canvases, retained the selected document, reset history, and did not rebind discarded/resolved answers.
Native testing found and regression-tested two reader defects: compact drawer stacking and explicit refresh of expired contexts. Recovery revalidates selected-document membership and clears old context bindings; automatic updates do not renew the existing 15-minute expiry. A temporary App WebView loading/focus issue was resolved by reacquiring native controls and opening the preview normally; the final SDD recovery check then passed without another code change.
Limits: actual Windows App acceptance, not native macOS/Linux certification or marketplace-release validation. Raw local evidence and diagnostic captures remain local. PR remains draft; no merge or release performed.
Add one shared reader and independently packaged assets inside the existing canvas preview surfaces. Preserve existing workflows and action contracts, and add scoped reads, revision-bound clarification validation, navigation, and regression coverage. Keep preview distribution and repository discovery outside this change.
The reason will be displayed to describe this comment to others. Learn more.
🔵 Needs a closer look
Relative links can escape the selected review scope, while clarification nesting, polling cost, and incomplete parser type-check coverage also remain unresolved.
Review details
Suppressed comments (4)
Previously missed (3) — in code that hasn't changed since the last review.
Each SDD poll calls signature(), which recursively rediscovers and stats up to 10,000 entries for every retained review context. Contexts remain retained after the reader closes, so the 1.5-second timer can repeatedly perform tens or hundreds of thousands of filesystem operations for up to 15 minutes. Cache/incrementally update the signature or explicitly unregister closed reader contexts instead of rescanning them on every poll. plugins/spec-kit-copilot-wizard/extensions/speckit-wizard-canvas/ui/markdown-reader/src/clarificationParser.ts:24
This check excludes only text whose immediate parent is a link. Markdown such as [**[NEEDS CLARIFICATION: Q?]**](research.md) has an emphasis/strong parent, so it becomes a trusted clarification binding and the renderer can place a button inside a navigable anchor. Exclude text with any link ancestor in both the parser and renderer transform. plugins/spec-kit-copilot-wizard/extensions/speckit-wizard-canvas/ui/markdown-reader/tsconfig.json:20
npm run typecheck does not include the newly added parser Vite configuration, so type errors in that build path are silently skipped even though CI reports the reader configuration as typechecked.
Relative links are read before checking that the normalized target belongs to the current feature/composition scope. A client can POST ../../other-feature/private.md (with a valid source revision) and receive any workspace Markdown file, contradicting the scope boundary. Reject targets outside the scope’s explicit candidates and allowed roots before reading them.
The 1.5-second SDD poll calls discoverCandidates for every still-valid selection, while closing the reader does not remove selections and up to 20 contexts remain valid for 15 minutes. Each discovery can inspect 10,000 entries before this loop increments inspected only for returned Markdown candidates, so repeated opens—or directories containing mostly non-Markdown files—can cause hundreds of thousands of filesystem operations per poll. Deduplicate/cache signatures by scope and retire selections on close/expiry; also account for discovered.inspectedCount rather than only candidate count.
Relative-link resolution reads and registers any Markdown path that normalizes inside the workspace, without checking that it belongs to the current feature/composition scope. For example, a link from specs/001-feature/spec.md to ../002-other/private.md normalizes to a valid path and bypasses the membership boundary. Check the target against the current scope's candidates/roots before readArtifact, and return an inert result when it is outside that scope.
The new parser Vite configuration is omitted from the TypeScript project, so npm run typecheck does not check it despite the validation workflow's typecheck step. Include vite.parser.config.ts alongside the reader config so both build configurations are covered.
Relative links are normalized before authorization, so ../002-other/spec.md from specs/001-fixture/spec.md becomes specs/002-other/spec.md, passes path validation, and is read even though it is outside the current feature/composition scope. Revalidate the normalized target against the context's candidates or allowed roots before reading and registering it; the synchronized SDD copy needs the same correction.
While an SSE client is connected, this runs every 1.5 seconds and review.signature() rescans up to 10,000 entries and stats every candidate. Large feature trees will therefore cause continuous high filesystem load even when nothing changes. Cache discovery/signature state or invalidate it from scoped filesystem changes rather than performing a full scan on every poll.
const signature = await entry.review.signature();
const sig = stateSignature(state, signature);
Files reviewed: 78/94 changed files
Comments generated: 0 new
Review effort level: Balanced (auto)
Note
Copilot is running an experiment and ran this review at Balanced.
Choose available Markdown siblings in natural filename order, preserve revision-matched positions, and prevent background refresh from leaving the reader unmounted. Add folder-boundary, loading, refresh-race and actual-shell regressions.
This recomputes a full bounded discovery separately for every retained context on every 1.5-second SDD poll. Closing the reader does not remove its context, so repeated opens can leave up to 20 contexts and trigger up to 20 directory scans (each potentially inspecting 10,000 entries) per poll for 15 minutes. Deduplicate scans by current scope and prune/invalidate contexts when a reader closes, or maintain one watcher-derived signature per scope.
Extension phase IDs are shaped like commands/speckit.assess.intake, so this fallback produces speckit.commands/speckit.assess.intake. Because the later command loop skips the same artifact path, the selected descriptor keeps this invalid owner; the reader then filters out its clarification bindings and cannot rerun the real extension command. Derive the owner from the matching snapshot command, or strip the commands/ prefix.
Refresh control is a no-op after context load failure
When opening /api/review/context fails, showState("error") still renders a Refresh control, but activeContext remains null and this guard makes that control a permanent no-op. Let an explicit refresh reopen contextSelection when no context exists, so the advertised retry can recover from an initial transient failure.
Nested clarification markers inside links or headings are trusted
Checking only the immediate parent does not actually exclude markers inside headings or links when formatting is nested. For example, [**[NEEDS CLARIFICATION: Q?]**](research.md) visits the text with a strong parent, so it becomes a trusted clarification binding and the renderer can place a Clarify button inside the link. Track ancestors and reject any text beneath heading, link, or linkReference.
@vibeCoder500 Thanks for the contribution - this will be a nice add to the canvas apps. Before we merge this, can you please go through the copilot review feedback and decide what is applicable to fix? Thanks!
Render aligned tree/hash iconography in wide and compact outlines, cover wrapping and active states, and synchronize the generated reader assets to Wizard and SDD.
Constrain reference links to active review scopes, enforce aggregate clarification limits, release and deduplicate active review contexts, preserve loading invalidations, and connect SDD deep-link readers to change events.
I manually verified the artifact-review changes in my local environment using both the SDD and Wizard canvases.
After reviewing the four remaining Copilot review comments, I consider them non-blocking. They describe valid edge cases and potential follow-up improvements, but do not need to keep this contribution in another fix-and-automated-review cycle.
At each space, the scanner searches the remaining whitespace again instead of skipping unnecessary work. Longer runs therefore become disproportionately expensive.
A local reproduction with 80,000 consecutive spaces took about 5.3 seconds in the scanner, potentially freezing the reader during rendering.
This requires extreme uninterrupted whitespace, not ordinary paragraph spacing or typical Markdown. It is a valid optimization, but not evidence that normal Spec Kit documents are unusably slow.
Markdown parsing removes the > quote prefixes, but the new clarification scanner does not correctly account for those removed characters on continuation lines. It loses alignment between the original Markdown and parsed text, so it skips the question. The PR also replaces SDD's previous question detector with this parser, which introduces the regression there.
These consecutive lines trigger it: > Players prepare supplies before departure. > [NEEDS CLARIFICATION: Can players customize supplies?] The question remains readable, but neither gets a Clarify button nor appears in SDD's detected-question list. Before this PR, SDD detected it.
It affects a particular formatting arrangement. Moving the marker outside the blockquote restores detection, and answering through chat remains possible. Deferral is reasonable for this experiment, but it should be acknowledged as a small compatibility regression, not dismissed as optional new functionality.
Changing the document marks the saved answer stale. Restoring the exact original document does not clear that state, while recovery only permits a different revision.
A user queues an answer, edits the source, then undoes that edit. The retained answer cannot be reconfirmed or submitted.
This requires a specific edit-and-revert sequence while answers are queued. Closing the reader, discarding the draft, and re-entering it provides a workaround. Project documents are not corrupted.
Mutation and restoration check the target file but not whether its parent folders have been replaced with symlinks/junctions.
If a temporary fixture folder is redirected elsewhere, test mutation or cleanup could overwrite or delete a file at that other location.
This concerns developer test tooling, not normal installed-canvas use. Mutations require explicit opt-in, and a local actor or process must first redirect the temporary folder. A defensive check is worthwhile, but does not warrant blocking this contribution.
Both Canvas Reader Validation jobs (Windows and Ubuntu) fail at npm audit --audit-level=low --ignore-scripts. The original reader lockfile selects three indirect dependencies with published security advisories. The audit failure stops these jobs before their build, package-verification, and test steps run; it is not a failing viewer test.
These packages are used by the reader's build/test tooling and are not included in the shipped viewer bundle:
Dependency
Current lockfile
Suggested version
Used by
brace-expansion
5.0.9
5.0.12
ESLint through minimatch
source-map-js
1.2.1
1.2.2
Vite/PostCSS and jsdom
undici
8.10.1
8.11.2
jsdom
Suggested fix: refresh these dependencies within their existing compatible ranges, then regenerate the reader metadata using the CI-pinned Node 24.19.0 / npm 11.17.0. From plugins/spec-kit-copilot-wizard/extensions/speckit-wizard-canvas/ui/markdown-reader:
npm audit fix --package-lock-only --ignore-scripts --no-fund
npm ci --ignore-scripts --no-fund
npm run build
npm run verify:package
The locally verified update changes only these three files:
The two manifests record the updated source fingerprint. The generated viewer JavaScript/CSS remains unchanged, and this introduces no new installation step for end users.
A local Windows trial of this update passed the strict audit (zero vulnerabilities), typecheck, lint, build/package verification, and 560 tests including 41 browser journeys. This update is not yet in the PR; both GitHub matrix jobs will need to rerun after it is applied.
Separate CodeQL finding: the nine reported alerts were reviewed as false positives involving Markdown table serialization, intentional URI character ranges, and a UUID-based test SDK mock. They have been dismissed with individual explanations, and the CodeQL check is now passing. No scanning rules or exclusions were changed, and no additional code change is suggested for those alerts.
Refresh compatible transitive dependencies, upgrade Vite to its first patched 8.1 release, and regenerate both standalone reader payloads with the pinned toolchain. Document the lockfile provenance regeneration requirement.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
I reproduced the two original audit failures. A fresh audit also reported the newly published launch-editor advisories against the pinned Vite version (GHSA-698v-4r3x-3vcv, GHSA-r825-w8mm-5pxw, and GHSA-587h-7wmj-h5pm). Vite 8.1.6 is the first patched release for that affected version line, so that upgrade and its required bundler dependencies are included too; no forced major upgrade was used. The three indirect upgrades remain within their existing compatible ranges.
Both standalone Wizard and SDD payloads and provenance manifests were regenerated with Node 24.19.0 / npm 11.17.0. The Vite update regenerates the reader JavaScript and clarification parser; the bundled runtime dependency inventory, CSS, and license notices are unchanged. There is no new end-user installation step, and no scanning rules or exclusions were changed.
Additional review fixes
The two Copilot threads posted after the dependency update are also fixed in b4b6e05, with replies and resolution on both threads:
Shared-output workflow binding: prefer the exact selected stage before artifact-path fallback, so Clarify cannot inherit Specify's command when both write spec.md. The SDD shared copy is regenerated.
Added three regressions, including service-level command validation and DOM-level navigation/execution-gate checks. Both reported failures reproduced before their fixes and pass afterward; the complete validation below was rerun on the latest changes.
Local verification passed:
Clean locked install with lifecycle scripts disabled.
npm audit --audit-level=low --ignore-scripts: zero vulnerabilities.
Typecheck and lint.
Full build and package verification, followed by a second CI-style build without synchronizing the committed copies; both independent payloads verified.
GitHub verification is blocked on maintainer approval, not a new test failure. The fork branch and PR head both match the latest b4b6e05. The license compliance check passes. These three new runs are currently action_required, with no jobs executed:
Please approve those runs so the upstream checks can execute. I am not claiming the GitHub Windows/Linux reruns are green yet. I left the separate non-blocking follow-ups and the existing CodeQL dismissals as you recommended.
Prefer exact stage command matches before shared output paths. Admit read-only navigation through resolved extension artifact paths while preserving execution gates. Add service and DOM regressions, synchronize the SDD discovery copy, and document the behavior.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Reviewed clarification submissions reject ordinary multiline answers. The shared validateClarifications() calls boundedString(answer.answer, 4000), whose control-character filter rejects LF, CR, and tabs. Both canvases accept textarea input, and Wizard queues an answer such as Keep 30 days.\nThen delete., but validation then fails before workflow dispatch. Use an answer-specific validator that allows those whitespace characters while preserving the length, nonblank, aggregate-byte, and other control-character checks. Keep the stricter validator for identifiers, synchronize the SDD copy, and add multiline submission regressions for both canvases.
Restore multiline clarification answers with strict identifier and size limits. Enforce fresh setup admission for legacy and reviewed phase submissions, preserve read-only artifact navigation, and reset composition refresh state without replacing the active reader.
Declare Wizard-owned jsdom test dependencies and verify standalone installs. Update undici within its compatible range and regenerate shared payload metadata. Keep the strict audit gate unchanged; the unavailable patched minimatch remains an explicitly reported blocker for PR github#29.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@mnriem@nicolehaugen The five open Copilot comments are fixed in c59904e, with individual explanations and resolved threads:
Feedback
Fix and regression evidence
Multiline answers (two threads)
Separate answer validation permits CR/LF/tabs while preserving strict IDs, source/question/command bindings, 4,000-character limits, and the aggregate UTF-8 budget. Wizard/SDD service, SDD HTTP, and real textarea browser regressions pass; the SDD shared copy is regenerated.
Clean Wizard tests
Declare Wizard-owned jsdom@30.0.1, use that package's test dependency instead of the nested reader installation, and update the README. A clean npm ci and the final 422-test Wizard suite were verified with reader node_modules absent; no hidden reader install is needed.
Non-Markdown setup bypass
Viewing remains enabled, but legacy Clarify/Apply controls and the flush helper are setup-gated. Both server phase-submission forms recheck current setup before dispatch, including after asynchronous review validation. Regressions cover zero dispatch, retained answers, setup changes, and successful post-setup submissions.
Stuck Composition Refresh
Clear the static Refresh button's busy state before returning early for an active reader. The actual-browser regression verifies the same reader stays mounted and Refresh works after return, without workflow dispatch or workspace writes.
Local verification (Node 24.19.0 / npm 11.17.0): typecheck, lint, reproducible reader/parser builds, and both standalone payload verifications pass. 574 tests pass with zero failures/skips: 34 reader, 470 Wizard/SDD, 23 tooling/package, 42 actual-shell reader browser journeys, and 5 existing Wizard E2E tests. The standalone Wizard install/test check above is additional evidence, not double-counted in that total.
Remaining merge blockers
New dependency advisory, not a CodeQL code alert: the fresh strict reader audit found high-severity undici advisories and GHSA-g3hv-75wg-m249 in minimatch. undici is upgraded from 8.12.1 to 8.12.3 within the existing range; its findings are cleared and both payload provenance manifests are regenerated without changing the shipped reader JavaScript/CSS or runtime dependency inventory. The Wizard package audit is clean.
The reader audit still fails on the minimatch advisory, propagated through 11 moderate lint-toolchain dependency entries (zero high/critical findings remain). GitHub identifies minimatch >=11.0.1 as patched, but both accessible npm mirrors return 404 for that release, and direct npm registry TLS connections fail in this environment. ESLint/typescript-eslint still request minimatch 10.x, so remediation needs an available patched package plus a validated, scoped compatibility override or an upstream-supported upgrade. I have not installed an unverified replacement, force-downgraded ESLint, weakened the audit threshold, or changed scanning rules/exclusions. This blocker must be addressed before calling the PR merge-ready.
These latest runs have not executed yet. After approval, the unchanged reader audit is expected to remain red until the minimatch issue above is remediated. License compliance passes for the new head.
For CodeQL specifically, the preceding b4b6e05 analysis completed successfully and its PR check says "No new alerts in code changed by this pull request." Detailed repository code-scanning alerts are not readable by vibeCoder500; I have not dismissed any new alerts or changed security settings. A new approved scan is still needed for c59904e.
The reason will be displayed to describe this comment to others. Learn more.
🟡 Changes recommended
Unresolved critical findings include private-mirror lockfiles with weak SHA-1 integrity, unpinned workflow actions, dropped formatted clarification markers, and a race that can dispatch answers against changed artifacts.
Regenerate both dependency lockfiles from public npm with SHA-512 integrity and pin validation actions to immutable v7 commits. Apply the approved patched minimatch override without weakening strict audit gates.
Restore formatted clarification questions with shared phrasing-source spans, preserved GFM positions and markup, and exact callback bindings. Revalidate answers after the awaited setup scan, improve safe synchronization diagnostics, and move the SDD test below imports. Rebuild both independently packaged payloads and add regression coverage.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@mnriem@nicolehaugen Update: the nine comments from the latest Copilot review are fixed in e6618b6, with individual replies and resolution on every thread. The original nine are resolved; the latest bootstrap follow-up and current 31-thread status are recorded below.
Distinct stale/invalid/missing metadata errors are reported without echoing paths or private JSON.
Additional bootstrap follow-up
Final verification caught one additional comment posted during the update. It is also fixed and resolved in e5da861, with the verified reply. First-open bootstrap and recovery now use --omit=dev in both quiet/progress and recovery paths. The actual installer was tested in an owned extension fixture with NODE_ENV=development: only argparse and js-yaml were installed, not jsdom/Playwright or the test tree. All 31 targeted checks and the full 424-test Wizard suite pass; developer installs retain their test dependencies.
A new live check on this latest head confirms 31 total review threads, zero unresolved. The original nine fixes remain in e6618b6; the additional runtime-only bootstrap fix is in e5da861. The 583-test full validation below remains the evidence for the original nine; the bootstrap follow-up is separately verified above rather than double-counted.
Validation: Node 24.19.0 / npm 11.17.0; typecheck, lint, reproducible reader/parser builds, and independent package verification pass. 583 tests pass with zero failures/skips: 36 reader, 472 Wizard/SDD, 26 tooling/package, 44 real-shell reader browser journeys and 5 existing Wizard E2E tests. The additional standalone Wizard check passes 423 tests with reader dependencies absent, using the verified public cache; it is not double-counted.
The public lockfiles were generated by an explicitly authorized, SHA-pinned fork Actions workflow because direct public npm TLS is unavailable locally. They were verified before integration rather than manually rewriting URLs/hashes. The temporary helper branch/worktree and uploaded cache artifacts are removed; verified package bytes are retained in the standard npm cache for offline installs. npm refreshed locked versions only within existing compatible manifest ranges, apart from the explicitly approved scoped minimatch security override.
The previous dependency-audit blocker is now fixed: the scoped minimatch@11.0.1 override passes lint compatibility checks, and both strict public-registry audits and local online audits report zero vulnerabilities. There are no audit exemptions, threshold reductions, ESLint downgrades, CodeQL exclusions, or security-setting changes. This supersedes the previous remaining-blocker report.
Remaining verification: the latest fork runs still require maintainer approval:
License compliance passes for this head. These latest workflow runs have not executed yet, so I am not claiming the new upstream CI/CodeQL scan is green or that merge readiness is fully verified. The older Copilot assessment was made against c59904e; the latest resolved-thread state and bootstrap follow-up above reflect e5da861.
The reason will be displayed to describe this comment to others. Learn more.
🟡 Changes recommended
The runtime bootstrap installs the newly added test-only dependencies on users’ first canvas open, adding avoidable download time and failure risks behind proxies or restricted registries.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Enhance Markdown viewing inside the existing Wizard and SDD canvas previews, without introducing another plugin or canvas.
Existing Offerings Preserved
Intentional behavior changes: existing documents are readable while setup or execution is gated; Run/Rerun remains gated. Clarification markers in code examples or HTML comments are inert, and stale reviewed answers require refresh/reconfirmation.
Scope And Review Guide
Reader-only changes for both canvases. No repository browsing/authentication/cloning, preview installers or distribution, generated agent files, historical release records, branding, version bumps, or changes to unrelated plugins/skills/presets.
linguist-generated; canonical implementation remains visible for review.Verification
Verified locally on Windows with Node 24.19.0 and Edge 153.0.4234.32:
Native And Hosted Acceptance
Final candidate:
5e3b459a1666ec28a3087f3595ca68e60efc44bc.Hosted Windows and Linux validation: both jobs passed on this exact candidate. These are fork-hosted checks; upstream PR check runs are not currently attached.
Tested in GitHub Copilot App 1.1.20 on Windows using an owned synthetic repository and real project-local Wizard and SDD providers. Served payloads were hash-verified; normal installed plugins and real projects were not modified.
30 days.: only the synthetic specification changed; 145 other tracked files remained unchanged, with no additions. Its resolved question disappeared.Native testing found and regression-tested two reader defects: compact drawer stacking and explicit refresh of expired contexts. Recovery revalidates selected-document membership and clears old context bindings; automatic updates do not renew the existing 15-minute expiry. A temporary App WebView loading/focus issue was resolved by reacquiring native controls and opening the preview normally; the final SDD recovery check then passed without another code change.
Limits: actual Windows App acceptance, not native macOS/Linux certification or marketplace-release validation. Raw local evidence and diagnostic captures remain local. PR remains draft; no merge or release performed.