Found while implementing the ruling on #14510 (PR #14699). Filed unassigned, not fixed there — the file is outside that card's fence.
What is missing
The runtime image now installs pg and mysql2 alongside the CLI, and docker/README.md publishes that list as a maintained public promise. PR #14699 pins the two files against each other (check-docs-image-tag grew a limb that fails when the install line and the published table disagree), so the promise cannot drift within the repo.
Nothing yet asserts the drivers are actually in the built image. The ruling on #14510 named that pin explicitly:
Pins: the image probe (node -e "require('pg'); require('mysql2')" inside the built image) is green
It could not be satisfied in the execution lane: no Docker daemon in the container, and ghcr.io blob reads are refused by egress policy, so the reading there is honestly NOT MEASURED. It is cheap in CI, where the image already exists.
Where it goes
.github/workflows/docker-publish.yml already pulls and runs the pushed image:
- name: Smoke-test the pushed image (amd64)
# `os --version` proves the CLI resolved, installed, and runs on the
# pushed image; a boot test needs an artifact + DB and belongs to the
# examples/e2e suites, not here.
run: |
docker pull "$IMAGE:$VERSION"
docker run --rm "$IMAGE:$VERSION" os --version
The comment's own reasoning extends to the drivers exactly: require() proves they resolved and installed, and needs no artifact and no database. One line:
docker run --rm "$IMAGE:$VERSION" node -e "require('pg'); require('mysql2')"
Why it is worth the line
The install currently has no failure mode anyone would notice. npm install -g of a package that resolves to nothing an ObjectStack path imports still exits 0; a future refactor that moves the install into a stage the runtime layer does not carry — the exact shape #14510 describes for the scaffolder's generated Dockerfile, where the runtime stage copies only dist/objectstack.json — would publish a green build of an image whose README promises a driver it does not have. The in-repo gate cannot see that: it compares two files, and both would still agree.
The failure this closes is also the expensive one, because it lands on the first run of a new install. Whoever picks this up should ideally also read the assertion in the other direction once (confirm the probe goes red against an image built without the drivers), since a probe that cannot fail is the same vacuous green the in-repo limb has an explicit rule against.
Not urgent and not a blocker for #14699, which is honest about what it does and does not measure.
Found while implementing the ruling on #14510 (PR #14699). Filed unassigned, not fixed there — the file is outside that card's fence.
What is missing
The runtime image now installs
pgandmysql2alongside the CLI, anddocker/README.mdpublishes that list as a maintained public promise. PR #14699 pins the two files against each other (check-docs-image-taggrew a limb that fails when the install line and the published table disagree), so the promise cannot drift within the repo.Nothing yet asserts the drivers are actually in the built image. The ruling on #14510 named that pin explicitly:
It could not be satisfied in the execution lane: no Docker daemon in the container, and
ghcr.ioblob reads are refused by egress policy, so the reading there is honestly NOT MEASURED. It is cheap in CI, where the image already exists.Where it goes
.github/workflows/docker-publish.ymlalready pulls and runs the pushed image:The comment's own reasoning extends to the drivers exactly:
require()proves they resolved and installed, and needs no artifact and no database. One line:docker run --rm "$IMAGE:$VERSION" node -e "require('pg'); require('mysql2')"Why it is worth the line
The install currently has no failure mode anyone would notice.
npm install -gof a package that resolves to nothing an ObjectStack path imports still exits 0; a future refactor that moves the install into a stage the runtime layer does not carry — the exact shape #14510 describes for the scaffolder's generated Dockerfile, where the runtime stage copies onlydist/objectstack.json— would publish a green build of an image whose README promises a driver it does not have. The in-repo gate cannot see that: it compares two files, and both would still agree.The failure this closes is also the expensive one, because it lands on the first run of a new install. Whoever picks this up should ideally also read the assertion in the other direction once (confirm the probe goes red against an image built without the drivers), since a probe that cannot fail is the same vacuous green the in-repo limb has an explicit rule against.
Not urgent and not a blocker for #14699, which is honest about what it does and does not measure.