Commit Graph
317 Commits
Author SHA1 Message Date
Emma ThorpeandClaude Opus 5 80be10f125 chore(claude): calibrate the Soviet Engineer persona against a reference
CI / flake (push) Skipped
CI / flake (pull_request) Successful in 1m25s
The persona drifted to a neutral status-report register on Opus 5 with
all three enforcement layers active: the output style, the global
CLAUDE.md and the per-turn UserPromptSubmit hook. Each specifies the
register in adjectives, and adjectives do not produce a register.

Record the calibration reference -- the Soviet engineers and scientists
of HBO's Chernobyl and the Soviet characters of For All Mankind -- in the
output style, CLAUDE.md and the memory, with the concrete rules it
implies: lead with the number, state consequence as fact rather than as
warning or joke, correct a soft word with the hard one, say "I do not
know" flatly and then say what would settle it, no wry sign-offs.

Add seven neutral/target pairs so the register is demonstrated rather
than described: reporting finished work, the same under a ticket, a
failure with no root cause, being blocked by a tool's limits, a verdict
against a release in motion, an operation against live infrastructure,
and refusing a bad idea. Subject matter is spread across working contexts
so the voice is not anchored to one repository.

Name the three recurring faults, since the adjective lists failed to
prevent them: writerly prose, a serving register that ends on an offer,
and correctness with no judgement in it. Cutting flourishes and cutting
opinions are opposite moves; the section says so.

