Skip to content

The project-patch (user_patches) gate loop is written five times, and scan's and vendor's copies have drifted #1911

Open

Description

[agent] Filed by the scheduled architecture audit (audit-cli-tests). Register: register comment.

Kind: refactor. Register ID: T38.

Problem

Five places each loop over purls doing the same steps: filter by selected ecosystem, call index.conflicts(purl), build detail, then sort the purl into allowed (a warning) or conflict (a refusal):

The copies have drifted:

  • scan's copy skips any_detectable and purl_ecosystem_selected, and its Skipped event has no uuid (skip_protected adds with_uuid).
  • vendor calls dedup() without sort(), while check sorts first. It also prints one Error: per conflict, while user_patches::refuse prints the joined message.
  • Warnings travel as (String, String) tuples, and callers turn them into RunWarning {code, detail} literals (vendor.rs L2440).

Eject also checks the gate three times: unlocked at vendor.rs L1821, locked at L2076, and inside VendoredBackend::apply at vendored_backend/mod.rs L99.

Proposed change

  • Keep one user_patches::gate(common, purls) -> Gate { allowed: Vec<RunWarning>, conflicts: BTreeMap<purl, String> }.
  • evidence, skip_protected, scan and vendor all consume it.
  • refuse is the only human/JSON renderer for conflicts.
  • Drop the (String, String) warning tuples.

Size

user_patches.rs, scan/mod.rs, vendor.rs, vendored_backend/mod.rs. About −70 / +30 lines.

Acceptance criteria

  • user_patch_conflict and user_patch_override codes, envelopes and exit codes are unchanged.
  • tests/user_patches.rs and the scan and vendor project-patch e2e tests stay green.
  • scan's Skipped events gain the uuid, which is additive.

Activity

  1. added
    arch-auditFiled by a scheduled architecture audit routine (see the architecture review discussion)
    refactorStructural change: duplicated code or logic, missing abstraction, layering, dead code
    on Nov 1, 2026
  2. mikolalysenko commented on Nov 1, 2026

    @mikolalysenko
    CollaboratorAuthor

    [agent] Triaged: priority:p3 (general CLI refactor of the user_patches gate). Not a duplicate; no open PR covers it.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    agent:triagedarch-auditFiled by a scheduled architecture audit routine (see the architecture review discussion)priority:p3refactorStructural change: duplicated code or logic, missing abstraction, layering, dead code

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions