Commit Graph

4509 Commits

Author SHA1 Message Date
rcourtman 8ea94d792b Add the Patrol weekly digest endpoint
Nothing in Pulse showed a paying customer what Patrol had done for them:
about 164 runs a month per install, findings raised, investigations and
fixes, and none of it summarised. GET /api/ai/patrol/digest rolls the last
N days (default 7, max 30) up from records Pulse already keeps: run
history, the findings store, Patrol-origin action audits, and the usage
cost store. It adds no telemetry and persists nothing. The payload
reports when the bounded run history no longer covers the window and when
model pricing is unknown, rather than quietly under-counting.

This is the first slice of the "Patrol weekly digest" named bet in the
pulse-pro demand ledger; the in-app "This week" card follows once its
browser pass is recorded. docs/PATROL_WEEKLY_DIGEST.md holds the design
note and the honest limits of each line.

status.json registers the patrol-value-visibility coverage gap, the
candidate lane, and its work claim. It also drops the second, identical
copy of the ai-provider-guided-setup coverage gap that landed with #1853;
the duplicate id fails the status audit on main for every pull request.
2026-09-02 08:53:50 +01:00
rcourtman ac328e1eee Guide the Patrol model choice with cost preview and budget pause
Forty-two percent of paying installs never get Patrol running, and the
support and issue evidence says the wall is model choice and cost: a
prospect asked which models Pulse recommends before trying, a Pro customer
picked Flash-Lite to save money and Patrol then could not file verdicts,
and a mispriced Opus row tripped the 20 USD budget so the circuit breaker
disabled Patrol with nothing but a log line (#1789).

Answer both questions at the point of choice. The Patrol and shared
default model pickers pin guided models in a "Suggested for Patrol"
section with recommended / suggested / caution markers and a one-line
reason: the Ollama preflight blessing is the only recommended entry,
Gemini Flash-Lite the only caution, and cloud starting points are labelled
price-driven and unqualified until this install's own readiness pass
upgrades them to "Verified on this install". A server-computed cost
preview sits under the model choice: monthly estimate from Pulse's price
table, the schedule, and the install's own median full run once three
priced runs exist (a measured 104,528-in / 4,491-out run otherwise), with
the assumption stated and a token explained once, plus 30-day spend
against budget. Each schedule preset is priced in the Schedule select.

When a per-token model is picked while the schedule is still the 6-hour
default, the cost model proposes the slowest preset that keeps scheduled
runs under half the budget (20 USD reference when none is set) and says
what the slower check costs in detection delay; a schedule the install
already chose is never changed.

A used-up budget is now a spending decision, not a provider fault: the
budget refusal is a typed sentinel with the figures, classified as the
budget_exhausted cause, excluded from circuit-breaker accounting, and
promoted into the Patrol block state, so the Patrol page shows "Patrol
paused" with the spend and limit and a "Raise the cost budget" action
instead of "Check Patrol model".
2026-09-02 07:55:42 +01:00
rcourtman a10c175f31 Fold alert-mirroring findings, collapse flapping, surface lasting decisions
Two users (discussions #1623, #1699) could not find Patrol's durable
outcomes: the Needs attention detail offered only Acknowledge and
Suppress, and Remember as expected, Dismiss: Not an issue, Dismiss:
Later, and Create rule sat two levels below it. The same screenshot
showed an alert with eleven open/resolved transitions in a day listed as
eleven timeline rows, and Patrol findings restating an active alert
appearing beside it. Telemetry shows most findings are seen and ignored.

Backend: findings_alert_mirror.go is the single matcher for a finding
that restates an active alert (explicit alert identifier, or same
canonical resource plus the same condition class). Patrol stamps
mirrors_alert_id/mirrors_alert_type after every real and demo cycle and
clears them when the alert resolves; the finding is kept, not dropped.
The storm throttler now also owns flap detection: four or more
open/resolved transitions in 24h mark a finding flapping, and the store
maintains one collapsed lifecycle row with the count instead of a row per
transition, hydrating the window from persisted lifecycle after restart.
The attention projection applies the same threshold to alert timelines
and exposes a flapping summary while keeping the full timeline.

Frontend: the attention detail gains a Lasting decisions section that
offers the four Patrol decisions on the finding mirroring the alert, each
with one line saying what it does and how long it lasts, an inline
confirmation, and a remembered-decision state with Reopen. An alert with
no mirrored finding says Patrol has nothing to remember and points at
alert thresholds. Flapping items carry one label and a summarised
timeline with every transition under an expansion. FindingsPanel demotes
active alert-mirroring findings into a collapsed group. The Patrol
surface loads dismissed findings so remembered decisions are visible.
2026-09-02 07:02:51 +01:00
pulse-triage[bot] d680c339d9 Require accessible names for shared dialogs
Make the shared Dialog prop contract require exactly one accessible-name strategy so new modal call sites cannot silently omit screen-reader context. Record the canonical primitive contract, preserve existing runtime behavior, and cover both valid strategies plus invalid unnamed and ambiguous props.

Change-source: pulse-maintainer
2026-09-02 04:40:19 +01:00
pulse-triage[bot] 9bda0b30db Fix shell and settings accessibility regressions
Keyboard and screen-reader users could not reliably bypass the shell or identify two General Settings toggles, while the RC badge failed the maintained contrast contract. Restoring explicit focus transfer, accessible control names, and compliant badge contrast keeps core navigation and settings usable without changing product scope.

Change-source: pulse-maintainer
Contract-Neutral: Accessibility regression fix only; no public contract or subsystem boundary changes.
2026-09-02 04:00:04 +01:00
rcourtman 6d0ce0b45e Describe how changes land and ship, and hold human commits to the standard
The transparency page told evaluators that routine changes may merge
without line-by-line review, but not what governs a landing or a
release, so the commit stream was the only evidence and it read badly
(discussion #1539, the release-reliability ledger entry). The page now
states the delivery contract in public terms: every writer lands through
a pull request that auto-merges on green required checks with no bypass,
the maintainer's pull requests carry outcome, reason, and validation, and
releases run on a train with a soaked, exact-content candidate, with the
rules in RELEASE_PROMOTION_POLICY.md. The shipped docs mirror is updated
with it.

The maintainer's candidate preflight already refuses a commit without a
body or with a subject over 72 characters. The new husky commit-msg hook
holds human and interactive-agent commits in this checkout to the same
standard, exempting merge, fixup, squash, and revert messages.
2026-09-02 01:17:38 +01:00
rcourtman c022a0dfe6 Raise browserslist above security advisory floor 2026-09-01 23:33:55 +01:00
rcourtman 45dd45fe29 Record rootless runtime qualification evidence 2026-09-01 22:09:22 +01:00
rcourtman 62bfdbca7e Prepare v6.4.3-rc.1 release
Open the v6.4.3 candidate line from main. The v6.4.2 tag was staged on
2026-08-31 but never activated: its release run was cancelled after the
private Pro build failed the compiler memory gate, so the latest published
stable is still v6.4.1. This candidate carries the complete v6.4.2 change
set plus the corrections landed since that tag, including the stale PBS
Backup Running state (#1815), the Windows Unified Agent auto-update 404
(#1820), and shared-token same-hostname agent identity collapse (#1753).

Packet: VERSION, compose and install-docker defaults, Helm chart metadata,
release notes with a declined visual plan, changelog, pointer docs and
the shipped docs mirror, and the deployment-installability cutoff note.
Rollback target is v6.4.1 and the mobile decision is no-mobile-impact.

Tests: the packet tests now describe the 6.4.3 train, v6.4.2 is recorded
as an unpublished stable so it is never derived as the previous stable or
rollback target, and the Python v6.4.2 notes expectation matches the
phrase the notes actually use.
2026-09-01 21:37:41 +01:00
rcourtman b87ab75965 Limit planning status audit to tracked documents 2026-09-01 21:18:24 +01:00
pulse-triage[bot] 4fda8f146e Merge batch-start origin/main
Change-source: pulse-maintainer
2026-09-01 20:58:31 +01:00
rcourtman feff95934c Remove the Home tab and page, keep the fleet health verdict engine
The fleet health Home surface reached main on 2026-09-01 by implementing
a July agent-handoff spec with no demand-ledger entry. Exercised live on
the 1,510-resource mock estate it rendered 572 tiles on first paint with
275 in "Needs attention", 232 of them backup age, against two real
criticals; per-node storage mounts, disks, and swarm secrets appeared as
fleet members with no host context; and the critical node tile opened
its platform overview with the node below the fold. No stable release
carries it yet, so remove the route, navigation tab, page, i18n keys,
Assistant page context, route preload, and e2e cases now rather than
spend lane turns polishing an ungraded bet.

The server-side ResourceHealth verdict, its API projection, and the
/api/state/summary verdicts and attention extension stay: they are one
canonical health boundary that #1478 asked for and that any future
surface should read. The spec is parked with the 2026-09-01 review kept
as the design record.

Browser proof: desktop and 375px shells show no Home entry, /home renders
the not-found surface and its Go to workspace button lands on the
default workspace, the narrow More sheet lists Settings only, no console
errors or horizontal overflow.
2026-09-01 20:54:21 +01:00
rcourtman 2f8a4ec629 Require a Status line on planning documents
Any *_SPEC.md, *_PLAN.md, or *_CONTRACT.md under docs/ must now carry a
Status: line (or a ## Status section) in its header, enforced by the
pre-push lint. A spec, plan, or contract is a record of a decision, not
demand; the 2026-09-01 Home wall case showed what happens when a stale
handoff spec reads as a current signal. Subsystem contract markdown is
governed separately and is not scanned.

The commercial cancellation/reactivation e2e test plan gets the one
missing line so the existing set passes.
2026-09-01 20:52:25 +01:00
pulse-triage[bot] 4651fae79e Make alert frequency periods accessible
Change-source: pulse-maintainer
2026-09-01 20:17:13 +01:00
pulse-triage[bot] 19a0e02afa Harden alert recovery interactions
Change-source: pulse-maintainer
2026-09-01 19:36:13 +01:00
pulse-triage[bot] 3be0ceacc1 Keep availability view choices stable
Change-source: pulse-maintainer
2026-09-01 18:51:40 +01:00
pulse-triage[bot] d4bed850b9 Default large availability estates to fleet view
Change-source: pulse-maintainer
2026-09-01 18:32:39 +01:00
pulse-triage[bot] 6b5369bbfa Align TrueNAS guidance with JSON-RPC runtime
Change-source: pulse-maintainer
2026-09-01 18:32:39 +01:00
pulse-triage[bot] 8334ce57a5 Announce platform filter result counts
Change-source: pulse-maintainer
2026-09-01 16:39:32 +01:00
pulse-triage[bot] 54d43a70c1 Keep focus stable after destructive dialogs
Change-source: pulse-maintainer
2026-09-01 16:11:04 +01:00
pulse-triage[bot] 91d120ea5d Merge remote-tracking branch 'origin/main'
Change-source: pulse-maintainer
2026-09-01 16:03:53 +01:00
rcourtman fa2e379122 Block fabricated pulse-branded domains with a lint audit
Offline guard for the pulseapp.io class: any domain-shaped token
containing 'pulse' in published surfaces (root markdown, docs and
mirrors, non-test frontend src and Go source) must be pulserelay.pro,
1mk.app, or a documented placeholder. Catches the invented
security@pulseapp.io / docs.pulseapp.io (10 months as the published
security contact, bouncing every disclosure) and the pulse.app
OpenRouter referer fixed in b1240c6ca. Runs in npm run lint, so the
pre-push hook enforces it.
2026-09-01 16:02:01 +01:00
pulse-triage[bot] e37595748e Merge remote-tracking branch 'origin/main'
Change-source: pulse-maintainer
2026-09-01 15:53:17 +01:00
rcourtman 53267e149d Harden least-privilege installer lifecycle state 2026-09-01 15:53:02 +01:00
rcourtman b1240c6ca3 Point OpenRouter attribution at pulserelay.pro and fix Fireworks key link
External-reference audit after the fabricated security@pulseapp.io find:
the OpenRouter HTTP-Referer claimed pulse.app, a third-party domain Pulse
has never owned, and the in-app Fireworks 'Get API key' link 404s
(fireworks.ai/account/api-keys moved to
app.fireworks.ai/settings/users/api-keys).
2026-09-01 15:49:05 +01:00
pulse-triage[bot] 992da4d4a8 Keep search tips focus predictable
Change-source: pulse-maintainer
2026-09-01 15:43:57 +01:00
pulse-triage[bot] 79b2aab067 Merge remote-tracking branch 'origin/main'
Change-source: pulse-maintainer
2026-09-01 15:37:17 +01:00
pulse-triage[bot] 32400d3a9c Make in-app help dialogs keyboard accessible
Change-source: pulse-maintainer
2026-09-01 15:22:07 +01:00
rcourtman f43929f4c8 Point security disclosures at security@pulserelay.pro
security@pulseapp.io was the published private-disclosure contact in
SECURITY.md and the mirrored doc copies, but pulseapp.io has no MX
records, so every report sent there bounced. security@pulserelay.pro
now has a Cloudflare Email Routing rule (added 2026-09-01) and was
verified accepting mail at the MX before this change.
2026-09-01 15:21:23 +01:00
pulse-triage[bot] 4d2b312457 Keep delivery warnings concise on overview
Change-source: pulse-maintainer
2026-09-01 14:19:44 +01:00
pulse-triage[bot] b6cbb6c360 Sync shipped code signing policy
Change-source: pulse-maintainer
2026-09-01 14:04:49 +01:00
pulse-triage[bot] ceb0f0dc08 Make slow app bootstrap recoverable
Change-source: pulse-maintainer
2026-09-01 13:59:36 +01:00
pulse-triage[bot] d3196f64a0 Make resource action menus keyboard operable
Change-source: pulse-maintainer
2026-09-01 12:47:16 +01:00
pulse-triage[bot] af2fcabe7a Merge remote-tracking branch 'origin/main'
Change-source: pulse-maintainer
2026-09-01 12:47:15 +01:00
rcourtman 11aadbfb1b Add rootless runtime qualification harness 2026-09-01 12:29:44 +01:00
pulse-triage[bot] 9025ea91a2 Name infrastructure dialogs from visible context
Change-source: pulse-maintainer
2026-09-01 12:20:52 +01:00
pulse-triage[bot] feafe5b8cb Keep chart narration within copy style
Change-source: pulse-maintainer
2026-09-01 12:20:52 +01:00
pulse-triage[bot] ca2e296ce3 Make history charts readable to assistive tech
Change-source: pulse-maintainer
2026-09-01 11:48:41 +01:00
rcourtman 60d0651a88 Cancel abandoned typed agent operations 2026-09-01 11:21:26 +01:00
pulse-triage[bot] b2339115ed Merge current upstream before publication
Preserve the reviewed maintenance batch while incorporating the shipped CODE_SIGNING_POLICY mirror synchronization from origin/main.

Change-source: pulse-maintainer
2026-09-01 11:05:51 +01:00
rcourtman b46240941a Sync shipped CODE_SIGNING_POLICY.md with the repo doc
f313882a7b added the container provenance pinning paragraph to docs/ only,
so the docsLinks drift guard failed the Frontend job on main, the same
shape as the UNIFIED_AGENT.md miss earlier today. Copy the updated doc
into the shipped public/docs mirror; the guard test passes (14/14).
2026-09-01 11:03:30 +01:00
pulse-triage[bot] 434f777a59 Keep collapsed threshold controls out of focus
Change-source: pulse-maintainer
2026-09-01 10:46:05 +01:00
pulse-triage[bot] a8f53e8847 Keep Patrol finding handoffs in context
Change-source: pulse-maintainer
2026-09-01 10:16:41 +01:00
pulse-triage[bot] 28be044e14 Merge remote-tracking branch 'origin/main'
Change-source: pulse-maintainer
2026-09-01 09:06:05 +01:00
rcourtman b9f7df32df Sync shipped UNIFIED_AGENT.md with the repo doc
f4886c2dfb added the per-node cluster install note to docs/ only, and the
docsLinks drift guard rightly failed the Frontend job on main. Copy the
updated doc into the shipped public/docs mirror; the guard test passes.

Refs #1816
2026-09-01 09:05:45 +01:00
pulse-triage[bot] 412c75bd1b Keep Home investigation links scoped
Refresh the retained browser proof receipt parent for canonical integration; intervening changes do not touch frontend runtime paths.

Change-source: pulse-maintainer
2026-09-01 08:47:52 +01:00
pulse-triage[bot] 6a104f07e8 Keep Home investigation context accessible
Change-source: pulse-maintainer
2026-09-01 02:43:59 +01:00
pulse-triage[bot] 5375db5244 Keep fleet refresh failures visible
Change-source: pulse-maintainer
2026-09-01 01:41:09 +01:00
pulse-triage[bot] c253495045 feat: add fleet health home
Change-source: pulse-maintainer
2026-09-01 01:02:17 +01:00
pulse-triage[bot] 2222c5ce37 Make security review baseline fail closed 2026-09-01 01:02:17 +01:00