I've been banging my head against an issue all day...
# general
g
I've been banging my head against an issue all day long. All of a sudden we can't get pants to generate new lock files for any of our resolves. I re-ran a CI job using an old git sha that worked about 24 hours ago and it doesn't work now. Nothing change in our CI infra and I'm really struggling to understand why pex/pip wasn't compiling sdists and was using the matching wheels and now it seems like it needs to compile certain things it didn't need to before. And it isn't newly released wheels; even packages we have pinned to exact matches for over 2 years are now starting to attempt to do things with the sdist during lockfile generation that has never happened before. We're using CodeArtifact for a pypi repo. Does anyone by chance have any ideas what may be causing this? Even things like psycopg2-binary are trying to compile, it's so weird... I'm lost 😒 pants v2.30.0 (tried updated to latest pants, pex, and pip which didn't help)
Example
Copy code
ERROR: Failed to build '<https://aws>:****@<redacted>.<http://d.codeartifact.us-east-1.amazonaws.com/pypi/altana/simple/psycopg2-binary/2.9.12/psycopg2_binary-2.9.12.tar.gz|d.codeartifact.us-east-1.amazonaws.com/pypi/altana/simple/psycopg2-binary/2.9.12/psycopg2_binary-2.9.12.tar.gz>' when getting requirements to build wheel
b
You can't expect help with so little data. If you can't repro the failure locally, can you at least supply
-ldebug
in CI so we can see command lines? If you can repro locally, you can both provide
__run.sh
- which has the command line and the pex pip download log, both in the retained sandbox dir.
πŸ‘ 1
g
I honestly can't do that without revealing sensitive information, I was just wondering if anyone hit anything themselves in the last 24 hours or so. I'm 100% positive it's external and nothing to do with our monorepo given the nature of my test.
I'll try to reproduce in a small isolated repo though to see if I can. We have over 250 deps and there are so many potential things that could be impacting this.
b
You surely can with redaction effort. Time-sensitive things generally depend on PyPI deps with open bounds.
g
The thing is I don't even want to give away what we're pinned to (3rd party wise). I'm that paranoid πŸ˜΅β€πŸ’«
I'm going to try to create a tiny resolve within our monorepo and see if I can reproduce with a minimal dep set.
b
Ok, you're on your own then.
🫑 1
I mean - have you ever debugged your parents or grandparents computer remotely?
You can't - your blind
g
No, I know this is a crazy ask. It either immediately strikes or chord or it doesn't. I realize this is nuts.
Alright I have a minimum reproducible thing, standby.
Fortunately with you I can bypasss all of the pants craziness and dump the pex command directly~!
That alone eliminates about 1K variables
ooof... it's our fucking CodeArtifact...
b
But - remember - I do not have access to your private indexes and can only assume you have what is on PyPI
g
as soon as I switch to pypi it all works....
oooof.
b
So - then - why sdist?
Because no matching wheel tags
Did you check?
g
I need to compare the pex-pip logs now
b
Did Code Artifact nuke artifacts?
g
I finally have a hope of solving this.
b
I'd personally check that 1st
βœ… 1
🀝 1
So - step back
That should be your 1st thought and check on PyPI
not the nuke bit, but checking there are wheels for your platform.
I say someone didn't pay a bill
🀣 1
g
I've been checking the pip download logs and it's finding matches, but something obviously is off.
I'll let you know!
b
Ok, but you only need look at psycopg2-binary 2.19.12 on Code Artifact. That is ~clearly missing whls you expect it should have (unless you did something crazy like changed your lock config to say no binary and didn't reveal that).
g
@brief-scientist-13682 stupid Claude sent me down that path but it was pretty obvious early on that was a total wild goose chase.
b
Jesus - 0 sympathy for using that stuff. It will make you dumber.
g
lol, 100%
Am I crazy.... look at this πŸ˜΅β€πŸ’« CodeArtifact has Latest on
2.9.9
and NOT
2.9.12
I'm not crazy, right? lol
Copy code
Now the picture is complete and definitive:

- PyPI sandbox β†’ experiment-psycopg2.lock was written (4861 bytes) = SUCCESS
- CodeArtifact sandbox β†’ no lock file = FAILURE

…yet both pex-pip-download.log files end in Would install psycopg2-binary-2.9.12 with zero errors. So the failure happens in the pex universal-lock step that runs after pip download β€” which this log doesn't capture. Let me grab the actual pex error by re-running the CodeArtifact invocation (its token may still be valid β€” the run was earlier today).
b
I know 0 about CodeArtifact so I have no clue what "Latest" means. Clearly the 2.9.12 sdist is available.
g
yes, it is.
b
Ok, so can you actually browse the thing like Pip does (https) and look at the simple index?
What artifacts does it have besides sdist for 2.9.12?
g
I'm comparing with cli now to verify they're identical.
This is happening with 10+ packages, so I doubt it's going to be off but who knows πŸ€·β€β™‚οΈ
The only delta I can find is pypi.org serves PEP-658 and CodeArtifact does not.
b
Well if you have the pex pip logs and can provide all the lines for just psycopg2-binary, I could give a second pair of eyes. That would reveal no new info to me. I already know you use psycopg2-binary 2.9.12
Um 2.9.12 or 2.19.12 ?
2.9.12 ... confusing because latest pypi is numerically similar 2.19.12
g
2.9.12
b
Ok, that's me self-confused. QUestion stands aout log lines.
g
Yep, the actual pip download logs are identical, with the exception of the URL that artifacts are being fetched from.
Copy code
The two pex-pip-download.log files are essentially identical β€” that's the trap

I diffed them every way that matters. For psycopg2-binary, both logs succeed the same way:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                         β”‚        CodeArtifact (j7VyQZ)         β”‚            PyPI (JhtdIw)             β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Versions offered        β”‚ 2.7.x–2.9.12 (identical)             β”‚ 2.7.x–2.9.12 (identical)             β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ cp312 wheels for 2.9.12 β”‚ identical 11 wheels                  β”‚ identical 11 wheels                  β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Resolved                β”‚ psycopg2-binary 2.9.12               β”‚ psycopg2-binary 2.9.12               β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Last line               β”‚ Would install psycopg2-binary-2.9.12 β”‚ Would install psycopg2-binary-2.9.12 β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ error/warning markers   β”‚ 0                                    β”‚ 0                                    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

The one real difference in the logs: PyPI serves PEP 658 metadata sidecars, so pip fetches a 4.9 kB ...whl.metadata file (Obtaining dependency information ... 5 .metadata refs). CodeArtifact advertises no PEP 658 metadata (0 .metadata refs), so pip downloads the full 3.4 MB wheel to read its metadata. That's a symptom, not the cause.

The actual failure isn't in this log at all

pex-pip-download.log only captures pip's resolve sub-step. The lock failure happens in the next pex step, which your full -ldebug run shows plainly:

- PyPI β†’ Wrote lockfile ... experiment-psycopg2.lock βœ… (I confirmed the file exists in that sandbox; j7VyQZ has no lock)
- CodeArtifact β†’ ProcessExecutionFailure: 'Generate lockfile for experiment-psycopg2' failed with exit code 1, at pex's fingerprint_artifact step:

pip download --no-deps  .../psycopg2-binary/2.9.12/psycopg2_binary-2.9.12.tar.gz   ← the SDIST
  Γ— python setup.py egg_info did not run successfully.
    Error: pg_config executable not found.
    pg_config is required to build psycopg2 from source.
  error: metadata-generation-failed

I re-ran the CodeArtifact __run.sh and reproduced this exactly β€” so it's not a stale-token fluke.

Why the sdist gets built against CodeArtifact but not PyPI

A --style=universal lock records every artifact of the locked version β€” including the .tar.gz sdist β€” each with a sha256. The successful PyPI lock proves it (the sdist is recorded with hash 5ac9444… next to all the wheel hashes).

- PyPI hands pex the per-file hashes + PEP 658 core-metadata inline in the Simple API, so pex records the sdist's hash without ever downloading it.
- CodeArtifact exposes neither (the same deficiency you see as "no .metadata" in the download log), so pex is forced to download the sdist to fingerprint it β€” and pip download of an sdist runs its setup.py, which needs pg_config (libpq dev headers), absent on the lock host β†’ the whole lock dies.

So: "besides the index URL" the download logs genuinely differ in nothing that fails β€” the divergence is that CodeArtifact's index is not hash/PEP‑658‑complete, and that gap only bites downstream, on the sdist fingerprint.

Fix

Stop pex from fingerprinting/building the sdist β€” same knob that resolved the DX‑2101/DX‑2128 lockfile-gen outage:

[python]
resolves_to_only_binary = { experiment-psycopg2 = [":all:"] }   # or = ["psycopg2-binary"]

With only-binary, the sdist isn't a lock candidate, nothing gets built, and it locks against CodeArtifact. (Installing pg_config on the lock host would also "work" but is the wrong fix for a binary-wheel package.) I saw you're already in pants.toml β€” that's the line.
Copy code
Confirmed β€” and I verified it against the actual version, not the clone's HEAD.

First, the version check: your clone was on v2.97.3, but the pex that Pants 2.30.0 actually ran is 2.66.0 β€” from the sandbox ./pex itself:
- PEX-INFO β†’ "build_properties":{"pex_version":"2.66.0"}
- .deps/pex-2.66.0-py2.py3-none-any.whl/pex/version.py β†’ __version__ = "2.66.0"

I checked out v2.66.0 in ~/pex and re-read the code (it's verbatim identical to 2.97.3, same line numbers). Your suspicion is exactly right. The chain:

1. Fingerprint comes from the index link's #sha256= fragment β€” pex/artifact_url.py:208-223:
fragment_parameters = parse_qs(url_info.fragment)
if fragment_parameters:
    # Artifact URLs from indexes may contain pre-computed hashes. We isolate those here...
    # See: <https://peps.python.org/pep-0503/#specification>
    for alg in RANKED_ALGORITHMS:
        hashes = fragment_parameters.pop(alg, None)
        ...
        fingerprints.append(Fingerprint(algorithm=alg, hash=hashes[0]))
…and pex/artifact_url.py:268-270:
def fingerprint(self):
    return self.fingerprints[0] if self.fingerprints else None   # no #sha256= β†’ None

2. That flows straight into the artifact β€” pex/resolve/locker.py:288:
partial_artifact = PartialArtifact(artifact_url, fingerprint=artifact_url.fingerprint)

3. The decision to download β€” pex/resolve/downloads.py:141-149:
def _to_file_artifact(self, artifact):
    fingerprint = artifact.fingerprint
    if fingerprint:                                # index gave a hash β†’ done, no download
        return SpawnedJob.completed(self._create_file_artifact(url, fingerprint, ...))
    return self._download_and_fingerprint(url)     # no hash β†’ must download to hash it

4. Download-to-fingerprint runs pip on the artifact β€” downloads.py:117-139 β†’ _download (109-115):
download_dir = safe_mkdtemp(prefix="fingerprint_artifact.", ...)   # ← your temp dir
...
return self.pip.spawn_download_distributions(requirements=[download_url], transitive=False, ...)
For a .tar.gz sdist, pip download prepares metadata (setup.py egg_info) β†’ psycopg2 needs pg_config β†’ metadata-generation-failed.

So it's precisely as suspected: PyPI puts #sha256= on every link, so fingerprint is set and pex never touches the sdist. CodeArtifact's Simple API serves those links without a usable hash fragment, so fingerprint is None, pex hits the else branch, downloads the sdist to hash it, and that download triggers the source build that dies on pg_config.

The extra confirmation the source gives: under --style=universal the sdist is always recorded as a fallback artifact even though a wheel was selected β€” which is why it gets fingerprinted at all, and why any package with a build-requiring sdist breaks against CodeArtifact (matching adbc/ddtrace from the earlier outage). resolves_to_only_binary drops the sdist from the artifact set, so there's nothing to fingerprint.
b
Yep, the actual pip download logs are identical,
Cannot be true since you claim prior to incident sdist was not built.
If the logs are identical and PyPI selects wheel,
g
As far as I know they weren't built before today (I could be wrong). We've had a few packages pinned to identical versions for nearly 2 years and today 10+ packages popped with all sorts of different sdist building errors, i.e. missing rust tools, missing libs, etc.
b
Is the above BS Claude?
🫒 1
πŸ‘ 1
Well its lying
g
cool, that's excellent.
b
Seriously - that is not helping you
🫠 1
Ok, alot to read there. This is probably true:
Copy code
So it's precisely as suspected: PyPI puts #sha256= on every link, so fingerprint is set and pex never touches the sdist. CodeArtifact's Simple API serves those links without a usable hash fragment, so fingerprint is None, pex hits the else branch, downloads the sdist to hash it, and that download triggers the source build that dies on pg_config.
The implication being - did CodeArtifact drop hashes yesterday? But let me confirm Claude here...
g
Yeah, I am opening a support request with AWS. They don't maintain any public facing changelogs for their services. The last publicly posted change for CodeArtifact was back in 2024 🫠
Well thanks for the look. I doubt it's pants or pex or anything in our source code honestly. I've confirmed that by re-running a once passing git sha build and it's now failing to re-lock in that build that once passed using the identical git commit sha.
@brief-scientist-13682 one last question: using
[python.resolves_to_only_binary]
is almost certainly wrong here, correct? We haven't used that in 2 years of using pants so I wouldn't expect it all of a sudden, but I just wanted to ask πŸ˜„
b
You can use it as a debugging tool certainly.
Say only wheels for psycopg2-binary and see what new error you get - should no longer be sdist. @gentle-flower-25372 do you have any news on all this?
g
[python.resolves_to_only_binary]
"fixes" it but it also dramatically explodes the amount of time the resolver takes.
@brief-scientist-13682 confirmation it's CodeArtifact, but I don't know why the introduction of the PEP 691 JSON Simple Repository API would alter how PIP/PEX create the lockfile causing it to compile the sdists versus using the found/matched wheels like it did before CodeArtifact released this new feature. You don't happen to have a hunch as to why that would alter PEX behavior, do you? > CodeArtifact enabled the PEP 691 JSON Simple Repository API on July 16, 2026 across all regions.
I'm writing a proxy to change the Accept header that pip sends to validate the theory that the Code Artifact introduction of PEP 691 JSON Simple Repository API changes the lock behavior. More importantly, if it does work, I'll dive into why.
@brief-scientist-13682 before you read this. I'm still validating this LLM stuff, but given it could verify it with it's own harness I think it's likely pretty good/close.
@brief-scientist-13682 β€” proxy experiment done, theory confirmed, and I now have the full mechanism. Everything below is verifiable against pex source; line numbers are v2.66.0 (the relevant files are unchanged through 2.98.2 β€” 2.93.3/.4 only added FIPS guards β€” and I reproduced on 2.98.2 too).
1. The trigger, proven by A/B. I put a ~40-line localhost proxy in front of our CodeArtifact repo that rewrites pip's
Accept
header to
text/html
on simple-index pages and passes everything else through. Same pex 2.66.0, same pip 24.2, same repo,
--style universal
, `psycopg2-binary==2.9.12`:
β€’ direct (pip negotiates PEP 691 JSON since the rollout) β†’
metadata-generation-failed: pg_config executable not found
β€’ through the proxy (forced PEP 503 HTML) β†’ lock succeeds, sdist recorded with sha256, and pex's
downloads/
dir is empty β€” zero fingerprint downloads
So nothing was nuked and no hashes were dropped: CodeArtifact's HTML still carries
#sha256=
fragments on every link (why it worked for 2 years, and why forcing HTML works today). What changed is which format pip receives β€” pip β‰₯22.2 always sends
Accept: application/vnd.pypi.simple.v1+json, …+html;q=0.1, text/html;q=0.01
, and CodeArtifact only just started honoring it. There's no pip flag to turn that off; the header is hardcoded in
_get_simple_response
.
2. Why JSON flips pex into download-everything mode. Per PEP 691 the JSON
url
carries no hash fragment β€” hashes move to the per-file
hashes
object. So
ArtifactURL.fingerprint
is None for every artifact and
_to_file_artifact
falls into
_download_and_fingerprint
, exactly as you suspected. (This also reconciles the "identical pip logs" confusion: the resolve step picks the wheel in both eras and never touches the sdist β€” the sdist build happens in the separate per-artifact
pip download --no-deps <sdist-url>
fingerprint invocations afterwards.)
But pex has machinery for this case:
Locker
records PEP-691-capable endpoints by scraping pip's
Fetched page <url> as application/vnd.pypi.simple.v1+json
log lines (locker.py:531-537), then
FingerprintService.fingerprint(endpoints=…)
(locker.py:641) re-queries the JSON API for the
hashes
dicts before any download fallback.
3. The actual pex bug: that FingerprintService can't authenticate to CodeArtifact β€” two independent ways.
β€’ (a) It inherits pip's log redaction. Our index URL carries basic auth (
<https://aws|aws>:<token>@<domain>-<acct>.d.codeartifact.<region>.<http://amazonaws.com/pypi/|amazonaws.com/pypi/><repo>/simple
). pip logs page URLs through
redact_auth_from_url
, so the endpoint pex scrapes literally contains
aws:****
. With `PEX_VERBOSE=3`:
pex: Fetching PEP-691 index metadata from <https://aws|aws>:****@<host>/pypi/<repo>/simple/<project>/ for application/vnd.pypi.simple.v1+json
β†’ it authenticates with the literal password
****
β†’ 401.
β€’ (b) Even with a clean endpoint URL and creds available (netrc; and create.py:304-308 does wire
password_entries
into the service's URLFetcher), urllib can't complete the request: CodeArtifact answers 401 with
WWW-Authenticate: Bearer
, and urllib raises
ValueError: AbstractDigestAuthHandler does not support the following scheme: 'Bearer'
Repro is one line:
URLFetcher().get_body_stream("https://<host>/pypi/<repo>/simple/<project>/")
with creds in
~/.netrc
. Looks like the same family as #1803/#1811, still alive on this path.
β€’ Every failure is swallowed by
catch(self._api.request, endpoint)
(fingerprint_service.py:132-134), so the service degrades silently to download+fingerprint for all artifacts. That silence is what made this so hard to diagnose.
4. Why the blast radius was "everything, at once". Universal locks record the sdist as a fallback artifact for ~every project. Pre-rollout, all of them were fingerprinted for free off HTML fragments; post-rollout, every one gets downloaded, and pip β‰₯22 runs PEP-517 metadata prep on each β€” so any sdist that can't build on the lock host kills the whole lock: pg_config for psycopg2-binary, missing rust/native toolchains for others, and old `setup.py`s doing
import pkg_resources
, which is freshly fatal because build isolation installs latest setuptools and β‰₯81 removed pkg_resources. Two-year-old pins "suddenly compiling" was never about the pins.
5. Asks. Would you take an issue (I'll file it with full token-redacted PEX_VERBOSE traces) for:
1. re-attaching known credentials from the PasswordDatabase to scraped PEP-691 endpoints instead of the redacted
****
userinfo,
2. tolerating
WWW-Authenticate: Bearer
on 401 (fall back to Basic when creds are known),
3. a warning instead of a silent download fallback when every PEP-691 fingerprint request fails?
Fixing those would make pex lock creation zero-download against CodeArtifact JSON again. Happy to test patches against our repo. Meanwhile we're unblocked via the Accept-rewrite proxy for regens,
PIP_CONSTRAINT=setuptools<81
threaded through
_PEX_USE_PIP_CONFIG=true
, and
resolves_to_only_binary
for the never-buildable sdists β€” and credit where due: only_binary as a debugging tool is what isolated the sdist path.
@brief-scientist-13682 I confirmed that the patch corrects the issue. We can now generate lock files like we could before CodeArtifact introduced PEP-691 endpoints. github.com/pex-tool/pex/pull/3225
I hope the PR and Issue give you enough details. You might think the code is shit, and probably is, but hopefully at the very least the bug is communicated in a way you can grok. We are running off of a fork of pex in our monorepo at the moment and lock creation has bee restored. https://github.com/altana-ai/pex/releases#release-v2.66.0-altana.1
b
To close this loop, the fix is released in https://github.com/pex-tool/pex/releases/tag/v2.98.5 @gentle-flower-25372 did the legwork to narrow this down as explained above and I set up my own AWS CodeArtifact instance to whittle it down more. Thanks for helping me hammer this out @gentle-flower-25372.
❀️ 1