Releases: Elevarq/Signals
v0.10.0-rc.1
Release candidate. Closes the launch-readiness items found in the
deploy/onboarding review: the AWS/Azure/GCP passwordless onboarding
templates are runnable as documented, image tags are unified, the
extended-statistics-data collectors degrade cleanly under a
least-privilege role, the Terraform modules are validated in CI, and the
AWSaws_rds_iampath is live-validated against an IAM-auth RDS.
Added
- CI:
terraform validatefor the cloud onboarding modules (#202). A new
Terraform Validateworkflow runsfmt -check+init -backend=false+
terraform validateacrossdeploy/{aws,azure,gcp}/terraformon every PR
that touches those modules. Backend-free, so no cloud credentials are used
and nothing is provisioned. All three modules validate clean; the earlier
failure was an environment-specific provider-plugin issue, not a template
defect. - Operator-gated AWS
aws_rds_iamlive-smoke workflow + runbook (#201).
Aworkflow_dispatch-onlyAWS RDS IAM Live Smokeworkflow does
terraform applyagainst an IAM-auth RDS instance, transiently grants the
collector role SSM to reach the loopback-only API, forces a collection,
asserts a passwordless snapshot, then alwaysterraform destroys. It is
not part of default CI — nothing runs and no cloud cost is incurred
until an operator dispatches it with anAWS_LIVE_SMOKE_ROLE_ARN(GitHub→AWS
OIDC, no long-lived keys). Seedeploy/aws/LIVE-SMOKE.md. Azure/GCP variants
follow the same shape (follow-up).
Changed
- Swept all deploy assets to image tag
0.10.0-beta.7(#199). The Helm
chart (Chart.yamlversion/appVersion,values.yamlimage.tag) had
drifted tobeta.6and the Azure/GCP Terraform + Azure Bicep tobeta.5;
all now pin the smoke-testedbeta.7. (AWS templates are bumped in #198.)
Fixed
- AWS onboarding templates are now runnable as documented (#198). The
CloudFormation and Terraform templates ran the image as
${ImageUri} --config …, which replaced thesignalsCMDso tini tried to
exec--config; they now pass thesignalssubcommand explicitly. User-data
mints a control-plane API token and passes it viaSIGNALS_API_TOKEN(stored
root-only at/root/signals-api-token, outside the bind mount) so the
documentedsignalsctl status/exportverification can authenticate, makes
the bind-mounted config world-readable for the non-root container, and pins the
AWS image-tag defaults to0.10.0-beta.7. - Azure and GCP onboarding templates are now runnable as documented (#205).
The Azure (Terraform + Bicep) and GCP (Terraform) templates carried the same
defects fixed for AWS in #198: they ran the image as${image} --config …,
which replaced thesignalsCMDso tini exec'd--config; they now pass
thesignalssubcommand explicitly. Cloud-init mints a control-plane API
token and passes it viaSIGNALS_API_TOKEN(stored root-only at
/root/signals-api-token, outside the bind mount) so the documented
signalsctl status/exportverification can authenticate, and makes the
bind-mounted config world-readable for the non-root container. - Extended-statistics-data collectors degrade as skipped under a
least-privilege role, and stop the repeated (incorrect) pg_monitor
advisory (#200).pg_statistic_ext_datahas PUBLIC SELECT revoked, so
pg_statistic_ext_data_v1/pg_statistic_ext_data_mcv_v1return
SQLSTATE 42501 for apg_monitorrole (theLEFT JOINdoes not rescue
it; access needs superuser or an explicit GRANT). These collectors now
recordstatus=skipped, reason=privilege_owner_onlyinstead of
failed, so the cycle is no longer reportedpartialfor an expected
privilege boundary. The operator advisory is corrected (the missing
privilege is notpg_monitor) and logged once per(target, collector)
per daemon run instead of every poll. Spec:
specifications/owner_only_privilege_degradation.md(R116, R117);
corrects the priorpg_statistic_ext_data_v1FC-03 / AT-02, which
wrongly assumed theLEFT JOINyieldsavailable=falserows for a
non-owner role.
Supply chain
- Images (same manifest digest in both registries):
- GHCR:
ghcr.io/elevarq/signals:0.10.0-rc.1 - Docker Hub:
elevarq/signals:0.10.0-rc.1(when configured)
- GHCR:
- Digest:
sha256:83ab91a5736382eba841c5f4b18a65c463536504ce920ec9c8c401b66596f509 - Architectures:
linux/amd64,linux/arm64 - Cosign-signed in both registries (keyless, GitHub OIDC)
- SBOM attached as OCI attestation and as
sbom.spdx.jsonrelease asset - SLSA build provenance attestation (
mode=max)
Quick signature verification (GHCR):
cosign verify ghcr.io/elevarq/signals:0.10.0-rc.1 --certificate-identity-regexp='github.com/Elevarq/(Signals|signals)/.github/workflows/release.yml@' --certificate-oidc-issuer='https://token.actions.githubusercontent.com'Same command works against elevarq/signals:0.10.0-rc.1 — the certificate identity is bound to the workflow, not the registry.
Full verification checklist (manifest, SBOM, provenance, Trivy):
docs/release-verification.md
v0.10.0-beta.7
Highlights. Adds the AWS Systems Manager Parameter Store
secret_store
backend, completes the de-arqrename to Elevarq Signals, and closes a
credential-redaction gap found during beta testing.Breaking — first-party importers must update import paths. The Go
module path changedgithub.com/elevarq/arq-signals->
github.com/elevarq/signals, and the repository was renamed
Elevarq/Arq-Signals->Elevarq/Signals(old URLs redirect). The
deprecatedarqctl/arq-signalsbinary aliases were removed — use
signals/signalsctl.Security.
pg_stat_statementsquery text is now redacted of structured
credential literals (role/userPASSWORD, libpq conninfopassword=)
before persistence and export (#188).Upgrade notes. No config changes required beyond the import-path /
binary-name renames above. The committedChart.yamlversion is stamped
from the release tag at package time, so it may lag the tag.
Added
secret_store: AWS Systems Manager Parameter Store backend (#157).
A target's database password may now live in Parameter Store, referenced
by ARN (arn:aws:ssm:<region>:<acct>:parameter/<name>). The parameter is
fetched withGetParameterandWithDecryption=true, so aSecureString
is returned decrypted and a plainStringpasses through. The region is
taken authoritatively from the ARN, and thessmvssecretsmanagerARN
service segment selects the backend. Requiresssm:GetParameter(plus
kms:Decrypton the CMK for aSecureString). All othersecret_store
behaviour (verify-full floor, no inline password, never-log, per-target
cache,secret_json_key) is unchanged.
Changed
-
Completed the de-
arqrename (#171, closes #62). With the GitHub
repository renamed toElevarq/Signals, the last structural Arq names
are gone: the Go module path is nowgithub.com/elevarq/signals
(first-party consumers must update imports), the spec tree moved
features/arq-signals/→features/signals/, requirement IDs are
SIGNALS-*(wasARQ-SIGNALS-*), and residualElevarq/Arq-Signals
repo URLs / issue links now point atElevarq/Signals. The deprecated
arqctl/arq-signalsbinary aliases were already removed (#168).
References to the sibling Arq analyzer repo are unchanged — that is
a separate product. -
BREAKING — removed the residual
arqbranding from every user-facing
interface (#137). Beta intentionally froze these names (see the
beta.4 note below); with adoption beginning, this is the last window to
rename them without a compatibility shim. There are no aliases for the
old names — update configs, environments, and provisioning before
upgrading. Renames:- Environment variables: the
ARQ_SIGNALS_*prefix becomes
SIGNALS_*(e.g.ARQ_SIGNALS_API_TOKEN->SIGNALS_API_TOKEN,
ARQ_SIGNALS_CONFIG->SIGNALS_CONFIG). The two non-prefixed vars
follow:ARQ_ENV->SIGNALS_ENV,ARQ_ALLOW_INSECURE_PG_TLS->
SIGNALS_ALLOW_INSECURE_PG_TLS. - Default config directory:
/etc/arq/->/etc/signals/(default
search path/etc/signals/signals.yaml; control-plane token default
/etc/signals/control-plane.token). - Default SQLite store path:
/data/arq-signals.db->/data/signals.db. - PostgreSQL
application_name: every collector connection now
identifies assignals(wasarq-signals); the pg_stat_activity /
pg_stat_statements self-filter matches the new value. - Snapshot export schema:
schema_versionis nowsignals-snapshot.v1
(wasarq-snapshot.v1); the export metadata keyarq_signals_version
becomessignals_version. Downstream consumers of the export
(Elevarq Analyzer/Insight) must accept the new identifier — see #137
for the cross-repo follow-up. - Control-plane config:
signals.mode: arq_managed->managed;
keysarq_control_plane_token_file/arq_control_plane_token_env->
control_plane_token_file/control_plane_token_env. - Audit-log reason value:
scheduled_arq_cycle->scheduled_cycle. - Documented DB monitoring role: examples now use a single
signals
role (was the inconsistentarq_signals/arq_monitor); read-only
example rolearq_signals_ro->signals_ro. - Deploy/example names: Docker volume
arq-data->signals-data;
example Kubernetes secret namesarq-pg-password/arq-db-credentials
/arq-api-token->signals-*.
Unchanged (tracked separately): the Go module path
github.com/elevarq/arq-signalsand the repository URL stay until the
repository rename (#62); internalARQ-SIGNALS-*requirement IDs are an
internal traceability scheme. Prometheus metric names are renamed in
the companion change below (#139). - Environment variables: the
-
BREAKING — renamed the Prometheus metric prefix
arq_signal_*->
signals_*(#139). Completes the de-arqrename for the/metrics
endpoint surface. There are no aliases — update dashboards, recording
rules, and alert rules before upgrading. All 14 series rename, e.g.
arq_signal_collection_cycles_total->signals_collection_cycles_total,
arq_signal_circuit_state->signals_circuit_state,
arq_signal_export_requests_total->signals_export_requests_total.
Label names, label-value enums, and metric semantics are unchanged. -
Renamed the residual
arqdeveloper-facing identifiers left out of
#137 (#150). These are internal/cosmetic names with no operator-facing
surface, so #137 correctly scoped them out; this completes the de-arq
rename. No behaviour change, no aliases needed (none are read by CI or
by operators):- Live/integration test env vars:
ARQ_TEST_*->SIGNALS_TEST_*
andARQ_DOCTOR_TEST_*->SIGNALS_DOCTOR_TEST_*(e.g.
ARQ_TEST_PG_DSN->SIGNALS_TEST_PG_DSN,
ARQ_TEST_TSDB_DSN->SIGNALS_TEST_TSDB_DSN). Set only by developers
running the build-tag-gated live tests manually. The naming spec
acceptance docs andfeatures/arq-signals/traceability.mdwere updated
in lockstep. - Transient SAVEPOINT name: the per-query savepoint is now
signals_q_%d(wasarq_q_%d); observable inpg_stat_activity/
server logs during a collection cycle. - Guided-connect temp file prefix:
.arqctl-connect-*.yaml->
.signalsctl-connect-*.yaml. - Sample DB usernames in test fixtures and example DSNs use the
brand-neutralmonitor(wasarq). - Stale test names carrying the old brand were renamed
(TestR083ArqManagedRequiresToken,
TestR083ControlPlaneTokenSetsArqActor,
TestHelm_ConfigMapIsMountedAtEtcArq).
These last Arq-prefixed identifiers (the module path, the
features/
spec tree, and the requirement-ID prefix) were completed once the
repository was renamed — see the #171 entry above. - Live/integration test env vars:
Removed
- Deprecated binary aliases
arqctlandarq-signals(#168). The old
Arq-branded names introduced as a transitional courtesy in #62 are gone:
the daemon and CLI no longer respond to (or warn under) those names, and
the container image /make buildno longer create the symlinks. Use
signalsandsignalsctl. Brought forward from the originally planned
post-launch removal ahead of the repository rename (#62).
Fixed
-
Corrected the documented
signalsctl doctorconfig path that pointed
at a non-existent/etc/signals-signals/directory (#153). The Helm
chart mounts the ConfigMap at/etc/signalsand the daemon's default
config is/etc/signals/signals.yaml, but
docs/install/kubernetes-production.mdtold operators to run
signalsctl doctor --config /etc/signals-signals/signals.yaml, which
fails on copy-paste — the path does not exist in the pod. The
specifications/doctor.mdexample output had the same doubled directory
(plus the wrong filenameconfig.yaml). Both now reference
/etc/signals/signals.yaml. Thesignals-signalsresource names in
the same doc are correct (Helm renders{release}-signalsand the docs
install with release namesignals) and are unchanged. Documentation
only. -
Example DB monitoring roles renamed to the single
signalsrole
(#141). #137's claim that the examples use a singlesignalsrole
was incomplete — the role-creation SQL and the snapshot fixture were
missed, leaving the bundled Docker quickstart and TimescaleDB demo
broken (their Compose files target usersignals, butinit.sql/
roles.sqlcreatedarq_monitor, so the collector could never
authenticate). Renamedarq_signals/arq_monitor->signalsin
examples/init.sql,examples/local-safe-role/signals.yaml.example,
andexamples/snapshot-example/snapshots.ndjson, and
arq_monitor/arq_monitor_owner->signals/
signals_monitor_ownerin the TimescaleDB demo
(examples/timescaledb-demo/roles.sql,seed.sql) to match the
names already wired in those demos' Compose files. Example-only
change; no product behaviour is affected. -
Cleared remaining hyphenated
arq-signalsreferences from the
examples (#143). Follow-up to #137/#127. Renamed the example SQLite
store paths./arq-signals.db/./arq-signals-test.db->
./signals.db/./signals-test.db
(examples/local-safe-role/signals.yaml.example,
examples/local-superuser-override/signals.yaml.example) and the
residual prose use of "arq-signals" as the product name ->
"Elevarq Signals" in example comments and headers
(examples/README.md,examples/docker-compose.yml,
examples/docker-compose.prod.yml,examples/signals.yaml,
examples/init.sql,examples/timescaledb-demo/docker-compose.yml).
Service identifiers were already namedsignals; this is prose and
example-path only, with no product behaviour impact. -
Cleared residual
arqnames from thedeploy/IaC templates
(#145). #137 renamed ...
v0.10.0-beta.6
Added
- Secret-store credential provider (
auth_method: secret_store, #93,
#97). Fetch a static database password from a cloud secret store using
the collector's ambient cloud identity and apply it as the connection
password - keeping the credential out of Signals' config and off disk
while leaving rotation to the vault. The backend is inferred from the
shape ofsecret_ref: an AWS Secrets Manager ARN, an Azure Key Vault
secret URI, or a GCP Secret Manager resource name; a reference matching
none is a hard startup error naming the three accepted forms. The AWS
Secrets Manager path is production-grade (region taken authoritatively
from the ARN, neverAWS_REGION/ the SDK default chain / IMDS). Azure
Key Vault and GCP Secret Manager are now production-wired as well (#108):
eachsecret_refis routed to exactly its inferred backend's SDK - Azure
via theDefaultAzureCredentialchain +azsecrets.GetSecret, GCP via
Application Default Credentials +AccessSecretVersion- and no other
backend's SDK is ever invoked (INV005). A backend the collector's ambient
identity cannot reach is a connect-time, target-scoped failure that does
not stop collection for other targets.
An optionalsecret_json_keyextracts a named key from a JSON secret
(raw value otherwise); extraction failures never echo the raw secret. The
fetched secret is cached per target with a reuse bound ofmin(vault TTL, max_cache_ttl)- with neither set it is re-fetched on every reconnect so
a rotated secret is picked up without a restart. Validation enforces the
passwordless andverify-fullTLS floors at startup; the secret is never
stored, exported, or logged (metadata only). Reuses the shared
credential-provider scaffolding from #94. Live behaviour covered by an
env-gated smoke (ARQ_SIGNALS_INTEGRATION_LIVE=1). - GCP Cloud SQL IAM credential provider (
auth_method: gcp_cloudsql_iam, #93, #96). Connect passwordlessly to Cloud SQL for
PostgreSQL using Cloud SQL IAM database authentication: a short-lived
Google OAuth2 access token acquired from the collector's ambient Google
identity (Application Default Credentials - environment / GKE workload
identity / service-account key /gcloud auth application-default login). The token (scope fixed at
https://www.googleapis.com/auth/sqlservice.login) is the connection
password over a direct libpqverify-fullchannel - the token-as-
password seam, not the Cloud SQL Go Connector; no secret is stored in
Signals' config. Tokens are cached per target and re-acquired ~5 minutes
before their ~60 minute expiry, never shared across targets, and never
logged or exported (metadata only). Validation enforces the passwordless
andverify-fullTLS floors at startup; an optional
gcp_impersonate_service_accountlets the ambient identity impersonate a
per-target service account, and an undiscoverable identity or denied
impersonation is a connect-time, target-scoped failure that does not stop
collection for other targets. The Google SDK is linked only on the
gcp_cloudsql_iampath - password targets require no Google credentials.
Reuses the shared credential-provider scaffolding from #94. Live
behaviour covered by an env-gated smoke
(ARQ_SIGNALS_INTEGRATION_LIVE=1). - Azure Entra ID credential provider (
auth_method: azure_entra, #93,
#95). Connect passwordlessly to Azure Database for PostgreSQL -
Flexible Server using a short-lived Microsoft Entra ID access token
acquired from the collector's ambient Azure identity (the
DefaultAzureCredentialchain: environment / AKS workload identity /
managed identity / Azure CLI). The token (scope fixed at
https://ossrdbms-aad.database.windows.net/.default) is the connection
password; no secret is stored in Signals' config. Tokens are cached per
target and re-acquired ~5 minutes before their ~60-90 minute expiry,
never shared across targets, and never logged or exported (metadata
only). Validation enforces the passwordless andverify-fullTLS
floors at startup; a user-assigned managed identity is disambiguated by
the optionalazure_client_id(thenAZURE_CLIENT_ID), and an
undiscoverable or ambiguous identity is a connect-time, target-scoped
failure that does not stop collection for other targets. The Azure SDK
is linked only on theazure_entrapath - password targets require no
Azure credentials. Reuses the shared credential-provider scaffolding
from #94. Live behaviour covered by an env-gated smoke
(ARQ_SIGNALS_INTEGRATION_LIVE=1). - AWS RDS/Aurora IAM credential provider (
auth_method: aws_rds_iam,
#93, #94). Connect passwordlessly to Amazon RDS / Aurora PostgreSQL
using a short-lived RDS IAM auth token minted from the collector's
ambient AWS identity (SDK default credential chain: env / shared
config / EC2 instance profile / ECS task role / EKS IRSA / Pod
Identity). The token is the connection password; no secret is stored
in Signals' config. Tokens are cached per target and re-minted ~3
minutes before their 15-minute expiry, never shared across targets,
and never logged or exported (metadata only). Validation enforces the
passwordless andverify-fullTLS floors at startup; a missing region
is a startup warning resolved fromAWS_REGION/
AWS_DEFAULT_REGION/ instance metadata (IMDS) at connect time. The
AWS SDK is linked only on theaws_rds_iampath - password targets
require no AWS credentials. Introduces the shared credential-provider
scaffolding (auth_methoddispatch, per-target token cache,
BeforeConnectwiring) that sibling providers reuse. Live behaviour
covered by an env-gated smoke (ARQ_SIGNALS_INTEGRATION_LIVE=1).
Changed
- Public binaries renamed to
signals(daemon) andsignalsctl
(CLI) (#125). The open-source collector now ships under its own
unbranded names so it can stand on its own, independent of the
commercial Elevarq products. The container image moves to
ghcr.io/elevarq/signals(Docker Hub mirrorelevarq/signals), the
Helm chart is renamed tosignals, and the demo/quickstart surface
(Dockerfiles, compose files, Helm install commands, Prometheus/Grafana
examples, cloud deploy templates, and user-facing help text) now uses
the new names throughout. The old namesarq-signalsandarqctlare
retained as deprecation aliases: invoking either prints a one-line
stderr warning and otherwise behaves identically. The aliases are
removed one release after launch (tracked in #62). The Go module path
(github.com/elevarq/arq-signals), the GitHub repository URL, the
ARQ_SIGNALS_*environment variables, and the PostgreSQL
application_name = 'arq-signals'collector identity are intentionally
unchanged in this phase (config and integration interfaces, not binary
branding). - Release signature verification is forward-compatible with the repo
rename (#131). Thecosign verify--certificate-identity-regexpin
the README,SECURITY.md, the release notes, and the release workflow
now matches both the currentElevarq/Arq-Signalsand the future
Elevarq/signalsworkflow identity, so signature verification keeps
working across the planned GitHub repository rename (#62) without a
flag-day change.
Supply chain
- Images (same manifest digest in both registries):
- GHCR:
ghcr.io/elevarq/signals:0.10.0-beta.6 - Docker Hub:
elevarq/signals:0.10.0-beta.6(when configured)
- GHCR:
- Digest:
sha256:ced51c346669960f90a4cc0d5b0564cd2e8aafa00f51629cad9883f9d228aa4b - Architectures:
linux/amd64,linux/arm64 - Cosign-signed in both registries (keyless, GitHub OIDC)
- SBOM attached as OCI attestation and as
sbom.spdx.jsonrelease asset - SLSA build provenance attestation (
mode=max)
Quick signature verification (GHCR):
cosign verify ghcr.io/elevarq/signals:0.10.0-beta.6 --certificate-identity-regexp='github.com/Elevarq/(Arq-Signals|signals)/.github/workflows/release.yml@' --certificate-oidc-issuer='https://token.actions.githubusercontent.com'Same command works against elevarq/signals:0.10.0-beta.6 — the certificate identity is bound to the workflow, not the registry.
Full verification checklist (manifest, SBOM, provenance, Trivy):
docs/release-verification.md
v0.10.0-beta.5
Re-cut of v0.10.0-beta.4: that tag's publish job died at the Docker
Hub login (expired mirror token) before the GHCR image, chart, and
GitHub Release published (#82). Same data-collection layer as
beta.4 - only the release pipeline changed (Docker Hub login is now
non-fatal; GHCR-only on mirror-credential failure). beta.4 preserved
below for history.
Supply chain
- Images (same manifest digest in both registries):
- GHCR:
ghcr.io/elevarq/arq-signals:0.10.0-beta.5 - Docker Hub:
elevarq/arq-signals:0.10.0-beta.5(when configured)
- GHCR:
- Digest:
sha256:460c0c8eb3acc751c4651cb3310fee588efe5699a268da8de2d636b36eb5800a - Architectures:
linux/amd64,linux/arm64 - Cosign-signed in both registries (keyless, GitHub OIDC)
- SBOM attached as OCI attestation and as
sbom.spdx.jsonrelease asset - SLSA build provenance attestation (
mode=max)
Quick signature verification (GHCR):
cosign verify ghcr.io/elevarq/arq-signals:0.10.0-beta.5 --certificate-identity-regexp='github.com/Elevarq/Arq-Signals/.github/workflows/release.yml@' --certificate-oidc-issuer='https://token.actions.githubusercontent.com'Same command works against elevarq/arq-signals:0.10.0-beta.5 — the certificate identity is bound to the workflow, not the registry.
Full verification checklist (manifest, SBOM, provenance, Trivy):
docs/release-verification.md
v0.10.0-beta.3
Re-cut after release-pipeline fix. v0.10.0-beta.2's container
image and GitHub Release were published successfully, but the
publish-chart job failed to sign the Helm chart with cosign — the
job authenticated GHCR via helm registry login (helm's own config),
not the docker keychain cosign reads. The fix
(docker/login-action before Sign chart) is now on main. Same
data-collection layer as beta.2; this artifact's chart is signed.
Also fixes the prerelease flag on the GitHub Release page that beta.2
was missing (action-gh-release@v3 no longer auto-detects from the
semver suffix). (#50)
Supply chain
- Images (same manifest digest in both registries):
- GHCR:
ghcr.io/elevarq/arq-signals:0.10.0-beta.3 - Docker Hub:
elevarq/arq-signals:0.10.0-beta.3(when configured)
- GHCR:
- Digest:
sha256:17440ab583728621203d9aa191e188d5868b0232aa7d8b63329d4a8fffc47f31 - Architectures:
linux/amd64,linux/arm64 - Cosign-signed in both registries (keyless, GitHub OIDC)
- SBOM attached as OCI attestation and as
sbom.spdx.jsonrelease asset - SLSA build provenance attestation (
mode=max)
Quick signature verification (GHCR):
cosign verify ghcr.io/elevarq/arq-signals:0.10.0-beta.3 --certificate-identity-regexp='github.com/Elevarq/Arq-Signals/.github/workflows/release.yml@' --certificate-oidc-issuer='https://token.actions.githubusercontent.com'Same command works against elevarq/arq-signals:0.10.0-beta.3 — the certificate identity is bound to the workflow, not the registry.
Full verification checklist (manifest, SBOM, provenance, Trivy):
docs/release-verification.md
v0.10.0-beta.2
Beta cut after Scorecard hardening. v0.10.0-beta.1 was tagged but
its release pipeline run was cancelled (stuck on multi-arch GHCR
publish); the GitHub Release page was never created. This Beta cut is
the same data-collection layer (no user-observable daemon behaviour
change vs beta.1) but built and published from a main whose CI /
supply-chain posture has been hardened — see Security below. Consumers
should pin 0.10.0-beta.2; :latest is unmoved (pre-release).
Security
- All GitHub Actions and Docker base images in
ci.yml/release.yml/nightly-security.yml/Dockerfileare
pinned by 40-char content SHAs (#44). Defends against tag-rewriting
/ repo-takeover supply-chain attacks; Dependabot
(.github/dependabot.yml, #34) keeps both the SHA and the
human-readable version comment fresh. release.ymltop-level workflow permissions reduced to
contents: read. Writes (packages: write,id-token: write,
attestations: write,contents: writeon the release job) are
declared per-job following thenightly-security.ymlpattern (#39).golang.org/x/sysbumped past CVE-2026-39824 (#30). The
vulnerablewindows.NewNTUnicodeStringis not reachable in our
linux/darwinbuilds, but the bump clears the indirect-vuln
trail.go install golang.org/x/vuln/cmd/govulncheckpinned by SHA to the
v1.3.0 commit (#47).- Native Go fuzz targets added for
RedactDSNandDecodeNDJSON
(#43). >450k iterations across both targets find no panics or
property violations at this commit. - Branch protection applied to
main: required status checks
(test,security-scan,Analyze (go),Analyze (actions),
CodeQL),strict(require branch up-to-date), linear history,
no force pushes, no deletions.
Changed (deps)
- Dependabot routine bumps:
hadolint/hadolint-action->
3.3.0(#35),azure/setup-helm->v5(#36),
actions/download-artifact->v8(#37),
softprops/action-gh-release->v3(#38),
actions/upload-artifact->v7(#40), and a gomod minor-group
bundle across four modules (#41).
Supply chain
- Images (same manifest digest in both registries):
- GHCR:
ghcr.io/elevarq/arq-signals:0.10.0-beta.2 - Docker Hub:
elevarq/arq-signals:0.10.0-beta.2(when configured)
- GHCR:
- Digest:
sha256:bb11230013117939d0e859105dee99b0051f8c21879ee90ef39d8922cdc75c96 - Architectures:
linux/amd64,linux/arm64 - Cosign-signed in both registries (keyless, GitHub OIDC)
- SBOM attached as OCI attestation and as
sbom.spdx.jsonrelease asset - SLSA build provenance attestation (
mode=max)
Quick signature verification (GHCR):
cosign verify ghcr.io/elevarq/arq-signals:0.10.0-beta.2 --certificate-identity-regexp='github.com/Elevarq/Arq-Signals/.github/workflows/release.yml@' --certificate-oidc-issuer='https://token.actions.githubusercontent.com'Same command works against elevarq/arq-signals:0.10.0-beta.2 — the certificate identity is bound to the workflow, not the registry.
Full verification checklist (manifest, SBOM, provenance, Trivy):
docs/release-verification.md
v0.9.0
Added
- Broader read-only catalog coverage: additional collectors capture
user-defined catalog objects and extended statistics so dependent
tables and queries are fully represented in a snapshot for downstream
analysis. - Optional per-collector view in the export ZIP.
- Extra PG 14+ session counters in
pg_stat_database; roleoidin
login_rolesfor stable role-name resolution;pg_settingscontext
and value bounds.
Still read-only by design — three-layer enforcement, no write
operations, no telemetry, no AI.
Supply chain
- Images (same manifest digest in both registries):
- GHCR:
ghcr.io/elevarq/arq-signals:0.9.0 - Docker Hub:
elevarq/arq-signals:0.9.0(when configured)
- GHCR:
- Digest:
sha256:270c543d426b3dff71e85db2665a8a9e5b669f959c76ec51fdef4ddd863ed187 - Architectures:
linux/amd64,linux/arm64 - Cosign-signed in both registries (keyless, GitHub OIDC)
- SBOM attached as OCI attestation and as
sbom.spdx.jsonrelease asset - SLSA build provenance attestation (
mode=max)
Quick signature verification (GHCR):
cosign verify ghcr.io/elevarq/arq-signals:0.9.0 --certificate-identity-regexp='github.com/Elevarq/Arq-Signals/.github/workflows/release.yml@' --certificate-oidc-issuer='https://token.actions.githubusercontent.com'Same command works against elevarq/arq-signals:0.9.0 — the certificate identity is bound to the workflow, not the registry.
Full verification checklist (manifest, SBOM, provenance, Trivy):
docs/release-verification.md