store: при равной полноте точек побеждает пришедшая доставка

- байтовый порядок канонических форм остался тай-брейком только внутри одной
  доставки: на живом корпусе он решал 98,8% спорных координат и системно хранил
  меньшее значение, из-за чего step_count терял род и verify:archive был красным
- правило перестало быть коммутативным осознанно, поэтому порядок свёртки
  приведён к журнальному: проход воркера прекращается на отложенной доставке,
  а свёртка вне порядка журнала пишет WARN
- заведены счётчики PointsHeld и PointsErased — удержание полнотой и
  единственное направление, в котором правило теряет содержание
This commit is contained in:
av
2026-08-04 11:16:24 +03:00
parent ae607f1ceb
commit b278501a6e
44 changed files with 3780 additions and 172 deletions
+16 -1
View File
@@ -30,8 +30,19 @@ type Outcome struct {
// ретеншену трогать нельзя.
Partial int
// Incomparable — столкновений с несравнимыми наборами полей. На живом потоке
// их не было ни разу, и на этом стоит отказ от объединения полей.
// они единичны, и на этом стоит отказ от объединения полей.
Incomparable int
// PointsHeld — точек, удержанных правилом полноты против пришедшей
// доставки. Здесь по той же причине, что EntitiesHeld: сходимость
// отпечатка удержание не проверяет ПО ПОСТРОЕНИЮ — живой приём и пересборка
// пользуются одним правилом и одинаково сойдутся на одинаково удержанной
// точке. То есть слишком строгое правило полноты выглядело бы идеальной
// сходимостью.
PointsHeld int
// PointsErased — точек, чьё содержание унесла пришедшая победительница.
// Здесь по той же причине, что PointsHeld, и с большим весом: это
// единственное направление, в котором правило слияния теряет содержание.
PointsErased int
// EntitiesHeld — версий сущностей, удержанных правилом «не теряем
// содержания». Без него правило слияния сущностей проверить нечем:
// сходимость отпечатка его не проверяет ПО ПОСТРОЕНИЮ — живой приём и
@@ -54,6 +65,8 @@ func (o *Outcome) Add(other Outcome) {
o.FailedOther += other.FailedOther
o.Partial += other.Partial
o.Incomparable += other.Incomparable
o.PointsHeld += other.PointsHeld
o.PointsErased += other.PointsErased
o.EntitiesHeld += other.EntitiesHeld
o.EntitiesDiverging += other.EntitiesDiverging
}
@@ -118,6 +131,8 @@ func (p Player) Play(ctx context.Context, deliveryID string) (Outcome, error) {
out.Partial++
}
out.Incomparable += st.Incomparable
out.PointsHeld += st.PointsHeld
out.PointsErased += st.PointsErased
out.EntitiesHeld += st.EntitiesHeld
out.EntitiesDiverging += st.EntitiesDiverging
}