Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions .github/workflows/launcher-standard-lockstep.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@
name: launcher-standard lock-step

# Enforces the sync requirement declared in launcher/README.adoc §Sync
# requirement: the machine-readable form (launcher-standard.a2ml) and the
# prose form (docs/UX-standards/launcher-standard.adoc) MUST be edited in
# the same PR. Drift between the two is a standards-compliance bug.
# requirement: the machine-readable form (launcher-standard_praxis.deed) and
# the prose form (docs/UX-standards/launcher-standard.adoc) MUST be edited
# in the same PR. Drift between the two is a standards-compliance bug.
#
# How it works: the workflow triggers only when one of the two files in
# the lock-step group is touched. Inside the job we then verify that the
Expand All @@ -16,7 +16,7 @@ name: launcher-standard lock-step
on:
pull_request:
paths:
- 'launcher/launcher-standard.a2ml'
- 'launcher/launcher-standard_praxis.deed'
- 'docs/UX-standards/launcher-standard.adoc'

concurrency:
Expand Down Expand Up @@ -48,7 +48,7 @@ jobs:
# The lock-step group. Editing any of these MUST be accompanied
# by edits to the others in the same PR.
declare -a GROUP=(
"launcher/launcher-standard.a2ml"
"launcher/launcher-standard_praxis.deed"
"docs/UX-standards/launcher-standard.adoc"
)

Expand Down Expand Up @@ -78,7 +78,7 @@ jobs:
echo "::error::launcher-standard lock-step violation"
echo ""
echo "Per launcher/README.adoc §Sync requirement, the machine-readable"
echo "form (a2ml) and the prose form (adoc) MUST be edited in the"
echo "form (deed) and the prose form (adoc) MUST be edited in the"
echo "same PR. Drift between them is a standards-compliance bug."
echo ""
echo "Touched in this PR:"
Expand All @@ -93,7 +93,7 @@ jobs:
echo ""
echo "Fix: add the matching edit to the file(s) above. If your"
echo "change is genuinely one-sided (e.g. a prose-only typo fix"
echo "with no a2ml equivalent), add a no-op whitespace touch to"
echo "with no deed equivalent), add a no-op whitespace touch to"
echo "the other file with a commit message explaining why."
exit 1
fi
Expand Down
366 changes: 366 additions & 0 deletions 1-formats/deed/mappings/launcher-standard-to-praxis-deed.adoc

Large diffs are not rendered by default.

