Generate the settings reference from the schema

Every other form of documentation here has drifted at least once today:
search routing that pointed at a page not containing the setting, a
contract that pinned the bug the same commit fixed, and a comment in
shell.qml that failed to stop me making the exact mistake it described.
Prose describing 127 settings would drift the day after it was written.

So docs/settings.md is generated, and a contract fails the moment the
committed copy stops matching the schema. The document cannot be wrong
for longer than it takes to run the suite.

It reads the schema by parsing rather than importing, since there is no
QML interpreter here and requiring a compositor to build documentation
would be worse. That parser is the risk, so it FAILS LOUDLY: if it stops
recognising the file it exits non-zero with the reason and writes
nothing, because a partial reference is worse than a stale one -- stale
is caught by --check, partial reads as complete. Verified: with the
entry pattern broken it reports "only 0 entries parsed" and leaves the
committed file untouched.

The contract also proves --check actually compares content, by appending
a line and confirming it fails, rather than trusting a command that
returns success to mean anything.

Claude-Session: https://claude.ai/code/session_01BRvzt4H8XXLPVH5MyYdk9L
This commit is contained in:
Gabriel Brown
2026-08-19 08:37:43 -04:00
parent d96863b687
commit 588dec4adc
3 changed files with 591 additions and 0 deletions
+60
View File
@@ -0,0 +1,60 @@
#!/usr/bin/env bash
# The settings reference is generated, and must not be stale.
#
# Every other kind of documentation here has drifted at least once: routing that
# pointed at a page not containing the setting, contracts that pinned the bug
# they were meant to prevent, a comment that failed to stop the person who read
# it from making the exact mistake it described. Prose describing 127 settings
# would drift the day after it was written.
#
# So docs/settings.md is generated from the schema, and this fails the moment
# the committed copy stops matching. That is the whole mechanism: the document
# cannot be wrong for longer than it takes to run the suite.
set -uo pipefail
repo_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
generator="$repo_dir/config/dot/quickshell/scripts/panama-settings-docs"
doc="$repo_dir/docs/settings.md"
fail() {
printf 'settings docs contract: %s\n' "$1" >&2
exit 1
}
[[ -x "$generator" ]] || fail 'the generator is missing or not executable'
"$generator" --check || fail 'docs/settings.md is stale -- run quickshell/scripts/panama-settings-docs and commit the result'
# A generator that silently emitted nothing would also pass --check against an
# equally empty file, so the output is checked for substance too.
[[ -s "$doc" ]] || fail 'docs/settings.md is empty'
settings="$(grep -c '^| \*\*' "$doc")"
schema_keys="$(grep -c 'key: "' "$repo_dir/config/dot/quickshell/config/PreferenceSchema.qml")"
# Internal keys are deliberately omitted, so the document is smaller than the
# schema -- but not by much. A large gap means the reader stopped recognising
# entries and quietly documented a fraction of them.
(( settings > schema_keys * 8 / 10 )) \
|| fail "the reference documents only $settings of $schema_keys schema keys, which suggests the generator stopped parsing partway"
# The compositor-backed settings are the ones worth naming precisely, since
# that is the string someone would search the Hyprland docs for.
grep -q 'cursor:zoom_factor' "$doc" \
|| fail 'compositor option names are missing from the reference'
# A stale copy must be detectable, not merely regenerable. Prove the check
# actually compares content rather than always returning success.
scratch="$(mktemp -d /tmp/panama-docs.XXXXXX)"
trap 'rm -rf "$scratch"' EXIT
cp "$doc" "$scratch/settings.md"
printf '\n<!-- drift -->\n' >>"$doc"
if "$generator" --check >/dev/null 2>&1; then
cp "$scratch/settings.md" "$doc"
fail '--check reported success on a modified file, so staleness would never be caught'
fi
cp "$scratch/settings.md" "$doc"
printf 'settings docs contract: PASS (%d settings documented)\n' "$settings"