Pulse/internal/models
courtmanr@gmail.com 55048fb181 Harden PBS backup attribution against shared sources (#1639)
Adversarial review of 84dba861b found three ways the new evidence paths
could still attribute a snapshot to the wrong cluster.

The submission-source learner was asymmetric. Clusters only became known
to it through snapshots that were already attributable, so a cluster with
no uniquely-attributable snapshot was invisible - and a source token both
clusters share then mapped to exactly one visible cluster and looked
decisive. The visible cluster got the other's backups while the other
guest stayed at zero. Callers now declare every connection owning a
candidate guest for a PBS instance, and the learner refuses to resolve
anything for that instance until each of them has had a snapshot
attributed to it. Observation is not scoped per PBS instance, so a
cluster seen submitting to its own PBS server still counts as visible -
the reported two-server topology keeps working.

PVE storage confirmations were treated as authorship. A pbs-type storage
listing proves the connection can SEE a snapshot, which a shared token, a
synced datastore, or an offsite copy all arrange without the connection
having made it, and a single confirmer previously outscored everything
else. Confirmations now carry the storage they came from, and only a
storage view that never lists a snapshot some other connection also lists
can attribute a colliding VMID. An overlapping view has demonstrated it
sees other clusters' snapshots, so nothing it lists attributes anything.
Where an exclusive view and the learned source mapping both speak they
must agree, otherwise the snapshot drops as it did before #1639. The
disjoint case - each cluster mounting only its own datastore - is
unchanged.

Confirmations were evicted by partial poll failures. A storage whose
content query failed contributed nothing, and the partial set overwrote
the previous one, flipping attribution between cycles. They now go
through the same per-storage preservation as storage backups.

Contract text calling the PVE listing "the only deterministic
attribution" is reworded to match the weakened semantics.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-28 12:02:46 +01:00
..
account_roles.go fix(hosted): enforce tenant org membership during handoff 2026-03-26 23:14:54 +00:00
ceph_cluster_identity.go fix(ceph): parse Quincy+/Squid status schema for MON and MGR counts 2026-07-26 19:31:15 +01:00
ceph_pool_storage_test.go Reconcile Ceph pool alert identity 2026-05-28 14:42:43 +01:00
concurrency_test.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
converters.go Add durable Proxmox node display names 2026-07-24 15:46:56 +01:00
converters_additional_test.go Prepare v6.0.0 release candidate 2026-06-04 14:07:14 +01:00
converters_branchcov0718_test.go Add Go branch-coverage tests for twelve pure backend helpers 2026-07-19 15:10:09 +01:00
converters_test.go Use authoritative Docker OOM evidence 2026-07-15 17:55:26 +01:00
deepcopy.go Surface host-agent identity collapse from cloned machine-ids 2026-07-27 12:26:18 +01:00
deepcopy_branchcov0724pm_test.go Cover the missing arms of the SSRF, clone and classifier guards 2026-07-25 00:39:15 +01:00
deepcopy_clone_independence_w0716_coverage_test.go Add deep-copy independence and qualification render coverage tests 2026-07-16 22:56:24 +01:00
deepcopy_test.go Surface host-agent identity collapse from cloned machine-ids 2026-07-27 12:26:18 +01:00
disk_summary.go Restore linked host-agent disk inventory for guest VMs 2026-04-22 09:22:46 +01:00
disk_summary_test.go Restore linked host-agent disk inventory for guest VMs 2026-04-22 09:22:46 +01:00
docker_cpu.go Normalize Docker container CPU capacity 2026-07-03 11:51:08 +01:00
docker_cpu_test.go Normalize Docker container CPU capacity 2026-07-03 11:51:08 +01:00
host_transient_expiry_test.go fix(monitoring): make Unraid task state freshness-safe 2026-07-23 22:17:25 +01:00
issue1639_pbs_collision_test.go Harden PBS backup attribution against shared sources (#1639) 2026-07-28 12:02:46 +01:00
memory_availability_test.go Fix cache-aware Linux memory fallbacks 2026-07-24 00:19:40 +01:00
metrics_types.go fix: correct Proxmox guest rate sampling 2026-07-24 10:26:50 +01:00
metrics_types_branchcov0724pm_test.go Cover pure helpers and persistence round-trips across the backend 2026-07-25 00:21:35 +01:00
metrics_types_test.go Harden PBS backup attribution against shared sources (#1639) 2026-07-28 12:02:46 +01:00
models.go Harden PBS backup attribution against shared sources (#1639) 2026-07-28 12:02:46 +01:00
models_collections_branchcov0716_test.go Add Go branch-coverage tests for models config securityutil and aicontracts helpers 2026-07-16 14:20:13 +01:00
models_core_branchcov0718_test.go Add Go branch-coverage tests for models, cloudcp and actionlifecycle helpers 2026-07-19 15:10:09 +01:00
models_deepcopy_branchcov0716_test.go Add Go branch-coverage tests for models config securityutil and aicontracts helpers 2026-07-16 14:20:13 +01:00
models_frontend.go Add durable Proxmox node display names 2026-07-24 15:46:56 +01:00
models_frontend_branchcov0718_test.go Add Go branch-coverage tests for twelve pure backend helpers 2026-07-19 15:10:09 +01:00
models_frontend_test.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
models_helpers_test.go Fix PBS backup identity matching 2026-06-03 11:43:20 +01:00
models_removed_hosts_branchcov0716_test.go Add Go branch-coverage tests for models config securityutil and aicontracts helpers 2026-07-16 14:20:13 +01:00
models_roles_branchcov0716_test.go Add Go branch-coverage tests for pure config and helper packages 2026-07-16 10:19:51 +01:00
node_aliases_test.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
organization.go Fail closed on ambiguous email principal resolution 2026-05-05 09:26:10 +01:00
organization_additional_test.go Fail closed on ambiguous email principal resolution 2026-05-05 09:26:10 +01:00
profile_validation.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
profile_validation_additional_test.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
profile_validation_test.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
profiles.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
proxmox_guest_state.go Fix Proxmox workload refresh coherence 2026-07-24 10:11:56 +01:00
pve_node_identity_test.go Add durable Proxmox node display names 2026-07-24 15:46:56 +01:00
snapshot_provider.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
state_additional_test.go Fix Proxmox cluster membership reconciliation 2026-07-24 11:21:27 +01:00
state_docker_test.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
state_host_test.go Fix PBS backup attribution for VMIDs shared across clusters 2026-07-28 11:24:01 +01:00
state_snapshot.go Fix Proxmox tag color style propagation 2026-06-25 17:14:00 +01:00
state_snapshot_additional_test.go Stabilize RC release backend race proofs 2026-04-11 23:18:44 +01:00
state_snapshot_concurrency_test.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
state_snapshot_frontend_test.go Fix Proxmox tag color style propagation 2026-06-25 17:14:00 +01:00
state_snapshot_merge_test.go Merge linked host disks into guest overviews 2026-04-30 14:37:43 +01:00