Skip to content

fix(meta): suppress issue links for dependency promotions - #2862

Merged
stranske merged 4 commits into
mainfrom
automation/deps-promotion-issue-link
Aug 1, 2026
Merged

fix(meta): suppress issue links for dependency promotions#2862
stranske merged 4 commits into
mainfrom
automation/deps-promotion-issue-link

Conversation

@stranske

@stranske stranske commented Jul 31, 2026

Copy link
Copy Markdown
Owner

Source: Issue #2865

Closes #2865

Summary

Authenticates dependency-repair promotion provenance before source routing can suppress incidental issue links.

Pipeline status

Adopted into the agent pipeline; consumer-template parity and review recovery remain tracked by the source issue.

@cursor

cursor Bot commented Jul 31, 2026

Copy link
Copy Markdown

Bugbot is not enabled for your account, so this pull request was not reviewed.

Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs.

@coderabbitai

coderabbitai Bot commented Jul 31, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

You’ve reached a temporary PR review limit under our Fair Usage Limits Policy.

Your recent review volume is higher than typical usage, so adaptive limits are currently applied.

Next review available in: 55 minutes

Your organization has reached its usage spending cap. Adjust your spending cap in the billing tab.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: d6b7d2c2-0265-45a4-bb44-4855ba6947bb

📥 Commits

Reviewing files that changed from the base of the PR and between deb4183 and 5e0b0ac.

📒 Files selected for processing (1)
  • .github/scripts/__tests__/source-context.test.js
📝 Walkthrough

Walkthrough

Dependency-repair promotion metadata is trusted only with both required labels. Trusted metadata suppresses incidental issue routing and sets Dependabot context. Untrusted metadata preserves GitHub issue classification. The policy documentation and tests reflect this behavior.

Changes

Dependency-repair source context

Layer / File(s) Summary
Promotion source resolution
.github/scripts/source_context.js, templates/consumer-repo/.github/scripts/source_context.js
Both resolvers validate the required promotion labels before applying dependency-repair classification, suppressing issue numbers, setting sourceRef, or marking the context explicit.
Promotion routing validation
.github/scripts/__tests__/source-context.test.js, docs/ops/DEPENDENCY_REPAIR_PROMOTION.md
Tests cover trusted markers with Fixes #99`` and untrusted markers that preserve issue routing. The documentation records the label and provenance requirements.

Estimated code review effort: 2 (Simple) | ~10 minutes

Possibly related PRs

  • stranske/Workflows#2857: This change extends its dependency-repair promotion source-context handling with label validation.

Suggested labels: codex, codex-automation

Suggested reviewers: copilot

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the main change: suppressing issue links for dependency promotions.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch automation/deps-promotion-issue-link

Comment @coderabbitai help to get the list of available commands.

@stranske-keepalive

Copy link
Copy Markdown
Contributor

Workflow source needed

PR #2862 needs either a linked GitHub issue or one valid non-issue Workflow Source before PR metadata automation can manage it safely.

Please do one of:

  • Add <!-- meta:issue:123 --> or a normal Closes #123 / Related to #123 line.
  • Check one Workflow Source option in the PR body.
  • Add a hidden marker such as <!-- workflow-source:local_request -->, <!-- workflow-source:manual_remote -->, <!-- workflow-source:review_followup -->, <!-- workflow-source:sync_campaign -->, or <!-- workflow-source:dependabot -->.
  • Add a workflow source label such as workflow:source-direct-pr, workflow:source-local-request, workflow:source-review-followup, workflow:source-sync, or workflow:no-automation.

Once a valid source is present, this warning will not be reposted.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: b851d1366e

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread .github/scripts/source_context.js Outdated
@stranske-keepalive

stranske-keepalive Bot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Automated Status Summary

Head SHA: 3a782fe
Latest Runs: ⏳ pending — Gate
Required contexts: Gate / gate, Health 45 Agents Guard / guard
Required: core tests (3.12): ⏳ pending, core tests (3.13): ⏳ pending, docker smoke: ⏳ pending, gate: ⏳ pending

Workflow / Job Result Logs
(no jobs reported) ⏳ pending

Coverage Overview

  • Coverage history entries: 0

