Skip to content

Artifact Explorer: resilient jobs, browser emulator, Docs, sharing, and workflow re-run - #5068

Merged
aaronpowell merged 33 commits into
github:mainfrom
IEvangelist:ievangelist-artifact-explorer-resilient-canvas
Oct 28, 2026
Merged

aaronpowell merged 33 commits into
github:mainfrom
IEvangelist:ievangelist-artifact-explorer-resilient-canvas

Conversation

@IEvangelist

@IEvangelist IEvangelist commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor

Pull Request Checklist

  • I have read and followed the CONTRIBUTING.md guidelines.
  • I have read and followed the Guidance for submissions involving paid services.
  • My contribution adds a new instruction, prompt, agent, skill, workflow, or canvas extension file in the correct directory.
  • The file follows the required naming convention.
  • The content is clearly structured and follows the example format.
  • I have tested my instructions, prompt, agent, skill, workflow, or canvas extension with GitHub Copilot.
  • I have run npm start and verified that README.md is up to date. (npm run build passes.)
  • I am targeting the main branch for this pull request.

Description

Updates the Artifact Explorer canvas (extensions/pr-artifact-explorer, plugin and skill) with:

  • Resilience: retry and full restart; background download/index/extract jobs that survive request/view changes; ZIP64 and bounded central-directory handling; soft limit prompts (download, indexing, decompression, idle) that never stop work, with raised limits checked against live progress. Integrity and disk guards stay hard.
  • Sharing and skill: unified targets (repo, PR, issue, artifact, route) for sharing links and the AI skill.
  • Browser emulator: localhost/HTTP(S) preview with mobile/tablet/desktop presets, viewport vs. visual zoom, history/refresh, natural-language navigation, real Playwright/Chromium screenshots and device emulation (explicit setup, no silent install), keyboard hints.
  • Docs tab: built-in usage docs.
  • Artifact preview: universal Preview/Raw toggle, native video, JUnit viewer, HTML Browser action, per-render race guards, theme sync, open in default browser.
  • UX: copy title / copy link buttons, #number links to GitHub, compact Back/Forward route history, full PR-detail skeleton.
  • Workflow re-run: confirmation-gated re-run of the originating Actions run (all or failed jobs), permission- and eligibility-aware, original actor/SHA warning.

Type of Contribution

  • Update to existing instruction, prompt, agent, plugin, skill, workflow, or canvas extension.

Additional Notes

Verification: extension suite 92/92 (--test-concurrency=2), plugin:validate, skill:validate, npm run build, and line-ending normalization pass. Re-run behavior was tested only against mocked GitHub APIs; no real CI was triggered.

Screenshots

Workflow runs view (default filters: Hide PR runs, Has artifacts).

Workflow runs view, dark theme

Workflow runs view, light theme


By submitting this pull request, I confirm that my contribution abides by the Code of Conduct and will be licensed under the MIT License.

IEvangelist and others added 20 commits October 12, 2026 23:23
…browser preview, and sharing skill

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 72ee5a2d-bcbb-4e0f-b86f-6ad56d4fc033
…nit XML viewer

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 72ee5a2d-bcbb-4e0f-b86f-6ad56d4fc033
…contextual UI, media, JUnit

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 72ee5a2d-bcbb-4e0f-b86f-6ad56d4fc033
Parse JUnit times strictly, showing unknown timings as Not recorded.
Scope video error listener to its live preview and distinguish
network/integrity from decode failures.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 72ee5a2d-bcbb-4e0f-b86f-6ad56d4fc033
Per-term substring matching made 'Browser A' match every row via the 'a' term. Match the whole normalized phrase and cover it in the Chromium regression.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 72ee5a2d-bcbb-4e0f-b86f-6ad56d4fc033
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 72ee5a2d-bcbb-4e0f-b86f-6ad56d4fc033
…e, open in default browser

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 72ee5a2d-bcbb-4e0f-b86f-6ad56d4fc033
…und-trip

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 72ee5a2d-bcbb-4e0f-b86f-6ad56d4fc033
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 72ee5a2d-bcbb-4e0f-b86f-6ad56d4fc033
… teardown, preserve report state across Raw/Preview

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 72ee5a2d-bcbb-4e0f-b86f-6ad56d4fc033
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 72ee5a2d-bcbb-4e0f-b86f-6ad56d4fc033
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 72ee5a2d-bcbb-4e0f-b86f-6ad56d4fc033
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 72ee5a2d-bcbb-4e0f-b86f-6ad56d4fc033
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 72ee5a2d-bcbb-4e0f-b86f-6ad56d4fc033
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 72ee5a2d-bcbb-4e0f-b86f-6ad56d4fc033
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 72ee5a2d-bcbb-4e0f-b86f-6ad56d4fc033
…on permission lookup errors

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 72ee5a2d-bcbb-4e0f-b86f-6ad56d4fc033
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 72ee5a2d-bcbb-4e0f-b86f-6ad56d4fc033
@IEvangelist
IEvangelist requested review from a team as code owners October 14, 2026 02:54
Copilot AI balanced review requested due to automatic review settings October 14, 2026 02:54
@github-actions

