sysforge-git
The .install script creates a directory and a marker file with best-effort permissions but does not perform privileged actions or self-updates; it relies on systemd-sysusers and tmpfiles for actual privilege setup, which is standard and safe.
Triggered rules
llm_review
The static rules flagged this MEDIUM, but an AI model (qwen/qwen3-235b-a22b-2507) reviewed the full PKGBUILD and judged it LOW (confidence 95%): The .install script creates a directory and a marker file with best-effort permissions but does not perform privileged actions or self-updates; it relies on systemd-sysusers and tmpfiles for actual privilege setup, which is standard and safe.
1 higher static finding superseded - not the current verdict (shown for transparency)
privileged_install
The package grants elevated privileges or installs an update path outside pacman: a /etc/sudoers.d rule (often passwordless), a setuid/setgid binary, or a self-update script/service that can fetch and run future code with no checksum verification. The initial install may be verified, but the ongoing privilege + update surface is a real supply-chain / privilege-escalation risk.
-
.install:13
install -d -m 2775 /var/lib/sysforge 2>/dev/null || mkdir -p /var/lib/sysforge
PKGBUILD
# Maintainer: Keith Raghubar <aur.archlinux.org.buckskin000@passmail.net>
pkgname=sysforge-git
pkgver=3.5.0.r0.g0000000 # updated dynamically by pkgver()
pkgrel=1
pkgdesc="Arch Linux build and maintenance suite for system setup and package management with compiler-optimized builds (git)"
arch=('any')
url="https://github.com/KeithRaghubar/sysforge"
license=('MIT')
depends=(
'python>=3.11'
'git'
'sudo'
'gnupg'
'base-devel'
)
makedepends=(
'uv'
'python-installer'
)
optdepends=(
'bash-completion: bash tab completions'
'ccache: compiler cache support'
'sccache: Rust compiler cache support'
'uv: required for bootstrap pipeline (configure stage)'
'zsh: zsh shell support'
'glow: in-shell markdown rendering for docs'
'zsh-completions: additional zsh completions'
'clang: required for the LLVM build profile and sysforge run toolchain --compiler=llvm'
'lld: required for the optimized build profile (-fuse-ld=lld)'
'llvm: required for sysforge run toolchain --compiler=llvm (PGO bootstrap)'
'compiler-rt: required for sysforge run toolchain --compiler=llvm'
'mesa-utils: post-install mesa smoke check (eglinfo)'
'vulkan-tools: post-install mesa smoke check (vulkaninfo)'
)
conflicts=('sysforge')
provides=('sysforge')
install=sysforge.install
backup=(
'etc/sysforge/sysforge.toml'
'etc/sysforge/profiles.toml'
'etc/sysforge/packages.toml'
'etc/sysforge/kernel.toml'
'etc/sysforge/toolchain.toml'
)
source=("$pkgname::git+$url.git")
sha256sums=('SKIP')
pkgver() {
cd "$srcdir/$pkgname"
git describe --long --tags 2>/dev/null \
| sed 's/^v//;s/\([^-]*-g\)/r\1/;s/-/./g' \
|| printf "r%s.g%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
}
build() {
cd "$srcdir/$pkgname"
uv build --wheel
}
package() {
cd "$srcdir/$pkgname"
python -m installer --destdir="$pkgdir" dist/*.whl
# Man page
install -Dm644 man/sysforge.1 "$pkgdir/usr/share/man/man1/sysforge.1"
# Shell completions (bash + zsh; both shells are optdeps)
install -Dm644 completions/sysforge.bash \
"$pkgdir/usr/share/bash-completion/completions/sysforge"
install -Dm644 completions/_sysforge \
"$pkgdir/usr/share/zsh/site-functions/_sysforge"
# Default config files
local _conf="$pkgdir/etc/sysforge"
install -Dm644 etc/sysforge/sysforge.toml "$_conf/sysforge.toml"
install -Dm644 etc/sysforge/profiles.toml "$_conf/profiles.toml"
install -Dm644 etc/sysforge/packages.toml "$_conf/packages.toml"
install -Dm644 etc/sysforge/kernel.toml "$_conf/kernel.toml"
install -Dm644 etc/sysforge/toolchain.toml "$_conf/toolchain.toml"
# bootstrap.toml is per-host (device, hostname, passwords) — ship as an
# example template under /usr/share so iso-install.sh can detect a true
# prior run instead of always seeing the package-installed default.
install -Dm644 etc/sysforge/bootstrap.toml \
"$pkgdir/usr/share/sysforge/bootstrap.toml.example"
# The sysforge group owns sysforge's writable runtime dirs so the
# unprivileged build user (a member) can write state and the PGO cache
# across runs. systemd-sysusers creates it before systemd-tmpfiles runs.
install -Dm644 /dev/null "$pkgdir/usr/lib/sysusers.d/sysforge.conf"
printf 'g sysforge -\n' > "$pkgdir/usr/lib/sysusers.d/sysforge.conf"
# State directory (pipeline state, build state, logs) + sentinel subdir
# consumed by `sysforge update` from the libalpm hooks below.
# /var/cache/sysforge holds the regenerable PGO profdata store, written by
# the unprivileged toolchain build. All owned root:sysforge with setgid
# (2775) so group members can write and new subdirs inherit the group —
# the single ownership model shared with primitives/fs_provision.py.
install -Dm644 /dev/null "$pkgdir/usr/lib/tmpfiles.d/sysforge.conf"
{
printf 'd /var/lib/sysforge 2775 root sysforge -\n'
printf 'd /var/lib/sysforge/sentinels 2775 root sysforge -\n'
printf 'd /var/cache/sysforge 2775 root sysforge -\n'
printf 'd /var/cache/sysforge/llvm-pgo 2775 root sysforge -\n'
} > "$pkgdir/usr/lib/tmpfiles.d/sysforge.conf"
# Pacman PostTransaction hooks: kernel/toolchain reminders +
# build-state staleness signal consumed by `sysforge update`.
install -Dm644 etc/pacman.d/hooks/sysforge-kernel.hook \
"$pkgdir/usr/share/libalpm/hooks/sysforge-kernel.hook"
install -Dm644 etc/pacman.d/hooks/sysforge-toolchain.hook \
"$pkgdir/usr/share/libalpm/hooks/sysforge-toolchain.hook"
install -Dm644 etc/pacman.d/hooks/sysforge-buildstate.hook \
"$pkgdir/usr/share/libalpm/hooks/sysforge-buildstate.hook"
install -Dm644 etc/pacman.d/hooks/sysforge-artifacts.hook \
"$pkgdir/usr/share/libalpm/hooks/sysforge-artifacts.hook"
install -Dm755 tools/pacman-hook-helper.sh \
"$pkgdir/usr/lib/sysforge/pacman-hook-helper.sh"
}
Changes since previous scan
--- PKGBUILD @ 2026-10-28 00:06+++ PKGBUILD @ 2026-11-01 00:21@@ -1,7 +1,7 @@ # Maintainer: Keith Raghubar <aur.archlinux.org.buckskin000@passmail.net> pkgname=sysforge-git-pkgver=3.4.0.r0.g0000000 # updated dynamically by pkgver()+pkgver=3.5.0.r0.g0000000 # updated dynamically by pkgver() pkgrel=1 pkgdesc="Arch Linux build and maintenance suite for system setup and package management with compiler-optimized builds (git)" arch=('any')@@ -30,6 +30,8 @@ 'lld: required for the optimized build profile (-fuse-ld=lld)' 'llvm: required for sysforge run toolchain --compiler=llvm (PGO bootstrap)' 'compiler-rt: required for sysforge run toolchain --compiler=llvm'+ 'mesa-utils: post-install mesa smoke check (eglinfo)'+ 'vulkan-tools: post-install mesa smoke check (vulkaninfo)' ) conflicts=('sysforge') provides=('sysforge')Scan history
| Scanned at (UTC) | Severity | Rules |
|---|---|---|
| 2026-11-01 00:21:48 | Low | 2 |
| 2026-10-31 00:07:41 | Low | 2 |
| 2026-10-30 00:29:30 | Low | 2 |
| 2026-10-29 00:13:55 | Low | 2 |
| 2026-10-28 15:50:30 | Medium | 1 |
| 2026-10-28 00:06:54 | Low | 2 |
| 2026-10-27 00:23:28 | Low | 2 |
| 2026-10-26 00:12:40 | Low | 2 |
| 2026-10-25 00:20:48 | Low | 2 |
| 2026-10-24 00:14:55 | Low | 2 |
| 2026-10-23 00:02:19 | Low | 2 |
| 2026-10-22 00:13:10 | Low | 2 |
| 2026-10-21 00:12:50 | Low | 2 |
| 2026-10-20 00:10:31 | Low | 2 |
| 2026-10-19 00:03:55 | Low | 2 |
| 2026-10-18 00:06:55 | Low | 2 |
| 2026-10-17 00:21:55 | Low | 2 |
| 2026-10-16 00:12:47 | Low | 2 |
| 2026-10-15 00:28:05 | Low | 2 |
| 2026-10-14 00:06:47 | Low | 2 |