Skip to content

upstream-drift: record the provenance convention entry and add the cleaned-state CI gate #9759

Open

Description

@kyle-sexton

Refs #3465. Slice 3 of 3. Blocked by slice 2 (the disposition sweep).

Problem

#3465 ends with a convention engagement that fires at sweep completion, a narrow CI gate that keeps the cleaned state clean, and two items recorded at the same firing: the hash-store designed-issue trigger and the dead-pointer round-trip wiring. The engagement was drafted in docs/specs/provenance-convention-engagement.md, which #5719 deleted; its content survives only in the #3465 body ("The convention engagement"). The upstream-drift convention is now 2.0.0 with a new record shape.

Fix

Read the slice-1 and slice-2 comments on #3465 as the evidence. Then, in one PR:

  1. Convention entry. Add ONE entry to docs/conventions/upstream-drift/CHANGELOG.md, graded against convention 2.0.0, with the three parts from the provenance sweep sub-topic: repo-wide sweep, upstream-drift convention engagement, and the cleaned-state gate #3465 body: (a) re-derive the chore(conventions): plugins restating upstream harness facts are not adopters of upstream-drift, so stale claims never surface #2273 adoption trigger ("a detector is demonstrated that separates an upstream restatement from an in-repo one without a suppression list") from the closure count, measured precision/recall at the stated n, and the carve-out record; if per-instance suppressions accumulated, record that the trigger has not fired, with the count; (b) the enforceability table: major bump only if an enforceability verdict changes, otherwise a minor entry with the as-of date refreshed; (c) the trigger-less-stamp row moves to "built, off-by-default, repo-override enabled". Never rewrite earlier entries, never declare the plugin-eval deferral trigger fired, never turn a report-only tier into a deterministic claim.
  2. Hash-store trigger. In the same entry, evaluate the hash-store designed-issue trigger (docs/conventions/upstream-drift/README.md, the deferred hash store) against the sweep's fetch telemetry, and state fired or not fired with the numbers.
  3. Dead-pointer wiring. Route dead links found by .github/workflows/maintenance-check-links-online-claude-code-plugins.yml to the demotion path in plugins/attribution/skills/audit/reference/dispositions.md ("The demotion path when a pointer later dies"), as consuming-repo integration (the plugin file says the consuming repo owns the trigger).
  4. Cleaned-state gate. Add a narrow CI step in .github/workflows/pr-require-checks.yml that runs the deterministic half of the attribution audit (stamps and fingerprint, no model call) on changed markdown and fails on a new fix-eligible finding. Keep it suppression-free; report-only tiers stay report-only.

Done when

  • git diff origin/main...HEAD -- docs/conventions/upstream-drift/CHANGELOG.md | grep -c '^+## ' prints 1
  • actionlint .github/workflows/pr-require-checks.yml .github/workflows/maintenance-check-links-online-claude-code-plugins.yml exits 0
  • The new gate step's script has a .test.sh with a fixture that fails the gate and one that passes; bash <that test> exits 0
  • ci-status is green on the PR head

Activity

  1. added
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Oct 24, 2026
  2. github-actions commented on Oct 24, 2026

    @github-actions
    Contributor

    Proposed work class: work-class: scoped
    Basis: automated intake triage; the lanes App applied this class.

    Size: Medium
    Complexity: Medium
    Uncertainty: Knowable
    Flags: none

    Understood: this is slice 3 of #3465. In one PR it adds a single upstream-drift CHANGELOG entry, which includes the hash-store trigger evaluation. It also routes dead links from the online link-check workflow to the demotion path, and adds a suppression-free CI gate step in pr-require-checks.yml with a pass fixture and a fail fixture. The issue says it is blocked by slice 2 (the disposition sweep), so the evidence from the #3465 slice comments has to exist first. No likely duplicates found among the open issues.

    Automated triage, applied by the lanes App.

  3. added
    priority: mediumReal value, no hard deadline; normal backlog flow.
    and removed
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Oct 24, 2026
  4. melodic-automation-lanes commented on Oct 24, 2026

    @melodic-automation-lanes
    Contributor

    Not admitted to the issue lane yet: blocker #9755 is not closed as completed by a listed human or a merge.

  5. kyle-sexton commented on Nov 1, 2026

    @kyle-sexton
    MemberAuthor

    Cordoned until the disposition sweep in #9755 runs. Issue Triage session.

    This slice's evidence is the slice-2 sweep comment on #3465: the closure count, the measured precision and n, and the carve-out record. Three of its four steps wait on that sweep:

    Step 3, routing dead links to the demotion path, does not need the sweep: reference/dispositions.md makes that wiring the consuming repo's integration, and #3465 ties it to the sweep only by scheduling ("recorded at the same firing"). It stays in this slice because the slice ships as one PR.

    The owner ruled on 2026-10-30 that no class is fix-eligible yet. The owner-decisions record (docs/owner-decisions.md in melodic-software/architecture, row "Q1 and Q2 (Backlog HITL numbering), 2026-10-30") records the owner's reply, verbatim: "go w/ recommended". The decision: "(a) not yet; re-measure on a larger sample before any class is declared fix-eligible". Until a class is fix-eligible, the sweep cannot run and the gate has nothing to fail on. #9755 is cordoned on that condition.

    What reopens this: #9755 closes as completed, and #3465 carries a comment headed ## Disposition sweep, <date>. Then take this issue off After zero and send it back through intake with a **Decision recorded.** comment. Its blocked-by edge to #9755 stays as it is. At re-intake, also repoint the body's hash-store trigger from docs/conventions/upstream-drift/README.md to docs/contracts/upstream-drift/README.md, where that section now lives.

  6. added
    status: confirmedA maintainer confirmed the item is real and in scope; ready to be worked.
    and removed
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    on Nov 1, 2026
  7. added this to the After zero milestone on Nov 1, 2026
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

    priority: mediumReal value, no hard deadline; normal backlog flow.status: confirmedA maintainer confirmed the item is real and in scope; ready to be worked.work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.

    Type

    Fields

    No fields configured for Task.

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions