Skip to content

fix(ci): weekly self-scan installs the checkout, not a stale v0.5.4 tag - #106

Merged
bkd-dotcom merged 1 commit into
mainfrom
fix/autofix-self-install
Aug 31, 2026
Merged

fix(ci): weekly self-scan installs the checkout, not a stale v0.5.4 tag#106
bkd-dotcom merged 1 commit into
mainfrom
fix/autofix-self-install

Conversation

@bkd-dotcom

Copy link
Copy Markdown
Member

The failure

Every scheduled run of Signetry auto-fix (branch-only PR with receipt) has failed since the umbrasignetry rename — most recently run 33392468703 (2026-08-31) and run 32698978560 (2026-08-24).

The Install Signetry step pinned the package to a pre-rename tag:

pip install "signetry-core @ git+https://github.com/Signetry/core@v0.5.4"

v0.5.4's pyproject.toml still declares name = "umbra-core", so pip rejected the name mismatch:

WARNING: Generating metadata for package signetry-core produced metadata for project name umbra-core.
Discarding git+https://github.com/Signetry/core@v0.5.4: Requested umbra-core ... has inconsistent
name: expected 'signetry-core', but metadata has 'umbra-core'
ERROR: No matching distribution found for signetry-core (unavailable)

Because install failed, the four steps that matter — scan + propose fixes, the credential-leak gate, and the branch-only PR step — were all skipped. The job was failing silently at setup, not finding nothing.

The fix

This is the signetry-core repo, so install the checkout instead of a published tag:

pip install .

A hard-coded tag in a repo's own self-scan drifts behind main by construction — this bug would recur at every rename or release. Installing the checkout also means the weekly self-scan exercises the code actually on main, which is what a self-scan is for. Downstream consumers keep installing by tag (Signetry/autofix-demo is already on v0.7.0).

Second, smaller fix: the artifact path was ${{ env.OUT }}/scan-and-fixes.json, but env.OUT is only exported once the scan step runs — so any earlier failure made it resolve to /scan-and-fixes.json. It is now the deterministic ${{ runner.temp }}/signetry/scan-and-fixes.json.

Verification

Clean venv on Python 3.13:

  • pip install .signetry-core 0.7.0, signetry entry point present
  • signetry --json scan . → exit 0, 9 findings (8 high / 1 medium)

.github/** is already in allowed_paths in .signetry/admission.yaml, so self-admission is unaffected.

The `Signetry auto-fix` workflow installed signetry-core from
`git+https://github.com/Signetry/core@v0.5.4`. That tag predates the
umbra -> signetry rename, so its metadata still declares
`name = "umbra-core"`, and pip refused the requested `signetry-core`:

    Requested umbra-core from git+.../core@v0.5.4 has inconsistent name:
    expected 'signetry-core', but metadata has 'umbra-core'
    ERROR: No matching distribution found for signetry-core (unavailable)

Every scheduled run since the rename failed at the install step, so the
scan, the leak check and the PR step were all skipped.

This is the signetry-core repo, so install the checkout (`pip install .`):
the weekly self-scan should exercise the code on main, and a hard-coded
tag drifts behind it by construction. Downstream consumers still install
by tag (see Signetry/autofix-demo, already on v0.7.0).

Also make the artifact path deterministic. `path: ${{ env.OUT }}/...` only
resolves after the scan step exports OUT, so a failure before that point
made it upload from `/scan-and-fixes.json`.

Verified locally on 3.13: `pip install .` yields signetry-core 0.7.0 with a
working `signetry` entry point, and `signetry --json scan .` exits 0 with
9 findings.
@github-actions

Copy link
Copy Markdown

Signetry Reviewer — 🟣 Escalate to a designated reviewer

Escalate to a designated reviewer — this PR touches security-sensitive surface (.github/workflows/signetry-autofix.yml). No blocking issue was found automatically, but a human owner should sign off.

Deterministic gates (the authority)

Gate Status
Required status check ⏳ pending
Secret scan ✅ clean
CI permission / OIDC ✅ no forbidden change
Dependency skew ✅ ok
All green

Findings (1, 0 blocking)

  • 🟡 Change touches a protected path: .github/workflows/signetry-autofix.yml .github/workflows/signetry-autofix.yml (via cross-check)
    • .github/workflows/signetry-autofix.yml matches a protected pattern (.github/workflows/*). Changes here alter shared/foundational surface and warrant a designated reviewer.
    • Fix: Route to a code owner / architecture reviewer.

Sensitive surface

This PR changes security-sensitive paths that warrant a designated reviewer:

  • .github/workflows/signetry-autofix.yml

Merge

A designated reviewer / code owner should sign off before merge (sensitive surface).

This review is advisory. It never merges on its own judgement — the deterministic gates + a human are the authority. Findings can have false negatives; a green bot verdict is not a guarantee.

@bkd-dotcom
bkd-dotcom merged commit 14d2aff into main Aug 31, 2026
8 checks passed
bkd-dotcom added a commit that referenced this pull request Sep 1, 2026
#106 fixed why the weekly governed self-scan was failing. This fixes why nobody
knew — which is the more interesting half.

The scan failed on 2026-08-17, 2026-08-24 and 2026-08-31, three consecutive
Mondays, and was only discovered because a human went looking at the run list. A
scheduled job that fails silently is indistinguishable from one that never ran,
and treating an absent signal as a passing one is exactly the mistake this engine
exists to catch. It should not have been our own weekly job doing it.

A failing scheduled run now files a report:

  - Only for `schedule`. A failed workflow_dispatch is already in front of the
    person who clicked it; filing an issue at them would be noise, and noise is
    how the first three failures got ignored.
  - One issue, reused. A fresh issue every Monday would bury the signal it exists
    to raise, so an already-open report gets a comment instead.
  - The label is created first, because `gh issue create --label` fails outright
    on a label that does not exist.
  - `issues: write` is scoped to this job alone. It gets nothing else — notably
    not the contents/pull-requests write the scan job holds.

The report states plainly that no fix PRs were opened and nothing was merged, so
reading it cannot leave anyone unsure whether a half-finished change landed.
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