From 74d3968dd740cfc0317ccc80cd3be8c5f7e0df9e Mon Sep 17 00:00:00 2001 From: Danil Silantyev Date: Tue, 15 Sep 2026 15:10:59 +0500 Subject: [PATCH] docs(device): name desktop-server in orient and bootstrap skills The schema and orchestrator already have four profiles. The workflow prose still listed three, so agents could miss the tunneled class. Co-authored-by: Cursor --- CHANGELOG.md | 13 ++++++++++--- skills/canonical/gds-bootstrap-device/SKILL.md | 9 +++++---- skills/canonical/gds-orient/SKILL.md | 6 +++--- tests/test_bootstrap_device.py | 9 +++++++++ 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ae6ce99..dfbe5dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,11 +5,18 @@ Versioning. ## [Unreleased] -- Align the desktop-server device class with macos-ubuntu-bootstrap: Docker - may be none, rootful, or rootless. The bootstrap orchestrator forwards the - declared docker_mode and server-baseline hardening flags. +- Add the `desktop-server` device class: Linux x86_64, GUI required, Docker + none|rootful|rootless (default none). The bootstrap orchestrator forwards + `docker_mode` and server-baseline hardening flags. Name it in `gds-orient` + and `gds-bootstrap-device` the same way the schema already does. - Keep `append_hardening_flags` `set -e` safe when ssh/ufw/fail2ban are unset, so desktop-server apply does not exit before phase 0. +- Allow identical shared harness projections and dot-prefixed repository names. +- Strip registration planning inputs from operations payloads. +- Bound native integration suites inside the platform job budget and wait for + escaped-child startup before cancellation. +- Record extra-approval false on `main` and pin reusable workflows to current + module mains. ## [0.9.2] - 2026-09-12 diff --git a/skills/canonical/gds-bootstrap-device/SKILL.md b/skills/canonical/gds-bootstrap-device/SKILL.md index f802652..1dc69e8 100644 --- a/skills/canonical/gds-bootstrap-device/SKILL.md +++ b/skills/canonical/gds-bootstrap-device/SKILL.md @@ -50,14 +50,15 @@ cannot enter it. Present these steps as exact commands the owner runs in a terminal, then wait for confirmation before continuing. 1. **OS bootstrap (phase 2)** installs system packages via apt and (on - desktop) configures GNOME, keyboard, BrowserOS, and removes stock Firefox. - The owner runs: + `desktop` / `desktop-server`) configures GNOME, keyboard, BrowserOS, and + removes stock Firefox. The owner runs: ``` scripts/bootstrap-device.sh --device estate/devices/.yaml --apply --from-phase 2 ``` The script prompts for sudo and handles the rest. Desktop customization - (`scripts/ubuntu/desktop.sh`) is called automatically for the `desktop` - profile with `gui: enabled`; each step is independent and idempotent. + (`scripts/ubuntu/desktop.sh`) is called automatically for GUI-enabled + `desktop` and `desktop-server` profiles; each step is independent and + idempotent. 2. **Harness module installs (phase 2, inside OS bootstrap)** may install deb packages (e.g. ZCode). The OS bootstrap script prompts for sudo once and diff --git a/skills/canonical/gds-orient/SKILL.md b/skills/canonical/gds-orient/SKILL.md index f591f33..aecd9c4 100644 --- a/skills/canonical/gds-orient/SKILL.md +++ b/skills/canonical/gds-orient/SKILL.md @@ -41,9 +41,9 @@ provider state. effective policy evidence, and selected skill profiles. When the resolved device declares a `class:` block (profile/gui/docker_mode/execution_policy), surface it too: the class tells whether this is a `desktop`, - `desktop-builds`, or headless `server` host and which execution policy - governs builds, and it selects the OS-installer flags the phased bootstrap - drives. + `desktop-builds`, tunneled `desktop-server`, or headless `server` host + and which execution policy governs builds, and it selects the OS-installer + flags the phased bootstrap drives. 4. Route the user to the smallest applicable workflow. ## Stop conditions diff --git a/tests/test_bootstrap_device.py b/tests/test_bootstrap_device.py index 4adc171..8cb7611 100644 --- a/tests/test_bootstrap_device.py +++ b/tests/test_bootstrap_device.py @@ -47,6 +47,15 @@ def test_source_build_never_accepts_a_merely_runnable_binary() -> None: assert "if ! source_build_dirty" in script +def test_orient_skill_names_desktop_server_in_the_workflow() -> None: + skill = (ROOT / "skills/canonical/gds-orient/SKILL.md").read_text(encoding="utf-8") + assert "tunneled `desktop-server`, or headless `server`" in skill + bootstrap = (ROOT / "skills/canonical/gds-bootstrap-device/SKILL.md").read_text( + encoding="utf-8" + ) + assert "`desktop` and `desktop-server` profiles" in bootstrap + + def test_orchestrator_forwards_class_docker_mode() -> None: script = BOOTSTRAP.read_text(encoding="utf-8") assert 'desktop-server)' in script