The beads package in config.org is pinned to a fork (stfl/beads.el, branch fix/emacs31-transient-autoloads) as a temporary workaround.
Why
On Emacs 31, loading beads-autoloads.el fails with:
Symbol's function definition is void: transient-define-prefix
beads and beads-more-menu in lisp/beads.el carry a bare ;;;###autoload cookie on their transient-define-prefix form. Emacs 31 only reduces such a form to an autoload stub when the defining macro opts into (autoload-macro expand) and is fully loaded while autoloads are generated. transient does set that property (commit bda7c2e), but straight.el merely autoloads transient, so loaddefs-generate copies the raw form verbatim.
Loading those autoloads then aborts the entire doom sync during package activation.
Made worse by loaddefs-generate skipping regeneration when the output file is up to date — once a broken autoloads file is written it is reused indefinitely, so the failure survives re-syncs until the file is deleted.
Fix
Upstream PR: r0man/beads.el#66 — emits explicit autoload stubs, matching the idiom beads already uses in beads-command-admin.el, beads-command-migrate.el, beads-command-swarm.el, etc.
Action when the PR merges
- In
config.org, restore the recipe to :host github :repo "r0man/beads.el", drop :branch and :pin, and delete the TEMPORARY FORK comment block.
doom sync — if the void-function error reappears, delete <straight>/build-*/beads/beads-autoloads.el first.
- Delete the fork.
If the PR is rejected, keep the fork or switch to a :pre-build that rewrites the cookies at build time.
Related
typst-ts-mode hits the same Emacs 31 issue via define-compilation-mode (tracked upstream as meow_king/typst-ts-mode#103); it is worked around with a :pre-build in config.org.
The
beadspackage inconfig.orgis pinned to a fork (stfl/beads.el, branchfix/emacs31-transient-autoloads) as a temporary workaround.Why
On Emacs 31, loading
beads-autoloads.elfails with:beadsandbeads-more-menuinlisp/beads.elcarry a bare;;;###autoloadcookie on theirtransient-define-prefixform. Emacs 31 only reduces such a form to an autoload stub when the defining macro opts into(autoload-macro expand)and is fully loaded while autoloads are generated. transient does set that property (commitbda7c2e), but straight.el merely autoloads transient, soloaddefs-generatecopies the raw form verbatim.Loading those autoloads then aborts the entire
doom syncduring package activation.Made worse by
loaddefs-generateskipping regeneration when the output file is up to date — once a broken autoloads file is written it is reused indefinitely, so the failure survives re-syncs until the file is deleted.Fix
Upstream PR: r0man/beads.el#66 — emits explicit autoload stubs, matching the idiom beads already uses in
beads-command-admin.el,beads-command-migrate.el,beads-command-swarm.el, etc.Action when the PR merges
config.org, restore the recipe to:host github :repo "r0man/beads.el", drop:branchand:pin, and delete the TEMPORARY FORK comment block.doom sync— if the void-function error reappears, delete<straight>/build-*/beads/beads-autoloads.elfirst.If the PR is rejected, keep the fork or switch to a
:pre-buildthat rewrites the cookies at build time.Related
typst-ts-modehits the same Emacs 31 issue viadefine-compilation-mode(tracked upstream as meow_king/typst-ts-mode#103); it is worked around with a:pre-buildinconfig.org.