Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
275 commits
Select commit Hold shift + click to select a range
7e8b8db
refactor(installer): use typed service commands
locainin Jul 20, 2026
bac6324
refactor(stats): separate builtin readers and detection
locainin Jul 20, 2026
18ecb29
refactor(stats): separate grid, card, and worker ownership
locainin Jul 20, 2026
8475ca3
perf(text): bound normalization and truncation work
locainin Jul 20, 2026
2af6012
fix(sound): preserve OS-native playback paths
locainin Jul 20, 2026
392f884
perf: reduce queue and collection churn
locainin Jul 20, 2026
dfadc93
refactor(stats): isolate builtin reader dispatch
locainin Jul 20, 2026
d26bde8
test: cover optimized boundary behavior
locainin Jul 20, 2026
1c15c87
fix(commands): classify shell wrappers and timeouts consistently
locainin Jul 22, 2026
e5f436a
refactor(stats): isolate refresh state and coverage
locainin Jul 22, 2026
589e646
fix(core): identify inline shell command strings precisely
locainin Jul 22, 2026
88abfd0
refactor(center): expose panel modules by responsibility
locainin Jul 22, 2026
c86defe
perf(panel): reduce hover and overlay scroll work
locainin Jul 22, 2026
693782f
feat(panel): add a reduced-motion policy
locainin Jul 22, 2026
d7d85ec
fix(installer): reject privileged execution early
locainin Jul 22, 2026
c4441e6
feat(ui): apply reduced motion immediately
locainin Jul 22, 2026
8238688
feat(filesystem): preserve modes in atomic user-file writes
locainin Jul 22, 2026
b36fe00
refactor(installer): harden service and config publication
locainin Jul 22, 2026
5c3baca
refactor(installer): publish binaries and backups through stable desc…
locainin Jul 22, 2026
80318c3
refactor(installer): remove artifacts through stable anchors
locainin Jul 22, 2026
7e476bf
refactor(installer): manage directories through stable descriptors
locainin Jul 22, 2026
50d64e1
refactor(installer): publish links through stable anchors
locainin Jul 22, 2026
45f2cb8
feat(filesystem): move and read files beneath stable descriptors
locainin Jul 22, 2026
99a4755
refactor(config): harden legacy theme migration
locainin Jul 22, 2026
448d4ae
test(ui): cover reduced-motion and media lifecycle
locainin Jul 22, 2026
841461e
test: cover config and installer filesystem lifecycle
locainin Jul 22, 2026
1d311e1
test: colocate module coverage and reject orphans
locainin Jul 22, 2026
30967c7
fix(center): reconcile brightness slider writes
locainin Jul 22, 2026
bb7a375
feat(filesystem): add guarded ownership transactions
locainin Jul 22, 2026
93b4005
fix(css): harden reference scanning
locainin Jul 22, 2026
4a1a106
fix(daemon): contain notification sound decoding
locainin Jul 22, 2026
dcc72ea
perf(center): skip duplicate marquee measurement
locainin Jul 22, 2026
9c3fa0b
fix(daemon): bound notification ingress work
locainin Jul 22, 2026
30a0f59
fix(core): bound text after markup removal
locainin Jul 22, 2026
26d4df6
fix(preset): reject ambiguous tar extensions
locainin Jul 22, 2026
d8906eb
fix(daemon): validate control action targets
locainin Jul 22, 2026
180c7e2
fix(center): validate SVG scaling geometry
locainin Jul 22, 2026
74d12c3
test: strengthen filesystem, CSS, and SVG boundaries
locainin Jul 22, 2026
963d0fb
test(daemon): close bounded runtime and resource gaps
locainin Jul 22, 2026
0fd46ec
fix(daemon): structurally validate WAV file hints
locainin Jul 22, 2026
268254f
feat(filesystem): add exact file-pair transactions
locainin Jul 22, 2026
3c8b857
fix(daemon): rate limit notification close requests
locainin Jul 22, 2026
1a4b142
refactor(daemon): centralize event and client ownership
locainin Jul 22, 2026
6d608dc
refactor(filesystem): separate descriptor and tree operations
locainin Jul 22, 2026
7365998
refactor(center): give command widgets explicit ownership
locainin Jul 22, 2026
8de534e
refactor(core): centralize UTF-8 byte truncation
locainin Jul 22, 2026
53f46b7
chore: remove stale declarations and colocate daemon tests
locainin Jul 22, 2026
b59ee16
refactor(daemon): move DND lifecycle into shared state
locainin Jul 22, 2026
9e823c8
test: close sound and filesystem mutation gaps
locainin Jul 22, 2026
870ad62
refactor(daemon): simplify ingress peak tracking
locainin Jul 22, 2026
842c5d8
fix(dbus): serialize state-bearing signal publication
locainin Jul 25, 2026
edcdcad
fix(daemon): reject oversized notification bodies at ingress
locainin Jul 25, 2026
bfca347
fix(ui): authenticate notification attribution
locainin Jul 25, 2026
b68b4f3
ci(release): pin and attest release inputs
locainin Jul 25, 2026
c96f311
fix(config): keep Night toggle on a healthy backend
locainin Jul 25, 2026
e00ad6e
fix(dbus): preflight Notify structure before decoding
locainin Jul 25, 2026
cdb3e20
feat(daemon): index desktop application evidence
locainin Jul 25, 2026
d749993
fix(daemon): resolve and enforce notification attribution
locainin Jul 25, 2026
2556211
fix(popups): restore notification content images
locainin Jul 25, 2026
2901dc7
ci(release): bind signatures to tagged source
locainin Jul 25, 2026
1198b09
refactor(dbus): split Notify preflight by parser layer
locainin Jul 25, 2026
959b2e0
refactor(store): separate notification state domains
locainin Jul 26, 2026
6b6de10
refactor(daemon): colocate entrypoint, ingress, and identity coverage
locainin Jul 26, 2026
8a128d9
fix(daemon): harden desktop application association
locainin Jul 26, 2026
43512ce
fix(replies): fail closed on unsupported confirmation
locainin Jul 26, 2026
746b3fc
fix(installer): identify bus owners in isolated service environments
locainin Jul 26, 2026
697ce7f
fix: harden daemon bus and notification identity
locainin Jul 26, 2026
f6b9dbf
fix: make control clients owner-aware
locainin Jul 26, 2026
a262b99
fix: enforce installation readiness and channel safety
locainin Jul 26, 2026
c85ef42
fix(identity): verify no-hint launch specifications
locainin Jul 26, 2026
b91914f
fix(index): bound desktop refresh watching
locainin Jul 26, 2026
070ffb3
fix(dbus): encode wire enums as bytes
locainin Jul 26, 2026
9468f95
fix(popups): require renderer and bus health readiness
locainin Jul 26, 2026
ead7973
test(installer): use neutral home fixtures
locainin Jul 26, 2026
9d17fdf
fix(css): scope intentional stock overrides
locainin Jul 26, 2026
d0f2e99
refactor(doctor): split D-Bus checks by responsibility
locainin Jul 28, 2026
69aa3b3
fix(popups): bind readiness to renderer generations
locainin Jul 28, 2026
569fb19
refactor(test): inject preauthorized control owners explicitly
locainin Jul 28, 2026
0c84ef9
fix(theme): flatten stock styles and preserve compact geometry
locainin Jul 28, 2026
b94f119
feat(ui): surface critical notification urgency
locainin Jul 28, 2026
987c994
fix(identity): resolve dedicated Electron application binaries
locainin Jul 28, 2026
ec7d4f9
fix(popups): invalidate every trailing burst commit
locainin Jul 28, 2026
74b9cf8
fix(night-toggle): stop backends without blocking resets
locainin Jul 28, 2026
1a6908e
refactor(installer): simplify infallible workflow paths
locainin Jul 28, 2026
84c6a56
chore(lints): enforce the exact CI policy
locainin Jul 28, 2026
301dbde
fix(notifications): bind timers and events to generations
locainin Jul 28, 2026
f325706
fix(center): scope readiness to the current owner
locainin Jul 28, 2026
33c15fc
fix(theme): tolerate stock backup name collisions
locainin Jul 28, 2026
903b4ed
feat(popups): rebuild the compact notification banner
locainin Jul 28, 2026
6b3db77
fix(installer): terminate daemons through stable process handles
locainin Jul 28, 2026
3c07abd
fix(identity): require live exact launch contracts
locainin Jul 28, 2026
980c897
test(identity): split resolver coverage by trust path
locainin Jul 28, 2026
caf75f2
test: close daemon and center lifecycle gaps
locainin Jul 28, 2026
6628b88
test: cover process, decorative image, and wait boundaries
locainin Jul 28, 2026
d06a8e4
test(popups): exercise generation-aware control state
locainin Jul 28, 2026
4c599f3
test: satisfy strict workspace organization
locainin Jul 28, 2026
707bc95
fix(actions): deny signals for weak attribution
locainin Jul 28, 2026
4693d8f
feat(popups): add trust-aware presentation kinds
locainin Jul 28, 2026
39c43a5
style(popups): refine compact native banners
locainin Jul 28, 2026
d599b89
fix(actions): deny unverified application callbacks
locainin Jul 28, 2026
887efed
refactor(identity): verify generic launch evidence
locainin Jul 28, 2026
8d6ac37
feat(diagnostics): expose structured attribution reasons
locainin Jul 28, 2026
181ea45
feat(popups): preserve actions and add bounded inline replies
locainin Jul 28, 2026
fdf06f0
fix(theme): preserve edits racing stock migration
locainin Jul 28, 2026
93eb3be
style(popups): add rounded cards and trust badges
locainin Jul 28, 2026
dbde454
refactor(ui): share notification presentation policy
locainin Jul 28, 2026
60bc743
refactor(ui): simplify groups and shared security badges
locainin Jul 28, 2026
2490639
fix(identity): enforce ordered runtime launch contracts
locainin Jul 29, 2026
f59db43
fix(notifications): bind lifecycle decisions to generations
locainin Jul 29, 2026
59688b2
refactor(presentation): derive identity from provenance
locainin Jul 29, 2026
12ce76d
refactor(popups): use one provenance identity slot
locainin Jul 29, 2026
5a40a10
refactor(panel): present complete group identity
locainin Jul 29, 2026
1570c21
style(ui): compact notification surfaces
locainin Jul 29, 2026
fdabd8a
feat(theme): add explicit stock migration policy
locainin Jul 29, 2026
629ddd4
feat(center): add explicit theme migration choices
locainin Jul 29, 2026
042fc3d
test(center): include reconnect jitter in deadlines
locainin Jul 29, 2026
354aa06
feat(theme): replace legacy migration with versioned modes
locainin Jul 29, 2026
4adbcf4
test(theme): cover versioned theme modes and stock fallback
locainin Jul 29, 2026
4d8693f
feat(attribution): prove app ownership with package provenance
locainin Jul 29, 2026
d022773
fix(attribution): require concrete evidence for conflicts
locainin Jul 29, 2026
5669d04
test(attribution): cover trust and launch evidence matrix
locainin Jul 29, 2026
b31fddd
feat(presentation): separate trust from notification kind
locainin Jul 29, 2026
1b0598e
fix(control): bind UI effects to notification generations
locainin Jul 29, 2026
9514fd6
feat(ui): rebuild notification identity and grouping surfaces
locainin Jul 29, 2026
79034d9
fix(daemon): retain notifications with oversized native icons
locainin Jul 29, 2026
e52619f
fix(attribution): stop timed-out provider process trees
locainin Jul 29, 2026
c83e0f8
ci: isolate the user runtime and D-Bus broker
locainin Jul 29, 2026
a77cfcc
fix(dbus): isolate lifecycle checks and unavailable ownership
locainin Jul 29, 2026
9c05518
fix(installer): bound process-handle fallback waits
locainin Jul 29, 2026
c8b6748
test(cli): harden trusted-tool routing
locainin Jul 29, 2026
3ff9716
fix(provenance): bound package ownership discovery
locainin Jul 29, 2026
7fb3c89
fix(attribution): require affirmative application evidence
locainin Jul 29, 2026
efbddd7
fix(panel): use connected notification groups
locainin Jul 29, 2026
2fa6e96
fix(theme): publish stock exports atomically
locainin Jul 29, 2026
d67b915
refactor(css): split theme token responsibilities
locainin Jul 29, 2026
e9cbfd6
fix(popups): isolate default activation
locainin Jul 29, 2026
5151d3f
fix(panel): keep actions generation bound
locainin Jul 29, 2026
5ea6033
fix(panel): restore readable group depth
locainin Jul 29, 2026
be3c324
fix(attribution): require positive branding evidence
locainin Jul 29, 2026
09f3676
feat(attribution): bind protected launchers to runtimes
locainin Jul 29, 2026
e6b9cb9
fix(attribution): separate association from authentication
locainin Jul 30, 2026
8d0571a
feat(presentation): expose associated trust and authority
locainin Jul 30, 2026
5d937d1
fix(portal): filter backend candidates before admission
locainin Jul 30, 2026
b67bb1a
fix(daemon): deny inline reply from action dispatch
locainin Jul 30, 2026
d6b8eae
fix(ui): share generation-safe confirmation state
locainin Jul 30, 2026
1c9144d
style(popups): reserve symmetric card shadow margins
locainin Jul 30, 2026
e137aa6
fix(auth): fingerprint process executable descriptors
locainin Jul 30, 2026
0f85fca
fix(popups): decode icons through one stable descriptor
locainin Jul 30, 2026
a5691dc
fix(media): bound metadata and authenticate local artwork
locainin Jul 30, 2026
dd9609b
fix(security): sandbox SVG and local artwork processing
locainin Aug 1, 2026
b43a08e
fix(runtime): bound UI caches and renderer lifecycle
locainin Aug 1, 2026
b4ec8f0
fix(security): complete process-bound hardening
locainin Aug 1, 2026
4a5b3c3
ci: stabilize renderer, process, and dependency checks
locainin Aug 1, 2026
d4d3519
fix(center): bound MPRIS discovery and refresh work
locainin Aug 1, 2026
7f34ee5
fix(control): make snapshots and clear-all mutations atomic
locainin Aug 1, 2026
3d0b16e
fix(daemon): bound attribution work and readiness leases
locainin Aug 1, 2026
ba8577d
fix(runtime): make popup shutdown and icon workers cancellable
locainin Aug 1, 2026
f009177
ci: pin validation toolchain inputs
locainin Aug 1, 2026
a1f1d76
fix(runtime): bound media discovery and attribution sampling
locainin Aug 1, 2026
e24b282
fix(ui): share generation-bound default activation
locainin Aug 1, 2026
1eee4ca
ci: bootstrap snapshot certificates before HTTPS
locainin Aug 1, 2026
584634f
fix(runtime): bound media, attribution, and UI lifecycle
locainin Aug 1, 2026
e51b775
refactor(identity): separate desktop index responsibilities
locainin Aug 1, 2026
a87aef2
refactor(identity): split package provenance engine
locainin Aug 1, 2026
adfbf80
refactor(identity): split launch verification domains
locainin Aug 1, 2026
0347b5a
test(identity): add focused launch verification suites
locainin Aug 1, 2026
4f3cbb2
test(identity): wire focused launch verification suites
locainin Aug 1, 2026
b892027
refactor(identity): remove obsolete test seams
locainin Aug 1, 2026
90dbe67
fix(identity): align attribution and provenance deadlines
locainin Aug 1, 2026
b63e8ca
fix(ui): preserve recycled rows and application refresh state
locainin Aug 2, 2026
27f0c05
fix(identity): persist and reconstruct degraded watchers
locainin Aug 2, 2026
d673966
feat(ui): materialize and render bounded conversation avatars
locainin Aug 2, 2026
dd5ac97
fix(media): restore native local artwork defaults
locainin Aug 2, 2026
42938d0
fix(notifications): materialize sender visuals safely
locainin Aug 2, 2026
07cdd74
refactor(daemon): split notification payload responsibilities
locainin Aug 2, 2026
c14077b
test(daemon): mirror notification payload responsibilities
locainin Aug 2, 2026
6a96896
fix(media): collapse duplicate browser players
locainin Aug 2, 2026
72d0764
fix(center): preserve recycled rows and decorative visuals
locainin Aug 2, 2026
f9b5cc8
style(ui): refine popup, panel, and media surfaces
locainin Aug 2, 2026
07283e8
fix(panel): restore stable notification group stacking
locainin Aug 2, 2026
3a437c4
test(center): model two-layer collapsed preview accurately
locainin Aug 2, 2026
9df661f
fix(media): make browser deduplication process-aware
locainin Aug 3, 2026
9f9c0fb
fix(config): preserve explicit artwork restrictions
locainin Aug 3, 2026
0a4f8f5
fix(notifications): separate visual capabilities from activation
locainin Aug 3, 2026
5c98f6d
fix(notifications): retain bounded decorative icon hints
locainin Aug 3, 2026
f0b5edf
style(ui): align notification and media surface contracts
locainin Aug 3, 2026
612a18f
fix(center): guard deferred notification scroll resets
locainin Aug 3, 2026
c46e87a
refactor(config): extract shared transactional reset operation
locainin Aug 3, 2026
e7d19bc
test(config): cover reset backups and rollback
locainin Aug 3, 2026
f102d5b
refactor(installer): use the shared reset operation
locainin Aug 3, 2026
e993b0b
test(config): verify installer reset parity and failure handling
locainin Aug 3, 2026
effc5f0
feat(noticenterctl): add preset reset-config
locainin Aug 3, 2026
9ea9a8f
test(config): cover reset-config CLI behavior
locainin Aug 3, 2026
926566c
refactor(installer): isolate backup directory listing
locainin Aug 3, 2026
e527008
perf(center): reuse notification presentation during row updates
locainin Aug 3, 2026
e388472
style(ui): compact grouped cards and decorative visuals
locainin Aug 3, 2026
12e7918
fix(theme): restore unconditional file-backed CSS loading
locainin Aug 3, 2026
94fc42b
refactor(theme): decouple export metadata from runtime
locainin Aug 3, 2026
19a44d1
fix(config): reset and provision file-backed theme layers
locainin Aug 3, 2026
460072f
style(popups): revise the bundled popup presentation
locainin Aug 3, 2026
e48b6de
fix(notifications): keep popup display timeout local
locainin Aug 3, 2026
a200f04
fix(center): keep stacked notification rows inside measured bounds
locainin Aug 3, 2026
fd1c118
fix(popups): prevent visible generations from replaying after reconnect
locainin Aug 3, 2026
f2b6086
fix(notifications): keep ordinary positive timeouts active
locainin Aug 3, 2026
e422182
fix(notifications): classify communication images as sender avatars
locainin Aug 3, 2026
5216717
fix(center): restore master-style panel conversation avatars
locainin Aug 3, 2026
3b4615e
test(identity): use generic application fixtures
locainin Aug 3, 2026
7b969f2
style(ui): align media defaults and panel action surfaces
locainin Aug 3, 2026
6fe754c
fix(center): measure and separate notification rows with grid layout
locainin Aug 3, 2026
bef300f
build(ui): require GTK 4.18 for popup and theme APIs
locainin Aug 3, 2026
8bf87d0
fix(notifications): dismiss actioned generations safely
locainin Aug 4, 2026
229bb64
refactor(center): share application headers and compact message actions
locainin Aug 4, 2026
83847be
fix(notifications): honor positive protocol expiration
locainin Aug 4, 2026
61d7d7e
fix(installer): restore bundled scripts from reset backups
locainin Aug 4, 2026
39a29c9
perf(theme): localize quick-slider hover styling
locainin Aug 5, 2026
1caae26
perf(daemon): index protected desktop brand records
locainin Aug 5, 2026
0986651
test(daemon): align positive timeout lifecycle coverage
locainin Aug 5, 2026
5bed652
refactor(installer): split config restore helpers
locainin Aug 5, 2026
0f12f9e
perf(popups): refresh icons without redundant popup rebuilds
locainin Aug 5, 2026
4d23cc6
test(popups): keep test helpers under mirrored test paths
locainin Aug 5, 2026
f67298c
security(core): harden filesystem operations against path races
locainin Aug 7, 2026
faf35cf
security(daemon): snapshot trusted executables at startup
locainin Aug 7, 2026
e5a38af
security(installer): pin trusted Rust toolchain execution
locainin Aug 7, 2026
90e9fe1
fix(notifications): handle large images before storage
locainin Aug 7, 2026
b174e77
ci: align Rust toolchain with effective account home
locainin Aug 7, 2026
7021980
ci: preserve runner home for GitHub actions
locainin Aug 7, 2026
7784724
security: harden notification rule identity and cut config v5
locainin Aug 8, 2026
6c2ee5c
security: harden MPRIS discovery and property handling
locainin Aug 8, 2026
994309d
security: harden notification ingress and lifecycle
locainin Aug 8, 2026
18fbfad
fix(installer): recover runtime masks and report incompatible config
locainin Aug 8, 2026
3600137
fix(daemon): serialize notification interactions and admission
locainin Aug 9, 2026
8256c1d
fix(notifications): preserve visual identity and timeout boundaries
locainin Aug 9, 2026
d6b79a8
fix(installer): make config restore transactional
locainin Aug 9, 2026
a46d1b0
fix(installer): normalize bounded service-manager probing
locainin Aug 9, 2026
8e34740
feat(installer): add verified release generations
locainin Aug 9, 2026
fe0db5b
fix(installer): journal release activation and rollback
locainin Aug 9, 2026
42e73b4
fix(installer): classify installation health for repair
locainin Aug 9, 2026
94557e6
fix(installer): harden installation channel detection and locking
locainin Aug 9, 2026
886b456
fix(installer): guard daemon shutdown and service handoff
locainin Aug 9, 2026
559c253
fix(installer): fail closed when guarded recovery is uncertain
locainin Aug 9, 2026
2ab173b
fix(notifications): bind default activation to sender ownership
locainin Aug 10, 2026
bc8cbe1
fix(notifications): separate branding from visual authority
locainin Aug 10, 2026
0379c8e
fix(popups): restore application and sender visual hierarchy
locainin Aug 10, 2026
4b2d41f
fix(center): harden notification identity rendering lifecycle
locainin Aug 10, 2026
1cbfedd
fix(cli): sanitize human-readable diagnostic output
locainin Aug 10, 2026
ab3b55e
fix(security): harden trial executable authorization
locainin Aug 11, 2026
3051059
test(center): use a deterministic icon fixture
locainin Aug 12, 2026
04c77b9
chore(release): prepare v1.3.0
locainin Aug 12, 2026
e9010cc
ci: provide stable bus fixtures for container tests
locainin Aug 12, 2026
99d6263
ci: trust release checkout in container
locainin Aug 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
114 changes: 108 additions & 6 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ concurrency:
env:
CARGO_TERM_COLOR: always
RUST_BACKTRACE: 1
DEBIAN_SNAPSHOT: 20260720T000000Z
RUSTUP_INIT_VERSION: 1.28.2
RUSTUP_INIT_SHA256: 20a06e644b0d9bd2fbdbfd52d42540bdde820ea7df86e92e533c073da0cdd43c

