What's blocked
audiocomponents v0.2.0 is the first release of audioinstruments and
audioeffects from their new home (the audioif/audiocomponents split,
audiocomponents#2). The board session repointed pydevices-lock.json on
PyDevices/mip's PyDevices branch to name PyDevices/audiocomponents at
v0.2.0 for both entries (commit f94ef5e9), which is the fix
reusable-synchronize-mip-package.yml's own "Record this release in the
lockfile" step is designed to require.
That was not enough. Both queued publication runs still fail identically,
before and after the lockfile fix and after a rerun of each:
- audioinstruments: run 33814552433 — failure (rerun after the lockfile fix, same result)
- audioeffects: run 33814552790 — failure (rerun after the lockfile fix, same result)
Both fail with:
profile 'audioinstruments' requires PyDevices/audioif, not PyDevices/audiocomponents
##[error]Process completed with exit code 1.
(The audioeffects run hits the same line because "Synchronize every locked
source" iterates every profile in the lockfile, alphabetically, and dies on
audioinstruments first regardless of which profile was actually
dispatched.)
Root cause
This check is not lockfile-driven. scripts/synchronize_mip_package.py
(fetched by reusable-synchronize-mip-package.yml into
.pydevices-publishing-tools, at whatever tag publishing-tools-ref
resolves to — publishing-v6 by default, since PyDevices/mip's
process-mip-publication-request.yml doesn't override it) hardcodes a
second, independent source of truth:
PROFILE_REPOSITORIES = {
"palettes": "PyDevices/palettes",
"pdwidgets": "PyDevices/pdwidgets",
"pygraphics": "PyDevices/pygraphics",
"pydevices": "PyDevices/pydevices",
"audioinstruments": "PyDevices/audioif",
"audioeffects": "PyDevices/audioif",
}
...
expected_repository = PROFILE_REPOSITORIES[args.profile]
if args.source_repository_name != expected_repository:
raise SystemExit(
f"profile {args.profile!r} requires {expected_repository}, "
f"not {args.source_repository_name}"
)
Confirmed identical at both publishing-v6 (mip's coordinator default) and
publishing-v8 (audiocomponents' and audioif's current pin) — this map was
never updated for the split. Publishing tags are immutable by policy, so
neither existing tag can be patched in place.
What's needed
- Update
PROFILE_REPOSITORIES in scripts/synchronize_mip_package.py so
audioinstruments and audioeffects map to PyDevices/audiocomponents
(or, better, derive the expected repository from pydevices-lock.json
itself rather than hardcoding it a second time — the lockfile is already
the source of truth the "Record this release" step writes to, and having
two disagreeing sources of truth is exactly what produced this outage).
- Cut a new publishing tag (e.g.
publishing-v9) carrying the fix, per
publishing-automation.md's own rule that a reusable-workflow contract
change is "an automation rollout, not a package release."
- Update
PyDevices/mip's process-mip-publication-request.yml uses:
pin (currently @publishing-v6) to the new tag.
- Retry the two queued audiocomponents publications
(gh run rerun 33814552433 -R PyDevices/mip,
gh run rerun 33814552790 -R PyDevices/mip, or a fresh manual dispatch
with the same source-repository/source-ref/version/profile) once the new
tag is live.
Current state
As of 2026-09-03 22:56 UTC, the live index still reports 0.1.1 for both
audioinstruments and audioeffects
(https://PyDevices.github.io/mip/package/6/audioinstruments/latest.json,
.../audioeffects/latest.json) — audioif's last publish. TestPyPI already
has both packages at 0.2.0
(https://test.pypi.org/project/pydevices-audioinstruments/0.2.0/,
https://test.pypi.org/project/pydevices-audioeffects/0.2.0/); only the MIP
index is stuck behind this script fix.
Related: #34 (a second, independent release-health race hit by this same
release).
What's blocked
audiocomponents v0.2.0 is the first release of
audioinstrumentsandaudioeffectsfrom their new home (the audioif/audiocomponents split,audiocomponents#2). The board session repointed
pydevices-lock.jsononPyDevices/mip'sPyDevicesbranch to namePyDevices/audiocomponentsatv0.2.0for both entries (commitf94ef5e9), which is the fixreusable-synchronize-mip-package.yml's own "Record this release in thelockfile" step is designed to require.
That was not enough. Both queued publication runs still fail identically,
before and after the lockfile fix and after a rerun of each:
Both fail with:
(The audioeffects run hits the same line because "Synchronize every locked
source" iterates every profile in the lockfile, alphabetically, and dies on
audioinstrumentsfirst regardless of which profile was actuallydispatched.)
Root cause
This check is not lockfile-driven.
scripts/synchronize_mip_package.py(fetched by
reusable-synchronize-mip-package.ymlinto.pydevices-publishing-tools, at whatever tagpublishing-tools-refresolves to —
publishing-v6by default, sincePyDevices/mip'sprocess-mip-publication-request.ymldoesn't override it) hardcodes asecond, independent source of truth:
Confirmed identical at both
publishing-v6(mip's coordinator default) andpublishing-v8(audiocomponents' and audioif's current pin) — this map wasnever updated for the split. Publishing tags are immutable by policy, so
neither existing tag can be patched in place.
What's needed
PROFILE_REPOSITORIESinscripts/synchronize_mip_package.pysoaudioinstrumentsandaudioeffectsmap toPyDevices/audiocomponents(or, better, derive the expected repository from
pydevices-lock.jsonitself rather than hardcoding it a second time — the lockfile is already
the source of truth the "Record this release" step writes to, and having
two disagreeing sources of truth is exactly what produced this outage).
publishing-v9) carrying the fix, perpublishing-automation.md's own rule that a reusable-workflow contract
change is "an automation rollout, not a package release."
PyDevices/mip'sprocess-mip-publication-request.ymluses:pin (currently
@publishing-v6) to the new tag.(
gh run rerun 33814552433 -R PyDevices/mip,gh run rerun 33814552790 -R PyDevices/mip, or a fresh manual dispatchwith the same source-repository/source-ref/version/profile) once the new
tag is live.
Current state
As of 2026-09-03 22:56 UTC, the live index still reports
0.1.1for bothaudioinstrumentsandaudioeffects(https://PyDevices.github.io/mip/package/6/audioinstruments/latest.json,
.../audioeffects/latest.json) — audioif's last publish. TestPyPI already
has both packages at
0.2.0(https://test.pypi.org/project/pydevices-audioinstruments/0.2.0/,
https://test.pypi.org/project/pydevices-audioeffects/0.2.0/); only the MIP
index is stuck behind this script fix.
Related: #34 (a second, independent release-health race hit by this same
release).