diff --git a/docs/build-manual.py b/docs/build-manual.py
index c0fd62f..979df64 100644
--- a/docs/build-manual.py
+++ b/docs/build-manual.py
@@ -416,7 +416,12 @@ def prettify(body: str, entry_name: str | None = None) -> str:
return "\n".join(out)
-ENTRY_HEADS = {"ARGUMENTS": "Arguments:", "RETURNS": "Returns:", "NOTES": "Notes:"}
+ENTRY_HEADS = {
+ "ARGUMENTS": "Arguments:",
+ "EXIT STATUS": "Exit Status:",
+ "RETURNS": "Returns:",
+ "NOTES": "Notes:",
+}
def render_entry(fn: dict[str, list[str]], used_by: list[str], link=None) -> str:
diff --git a/docs/fish-config.md b/docs/fish-config.md
index 423ff57..3b4b169 100644
--- a/docs/fish-config.md
+++ b/docs/fish-config.md
@@ -708,7 +708,7 @@ Add -i (interactive confirmation) to destructive commands:
-s, --silent Suppress directory creation output
Directory to create and enter
- Returns:
+ Exit Status:
0 Directory created (or already existed) and entered successfully
1 Directory creation or cd failed
@@ -741,7 +741,7 @@ Add -i (interactive confirmation) to destructive commands:
Arguments:
file One or more file paths to create
- Returns:
+ Exit Status:
0 Files created
1 No file argument provided
@@ -785,7 +785,7 @@ Add -i (interactive confirmation) to destructive commands:
-r, -R, --recursive Forwarded to trash put alongside path arguments
args... Files or paths to trash or remove
- Returns:
+ Exit Status:
0 Operation succeeded
1 trash put failed or file not found
@@ -812,7 +812,7 @@ Add -i (interactive confirmation) to destructive commands:
-d, --dry-run Show targets without deleting
-h, --help Show usage help
- Returns:
+ Exit Status:
0 Sweep completed (or dry run shown)
1 fd not found, or unknown argument provided
@@ -846,7 +846,7 @@ Add -i (interactive confirmation) to destructive commands:
Arguments:
args... Arguments forwarded to clone-in-kitty (typically a repo URL)
- Returns:
+ Exit Status:
0 Repository cloned
1 Not running inside Kitty terminal
@@ -863,7 +863,7 @@ Add -i (interactive confirmation) to destructive commands:
Arguments:
args... Arguments forwarded to clone-in-kitty (typically a repo URL)
- Returns:
+ Exit Status:
0 Repository cloned
1 Not running inside Kitty terminal
@@ -899,7 +899,7 @@ Add -i (interactive confirmation) to destructive commands:
-s, --silent Suppress all output, including the editor's
-h, --help Show this help message
- Returns:
+ Exit Status:
0 Editor launched successfully
1 Conflicting flags, no editor found, or clipboard read failed
@@ -922,7 +922,7 @@ Add -i (interactive confirmation) to destructive commands:
Arguments:
command_prefix Search history for the newest command matching this
- Returns:
+ Exit Status:
The edited command's exit status, or a message when history lookup
found nothing.
@@ -996,7 +996,7 @@ Add -i (interactive confirmation) to destructive commands:
status Show enabled/disabled state, repo count, and registry path
-h, --help Show this help message
- Returns:
+ Exit Status:
0 Subcommand succeeded
1 Bad usage, target is not a git repo, or target not registered
@@ -1016,7 +1016,7 @@ Add -i (interactive confirmation) to destructive commands:
Arguments:
branch_name Branch to switch to or create
- Returns:
+ Exit Status:
0 Branch checked out or created
1 Not inside a git work tree
@@ -1041,10 +1041,14 @@ Add -i (interactive confirmation) to destructive commands:
-s, --stdout Print API output to stdout instead of .gitignore
targets Comma- or space-separated list of language/tool names
- Returns:
- 0 Patterns appended or printed
+ Exit Status:
+ 0 Patterns appended, or resolved with -s/--stdout or -l/--list
1 Not in a git repository or API fetch failed
+ Returns:
+ With -s/--stdout, the fetched .gitignore pattern text, printed to stdout.
+ With -l/--list, the supported target list, printed to stdout.
+
Example:
gi python,venv
gi -b -p
@@ -1062,7 +1066,7 @@ Add -i (interactive confirmation) to destructive commands:
-h, --help Show help message
-f, --force Force-delete unmerged orphaned branches (git branch -D)
- Returns:
+ Exit Status:
0 Cleanup complete
1 Argument parsing failed
@@ -1093,7 +1097,7 @@ Add -i (interactive confirmation) to destructive commands:
Arguments:
args... Forwarded verbatim to git fetch
- Returns:
+ Exit Status:
0 Fetch and status succeeded
1 Not inside a git work tree
@@ -1131,7 +1135,7 @@ Add -i (interactive confirmation) to destructive commands:
pacman -Qi previews, then removes the selected packages using paru or yay.
Arch Linux only.
- Returns:
+ Exit Status:
0 Packages removed or none selected
1 No AUR helper (paru or yay) found
@@ -1161,7 +1165,7 @@ Add -i (interactive confirmation) to destructive commands:
-u, --uninstall Force uninstall mode
package One or more package names to install or remove
- Returns:
+ Exit Status:
0 Operation completed
1 No supported package manager found, unknown flag, or package operation failed
@@ -1180,7 +1184,7 @@ Add -i (interactive confirmation) to destructive commands:
Arguments:
args... Arguments forwarded to paru or yay
- Returns:
+ Exit Status:
0 AUR helper ran successfully
1 No AUR helper (paru or yay) found
@@ -1194,7 +1198,7 @@ Add -i (interactive confirmation) to destructive commands:
Runs a full system upgrade via paru or yay with --noconfirm. Falls
back to yay if paru is not installed. Arch Linux only.
- Returns:
+ Exit Status:
0 Upgrade completed successfully
1 No AUR helper (paru or yay) found
@@ -1244,7 +1248,7 @@ Add -i (interactive confirmation) to destructive commands:
update Update all installed deps
sync Install missing deps, then update all
- Returns:
+ Exit Status:
0 Subcommand completed
1 Unknown subcommand
@@ -1309,7 +1313,7 @@ Add -i (interactive confirmation) to destructive commands:
Arguments:
--brief Suppress per-file output; show only the final summary
- Returns:
+ Exit Status:
0 All binaries verified (or summary shown)
1 sbctl is not installed
@@ -1336,7 +1340,7 @@ Add -i (interactive confirmation) to destructive commands:
otherwise require a password entry. Clears the sudo credential cache
when re-enabling, so the lockdown takes effect immediately.
- Returns:
+ Exit Status:
0 Rule toggled
Example:
@@ -1380,7 +1384,7 @@ Add -i (interactive confirmation) to destructive commands:
command The command to run detached
args... Additional arguments for the command
- Returns:
+ Exit Status:
0 Command launched successfully
1 No command provided
@@ -1401,7 +1405,7 @@ Add -i (interactive confirmation) to destructive commands:
command The command to run detached
args... Additional arguments for the command
- Returns:
+ Exit Status:
0 Command launched or help/version shown
1 No command provided or unknown option
@@ -1422,7 +1426,7 @@ Add -i (interactive confirmation) to destructive commands:
command... Command to run in the new pane; opens a bare fish
shell if omitted
- Returns:
+ Exit Status:
0 Pane opened successfully
1 Not running inside Kitty or WezTerm
@@ -1440,7 +1444,7 @@ Add -i (interactive confirmation) to destructive commands:
Arguments:
args... Arguments forwarded to the spawn command
- Returns:
+ Exit Status:
0 Window opened successfully
1 Not running inside Kitty or WezTerm
@@ -1473,7 +1477,7 @@ Add -i (interactive confirmation) to destructive commands:
Arguments:
args... Arguments forwarded to the terminal's launch command
- Returns:
+ Exit Status:
0 Tab opened successfully
1 No supported terminal found
@@ -1493,10 +1497,13 @@ Add -i (interactive confirmation) to destructive commands:
-h, --help Show usage help
args... Arguments forwarded to the clipboard tool
- Returns:
- 0 Clipboard contents printed successfully
+ Exit Status:
+ 0 Clipboard contents read successfully
1 No supported clipboard tool found
+ Returns:
+ The clipboard contents, printed to stdout
+
Example:
p | grep foo
p > file.txt
@@ -1511,10 +1518,13 @@ Add -i (interactive confirmation) to destructive commands:
Arguments:
args... Arguments forwarded to the clipboard tool
- Returns:
- 0 Clipboard contents printed successfully
+ Exit Status:
+ 0 Clipboard contents read successfully
1 No supported clipboard tool found
+ Returns:
+ The clipboard contents, printed to stdout
+
Example:
paste > file.txt
@@ -1528,7 +1538,7 @@ Add -i (interactive confirmation) to destructive commands:
Arguments:
text Text to copy; reads from stdin if omitted
- Returns:
+ Exit Status:
0 Text copied to clipboard
1 No clipboard provider found
@@ -1565,10 +1575,13 @@ Add -i (interactive confirmation) to destructive commands:
Fetches and prints the machine's public IPv6 address using icanhazip.com.
Prints an error message if IPv6 is unavailable on the current network.
- Returns:
- 0 IPv6 address printed
+ Exit Status:
+ 0 IPv6 address resolved
1 IPv6 unavailable or not supported on this network
+ Returns:
+ The machine's public IPv6 address, printed to stdout
+
Example:
gip6
@@ -1626,7 +1639,7 @@ Add -i (interactive confirmation) to destructive commands:
-h, --help Show help message
-c, --category cat Filter to one category: scrollback, paru, or yay
- Returns:
+ Exit Status:
0 File viewed or no file selected
1 No log files found
@@ -1648,7 +1661,7 @@ Add -i (interactive confirmation) to destructive commands:
-h, --help Show help message
-n, --no-log Exit without saving a scrollback log
- Returns:
+ Exit Status:
0 Shell session exited
1 Argument parsing failed
@@ -1724,7 +1737,7 @@ Add -i (interactive confirmation) to destructive commands:
-s, --silent Suppress all output; errors only (standard UNIX convention)
-h, --help Show this help message and exit
- Returns:
+ Exit Status:
0 Setup completed successfully
1 Fatal error (git init failed, move failed, etc.)
@@ -1754,7 +1767,7 @@ Add -i (interactive confirmation) to destructive commands:
Arguments:
ARGS Any arguments forwarded verbatim to the underlying agy binary
- Returns:
+ Exit Status:
Exit status of the underlying agy binary
Example:
@@ -1795,7 +1808,7 @@ Add -i (interactive confirmation) to destructive commands:
Arguments:
ARGS Any arguments forwarded verbatim to the underlying claude binary
- Returns:
+ Exit Status:
Exit status of the underlying claude binary
Example:
@@ -1860,7 +1873,7 @@ Add -i (interactive confirmation) to destructive commands:
prompt... Prompt forwarded to aichat
-h, --help Show usage help
- Returns:
+ Exit Status:
aichat's exit status.
Example:
@@ -1882,7 +1895,7 @@ Add -i (interactive confirmation) to destructive commands:
-g, --global Apply at user/global scope instead of workspace/project
-h, --help Show usage help
- Returns:
+ Exit Status:
0 Mode applied successfully
1 No on/off mode specified
@@ -1907,7 +1920,7 @@ Add -i (interactive confirmation) to destructive commands:
-s, --speed N Encoder speed 0-10 (default: 3, 0 = slowest)
-h, --help Show help message
- Returns:
+ Exit Status:
0 Conversion complete
1 File not found, missing dependency, or encode step failed
@@ -1995,7 +2008,7 @@ Add -i (interactive confirmation) to destructive commands:
Arguments:
owner/repo The repository path in owner/name format
- Returns:
+ Exit Status:
0 Issues linked and synced (or no unlinked issues found)
1 Missing required argument or environment variables
@@ -2059,10 +2072,14 @@ Add -i (interactive confirmation) to destructive commands:
-m, --man Open the compiled man page via man -l
-h, --help Print usage and navigation reference, then exit
- Returns:
- 0 Manual displayed (or --help printed)
+ Exit Status:
+ 0 Manual displayed
1 Documentation file not found, or required tool not available
+ Returns:
+ With -h/--help, the usage and navigation reference, printed to stdout.
+ Otherwise, the manual is shown via the resolved pager (not captured stdout).
+
Notes:
The preferred invocation is `help config [...]` — this function is
registered as a handler in the help wrapper so that syntax works
@@ -2131,7 +2148,7 @@ Add -i (interactive confirmation) to destructive commands:
Arguments:
-h, --help Print usage and exit
- Returns:
+ Exit Status:
0 Exited normally (q or Escape pressed)
1 Unknown flag passed
@@ -2150,7 +2167,7 @@ Add -i (interactive confirmation) to destructive commands:
Arguments:
args Passed through verbatim to config-settings
- Returns:
+ Exit Status:
Same as config-settings
Example:
@@ -2172,7 +2189,7 @@ Add -i (interactive confirmation) to destructive commands:
-f, --force Stash local changes before pulling, then pop the stash
-n, --dry-run Check for upstream changes without applying them
- Returns:
+ Exit Status:
0 Config updated (or already up to date)
1 Update failed (network error, merge conflict, or not a git repo)
@@ -2192,7 +2209,7 @@ Add -i (interactive confirmation) to destructive commands:
-h, --help Show help message
directory Path to the compose project (defaults to current directory)
- Returns:
+ Exit Status:
0 Services updated and running
1 Directory not found or no docker-compose.yml present
@@ -2222,7 +2239,7 @@ Add -i (interactive confirmation) to destructive commands:
Arguments:
args... Arguments forwarded to the joplin command
- Returns:
+ Exit Status:
0 Joplin ran successfully
1 joplin binary not found in PATH
@@ -2252,7 +2269,7 @@ Add -i (interactive confirmation) to destructive commands:
dismiss Stop the per-session reminder
-h, --help Show this help
- Returns:
+ Exit Status:
0 Success
1 Unknown subcommand/flag, kitty missing, or a write failure
@@ -2296,7 +2313,7 @@ Add -i (interactive confirmation) to destructive commands:
-v, --verbose Print which browser is being launched
-h, --help Print usage and exit
- Returns:
+ Exit Status:
0 Browser launched
1 No URL given, invalid $BROWSER, or no browser found
@@ -2320,7 +2337,7 @@ Add -i (interactive confirmation) to destructive commands:
Arguments:
commands Bash command string to execute and replay
- Returns:
+ Exit Status:
0 Commands ran successfully and changes were replayed
1 Bash command exited with a non-zero status
@@ -2358,10 +2375,13 @@ Add -i (interactive confirmation) to destructive commands:
-r, --root Ignore the current sub-directory; link to the repo root
-h, --help Print usage and exit
- Returns:
- 0 URL opened (or printed)
+ Exit Status:
+ 0 URL opened, or resolved with -p/--print
1 Not a git repo, no origin remote, or browser launch failed
+ Returns:
+ With -p/--print, the resolved repository URL, printed to stdout
+
Notes:
Typo abbreviation: open-repo (expands to repo-open on space/enter).
@@ -2393,7 +2413,7 @@ Add -i (interactive confirmation) to destructive commands:
command Command to run with sleep inhibition active
args... Arguments forwarded to the command
- Returns:
+ Exit Status:
0 Command ran and completed
1 No command provided
diff --git a/docs/manualtools.py b/docs/manualtools.py
index 793c543..df0b51c 100644
--- a/docs/manualtools.py
+++ b/docs/manualtools.py
@@ -66,6 +66,7 @@ SECTIONS = (
"SYNOPSIS",
"DESCRIPTION",
"ARGUMENTS",
+ "EXIT STATUS",
"RETURNS",
"EXAMPLE",
"NOTES",
diff --git a/docs/verify-manual.py b/docs/verify-manual.py
index 33f14fd..32d1985 100644
--- a/docs/verify-manual.py
+++ b/docs/verify-manual.py
@@ -572,6 +572,43 @@ def test_sidebar_has_no_duplicate_functions_entry():
assert len(labels) == 15, f"expected Overview + 14 categories, got {len(labels)}"
+def test_exit_status_never_describes_stdout_content():
+ """EXIT STATUS documents $status; stdout/printed content belongs in RETURNS.
+
+ Regression guard for the RETURNS -> EXIT STATUS split: a row like
+ "0 Patterns appended, or the requested content printed" re-introduces
+ the exact ambiguity (exit code vs. printed output) the split exists to
+ remove. A `--stdout`-style flag name is not itself an offense — only
+ "stdout" used as a bare word (not part of a flag) counts.
+ """
+ offenders = []
+ for name, fn in _parsed_functions().items():
+ for line in fn.get("EXIT STATUS", []):
+ if re.search(r"(? any other single printable character
-# "" nothing decodable was read
+# EXIT STATUS
+# 0 A key was read
# 1 The terminal could not be put into raw mode (stdin is not a TTY)
#
+# RETURNS
+# One token, printed to stdout:
+# up down left right arrow keys
+# space tab backtab enter escape backspace
+# quit Ctrl-C (byte 3) in raw mode
+# any other single printable character
+# "" nothing decodable was read
+#
# EXAMPLE
# set -l key (__config_settings_read_key)
# or return # not a TTY — bail
diff --git a/functions/__config_settings_set_value.fish b/functions/__config_settings_set_value.fish
index 46ddfd1..3de0f28 100644
--- a/functions/__config_settings_set_value.fish
+++ b/functions/__config_settings_set_value.fish
@@ -17,7 +17,7 @@
# type "list" (whitespace-split) or any other tag (single value)
# value The new value; empty string erases (reset to default)
#
-# RETURNS
+# EXIT STATUS
# 0 Always
#
# EXAMPLE
diff --git a/functions/__fish_config_op_enabled.fish b/functions/__fish_config_op_enabled.fish
index 6eeb5b4..80b1d76 100644
--- a/functions/__fish_config_op_enabled.fish
+++ b/functions/__fish_config_op_enabled.fish
@@ -23,7 +23,7 @@
# __fish_config_op_logging, or
# __fish_config_op_greeting
#
-# RETURNS
+# EXIT STATUS
# 0 Component enabled (category explicitly truthy; or category unset and master not falsy)
# 1 Component disabled (category explicitly falsy; or category unset and master falsy; or no argument with falsy master)
#
diff --git a/functions/__fish_config_sync_logging.fish b/functions/__fish_config_sync_logging.fish
index efc9f41..431a793 100644
--- a/functions/__fish_config_sync_logging.fish
+++ b/functions/__fish_config_sync_logging.fish
@@ -14,7 +14,7 @@
# Safe to call at any time; wrapper removal only affects files bearing
# the generated version-marker comment.
#
-# RETURNS
+# EXIT STATUS
# 0 Always
#
# EXAMPLE
diff --git a/functions/__fish_real_command.fish b/functions/__fish_real_command.fish
index 743c7b7..d515c8b 100644
--- a/functions/__fish_real_command.fish
+++ b/functions/__fish_real_command.fish
@@ -18,9 +18,12 @@
# ARGUMENTS
# name Command name to resolve (e.g. paru, yay)
#
+# EXIT STATUS
+# 0 A non-wrapper binary was found
+# 1 No non-wrapper binary found on PATH
+#
# RETURNS
-# 0 Real binary path printed to stdout
-# 1 No non-wrapper binary found on PATH (nothing printed)
+# The resolved binary's real path, printed to stdout (nothing on failure)
#
# EXAMPLE
# set -l real (__fish_real_command paru) # -> /usr/bin/paru, not the shim
diff --git a/functions/__fish_user_dots_link.fish b/functions/__fish_user_dots_link.fish
index 6873671..e61bb2f 100644
--- a/functions/__fish_user_dots_link.fish
+++ b/functions/__fish_user_dots_link.fish
@@ -23,7 +23,7 @@
# ARGUMENTS
# (none)
#
-# RETURNS
+# EXIT STATUS
# 0 Always
#
# EXAMPLE
diff --git a/functions/__fish_variable_check.fish b/functions/__fish_variable_check.fish
index 0a00a9e..e601244 100644
--- a/functions/__fish_variable_check.fish
+++ b/functions/__fish_variable_check.fish
@@ -12,7 +12,7 @@
# ARGUMENTS
# variable_name Name of the variable to check (without $ prefix)
#
-# RETURNS
+# EXIT STATUS
# 0 True (opt-in): value matches 1, true, yes, on, or y
# 1 False (opt-out): value matches 0, false, no, off, or n
# 2 Empty: variable is unset or empty
diff --git a/functions/__fzf_inline_picker.fish b/functions/__fzf_inline_picker.fish
index 7b40345..7913d45 100644
--- a/functions/__fzf_inline_picker.fish
+++ b/functions/__fzf_inline_picker.fish
@@ -9,7 +9,7 @@
# into the command line at the cursor position. Bound to @@ by default.
# Repaints the prompt after selection or cancellation.
#
-# RETURNS
+# EXIT STATUS
# 0 Always; no-op if fzf is cancelled
#
# EXAMPLE
diff --git a/functions/__kitty_logging_dir.fish b/functions/__kitty_logging_dir.fish
index adc6b5b..475e8ff 100644
--- a/functions/__kitty_logging_dir.fish
+++ b/functions/__kitty_logging_dir.fish
@@ -9,8 +9,11 @@
# order: $KITTY_CONFIG_DIRECTORY, else $XDG_CONFIG_HOME/kitty, else
# ~/.config/kitty.
#
+# EXIT STATUS
+# 0 Always
+#
# RETURNS
-# 0 Always (path printed to stdout)
+# The Kitty configuration directory path, printed to stdout
#
# EXAMPLE
# set -l dir (__kitty_logging_dir)
diff --git a/functions/__kitty_logging_has_watcher.fish b/functions/__kitty_logging_has_watcher.fish
index 7c4d00f..a49d0eb 100644
--- a/functions/__kitty_logging_has_watcher.fish
+++ b/functions/__kitty_logging_has_watcher.fish
@@ -9,7 +9,7 @@
# (non-commented) `watcher` directive — whether the fish-config managed one or
# a user's own. Used to suppress the setup reminder and to inform status.
#
-# RETURNS
+# EXIT STATUS
# 0 An active watcher directive is present
# 1 None present, or kitty.conf does not exist
#
diff --git a/functions/__kitty_logging_version.fish b/functions/__kitty_logging_version.fish
index 1911d9e..863d8ac 100644
--- a/functions/__kitty_logging_version.fish
+++ b/functions/__kitty_logging_version.fish
@@ -11,8 +11,11 @@
# ARGUMENTS
# file Path to a watcher script
#
+# EXIT STATUS
+# 0 Always
+#
# RETURNS
-# 0 Always (integer printed to stdout)
+# The watcher version as an integer (0 if absent), printed to stdout
#
# EXAMPLE
# __kitty_logging_version ~/.config/kitty/fish-config-watcher.py
diff --git a/functions/_agents_init_ensure_gitignore.fish b/functions/_agents_init_ensure_gitignore.fish
index f4f411a..3df0fd3 100644
--- a/functions/_agents_init_ensure_gitignore.fish
+++ b/functions/_agents_init_ensure_gitignore.fish
@@ -24,7 +24,7 @@
# label Short description used in the block comment header
# pattern One or more gitignore patterns to ensure are present
#
-# RETURNS
+# EXIT STATUS
# 0 All patterns already ignored or successfully appended
# 1 Could not write to .gitignore
#
diff --git a/functions/_agents_init_install_tools.fish b/functions/_agents_init_install_tools.fish
index c9f7c08..3c544af 100644
--- a/functions/_agents_init_install_tools.fish
+++ b/functions/_agents_init_install_tools.fish
@@ -15,7 +15,7 @@
# ARGUMENTS
# agents_dir Absolute path to the AGENTS/ sub-repo root
#
-# RETURNS
+# EXIT STATUS
# 0 Tooling is current or was installed/updated successfully
# 1 Canonical source missing or a copy failed
#
diff --git a/functions/_auto_pull_sync.fish b/functions/_auto_pull_sync.fish
index d03be5e..fd76468 100644
--- a/functions/_auto_pull_sync.fish
+++ b/functions/_auto_pull_sync.fish
@@ -19,7 +19,7 @@
# ARGUMENTS
# dir Absolute path to the git repository to fast-forward
#
-# RETURNS
+# EXIT STATUS
# 0 Fast-forward applied (or already up to date)
# 1 A precondition failed; nothing was changed
#
diff --git a/functions/_fish_deps_catalog.fish b/functions/_fish_deps_catalog.fish
index c9742f9..bf63cfd 100644
--- a/functions/_fish_deps_catalog.fish
+++ b/functions/_fish_deps_catalog.fish
@@ -49,9 +49,12 @@ end
# ARGUMENTS
# bin The binary name to look up in the catalog
#
+# EXIT STATUS
+# 0 Binary found in the catalog
+# 1 Binary not found
+#
# RETURNS
-# 0 Index printed to stdout
-# 1 Binary not found (empty output)
+# The binary's 1-based catalog index, printed to stdout (nothing on failure)
#
# EXAMPLE
# _fish_deps_catalog_idx fzf
diff --git a/functions/_fish_deps_pm_install.fish b/functions/_fish_deps_pm_install.fish
index e60d725..0f5b287 100644
--- a/functions/_fish_deps_pm_install.fish
+++ b/functions/_fish_deps_pm_install.fish
@@ -12,7 +12,7 @@
# ARGUMENTS
# pkg The package name to install
#
-# RETURNS
+# EXIT STATUS
# 0 Package installed successfully
# 1 No supported package manager found
#
diff --git a/functions/_fish_deps_pm_upgrade.fish b/functions/_fish_deps_pm_upgrade.fish
index d6e98c1..6596fdf 100644
--- a/functions/_fish_deps_pm_upgrade.fish
+++ b/functions/_fish_deps_pm_upgrade.fish
@@ -12,7 +12,7 @@
# ARGUMENTS
# pkg The package name to upgrade
#
-# RETURNS
+# EXIT STATUS
# 0 Package upgraded successfully
# 1 No supported package manager found
#
diff --git a/functions/_fish_mkdir_p.fish b/functions/_fish_mkdir_p.fish
index 5b42ea9..835ab5c 100644
--- a/functions/_fish_mkdir_p.fish
+++ b/functions/_fish_mkdir_p.fish
@@ -14,7 +14,7 @@
# -s, --silent Suppress all output
# dir The directory path to create
#
-# RETURNS
+# EXIT STATUS
# 0 Directory created or already exists
# 1 No target directory specified or mkdir failed
#
diff --git a/functions/_prune_terminal_logs.fish b/functions/_prune_terminal_logs.fish
index f121fbb..f5c4b41 100644
--- a/functions/_prune_terminal_logs.fish
+++ b/functions/_prune_terminal_logs.fish
@@ -20,7 +20,7 @@
# ARGUMENTS
# prefix Log-name prefix to prune (e.g. tmux, zellij)
#
-# RETURNS
+# EXIT STATUS
# 0 Always
#
# EXAMPLE
diff --git a/functions/_qalc_eval.fish b/functions/_qalc_eval.fish
index abe6de2..c54b625 100644
--- a/functions/_qalc_eval.fish
+++ b/functions/_qalc_eval.fish
@@ -10,7 +10,7 @@
# after evaluation. No-ops if qalc is not installed or the buffer
# is empty. Intended to be bound to a key in key_bindings.fish.
#
-# RETURNS
+# EXIT STATUS
# 1 qalc not found in PATH
#
# EXAMPLE
diff --git a/functions/_tmux_pipe_log.fish b/functions/_tmux_pipe_log.fish
index feb3594..e4ed18a 100644
--- a/functions/_tmux_pipe_log.fish
+++ b/functions/_tmux_pipe_log.fish
@@ -12,7 +12,7 @@
# unset) or tmux is missing. Shared by conf.d/tmux-logging.fish (shell
# startup) and __fish_config_sync_logging (C5 re-enable) so both stay in sync.
#
-# RETURNS
+# EXIT STATUS
# 0 Always
#
# EXAMPLE
diff --git a/functions/_zellij_dump_log.fish b/functions/_zellij_dump_log.fish
index 05bd1f7..ab036c7 100644
--- a/functions/_zellij_dump_log.fish
+++ b/functions/_zellij_dump_log.fish
@@ -17,7 +17,7 @@
# No-op when logging is disabled, not inside Zellij ($ZELLIJ unset), or the
# zellij binary is missing.
#
-# RETURNS
+# EXIT STATUS
# 0 Always
#
# EXAMPLE
diff --git a/functions/agents-init.fish b/functions/agents-init.fish
index c730954..ff002fa 100644
--- a/functions/agents-init.fish
+++ b/functions/agents-init.fish
@@ -66,7 +66,7 @@
# -s, --silent Suppress all output; errors only (standard UNIX convention)
# -h, --help Show this help message and exit
#
-# RETURNS
+# EXIT STATUS
# 0 Setup completed successfully
# 1 Fatal error (git init failed, move failed, etc.)
#
diff --git a/functions/agy.fish b/functions/agy.fish
index 2b4dd56..bfe90b4 100644
--- a/functions/agy.fish
+++ b/functions/agy.fish
@@ -25,7 +25,7 @@
# ARGUMENTS
# ARGS Any arguments forwarded verbatim to the underlying agy binary
#
-# RETURNS
+# EXIT STATUS
# Exit status of the underlying agy binary
#
# EXAMPLE
diff --git a/functions/auto-pull.fish b/functions/auto-pull.fish
index 1d52ffe..6527fb6 100644
--- a/functions/auto-pull.fish
+++ b/functions/auto-pull.fish
@@ -29,7 +29,7 @@
# status Show enabled/disabled state, repo count, and registry path
# -h, --help Show this help message
#
-# RETURNS
+# EXIT STATUS
# 0 Subcommand succeeded
# 1 Bad usage, target is not a git repo, or target not registered
#
diff --git a/functions/bd-pull.fish b/functions/bd-pull.fish
index c634429..87b60de 100644
--- a/functions/bd-pull.fish
+++ b/functions/bd-pull.fish
@@ -15,7 +15,7 @@
# ARGUMENTS
# owner/repo The repository path in owner/name format
#
-# RETURNS
+# EXIT STATUS
# 0 Issues linked and synced (or no unlinked issues found)
# 1 Missing required argument or environment variables
#
diff --git a/functions/bkg.fish b/functions/bkg.fish
index 927db5b..979da98 100644
--- a/functions/bkg.fish
+++ b/functions/bkg.fish
@@ -16,7 +16,7 @@
# command The command to run detached
# args... Additional arguments for the command
#
-# RETURNS
+# EXIT STATUS
# 0 Command launched successfully
# 1 No command provided
#
diff --git a/functions/branch.fish b/functions/branch.fish
index 0380f29..836320d 100644
--- a/functions/branch.fish
+++ b/functions/branch.fish
@@ -14,7 +14,7 @@
# ARGUMENTS
# branch_name Branch to switch to or create
#
-# RETURNS
+# EXIT STATUS
# 0 Branch checked out or created
# 1 Not inside a git work tree
#
diff --git a/functions/claude.fish b/functions/claude.fish
index b393cf9..3b981d7 100644
--- a/functions/claude.fish
+++ b/functions/claude.fish
@@ -25,7 +25,7 @@
# ARGUMENTS
# ARGS Any arguments forwarded verbatim to the underlying claude binary
#
-# RETURNS
+# EXIT STATUS
# Exit status of the underlying claude binary
#
# EXAMPLE
diff --git a/functions/clone.fish b/functions/clone.fish
index 56775f3..338476a 100644
--- a/functions/clone.fish
+++ b/functions/clone.fish
@@ -14,7 +14,7 @@
# ARGUMENTS
# args... Arguments forwarded to clone-in-kitty (typically a repo URL)
#
-# RETURNS
+# EXIT STATUS
# 0 Repository cloned
# 1 Not running inside Kitty terminal
#
diff --git a/functions/clonet.fish b/functions/clonet.fish
index 0709b3a..f9bac1b 100644
--- a/functions/clonet.fish
+++ b/functions/clonet.fish
@@ -14,7 +14,7 @@
# ARGUMENTS
# args... Arguments forwarded to clone-in-kitty (typically a repo URL)
#
-# RETURNS
+# EXIT STATUS
# 0 Repository cloned
# 1 Not running inside Kitty terminal
#
diff --git a/functions/config-help.fish b/functions/config-help.fish
index 3df064a..af65341 100644
--- a/functions/config-help.fish
+++ b/functions/config-help.fish
@@ -32,10 +32,14 @@
# -m, --man Open the compiled man page via man -l
# -h, --help Print usage and navigation reference, then exit
#
-# RETURNS
-# 0 Manual displayed (or --help printed)
+# EXIT STATUS
+# 0 Manual displayed
# 1 Documentation file not found, or required tool not available
#
+# RETURNS
+# With -h/--help, the usage and navigation reference, printed to stdout.
+# Otherwise, the manual is shown via the resolved pager (not captured stdout).
+#
# EXAMPLE
# config-help
# config-help keybindings
diff --git a/functions/config-settings.fish b/functions/config-settings.fish
index 2668897..5730306 100644
--- a/functions/config-settings.fish
+++ b/functions/config-settings.fish
@@ -56,7 +56,7 @@
# ARGUMENTS
# -h, --help Print usage and exit
#
-# RETURNS
+# EXIT STATUS
# 0 Exited normally (q or Escape pressed)
# 1 Unknown flag passed
#
diff --git a/functions/config-toggle.fish b/functions/config-toggle.fish
index e8e329a..e4e3923 100644
--- a/functions/config-toggle.fish
+++ b/functions/config-toggle.fish
@@ -17,7 +17,7 @@
# ARGUMENTS
# args Passed through verbatim to config-settings
#
-# RETURNS
+# EXIT STATUS
# Same as config-settings
#
# EXAMPLE
diff --git a/functions/config-update.fish b/functions/config-update.fish
index ff79803..b4de9be 100644
--- a/functions/config-update.fish
+++ b/functions/config-update.fish
@@ -18,7 +18,7 @@
# -f, --force Stash local changes before pulling, then pop the stash
# -n, --dry-run Check for upstream changes without applying them
#
-# RETURNS
+# EXIT STATUS
# 0 Config updated (or already up to date)
# 1 Update failed (network error, merge conflict, or not a git repo)
#
diff --git a/functions/detach.fish b/functions/detach.fish
index d18c612..e824239 100644
--- a/functions/detach.fish
+++ b/functions/detach.fish
@@ -18,7 +18,7 @@
# command The command to run detached
# args... Additional arguments for the command
#
-# RETURNS
+# EXIT STATUS
# 0 Command launched or help/version shown
# 1 No command provided or unknown option
#
diff --git a/functions/dng2avif.fish b/functions/dng2avif.fish
index 97d98b4..828895c 100644
--- a/functions/dng2avif.fish
+++ b/functions/dng2avif.fish
@@ -19,7 +19,7 @@
# -s, --speed N Encoder speed 0-10 (default: 3, 0 = slowest)
# -h, --help Show help message
#
-# RETURNS
+# EXIT STATUS
# 0 Conversion complete
# 1 File not found, missing dependency, or encode step failed
#
diff --git a/functions/dockup.fish b/functions/dockup.fish
index 3d16935..22a4751 100644
--- a/functions/dockup.fish
+++ b/functions/dockup.fish
@@ -15,7 +15,7 @@
# -h, --help Show help message
# directory Path to the compose project (defaults to current directory)
#
-# RETURNS
+# EXIT STATUS
# 0 Services updated and running
# 1 Directory not found or no docker-compose.yml present
#
diff --git a/functions/edit.fish b/functions/edit.fish
index 5bb66c4..b02e3ab 100644
--- a/functions/edit.fish
+++ b/functions/edit.fish
@@ -31,7 +31,7 @@
# -s, --silent Suppress all output, including the editor's
# -h, --help Show this help message
#
-# RETURNS
+# EXIT STATUS
# 0 Editor launched successfully
# 1 Conflicting flags, no editor found, or clipboard read failed
#
diff --git a/functions/fc.fish b/functions/fc.fish
index 72490bb..5abb0a1 100644
--- a/functions/fc.fish
+++ b/functions/fc.fish
@@ -16,7 +16,7 @@
# ARGUMENTS
# command_prefix Search history for the newest command matching this
#
-# RETURNS
+# EXIT STATUS
# The edited command's exit status, or a message when history lookup
# found nothing.
#
diff --git a/functions/fish-deps.fish b/functions/fish-deps.fish
index 90449f2..3012adf 100644
--- a/functions/fish-deps.fish
+++ b/functions/fish-deps.fish
@@ -35,7 +35,7 @@
# update Update all installed deps
# sync Install missing deps, then update all
#
-# RETURNS
+# EXIT STATUS
# 0 Subcommand completed
# 1 Unknown subcommand
#
diff --git a/functions/fish_mode_prompt.fish b/functions/fish_mode_prompt.fish
index 01065f8..ef47dd9 100644
--- a/functions/fish_mode_prompt.fish
+++ b/functions/fish_mode_prompt.fish
@@ -9,7 +9,7 @@
# that would prepend to the prompt line and break the two-line nim layout.
# Vi-mode display is handled inside fish_prompt itself.
#
-# RETURNS
+# EXIT STATUS
# 0 Always (function body is empty)
#
# EXAMPLE
diff --git a/functions/fish_prompt.fish b/functions/fish_prompt.fish
index 1a13912..fd48fa7 100644
--- a/functions/fish_prompt.fish
+++ b/functions/fish_prompt.fish
@@ -10,8 +10,11 @@
# C3 overrides are disabled. Has no external dependencies; uses only fish-provided functions
# (set_color, fish_git_prompt, prompt_pwd, prompt_hostname).
#
+# EXIT STATUS
+# 0 Always
+#
# RETURNS
-# 0 Always; outputs the prompt to stdout
+# The rendered two-line prompt, printed to stdout
#
# EXAMPLE
# # Rendered automatically by fish; not called directly.
diff --git a/functions/fish_right_prompt.fish b/functions/fish_right_prompt.fish
index 9b8c3f0..bacba6d 100644
--- a/functions/fish_right_prompt.fish
+++ b/functions/fish_right_prompt.fish
@@ -11,7 +11,7 @@
# context (if non-default) — that block is paired with the starship prompt
# which already guards on both conditions.
#
-# RETURNS
+# EXIT STATUS
# 0 Always
#
# EXAMPLE
diff --git a/functions/fzf_configure_bindings.fish b/functions/fzf_configure_bindings.fish
index e20a8e7..f0c5209 100644
--- a/functions/fzf_configure_bindings.fish
+++ b/functions/fzf_configure_bindings.fish
@@ -19,7 +19,7 @@
# --variables=key Override the variables search binding (default: Ctrl-V)
# -h, --help Show help message
#
-# RETURNS
+# EXIT STATUS
# 0 Bindings installed or help shown
# 22 Invalid option or positional argument provided
#
diff --git a/functions/gi.fish b/functions/gi.fish
index e10d96f..d655f9e 100644
--- a/functions/gi.fish
+++ b/functions/gi.fish
@@ -22,10 +22,14 @@
# -s, --stdout Print API output to stdout instead of .gitignore
# targets Comma- or space-separated list of language/tool names
#
-# RETURNS
-# 0 Patterns appended or printed
+# EXIT STATUS
+# 0 Patterns appended, or resolved with -s/--stdout or -l/--list
# 1 Not in a git repository or API fetch failed
#
+# RETURNS
+# With -s/--stdout, the fetched .gitignore pattern text, printed to stdout.
+# With -l/--list, the supported target list, printed to stdout.
+#
# EXAMPLE
# gi python,venv
# gi -b -p
diff --git a/functions/gip6.fish b/functions/gip6.fish
index 4ddc195..735ffc6 100644
--- a/functions/gip6.fish
+++ b/functions/gip6.fish
@@ -11,10 +11,13 @@
# Fetches and prints the machine's public IPv6 address using icanhazip.com.
# Prints an error message if IPv6 is unavailable on the current network.
#
-# RETURNS
-# 0 IPv6 address printed
+# EXIT STATUS
+# 0 IPv6 address resolved
# 1 IPv6 unavailable or not supported on this network
#
+# RETURNS
+# The machine's public IPv6 address, printed to stdout
+#
# EXAMPLE
# gip6
function gip6 --description 'Get public IPv6 address'
diff --git a/functions/git-clean.fish b/functions/git-clean.fish
index 91ee5f2..c2dbe35 100644
--- a/functions/git-clean.fish
+++ b/functions/git-clean.fish
@@ -16,7 +16,7 @@
# -h, --help Show help message
# -f, --force Force-delete unmerged orphaned branches (git branch -D)
#
-# RETURNS
+# EXIT STATUS
# 0 Cleanup complete
# 1 Argument parsing failed
#
diff --git a/functions/gitup.fish b/functions/gitup.fish
index 5bff81f..ae2c831 100644
--- a/functions/gitup.fish
+++ b/functions/gitup.fish
@@ -14,7 +14,7 @@
# ARGUMENTS
# args... Forwarded verbatim to git fetch
#
-# RETURNS
+# EXIT STATUS
# 0 Fetch and status succeeded
# 1 Not inside a git work tree
#
diff --git a/functions/joplin.fish b/functions/joplin.fish
index cb6881a..92eb222 100644
--- a/functions/joplin.fish
+++ b/functions/joplin.fish
@@ -14,7 +14,7 @@
# ARGUMENTS
# args... Arguments forwarded to the joplin command
#
-# RETURNS
+# EXIT STATUS
# 0 Joplin ran successfully
# 1 joplin binary not found in PATH
#
diff --git a/functions/kitty-logging.fish b/functions/kitty-logging.fish
index a0fb79e..3c56241 100644
--- a/functions/kitty-logging.fish
+++ b/functions/kitty-logging.fish
@@ -27,7 +27,7 @@
# dismiss Stop the per-session reminder
# -h, --help Show this help
#
-# RETURNS
+# EXIT STATUS
# 0 Success
# 1 Unknown subcommand/flag, kitty missing, or a write failure
#
diff --git a/functions/logs.fish b/functions/logs.fish
index 14f2825..3474ed1 100644
--- a/functions/logs.fish
+++ b/functions/logs.fish
@@ -25,7 +25,7 @@
# -h, --help Show help message
# -c, --category cat Filter to one category: scrollback, paru, or yay
#
-# RETURNS
+# EXIT STATUS
# 0 File viewed or no file selected
# 1 No log files found
#
diff --git a/functions/mkcd.fish b/functions/mkcd.fish
index b944419..24bd165 100644
--- a/functions/mkcd.fish
+++ b/functions/mkcd.fish
@@ -18,7 +18,7 @@
# -s, --silent Suppress directory creation output
# Directory to create and enter
#
-# RETURNS
+# EXIT STATUS
# 0 Directory created (or already existed) and entered successfully
# 1 Directory creation or cd failed
#
diff --git a/functions/open-url.fish b/functions/open-url.fish
index d7043b5..007e9dd 100644
--- a/functions/open-url.fish
+++ b/functions/open-url.fish
@@ -30,7 +30,7 @@
# -v, --verbose Print which browser is being launched
# -h, --help Print usage and exit
#
-# RETURNS
+# EXIT STATUS
# 0 Browser launched
# 1 No URL given, invalid $BROWSER, or no browser found
#
diff --git a/functions/p.fish b/functions/p.fish
index c78a111..0d83760 100644
--- a/functions/p.fish
+++ b/functions/p.fish
@@ -15,10 +15,13 @@
# -h, --help Show usage help
# args... Arguments forwarded to the clipboard tool
#
-# RETURNS
-# 0 Clipboard contents printed successfully
+# EXIT STATUS
+# 0 Clipboard contents read successfully
# 1 No supported clipboard tool found
#
+# RETURNS
+# The clipboard contents, printed to stdout
+#
# EXAMPLE
# p | grep foo
# p > file.txt
diff --git a/functions/parur.fish b/functions/parur.fish
index 22bf1e2..62a65e1 100644
--- a/functions/parur.fish
+++ b/functions/parur.fish
@@ -12,7 +12,7 @@
# pacman -Qi previews, then removes the selected packages using paru or yay.
# Arch Linux only.
#
-# RETURNS
+# EXIT STATUS
# 0 Packages removed or none selected
# 1 No AUR helper (paru or yay) found
#
diff --git a/functions/paste.fish b/functions/paste.fish
index f88d22e..33f6e45 100644
--- a/functions/paste.fish
+++ b/functions/paste.fish
@@ -14,10 +14,13 @@
# ARGUMENTS
# args... Arguments forwarded to the clipboard tool
#
-# RETURNS
-# 0 Clipboard contents printed successfully
+# EXIT STATUS
+# 0 Clipboard contents read successfully
# 1 No supported clipboard tool found
#
+# RETURNS
+# The clipboard contents, printed to stdout
+#
# EXAMPLE
# paste > file.txt
function paste --description 'Paste from clipboard'
diff --git a/functions/pkg.fish b/functions/pkg.fish
index c11549c..2b3f255 100644
--- a/functions/pkg.fish
+++ b/functions/pkg.fish
@@ -27,7 +27,7 @@
# -u, --uninstall Force uninstall mode
# package One or more package names to install or remove
#
-# RETURNS
+# EXIT STATUS
# 0 Operation completed
# 1 No supported package manager found, unknown flag, or package operation failed
#
diff --git a/functions/poke.fish b/functions/poke.fish
index 8f901c7..8cff1c5 100644
--- a/functions/poke.fish
+++ b/functions/poke.fish
@@ -14,7 +14,7 @@
# ARGUMENTS
# file One or more file paths to create
#
-# RETURNS
+# EXIT STATUS
# 0 Files created
# 1 No file argument provided
#
diff --git a/functions/qc.fish b/functions/qc.fish
index 55d0639..5c8ed89 100644
--- a/functions/qc.fish
+++ b/functions/qc.fish
@@ -22,7 +22,7 @@
# prompt... Prompt forwarded to aichat
# -h, --help Show usage help
#
-# RETURNS
+# EXIT STATUS
# aichat's exit status.
#
# EXAMPLE
diff --git a/functions/replay.fish b/functions/replay.fish
index f559f00..cf529d9 100644
--- a/functions/replay.fish
+++ b/functions/replay.fish
@@ -15,7 +15,7 @@
# ARGUMENTS
# commands Bash command string to execute and replay
#
-# RETURNS
+# EXIT STATUS
# 0 Commands ran successfully and changes were replayed
# 1 Bash command exited with a non-zero status
#
diff --git a/functions/repo-open.fish b/functions/repo-open.fish
index 99cc2fe..9f5d3a8 100644
--- a/functions/repo-open.fish
+++ b/functions/repo-open.fish
@@ -37,10 +37,13 @@
# -r, --root Ignore the current sub-directory; link to the repo root
# -h, --help Print usage and exit
#
-# RETURNS
-# 0 URL opened (or printed)
+# EXIT STATUS
+# 0 URL opened, or resolved with -p/--print
# 1 Not a git repo, no origin remote, or browser launch failed
#
+# RETURNS
+# With -p/--print, the resolved repository URL, printed to stdout
+#
# EXAMPLE
# repo-open # open current branch (+ subdir) in browser
# repo-open --print # just print the URL
diff --git a/functions/rm.fish b/functions/rm.fish
index 2e18c2c..965e0e8 100644
--- a/functions/rm.fish
+++ b/functions/rm.fish
@@ -25,7 +25,7 @@
# -r, -R, --recursive Forwarded to trash put alongside path arguments
# args... Files or paths to trash or remove
#
-# RETURNS
+# EXIT STATUS
# 0 Operation succeeded
# 1 trash put failed or file not found
#
diff --git a/functions/sbver.fish b/functions/sbver.fish
index 9803eec..b9a807d 100644
--- a/functions/sbver.fish
+++ b/functions/sbver.fish
@@ -16,7 +16,7 @@
# ARGUMENTS
# --brief Suppress per-file output; show only the final summary
#
-# RETURNS
+# EXIT STATUS
# 0 All binaries verified (or summary shown)
# 1 sbctl is not installed
#
diff --git a/functions/scrub.fish b/functions/scrub.fish
index c528ab8..7ec50f0 100644
--- a/functions/scrub.fish
+++ b/functions/scrub.fish
@@ -19,7 +19,7 @@
# -d, --dry-run Show targets without deleting
# -h, --help Show usage help
#
-# RETURNS
+# EXIT STATUS
# 0 Sweep completed (or dry run shown)
# 1 fd not found, or unknown argument provided
#
diff --git a/functions/search.fish b/functions/search.fish
index 2494fb8..e6a69c1 100644
--- a/functions/search.fish
+++ b/functions/search.fish
@@ -14,7 +14,7 @@
# ARGUMENTS
# args... Arguments forwarded to paru or yay
#
-# RETURNS
+# EXIT STATUS
# 0 AUR helper ran successfully
# 1 No AUR helper (paru or yay) found
#
diff --git a/functions/smart_exit.fish b/functions/smart_exit.fish
index 86118c9..732103b 100644
--- a/functions/smart_exit.fish
+++ b/functions/smart_exit.fish
@@ -17,7 +17,7 @@
# -h, --help Show help message
# -n, --no-log Exit without saving a scrollback log
#
-# RETURNS
+# EXIT STATUS
# 0 Shell session exited
# 1 Argument parsing failed
#
diff --git a/functions/split.fish b/functions/split.fish
index 498d18d..9317d8a 100644
--- a/functions/split.fish
+++ b/functions/split.fish
@@ -18,7 +18,7 @@
# command... Command to run in the new pane; opens a bare fish
# shell if omitted
#
-# RETURNS
+# EXIT STATUS
# 0 Pane opened successfully
# 1 Not running inside Kitty or WezTerm
#
diff --git a/functions/sponge_filter_secrets.fish b/functions/sponge_filter_secrets.fish
index 66ffa76..37aaef8 100644
--- a/functions/sponge_filter_secrets.fish
+++ b/functions/sponge_filter_secrets.fish
@@ -21,7 +21,7 @@
# exit_code Exit code of the command (unused)
# previously_in_history "true"/"false" flag (unused)
#
-# RETURNS
+# EXIT STATUS
# 0 Command contains a secret value — filter out of history
# 1 No secret value found — keep in history
#
diff --git a/functions/spwin.fish b/functions/spwin.fish
index 4467343..54bbd04 100644
--- a/functions/spwin.fish
+++ b/functions/spwin.fish
@@ -14,7 +14,7 @@
# ARGUMENTS
# args... Arguments forwarded to the spawn command
#
-# RETURNS
+# EXIT STATUS
# 0 Window opened successfully
# 1 Not running inside Kitty or WezTerm
#
diff --git a/functions/sudo-toggle.fish b/functions/sudo-toggle.fish
index af52653..e46547f 100644
--- a/functions/sudo-toggle.fish
+++ b/functions/sudo-toggle.fish
@@ -13,7 +13,7 @@
# otherwise require a password entry. Clears the sudo credential cache
# when re-enabling, so the lockdown takes effect immediately.
#
-# RETURNS
+# EXIT STATUS
# 0 Rule toggled
#
# EXAMPLE
diff --git a/functions/superpowers.fish b/functions/superpowers.fish
index 2e8429e..dbd3781 100644
--- a/functions/superpowers.fish
+++ b/functions/superpowers.fish
@@ -18,7 +18,7 @@
# -g, --global Apply at user/global scope instead of workspace/project
# -h, --help Show usage help
#
-# RETURNS
+# EXIT STATUS
# 0 Mode applied successfully
# 1 No on/off mode specified
#
diff --git a/functions/tab.fish b/functions/tab.fish
index d0f17a6..9b77440 100644
--- a/functions/tab.fish
+++ b/functions/tab.fish
@@ -15,7 +15,7 @@
# ARGUMENTS
# args... Arguments forwarded to the terminal's launch command
#
-# RETURNS
+# EXIT STATUS
# 0 Tab opened successfully
# 1 No supported terminal found
#
diff --git a/functions/upgrade.fish b/functions/upgrade.fish
index 9c9974e..296f56d 100644
--- a/functions/upgrade.fish
+++ b/functions/upgrade.fish
@@ -11,7 +11,7 @@
# Runs a full system upgrade via paru or yay with --noconfirm. Falls
# back to yay if paru is not installed. Arch Linux only.
#
-# RETURNS
+# EXIT STATUS
# 0 Upgrade completed successfully
# 1 No AUR helper (paru or yay) found
#
diff --git a/functions/wake-lock.fish b/functions/wake-lock.fish
index 22db62b..7fdd018 100644
--- a/functions/wake-lock.fish
+++ b/functions/wake-lock.fish
@@ -15,7 +15,7 @@
# command Command to run with sleep inhibition active
# args... Arguments forwarded to the command
#
-# RETURNS
+# EXIT STATUS
# 0 Command ran and completed
# 1 No command provided
#
diff --git a/functions/y.fish b/functions/y.fish
index b965c3f..10444f9 100644
--- a/functions/y.fish
+++ b/functions/y.fish
@@ -14,7 +14,7 @@
# ARGUMENTS
# text Text to copy; reads from stdin if omitted
#
-# RETURNS
+# EXIT STATUS
# 0 Text copied to clipboard
# 1 No clipboard provider found
#
diff --git a/functions/zoxide.fish b/functions/zoxide.fish
index 349083f..618755a 100644
--- a/functions/zoxide.fish
+++ b/functions/zoxide.fish
@@ -60,7 +60,7 @@ end
# ARGUMENTS
# check The string to compare against the first non-switch token
#
-# RETURNS
+# EXIT STATUS
# 0 First token equals check
# 1 No token or token does not match
#