• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

Tatsh / sbclaude / 32103106778
100%

Build:
DEFAULT BRANCH: master
Ran 18 Aug 2026 05:32AM UTC
Jobs 5
Files 5
Run time 1min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

18 Aug 2026 05:20AM UTC coverage: 99.244% (-0.8%) from 100.0%
32103106778

push

github

Tatsh
venv: give the box its own virtualenv and leave the project's alone

A virtualenv records the absolute path of the interpreter it was built
against. The host's does not exist in the image and the box's does not
exist on the host, so sharing .venv between them leaves whichever ran
last pointing at an interpreter that is not there. Both this repository
and deltona had a dangling .venv/bin/python from exactly that.

The box now uses .sbclaude-venv:

- UV_PROJECT_ENVIRONMENT is set to the relative name rather than an
  absolute path. uv resolves a relative value against whichever project
  it is working on, so every project the box touches gets a virtualenv
  beside its own pyproject.toml. The absolute path it held before named
  one project for the whole container, so a sync run in a second project
  installed into the first project's environment and replaced what was
  in it.
- Beside the project rather than under /tmp, because the container is
  always run with --rm and anything in its own filesystem is rebuilt
  from nothing on every start.
- /.sbclaude-venv/ goes in .git/info/exclude rather than .gitignore. It
  is a local artefact of how this checkout is being worked on, not a
  fact about the project that every other clone should carry.

The host's .venv is bind-mounted read-only over itself. The project
mount is read-write so the agent can edit code, which otherwise leaves
the host's interpreter and installed packages writable by an agent
running with permissions skipped.

The entrypoint provisions the virtualenv on start when it finds a
pyproject.toml, setup.py, setup.cfg, requirements.txt or Pipfile, and
puts its bin directory on PATH. Provisioning is best-effort: a project
that cannot resolve here still gets a session.

One dependency that cannot build fails the whole sync, which would leave
the box with no test runner and no linter over a package it was never
going to use. Some cannot build at any price: pygobject 3.56 wants
girepository-2.0, ... (continued)

93 of 93 branches covered (100.0%)

Branch coverage included in aggregate %.

34 of 40 new or added lines in 3 files covered. (85.0%)

695 of 701 relevant lines covered (99.14%)

4.96 hits per line

Uncovered Changes

Lines Coverage ∆ File
6
98.73
-1.27% sbclaude/container.py
Jobs
ID Job ID Ran Files Coverage
1 32103106778.1 18 Aug 2026 05:32AM UTC 5
99.24
GitHub Action Run
2 32103106778.2 18 Aug 2026 05:34AM UTC 5
99.24
GitHub Action Run
3 32103106778.3 18 Aug 2026 05:35AM UTC 5
99.24
GitHub Action Run
4 32103106778.4 18 Aug 2026 05:35AM UTC 5
99.24
GitHub Action Run
5 32103106778.5 18 Aug 2026 05:35AM UTC 5
99.24
GitHub Action Run
Source Files on build 32103106778
  • Tree
  • List 5
  • Changed 3
  • Source Changed 3
  • Coverage Changed 3
Coverage ∆ File Lines Relevant Covered Missed Hits/Line Branch Hits Branch Misses
  • Back to Repo
  • Github Actions Build #32103106778
  • 6303339e on github
  • Prev Build on master (#32093141648)
  • Next Build on master (#32107422771)
  • Delete
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc