Commit Graph

902 Commits

Author SHA1 Message Date
pulse-triage[bot] 7956e32071 Align update-help assertions with integrated ownership safeguards
Correct the PI wording assertion after preserving newer canonical help in the merge. Require command-free LXC/systemd entries, linked ownership and installed-path checks, private Pro protection and retained chart/software guidance rather than restoring an older copied command.

Contract-Neutral: Integration-only documentation assertion alignment; update behaviour, routes and trust boundaries are unchanged.
Change-source: pulse-maintainer
2026-10-09 08:50:54 +01:00
pulse-triage[bot] af6cc9019f Qualify LXC updater ownership and chart-only releases
Keep server-update help from treating a community helper as Pulse's signed updater or choosing a Helm chart as a server archive. Preserve current-state checks, full-state backup precautions and the existing signed route after a failed update.

Contract-Neutral: Clarifies existing update routes and release identities; no runtime, API, release policy or subsystem contract change.
Change-source: pulse-maintainer
2026-10-09 07:57:01 +01:00
pulse-triage[bot] fe7f04f7e2 Integrate reviewed cross-installation intake guidance
Accept the exact documentation-only candidate with retained focused intake, mirror and public-document proof. Runtime identity recovery remains separate owning-lane work.

Change-source: pulse-maintainer
2026-10-08 11:21:42 +01:00
pulse-triage[bot] 91b9bb69e4 Distinguish agent identity from connection names in triage
Preserve the one-agent, repeated-short-guest-name case without conflating a full connection hostname or an ambiguous automatic link with stopped Docker reporting. Keep diagnostics observational and both shipped guide copies aligned.

Contract-Neutral: Intake guidance and its documentation assertions only; no runtime, API, identity policy or release contract changes.
Change-source: pulse-maintainer
2026-10-08 11:05:34 +01:00
pulse-triage[bot] 39615aa987 Merge commit '7606b72a8b85e70696e8bfa52a0792fbb146a34d'
Change-source: pulse-maintainer
2026-10-08 11:03:49 +01:00
rcourtman 1289728ded Point dev:verify at the Proxmox backups layout spec
The managed proof pack behind `npm run dev:verify` still named
tests/17-recovery-layout.spec.ts, which 1c38d79937 replaced with
tests/17-proxmox-backups-layout.spec.ts in July. The registered proof for
scripts/hot-dev-bg.sh pinned the stale path, so nothing flagged it.

The stale path did not fail the pack. Playwright treats each spec path as
a filter, so `test --list` with main's arguments reports 10 tests in 2
files and exits 0: the Proxmox backups layout guard had silently dropped
out of dev:verify.

The replacement spec reads the mock-mode estate, while dev:verify attaches
to the managed runtime in whatever mode it was left in. Under the managed
runtime it now skips with a `npm run mock:on` hint when mock mode is off,
instead of flipping modes in place: Monitor.SetMockMode clears the
runtime's active alerts and in-memory history on every switch. The Core
E2E harness runs mock mode and is unaffected.

test-hot-dev-bg.sh now pins the new spec and checks that every spec the
default verify command names exists under tests/integration; against
main's hot-dev-bg.sh that check fails on the retired path. The integration
README and its pin, the deployment-installability contract clause, and two
unused RECOVERY_PRODUCT_SURFACE_EXACT_FILES lists naming deleted files are
brought in line.
2026-10-08 09:56:53 +01:00
pulse-triage[bot] 3f4787f76b Incorporate batch-start upstream retired-surface contract cleanup
Retain the upstream contract and lookup repair already present when review began, without expanding candidate source scope.

