feat: M1 determinism fixes for gossip
Refs #1 - F1: canonical fingerprints (git identity by remote URL, log by basename, obsidian by relative vault path) so identical facts get identical ids across machines - F2: node_id (persisted in settings) + Hybrid Logical Clock in all observation "when" columns; removed time.Now() fact-time fallbacks - F3: stable TF-IDF tie-break sort (score desc, term asc) - F4: observations carry (node_id, hcl) locator; dedup ordered by hcl
This commit is contained in:
+12
-2
@@ -123,7 +123,12 @@ func (idx *TFIDFIndex) TopTerms(docIdx int, n int) []struct {
|
||||
}{t, s})
|
||||
}
|
||||
}
|
||||
sort.Slice(scored, func(i, j int) bool { return scored[i].Score > scored[j].Score })
|
||||
sort.Slice(scored, func(i, j int) bool {
|
||||
if scored[i].Score != scored[j].Score {
|
||||
return scored[i].Score > scored[j].Score
|
||||
}
|
||||
return scored[i].Term < scored[j].Term
|
||||
})
|
||||
if len(scored) > n {
|
||||
scored = scored[:n]
|
||||
}
|
||||
@@ -220,7 +225,12 @@ func (idx *TFIDFIndex) Cluster(minSharedTerms int, maxTopics int) []TopicCluster
|
||||
for k, v := range allTerms {
|
||||
sorted = append(sorted, kv{k, v})
|
||||
}
|
||||
sort.Slice(sorted, func(i, j int) bool { return sorted[i].v > sorted[j].v })
|
||||
sort.Slice(sorted, func(i, j int) bool {
|
||||
if sorted[i].v != sorted[j].v {
|
||||
return sorted[i].v > sorted[j].v
|
||||
}
|
||||
return sorted[i].k < sorted[j].k
|
||||
})
|
||||
|
||||
var nameParts []string
|
||||
for _, kv := range sorted {
|
||||
|
||||
Reference in New Issue
Block a user