github-actions Bot commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor

🔒 PR Risk Scan Results

Scanned 58 changed file(s).

Severity Count
🔴 High 0
🟠 Medium 6
ℹ️ Info 0
Severity Rule File Line Match
🟠 package-exec-command extensions/pr-artifact-explorer/README.md 41 npx playwright-core install chromium
🟠 package-exec-command extensions/pr-artifact-explorer/assets/browser.js 558 &lt;details class="docs-details"&gt;&lt;summary&gt;Set up Chromium if capture is unavailable&lt;/summary&gt;&lt;p&gt;Setup is explicit; Explorer does not install anything silently. Run &lt;code&gt;npm install&lt;/
🟠 package-exec-command extensions/pr-artifact-explorer/capture.mjs 36 "2. Install the browser once: npx playwright-core install chromium",
🟠 package-exec-command extensions/pr-artifact-explorer/capture.test.mjs 41 assert.match(error.message, /npx playwright-core install chromium/);
🟠 unpinned-version-indicator extensions/pr-artifact-explorer/package-lock.json 11 "playwright-core": "^1.60.0"
🟠 unpinned-version-indicator extensions/pr-artifact-explorer/package.json 7 "playwright-core": "^1.60.0"
Skipped non-text or missing files
  • extensions/pr-artifact-explorer/assets/docs/continuing-job.png
  • extensions/pr-artifact-explorer/assets/docs/preview-controls.png
  • extensions/pr-artifact-explorer/assets/docs/preview-options.png

This is an automated soft-gate report. Findings indicate review targets and do not block merge by themselves.

@github-actions github-actions Bot added canvas-extension PR touches canvas extensions new-submission PR adds at least one new contribution plugin PR touches plugins skills PR touches skills labels Oct 14, 2026
@github-actions github-actions Bot added requires-submitter-fixes Submission has quality-gate findings that submitter must fix before maintainer review and removed awaiting-automation labels Oct 19, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment thread extensions/pr-artifact-explorer/assets/markdown-preview.js Outdated
Comment thread extensions/pr-artifact-explorer/server.test.mjs Outdated
Comment thread extensions/pr-artifact-explorer/assets/markdown-preview.js
Comment thread extensions/pr-artifact-explorer/close-bounded.test.mjs
Comment thread extensions/pr-artifact-explorer/github.mjs Outdated
Comment thread extensions/pr-artifact-explorer/owned-theme.test.mjs
…ension doesn't crash on start

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 72ee5a2d-bcbb-4e0f-b86f-6ad56d4fc033
Copilot AI balanced review requested due to automatic review settings October 19, 2026 15:04
@github-actions github-actions Bot added awaiting-automation requires-submitter-fixes Submission has quality-gate findings that submitter must fix before maintainer review and removed requires-submitter-fixes Submission has quality-gate findings that submitter must fix before maintainer review awaiting-automation labels Oct 19, 2026
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 72ee5a2d-bcbb-4e0f-b86f-6ad56d4fc033

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Confirmed defects can freeze Markdown previews, overwrite user settings during tests, and silently discard workflow filters.

14 open issues
1 previously missed issue

In code that hasn't changed since last review

Medium severity Workflow filename selection silently drops invalid filters

extensions/​pr-artifact-explorer/​github.mjs:737

The picker emits workflow filenames that normalizeRunFilters rejects. For example, .github/workflows/nightly build.yml produces ref: "nightly build.yml", but selecting it silently drops the workflow filter and queries all repository runs. Check the same filename pattern here and fall back to the workflow ID when it does not match.

1 file not reviewed
  • extensions/pr-artifact-explorer/package-lock.json: Generated file

Review effort: Balanced

Comment thread extensions/pr-artifact-explorer/assets/markdown-preview.js Outdated
Comment thread extensions/pr-artifact-explorer/server.test.mjs
Copilot AI balanced review requested due to automatic review settings October 19, 2026 15:21

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

Markdown rendering can freeze the canvas, and pagination makes the final permitted workflow-run results inaccessible.

14 open issues
2 previously missed issues

In code that hasn't changed since last review

Medium severity Unmatched backticks cause catastrophic regex backtracking

extensions/​pr-artifact-explorer/​assets/​markdown-preview.js:23

This regex backtracks heavily on unmatched backtick runs. In a bounded check, text followed by 8,192 backticks exceeded one second, while 2 MiB of ordinary text completed in 2 ms. Artifact Markdown is rendered synchronously on the canvas UI thread, so a small untrusted file can freeze the explorer despite the size cap. Replace this expression with linear-time delimiter scanning and add a regression for long unmatched runs.

Medium severity Pagination limit hides results beyond the 990th run

