Skip to content

Close the supply-chain gaps left after 1.0.0 - #20

Merged
mar0ls merged 2 commits into
mainfrom
dev
Sep 6, 2026
Merged

mar0ls merged 2 commits into
mainfrom
dev

Conversation

@mar0ls

@mar0ls mar0ls commented Sep 6, 2026

Copy link
Copy Markdown
Owner

Two commits. Nothing here changes how the application behaves — it changes what
the tooling around it can see.

The measurable one

backend/requirements.lock becomes backend/requirements-lock.txt.

GitHub's dependency graph was reading requirements.txt and not the lock, so
Dependabot alerts covered 21 floor-pinned packages while the image installs 73
exact ones. Measured before changing anything: fastapi and ansible-core
appear in the repository SBOM; anyio and attrs, which exist only in the lock,
do not. None of the 25 Python entries carried a version at all — >= pins have
none to record.

requirements*.txt is the pattern the graph recognises, which makes the rename a
cheap experiment with a visible outcome. The graph analyses the default branch,
so merging this is what runs the test.
The SBOM currently reports 25 pypi
packages; if the rename is the answer it should climb toward the lock's 73, and
anyio should be among them. If it does not, the fallback is submitting
dependencies from CI through the dependency submission API, and that will be a
separate change.

The file was moved, not regenerated: every pin and hash is byte-identical, and
the image still builds under --require-hashes.

The rest

  • .github/dependabot.yml for GitHub Actions. Every action is SHA-pinned,
    which is correct and also means none can move on its own — the 1.0.0 release
    warned that six still target the Node 20 runtime. Monthly, grouped into one
    PR. pip is excluded on purpose, with the reason written in the file.
  • cicd-sensor in the two jobs that lacked it — syntax, and publish in
    release.yml. The latter holds DOCKERHUB_TOKEN and contents: write and
    builds the image users pull, so the job most worth watching was the unwatched
    one; that also contradicted the commit which introduced the sensor "for jobs
    that install third-party deps or hold release secrets". Coverage there is
    partial: the sensor observes the runner, not the buildkit containers. It also
    adds a third-party step to the release path — a real cost, accepted knowingly.
  • cicd-sensor v0.0.36 → v0.0.38 (agent 0.0.43 → 0.0.45), which fixes silent
    log loss on short jobs; syntax and types both finish in about two minutes.
  • The bug-report template suggested a 0.9.0 health payload.

Verification

844 tests, coverage 82.35% against a floor of 82, mypy clean, both workflows
parse, and the image rebuilds from the renamed lock with the same 73 packages.

v0.0.38 extends the agent's shutdown window (TimeoutStopSec=30s, --shutdown-grace
20s) so buffered logs and the summary reach the collector before the runner VM is
destroyed. Without it short jobs lose their sensor output silently, and both jobs
running the sensor finish in about two minutes — `syntax` and `types` are exactly
the case the fix describes. The bundled agent goes 0.0.43 -> 0.0.45.

Still pinned by commit SHA, which fixes the agent version along with the action:
the explicit `cicd-sensor-version` input this seemed to call for would add
nothing.

Also corrects the bug-report template, which suggested a 0.9.0 health payload as
the version placeholder. That directory was missed by the documentation audit
before the 1.0.0 tag — the sweep covered .md files and comments under
backend/app, not .github.
Four changes, one job: make the tooling see what actually ships.

Renamed backend/requirements.lock to requirements-lock.txt. GitHub's dependency
graph was reading requirements.txt and not the lock, so Dependabot alerts covered
21 floor-pinned packages while the image installs 73 exact ones. This was
measured, not suspected: fastapi and ansible-core appear in the repository SBOM,
anyio and attrs — which exist only in the lock — do not, and none of the 25
Python entries carried a version at all, because >= pins have none to record.

`requirements*.txt` is the pattern the graph recognises, so the rename is the
cheap experiment. Whether the filename was the actual cause becomes visible in
the SBOM once this lands; if the transitive packages still do not appear, the
answer is submitting them from CI through the dependency submission API. The file
was moved, not regenerated — every pin and hash is byte-identical, and the image
still builds under --require-hashes.

Added .github/dependabot.yml for GitHub Actions. Pinning actions by SHA is
correct and also means none of them can move on their own; the 1.0.0 release
warned that six still target the Node 20 runtime. Monthly and grouped into a
single pull request, because a bot a solo maintainer starts ignoring is worse
than no bot. pip is excluded on purpose, with the reason in the file.

Put cicd-sensor in the two jobs that lacked it. `syntax` is cheap to cover.
`publish` holds DOCKERHUB_TOKEN and contents:write and produces the image users
pull, so the job most worth watching was the one not watched — which contradicted
the commit that introduced the sensor, since that one said it was for jobs
holding release secrets. Coverage there is partial by nature: the sensor observes
the runner, not the buildkit containers the image is built inside. It also adds a
third-party step to the release path, which is a real cost accepted knowingly.
@codecov

codecov Bot commented Sep 6, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@mar0ls
mar0ls merged commit 7fea4c2 into main Sep 6, 2026
8 checks passed
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