Commit Graph

2517 Commits

Author SHA1 Message Date
pulse-triage[bot] e1b3a352c5 Preserve truthful partial-stop recovery in legacy controls
An owned activation link may already be disabled before a later observation fails; assert exact service/PID/credential retention without re-enabling it. Require the old installed-script PID-erasure adverse control, keeping that runtime observation distinct from credential erasure and new renderer behaviour.

Contract-Neutral: Verification and precise contract documentation only; the production installer is unchanged.
Change-source: pulse-maintainer
2026-10-12 10:15:03 +01:00
pulse-triage[bot] 6d654f3984 Bind complete rc.d renderer in removal controls
The renderer contains nested functions inside its heredoc; extracting at the first closing brace never exercises its stop function. Bind its full top-level body and inject missing sysrc in the executable model reached by timeout.

Contract-Neutral: Confined test extraction and missing-tool modelling only; no installer or contract behaviour changes.
Change-source: pulse-maintainer
2026-10-12 10:09:43 +01:00
rcourtman bed5052eb5 Treat no matching unit files as an empty service inventory (#2859)
The first beta (v6.6.0-beta.1) now passes its preparation checks and
both source pairs, and its release workflow failed twice at the
install.sh smoke test: on a clean Debian 12 container install.sh stops
with "Cannot identify the Pulse systemd service: unit inventory failed".
That is a real regression on main, not a flake. v6.5.0 does not have it,
so no release carries it.

Cause: the 2026-10-10 service discovery change reads `systemctl
list-unit-files -- pulse-backend.service pulse.service` and refuses on
any non-zero exit. systemd exits 1, printing nothing on stdout or
stderr, when none of the named unit files exist, which is every fresh
host (checked on systemd 255 here and by the smoke container's systemd
252). The change's comment says a successful empty read permits a new
installation, but an empty read is not exit 0.

Why the tests missed it: their systemctl double reports no units as exit
0, and `test_partial_failed_inventory_is_not_absence` asserted that an
empty inventory with exit 1 is refused.

Fix: one shared inventory read, used by the installer, the unattended
updater and the auto-update mask check (which had the same hazard). It
accepts exactly the silent exit 1 as an empty inventory, after a second
read confirms there is still no output and no message. A timeout, a
signal, any other status, or an exit 1 that carries output or a message
stays a failed inventory, so real failures still refuse.

Tests: the doubles now model systemd (a failure prints its message, a
silent exit 1 is absence), the two tests that encoded the defect model a
real failure, and new tests cover a fresh host for both scripts,
including real `systemctl --root` over an empty unit root. Contract doc
updated. The registered runtime proofs for install.sh and the unattended
updater (the Go tests that drive this suite) now require the fresh-host
controls to have run and passed.

Checked on pulse-dev: against the unfixed scripts the four new
fresh-host tests fail and the rest pass; against this change all 18
discovery tests, the 2 repair tests and the 16 timer tests pass, and the
Go installer tests pass (184 s).

This replaces #2855, whose first commit lacked the registered proof
files the completion guard requires per commit.

Refs #2785
2026-10-12 10:07:19 +01:00
pulse-triage[bot] 123652e29b Preserve reviewed monitoring repairs with upstream Discovery removal
Compose current main e2f4bdff03 additively. Retain both subsystem records and the held change-age control while withdrawing only the obsolete Discovery identification test. Reviewed identities and ancestry, canonical guest History ownership and upstream feature removal remain intact.

Change-source: pulse-maintainer
2026-10-12 10:04:58 +01:00
pulse-triage[bot] c3911ea59f Bound legacy removal PID records and required-tool refusal
Retain recovery before unknown or unavailable timeout/sysrc observations, require bounded PID records, and align the existing daemon-supervisor assertion with checked signal delivery rather than ignored errors. Every source control remains mandatory.

Change-source: pulse-maintainer
2026-10-12 10:04:52 +01:00
pulse-triage[bot] bad4845508 Retain rc.d and SysV recovery until removal is observed
Continue #1099: stop and disable the actual legacy manager before remote deregistration or local erasure, recheck after confirmation, and retain PID/service/credential material on refusal or unknown state. Check collector and supervisor absence, exact runlevel ownership and rendered signal failures with confined production-function controls. Appliance bootstrap and native acceptance remain separate.

Change-source: pulse-maintainer
2026-10-12 10:00:09 +01:00
pulse-triage[bot] 14518f6f3a Integrate reviewed safety fixture alignment
Preserve exact Delivery candidate ce1a28f64d. Review confirms fixture-only intake, private-file guidance, native helper and bounded teardown corrections retain safety controls. Retained source-60krqmze proves controlled fixtures; Go 1.26.9 and native macOS containing CI remain distinct from its Go 1.26.8 diagnostics.

Change-source: pulse-maintainer
2026-10-12 09:43:52 +01:00
rcourtman 3e3ad9a5bd Keep the real-systemctl controls skipped where systemctl is absent
The previous commit inserted a new real-systemctl test above the old one
and took over its skipUnless decorator, so on macOS, which has no
systemctl, the new test skipped and the old one ran unprotected and
failed. Restore the decorator on the old test.

The installer proof required the real-systemctl control to have passed.
Where systemctl does not exist it must instead report skipped, so the
proof now checks for ok on a host with systemctl and for skipped on one
without, and still fails if the control is absent from the output.

Refs: #2785
2026-10-12 09:40:57 +01:00
rcourtman d8806e3c20 Treat no matching unit files as an empty service inventory
The 2026-10-10 server service discovery change lists the two historical
unit names with one pattern read and refuses to continue when that read
exits non-zero. systemctl list-unit-files exits 1, printing nothing on
stdout or stderr, when none of the named unit files exist. That is every
fresh host, so install.sh refused with "Cannot identify the Pulse systemd
service: unit inventory failed" before it did any work. The first beta's
install.sh smoke test caught it on a clean Debian 12 container; no
release carries it, and v6.5.0 listed the whole inventory and grepped it.

The tests could not see it. Their systemctl double reports "no units" as
exit 0, and test_partial_failed_inventory_is_not_absence asserted that an
empty inventory with exit 1 must be refused, which is the defect itself.

Add one inventory read shared by the installer and the unattended
updater, and use it for the auto-update mask check, which had the same
hazard. It accepts exactly the silent exit 1 as an empty inventory, and
only after a second read confirms there is still no output and no
message. A timeout, a signal, any other status, or an exit 1 that carries
output or a message stays a failed inventory, so a real failure still
cannot pass as absence.

Make the doubles model systemd: a failure now prints its message, silent
exit 1 is absence, and a new test runs real systemctl --root over an
empty unit root for both scripts. Run against the unfixed scripts, the
four new fresh-host tests fail; the rest of the suite is unchanged.

The registered runtime proofs for install.sh and the unattended updater,
which drive this suite, now require the fresh-host controls to have run
and passed, so they cannot be skipped or deleted unnoticed.

Refs: #2785
2026-10-12 09:26:34 +01:00
rcourtman 3ec94790a9 Merge remote-tracking branch 'origin/main' into refactor/remove-ai-discovery 2026-10-12 09:15:24 +01:00
pulse-triage[bot] ce1a28f64d Keep integration safety fixtures aligned with reviewed source
Read optional intake precautions at their expandable report fields, bind OpenShift Secret tests to the validated private file, and target helper workflow negative controls by step. Preserve the prepared GNU timeout in the private teardown probe on macOS and keep the actual security migration boundaries mandatory. Production guidance, installer behaviour and platform coverage are unchanged.

Contract-Neutral: Fixture-only integration repair; no product, installer, workflow, deployment or safety contract delta.
Change-source: pulse-maintainer
2026-10-12 08:51:49 +01:00
pulse-triage[bot] 24772d68ed Compose retained SSO guide for final browser validation
Change-source: pulse-maintainer
2026-10-12 08:20:54 +01:00
pulse-triage[bot] 19b253776b Integrate reviewed OpenRC removal recovery fence
Retain exact candidate identity and confirmed-stop/all-runlevel admission before erasure; installed OpenRC and declared compiler proof remain unclaimed.

Change-source: pulse-maintainer
2026-10-12 08:17:17 +01:00
pulse-triage[bot] f63f2e155d Bind removal guidance checks to confirmed systemd quiescence
Combined-source validation found the removal-help assertion still looking for a direct systemctl stop after accepted teardown moved that operation into its fail-closed shared helper. Verify the actual helper call before revocation and retain stop, disable and complete-set readback assertions, with missing, late and ignored-call adverse controls.

Contract-Neutral: Test-fixture reconciliation only; no installer, help, lifecycle, schema or authority change.
Change-source: pulse-maintainer
2026-10-12 07:43:54 +01:00
pulse-triage[bot] 174f440e2d Retain OpenRC agent recovery until removal is confirmed
Require bounded diagnostic-free service and all-runlevel readback before server removal or local mutation, and reconcile again after remote confirmation while recovery state still exists. Refused stops, disable failures, unknown reads and unexpected init paths retain local material; absent and repeated removal need independent manager/process absence. Add executable confined refusal, ordering, custom-runlevel and timeout-child controls to the registered installer hook and owning contracts. Native OpenRC, Windows, other-manager and installed acceptance remain separate.

Change-source: pulse-maintainer
2026-10-12 06:58:15 +01:00
pulse-triage[bot] 2117b86ea4 Check administrator rights without assuming non-admins are read-only
SSO operators can hold permitted non-administrative write capabilities. The guide now checks the actual instance-administration boundary, without instructing a settings mutation or changing roles.

Change-source: pulse-maintainer
2026-10-12 06:50:03 +01:00
pulse-triage[bot] c104d52111 Integrate reviewed native Linux agent-removal CI gate
Preserve the exact reviewed candidate and its portable proof. Hosted native systemd receipts, matching Go compilation, signed installed-agent transport and Windows recovery remain separate acceptance obligations.

Change-source: pulse-maintainer
2026-10-12 06:34:45 +01:00
pulse-triage[bot] 0e021c5cb8 Make OIDC setup order and access checks usable
Copy generated callbacks only after provider save, align group-claim advice with provider-specific scopes, and retain administrator access until separate-session permission checks pass. Keep shipped documentation and regression checks in step without changing authentication or provider behaviour.

Change-source: pulse-maintainer
2026-10-12 06:34:38 +01:00
pulse-triage[bot] 219cfeed2c Integrate reviewed Kubernetes credential setup safeguards
Preserve the exact reviewed guide and regression-test commits. Retained command controls and browser evidence establish safer credential paths and permission diagnostics without cluster or privilege changes.

Change-source: pulse-maintainer
2026-10-12 06:18:43 +01:00
pulse-triage[bot] 5a8e73de6c Integrate reviewed startup import destination safeguards
Preserve the five reviewed Core commits exactly. Blank-only bootstrap admission and the matching persistence path retain existing access; authenticated transfer remains unchanged.

Change-source: pulse-maintainer
2026-10-12 06:11:16 +01:00
pulse-triage[bot] 27f9c1de5e Check agent removal against native hosted systemd
Run the accepted Unix teardown functions on fresh public Linux x64 and ARM64 CI, with real stop refusal, socket activation, batch reactivation and independent process/file readback. Retain bounded source-bound phase and owned-cleanup receipts; keep synthetic revocation separate from installed TLS, signed-agent and Windows acceptance.

Change-source: pulse-maintainer
2026-10-12 06:08:07 +01:00
pulse-triage[bot] c912ea8cf9 Integrate reviewed agent systemd removal safeguards
Preserve exact Delivery commits 4fce9ba024 and 25c84cc5e4. Retained source-pnqurqu_ proves the shell refusal and ordering controls; native Linux/Windows removal and matching-compiler proof remain separate.

Change-source: pulse-maintainer
2026-10-12 05:46:47 +01:00
pulse-triage[bot] 24c803f7e0 Contain Kubernetes token setup and permission diagnostics
The copied token recipe followed linked paths and continued without its own failure boundary. Reject unsafe paths before editing or contacting the cluster, preserve scoped file-only provisioning, and distinguish Kubernetes RBAC from local pod privilege and missing usage. Exercise the exact copied recipes with synthetic inputs and render the served guidance.

Contract-Neutral: Existing Kubernetes help and its regression tests only; no runtime, API, chart, role, deployment profile or feature change.
Change-source: pulse-maintainer
2026-10-12 05:29:51 +01:00
pulse-triage[bot] 25c84cc5e4 Keep runner revocation controls behind the observed stop boundary
Load the production quiescence helpers in the existing failed-revocation fixture and provide complete closed systemd observations. Continue testing the actual revocation refusal after verified stop/disable rather than replacing or bypassing the new safety boundary.

Change-source: pulse-maintainer
2026-10-12 05:20:06 +01:00
pulse-triage[bot] 4fce9ba024 Retain agent recovery files until systemd teardown is confirmed
Replace ignored stop and disable failures with bounded complete state observations and independent inactive/non-enabled readback. Reconcile helper socket and service together, and quiesce the full uninstall activation set before remote or local mutation. Preserve failed runner revocation material and existing saved-state, token, trust and platform boundaries. Add executable production-shell refusal, reactivation, timeout and owned-cleanup controls.

Change-source: pulse-maintainer
2026-10-12 05:17:04 +01:00
pulse-triage[bot] acc86c7aca Retain existing state when startup import is configured
Require a blank destination instead of using nodes.enc as a first-run sentinel. Recheck before writes, retain unknown or unreadable state, and leave deliberate authenticated transfer unchanged. Keep deployment .env provisioning and encrypted file precedence; explain the separate archive path in canonical and served help.

Change-source: pulse-maintainer
2026-10-12 05:03:18 +01:00
pulse-triage[bot] 42a1e5e632 Route historical upgrades through current recovery safeguards
The v4-to-v5 entry point still offered privileged download-and-purge cleanup and duplicate update shortcuts despite safer current procedures. Preserve configuration, credential and workload recovery evidence, separate server and agent paths, and link the inspected local cleanup without broadening it.

Contract-Neutral: Existing customer guidance, shipped Markdown and focused regression checks only; no runtime, API, permission, installer or cleanup contract changes.
Change-source: pulse-maintainer
2026-10-12 04:45:29 +01:00
pulse-triage[bot] 2c9931ad4c Integrate reviewed caller token-file retention repair
Retain exact Delivery candidate identity; preserve caller-owned credential files until lifecycle outcomes are known without widening authorised runtime cleanup.

Change-source: pulse-maintainer
2026-10-12 04:33:44 +01:00
pulse-triage[bot] 26f8ad8ac4 Integrate reviewed startup-import recovery guidance
Retain exact PI candidate identity and its proof; existing configuration-transfer help now states the real admission gate and replacement limits.

Change-source: pulse-maintainer
2026-10-12 04:33:41 +01:00
pulse-triage[bot] 8147f39292 Retain caller token files before installer lifecycle confirmation
Non-interactive token-file reading currently erases the supplied credential before permission checks and authenticated removal, including when removal is refused or its result is unknown. Treat token-file ingress as read-only: callers own their bootstrap cleanup, and confirmed removal still deletes only authorised runtime state. Keep token validation, TLS policy, exact record confirmation and credential-free local removal unchanged.

Extend the existing portable removal fixture through the actual parser and token ingress, root refusal and post-confirmation owned cleanup. Parent proof records thirty premature-erasure failures; a separate no-TTY harness control remains distinct. Update both owning contracts and the registered Go inventory hook together. Native Windows, compiled TLS and installed whole-job acceptance remain separate.

Change-source: pulse-maintainer
2026-10-12 03:55:06 +01:00
pulse-triage[bot] 9c1b4ef8dd Explain startup import without promising safe first-run recovery
Document the existing nodes.enc gate, replacement scope, file precedence and non-fatal import errors. Preserve agent identity and excluded state, isolate provisioning from live traffic, and keep one-shot inputs private rather than forcing a reset.

Contract-Neutral: Existing bootstrap and encrypted-import behaviour is unchanged; this corrects canonical and served help, with documentation regression controls.
Change-source: pulse-maintainer
2026-10-12 03:43:24 +01:00
pulse-triage[bot] f056c382c1 Integrate reviewed silent systemd unit absence repair
Retain the exact Delivery candidate b3b368c21b and its attributed PR2855 adaptation. Independent review verifies one-read failure retention and unchanged runtime-proof bytes; no native installation or published availability is claimed.

Change-source: pulse-maintainer
2026-10-12 03:36:57 +01:00
pulse-triage[bot] b3b368c21b Admit silent unit absence without losing inventory failures
Adapt rcourtman’s Pulse PR2855 (aef53d0d3e), which diagnosed systemd’s silent exit-one absence. The original contributor commit is unchanged and explicitly credited, not imported, amended or re-parented in this maintainer candidate.

One bounded stdout/stderr observation accepts genuine absence but retains failed first reads, other statuses and blank-line output. Include the existing registered installer/updater verification hooks, real-empty-root controls and missing-unit recovery double in this same source commit. This replaces the rejected foreign-history composition with a normal maintainer-reviewed implementation; no provenance policy, credential or host installation changes.

Source-attribution: rcourtman, https://github.com/rcourtman/Pulse/pull/2855, aef53d0d3e
Change-source: pulse-maintainer
2026-10-12 03:15:49 +01:00
pulse-triage[bot] 1fe3fab006 Preserve agent recovery state when the saved server is unavailable
Align existing removal and orphan-service help with credential-first Unix admission. Explain same-instance recovery, keep older served scripts and Windows behaviour distinct, and prevent stopping retries from being mistaken for revocation or completed removal.

Contract-Neutral: Existing operator guidance and regression assertions only; no runtime, schema, lifecycle or trust-boundary change.
Change-source: pulse-maintainer
2026-10-12 02:33:20 +01:00
pulse-triage[bot] 86e6e1ce50 Integrate reviewed safe reporting entrypoints
Change-source: pulse-maintainer
2026-10-12 02:23:26 +01:00
pulse-triage[bot] 03b8808c04 Retain Unix agent credentials when the saved server URL is missing
Credential-bearing removal currently short-circuits its confirmation gate when connection recovery leaves no URL, allowing local teardown without durably removing the server record. Check credential presence first and stop with same-instance recovery guidance before any process, service or state teardown. Keep credential-free local-only removal and existing exact-record/path authority intact.

Execute the real admission and initial teardown with private transport/service doubles, including every saved credential form, refusal, unknown response, identity mismatch and authorised cleanup. Register the portable Python controls in the installer inventory and describe the boundary in both owning contracts. Native Windows/TLS and whole installed lifecycle acceptance remain separate.

Change-source: pulse-maintainer
2026-10-12 01:56:17 +01:00
pulse-triage[bot] 3f97cfe27b Make safe reporting reachable from the documentation entrypoints
Accept original failure evidence without another reproduction or a diagnostic export, and place public-sharing precautions before readers leave for GitHub. Keep the shipped documentation index in sync and guard both entrypoints within the README page budget.

Contract-Neutral: Documentation-only intake guidance and regression checks; no runtime, API, collection, authentication or release contract changes.
Change-source: pulse-maintainer
2026-10-12 01:46:48 +01:00
pulse-triage[bot] 297f933d45 Integrate reviewed terminal token-file preservation coverage
Merge exact Core tip a01f3769ef. Resolve overlapping guide paragraphs with the already integrated damaged-token guidance, retaining private first-install checks, legacy compatibility, whole-token authentication and unknown error origin. Both guide regression sets pass.

Validation: retained source-j1h6i5hl covers unchanged terminal/writer coverage, formatting, lint, type checking and frontend build. Combined guide passes 12 authentication documentation checks, 62 shipped mirrors and 245 Markdown checks. No runtime authentication, native recovery or publication claim.

Contract-Neutral: Existing-guide clarification and regression coverage only; no runtime or public contract behaviour changes.
Change-source: pulse-maintainer
2026-10-12 01:22:33 +01:00
pulse-triage[bot] cbfe796250 Integrate reviewed damaged-token setup guidance
Accept exact product-intelligence candidate 5db15c9366. Retained source-stb_euh2 verifies all 46 selected documentation checks, public links and shipped mirrors; token generation and hint semantics agree with source. Runtime and credential policy are unchanged.

Change-source: pulse-maintainer
2026-10-12 00:39:07 +01:00
pulse-triage[bot] 93163fab80 Explain whole-token matching and verify terminal file preservation
The Pi authentication report identified duplicated token characters despite a matching partial hint. Check correct, duplicated-middle and legacy input through the real generated terminal prompt and installer writer, including restoration of the original synthetic value and private hand-off cleanup. Clarify the existing guide without imposing a token-shape rule or claiming installed reporting recovery.

Contract-Neutral: Documentation and regression coverage only; command generation, credential selection, authentication, scopes, trust and runtime behaviour are unchanged.
Change-source: pulse-maintainer
2026-10-12 00:33:02 +01:00
pulse-triage[bot] 28d3c308e9 Integrate batch-start upstream with reviewed passive VM diagnostic
Preserve exact Core candidate 41bc99d68f and upstream f9f27d6721. Changes compose without conflict; source-c7iuupjy remains applicable to unchanged candidate files.

Change-source: pulse-maintainer
2026-10-12 00:25:42 +01:00
pulse-triage[bot] 5db15c9366 Explain damaged bare host tokens without credential churn
The current host installer issues a 64-character lowercase hexadecimal token, but a bare file and matching inventory hint can still hide duplicated or changed middle characters. Explain the private whole-value check before first installation and its limits during authentication triage. Preserve other credential families, installation state, scopes and trust.

Contract-Neutral: Existing setup and authentication guidance only, with source-bound documentation checks. Runtime behaviour, credential formats, scopes and trust are unchanged.
Change-source: pulse-maintainer
2026-10-12 00:12:58 +01:00
pulse-triage[bot] 41bc99d68f Bound the complete passive VM preflight read
Apply the existing ten-second deadline to both qm and its response reader. Stop only the local collection group even when a producer exits with an inherited pipe or a reader ignores TERM. Preserve byte limits, independent failures, private output and the refusal to probe or change a guest; test actual owned-reader termination and the mirrored help.

Contract-Neutral: Passive operator diagnostics and existing help only; Proxmox polling, guest-agent admission, APIs, storage, permissions and service behaviour are unchanged.
Change-source: pulse-maintainer
2026-10-12 00:10:22 +01:00
rcourtman f9f27d6721 Read staged governance inputs from the Git index (#2852)
The staged commit guard read tracked status and registry JSON from the
working tree, so unstaged changes could alter its verdict. Read both
inputs strictly from the Git index and fail when an input is missing.

Regression tests use real Git indexes. They cover valid and malformed
unstaged edits, deleted working-tree files, and missing index entries.
The new tests fail against the previous implementation.

Validation: all 12 staged-guard tests and all 10 shared file-reader
tests pass. Control-plane, status, registry and staged contract audits
pass.
2026-10-11 23:59:27 +01:00
pulse-triage[bot] 0200703602 Integrate reviewed bounded security guidance
Accept the exact Product Intelligence security documentation and regression-test commit. Preserve existing logging deployments and private evidence; source guidance is not installed runtime recovery.

Change-source: pulse-maintainer
2026-10-11 23:55:38 +01:00
pulse-triage[bot] eead1dce67 Preserve the current upstream Go security toolchain and dependency repair
Compose the exact observed upstream additively without rewriting reviewed tip 805ea6d712 or any accepted ancestry. The new Go 1.26.9 and x/net graph need matching final-source evidence before this batch can be proposed.

Change-source: pulse-maintainer
2026-10-11 23:42:21 +01:00
rcourtman 30e4fa5559 Read staged governance inputs from the Git index
The commit guard read tracked status and registry files from the working
tree, allowing unstaged edits to change its decision about staged content.
Use the shared strict index reader and fail when required inputs are absent.

Regression tests use real Git indexes and cover divergent, malformed and
missing working-tree files plus missing index entries.
2026-10-11 23:26:44 +01:00
pulse-triage[bot] 10c8818912 Keep security verification bounded and preserve logging state
The canonical security guide still encouraged Debug logging, broad service/log inspection and a fresh unmounted Docker container. Route verification through existing bounded private evidence, distinguish file rotation from journal, container and audit retention, and preserve the active deployment when changing logging. Keep the shipped guide synchronized and check these boundaries against the current server source.

Contract-Neutral: Correct existing security guidance and its regression checks without changing runtime, permissions, credential handling, API behaviour or subsystem contracts.
Change-source: pulse-maintainer
2026-10-11 23:11:34 +01:00
rcourtman 592a1e52f6 Advance the Go toolchain to 1.26.9 and x/net to v0.60.0
govulncheck on the pinned 1.26.8 toolchain reports twelve reachable
standard library vulnerabilities in Pulse (net/http, crypto/tls,
html/template, os, net/textproto), published on 2026-10-08 and fixed in
Go 1.26.9. golang.org/x/net v0.58.0 carries further advisories fixed in
v0.60.0. With 1.26.9 and x/net v0.60.0 the scan reports no affecting
vulnerabilities under both govulncheck v1.1.4 and v1.7.0.

Pulse's own govulncheck job last ran on 2026-10-05, so nothing flagged
this. The private Enterprise build and test job notices it: once the scan
finds reachable advisories it needs more than the 4 GiB CI VM holds, the
guest kernel kills govulncheck, and the job is cancelled. That has failed
every Enterprise pair check since 2026-10-08, including the first
beta's.

Move every release builder and local toolchain guard together, as 1.26.8
did, so no candidate artifact keeps an older compiler: go.mod, the
builder image digests (index digest for 1.26.9-alpine), the release and
dev scripts, the devcontainer, and the root pair diagnostic. Only x/net
is raised in the module graph; go mod tidy is deliberately not run, so
unrelated indirect requirements stay as they were.

Contract-Neutral: Toolchain and indirect dependency patch update that clears reported advisories; no product or runtime contract changed.
2026-10-11 22:37:46 +01:00
rcourtman 39f988b220 Remove AI Discovery
AI Discovery ran a separate model-backed service scanner beside Patrol
and the Assistant: its own store, scheduler, model route, API, tool and
drawer UI. No telemetry counter ever measured its use (the telemetry
discovery_enabled flag OR'd it with network subnet discovery), the
maintainer judged it a flop, and the context it produced is already
available to the models through pulse_query, pulse_read and the
unified-resource context sections.

This deletes internal/servicediscovery, internal/ai/infradiscovery, the
pulse_discovery tool, the /api/discovery routes, the mock Discovery
fixtures, the Discovery tabs in the resource, guest, node and Docker host
drawers, the identified-service cards, readiness badges, provenance
markers, suggested web-interface URLs, the Workloads AI Context column,
the chat "Discovery is off" hint and the AI Service Context settings page.
The old settings route redirects to Assistant settings. The model-bound
sanitizer allow-list existed only to pass Discovery context through, so it
goes too, along with the CopyableCodeRow primitive that only the
Discovery tab used.

Network subnet discovery (/api/discover, the Infrastructure discovery
settings) and the discoveryTarget agent coordinates are separate features
and stay. Stored discovery_enabled, discovery_interval_hours and
discovery_model AI settings are ignored on load; the settings API decoder
is lenient, so older frontends saving those fields still succeed.
2026-10-11 22:20:25 +01:00