Skip to content

fix(packaging): the name is claimed — close ASVS 15.2.4 for real - #50

Merged
wshallwshall merged 1 commit into
mainfrom
claude/asvs-15-2-4-name-claimed
Jul 29, 2026
Merged

fix(packaging): the name is claimed — close ASVS 15.2.4 for real#50
wshallwshall merged 1 commit into
mainfrom
claude/asvs-15-2-4-name-claimed

Conversation

@wshallwshall

Copy link
Copy Markdown
Collaborator

ASVS 15.2.4 is now genuinely closedmessagefoundry-webconsole 0.2.15 is published and the
name 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-webconsole job succeeded with
the publish step run — not skipped — while release and release-harness correctly skipped on the
tag prefix; pypi.org/pypi/messagefoundry-webconsole/json returns 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 holds
the 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's serve_ui RuntimeError now prints a command that works.

The guard is updated, not deleted — two things worth review:

  1. _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.

  2. 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 .venv in this worktree — stale 0.3.0 install
measured against 0.3.2 source) and test_the_installed_gate_matches_the_committed_source (main's #43
moved the gate source; the installed user-scope snapshot needs install-gate.ps1 re-run). Neither is
touched by this diff.

🤖 Generated with Claude Code

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).
@wshallwshall
wshallwshall enabled auto-merge (squash) July 29, 2026 18:32
@wshallwshall
wshallwshall merged commit 4bd0beb into main Jul 29, 2026
32 checks passed
@wshallwshall
wshallwshall deleted the claude/asvs-15-2-4-name-claimed branch July 29, 2026 18:42
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