Updated automatically; will refresh on subsequent CI/Docker completions.


Keepalive checklist

Scope

No scope information available

Tasks

  • No tasks defined

Acceptance criteria

  • No acceptance criteria defined

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/scripts/__tests__/source-context.test.js:
- Around line 197-217: Extend the dependency-repair promotion marker tests with
a format-valid but forged or mismatched marker alongside “Fixes `#99`”, and assert
that both resolver copies keep the issue route active rather than treating it as
Dependabot promotion metadata. Reuse the existing marker structure and verify
the resulting source context preserves issueNumber 99 and requiresIssue true.

In @.github/scripts/source_context.js:
- Around line 384-387: The issue is that untrusted dependency-repair promotion
markers can override issue routing. In both
.github/scripts/source_context.js:384-387 and
templates/consumer-repo/.github/scripts/source_context.js:384-387, require
trusted PR and commit validation before assigning issueNumber from
dependencyRepairPromotion; update both copies identically. In
.github/scripts/__tests__/source-context.test.js:197-217, add coverage for a
forged marker and verify Fixes `#99` remains routed through issue synchronization.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: f2c41c0e-8f74-4715-a0e1-bb2b266e52e3

📥 Commits

Reviewing files that changed from the base of the PR and between a87536c and 52c6f37.

📒 Files selected for processing (3)
  • .github/scripts/__tests__/source-context.test.js
  • .github/scripts/source_context.js
  • templates/consumer-repo/.github/scripts/source_context.js

Comment thread .github/scripts/__tests__/source-context.test.js
Comment thread .github/scripts/source_context.js Outdated
Copilot AI review requested due to automatic review settings August 1, 2026 00:03

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.

Pull request overview

This PR adjusts PR source-context resolution so that dependency-repair promotion provenance (marker + promotion labels) overrides incidental Fixes #... references, preventing unintended issue-body synchronization while keeping issue routing intact for untrusted markers.