Gates required by standing instructions -- showing a PR body before
creating it, confirming before anything outward-facing -- survive the
change in register. Only the phrasing changes.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-01 12:07:56 +01:00
lyrathorpe cdb034b0e2 Merge pull request 'fix(console): first-boot follow-ups, plus three Sway desktop fixes' (#113) from fix/console-followups into main
CI / flake (push) Successful in 4m37s
Reviewed-on: #113
2026-09-01 10:39:47 +01:00
Emma ThorpeandClaude Opus 5 b586f98037 chore: ignore .claude/
CI / flake (push) Skipped
CI / flake (pull_request) Successful in 4m44s
Per-machine Claude Code settings, not shared configuration.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-01 10:32:24 +01:00
Emma ThorpeandClaude Opus 5 3311f64c6a docs(console): separate the two Steam picker faults
The library-folder picker does open and Steam does create the directory
structure; the library simply never appears in the Storage UI. That rules
out the portal FileChooser for this symptom and points at the
write-and-execute probe Steam runs before recording the folder in
libraryfolders.vdf (ValveSoftware/steam-for-linux#8450). Document how to
reproduce that probe inside Steam's FHS sandbox with steam-run, and keep
library_folder_add as the route that reports a reason.

The Add a Non-Steam Game dialog is a separate symptom and keeps the
portal explanation.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-01 10:32:24 +01:00
Emma ThorpeandClaude Opus 5 46c03df06d feat(sway): 4K scale 2, natural mouse scroll, idle inhibit for emulators
Three unrelated desktop-side fixes, all in home/sway.nix.

Sway cannot key an output rule on resolution, so scale 2 on 4K displays
is applied by a user service that runs once at session start and again on
every output event, which is what makes it survive a display being
switched off and on. The scale guard in the jq filter stops the
subscription feeding itself. kanshi still owns mode and position; no
profile here sets a scale, so the two do not fight.

natural_scroll on type:pointer gives mice the same scroll direction as
the touchpads already had.

PCSX2 and Dolphin default to borderless-windowed rather than compositor
fullscreen, so the existing inhibit_idle fullscreen rules never matched
and swaylock engaged mid-game. Inhibit on focus for the emulators
instead. The Steam session is unaffected either way: swayidle is wanted
by graphical-session.target and conditional on WAYLAND_DISPLAY, and the
gamescope session provides neither.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-01 10:32:24 +01:00
Emma ThorpeandClaude Opus 5 730bcd1a5d feat(console): add the standalone Dolphin emulator
The libretro dolphin core lags upstream on compatibility in the same way
LRPS2 does, so install pkgs.dolphin-emu next to pkgs.pcsx2 and run
GameCube and Wii titles through it. The cores stay for the sake of a
single frontend and a shared save/state layout.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-01 10:32:24 +01:00
Emma ThorpeandClaude Opus 5 4e3347cb8c fix(console): make a failed Steam session diagnosable, add shortcut tooling
Autologin into the gamescope Steam session does not take on the real
hardware; the television lands on ReGreet instead. The config side is
correct -- initial_session is present in the generated greetd.toml and
services.greetd.restart evaluates to false -- so the likely cause is the
session starting and then dying, which greetd answers by falling through
to default_session.

greetd hands a session the VT for its standard streams, so whatever the
session prints on its way down is erased as soon as the greeter repaints.
Run the launcher under systemd-cat so the reason survives in the journal
under the steam-session identifier.

Steam's non-Steam-game Browse dialog and its library-folder picker both
go through the XDG portal FileChooser interface and do not open here
(ValveSoftware/steam-for-linux#9447, #10415). Add steamtinkerlaunch,
which writes shortcuts.vdf without the dialog, and document
library_folder_add as the equivalent route for the library folder.

Docs also catch up with the host's actual state: hardware-configuration
.nix is a real scan now, standalone pcsx2 is installed, and the untested
claims become the list of open problems.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-01 10:32:24 +01:00
Emma ThorpeandClaude Opus 5 59d5d70221 feat(sway): install wlr-randr on all Sway hosts
wlr-randr prints the make/model/serial criteria kanshi profiles are keyed
on and lets a mode be tried before it is committed to config. Nothing
else in the Sway package set covers output query or adjustment.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-01 10:32:24 +01:00
lyrathorpe e2184c601a Merge pull request 'docs(memory): record what puts a WSP ticket on the Flamingo board' (#114) from docs/memory-flamingo-board into main
CI / flake (push) Successful in 4m48s
Reviewed-on: #114
2026-09-01 10:30:51 +01:00
Emma Thorpe 3a9fbf1a89 docs(memory): record what puts a WSP ticket on the Flamingo board
CI / flake (push) Skipped
CI / flake (pull_request) Successful in 1m18s
Board 411 filters on membership of the "Flamingo - CommittedWork" saved filter
(or the stf-flamingo-help label), with a sub-filter that hides anything whose
fixVersion is already released. Team, PI and PI Commitment have no bearing on it:
of the filter's 100 most recent members, 52 carry no Team and 94 no commitment.

Records the field IDs and current values anyway, since they are set as a matter
of course for PI planning, and notes that field names cannot be resolved through
the MCP tools.
2026-09-01 09:58:49 +01:00
lyrathorpe 7ab3071ea9 Merge pull request 'feat(console): add pcsx2 emulator' (#112) from feat/console-emulators into main
CI / flake (push) Successful in 5m10s
Reviewed-on: #112
2026-08-31 02:01:53 +01:00
lyrathorpe c45e2978b9 Merge pull request 'feat(console): add the real hardware-configuration.nix' (#110) from feat/console-hardware into main
CI / flake (push) Successful in 6m0s
Reviewed-on: #110
2026-08-31 01:55:38 +01:00
lyrathorpe f90825a270 feat(console): add pcsx2 emulator
CI / flake (push) Skipped
CI / flake (pull_request) Successful in 5m45s
2026-08-31 01:35:09 +01:00
renovate-bot d0714c3ac4 Merge pull request 'chore(deps): lock file maintenance flake inputs' (#111) from renovate/lock-file-maintenance-flake-inputs into main
CI / flake (push) Successful in 4m30s
2026-08-31 00:06:56 +01:00
Renovate Bot 024760c0b1 chore(deps): lock file maintenance flake inputs
CI / flake (push) Skipped
renovate/stability-days Updates have not met minimum release age requirement
CI / flake (pull_request) Successful in 5m20s
2026-08-30 23:01:25 +00:00
lyrathorpe 6ea400be53 feat(console): add the real hardware-configuration.nix
CI / flake (push) Skipped
CI / flake (pull_request) Successful in 4m35s
replace the generated placeholder now the system boots
2026-08-29 19:33:54 +01:00
lyrathorpe 6d3de29291 Merge pull request 'feat(hosts): add lyrathorpe-console, a living-room games machine' (#99) from feat/console-host into main
CI / flake (push) Successful in 4m54s
Reviewed-on: #99
2026-08-29 19:23:01 +01:00
lyrathorpe 955b6640c3 Merge pull request 'fix(darwin): disable hot-corners' (#109) from fix/disable-hot-corners into main
CI / flake (push) Successful in 4m32s
Reviewed-on: #109
2026-08-28 14:51:27 +01:00
lyrathorpe ea791df4aa fix(darwin): disable hot-corners
CI / flake (push) Skipped
CI / flake (pull_request) Successful in 4m29s
I hate them and I need to ensure they never come back
2026-08-28 14:46:40 +01:00
lyrathorpe a587f0ab71 Merge pull request 'fix(wsl): provide xdg-open so browser-based logins work' (#108) from fix/wsl-xdg-open into main
CI / flake (push) Successful in 4m27s
Reviewed-on: #108
2026-08-28 13:53:39 +01:00
lyrathorpe 93f1b191c8 Merge pull request 'feat(tmux): show window names in the status bar and pane titles on the border' (#107) from feat/tmux-window-and-pane-titles into main
CI / flake (push) Successful in 5m23s
Reviewed-on: #107
2026-08-28 13:49:32 +01:00
Emma Thorpe a51ed76119 fix(wsl): provide xdg-open so browser-based logins work
CI / flake (push) Skipped
CI / flake (pull_request) Successful in 4m30s
WSL has no xdg-open and no Linux browser, so anything that shells out to one
fails with:

  exec: "xdg-open,x-www-browser,www-browser": executable file not found in $PATH

kubelogin's interactive login hits this, which matters because interactive is
the mode the shared cluster kubeconfig uses and the mode documented for
re-authenticating after a PIM activation.

Ships an xdg-open on PATH that hands the URL to Windows via powershell.exe,
falling back to explorer.exe, and points $BROWSER at it for tools that read the
variable instead of calling xdg-open. wslu would be the conventional answer but
has been removed from nixpkgs after upstream archived the project.
2026-08-28 13:48:52 +01:00
Emma Thorpe 5bca7e176a feat(tmux): show window names in the status bar and pane titles on the border
CI / flake (push) Skipped
CI / flake (pull_request) Successful in 4m9s
Catppuccin renders #T, the pane title, in the window list. Any program in the
pane can overwrite that with an OSC escape -- the shell writes the hostname and
Claude Code writes its current task -- so a window renamed with prefix+, never
appeared anywhere.

The status bar now shows the window name, falling back to the pane title while a
window holds a single pane. Once a window is split, pane titles appear on the
pane borders instead; pane-border-status takes no format, so a
window-layout-changed hook recomputes it on both split and close. Adds a binding
for select-pane -T, which has no default.
2026-08-28 12:22:37 +01:00
lyrathorpe 684d3f5a75 Merge pull request 'docs(memory): record that Entra group member reads hide service principals' (#106) from docs/memory-entra-group-member-reads into main
CI / flake (push) Successful in 4m5s
Reviewed-on: #106
2026-08-28 11:35:21 +01:00
Emma Thorpe 99fca0f746 docs(memory): record that Entra group member reads hide service principals
CI / flake (push) Skipped
CI / flake (pull_request) Successful in 1m3s
az ad group member list and GET /groups/{id}/members return an empty
collection, without error, for groups whose members are service principals.
Records the reads that do work and the rule to trust a Terraform plan over
that output.
2026-08-28 11:33:33 +01:00
lyrathorpe 9b1e2fb447 Merge pull request 'chore(nix): statix bool_comparison + stale-path comment fixes' (#58) from chore/nix-cleanup into main
CI / flake (push) Successful in 5m13s
Reviewed-on: #58
2026-08-26 20:48:37 +01:00
lyrathorpe 9d2379bb3e docs(rpi5): fix stale features.nix path in comment
CI / flake (push) Skipped
CI / flake (pull_request) Successful in 7m19s
2026-08-26 20:41:05 +01:00
lyrathorpe 7a650dc7cc docs(sway): fix stale features.nix path in comment 2026-08-26 20:41:05 +01:00
lyrathorpe bb613ac803 refactor(users): drop redundant == true (statix bool_comparison) 2026-08-26 20:41:05 +01:00
lyrathorpe 47362090c3 Merge pull request 'docs(memory): record the Task Type field now required on WSP tickets' (#105) from docs/memory-jira-task-type into main
CI / flake (push) Successful in 4m8s
Reviewed-on: #105
2026-08-25 14:33:03 +01:00
Emma Thorpe 8c5773447e docs(memory): record the Task Type field now required on WSP tickets
CI / flake (push) Skipped
CI / flake (pull_request) Successful in 57s
Creating a WSP Task now fails with "Task Type is required to create a Task
issue". The field is customfield_15622 and the create validator enforces it
even though createmeta does not list it as required - the same trap the note
already records for Bug's versions field.
2026-08-25 14:25:24 +01:00
lyrathorpe ae44982c65 Merge pull request 'docs(memory): record the WSP-32957 PIM migration project state' (#104) from docs/memory-wsp-32957-pim-migration into main
CI / flake (push) Successful in 4m44s
Reviewed-on: #104
2026-08-24 17:54:09 +01:00
Emma Thorpe c82c1bef9c docs(memory): record the WSP-32957 PIM migration project state
CI / flake (push) Skipped
CI / flake (pull_request) Successful in 1m35s
Long-running epic spanning multiple sessions, with several findings that were
expensive to establish and that contradict the Jira epic text — most notably
that production runs in the subscription named "Workspace Platform Technical
Preview", not the one named "Production".

Points at ~/code/WSP-32957-CONTINUATION.md for the detail rather than carrying
it here, following the pattern used for the SIBO project.
2026-08-24 17:51:38 +01:00
lyrathorpe 39b2b1d24b Merge pull request 'fix(tmux): stop clip.exe mangling non-ASCII in the WSL clipboard' (#103) from fix/tmux-clipboard-utf8 into main
CI / flake (push) Successful in 5m47s
Reviewed-on: #103
2026-08-24 13:36:15 +01:00
lyrathorpe 0022a152e3 Merge pull request 'fix(edaas): restore passwordless wheel under sudo-rs' (#102) from fix/edaas-passwordless-sudo-rs into main
CI / flake (push) Successful in 7m44s
Reviewed-on: #102
2026-08-24 13:29:39 +01:00
Emma Thorpe d9db12c4a5 fix(tmux): stop clip.exe mangling non-ASCII in the WSL clipboard
CI / flake (push) Skipped
CI / flake (pull_request) Successful in 7m8s
tmux-yank autodetects WSL and pipes the selection to clip.exe, which
decodes its stdin as the console OEM codepage rather than UTF-8. Copying
an em dash out of a pane put "ΓÇö" on the Windows clipboard; the same
applies to every non-ASCII character.

Override the copy command to route through tmux's own buffer. With
set-clipboard on, that emits OSC 52 and the terminal receives UTF-8
directly, with no Windows-side helper in the path. Windows Terminal
honours OSC 52; verified against the running client.

Guarded on /proc/version so only WSL is affected. iTerm2 does not accept
OSC 52 by default, so the Darwin hosts keep pbcopy.

Set in the plugin's extraConfig rather than the shared block because
yank.tmux bakes the copy command into its key bindings at load time, and
home-manager emits plugin extraConfig before the run-shell.
2026-08-24 13:26:21 +01:00
Emma Thorpe 4ac9d1108b docs(shell): record the EDaaS passwordless-wheel exception
CI / flake (push) Skipped
CI / flake (pull_request) Successful in 4m10s
The sudo-rs section claimed the whole fleet runs the stock "wheel, with a
password" policy, which is no longer true for the WSL host. Explain why the
NixOS-WSL default does not survive the sudo-rs swap, and mark the difference in
the per-host table.
2026-08-24 11:16:15 +01:00
Emma Thorpe 0c151943de fix(edaas): restore passwordless wheel under sudo-rs
NixOS-WSL sets `security.sudo.wheelNeedsPassword = false`, but that option
belongs to the `security.sudo` module and does not carry over to the sudo-rs
swap in modules/common-nixos.nix, whose equivalent option defaults to true.
Since that swap landed, sudo on this host prompts for the account password --
which WSL set during install and nobody knows -- so escalation only worked
through `wsl -u root`.

Set `security.sudo-rs.wheelNeedsPassword = false` on the host to match the
NixOS-WSL default. Other NixOS hosts are unaffected and keep the prompt.
2026-08-24 11:16:12 +01:00
renovate-bot dcb8a5e66a Merge pull request 'chore(deps): lock file maintenance flake inputs' (#101) from renovate/lock-file-maintenance-flake-inputs into main
CI / flake (push) Successful in 6m6s
2026-08-24 03:10:24 +01:00
Renovate Bot bdb21a6d50 chore(deps): lock file maintenance flake inputs
CI / flake (push) Skipped
renovate/stability-days Updates have not met minimum release age requirement
CI / flake (pull_request) Successful in 7m14s
2026-08-24 02:02:49 +00:00
renovate-bot 1da34d6232 Merge pull request 'chore(deps): lock file maintenance flake inputs' (#100) from renovate/lock-file-maintenance-flake-inputs into main
CI / flake (push) Successful in 4m53s
2026-08-24 00:07:42 +01:00
Renovate Bot 19e0b7f13f chore(deps): lock file maintenance flake inputs
CI / flake (push) Skipped
renovate/stability-days Updates have not met minimum release age requirement
CI / flake (pull_request) Successful in 4m53s
2026-08-23 23:02:35 +00:00
Emma ThorpeandClaude Opus 5 39434b3929 feat(hosts): add lyrathorpe-console, a living-room games machine
CI / flake (push) Skipped
CI / flake (pull_request) Successful in 7m46s
New x86_64 host for a 4th-gen Core i7 (Haswell) with a GTX 1070 8 GB,
wired to a television and driven with a Bluetooth controller.

Session: greetd gets an initial_session, so the machine autologins into
the gamescope Steam session at boot with no greeter and no keyboard.
Quitting Steam falls back to greetd's default_session (ReGreet), where
the ordinary Sway session is available for keyboard-and-mouse work.

Graphics: the GTX 1070 is Pascal, so it needs driver branch 580
(nvidiaPackages.legacy_580) like the Mac Pro's Quadro P400 -- the
nixpkgs default (production, 595.x) dropped Pascal support.

Games: RetroArch built through retroarch-bare.wrapper with 17 cores
covering NES through PS2, GameCube and Wii; Clone Hero; and Steam with
Proton-GE and protontricks. RetroArch's menu toggle is bound to L3+R3,
without which there is no way to exit a running core on a machine with
no keyboard.

Proton prerequisites beyond what programs.steam already arranges: the
esync file-descriptor hard limit is raised from systemd's default
524288 to 1048576 (soft limit untouched), and Proton-GE is wired in via
extraCompatPackages. vm.max_map_count already defaults high enough in
nixpkgs and needs no override.

Content lives in a shared /srv/games tree created by systemd.tmpfiles,
laid out one directory per system under roms/ using the libretro/ES-DE
naming convention, plus bios/, saves/, states/, a Steam library folder
and Clone Hero's songs. RetroArch is pointed at it declaratively.

hardware-configuration.nix is a placeholder, not a hardware scan: the
machine is not installed yet. It assumes partition labels `nixos` and
`BOOT` and must be replaced with nixos-generate-config output.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-21 17:06:21 +01:00
lyrathorpe 1ff333a896 Merge pull request 'fix(docs): pin the site section title so it renders as nixfiles' (#97) from fix/docs-section-title into main
CI / flake (push) Successful in 6m33s
Reviewed-on: #97
2026-08-19 18:24:40 +01:00
Emma Thorpe 9d199bc087 fix(docs): pin the site section title so it renders as nixfiles
CI / flake (push) Skipped
CI / flake (pull_request) Successful in 1m10s
With no entry in the docs-site nav (removed there so awesome-pages can
discover the synced trees), MkDocs derives the section name from the directory
and title-cases it, rendering "Nixfiles". The previous hardcoded nav spelled it
lowercase. Setting title in docs/.pages restores that without reintroducing a
nav entry.

Verified by rebuilding the aggregated site locally with both source trees
synced as the workflow does.
2026-08-19 18:15:48 +01:00
lyrathorpe c7adcccbb3 Merge pull request 'docs: publish the prose documentation to docs.lyrapup.pet' (#96) from docs/publish-to-docs-site into main
CI / flake (push) Successful in 4m9s
Reviewed-on: #96
2026-08-19 17:51:40 +01:00
Emma Thorpe dcc13f94e0 docs: move prose documentation into docs/ so the docs site publishes it
CI / flake (push) Skipped
CI / flake (pull_request) Successful in 4m21s
The docs-site build syncs this repo's README.md and docs/ into the site
tree; nothing else is copied. All prose apart from the README therefore lived
outside the sync and never appeared on https://docs.lyrapup.pet/nixfiles/, and
the one page that did publish carried 18 link targets that resolved to nothing.

Moves:

  home/README.md           -> docs/shell.md
  home/KEYBINDINGS.md      -> docs/keybindings.md
  hosts/<Name>/README.md   -> docs/hosts/<name>.md

docs/.pages and docs/hosts/.pages give the awesome-pages plugin an explicit
order; new pages are picked up by the trailing '...' without an edit.

Links are rewritten so a single URL is correct in both Gitea and the published
site: absolute Gitea source URLs for .nix files and directories, relative links
between pages under docs/, and absolute docs.lyrapup.pet URLs from the root
README, which the build republishes at a different depth from the rest of the
tree. In-code comments that pointed at a moved README are updated to the new
path.

The README gains a Documentation section covering the sync contract and the
linking rules, and CLAUDE.md carries the short version so future edits do not
reintroduce unsynced pages or dead links.

Verified by reproducing the docs-site assembly locally against its pinned
toolchain (mkdocs 1.6.1, mkdocs-material 9.7.7, awesome-pages 2.10.1): pages
render at the URLs used above and in the declared order.
2026-08-19 17:38:50 +01:00
lyrathorpe d30d8f9892 Merge pull request 'feat(cli): modern replacements for the classic coreutils tools, and sudo-rs' (#95) from feat/modern-cli-replacements into main
CI / flake (push) Successful in 4m4s
Reviewed-on: #95
2026-08-19 17:21:40 +01:00
Emma Thorpe dfafac8de9 feat(security): swap sudo for the memory-safe sudo-rs
CI / flake (push) Skipped
CI / flake (pull_request) Successful in 4m6s
security.sudo-rs.enable sets security.sudo.enable = false via mkDefault, so
this is a straight swap; the two modules assert against being on together.

The fleet only uses the stock policy -- wheel may run anything, with a password
-- which sudo-rs implements fully. It does not cover host aliases, LDAP/SSSD
sudoers, sudoreplay or most Defaults settings; needing any of those means
reverting to security.sudo. The macOS host is unaffected and keeps Apple's sudo
with Touch ID.

Recovery from a host that will not escalate is documented in the module and in
home/README.md: get a root shell that does not go through sudo, then roll back
the generation.
2026-08-19 17:03:15 +01:00
Emma Thorpe d9464009f0 feat(cli): replace the classic coreutils tools with modern equivalents
Adds Rust/Go replacements for the day-to-day utilities and shadows four of
them with aliases. Only read-only commands are shadowed (cat, du, df, ps), so a
wrong flag costs a retype rather than data; rm, grep, find and sed keep their
originals and the replacements are reached by their own names.

The aliases land in .zshrc, so they apply to interactive zsh only -- scripts,
`sudo <cmd>` and anything exec'd by another program still get the real binary.

New on every host: dust, dysk, procs, trash-cli, doggo, xh, ouch, jnv, hexyl,
fq and tealdeer. dysk is used rather than duf, which is unmaintained upstream.

git gains difftastic behind a `git dft` alias. diff.external is deliberately
left unset so delta remains the renderer for git diff/show and for anything
parsing them.

The work box gains kubecolor, aliased over kubectl; it wraps the real kubectl
and drops colour when stdout is not a terminal, so pipes are unchanged.

home/README.md documents the alias map, the flag incompatibilities (including
the two that fail silently: dust -s is --apparent-size, and procs reads a bare
`aux` as a search keyword) and the rationale for what was left alone.
2026-08-19 17:03:07 +01:00