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
13 changes: 10 additions & 3 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
9 changes: 5 additions & 4 deletions skills/canonical/gds-bootstrap-device/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -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/<device>.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
Expand Down
6 changes: 3 additions & 3 deletions skills/canonical/gds-orient/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
9 changes: 9 additions & 0 deletions tests/test_bootstrap_device.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down