Changes:

  • Treat dependency-repair promotion markers as authoritative only when paired with both dependency:repair-promotion and workflow:source-dependabot labels.
  • Suppress extracted issue numbers (Fixes #..., title/branch/body references, etc.) when the promotion is trusted, so routing stays on the dependency path.
  • Update ops documentation and add regression tests covering incidental issue references and untrusted markers.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated no comments.

File Description
templates/consumer-repo/.github/scripts/source_context.js Mirrors the source-context trust model update in the consumer template copy.
docs/ops/DEPENDENCY_REPAIR_PROMOTION.md Documents that the promotion marker is only trusted alongside both promotion labels.
.github/scripts/source_context.js Implements trusted-promotion gating and suppresses incidental issue routing for promotions.
.github/scripts/__tests__/source-context.test.js Adds/updates tests for trusted promotion behavior vs untrusted marker behavior.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/scripts/__tests__/source-context.test.js:
- Around line 227-247: Extend the test for resolvePrSourceContext to assert that
the untrusted promotion marker falls back to the issue reference sourceRef value
"`#99`", rather than "dependency-pr:`#2795`". Keep the existing sourceType,
issueNumber, and requiresIssue assertions unchanged.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 960e885b-f7f3-49e0-a9f1-cdec45986550

📥 Commits

Reviewing files that changed from the base of the PR and between 52c6f37 and deb4183.

📒 Files selected for processing (4)
  • .github/scripts/__tests__/source-context.test.js
  • .github/scripts/source_context.js
  • docs/ops/DEPENDENCY_REPAIR_PROMOTION.md
  • templates/consumer-repo/.github/scripts/source_context.js

Comment thread .github/scripts/__tests__/source-context.test.js
@stranske
stranske enabled auto-merge (squash) August 1, 2026 00:08
@stranske
stranske merged commit f2d406b into main Aug 1, 2026
41 checks passed
@stranske
stranske deleted the automation/deps-promotion-issue-link branch August 1, 2026 00:10
@stranske stranske added agent:codex Agent-created issues from Codex agents:keepalive Use to initiate keepalive functionality with agents autofix Opt-in automated formatting & lint remediation agent:retry Add to trigger agent retry after rate limit or pause labels Aug 1, 2026
@stranske stranske added the verify:compare Compare multiple LLM evaluations label Aug 1, 2026
@github-actions

github-actions Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

Provider Comparison Report

Provider Summary

Provider Model Verdict Confidence Summary
openai gpt-5.6-terra CONCERNS 81% The change is clear, narrowly scoped, and keeps the root and consumer-template resolver implementations aligned. It correctly suppresses incidental issue references for markers considered trusted b...
anthropic claude-sonnet-5 PASS 82% The PR implements label-gated trust validation for dependency-repair promotion markers in both the root and consumer-template source_context.js files, keeping them synchronized as required. When bo...
📋 Full Provider Details (click to expand)

openai

  • Model: gpt-5.6-terra
  • Verdict: CONCERNS
  • Confidence: 81%
  • Scores:
    • Correctness: 7.0/10
    • Completeness: 7.0/10
    • Quality: 9.0/10
    • Testing: 7.0/10
    • Risks: 6.0/10
  • Summary: The change is clear, narrowly scoped, and keeps the root and consumer-template resolver implementations aligned. It correctly suppresses incidental issue references for markers considered trusted by the new label gate, while unlabelled markers continue through issue routing. However, the two labels are used as the entire provenance check and are not tied to the marker's source PR or SHA metadata, leaving valid-looking but mismatched marker data trusted when the labels are present. Test coverage demonstrates the intended happy path and an unlabelled forged path, but does not verify the required mismatched-marker cases or template behavior.
  • Concerns:
    • Provenance is treated as validated solely when a syntactically valid marker is accompanied by the two expected labels. The resolver does not bind the marker payload to an actual promotion event, source PR, branch, or SHA. Consequently, a valid but forged/mismatched marker carrying those labels is trusted and suppresses issue routing, contrary to the requirement that forged or mismatched markers preserve normal routing.
    • The added negative test covers an unlabelled forged marker only. It does not cover incomplete label combinations, incorrect source labels, or a syntactically valid marker with both labels but mismatched/forged provenance data.
    • The consumer-template resolver was kept in sync at the implementation level, but the new behavior is tested only through the root resolver. There is no explicit parity test ensuring the template copy remains behaviorally synchronized.

anthropic

  • Model: claude-sonnet-5
  • Verdict: PASS
  • Confidence: 82%
  • Scores:
    • Correctness: 8.0/10
    • Completeness: 9.0/10
    • Quality: 8.0/10
    • Testing: 8.0/10
    • Risks: 6.0/10
  • Summary: The PR implements label-gated trust validation for dependency-repair promotion markers in both the root and consumer-template source_context.js files, keeping them synchronized as required. When both dependency:repair-promotion and workflow:source-dependabot labels are present alongside a valid marker, the issue-link is suppressed and the source type is set to DEPENDABOT; otherwise, normal issue routing is preserved, correctly satisfying the two primary acceptance criteria (suppress-when-trusted, preserve-when-forged). New tests explicitly cover the trusted-marker-suppresses-issue and untrusted-marker-preserves-issue-routing scenarios, plus the existing marker test was updated to include the trust labels. Code is well-commented explaining the security rationale. Main residual risk is that the change assumes labels are unforgeable by ordinary contributors (i.e., trust boundary enforcement lives outside this diff), which isn't verifiable from the code alone, and there's no test for a partial-label (one but not both) scenario. Given CI is green and the logic aligns well with the stated acceptance criteria, this passes with moderate confidence and a note on the residual trust-boundary risk.
  • Concerns:
    • Trust decision hinges entirely on the presence of two labels (dependency:repair-promotion, workflow:source-dependabot); the diff does not include or reference any enforcement that these labels can only be applied by the controlled promotion workflow. If label application isn't otherwise access-controlled, the 'authentication' is effectively just a naming convention.
    • The docs file change (DEPENDENCY_REPAIR_PROMOTION.md) wasn't fully visible in the diff excerpt, so it's not possible to confirm it fully documents the new trust requirement for reviewers/operators.
    • No test exercises the case where only one of the two required labels is present (partial/mismatched trust signal), which is an edge case implied by 'forged or mismatched markers' in the acceptance criteria.

Agreement

  • Correctness: scores within 1 point (avg 7.5/10, range 7.0-8.0)
  • Quality: scores within 1 point (avg 8.5/10, range 8.0-9.0)
  • Testing: scores within 1 point (avg 7.5/10, range 7.0-8.0)
  • Risks: scores within 1 point (avg 6.0/10, range 6.0-6.0)

Disagreement

Dimension openai anthropic
Verdict CONCERNS PASS
Completeness 7.0/10 9.0/10

Unique Insights

  • openai: Provenance is treated as validated solely when a syntactically valid marker is accompanied by the two expected labels. The resolver does not bind the marker payload to an actual promotion event, source PR, branch, or SHA. Consequently, a valid but forged/mismatched marker carrying those labels is trusted and suppresses issue routing, contrary to the requirement that forged or mismatched markers preserve normal routing.; The added negative test covers an unlabelled forged marker only. It does not cover incomplete label combinations, incorrect source labels, or a syntactically valid marker with both labels but mismatched/forged provenance data.; The consumer-template resolver was kept in sync at the implementation level, but the new behavior is tested only through the root resolver. There is no explicit parity test ensuring the template copy remains behaviorally synchronized.
  • anthropic: Trust decision hinges entirely on the presence of two labels (dependency:repair-promotion, workflow:source-dependabot); the diff does not include or reference any enforcement that these labels can only be applied by the controlled promotion workflow. If label application isn't otherwise access-controlled, the 'authentication' is effectively just a naming convention.; The docs file change (DEPENDENCY_REPAIR_PROMOTION.md) wasn't fully visible in the diff excerpt, so it's not possible to confirm it fully documents the new trust requirement for reviewers/operators.; No test exercises the case where only one of the two required labels is present (partial/mismatched trust signal), which is an edge case implied by 'forged or mismatched markers' in the acceptance criteria.

🔍 LangSmith Traces

stranske added a commit that referenced this pull request Aug 1, 2026
…rkers

The #2862 verifier comparison flagged that promotion trust was only
exercised for the both-labels and no-labels paths, so a weakened gate
could suppress issue routing undetected. Adds partial-label, mismatched
payload, and root/consumer-template parity coverage.
stranske added a commit that referenced this pull request Aug 1, 2026
…rkers (#2866)

* test(source-context): cover partial-label and mismatched promotion markers

The #2862 verifier comparison flagged that promotion trust was only
exercised for the both-labels and no-labels paths, so a weakened gate
could suppress issue routing undetected. Adds partial-label, mismatched
payload, and root/consumer-template parity coverage.

* test: cover source context review cases

---------

Co-authored-by: Codex Automation <codex-automation@users.noreply.github.com>
@stranske

stranske commented Aug 1, 2026

Copy link
Copy Markdown
Owner Author

Closer verifier disposition — openai CONCERNS (81%) / anthropic PASS (82%): all three concerns are resolved on current main

The Provider Comparison Report was generated at 00:42Z against the state of main immediately after this PR merged. Two follow-up PRs have merged since then — #2866 (00:47Z→01:38Z, PASS/PASS) and #2867 (03:23Z, PASS/PASS) — and between them they close every openai concern. Each claim below was re-checked against current main, not accepted or dismissed on the report text.

Concern 1 — "the two labels are used as the entire provenance check and are not tied to the marker's source PR or SHA metadata" → resolved; layering was correct, enforcement was not, and #2867 fixed the enforcement

source_context.js is a routing resolver, not the provenance validator. It deliberately trusts the label pair (source_context.js:390-397) and suppresses the incidental issue reference on that basis (:401), because the labels are applied by the controlled promotion workflow after provenance is established. The actual binding of marker payload → real promotion event lives in .github/scripts/dependency-repair-contract.js, which fails the PR unless:

  • source_head_sha is a commit in the named source PR (:308-311);
  • source_base_sha is the first parent of the source PR's commit prefix (:321-324);
  • the first promotion commit is based directly on promotion_base_sha (:348-351);
  • the promoted change matches the source by git patch-id --stable over an identical path set (:165, :356-387),

with core.setFailed on any failure (:425). A "valid-looking but mismatched" marker does not survive that.

The concern was nevertheless pointing at something real at the time it was written: pr-46-dependency-repair-contract.yml then subscribed only to [opened, reopened, synchronize, edited], so the labels applied after opening never re-triggered it — and a skipped job reports success, leaving the required check satisfied while the contract never ran. #2867 closed that hole: the workflow now includes labeled/unlabeled (pr-46-dependency-repair-contract.yml:11) and adds an unauthorized-promotion-marker job (:40-59) whose if: is the exact negation of the contract job's promotion clause, so a same-repo PR carrying the marker either runs the full contract or fails closed.

Residual observation, recorded rather than actioned: both jobs are scoped to head.repo.full_name == github.repository, so a fork PR carrying the marker would be trusted by the resolver on labels alone with neither job running. Reaching that state requires a maintainer (or a compromised workflow) to apply both trust labels to a fork PR, and promotion PRs are always same-repo, so this is a hardening idea rather than completion debt for #2865.

Concern 2 — "the added negative test covers an unlabelled forged marker only" → resolved by #2866

.github/scripts/__tests__/source-context.test.js now contains exactly the missing cases:

  • partial promotion label sets do not authorize suppression of issue routing (:290-319) — asserts GITHUB_ISSUE routing survives for dependency:repair-promotion alone, workflow:source-dependabot alone, and the incorrect-source pairing dependency:repair-promotion + workflow:source-sync.
  • mismatched promotion payloads preserve issue routing even when both labels are present (:321-374) — three malformed payloads (non-positive source_pr, a non-SHA source_head_sha, a missing promotion_base_sha) each assert parseDependencyRepairPromotionSource(...) === null and that routing falls back to #99 with both trust labels applied.

Concern 3 — "no explicit parity test ensuring the template copy remains behaviorally synchronized" → resolved by #2866

The suite imports the consumer-template resolver directly (:19-20) and consumer template resolver stays behaviorally synchronized on promotion trust (:376-406) deepEquals the two resolvers across all four label subsets (both labels, each alone, neither). The mismatched-payload test asserts the template copy independently as well (:360-372). Independently confirmed: .github/scripts/source_context.js and templates/consumer-repo/.github/scripts/source_context.js are byte-identical on main (492 lines each, empty diff).

Disposition

CONCERNS is cleared. Source issue #2865 is closed and carries no remaining completion debt; #2866 and #2867 already landed the work the report asked for, and both were independently verified PASS by both providers. No follow-up PR or issue is warranted. The fork-scoped observation above is optional hardening only.

stranske added a commit that referenced this pull request Aug 1, 2026
…context (#2872)

`Health 45 Agents Guard / guard` cannot be a required status check. It is a
commit status posted by agents-guard.yml only inside the "Report agents guard
commit status" step, whose condition is
`always() && steps.eligibility.outputs.should-run == 'true'`, and eligibility
requires one of the agent labels (agent:codex, agents:auto-pilot, ...). On any
PR without such a label the status is never posted, and a required check that
never reports leaves the PR permanently un-mergeable. Verified absent on the
heads of all 12 most recent PRs (#2850-#2862), where the only statuses are
`Gate / gate` and `CodeRabbit`.

This was not merely theoretical: health-44 passes
.github/config/required-contexts.json to
`enforce_gate_branch_protection.py --apply` on workflow_dispatch/workflow_call
whenever an enforcement token is present, so dispatching that workflow today
would have added the context and frozen every non-agent PR in the repo.

Remove it from the required-contexts set (shared config, the tool's
DEFAULT_CONTEXTS, both health-40 invocations) and record why in the config so it
is not re-added. `Gate / gate` remains required-worthy: it is posted on every PR
by pr-00-gate.yml and passes on all 12 most recent PRs. agents-guard.yml still
posts its status; it is simply informational rather than gating.

Also give health-40's "Root allowlist guard" `if: always()`. Steps run
sequentially, so the failing branch-protection snapshot step was skipping it —
which is how six unlisted repo-root files accumulated unseen for a month.

Refs #2858.

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agent:codex Agent-created issues from Codex agent:retry Add to trigger agent retry after rate limit or pause agents:keepalive Use to initiate keepalive functionality with agents autofix Opt-in automated formatting & lint remediation verify:compare Compare multiple LLM evaluations

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Authenticate dependency-repair promotion provenance for source routing

3 participants