fix(packaging): the name is claimed — close ASVS 15.2.4 for real - #50
Merged
Conversation
messagefoundry-webconsole 0.2.15 published to PyPI 2026-07-29 by the first webconsole-v* release, over Trusted Publishing (OIDC, no API token). Verified: pypi.org returns 200, one file, 0.2.15; the run's release-webconsole job succeeded with the publish step RUN (not skipped) while release and release-harness correctly skipped on the tag prefix. This is the half that actually closes the cell. The earlier commit corrected our install instructions, which removed OUR CONTRIBUTION to the dependency-confusion risk but could not remove the risk: the name stayed free for anyone to register, and a squatted sdist executes its build backend during `pip install`, before any engine process exists. Claiming the name is what forecloses the substitution. Docs flipped back to real index installs (README, INSTALL-GUIDE, SERVICE, USER-GUIDE, MENTAL-MODEL, packaging README), and api/app.py's serve_ui RuntimeError now prints a command that works. The guard is UPDATED, not deleted: - _UNPUBLISHED_DISTRIBUTIONS is now empty, which is the goal state rather than a disabled check. To stop it rotting back to vacuous, test_a_new_distribution_must_be_classified requires every distribution under packaging/ to be classified published or unpublished, so a NEW packaging/<name>/ that is neither fails the build. That is precisely the window this exposure lived in: a distribution existed, shipped docs named it, nobody had claimed it. - The guard-the-guard was exercising the path-vs-index discrimination using the REAL name, so three of its six cases inverted the moment the name was claimed — it would have failed for being right. Repointed at a synthetic never-to-exist name, with an assertion that the probe name stays fictional, plus new cases asserting a PUBLISHED name is not flagged (claiming a name is what makes a bare-name instruction safe, so the detector must say so). Two mutations red: leave a packaged distribution unclassified; reinstate the non-existent [webconsole] extra in shipped code. 9579 passed. The two failures are environmental and reproduce without this change: no .venv in this worktree (stale 0.3.0 install vs 0.3.2 source), and main's #43 moved the gate source while the installed user-scope snapshot is stale (needs install-gate.ps1 re-run).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
ASVS 15.2.4 is now genuinely closed —
messagefoundry-webconsole0.2.15 is published and thename is claimed (2026-07-29, first
webconsole-v*release, Trusted Publishing / OIDC, no API token).Verified end to end rather than from the green tick: the run's
release-webconsolejob succeeded withthe publish step run — not skipped — while
releaseandrelease-harnesscorrectly skipped on thetag prefix;
pypi.org/pypi/messagefoundry-webconsole/jsonreturns 200, one file, 0.2.15.Why this is the half that matters
The earlier commit corrected our install instructions. That removed our contribution to the
dependency-confusion risk but could not remove the risk: the name stayed free for anyone to register,
and a squatted sdist executes its build backend during
pip install— on a box that by design holdsthe store key and PHI, before any engine process exists to defend it. Claiming the name is what
forecloses the substitution. The module docstring said exactly this; it now resolves the right way.
Changes
Docs flipped back to real index installs (README, INSTALL-GUIDE, SERVICE, USER-GUIDE, MENTAL-MODEL,
packaging README), and
api/app.py'sserve_uiRuntimeError now prints a command that works.The guard is updated, not deleted — two things worth review:
_UNPUBLISHED_DISTRIBUTIONSis now empty, which is the goal state rather than a disabled check.To stop it rotting back to vacuous,
test_a_new_distribution_must_be_classifiedrequires everydistribution under
packaging/to be classified published or unpublished, so a newpackaging/<name>/that is neither fails the build. That is precisely the window this exposurelived in: a distribution existed, shipped docs named it, nobody had claimed it.
The guard-the-guard was exercising the path-vs-index discrimination using the real name, so
three of its six cases inverted the moment the name was claimed — it would have failed for being
right. Repointed at a synthetic never-to-exist name, with an assertion that the probe name stays
fictional, plus new cases asserting a published name is not flagged (claiming a name is what
makes a bare-name instruction safe, so the detector must say so).
Two mutations red: leave a packaged distribution unclassified · reinstate the non-existent
[webconsole]extra in shipped code.Verification
9579 passed. Two failures, both environmental and both reproducing without this change:
test_installed_metadata_matches_dunder_version(no.venvin this worktree — stale0.3.0installmeasured against
0.3.2source) andtest_the_installed_gate_matches_the_committed_source(main's #43moved the gate source; the installed user-scope snapshot needs
install-gate.ps1re-run). Neither istouched by this diff.
🤖 Generated with Claude Code