20 changes: 10 additions & 10 deletions docs/UX-standards/launcher-standard.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ stop_server() {
[source,bash]
----
wait_for_server() {
# All three values are env-overridable per [runtime] in launcher-standard.a2ml.
# All three values are env-overridable per (runtime) in launcher-standard_praxis.deed.
local max_wait="${1:-${WAIT_FOR_URL_TIMEOUT_SECONDS:-15}}"
local poll_interval="${WAIT_FOR_URL_POLL_INTERVAL:-1}"
local per_request_timeout=2 # curl --max-time; caps each probe so a
Expand Down Expand Up @@ -104,7 +104,7 @@ fi

=== Browser Launching

Resolution order, per `[browser-launch]` in `launcher-standard.a2ml`:
Resolution order, per `(browser-launch)` in `launcher-standard_praxis.deed`:

1. `$BROWSER` env var (de-facto Unix convention; user/operator override)
2. Platform-specific ladder, dispatched via `uname -s`:
Expand Down Expand Up @@ -178,8 +178,8 @@ err() {
echo "[$APP_NAME] Try: check $LOG_FILE for details" >&2
}

# Source the shared GUI-error helper (reference impl of [error-visibility]
# from launcher-standard.a2ml). Falls back to err() if not available so
# Source the shared GUI-error helper (reference impl of (error-visibility)
# from launcher-standard_praxis.deed). Falls back to err() if not available so
# every launcher works even without the shared helper on PATH.
if [ -r "$(hp_resolve_desktop_tools gui-error.sh 2>/dev/null)" ]; then
# shellcheck disable=SC1090
Expand All @@ -197,15 +197,15 @@ fi
----

NOTE: `hp_gui_error` writes to stderr unconditionally per
`[error-visibility].always-also-to-stderr = true`. Set `NO_GUI_ERROR=1`
`(error-visibility :always-also-to-stderr #t)`. Set `NO_GUI_ERROR=1`
to suppress the dialog attempt (useful in CI).

=== Soft-Attach (optional ecosystem integrations)

A "soft-attach" tool is one the launcher calls IF it is installed, and
silently skips otherwise. The estate ships three by default
(`feedback-o-tron`, `hypatia`, `panic-attack`) — see
`[soft-attach].tools` in `launcher-standard.a2ml` for the live list.
`(soft-attach (tool ...))` in `launcher-standard_praxis.deed` for the live list.

Downstream launchers SHOULD source `launcher/soft-attach.sh` rather
than re-implementing the if-installed-then-invoke pattern, so behaviour
Expand Down Expand Up @@ -234,7 +234,7 @@ on_start_failed() {
----

Note that template substitution (`{app-name}`, `{log-file}`,
`{repo-dir}` in the a2ml) is the launcher's responsibility — interpolate
`{repo-dir}` in the deed) is the launcher's responsibility — interpolate
before passing the command line to `hp_soft_attach_run`.

== Standard Modes
Expand Down Expand Up @@ -431,7 +431,7 @@ feedback.
Type=Application
Name=Application Name
# The Exec path MUST be the absolute path resolved at install time via
# the [resolution].desktop-tools-search ladder (see §Canonical location).
# the (resolution (desktop-tools-search ...)) ladder (see §Canonical location).
# The freedesktop spec does NOT expand environment variables in Exec=
# lines, so `--integ` is responsible for picking the host-correct path.
# The /var/mnt/eclipse/... value below is one possible resolution — on
Expand Down Expand Up @@ -487,7 +487,7 @@ The single source of truth is:
For desktop files (which need a stable absolute path) a symlink or copy
is deployed inside a `.desktop-tools/` directory whose location varies by
host. Consumers MUST resolve that location via the search ladder declared
in `launcher/launcher-standard.a2ml` `[resolution].desktop-tools-search`:
in `launcher/launcher-standard_praxis.deed` `(resolution (desktop-tools-search ...))`:

1. `$HP_DESKTOP_TOOLS` — explicit override
2. `$HP_ESTATE_ROOT/.desktop-tools` — estate-root convention
Expand All @@ -504,7 +504,7 @@ SHOULD use the reference impl rather than re-implementing the ladder.
`launch-scaffolder` copies the same script into its baked-in standards
so regenerated launchers stay in sync. The legacy single hard-coded path
(`/var/mnt/eclipse/repos/.desktop-tools/keepopen.sh`) remains in the
a2ml as `deployed-symlink` for compatibility with pre-resolution
deed as `:deployed-symlink` for compatibility with pre-resolution
consumers; new code MUST use the ladder.

=== Calling convention
Expand Down
20 changes: 11 additions & 9 deletions launcher/README.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ specification at `docs/UX-standards/launcher-standard.adoc`.

== Files

`launcher-standard.a2ml`::
The authoritative A2ML form of the launcher standard. All tooling that
`launcher-standard_praxis.deed`::
The authoritative DEED form of the launcher standard. All tooling that
provisions, audits, or validates launchers MUST consume this file rather
than re-parsing the prose spec or carrying its own vendored copy.

Expand All @@ -22,14 +22,16 @@ below). It consumes this standard by reference, in this resolution order:

. `--standard <path>` — explicit CLI argument
. `$LAUNCH_SCAFFOLDER_STANDARD` — environment-variable override
. The `[resolution].standard-search` ladder declared in
`launcher-standard.a2ml`, consulted in order, first existing path wins:
. The `(resolution (standard-search ...))` ladder declared in
`launcher-standard_praxis.deed`, consulted in `:priority` order — the
integers carry the order, because file position is not semantic in DEED —
first existing path wins:
+
.. `$HP_ESTATE_ROOT/standards/launcher/launcher-standard.a2ml`
.. `$XDG_DATA_HOME/hyperpolymath/standards/launcher/launcher-standard.a2ml`
.. `/var/mnt/eclipse/repos/standards/launcher/launcher-standard.a2ml`
.. `$HOME/developer/repos/standards/launcher/launcher-standard.a2ml`
.. `$HOME/dev/repos/standards/launcher/launcher-standard.a2ml`
.. `$HP_ESTATE_ROOT/standards/launcher/launcher-standard_praxis.deed`
.. `$XDG_DATA_HOME/hyperpolymath/standards/launcher/launcher-standard_praxis.deed`
.. `/var/mnt/eclipse/repos/standards/launcher/launcher-standard_praxis.deed`
.. `$HOME/developer/repos/standards/launcher/launcher-standard_praxis.deed`
.. `$HOME/dev/repos/standards/launcher/launcher-standard_praxis.deed`

The ladder replaces the previous single hard-coded
`/var/mnt/eclipse/repos/...` literal, which broke the standard on any host
Expand Down
2 changes: 1 addition & 1 deletion launcher/gui-error.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
# SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) <j.d.a.jewell@open.ac.uk>
#
# gui-error.sh — reference implementation of [error-visibility] from
# launcher/launcher-standard.a2ml.
# launcher/launcher-standard_praxis.deed.
#
# When the launcher runs in a GUI context (no TTY + DISPLAY or
# WAYLAND_DISPLAY set), errors written only to stderr disappear: the
Expand Down
Loading
Loading