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

Mark Diekhans <[email protected]> Fri, 31 Jul 2026 10:50:29 -0700
Newsgroups gmane.emacs.bugs
Message-ID <[email protected]>
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))