diff options
| author | Craig Jennings <c@cjennings.net> | 2026-05-24 16:57:56 -0500 |
|---|---|---|
| committer | Craig Jennings <c@cjennings.net> | 2026-05-24 16:57:56 -0500 |
| commit | cad351ec00c3f78cfb6e203d87c7309a620e485c (patch) | |
| tree | a3698e1e1c83269a437efa350024eb35246e08a1 | |
| parent | 02baa68063f02cc571789c03b1101c28d139200d (diff) | |
| download | dotemacs-cad351ec00c3f78cfb6e203d87c7309a620e485c.tar.gz dotemacs-cad351ec00c3f78cfb6e203d87c7309a620e485c.zip | |
docs(load-graph): classify domain, integration, and optional modules
Eighth classification batch: 17 domain/integration/optional modules — ai-config, ai-vterm, browser-config, calendar-sync, calibredb-epub-config, chrono-tools, dirvish-config, dwim-shell-config, erc-config, eshell-config, eww-config, flyspell-and-abbrev, games-config, gloss-config, httpd-config, jumper, latex-config. I annotated each header, added a Batch 8 table to the inventory, and extended the validation allowlist. 82 of 102 modules are now classified.
Almost all are eager only by init order and become command/hook/mode-loaded. calendar-sync stays eager when its .local.el is present. One new hidden dependency: calendar-sync guards its C-; g registration with a boundp shim and doesn't require keybindings, so the binding drops standalone.
I deferred elfeed-config rather than annotate it. Its header edit triggers byte-compilation, and the existing tests only pass when the module loads as interpreted source — the compiled cj/elfeed-process-entries inlines an elfeed struct accessor the stubs can't intercept, and the batch test environment has no elfeed package to build real structs. It needs its tests rewritten first, recorded in the inventory and a new todo task.
Also made the header allowlist scoping test durable: it used games-config (now classified) as its unclassified example; switched to a sentinel name plus a duplicate-entry guard.
| -rw-r--r-- | docs/design/module-inventory.org | 66 | ||||
| -rw-r--r-- | modules/ai-config.el | 10 | ||||
| -rw-r--r-- | modules/ai-vterm.el | 12 | ||||
| -rw-r--r-- | modules/browser-config.el | 10 | ||||
| -rw-r--r-- | modules/calendar-sync.el | 16 | ||||
| -rw-r--r-- | modules/calibredb-epub-config.el | 11 | ||||
| -rw-r--r-- | modules/chrono-tools.el | 9 | ||||
| -rw-r--r-- | modules/dirvish-config.el | 11 | ||||
| -rw-r--r-- | modules/dwim-shell-config.el | 9 | ||||
| -rw-r--r-- | modules/erc-config.el | 10 | ||||
| -rw-r--r-- | modules/eshell-config.el | 10 | ||||
| -rw-r--r-- | modules/eww-config.el | 8 | ||||
| -rw-r--r-- | modules/flyspell-and-abbrev.el | 10 | ||||
| -rw-r--r-- | modules/games-config.el | 8 | ||||
| -rw-r--r-- | modules/gloss-config.el | 9 | ||||
| -rw-r--r-- | modules/httpd-config.el | 10 | ||||
| -rw-r--r-- | modules/jumper.el | 10 | ||||
| -rw-r--r-- | modules/latex-config.el | 8 | ||||
| -rw-r--r-- | tests/test-init-module-headers.el | 33 | ||||
| -rw-r--r-- | todo.org | 3 |
20 files changed, 240 insertions, 33 deletions
diff --git a/docs/design/module-inventory.org b/docs/design/module-inventory.org index aa6d3c1f..519839f4 100644 --- a/docs/design/module-inventory.org +++ b/docs/design/module-inventory.org @@ -30,7 +30,8 @@ This inventory is independent from the helper inventory owned by - Batch 5 (Dev entry-points, diff, help, lint, VC, Layer 2): classified. 9 modules. - Batch 6 (Programming modules, Layer 2-4): classified. 10 modules. - Batch 7 (Org modules, Layer 3-4): classified. 13 modules. -- 65 of 102 modules classified. +- Batch 8 (Domain / integration / optional modules, Layer 2-4): classified. 17 modules. +- 82 of 102 modules classified. (elfeed-config deferred — see Pending classification.) - No load-order changes have been made; =init.el= keeps its current eager order. * Legend @@ -180,6 +181,33 @@ and refile idle-timer caches are the side effects the spec tracks separately. | =org-webclipper= | 4 | O/D/P | eager | command | none | org-protocol handler | yes | | =hugo-config= | 3 | D/P | eager | command | user-constants, host-environment | package config | yes | +** Batch 8 — Domain / integration / optional modules (Layer 2-4) + +AI, browser, calendar, ebook, file-manager, shell, IRC, web, games, and other +domain workflows. Almost all are eager only by init order and become command-, +hook-, or mode-loaded. calendar-sync stays eager when its .local.el is present. +flyspell-and-abbrev is the one Core-UX member (text-mode hooks). + +| Module | Layer | Cat | Current | Target | Runtime requires | Top-level side effects | Direct load | +|--------+-------+-----+---------+--------+------------------+------------------------+-------------| +| =ai-config= | 3 | D/P | eager | command | keybindings, system-lib | cj/ai-keymap under cj/custom-keymap | yes | +| =ai-vterm= | 3 | D | eager | command | cl-lib, seq, cj-window-geometry-lib, cj-window-toggle-lib, host-environment | 4 global keys | yes | +| =browser-config= | 3 | D/P | eager | command | cl-lib | 1 global key | yes | +| =calendar-sync= | 3 | D/S | eager (.local.el) | eager (.local.el) | cl-lib, subr-x, system-lib, cj-org-text-lib | calendar keymap (boundp-guarded), guarded timer/network | conditional | +| =calibredb-epub-config= | 4 | O/D/P | eager | command | user-constants, subr-x | add-hook, advice-add, package config | yes | +| =chrono-tools= | 3 | D/P | eager | command | user-constants | package config | yes | +| =dirvish-config= | 3 | D/P | eager | command | user-constants, system-utils, host-environment, system-lib, external-open-lib | 3 add-hook, package config | yes | +| =dwim-shell-config= | 3 | D/P | eager | command | cl-lib | package config | yes | +| =erc-config= | 4 | O/D/P | eager | command | cl-lib, keybindings | ERC keymap under cj/custom-keymap | yes | +| =eshell-config= | 3 | D/P | eager | command | system-utils | add-hook, advice-add, package config | yes | +| =eww-config= | 3 | D/P | eager | command | cl-lib | package config | yes | +| =flyspell-and-abbrev= | 2 | C/P | eager | hook | cl-lib | mode-hook package config | yes | +| =games-config= | 4 | O | eager | command | none | package config | yes | +| =gloss-config= | 4 | O/D/P | eager | command | none | package config | yes | +| =httpd-config= | 4 | O/D/P | eager | command | none | package config | yes | +| =jumper= | 4 | O/L | eager | command | cl-lib | jumper keymap | yes | +| =latex-config= | 3 | D/P | eager | mode | none | package config | yes | + * Hidden dependencies found Discoveries that belong to Phase 2 (make dependencies explicit). Recorded here, @@ -205,33 +233,33 @@ not fixed here. - =flycheck-config= binds =(:map cj/custom-keymap ...)= through use-package but does not require keybindings, so the binding fails when the module loads standalone. Phase 2 fix: require keybindings (or move to the registration API). +- =calendar-sync= guards its =C-; g= registration with =(when (boundp + 'cj/custom-keymap) ...)= and does not require keybindings, so the binding + silently drops standalone. Same boundp-shim pattern. Phase 2/3 fix. + +* Deferred classification + +- =elfeed-config= is read and understood (Layer 4, O/D/P, command-loaded; runtime + requires user-constants, system-lib, media-utils) but its header is not yet + annotated. Annotating triggers the PostToolUse byte-compile, and its tests + (=tests/test-elfeed-config-helpers.el=) only pass when elfeed-config loads as + interpreted source: the byte-compiled =cj/elfeed-process-entries= inlines the + =elfeed-entry-link= struct accessor, so the tests' function stubs are bypassed + and the inlined accessor type-checks a real =elfeed-entry=. The batch test + environment has no elfeed package on the load-path, so the tests cannot build + real structs either. Classifying elfeed-config needs that test rewritten first + (define a stand-in =elfeed-entry= struct, or make elfeed loadable in batch). + Tracked as a todo task. * Pending classification -The remaining 37 modules required by =init.el=, awaiting per-module inspection. +The remaining 20 modules required by =init.el=, awaiting per-module inspection. Each batch reads these against their source and moves them into [[*Classified modules][Classified modules]] with a load-graph header. Suggested batch order follows the spec: text/editing command modules, then UI, then programming, then Org, then optional integrations. -- [ ] ai-config -- [ ] ai-vterm -- [ ] browser-config -- [ ] calendar-sync -- [ ] calibredb-epub-config -- [ ] chrono-tools -- [ ] dirvish-config -- [ ] dwim-shell-config - [ ] elfeed-config -- [ ] erc-config -- [ ] eshell-config -- [ ] eww-config -- [ ] flyspell-and-abbrev -- [ ] games-config -- [ ] gloss-config -- [ ] httpd-config -- [ ] jumper -- [ ] latex-config - [ ] linear-config - [ ] local-repository - [ ] lorem-optimum diff --git a/modules/ai-config.el b/modules/ai-config.el index fad43584..e2a71fed 100644 --- a/modules/ai-config.el +++ b/modules/ai-config.el @@ -2,6 +2,16 @@ ;; author Craig Jennings <c@cjennings.net> ;; ;;; Commentary: +;; +;; Layer: 3 (Domain Workflow). +;; Category: D/P. +;; Load shape: eager. +;; Eager reason: registers the cj/ai-keymap (C-; a); GPTel itself should load on +;; command, a Phase 5 deferral candidate. +;; Top-level side effects: defines cj/ai-keymap, registers it under cj/custom-keymap. +;; Runtime requires: keybindings, system-lib. +;; Direct test load: yes (requires keybindings explicitly). +;; ;; Configuration for AI integrations in Emacs, focused on GPTel. ;; ;; Main Features: diff --git a/modules/ai-vterm.el b/modules/ai-vterm.el index 4306db9a..60d0c7f3 100644 --- a/modules/ai-vterm.el +++ b/modules/ai-vterm.el @@ -3,7 +3,17 @@ ;; Author: Craig Jennings <c@cjennings.net> ;;; Commentary: - +;; +;; Layer: 3 (Domain Workflow). +;; Category: D. +;; Load shape: eager. +;; Eager reason: registers four global keys for the AI-agent vterm launcher; a +;; command-loaded deferral candidate. +;; Top-level side effects: four global key bindings. +;; Runtime requires: cl-lib, seq, cj-window-geometry-lib, cj-window-toggle-lib, +;; host-environment. +;; Direct test load: yes. +;; ;; Picks an AI-agent project (a dir under ~/.emacs.d, ~/code/*, or ;; ~/projects/* containing .ai/protocols.org), opens or reuses a vterm ;; buffer named "agent [<basename>]", sends the agent's startup diff --git a/modules/browser-config.el b/modules/browser-config.el index 52c3b8a6..4a2c5462 100644 --- a/modules/browser-config.el +++ b/modules/browser-config.el @@ -2,6 +2,16 @@ ;; author: Craig Jennings <c@cjennings.net> ;;; Commentary: +;; +;; Layer: 3 (Domain Workflow). +;; Category: D/P. +;; Load shape: eager. +;; Eager reason: registers one browser-selection key; a command-loaded deferral +;; candidate. +;; Top-level side effects: one global key binding. +;; Runtime requires: cl-lib. +;; Direct test load: yes. +;; ;; This module provides browser selection and configuration for Emacs. ;; It automatically discovers available browsers on the system, allows the user ;; to choose their preferred browser via completing-read, and persists the choice diff --git a/modules/calendar-sync.el b/modules/calendar-sync.el index 4ccb0917..4d1ea219 100644 --- a/modules/calendar-sync.el +++ b/modules/calendar-sync.el @@ -4,7 +4,21 @@ ;; Created: 2025-11-16 ;;; Commentary: - +;; +;; Layer: 3 (Domain Workflow). +;; Category: D/S. +;; Load shape: eager only when calendar-sync.local.el configures calendars. +;; Eager reason: daily-driver workflow; calendars are expected synced at the +;; first session. Timers and network fetches are guarded for batch/test loads. +;; Top-level side effects: defines a calendar keymap and conditionally registers +;; it under cj/custom-keymap; timer and network fetches guarded by +;; config/noninteractive checks. +;; Runtime requires: cl-lib, subr-x, system-lib, cj-org-text-lib. keybindings is +;; needed for the C-; g binding but only reached through a boundp guard, so the +;; binding silently drops standalone. Phase 2 fix. +;; Direct test load: conditional (C-; g registration skipped without keybindings; +;; private config optional). +;; ;; Simple, reliable one-way sync from multiple calendars to Org mode. ;; Downloads .ics files from calendar URLs (Google, Proton, etc.) and ;; converts to Org format. No OAuth, no API complexity, just file conversion. diff --git a/modules/calibredb-epub-config.el b/modules/calibredb-epub-config.el index 45a0b79a..4243e509 100644 --- a/modules/calibredb-epub-config.el +++ b/modules/calibredb-epub-config.el @@ -2,7 +2,16 @@ ;; author Craig Jennings <c@cjennings.net> ;;; Commentary: - +;; +;; Layer: 4 (Optional). +;; Category: O/D/P. +;; Load shape: eager. +;; Eager reason: none; optional ebook workflow, a command-loaded deferral +;; candidate for Phase 4. +;; Top-level side effects: one add-hook, one advice-add, package config. +;; Runtime requires: user-constants, subr-x. +;; Direct test load: yes. +;; ;; This module provides a comprehensive ebook management and reading experience ;; within Emacs, integrating CalibreDB for library management and Nov for EPUB ;; reading. diff --git a/modules/chrono-tools.el b/modules/chrono-tools.el index 33f2b11e..9ccba667 100644 --- a/modules/chrono-tools.el +++ b/modules/chrono-tools.el @@ -3,6 +3,15 @@ ;; ;;; Commentary: ;; +;; Layer: 3 (Domain Workflow). +;; Category: D/P. +;; Load shape: eager. +;; Eager reason: none; calendar/timer commands, a command-loaded deferral +;; candidate. +;; Top-level side effects: package configuration via use-package. +;; Runtime requires: user-constants. +;; Direct test load: yes. +;; ;; This module centralizes configuration for Emacs time-related tools: ;; ;; – time-zones: interactive world clock with fuzzy search and time shifting diff --git a/modules/dirvish-config.el b/modules/dirvish-config.el index 8fe5c7b8..9e50bbc0 100644 --- a/modules/dirvish-config.el +++ b/modules/dirvish-config.el @@ -2,7 +2,16 @@ ;; author: Craig Jennings <c@cjennings.net> ;;; Commentary: - +;; +;; Layer: 3 (Domain Workflow). +;; Category: D/P. +;; Load shape: eager. +;; Eager reason: none; file manager, a command/hook-loaded deferral candidate. +;; Top-level side effects: three add-hook, package configuration via use-package. +;; Runtime requires: user-constants, system-utils, host-environment, system-lib, +;; external-open-lib. +;; Direct test load: yes. +;; ;; Enhanced file management via Dirvish (modern dired replacement) with icons, ;; previews, and quick access directories (press 'g'). Includes utilities for ;; ediff, playlist creation, path copying, and external file manager integration. diff --git a/modules/dwim-shell-config.el b/modules/dwim-shell-config.el index 046a7e63..83f1d4a2 100644 --- a/modules/dwim-shell-config.el +++ b/modules/dwim-shell-config.el @@ -2,6 +2,15 @@ ;; ;;; Commentary: ;; +;; Layer: 3 (Domain Workflow). +;; Category: D/P. +;; Load shape: eager. +;; Eager reason: none; Dired/Dirvish shell commands, a command-loaded deferral +;; candidate. +;; Top-level side effects: package configuration via use-package. +;; Runtime requires: cl-lib. +;; Direct test load: yes. +;; ;; This module provides a collection of DWIM (Do What I Mean) shell commands ;; for common file operations in Dired and other buffers. It leverages the ;; `dwim-shell-command' package to execute shell commands on marked files diff --git a/modules/erc-config.el b/modules/erc-config.el index 76e7e74e..e63b12eb 100644 --- a/modules/erc-config.el +++ b/modules/erc-config.el @@ -3,6 +3,16 @@ ;; ;;; Commentary: ;; +;; Layer: 4 (Optional). +;; Category: O/D/P. +;; Load shape: eager. +;; Eager reason: none; IRC should not be a startup load, a command-loaded +;; deferral candidate for Phase 5. +;; Top-level side effects: defines an ERC keymap, registers it under +;; cj/custom-keymap, package configuration via use-package. +;; Runtime requires: cl-lib, keybindings. +;; Direct test load: yes (requires keybindings explicitly). +;; ;; Enhanced ERC configuration with multi-server support. ;; ;; Main keybindings: diff --git a/modules/eshell-config.el b/modules/eshell-config.el index 4d180d1c..64bc88c6 100644 --- a/modules/eshell-config.el +++ b/modules/eshell-config.el @@ -2,7 +2,15 @@ ;; author Craig Jennings <c@cjennings.net> ;;; Commentary: - +;; +;; Layer: 3 (Domain Workflow). +;; Category: D/P. +;; Load shape: eager. +;; Eager reason: none; shell/REPL, a command/hook-loaded deferral candidate. +;; Top-level side effects: one add-hook, one advice-add, package config. +;; Runtime requires: system-utils. +;; Direct test load: yes. +;; ;; ESHELL ;; - Eshell is useful as a REPL ;; - Redirect to the kill ring : ls > /dev/kill diff --git a/modules/eww-config.el b/modules/eww-config.el index 16a1f5eb..066fae98 100644 --- a/modules/eww-config.el +++ b/modules/eww-config.el @@ -3,6 +3,14 @@ ;; ;;; Commentary: ;; +;; Layer: 3 (Domain Workflow). +;; Category: D/P. +;; Load shape: eager. +;; Eager reason: none; web-browsing helpers, a command-loaded deferral candidate. +;; Top-level side effects: package configuration via use-package. +;; Runtime requires: cl-lib. +;; Direct test load: yes. +;; ;; This module provides a minimal, privacy-focused browsing experience with: ;; - Simplified navigation keybindings (< and > for back/forward) ;; - Quick URL copying to clipboard diff --git a/modules/flyspell-and-abbrev.el b/modules/flyspell-and-abbrev.el index e732ac46..376a9dc5 100644 --- a/modules/flyspell-and-abbrev.el +++ b/modules/flyspell-and-abbrev.el @@ -2,7 +2,15 @@ ;; author Craig Jennings <c@cjennings.net> ;;; Commentary: - +;; +;; Layer: 2 (Core UX). +;; Category: C/P. +;; Load shape: eager. +;; Eager reason: text-mode spelling and abbrev hooks; spec target is hook-loaded. +;; Top-level side effects: package configuration via use-package (mode hooks). +;; Runtime requires: cl-lib. +;; Direct test load: yes. +;; ;; WORKFLOW: ;; This module provides intelligent spell checking with automatic abbreviation ;; creation to prevent repeated misspellings. diff --git a/modules/games-config.el b/modules/games-config.el index e0c512ef..9aa59816 100644 --- a/modules/games-config.el +++ b/modules/games-config.el @@ -3,6 +3,14 @@ ;; ;;; Commentary: ;; +;; Layer: 4 (Optional). +;; Category: O. +;; Load shape: eager. +;; Eager reason: none; optional games, a command-loaded deferral candidate. +;; Top-level side effects: package configuration via use-package. +;; Runtime requires: none. +;; Direct test load: yes. +;; ;; Configuration for game packages. ;; ;; - Malyon for playing interactive fiction and text adventures in Z-machine format diff --git a/modules/gloss-config.el b/modules/gloss-config.el index 63b3c8d2..8afe44d4 100644 --- a/modules/gloss-config.el +++ b/modules/gloss-config.el @@ -3,6 +3,15 @@ ;;; Commentary: ;; +;; Layer: 4 (Optional). +;; Category: O/D/P. +;; Load shape: eager. +;; Eager reason: none; optional glossary workflow (v1 shakedown), a command-loaded +;; deferral candidate. +;; Top-level side effects: package configuration via use-package. +;; Runtime requires: none. +;; Direct test load: yes. +;; ;; gloss — Glossary Lookup with Online-Sourced Selection. ;; ;; Personal glossary on `C-h g'. Looks up terms in a single git-tracked diff --git a/modules/httpd-config.el b/modules/httpd-config.el index ac1f7a0f..c9039942 100644 --- a/modules/httpd-config.el +++ b/modules/httpd-config.el @@ -2,7 +2,15 @@ ;; author Craig Jennings <c@cjennings.net> ;;; Commentary: - +;; +;; Layer: 4 (Optional). +;; Category: O/D/P. +;; Load shape: eager. +;; Eager reason: none; local web server, a command-loaded deferral candidate. +;; Top-level side effects: package configuration via use-package. +;; Runtime requires: none. +;; Direct test load: yes. +;; ;;; Code: diff --git a/modules/jumper.el b/modules/jumper.el index 67d930aa..8941d508 100644 --- a/modules/jumper.el +++ b/modules/jumper.el @@ -7,7 +7,15 @@ ;; URL: https://github.com/cjennings/jumper ;;; Commentary: - +;; +;; Layer: 4 (Optional). +;; Category: O/L. +;; Load shape: eager. +;; Eager reason: none; navigation helper, a command-loaded deferral candidate. +;; Top-level side effects: defines a jumper keymap. +;; Runtime requires: cl-lib. +;; Direct test load: yes. +;; ;; Jumper provides a simple way to store and jump between locations ;; in your codebase without needing to remember register assignments. ;; diff --git a/modules/latex-config.el b/modules/latex-config.el index a0af2a1a..8636e2cd 100644 --- a/modules/latex-config.el +++ b/modules/latex-config.el @@ -3,6 +3,14 @@ ;;; Commentary: ;; +;; Layer: 3 (Domain Workflow). +;; Category: D/P. +;; Load shape: eager. +;; Eager reason: none; LaTeX/AUCTeX editing, a hook/mode-loaded deferral candidate. +;; Top-level side effects: package configuration via use-package. +;; Runtime requires: none. +;; Direct test load: yes. +;; ;; WORKFLOW: ;; ;; Opening any tex file will put you into LaTeX mode. diff --git a/tests/test-init-module-headers.el b/tests/test-init-module-headers.el index 267a9155..feaf93fd 100644 --- a/tests/test-init-module-headers.el +++ b/tests/test-init-module-headers.el @@ -92,7 +92,25 @@ "org-reveal-config" "org-roam-config" "org-webclipper" - "hugo-config") + "hugo-config" + ;; Batch 8 — Domain / integration / optional modules (Layer 2-4) + "ai-config" + "ai-vterm" + "browser-config" + "calendar-sync" + "calibredb-epub-config" + "chrono-tools" + "dirvish-config" + "dwim-shell-config" + "erc-config" + "eshell-config" + "eww-config" + "flyspell-and-abbrev" + "games-config" + "gloss-config" + "httpd-config" + "jumper" + "latex-config") "Modules annotated with the load-graph header contract. Grows one batch at a time. Parity with the init.el require set is the Phase 1 exit criterion.") @@ -166,11 +184,14 @@ omits the reason." ";; Direct test load: yes.\n"))) (should (member "Eager reason:" (test-init-header--missing-labels header))))) -(ert-deftest test-init-header-scoping-excludes-unclassified () - "Error: an unclassified module is not enforced (scoping proof)." - ;; games-config is required by init.el but not yet classified; it must be - ;; absent from the allowlist so the suite stays green during migration. - (should-not (member "games-config" test-init-header--classified-modules))) +(ert-deftest test-init-header-scoping-only-checks-allowlist () + "Error: only allowlisted modules are enforced, and the list stays clean. +A name never added to the allowlist stands in for any not-yet-classified +module: the validator checks allowlist members only. The duplicate guard +keeps the list honest as it grows batch by batch." + (should-not (member "not-a-classified-module" test-init-header--classified-modules)) + (should (equal (length test-init-header--classified-modules) + (length (delete-dups (copy-sequence test-init-header--classified-modules)))))) (provide 'test-init-module-headers) ;;; test-init-module-headers.el ends here @@ -492,6 +492,9 @@ The =init.el= require for =latex-config= carried a bare "WIP need to fix" commen ** TODO [#C] Decide prog-shell config home :refactor: The =init.el= require for =prog-shell= carried a "combine elsewhere" comment. Retired it during module classification. Decide whether shell-script editing config should fold into =prog-general= or stay its own module, then act or close. +** TODO [#C] Make elfeed-config tests byte-compile-safe :test: +The =cj/elfeed-process-entries= tests in =tests/test-elfeed-config-helpers.el= only pass when =elfeed-config= loads as interpreted source. The byte-compiled function inlines the =elfeed-entry-link= struct accessor, so the function stubs are bypassed and the inlined accessor type-checks a real =elfeed-entry=. The batch test environment has no elfeed package, so the tests can't build real structs either. Rewrite the tests (define a stand-in =elfeed-entry= cl-struct, or make elfeed loadable in batch) so they survive byte-compilation. This blocks annotating elfeed-config with its load-graph header (the last unclassified init module). + ** TODO [#B] Rework dev F-keys: compile+run (F4), test (F6), coverage (F7) :feature: :PROPERTIES: :LAST_REVIEWED: 2026-05-22 |
