A .0 release is not a floor, it is an unhealed one — and setup-go reads this line, so eighteen stdlib advisories arrived with 1.26.0.
1.26.6 is where the 1.25.13 lineage continues.
GO-2026-6354 and GO-2026-6355 deadlock an SSH connection from a malicious peer and are reachable in the server through go-git.
v0.56.0 is the first fixed release and declares go 1.26.0, so both module floors move with it.
Neither the release nor the publish job has ever executed, so jq's presence in the runner image is unproven while both depend on it.
The guard matches the one the history gate already uses for curl.
A commit that deletes a private address still carries it on the minus side of its own diff, so the history scan flags the repair as well as the leak.
Both are reviewed; neither is reachable text any more.
The GitTags adapter listed an internal forge among its three example remotes; the public one demonstrates the same arbitrary-remote shape without naming private infrastructure.
The Windows configuration notice printed a private LAN address as the example server, so every public binary shipped an unreachable host as its instruction.
your-server.com is what the README already uses.
upload-artifact v4 aborts with GHESNotSupportedError against a non-github.com server, so the web job died on every tag since v0.2.8.2 and build and publish were skipped.
No release has ever been produced here; v3 uploads work today.
The commit that added the absolute buildDir and the one that removes it both carry it in their diffs, so the history scan flags them forever.
Allowlisting is the only exit that does not rewrite history two forges already hold.
mode_t is u16 on macOS and a variadic argument promotes to at least c_uint, so aarch64-apple-darwin failed E0617 while every Linux target built clean.
The cast is a no-op where mode_t is already u32.
The tracked buildDir was an absolute path into a worktree that no longer exists, so the setting was already dead.
It is also what the release workflow's public-history gate rejects; relative to desktop/ it resolves in any checkout.
Pacman now has one local envelope path from Desktop intent to a joined helper receipt.
Name the same-host authority limit, missing fleet delivery, and unsupported Arch advisory mapping without painting them green.
Give a standalone Agent a durable identity and one signed pacman envelope path through the helper.
Every archive and detached signature crosses root custody before mutation. Fleet credentials still refuse the local minter.
The helper now accepts verified pacman envelopes on the same line as the native console. This preserves the three reviewed custody fixes; it does not yet teach the Agent to resolve and mint pacman closures.
Qt/QML now carries 11 local views while the Agent owns observation and intent. Tauri, WebKit, and the second React desktop build leave together. Linux ships first; Windows waits for a native Qt runner.
Forgejo carries f5eb83ca, an earlier cut of the mutation contract that this
history amended rather than continued, so the publication gate's fast-forward
check refuses. Recording it as an ancestor keeps the newer tree and lets the
exact tested SHA publish. Nothing in that commit is absent here.
CapEff was never collected — "sockets, capabilities, namespaces" meant the
collection limits, and a reader has no way to know that. The mask is read on
the list scan and expanded to names only on drill-down, because a fully
privileged process holds all 41 and nobody reads that on 300 rows.
Docker's documented default mask a80425fb decodes to exactly its fourteen.
The quick start pointed at codeberg, which the release job stopped pushing
to; it has been frozen at July 6 while public moved on. A stranger following
the readme was cloning a dead snapshot.
/proc/[pid]/cgroup gives the join the process list never had: systemd unit,
container id, runtime. Both cgroup generations, both cgroup drivers, docker,
podman, containerd, crio and lxc. On a 321-process desktop every userland
process attributes; the 172 that do not are kernel threads.
The kernel's id is full-length and the docker inventory reports twelve
characters, so the join is a prefix, not equality. RAF carries the rule.
The Agent now owns one local view of machine health and top processes. RedFlag opens at dashboard scale, names itself plainly, and renders that evidence before updates.\n\nCI now compiles the Tauri bridge before release day.
Cut 2 adds a verify-envelope path beside the closure-token executor. The helper parses an envelope, binds it to the independently provisioned agent identity, validates time and lifetime bounds, selects the trusted key, verifies the signed contract, checks backend payload shape, and then refuses with backend_not_migrated.
Every path emits an unsigned MutationReceipt. No backend executes, no replay slot is consumed, and no artifact-custody claim is made until the first existing backend migrates.
Cut 1 completes the dormant MutationEnvelope contract without changing any runtime path. Bind target_id to the provisioned agent identity, require canonical UUID v4 authorization IDs, cap authorization lifetime at the fleet TTL, and add an unsigned MutationReceipt carrying the audit join.
Server, Agent, and helper share the same canonical bytes, key identity, receipt digest, and Ed25519 golden vectors. Current APT/DNF and Windows execution remains untouched.
Introduce a dormant MutationEnvelope beside the current closure token. Server, Agent, and helper now agree on length-prefixed manifest and authorization bytes, with one shared fixture pinning the hash, key identity, and Ed25519 signature.\n\nExecutor-affecting provenance, location, target, backend, and backend payload now have a signed home before any runtime path migrates. Exact duplicates stay visible in the hash; ordering does not. Current APT/DNF and Windows behavior remains untouched.
Tags now cross only after the release gates. Public assets are read back anonymously and hashed; the Rust Action pin now names its advertised stable commit.
Server gate functions only recognized 'pypi', while the agent reports
'pip'. This made NeedsCapabilityGate('pip') return false, silently
routing pip installs through the legacy un-gated path.
All four gate functions now accept 'pip' with 'pypi' retained as an
alias for existing DB records.
Replaces the flat battery x display matrix (which misclassified laptops
as phones) with layered detection: container -> vm -> SMBIOS chassis ->
ARM fallback. Adds laptop, vm, container device types across agent,
migration 062, server validation, web icons/types.
DEVICE-002: ARM machine-ID fallback — device-tree model + /etc/machine-id
combo, then /proc/cpuinfo Serial (all-zero rejected), before the weak
hostname fallback. Hardware-bound IDs on DMI-less devices.
DEVICE-001: agent detects device_type (server/desktop/phone/tablet) from
/sys signals — system battery (scope=Device peripherals excluded, UPS
excluded), DRM connector state, framebuffer min-dimension for phone/tablet
split. Reports device_type/device_model/os_distro in registration and
system-info paths.
SERVER-001: migration 061 — device_type, device_type_manual (operator
override, never agent-written), device_model, os_distro on agents.
effective_device_type computed into every serialized agent.
SERVER-002: PUT /admin/agents/:id/device-type — set/clear override,
enum-validated, journaled.
WEB-001: device-type icons + fleet filter, device model in list, detail
header badge with reclassify dropdown, os_distro surfaced.
INSTALL-003: arm64 install path unblocked — helper (required manifest
component) now cross-built aarch64-unknown-linux-musl via rust-lld in the
server image, signed at boot (helperArches += arm64), listed in the release
manifest. Install template already handled uname -m and pacman.
Plus in-flight: desktop tray wiring, enrollment page polish, CI workflow
updates, RAF session-broker/pacman-scanner docs, native installer scaffold.
Add GO-2026-5617, GO-2026-5668, and GO-2026-5746 to .govulncheck-allow.
These are all daemon-side Docker/Moby vulnerabilities that don't affect
RedFlag because it uses the Docker client only for Ping, SecretList,
and container scanning — never for docker cp, archive operations, or
AuthZ paths.
Also update SECURITY.md to document all accepted exceptions in a table.
helpers.go was gitignored as "stale WIP" but defines BufferSystemEvent
called by committed code in install.go and loop.go — CI broke because
the file never shipped.
buffer.go GetBufferedEvents: re-atomic the read+clear under one lock
hold; the refactor split into ReadBufferedEvents+Clear introduced a
window where BufferEvent could write events that Clear then deletes.
from-source builds have no business pulling a 9GB MSVC sysroot for one Tauri
exe. CI builds it once; the server image downloads the signed artifact and
hash-checks it against the manifest. no release / offline -> no tray, server
404-skips. also: make rebuild/up/down/logs so `up -d build` stops biting.
Desktop:
- Windows tray cross-compiled (cargo-xwin), installed with per-user
autostart Run key; tray actions trigger_scan/approve_update wired to
the local API
- Linux tray off the service child-spawn path — XDG autostart only, kills
the double-launch
- signalDesktopRestart no longer no-ops on Windows (taskkill /F /IM)
- server serves /desktop/:platform/:arch
Web:
- TokenManagement + AgentManagement folded into one Agents & Enrollment
settings page (useRegistrationTokens hook)
Agent/server:
- platform-aware self-update staging (constants/paths.go), no more
hardcoded /var/lib/redflag
- consumer helper gated: sudo systemd-run on Linux, child proc elsewhere
- migration 060 drops the never-used token_seats table
- droppage of dead constructors and orphaned windows.go service methods
Most forges hand back a "latest stable" that ignores prereleases. Fine
until something ships only prereleases for a stretch — us, through
alpha, where every tag under v0.3.0 goes out as a prerelease. Against
that, /releases/latest either freezes or returns nothing, and the
dashboard reads like nothing's moving.
Add a per-row track_prereleases flag. When it's on, the forgejo adapter
walks the full release list and considers prereleases when picking the
highest version; off (the default) keeps stable-only behavior, so the
other adapters don't change. Seed our own self-row on so we stop
looking frozen.
Renamed gitea_releases to forgejo_releases while in there — the wire
format is Forgejo's, Codeberg runs it, and the old name was a misnomer.
Legacy source="gitea" rows still resolve through an alias.