defaults:
run:
Expand All @@ -30,25 +33,65 @@ jobs:
workspace:
name: Workspace checks
runs-on: ubuntu-24.04
container: debian:trixie-slim
container: debian:trixie-slim@sha256:020c0d20b9880058cbe785a9db107156c3c75c2ac944a6aa7ab59f2add76a7bd
timeout-minutes: 45

steps:
- name: Install system dependencies
run: |
set -euo pipefail
rm -f /etc/apt/sources.list
# The slim image bootstraps without a CA bundle; InRelease signatures still authenticate the immutable index
printf '%s\n' \
'Types: deb' \
"URIs: http://snapshot.debian.org/archive/debian/${DEBIAN_SNAPSHOT}" \
'Suites: trixie trixie-updates' \
'Components: main' \
'Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg' \
'' \
'Types: deb' \
"URIs: http://snapshot.debian.org/archive/debian-security/${DEBIAN_SNAPSHOT}" \
'Suites: trixie-security' \
'Components: main' \
'Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg' \
> /etc/apt/sources.list.d/debian.sources
printf '%s\n' 'Acquire::Check-Valid-Until "false";' \
> /etc/apt/apt.conf.d/99snapshot
apt-get update
verify_snapshot_index() {
local expected="$1"
local pattern="$2"
local path
path="$(find /var/lib/apt/lists -maxdepth 1 -type f -name "$pattern" -print -quit)"
test -n "$path"
printf '%s %s\n' "$expected" "$path" | sha256sum --check --strict
}
# Pin the bootstrap indexes so HTTP cannot replay an older signed snapshot
verify_snapshot_index \
98b25b5cd185c59d34aa6e4c3e9b5b8f01bbe9d104fe2dcfbcd30dc0a14a59ed \
"*snapshot.debian.org_archive_debian_${DEBIAN_SNAPSHOT}_dists_trixie_InRelease"
verify_snapshot_index \
bd8aee7ca2a980563032065681fd39b1e284e511841399f3730eac279a1bd2f7 \
"*snapshot.debian.org_archive_debian_${DEBIAN_SNAPSHOT}_dists_trixie-updates_InRelease"
verify_snapshot_index \
ea95c17e3b9d86d71e58a90831fdfc562f59a9cf6fa5f3d1e52e537a6fbe8e41 \
"*snapshot.debian.org_archive_debian-security_${DEBIAN_SNAPSHOT}_dists_trixie-security_InRelease"
# Bootstrap the trust store over the signed snapshot index
apt-get install -y --no-install-recommends ca-certificates
sed -i 's#http://snapshot.debian.org#https://snapshot.debian.org#g' \
/etc/apt/sources.list.d/debian.sources
apt-get update
apt-get install -y --no-install-recommends \
bash \
build-essential \
ca-certificates \
curl \
dbus \
git \
jq \
libgtk-4-dev \
libgtk4-layer-shell-dev \
pkg-config \
ripgrep \
shellcheck \
xauth \
xvfb \
Expand All @@ -63,9 +106,34 @@ jobs:
- name: Install Rust toolchain
run: |
set -euo pipefail
curl --proto '=https' --tlsv1.2 -fsS https://sh.rustup.rs \
| sh -s -- -y --default-toolchain 1.96.1 --profile minimal --component rustfmt,clippy
echo "${HOME}/.cargo/bin" >> "${GITHUB_PATH}"
account_home="$(getent passwd "$(id -u)" | cut -d: -f6)"
test -n "$account_home"
case "$account_home" in
/*) ;;
*)
echo "effective account home is not absolute: $account_home" >&2
exit 1
;;
esac
# Keep the CI toolchain under the same account-owned home used by the installer
export HOME="$account_home"
export CARGO_HOME="$account_home/.cargo"
export RUSTUP_HOME="$account_home/.rustup"
printf '%s\n' \
"CARGO_HOME=$CARGO_HOME" \
"RUSTUP_HOME=$RUSTUP_HOME" \
>> "$GITHUB_ENV"
rustup_init="${RUNNER_TEMP}/rustup-init"
curl --proto '=https' --tlsv1.2 -fsS \
"https://static.rust-lang.org/rustup/archive/${RUSTUP_INIT_VERSION}/x86_64-unknown-linux-gnu/rustup-init" \
-o "$rustup_init"
printf '%s %s\n' "$RUSTUP_INIT_SHA256" "$rustup_init" \
| sha256sum --check --strict
chmod 0755 "$rustup_init"
"$rustup_init" -y --profile minimal --default-toolchain 1.96.1 \
--component rustfmt,clippy --no-modify-path
rm -f "$rustup_init"
echo "${CARGO_HOME}/bin" >> "${GITHUB_PATH}"
source "${HOME}/.cargo/env"
rustup default 1.96.1
cargo install cargo-audit --locked --version 0.22.0
Expand All @@ -92,6 +160,7 @@ jobs:
shellcheck \
scripts/package-release.sh \
tests/package-release.sh \
tests/check-release-hardening.sh \
tests/check-test-placement.sh \
tests/check-no-personal-paths.sh \
crates/unixnotis-core/assets/scripts/unixnotis-blue-light-lib \
Expand All @@ -101,6 +170,7 @@ jobs:
shellharden --check \
scripts/package-release.sh \
tests/package-release.sh \
tests/check-release-hardening.sh \
tests/check-test-placement.sh \
tests/check-no-personal-paths.sh

Expand All @@ -110,11 +180,43 @@ jobs:
- name: Check tracked paths for personal data
run: tests/check-no-personal-paths.sh

- name: Check release workflow hardening
run: tests/check-release-hardening.sh

- name: Test release packaging helpers
run: tests/package-release.sh

- name: Build SVG test helper
run: cargo build --package unixnotis-center --bin unixnotis-svg-renderer --all-features

- name: Run workspace tests
run: xvfb-run -a dbus-run-session -- cargo test --workspace --all-targets --all-features
run: |
set -euo pipefail
xvfb-run -a dbus-run-session -- \
bash -c '
set -euo pipefail
user_bus_dir="/run/user/$(id -u)"
stable_bus="${user_bus_dir}/bus"
session_bus="${DBUS_SESSION_BUS_ADDRESS#unix:path=}"
session_bus="${session_bus%%,guid=*}"
case "$session_bus" in
/*) ;;
*)
echo "dbus-run-session did not provide a filesystem bus address" >&2
exit 1
;;
esac
mkdir -p "$user_bus_dir"
chmod 0700 "$user_bus_dir"
if [[ ! -e "$stable_bus" && ! -L "$stable_bus" ]]; then
ln -s -- "$session_bus" "$stable_bus"
cleanup_stable_bus() {
rm -f -- "$stable_bus"
}
trap cleanup_stable_bus EXIT
fi
cargo test --workspace --all-targets --all-features
'

- name: Run dependency audit
run: cargo audit --deny warnings
Expand Down
58 changes: 54 additions & 4 deletions .github/workflows/mutation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ concurrency:
env:
CARGO_TERM_COLOR: always
RUST_BACKTRACE: 1
DEBIAN_SNAPSHOT: 20260720T000000Z
RUSTUP_INIT_VERSION: 1.28.2
RUSTUP_INIT_SHA256: 20a06e644b0d9bd2fbdbfd52d42540bdde820ea7df86e92e533c073da0cdd43c

defaults:
run:
Expand All @@ -31,18 +34,57 @@ jobs:
mutation:
name: Cargo mutants
runs-on: ubuntu-24.04
container: debian:trixie-slim
container: debian:trixie-slim@sha256:020c0d20b9880058cbe785a9db107156c3c75c2ac944a6aa7ab59f2add76a7bd
timeout-minutes: 120

steps:
- name: Install system dependencies
run: |
set -euo pipefail
rm -f /etc/apt/sources.list
# The slim image bootstraps without a CA bundle; InRelease signatures still authenticate the immutable index
printf '%s\n' \
'Types: deb' \
"URIs: http://snapshot.debian.org/archive/debian/${DEBIAN_SNAPSHOT}" \
'Suites: trixie trixie-updates' \
'Components: main' \
'Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg' \
'' \
'Types: deb' \
"URIs: http://snapshot.debian.org/archive/debian-security/${DEBIAN_SNAPSHOT}" \
'Suites: trixie-security' \
'Components: main' \
'Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg' \
> /etc/apt/sources.list.d/debian.sources
printf '%s\n' 'Acquire::Check-Valid-Until "false";' \
> /etc/apt/apt.conf.d/99snapshot
apt-get update
verify_snapshot_index() {
local expected="$1"
local pattern="$2"
local path
path="$(find /var/lib/apt/lists -maxdepth 1 -type f -name "$pattern" -print -quit)"
test -n "$path"
printf '%s %s\n' "$expected" "$path" | sha256sum --check --strict
}
# Pin the bootstrap indexes so HTTP cannot replay an older signed snapshot
verify_snapshot_index \
98b25b5cd185c59d34aa6e4c3e9b5b8f01bbe9d104fe2dcfbcd30dc0a14a59ed \
"*snapshot.debian.org_archive_debian_${DEBIAN_SNAPSHOT}_dists_trixie_InRelease"
verify_snapshot_index \
bd8aee7ca2a980563032065681fd39b1e284e511841399f3730eac279a1bd2f7 \
"*snapshot.debian.org_archive_debian_${DEBIAN_SNAPSHOT}_dists_trixie-updates_InRelease"
verify_snapshot_index \
ea95c17e3b9d86d71e58a90831fdfc562f59a9cf6fa5f3d1e52e537a6fbe8e41 \
"*snapshot.debian.org_archive_debian-security_${DEBIAN_SNAPSHOT}_dists_trixie-security_InRelease"
# Bootstrap the trust store over the signed snapshot index
apt-get install -y --no-install-recommends ca-certificates
sed -i 's#http://snapshot.debian.org#https://snapshot.debian.org#g' \
/etc/apt/sources.list.d/debian.sources
apt-get update
apt-get install -y --no-install-recommends \
bash \
build-essential \
ca-certificates \
curl \
dbus \
git \
Expand All @@ -58,8 +100,16 @@ jobs:
- name: Install Rust toolchain
run: |
set -euo pipefail
curl --proto '=https' --tlsv1.2 -fsS https://sh.rustup.rs \
| sh -s -- -y --profile minimal
rustup_init="${RUNNER_TEMP}/rustup-init"
curl --proto '=https' --tlsv1.2 -fsS \
"https://static.rust-lang.org/rustup/archive/${RUSTUP_INIT_VERSION}/x86_64-unknown-linux-gnu/rustup-init" \
-o "$rustup_init"
printf '%s %s\n' "$RUSTUP_INIT_SHA256" "$rustup_init" \
| sha256sum --check --strict
chmod 0755 "$rustup_init"
"$rustup_init" -y --profile minimal --default-toolchain 1.96.1 \
--no-modify-path
rm -f "$rustup_init"
echo "${HOME}/.cargo/bin" >> "${GITHUB_PATH}"
source "${HOME}/.cargo/env"
rustup default 1.96.1
Expand Down
Loading
Loading