bug#81526: 30.2; Emacs.app lacks class-based TCC usage-description keys, crashing subprocesses that touch privacy-gated frameworks

Stéphane Marks <[email protected]> Fri, 31 Jul 2026 19:55:44 +0200
Newsgroups gmane.emacs.bugs
Message-ID <CAN+1HbpvnpP=O7fySemi3pC-zgfv2qFDDbk4xchjy9n4uK-1gQ@mail.gmail.com>
On Fri, Jul 31, 2026 at 1:51 PM Mark Diekhans <[email protected]> wrote:

>
> bug report developed with assistance of AI,  suggest change tested by a
> human being
> ## Summary
>
> `nextstep/templates/Info.plist.in` declares usage-description keys for
> *file-access* TCC services
> (Desktop, Documents, Downloads, Removable Volumes) and for Apple Events,
> but none for the
> *class-based* services — Photos, Camera, Microphone, Contacts, Calendars,
> Reminders, Location,
> Speech Recognition, Bluetooth.
>
> Any command-line program spawned from a shell hosted inside Emacs (`M-x
> shell`, `M-x eshell`,
> `vterm`, `ansi-term`, `M-x compile`, org-babel, …) that touches one of
> those frameworks is killed
> with `SIGABRT` instead of getting the normal system permission dialog —
> even when the subprocess's
> own bundle correctly declares the usage description. macOS's TCC subsystem
> attributes the privacy
> check to the *responsible process* up the parent chain, which for anything
> launched from an
> Emacs-hosted shell is Emacs.app itself.
>
> This was discovered while running `osxphotos`/PyObjC scripts from a shell
> inside Emacs, but it is
> not Python-specific: it reproduces with a bundle-less C program that only
> touches
> `Photos.framework`.
>
> ## Environment
>
> - macOS 26.5.2 (build 25F84), Mac16,11 (Apple M4 Pro)
> - GNU Emacs 30.2 (build 2, aarch64-apple-darwin25.5.0, NS appkit-2685.60
> Version 26.5.1)
> - Installed via MacPorts, port `emacs-app
> @30.2_14+nativecomp+rsvg+treesitter`
> - Bundle identifier `org.gnu.Emacs`; signature `adhoc`,
> `TeamIdentifier=not set`
>
> ## What Emacs.app declares today
>
> ```
> $ plutil -p /Applications/MacPorts/Emacs.app/Contents/Info.plist | grep
> UsageDescription
>   "NSAppleEventsUsageDescription"       => "Emacs requires permission to
> send AppleEvents to other applications."
>   "NSDesktopFolderUsageDescription"     => "Emacs requires permission to
> access the Desktop folder."
>   "NSDocumentsFolderUsageDescription"   => "Emacs requires permission to
> access the Documents folder."
>   "NSDownloadsFolderUsageDescription"   => "Emacs requires permission to
> access the Downloads folder."
>   "NSRemovableVolumesUsageDescription"  => "Emacs requires permission to
> access files on Removable Volumes."
> ```
>
> So the *class* of key is already accepted upstream — the class-based
> services are simply absent.
>
> ## Minimal test case (isolates this from Python entirely)
>
> `photo_probe.m` — bundle-less, no `Info.plist` of its own, so its own
> identity plays no role:
>
> ```objc
> // Build: clang -framework Photos -framework Foundation -o photo_probe
> photo_probe.m
> #import <Foundation/Foundation.h>
> #import <Photos/Photos.h>
>
> int main(int argc, const char *argv[]) {
>     @autoreleasepool {
>         NSLog(@"[photo_probe] pid=%d requesting Photos authorization...",
> getpid());
>         dispatch_semaphore_t sema = dispatch_semaphore_create(0);
>         [PHPhotoLibrary
> requestAuthorizationForAccessLevel:PHAccessLevelReadWrite
>
> handler:^(PHAuthorizationStatus status) {
>             NSLog(@"[photo_probe] authorization status: %ld",
> (long)status);
>             dispatch_semaphore_signal(sema);
>         }];
>         dispatch_semaphore_wait(sema, dispatch_time(DISPATCH_TIME_NOW, 15
> * NSEC_PER_SEC));
>     }
>     return 0;
> }
> ```
>
> ## Steps to reproduce
>
> 1. `clang -framework Photos -framework Foundation -o photo_probe
> photo_probe.m`
> 2. From inside Emacs (`M-x shell`, `M-x eshell`, `vterm`, …) run
> `./photo_probe`.
> 3. From Terminal.app or iTerm2 directly — *not* nested inside Emacs — run
> the same `./photo_probe`.
>
> ## Expected behavior
>
> In both cases macOS shows the system permission dialog, and the process
> prints the resulting
> `PHAuthorizationStatus` and exits 0.
>
> ## Actual behavior
>
> From a shell inside Emacs the process aborts immediately. Verified process
> ancestry
> (`bash` → `claude` → `Emacs`) and the resulting crash report:
>
> ```
> procName        => photo_probe
> parentProc      => bash
> responsibleProc => Emacs
> coalitionName   => org.gnu.Emacs
> exception       => EXC_CRASH / SIGABRT          (shell reports exit 134)
> termination     => namespace TCC, code 0:
>     "This app has crashed because it attempted to access privacy-sensitive
> data
>      without a usage description. The app's Info.plist must contain an
>      NSPhotoLibraryUsageDescription key with a string value explaining to
> the
>      user how the app uses this data."
> ```
>
> Note `responsibleProc => Emacs`: TCC has attributed the request to
> Emacs.app, not to
> `photo_probe`, which is why the probe's own (absent) bundle identity is
> irrelevant.
>
> From iTerm2 directly it behaves as expected.
>
> ## Root cause, and why the Terminal.app comparison is not the relevant one
>
> It is tempting to say "Terminal.app declares these keys and Emacs should
> too", but that is factually
> wrong — Terminal.app declares **zero** usage descriptions:
>
> ```
> $ plutil -p
> /System/Applications/Utilities/Terminal.app/Contents/Info.plist | grep -c
> UsageDescription
> 0
> ```
>
> Terminal.app instead carries an Apple-**private** entitlement:
>
> ```
> $ codesign -d --entitlements - /System/Applications/Utilities/Terminal.app
>   com.apple.private.tcc.allow-prompting => [kTCCServiceAll]
> ```
>
> That entitlement is not available to third-party applications, so it is
> not an option for Emacs.
>
> The relevant precedent is a third-party terminal emulator that faced
> exactly this problem and solved
> it the only way available — by declaring the keys. iTerm2 3.6.8 declares
> 14 of them, with wording
> that explicitly attributes the request to a child process:
>
> ```
> $ plutil -p /Applications/iTerm.app/Contents/Info.plist | grep
> UsageDescription
>   "NSAppleEventsUsageDescription"        => "An application in iTerm2
> wants to use AppleScript."
>   "NSBluetoothAlwaysUsageDescription"    => "An application in iTerm2
> wants to use Bluetooth."
>   "NSCalendarsUsageDescription"          => "An application in iTerm2
> wants to use Calendar data."
>   "NSCameraUsageDescription"             => "An application in iTerm2
> wants to use the camera."
>   "NSContactsUsageDescription"           => "An application in iTerm2
> wants to use your contacts."
>   "NSLocalNetworkUsageDescription"       => "An application in iTerm2
> wants to access the local network."
>   "NSMicrophoneUsageDescription"         => "An application in iTerm2
> wants to use your microphone."
>   "NSPhotoLibraryUsageDescription"       => "An application in iTerm2
> wants to use the photo library."
>   "NSRemindersUsageDescription"          => "An application in iTerm2
> wants to use your reminders."
>   ...
> ```
>
> Emacs is routinely used the same way — as a host for interactive shells,
> `M-x compile`, and
> org-babel code execution — so it hits the same class of problem, currently
> without the mitigation.
>
> ## Suggested fix
>
> Add the missing class-based usage-description keys to `nextstep/templates/
> Info.plist.in`, alongside
> the file-access keys already there. `NSAppleEventsUsageDescription` and
> the `*Folder*` /
> `*RemovableVolumes*` keys are already present and must not be duplicated;
> on master
> `NSSpeechRecognitionUsageDescription` is present too. Minimum useful set
> to add:
>
> - `NSPhotoLibraryUsageDescription`, `NSPhotoLibraryAddUsageDescription`
> - `NSCameraUsageDescription`
> - `NSMicrophoneUsageDescription`
> - `NSContactsUsageDescription`
> - `NSCalendarsUsageDescription`, `NSCalendarsFullAccessUsageDescription`
> - `NSRemindersUsageDescription`, `NSRemindersFullAccessUsageDescription`
> - `NSLocationUsageDescription`, `NSLocationWhenInUseUsageDescription`
> - `NSLocalNetworkUsageDescription`
> - `NSBluetoothAlwaysUsageDescription`
> - `NSSystemAdministrationUsageDescription`
> - `NSSpeechRecognitionUsageDescription` — **on the emacs-30 branch only**;
> master already has it
>
> That master already added `NSSpeechRecognitionUsageDescription` to this
> same template suggests the
> general approach is already considered acceptable upstream; this report
> just asks for the rest of the
> class-based services to be covered too.
>
> The `*FullAccess*` variants are the macOS 14+ replacements for the older
> Calendars/Reminders keys;
> declaring both keeps older systems working.
>
> Suggested wording, matching the voice already used in the file while
> making the child-process case
> explicit:
>
> > Emacs, or a program started from within Emacs, requires permission to
> access your photo library.
>
> Declaring a usage description does **not** grant access — it only allows
> macOS to *prompt* instead of
> aborting the process. Users who deny the prompt get a normal denial, and
> the subprocess sees a
> "denied" status rather than `SIGABRT`.
>
> ## Caveat worth noting
>
> For an ad-hoc signed Emacs.app (`Signature=adhoc`, as MacPorts produces),
> the bundle's cdhash changes
> on every rebuild, so TCC grants may not persist across upgrades and the
> user may be prompted again.
> That is a separate, pre-existing issue; it does not affect this fix, which
> only prevents the hard
> crash.
>
>
>
>
>
> In GNU Emacs 30.2 (build 2, aarch64-apple-darwin25.5.0, NS
>  appkit-2685.60 Version 26.5.1 (Build 25F80)) of 2026-06-30
>  built on tahoea.local
> Windowing system distributor 'Apple', version 10.3.2685
> System Description:  macOS 26.5.2
>
> Configured using:
>  'configure --prefix=/opt/local --disable-silent-rules
>  --without-dbus --without-gconf --without-libotf
>  --without-m17n-flt --with-libgmp --with-gnutls --with-xml2
>  --with-modules --with-sqlite3 --with-webp
>  --with-native-compilation=aot --infodir
>  /opt/local/share/info/emacs --disable-gc-mark-trace --with-ns
>  --with-lcms2 --without-harfbuzz --without-imagemagick
>  --without-xaw3d --with-rsvg --with-tree-sitter 'CFLAGS=-pipe
>  -Os -Dts_language_version=ts_language_abi_version
>  -Wno-attributes
>  -isysroot/Library/Developer/CommandLineTools/SDKs/MacOSX26.sdk
>  -arch arm64' 'CPPFLAGS=-isystem/opt/local/include
>  -isysroot/Library/Developer/CommandLineTools/SDKs/MacOSX26.sdk'
>  'LDFLAGS=-L/opt/local/lib -Wl,-headerpad_max_install_names
>  -Wl,-no_pie -Wl,-rpath /opt/local/lib/gcc15 -Wl,-rpath
>  /opt/local/lib
>  -Wl,-syslibroot,/Library/Developer/CommandLineTools/SDKs/MacOSX26.sdk
>  -arch arm64''
>
> Configured features:
> ACL GIF GLIB GMP GNUTLS JPEG LCMS2 LIBXML2 MODULES NATIVE_COMP
> NOTIFY KQUEUE NS PDUMPER PNG RSVG SQLITE3 THREADS TIFF
> TOOLKIT_SCROLL_BARS TREE_SITTER WEBP XIM ZLIB
>
> Important settings:
>   value of $LC_COLLATE: C
>   value of $LC_CTYPE: en_US.UTF-8
>   value of $LC_MESSAGES: en_US.UTF-8
>   value of $LC_MONETARY: en_US.UTF-8
>   value of $LC_NUMERIC: C
>   value of $LC_TIME: en_US.UTF-8
>   value of $LANG: en_US.UTF-8
>   locale-coding-system: utf-8-unix
>
> Major mode: Ghostel
>
> Minor modes in effect:
>   global-git-commit-mode: t
>   magit-auto-revert-mode: t
>   server-mode: t
>   TeX-PDF-mode: t
>   override-global-mode: t
>   delete-selection-mode: t
>   display-time-mode: t
>   desktop-save-mode: t
>   cua-mode: t
>   gcmh-mode: t
>   url-handler-mode: t
>   tooltip-mode: t
>   global-eldoc-mode: t
>   eldoc-mode: t
>   show-paren-mode: t
>   electric-indent-mode: t
>   mouse-wheel-mode: t
>   menu-bar-mode: t
>   file-name-shadow-mode: t
>   global-font-lock-mode: t
>   minibuffer-regexp-mode: t
>   line-number-mode: t
>   transient-mark-mode: t
>   auto-composition-mode: t
>   auto-encryption-mode: t
>   auto-compression-mode: t
>   abbrev-mode: t
>
> Load-path shadows:
> /opt/local/share/emacs/site-lisp/site-start hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/site-lisp/site-start
> /Users/markd/.emacs.d/elpa/transient-20260725.1105/transient hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/transient
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-exp hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-exp
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-emacs-lisp hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-emacs-lisp
> /Users/markd/.emacs.d/elpa/org-9.8.8/oc hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/oc
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-css hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-css
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-lob hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-lob
> /Users/markd/.emacs.d/elpa/org-9.8.8/ol-irc hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ol-irc
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-forth hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-forth
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-macs hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-macs
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-version hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-version
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-scheme hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-scheme
> /Users/markd/.emacs.d/elpa/org-9.8.8/ox hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ox
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-C hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-C
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-capture hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-capture
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-ref hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-ref
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-clojure hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-clojure
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-mouse hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-mouse
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-persist hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-persist
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-ctags hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-ctags
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-entities hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-entities
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-archive hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-archive
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-screen hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-screen
> /Users/markd/.emacs.d/elpa/org-9.8.8/ol-bibtex hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ol-bibtex
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-haskell hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-haskell
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-loaddefs hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-loaddefs
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-table hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-table
> /Users/markd/.emacs.d/elpa/org-9.8.8/ol-eww hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ol-eww
> /Users/markd/.emacs.d/elpa/org-9.8.8/ol-man hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ol-man
> /Users/markd/.emacs.d/elpa/org-9.8.8/ox-org hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ox-org
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-num hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-num
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-plot hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-plot
> /Users/markd/.emacs.d/elpa/org-9.8.8/ol-rmail hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ol-rmail
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-awk hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-awk
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-groovy hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-groovy
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-octave hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-octave
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-faces hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-faces
> /Users/markd/.emacs.d/elpa/org-9.8.8/oc-biblatex hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/oc-biblatex
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-colview hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-colview
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-R hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-R
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-refile hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-refile
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-timer hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-timer
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-mobile hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-mobile
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-fortran hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-fortran
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-shell hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-shell
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-perl hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-perl
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-sqlite hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-sqlite
> /Users/markd/.emacs.d/elpa/org-9.8.8/oc-basic hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/oc-basic
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-sed hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-sed
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-list hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-list
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-ruby hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-ruby
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-eval hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-eval
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-habit hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-habit
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-clock hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-clock
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-goto hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-goto
> /Users/markd/.emacs.d/elpa/org-9.8.8/ox-html hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ox-html
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-src hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-src
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-lisp hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-lisp
> /Users/markd/.emacs.d/elpa/org-9.8.8/ol-eshell hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ol-eshell
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-ditaa hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-ditaa
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-pcomplete hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-pcomplete
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-lint hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-lint
> /Users/markd/.emacs.d/elpa/org-9.8.8/ox-latex hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ox-latex
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-sass hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-sass
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-tangle hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-tangle
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-calc hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-calc
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-java hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-java
> /Users/markd/.emacs.d/elpa/org-9.8.8/ox-icalendar hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ox-icalendar
> /Users/markd/.emacs.d/elpa/org-9.8.8/ol-mhe hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ol-mhe
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-attach-git hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-attach-git
> /Users/markd/.emacs.d/elpa/org-9.8.8/ox-md hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ox-md
> /Users/markd/.emacs.d/elpa/org-9.8.8/ox-beamer hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ox-beamer
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-element hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-element
> /Users/markd/.emacs.d/elpa/org-9.8.8/oc-natbib hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/oc-natbib
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-protocol hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-protocol
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-gnuplot hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-gnuplot
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-tempo hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-tempo
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-latex hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-latex
> /Users/markd/.emacs.d/elpa/org-9.8.8/ol-w3m hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ol-w3m
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-id hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-id
> /Users/markd/.emacs.d/elpa/org-9.8.8/ox-man hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ox-man
> /Users/markd/.emacs.d/elpa/org-9.8.8/ol-doi hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ol-doi
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-feed hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-feed
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-fold-core hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-fold-core
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-julia hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-julia
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-lua hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-lua
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-table hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-table
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-ocaml hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-ocaml
> /Users/markd/.emacs.d/elpa/org-9.8.8/oc-csl hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/oc-csl
> /Users/markd/.emacs.d/elpa/org-9.8.8/ol-gnus hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ol-gnus
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-indent hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-indent
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-lilypond hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-lilypond
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-matlab hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-matlab
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-datetree hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-datetree
> /Users/markd/.emacs.d/elpa/org-9.8.8/ol-docview hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ol-docview
> /Users/markd/.emacs.d/elpa/org-9.8.8/oc-bibtex hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/oc-bibtex
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-python hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-python
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-makefile hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-makefile
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-duration hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-duration
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-agenda hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-agenda
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-dot hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-dot
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-js hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-js
> /Users/markd/.emacs.d/elpa/org-9.8.8/ox-publish hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ox-publish
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-inlinetask hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-inlinetask
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-org hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-org
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-keys hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-keys
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-core hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-core
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-compat hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-compat
> /Users/markd/.emacs.d/elpa/org-9.8.8/ol hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ol
> /Users/markd/.emacs.d/elpa/org-9.8.8/ox-odt hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ox-odt
> /Users/markd/.emacs.d/elpa/org-9.8.8/ol-info hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ol-info
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-plantuml hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-plantuml
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-eshell hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-eshell
> /Users/markd/.emacs.d/elpa/org-9.8.8/ox-ascii hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ox-ascii
> /Users/markd/.emacs.d/elpa/org-9.8.8/ox-koma-letter hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ox-koma-letter
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-maxima hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-maxima
> /Users/markd/.emacs.d/elpa/org-9.8.8/org hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org
> /Users/markd/.emacs.d/elpa/org-9.8.8/ol-bbdb hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ol-bbdb
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-macro hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-macro
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-fold hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-fold
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-sql hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-sql
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-attach hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-attach
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-cycle hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-cycle
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-processing hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-processing
> /Users/markd/.emacs.d/elpa/org-9.8.8/ox-texinfo hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ox-texinfo
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-crypt hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-crypt
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-footnote hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-footnote
> /Users/markd/.emacs.d/elpa/org-9.8.8/org-element-ast hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/org-element-ast
> /Users/markd/.emacs.d/elpa/org-9.8.8/ob-comint hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/org/ob-comint
> /Users/markd/.emacs.d/elpa/compat-31.0.0.2/compat hides
> /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/emacs-lisp/compat
>
> Features:
> (shadow emacsbug markdown-mode vc-hg vc-bzr vc-src vc-sccs
> vc-svn vc-cvs vc-rcs log-view bug-reference magit-extras
> mailalias utf-7 network-stream nsm qp vm-rfaddons vm-pine
> vm-postpone vm-edit bbdb-vm bbdb-mua cl dabbrev vc python
> misearch multi-isearch pcmpl-unix magit-bookmark magit-submodule
> magit-blame magit-stash magit-reflog magit-bisect magit-push
> magit-pull magit-fetch magit-clone magit-remote magit-commit
> magit-sequence magit-notes magit-worktree magit-tag magit-merge
> magit-branch magit-reset magit-files magit-refs magit-status
> magit magit-repos magit-apply magit-wip magit-log magit-diff
> which-func git-commit log-edit pcvs-util add-log magit-core
> magit-margin magit-transient spinner
> claude-code-ide-mcp-http-server web-server
> web-server-status-codes cus-edit cus-start ghostel
> ghostel-module ghostel-prompt ghostel-module-install
> ghostel-links ghostel-line-mode ghostel-kitty ghostel-faces
> claude-code-ide claude-code-ide-emacs-tools imenu xref
> claude-code-ide-transient claude-code-ide-mcp
> claude-code-ide-mcp-server claude-code-ide-mcp-handlers
> claude-code-ide-diagnostics ediff ediff-merg ediff-mult
> ediff-wind ediff-diff ediff-help ediff-init ediff-util websocket
> bindat claude-code-ide-debug consult magit-process with-editor
> magit-mode benchmark magit-git magit-base magit-section
> cursor-sensor magit-autorevert smerge-mode diff dired-aux
> autorevert vc-git diff-mode track-changes vc-dispatcher
> org-superstar flyspell ispell org-indent oc-basic ol-eww eww
> url-queue mm-url ol-rmail ol-mhe ol-irc ol-info ol-gnus nnselect
> gnus-art mm-uu mml2015 mm-view mml-smime gnus-sum shr pixel-fill
> kinsoku url-file svg dom gnus-group gnus-undo gnus-start
> gnus-dbus dbus xml gnus-cloud nnimap nnmail mail-source nnoo
> gnus-spec gnus-int gnus-range message yank-media rfc822 mml
> mml-sec mm-decode mm-bodies mm-encode mail-parse rfc2231
> gmm-utils mailheader gnus-win gnus nnheader gnus-util range
> wid-edit ol-docview doc-view filenotify image-mode exif
> dired-quick-sort transient llama comp comp-cstr cond-let compat
> compat-31 savehist ls-lisp dired dired-loaddefs ol-bibtex bibtex
> ol-bbdb ol-w3m ol-doi org-link-doi epa-file epa derived epg
> rfc6068 epg-config server preview reporter latex latex-flymake
> flymake project warnings tex-ispell tex-style tex texmathp
> auctex cc-styles cc-align cc-engine cc-vars cc-defs flycheck
> org-tempo tempo org-vm org-med org-location-google-maps
> org-agenda org-element org-persist org-id avl-tree generator
> org-refile google-maps google-maps-static google-maps-geocode
> google-maps-base org ob ob-tangle ob-ref ob-lob ob-table ob-exp
> org-macro org-src sh-script smie treesit executable ob-comint
> org-element-ast inline org-pcomplete org-list org-footnote
> org-faces org-entities noutline outline ob-emacs-lisp ob-core
> ob-eval org-cycle org-table ol org-fold org-fold-core org-keys
> oc org-compat org-loaddefs thingatpt cal-menu calendar
> cal-loaddefs org-version org-macs mailrc vm-pcrisis vm-autoload
> vm-autoloads vm-imap utf7 vm-virtual vm-page vm-pop vm-crypto
> vm-delete vm-sort vm-motion vm-minibuf vm-mouse vm-menu vm-mime
> smime gnutls puny dig sendmail rfc2047 rfc2045 ietf-drums
> mm-util mail-prsvr mail-utils vm-reply vm-undo vm-summary
> vm-summary-faces vm-avirtual bbdb-com crm mailabbrev bbdb
> bbdb-site timezone vm-thread vm-folder vm-toolbar vm-window
> tapestry vm-misc vm-message vm-vars vm-macro vm
> comint-delim-fix.el vterm bookmark pp tramp trampver
> tramp-integration files-x tramp-message tramp-compat xdg
> parse-time iso8601 format-spec tramp-loaddefs face-remap term
> disp-table ehelp find-func vterm-module time-date compile
> text-property-search comp-run comp-common rx term/xterm xterm
> edmacro kmacro use-package-bind-key bind-key easy-mmode
> use-package-ensure exec-path-from-shell ssh medutil
> google-translate google-translate-default-ui
> google-translate-core-ui facemenu color google-translate-core
> google-translate-backend background shell pcomplete comint
> ansi-osc ansi-color ring jka-compr modus-operandi-theme
> modus-themes delsel xt-mouse time desktop frameset cua-base
> cus-load gcmh cl-extra help-mode use-package-core 2bit-autoloads
> bbdb-ext-autoloads bbdb-vcard-autoloads buttercup-autoloads
> charmap-autoloads claude-code-ide-autoloads consult-autoloads
> csv-mode-autoloads dired-quick-sort-autoloads ebib-autoloads
> ess-autoloads filladapt-autoloads find-file-in-project-autoloads
> flycheck-pycheckers-autoloads flycheck-autoloads flymd-autoloads
> gcmh-autoloads ghostel-autoloads google-c-style-autoloads
> google-this-autoloads google-translate-autoloads gptel-autoloads
> graphviz-dot-mode-autoloads groovy-mode-autoloads
> helm-bbdb-autoloads bbdb-autoloads helm-codesearch-autoloads
> helm-flyspell-autoloads helm-git-autoloads
> helm-git-grep-autoloads helm-google-autoloads
> helm-ispell-autoloads helm-make-autoloads helm-org-autoloads
> helm-easymenu helm-autoloads helm-core-autoloads
> hide-lines-autoloads json-navigator-autoloads
> languagetool-autoloads latex-table-wizard-autoloads
> auctex-autoloads tex-site list-unicode-display-autoloads
> ht-autoloads magit-git-toolbelt-autoloads magit-autoloads pcase
> magit-section-autoloads f-autoloads dash-autoloads
> async-autoloads markdown-mode-autoloads nose-autoloads
> org-modern-autoloads org-superstar-autoloads org-autoloads
> org-vcard-autoloads osx-dictionary-autoloads osx-plist-autoloads
> package-lint-autoloads paper-theme-autoloads parsebib-autoloads
> pcache-autoloads popup-autoloads pyvenv-autoloads s-autoloads
> snakemake-mode-autoloads spinner-autoloads
> string-inflection-autoloads transient-autoloads
> twilight-bright-theme-autoloads finder-inf
> unicode-emoticons-autoloads
> universal-emotions-emoticons-autoloads vcard-autoloads
> vterm-autoloads w3m-autoloads web-server-autoloads
> websocket-autoloads wfnames-autoloads with-editor-autoloads
> llama-autoloads cond-let-autoloads info compat-autoloads
> xkcd-autoloads package browse-url url url-proxy url-privacy
> url-expand url-methods url-history url-cookie generate-lisp-file
> url-domsuf url-util mailcap url-handlers url-parse auth-source
> cl-seq eieio eieio-core cl-macs icons password-cache json subr-x
> map byte-opt gv bytecomp byte-compile url-vars cl-loaddefs
> cl-lib rmc iso-transl tooltip cconv eldoc paren electric
> uniquify ediff-hook vc-hooks lisp-float-type elisp-mode mwheel
> term/ns-win ns-win ucs-normalize mule-util term/common-win
> tool-bar dnd fontset image regexp-opt fringe tabulated-list
> replace newcomment text-mode lisp-mode prog-mode register page
> tab-bar menu-bar rfn-eshadow isearch easymenu timer select
> scroll-bar mouse jit-lock font-lock syntax font-core
> term/tty-colors frame minibuffer nadvice seq simple cl-generic
> indonesian philippine cham georgian utf-8-lang misc-lang
> vietnamese tibetan thai tai-viet lao korean japanese eucjp-ms
> cp51932 hebrew greek romanian slovak czech european ethiopic
> indian cyrillic chinese composite emoji-zwj charscript charprop
> case-table epa-hook jka-cmpr-hook help abbrev obarray oclosure
> cl-preloaded button loaddefs theme-loaddefs faces cus-face
> macroexp files window text-properties overlay sha1 md5 base64
> format env code-pages mule custom widget keymap
> hashtable-print-readable backquote threads kqueue cocoa ns lcms2
> multi-tty make-network-process native-compile emacs)
>
> Memory information:
> ((conses 16 1515089 264889) (symbols 48 78587 4) (strings 32 458258 8292)
>  (string-bytes 1 10921407) (vectors 16 215554) (vector-slots 8 3263335
> 142577)
>  (floats 8 1361 1640) (intervals 56 76497 1952) (buffers 992 71))
>

Adding a few others who have macOS interest and expertise to opine.