Skip to content

feat(results): per-result tracking links to PRs / remote issues (REQ-248, DD-072, #548)#676

Merged
avrabe merged 1 commit into
mainfrom
feat/req-248-test-result-links
Jul 8, 2026
Merged

feat(results): per-result tracking links to PRs / remote issues (REQ-248, DD-072, #548)#676
avrabe merged 1 commit into
mainfrom
feat/req-248-test-result-links

Conversation

@avrabe

@avrabe avrabe commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Summary

Implements REQ-248 (#548, decision DD-072): a test result can carry links to where the work/tracking lives — a PR artifact or a remote issue — so a failing (or any) result points at the tracking tool instead of dead-ending.

  • rivet-coreResultLink { url, label? } + additive TestResult.links (#[serde(default, skip_serializing_if = "Vec::is_empty")]), so existing result files round-trip byte-identical. Parsed automatically from the rivet-native JSON/YAML result format.
  • serve — the results detail view gains a Tracking column rendering each link (opens in a new tab; label falls back to the URL).

Security (addressed a review finding)

Result files can originate from CI output or synced externals, so only http(s) URLs become a live href — a javascript: / data: / file: scheme renders as inert escaped text (stored-XSS guard, is_http_url).

Verification

  • result_links_round_trip_from_result_file — present / absent / URL-only-label round-trip.
  • only_http_urls_are_treated_as_safe_links — http(s) safe; javascript/data/file/ftp/relative/empty rejected.
  • cargo clippy --all-targets -- -D warnings exit 0; rivet validate PASS.

Scope

JUnit <property name="link"> mapping → DD-072 Slice 2 (follow-on). Advances REQ-248 proposed → implemented.

Implements: REQ-248 · Refs: FEAT-010 · DD-072

🤖 Generated with Claude Code

…248, DD-072, #548)

A test result can now carry links to where the work/tracking lives — a PR
artifact or a remote issue — so a failing (or any) result points at the
tracking tool instead of dead-ending. Per DD-072:

- rivet-core: `ResultLink { url, label? }` + additive `TestResult.links`
  (`#[serde(default, skip_serializing_if = "Vec::is_empty")]`), so existing
  result files round-trip byte-identical. Parsed automatically from the
  rivet-native JSON/YAML result format.
- serve: the results detail view gains a "Tracking" column rendering each
  link (opens in a new tab; label falls back to the URL).

Security: result files can come from CI output or synced externals, so only
`http(s)` URLs become a live `href` — a `javascript:`/`data:`/`file:` scheme
renders as inert escaped text (stored-XSS guard, `is_http_url`).

Confirmed with the round-trip parse test (present/absent/URL-only-label),
the XSS-guard unit test (http/https safe; javascript/data/file/relative
rejected), cargo clippy --all-targets -- -D warnings, and rivet validate
PASS. JUnit `<property name="link">` mapping is DD-072 Slice 2. Advances
REQ-248 proposed -> implemented.

Implements: REQ-248
Refs: FEAT-010
@github-actions

github-actions Bot commented Jul 8, 2026

Copy link
Copy Markdown

📐 Rivet artifact delta

Change Count
Added 1
Removed 0
Modified 1
Downstream impacted (depth ≤ 5) 0

Graph

graph LR
  REQ_248["REQ-248"]:::modified
  DD_072["DD-072"]:::added
  classDef added fill:#d4edda,stroke:#28a745,color:#155724
  classDef removed fill:#f8d7da,stroke:#dc3545,color:#721c24
  classDef modified fill:#fff3cd,stroke:#ffc107,color:#856404
  classDef overflow fill:#e2e3e5,stroke:#6c757d,color:#495057,stroke-dasharray: 3 3
Loading
Added
  • DD-072
Modified
ID Changes
REQ-248

📎 Full HTML dashboard attached as workflow artifact rivet-delta-pr-676download from the workflow run.

Posted by rivet-delta workflow. The graph shows only changed artifacts; open the HTML dashboard (above) for full context.

@avrabe avrabe merged commit e06ef36 into main Jul 8, 2026
27 of 28 checks passed
@avrabe avrabe deleted the feat/req-248-test-result-links branch July 8, 2026 21:11
@codecov

codecov Bot commented Jul 8, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

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.

1 participant