extensions/​pr-artifact-explorer/​github.mjs:688

At 30 runs per page, this limit exposes only 990 results. A search with 995 results disables Older on page 33 and clamps page 34 back to 33, leaving five runs inaccessible. Define a 1,000-result limit, derive the page ceiling with Math.ceil, and use the result limit for reachable and capped. Update the boundary tests to cover the partial 34th page.

1 file not reviewed
  • extensions/pr-artifact-explorer/package-lock.json: Generated file

Review effort: Balanced

The default Latest scope deduplicated artifacts by name before the status
filter ran, so a retry hid the failing run's artifacts. Filters now apply
before deduplication and status counts reflect the same scope.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 72ee5a2d-bcbb-4e0f-b86f-6ad56d4fc033
Copilot AI balanced review requested due to automatic review settings October 19, 2026 18:06

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Markdown rendering can stall the canvas, and workflow pagination leaves the final results unreachable.

15 open issues
1 previously missed issue

In code that hasn't changed since last review

Medium severity Pagination cannot reach final results beyond the 990th run

extensions/​pr-artifact-explorer/​github.mjs:688

At 30 runs per page, this cap exposes only 990 results. For a search with 991–1,000 results, page 33 reports hasMore: false, and requests for page 34 are clamped to 33, so the final runs cannot be reached. Define a separate 1,000-result limit, derive the page count with Math.ceil(limit / RUNS_PER_PAGE), and use the result limit for reachable and capped. Update the pagination tests to cover the partial 34th page.

1 file not reviewed
  • extensions/pr-artifact-explorer/package-lock.json: Generated file

Review effort: Balanced

Comment thread extensions/pr-artifact-explorer/assets/markdown-preview.js Outdated

@aaronpowell aaronpowell left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks — this is a substantial and useful upgrade to Artifact Explorer. Main blocker is the codespell pickup, but can you double-check that there's no HIGH rated feedback from CCR to action

Resolve docs/README.skills.md by regenerating it with npm run build, and
reword a runs.test.mjs branch fixture that codespell flagged.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot AI balanced review requested due to automatic review settings October 27, 2026 12:03
- Controlled browser: keep the close timeout referenced, validate the viewport before
  launching, coordinate close() with a pending startup, apply an explicit viewport to an
  open session
- Runs: hide PR runs by filtering explicitly (GitHub's flag only empties pull_requests),
  use workflow ids for filenames the filter rejects, page through all workflows, and make
  the final partial page of 1,000 runs reachable
- Markdown: stop U+2028/2029 hanging list parsing, protect link hrefs from emphasis, and
  scan code spans in linear time
- Tests: isolate server.test.mjs from the real COPILOT_HOME; add regressions

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment thread extensions/pr-artifact-explorer/assets/markdown-preview.js Outdated
Comment thread extensions/pr-artifact-explorer/capture.mjs Outdated
Comment thread extensions/pr-artifact-explorer/capture.mjs
Comment thread extensions/pr-artifact-explorer/github.mjs Outdated
Comment thread extensions/pr-artifact-explorer/github.mjs Outdated
Copilot AI balanced review requested due to automatic review settings October 27, 2026 12:18

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

The link and image regexes exhibit quadratic behavior on unmatched label openers, allowing Markdown below the 2 MB cap to freeze the canvas UI; both need bounded parsing and regression tests.

1 open issue
1 previously missed issue

In code that hasn't changed since last review

Medium severity Avoid imposing the 1,000-run ceiling on unfiltered listings

extensions/​pr-artifact-explorer/​github.mjs:782

The default, unfiltered runs list stops at page 34 because both normalizeRunFilters and this pagination calculation impose a 1,000-result ceiling. GitHub documents that ceiling only for searches using specific filters, including branch, event, and status (API documentation), so older runs are unnecessarily unreachable here. Apply the ceiling only when the outgoing request uses a capped search filter, and update the normalization and pagination tests together.

5 resolved since last review
1 file not reviewed
  • extensions/pr-artifact-explorer/package-lock.json: Generated file

Review effort: Balanced

out = out
.replace(/!\[([^\]]*)\]\(([^)\s]+)(?:\s+&quot;[^)]*&quot;)?\)/g, (_m, alt) => `<span class="md-image">[image: ${alt || "no description"}]</span>`)
// Link destinations are stashed so the emphasis rules below cannot rewrite characters inside an href.
.replace(/\[([^\]]+)\]\(([^)\s]+)(?:\s+&quot;[^)]*&quot;)?\)/g, (_m, label, href) => {
@aaronpowell
aaronpowell merged commit b6483db into github:main Oct 28, 2026
30 of 32 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

canvas-extension PR touches canvas extensions merge-risk:high new-submission PR adds at least one new contribution plugin PR touches plugins requires-submitter-fixes Submission has quality-gate findings that submitter must fix before maintainer review skills PR touches skills

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants