Skip to content

Claims: GT-706 — nothing asserts a package's own exports resolve in its own tarball - #597

Merged
beyondnetPeru merged 1 commit into
developfrom
docs/gt-706-phantom-exports
Aug 17, 2026
Merged

Claims: GT-706 — nothing asserts a package's own exports resolve in its own tarball#597
beyondnetPeru merged 1 commit into
developfrom
docs/gt-706-phantom-exports

Conversation

@beyondnetPeru

Copy link
Copy Markdown
Contributor

The class that cost this release two failed publish attempts, registered as what it is rather than as the symptom that surfaced.

What happened

contracts@1.1.0 declared an export subpath it did not ship. That did not fail at its own publish. It failed at infra-providers@1.2.1's clean-room smoke — after core-domain@1.3.1 was already irreversibly on the registry. The release stopped half-shipped, and npm forbids unpublishing after 72 hours, so the only recovery was a new contracts version.

The check that exists is real, and it is the wrong shape

npm-release.yml:213 computes "promised" as [pkg.main, ...Object.values(pkg.bin)]. exports is not in that list, so the assertion answers a narrower question than the manifest asks.

Proven falsifiable, observed green — not argued

A two-file package declaring "./ingest": "./dist/ingest/index.js" with only dist/index.js on disk, run through that assertion verbatim from :208-220:

2 file(s) packed; entry points declared: dist/index.js
packlist assertion exit=0        <-- green, with a phantom export declared
require phantom-proof/ingest -> MODULE_NOT_FOUND

The clean-room smoke does not cover it either, and that is not its defect: it resolves what a package imports, so a producer's phantom stays invisible until a consumer's turn — which is after the irreversible step.

What the row refuses to claim, because it was measured and is false

There is no phantom on the registry today. Installing the published contracts@1.2.0, core-domain@1.3.1 and agent-runtime@1.2.0 into a clean prefix and resolving every declared subpath gives 22 resolve, 0 phantom. The registry is healthy; what is missing is anything that keeps it that way. "There are broken exports" would have been a row that closes itself by accident on the next release.

Exposure: 3 of 8 publishable packages declare 23 export subpaths, none asserted; two also declare an unbounded ./*.

Id allocated by union of branches — 39 remote refs carrying the board, max GT-705 — not from the local maximum.

Verified: 08 (704 gaps, 680/680 sections, debt economics 32/32) / 49 / 01 / 04 / 41 / 57 green, 46 at a fixed point, and every board row splits into exactly 9 cells under the parsers' own splitRow in both languages.

Claims: GT-706

🤖 Generated with Claude Code

… resolve in its own tarball

The class that cost this release two failed publish attempts, registered with what
it actually is rather than with the symptom that surfaced.

WHAT HAPPENED. contracts@1.1.0 declared an export subpath it did not ship. That
did not fail at its own publish. It failed at infra-providers@1.2.1's clean-room
smoke -- AFTER core-domain@1.3.1 was already irreversibly on the registry. The
release stopped half-shipped, and npm forbids unpublishing after 72 hours, so the
only recovery was a new contracts version.

THE CHECK THAT EXISTS IS REAL AND IS THE WRONG SHAPE. npm-release.yml:213 computes
"promised" as `[pkg.main, ...Object.values(pkg.bin)]`. `exports` is not in that
list, so the assertion answers a narrower question than the manifest asks.

PROVEN FALSIFIABLE, OBSERVED GREEN -- not argued. A two-file package declaring
`"./ingest": "./dist/ingest/index.js"` with only dist/index.js on disk, run through
that assertion VERBATIM from :208-220:

  2 file(s) packed; entry points declared: dist/index.js
  packlist assertion exit=0        <-- green, with a phantom export declared
  require phantom-proof/ingest -> MODULE_NOT_FOUND

The clean-room smoke does not cover it either, and that is not its defect: it
resolves what a package IMPORTS, so a producer's phantom stays invisible until a
consumer's turn -- which is after the irreversible step.

WHAT THE ROW REFUSES TO CLAIM, because it was measured and is false: there is no
phantom on the registry today. Installing the published contracts@1.2.0,
core-domain@1.3.1 and agent-runtime@1.2.0 into a clean prefix and resolving every
declared subpath gives 22 resolve, 0 phantom. The registry is healthy; what is
missing is anything that keeps it that way. "There are broken exports" would have
been a row that closes itself by accident on the next release.

Exposure: 3 of 8 publishable packages declare 23 export subpaths, none asserted;
two also declare an unbounded `./*`.

Id GT-706 allocated by UNION OF BRANCHES -- 39 remote refs carrying the board, max
GT-705 -- not from the local maximum.

Verified: 08 (704 gaps, 680/680 sections, debt economics 32/32) / 49 / 01 / 04 /
41 / 57 green, 46 at a fixed point, and every board row splits into exactly 9
cells under the parsers' own splitRow in both languages.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: aarroyo <beyondnet.peru@gmail.com>
@beyondnetPeru
beyondnetPeru requested a review from a team as a code owner August 17, 2026 02:56
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@github-actions

Copy link
Copy Markdown

📊 Bilingual Coverage Impact

PR Changes

  • Paired EN/ES files modified: 3
  • New EN files needing ES translation: 0

Repository Coverage

Metric Value
Total EN files 532
Total ES files 502
Paired files 0
Coverage 0%

Good: All EN changes have ES counterparts.


Generated by GitHub Actions

@beyondnetPeru
beyondnetPeru merged commit 5f3531b into develop Aug 17, 2026
32 checks passed
@beyondnetPeru
beyondnetPeru deleted the docs/gt-706-phantom-exports branch August 17, 2026 03:01
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