Change-source: pulse-maintainer
2026-10-07 22:51:52 +01:00
rcourtman 15322e1573 Drop contract prose for the deleted problem-resource surfaces (#2706)
Contract prose still described surfaces that no longer exist:

- `frontend-primitives.md` told new route-level copy to extend
`problemResourcePresentation` (deleted in ae65c5e9a2), tied that helper
to `ProblemResourcesTable.tsx` (deleted with the dashboard overview in
c743a231b8), and kept a readability rule for that table and the
dashboard Pulse Brief. No live surface implements the rule; Patrol's
grouping and affected-resource counts are governed in
`patrol-intelligence.md`. The ownership paragraph and the rule are
dropped, and problem-resource joins the list of deleted dashboard
helpers that must not return.
- `unified-resources.md` said the change and correlation summary cards
default Infrastructure resource-filter links for the Patrol page and the
problem-resource dashboard panels. Since the 2026-05-16 drilldown
retirement the cards have no link default and render only in the
resource drawer, which passes no link builder.
- `api-contracts.md` named the dashboard Pulse Brief as a sender of
`autonomous_mode:false` and described the field as a client override.
Since 4edf5f8265, `ChatRequest` has no such field: the server runs every
`/api/ai/chat` exchange in approval-required mode (pinned by
`TestHandleChat_CannotElevateAutonomousModePerRequest`), and the field
is dropped at decode.

The new `subsystem_lookup_test.py` case pins the deleted helper as
unowned, next to the other retired dashboard paths.

Verification: `contract_audit.py`, `registry_audit.py` and
`status_audit.py` pass with `--check`; the retired-path lookup tests
pass (9/9); the full pre-commit battery passed. No frontend or backend
runtime files change.
2026-10-07 22:44:27 +01:00
pulse-triage[bot] 1992c681c2 Preserve reviewed monitoring maintenance with current Patrol and alert defaults
Additively incorporate upstream 843daf7ae3 without removing accepted source. Resolve the overlapping AI documentation assertion by preserving its whitespace-normalized compatibility check together with upstream dead-Patrol guidance. The focused documentation policy tests pass; browser and final-source validation dependencies remain explicit.

Change-source: pulse-maintainer
2026-10-07 19:11:35 +01:00
rcourtman 60527fa8ab Drop contract prose for the deleted problem-resource surfaces
frontend-primitives.md still told new route-level copy to extend
problemResourcePresentation, deleted in ae65c5e9a2, and kept a paragraph
tying that helper to ProblemResourcesTable.tsx, deleted with the dashboard
overview in c743a231b8. It also kept a readability rule for that table and
the dashboard Pulse Brief. Neither surface exists and no live surface
implements the rule; Patrol's grouping and affected-resource counts are
governed in patrol-intelligence.md. Drop the ownership paragraph and the
rule, and list problem-resource among the deleted dashboard helpers that
must not return.

unified-resources.md still said the change and correlation summary cards
default Infrastructure resource-filter links for the Patrol page and the
problem-resource dashboard panels. Since the 2026-05-16 drilldown
retirement the cards have no link default and render only in the resource
drawer, which passes no link builder, so labels show as plain text.
api-contracts.md named the dashboard Pulse Brief as a sender of
autonomous_mode:false and described that field as a client override. Since
4edf5f8265 ChatRequest has no autonomous_mode field: the server runs every
/api/ai/chat exchange in approval-required mode, as
TestHandleChat_CannotElevateAutonomousModePerRequest pins, and the field
that scoped handoffs still send is dropped at decode. Say so, and stop
calling Patrol finding handoffs stricter than ordinary chat.

The new lookup test pins the deleted helper as unowned, next to the other
retired dashboard paths, so the dropped ownership claim cannot come back
through the registry unnoticed.
2026-10-07 18:22:57 +01:00
pulse-triage[bot] d0a4f48bb2 Keep notification report evidence passive and distinct
Clarify Test versus ordinary delivery and message identity in the existing optional evidence fields. Preserve original queue context without sending, replaying or exposing destination secrets; pin both form schemas and the mirrored triage guide.

Contract-Neutral: Report guidance and its static checks only; no runtime, notification delivery or intake automation change.
Change-source: pulse-maintainer
2026-10-07 17:44:15 +01:00
pulse-triage[bot] 7a91214811 Preserve cross-installation relationships in privacy-safe reports
Repeated identity reports affect node errors, backup status and agent-backed Docker monitoring. Let reporters describe shared and independent targets using consistent aliases, without disclosing private identities or changing their setup. Preserve every affected surface during triage.

Contract-Neutral: Clarifies existing issue intake and triage guidance; no runtime, automation or feature contract changes.
Change-source: pulse-maintainer
2026-10-07 16:38:46 +01:00
rcourtman cb5ffc2efe Remove dead Patrol assessment and save-failure handoffs
buildPatrolAssessmentAssistantHandoff lost its last caller when the Patrol
summary card's Discuss handler was removed in eac7dfe9ef (2026-05-15), and
buildPatrolConfigurationFailureHandoff lost its last caller in 27ba85ddc6
(2026-06-23). Since then only their own tests called them. A TypeScript
compiler import graph rooted at src/index.tsx confirms no reachable file
imports either one. Removing them also drops PatrolInvestigationContextSummary,
their input and output types, and the private assessment, recent-change,
correlation and save-failure helpers that only they used (found with
noUnusedLocals until it reported nothing).

Rollup had already tree-shaken all of it: production builds of the parent
tree and of this tree are byte-identical across all 187 dist files, and the
bundle-size check passes. The presentation helpers the dead code imported
keep their live callers.

Their test cases go with them. Two cases covered branches the live finding
handoff still uses, so they now run through
buildPatrolAssistantFindingHandoffActions and buildPatrolAssistantFindingHandoff:
a typed pending action without a legacy approval id stays approval-bound,
and the finding context qualifies its resource with the record's node and
truncates long lines. v8 coverage of the surviving model code matches the
pre-removal baseline except one defensive guard the live caller cannot
reach. The raw-source guards pinned none of the removed code.

The Assistant drawer still restores saved patrol_assessment and
patrol_configuration_failure sessions, so that compatibility path stays.

The contracts described both handoffs as live producers, and described a
Patrol summary card, assessment strip, assessment readout, score chip and
header trust line that the page no longer renders. patrol-intelligence,
ai-runtime, api-contracts, frontend-primitives, security-privacy,
storage-recovery, agent-lifecycle and unified-resources now say what the
code does: those handoffs survive only as saved sessions,
the drawer, session list and API keep restoring them, rules for a returning
summary card, strip or readout are conditional, and handoff_actions and
adjacent-boundary clauses name the finding and attention handoffs that send
them today. The run-history handoff clauses also claimed the browser sends a
[Patrol Run Context] block and scoped resources; it sends the briefing and
run identity, and internal/ai/patrol_assistant_handoff.go rebuilds the rest
from the run ID.

docs/AI.md (and its public mirror) told users the legacy operational score
sits in a collapsed supporting-context section. That section and the score
are gone; the section now points at Activity > Finding options and history,
where check history lives. ai_runtime_docs_policy_test.py, its registered
proof, now pins that location and rejects the retired claim. The same file
had failed on main since 2789a15fe5 reworded the Patrol mode API sentence to
"The API retains `autonomy_level` for compatibility" without updating its
pin; the pin now matches that wording.
2026-10-07 15:45:49 +01:00
pulse-triage[bot] b6efefe52f Bind standalone consent proof only to unattended updates
Register the real shell verifier for the updater without admitting it as proof for unrelated installers. Preserve exact installer requirements and test missing/unrelated proof rejection.

Change-source: pulse-maintainer
2026-10-07 15:16:10 +01:00
pulse-triage[bot] 7eef1a7b13 Bind the preserved disk History correction to its contract proof
Register accepted 26ae5b1aa2 with additive completion 3d45bc5750 through the existing exact-pair validator. It still requires ancestry, substantive monitoring contract and regression coverage; no historical commit, author or enforced check is changed.

Change-source: pulse-maintainer
2026-10-07 07:08:25 +01:00
pulse-triage[bot] 588762635e Distinguish platform and collection paths in safe issue intake
Ask for optional existing platform-release and API/agent context in both bug forms. Keep the Pulse deployment separate, accept unavailable details, and forbid active diagnostics or connection changes just to report. Preserve all required core report fields and the matching triage and contributor guidance, including shipped mirrors.

Contract-Neutral: Issue-form context, contributor guidance and regression checks only; no runtime, API, permission or canonical subsystem shape changes.
Change-source: pulse-maintainer
2026-10-07 00:24:07 +01:00
pulse-triage[bot] 42d045fd81 Preserve reviewed maintenance with current monitoring and alert history
Additively integrate published main dcb69cfb02 while retaining reviewed tip 52fe83d266 and every accepted commit. Preserve both subsystem contracts and independent alert tests. Reconcile the reactive row-history helper with reviewed memory provenance and visible freshness cues; exact source, browser and protected checks remain required.

Change-source: pulse-maintainer
2026-10-06 23:05:57 +01:00
rcourtman 2265d28242 Remove the never-mounted unified resource table
PlatformResourceTable was the only renderer of UnifiedResourceTable, and
nothing imports it. Every platform page (Proxmox, Docker, Kubernetes,
TrueNAS, vSphere, Machines) renders its own native tables, and
/infrastructure only shows the opening-workspace placeholder. A
production build of main already tree-shook the whole cluster (none of
its strings ship), yet it still carried 11 source files, 7 test files,
registry ownership in two subsystems and contract rules for a table
nobody sees.

Removed: PlatformResourceTable and its PLATFORM_STATUS_FILTER_OPTIONS;
UnifiedResourceTable with its host, service, PBS and PMG cards, source
badge cell, state hook, viewport sync and models; and
ClusterDeployBanner, which only the host card rendered (the live cluster
deploy flow is the Settings ClusterAgentDeployDialog). Their tests go
with them.

Coverage for live code those tests also exercised is kept: the detail
mapper no-fetch boundary and the online boolean sensor case move to
resourceDetailMappers.test.ts, the ResourceFacetSummary render cases
move to their own test file, and both files become registered proofs for
the policies that govern their subjects. Guardrail tests, the shared
template registry, registry.json, status.json evidence and the
performance, unified-resources, frontend-primitives and cloud-paid
contracts drop the deleted paths and the rules that only governed them.

Rollup used to name the large shared chunk after sharedPlatformPage; it
now names it MetricBar, so the bundle baseline entry is re-keyed at its
measured size.
2026-10-06 20:34:35 +01:00
pulse-triage[bot] f2a52d2db6 Recover stable-v6 upgrade intake on current source
Carry the exact validated six-file correction from 7699c5e3 and 29ad279b onto the current assignment without importing their unrelated frontend ancestry. Let reports separate failing server, agent and platform versions from an observed working baseline; preserve unknowns, passive evidence and API-only setups. Original candidates and adverse proofs remain unchanged.

Contract-Neutral: Community intake fields, mirrored guidance and regression tests only; runtime, release, installer and label automation contracts are unchanged.
Change-source: pulse-maintainer
2026-10-06 20:27:24 +01:00
pulse-triage[bot] 753c2ef74c Check target-safety guidance in the shipped intake guide
Complete the remaining verification from fda52d78 after the equivalent mirror repair reached the assigned source. Check every target and workload precaution in both copies so the focused intake check cannot pass on repository guidance alone.

Contract-Neutral: Verification-only coverage of established intake precautions; no contract or runtime change.
Change-source: pulse-maintainer
2026-10-06 18:06:39 +01:00
pulse-triage[bot] f58756f89f Distinguish report targets from the Pulse deployment
The VM clarification in #1891 exposed container advice selected from the original topic rather than the affected workload. Clarify the existing summary and installation fields and preserve the distinction in triage, using already observed responsiveness without another update, backup or guest-agent probe. No extra required field or reporter refile is introduced.

Contract-Neutral: Existing intake descriptions and triage guidance only; form fields, validation, labels, automation and runtime contracts are unchanged.
Change-source: pulse-maintainer
2026-10-06 15:23:47 +01:00
pulse-triage[bot] 2b1a7eba0b Incorporate the batch-start Pulse upstream frontier
Change-source: pulse-maintainer
2026-10-06 12:48:11 +01:00
rcourtman 478a03b9ed Describe releases as the fixed release train everywhere
Since 4 October 2026 releases are mechanical: the release train cuts the
next minor from main 14 days after the last stable (or earlier on
request), soaks the release candidate on Preview for 24 hours, and
promotes it unchanged unless an open release-blocker issue stops it.

The shipped release docs, the promotion policy, the checklist, the source
of truth, several governance pages and two workflow comments still
described the retired model: release lines, steward judgment, 72-hour
soaks, a nightly rehearsal and patch releases scheduled by severity.
State the train's rules once, in the Release Train section of the
promotion policy, checked against the train itself, and point the rest
at it. Remove the unused internal copy of the promotion resolver, which
still enforced the old 72-hour soak.
2026-10-06 12:06:18 +01:00
pulse-triage[bot] 2f6a127c08 Compose retained pre-push browser validation with current safety source
Change-source: pulse-maintainer
2026-10-06 12:05:54 +01:00
pulse-triage[bot] 50b5adb561 Incorporate the batch-start upstream frontier
Merge published upstream through fac0cf1652 without rewriting either history. Preserve the locally reviewed Windows command-client cleanup when resolving its equivalent upstream patch. All incoming frontend files retain their exact upstream content and original receipt. The supplied 6bf99407 preflight candidate remains unintegrated pending its own exact-source regression proof.

Contract-Neutral: Upstream convergence preserves published source identities and existing cleanup behavior; no new runtime or receipt semantics are authored by this merge.
Change-source: pulse-maintainer
2026-10-06 11:19:45 +01:00
rcourtman 7bbeddd5b0 Say why vSphere datastores and networks need attention
An amber vSphere datastore or network gave no reason on its row: the
vCenter alarm behind it sat one click away in the drawer or one tab
away on the Overview. The alarm text itself led with boilerplate
("Network network-302 has VMware alarm ... (yellow)"), so the Overview
truncated the part that mattered.

A vCenter incident summary is now what vCenter flagged: the alarm's
own name, or "vCenter health is <colour>". Every surface that shows
it already names the resource and severity. Alert cards, notification
templates, and Patrol titles carry the resource name. Patrol's seed
context now names the resource on each alert line, and Patrol titles
key off the incident code instead of parsing the wording, while still
reading records persisted in the old form.

The alert card used to find vSphere by looking for "vmware" in the
message. It now routes on the incident provider, which also sends ESXi
host alarms to vSphere instead of to Machines, where hosts are not
listed. The card's own test becomes a registered alerts proof.

The Datastores and Networks tables gain the exception-first Health
column that TrueNAS storage uses. The cell moves into a shared
PlatformIssueReason, so the two platforms cannot drift; TrueNAS
renders the same. A row's dot and its reason now come from one
classification. Hosts shows only from a 72rem container, where it
reads instead of truncating, and the tablet band splits columns by
weight.
2026-10-06 10:45:16 +01:00
pulse-triage[bot] 6bf99407b0 Check final browser evidence before local source compilation
Use the existing CI range guard in local pre-push validation so missing, stale, partial or invalid final-content browser proof cannot produce a green local verdict. Bind the outgoing range to exact commits and its common ancestor, preserving honest own-parent receipts when upstream advances or merges. A refused receipt stops before compilation and type-checking; changed-graph strict audit and all protected rules stay unchanged.

Contract-Neutral: Local preflight now invokes the existing browser evidence rule; production code, receipt admission semantics and protected CI policy are unchanged.
Change-source: pulse-maintainer
2026-10-06 10:39:31 +01:00
pulse-triage[bot] 38f324736f Name verified source in browser coverage failures
A composed stylesheet can differ from every earlier browser receipt. Show the final digest and bounded valid receipt origins so its owner can identify the exact missing pass without manually reconstructing source and parent identities. Invalid receipts never supply hints, and all existing admission rules stay enforced.

Contract-Neutral: Diagnostics only; browser receipt validation, coverage and admission rules are unchanged.
Change-source: pulse-maintainer
2026-10-06 09:52:43 +01:00
pulse-triage[bot] 7587bdff8a Bind native-agent frontend tests into installer attestation
Final combined-source proof source-hh5q6qzp exposed the new compiled native-agent frontend test outside the rootful source manifest. Add its exact source binding and explicit regression requirement, retaining complete compiled-test coverage and all production roots. Existing runtime, isolation and qualification authority are unchanged.

Change-source: pulse-maintainer
2026-10-06 03:40:10 +01:00
pulse-triage[bot] 5c1779e6af Bind maintained guidance and all compiled installer inputs
Retain the newer private-token and prompt-revocation guidance rather than restoring obsolete copy to satisfy stale assertions. Bind all nine added installer test sources in the rootful manifest and exercise their real reader hashes; the complete compiled-source coverage guard remains intact. No workflow, release policy or runtime authority changes.

Change-source: pulse-maintainer
2026-10-06 00:20:57 +01:00
pulse-triage[bot] 3fb2389a8c Align discovery proof expectations and connected pool assertions
Retain exact proof-list equality while including the disk-History scope proof already registered in the assigned base. Require the connected pool test to exercise its host-availability check and both independent owning identities, not merely count resource rows.

Contract-Neutral: Update regression expectations and assertion coverage only; runtime, registry and subsystem contracts are unchanged.
Change-source: pulse-maintainer
2026-10-05 23:17:58 +01:00
pulse-triage[bot] c3e301dca6 Align strict guard fixtures with registered disk History proofs
Update the two fixed expected proof lists for the connected TrueNAS disk History tests already registered by the candidate. Preserve full-list equality, all existing proof paths and rejection controls; do not change guard implementation or runtime behaviour.

Contract-Neutral: Test expectations match existing registered proof paths; no guard, registry or runtime semantics change.
Change-source: pulse-maintainer
2026-10-05 20:52:44 +01:00
rcourtman ba4c0c5299 Expect the enrollment tests in the unified agent runtime proof list 2026-10-05 16:17:26 +01:00
rcourtman c000972ac9 Require empty subsystem default proof lists the guard never reads
Every subsystem must declare require_explicit_path_policy_coverage, so
build_verification_requirements never falls back to a rule's default
verification policy; an unmatched runtime file becomes a path-policy gap
instead. The default test_prefixes and exact_files were therefore never
consulted, yet 13 of 16 rules carried them (93 files and one prefix),
and authors kept adding proofs there as if they counted.

92 of the 93 files were already proof on some path policy, and
api-contracts' default prefix is on three of its own policies. The one
orphan, internal/api/router_bench_test.go, benchmarks the api-contracts
router rather than any performance-and-scalability runtime, so no policy
should take it; it stays an owned file only.

The registry drops the lists, registry_audit requires them empty and
points authors at the path policy instead, and the canonical protocol
says so. The protocol also stops promising same-subsystem tests "when
the registry explicitly allows them", which the audit no longer permits.

No verdict changes: build_verification_requirements returns identical
requirements for all 2746 owned runtime paths, and for an uncovered
path, under the old and new registry.
2026-10-05 13:50:34 +01:00
rcourtman cb9b3e82bc Retire the same-subsystem test wildcard the guards never honoured
staged_verification_files_for_requirement() matches
allow_same_subsystem_tests against a subsystem's
owned_prefixes/owned_files, but both commit guards passed it the
impacted entry, which carried neither. Since the v6 import (778a2577b6)
a same-subsystem test never satisfied a requirement, while
subsystem_lookup.py (which passes the registry rule) and the guard's own
BLOCKED message ("same-subsystem test/spec files are also accepted")
said it would.

Honouring the 12 flags would have loosened the guard well past their
apparent intent. Every rule requires explicit path-policy coverage, so
the five rule-level flags are never consulted, and on the seven path
policies the flag reaches every test the subsystem owns: a
mutation-registry change would accept any internal/ai or AI Chat test
(~455) instead of its 4 listed proofs, and a frontend Actions change any
Go test under internal/unifiedresources. Six of the seven already list
their own directory in test_prefixes.

So the strictness stays and the tools now agree on it: the registry sets
the 12 flags to false (what has always been enforced), registry_audit
rejects true and points at test_prefixes/exact_files, and the impacted
entry carries the rule's ownership so the completion and commit-shape
guards read the flag the same way subsystem_lookup does.

No requirement accepts a proof it rejected before. subsystem_lookup
stops reporting matches the guard refused: a new internal/hostagent test
no longer claims three agent-lifecycle policies.
2026-10-05 10:27:17 +01:00
rcourtman 5f5f7ac7fc Read the guard's registry and contracts from the evaluated commit
The completion guard's CI mode now compares contract text against the
evaluated commit (#2502), but it still decided which contracts a commit
owed from HEAD's registry and contract index. CI walks a branch with HEAD
at the tip (or at main after a merge), so a later commit could change an
earlier commit's verdict. If a later commit added a Shared Boundaries
reference to a file, an earlier commit that was complete when written got
blocked. If a later commit dropped ownership of a file, an earlier commit
that changed it without its contract passed. The pre-commit hook read
both from the commit's own index, so CI and the hook could still
disagree.

repo_file_io and subsystem_contracts can now read from a revision as well
as the working tree or index. A revision read uses only that commit's
tree and fails closed rather than falling back to the disk. In diff-base
mode the guard reads the registry and contract index from the evaluated
commit, as does the Prettier-only inference that --commit enables.
Replaying CI's per-commit loop over the last 120 commits on main gives
the same verdicts as before.
2026-10-05 10:04:06 +01:00
rcourtman cf785c0ac5 Judge each commit's contract edit against that commit, not HEAD
CI and dev-prepush walk a branch's commits with HEAD at the branch tip and
run the completion guard per commit with --diff-base <commit>^. The guard
then compared the parent's contract text against HEAD rather than against
the commit it was evaluating, so every commit was judged by the whole
branch. The pre-commit hook compares HEAD with the staged index, which is
the commit's own parent-to-commit change, so the two disagreed.

PR 2494 hit this: its second commit reverted a Current State paragraph in
performance-and-scalability.md that its first commit wrote. Parent-vs-HEAD
saw no change, and CI blocked a commit the hook had correctly passed. The
same comparison lets a bare runtime commit through when a later commit in
the branch carries the contract update.

When --commit is given, the guard now resolves the diff base and reads the
new contract text from that commit. CI already passes --commit, and
dev-prepush now does too. Without --commit the guard still compares with
HEAD, which is right when the evaluated commit is checked out.
2026-10-05 09:29:57 +01:00
pulse-triage[bot] bd749254b5 Reconcile batch-start published Pulse main
Change-source: pulse-maintainer
2026-10-04 19:22:41 +01:00
pulse-triage[bot] 2e9404504b Restore backup-alert protection and keep guest, backup and Diagnostics evidence truthful (#2463)
## What changes and why
- Keep backup-age checks fast and make failed or partial evaluations
visible through one existing system warning, without clearing retained
age alerts. Indexed latest-observation reads preserve retention, schema
and the read budget. This responds to the recurring missed checks
reported in #2465; synthetic timing is not proof of relief on the
reporter's Pi.
- Defer guest-agent commands after uncertain HTTP results and require
same-target, unambiguous backup-lock evidence before guest reads. Keep
guest coverage truthful when only remembered versions or a parent-node
assignment exist. Preserve the original observation time/source of
retained memory through existing backend projections. These changes
advance #2439 safety, but do not establish native thaw or recovery.
- Attribute Proxmox backups using native connection/node and unique PBS
namespace evidence, retaining ambiguous artifacts rather than assigning
them by substring or display name. Show unreliable PBS capacity as
Unknown/Unavailable, while retaining valid measured zero and readable
phone warnings.
- Restore existing TrueNAS and VMware connection alerts using the
constructed runtime pollers. This does not resolve the distinct
monitoring cause reported in #2382.
- Keep safe report collection and attachment guidance self-contained,
and make manual backup pause/resumption precautions usable. Repair the
Diagnostics integration journey's outdated controls, download assertions
and session capability, without changing production authorization.

## Included source
Published base `61146105c74a5968d877691e02963c41f8e66076` → exact final
head `af73b0e6c618da83c4fc5e702ba464257481851c`.

The previous proposal head `dcde1d0157d5e3c4cd626d6b920a45016a3f0437`
and all reviewed ancestry remain unchanged. This advances the proposal
once after its workflows completed with demonstrated failures; it does
not interrupt a checking head.

Reviewed candidates include:
- Previous batch: guest HTTP `cd1e3ba12f`, runtime alerts `7f5c8a0cf1`,
safe intake `496ba1e73e`, PBS capacity/render sequence `8f09a59996`
through `d2f7e456b3a`.
- Manual pause `3fd44b8325`; native backup ownership `c5e83ceb3a` /
`6198a3ce22`; authoritative locks `b77e6908e6`; truthful guest coverage
`ba3e2d2c1c` / `8f9a9a6a1e` / `f9f53befbb`.
- Backup evaluation/query `5774b6bc4b` / `7a19a06631`; Diagnostics
sequence `ed168c8d7e` through `a3bbcae0c9`; memory provenance
`abee023634` through `80d8ad0f59`; self-contained intake `7c9922f55d`.
- Starting reviewed canonical tip
`8003a4037bf2e6628d47ca6c7da239a11096168e` is retained. Four additive
publication corrections (`745ddc982a` through `79091f7b03`) supply the
report-form contract, connected docsLinks regression and exact
historical completion pair. The first completion's section placement
failed the checker; its substantive-section correction passes. No
accepted commit was amended or recreated.

## Validation and remaining gates
The previous proposal's completed runs remain adverse: Build/Test
`37204956836` failed the documentation drift assertion; E2E
`37204956824` failed Diagnostics shards 3/6/8 (download/obsolete
Run-control timeouts). These warrant the admitted changed-source
repairs, not an unchanged retry.

Retained reviewed evidence includes guest transport/connected/race/build
(`source-5_ta7via`), runtime alert connected proof (`source-s0xmdftf`),
PBS source/render evidence (`source-_9ekxhcy`), manual-pause
source/render (`source-ifgmfzhw`), all-reader authoritative-lock proof
(`source-41amnzmb`), guest coverage's 1,901 connected tests/full
types/lint/build and inspected Chromium/WebKit desktop/phone renders
(`source-3y6kfagt`), backup recovery/alerts/monitoring/races/vet/real
builds (`source-vc1jlsz9`), and memory
models/unified-resource/alerts/monitoring/races/vet/types/real
embed/build (`source-5swnugj9`). Diagnostics retains nine passing
full-app journeys with matching source hashes; catalogue
`source-cyehgbio` discovers 916 test/project identities, including all
nine Diagnostics cases, but is not runtime acceptance. Intake
`source-stznewur` retains two intended parent failures and passing
policy/documentation/mirror checks.

Publication checks: provenance, clean retained ancestry, per-commit
canonical completion/history, registry/contract audits and final
browser-content coverage (nine changed production frontend files) pass.
Earlier proposal-head (`79091f7b`) offline VM proof `source-1fn6chab`
passes 36 docsLinks tests, formatting, 27 intake cases, 211 public
Markdown checks and 62 mirrors, with complete hash-matched output and
guest stop. Its line-index bound is explicit. Earlier `source-yj300mm2`
passed docsLinks but exited 1 when a browser script was mistakenly
invoked in a source VM without Playwright; no browser result is claimed
from that attempt. Earlier local preparation failures and prior
API/embed limitation remain evidence at their own bindings, not green
aggregate results.

Required exact-head CI must run the complete backend/build/frontend,
audit and protected E2E checks, with independent source review, before
landing. Existing sufficient connected/render proof was not repeated
solely for batching. This is source publication, not release
qualification, deployment, native appliance/guest acceptance or
completion of the linked reports. The containing all-main release, Pi
evaluation/failure/recovery, native backup/thaw/covered writes/liveness,
remaining memory drawer consumption and installed whole-panel/alert
results remain separate.

Related to #2465
Related to #2439
Related to #2382


[How Pulse handles
triage](https://github.com/rcourtman/Pulse/blob/main/docs/AI_TRANSPARENCY.md)

## Completed workflow reconciliation and additive smoke repair
The starting proposal head `79091f7b0317807fcc76e36cde52c4ee1cc4c928`
and every reviewed commit remain ancestors of this head. Build/Test
`37219920651` has now completed. All backend partitions, frontend,
governance, security and all eight E2E shards/verdict passed, but script
smoke failed two obsolete whole-guide assertions in
`test_vm_disk_diagnostics.py`; backend build was consequently skipped.

The reviewed manual backup precaution deliberately adds six server/timer
examples. The old passive-helper test counted all seven guide examples
and banned `systemctl` throughout the whole guide. This source mismatch
warrants changed-source repair, not an unchanged retry. Additive
test-only `c4a72995c6bf2465a6540a1b546a9dcd732944af` scopes
passive-helper execution to its named section and admits only the exact
six reviewed manual-pause blocks. Its first local run retained one
failure because a shell comment was mistaken for a heading. Additive
`af73b0e6c618da83c4fc5e702ba464257481851c` parses headings only outside
fenced blocks. All 17 diagnostics/safety controls now pass, including
missing/duplicate headings, shell comments and five prohibited-command
mutations. The passive helper still rejects active guest requests and
service mutations. Production and guidance bytes remain unchanged;
mirrored docs and connected intake checks pass. Both failed
correction/control observations remain recorded, not relabelled.

Final publication provenance, clean retained ancestry, additive
contract/registry audits and the unchanged nine-production-file
browser-content coverage pass. Lightweight confined fixture proof
supplies the full 17-case suite; existing heavy/render proof was not
repeated for this test-only delta. This proposal advances only after the
previous head's workflows completed. Exact new-head CI must rerun its
required checks before landing.

The completed advisory benchmark job is also adverse:
`RefreshPlatformScopes` 294.1 → 325.0 ns (+10.51%) and
`ClassifyResourceSensitivity` 67.68 → 77.20 ns (+14.07%), each p=0.000
with ten samples. Their implementation and benchmark source are
unchanged across the batch; that does not prove noise, intentional cost
or lack of regression. Delivery owns a bounded evidence-based
disposition through the existing lane handoff. No favourable repeat,
threshold change or performance/release approval is claimed.


[How Pulse handles
triage](https://github.com/rcourtman/Pulse/blob/main/docs/AI_TRANSPARENCY.md)
2026-10-04 18:07:16 +00:00
rcourtman bd9063ed56 Cut 6.5 and later releases from main
Releases are cut from the head of main since 2 October, but three things
still made every release need hand edits before it could pass:

- the control plane routed 6.5.x to the abandoned release/v6.5 line;
- main lacked the published 6.4.4 to 6.4.6 packets, so rollback
  derivation on main still found 6.4.1;
- the packet tests pinned prose from old 6.4.x notes (named
  highlights, issue numbers, one release's mobile decision) and the
  per-release sentences in the deployment-installability contract,
  which changes several times a day on main.

Map 6.5 to main, carry the published packets over from release/v6.4,
and keep the packet tests to what the release tooling generates: version
pins, packet pointers, required sections and the rollback, signing and
mobile sentences.

Contract-Neutral: Release routing and release-packet test scope only; no runtime, install or public contract changes.
2026-10-04 18:37:43 +01:00
pulse-triage[bot] 79091f7b03 Bind report-form completion to its corrected substantive section
Use the exact additive completion that satisfies the unchanged canonical checker. Retain the earlier failed completion and every reviewed commit as history.

Change-source: pulse-maintainer
2026-10-04 18:11:53 +01:00
pulse-triage[bot] 12df32ad9d Bind reviewed report-form repair to its additive completion
Register the exact historical completion pair for governance CI; preserve the intermediate repair and all later accepted source unchanged. Completion checks still require ancestry, substantive contract text and registry-accepted proof.

Change-source: pulse-maintainer
2026-10-04 18:10:47 +01:00
pulse-triage[bot] 3fe74bf208 Bind report-intake completion to the corrected source proof
Keep the inherited report-form commit untouched and bind its additive completion to the tree with the actual optional attachment field IDs. The existing real guard still requires the contract and executable verification together; no release or runtime acceptance is asserted.

Change-source: pulse-maintainer
2026-10-04 18:04:59 +01:00
pulse-triage[bot] f8c5e98819 Bind report-intake verification to the actual attachment fields
The first exact-source suite reached an erroneous common evidence-field assumption: the bug form uses logs while the prerelease form uses evidence. Verify both real identities and their shared label without changing either form, requiring new diagnostics or weakening the optional-evidence assertion. Retain the original failed proof.

Change-source: pulse-maintainer
2026-10-04 17:59:41 +01:00
pulse-triage[bot] 37b271f4fc Bind retained report-intake history to its additive completion
Use the existing exact-commit completion registry and exercise its real guard, ancestry and substantive verification requirements. Preserve the original documentation-link commit and the final self-contained forms; no history is rewritten and no completion or release check is weakened.

Change-source: pulse-maintainer
2026-10-04 17:46:11 +01:00
pulse-triage[bot] 89b8151f19 Complete the retained report-intake safety contract and proof
Record self-contained collection and privacy safeguards for installed releases and parse both forms to protect their actual inline advice. This additively supplies the missing deployment-installability contract and accepted verification for the retained documentation-link correction without rewriting reviewed history or changing any runtime safeguard.

Change-source: pulse-maintainer
2026-10-04 17:45:03 +01:00
pulse-triage[bot] a131e4be7d Integrate reviewed billing-safe promotion controls
Merge exact Delivery candidate c5bd6f1d99. Resolve the overlapping test-only repair by retaining the union of existing and candidate read-only admission and billing-write prohibitions. No runtime or frontend changes.

Contract-Neutral: Test-only integration preserves production behaviour and release authority.
Change-source: pulse-maintainer
2026-10-04 01:20:15 +01:00
pulse-triage[bot] e597bb2a4b Keep release governance aligned with billing-safe demo profiles
PR2429 governance run 37161775883 still required the superseded entitlement rewrite after reviewed repair 7d739698 made profile admission read-only. Require the existing demo capability and reject the former integrity removal and billing rewrite instead. Retain runtime-setting, release and recovery guards unchanged.

Contract-Neutral: Test-only integration reconciliation; production billing and release admission are unchanged.
Change-source: pulse-maintainer
2026-10-04 01:04:36 +01:00
pulse-triage[bot] c5bd6f1d99 Align promotion controls with billing-safe demo profiles
PR2429 governance run 37161775883 still requires the removed demo entitlement rewrite and integrity clearing. Require the existing read-only capability gate instead, and reject billing writes or integrity removal. Keep all runtime profile, protected publication and exact-RC controls.

Contract-Neutral: Test-only alignment with the reviewed billing-preserving demo transaction; no runtime, API, deployment authority or release policy delta.
Change-source: pulse-maintainer
2026-10-04 00:56:16 +01:00
pulse-triage[bot] 9199676a2b Merge batch-start upstream browser receipt governance
Retain reviewed local source and upstream governance exactly. Resolve the retired shared receipt in favour of deletion; historical non-merge receipts remain available in Git.

Contract-Neutral: Integration only; no changed frontend runtime content or product contract.
Change-source: pulse-maintainer
2026-10-03 17:24:48 +01:00