CHANGELOG: Describe the changes to repository identity evaluation
This commit is contained in:
parent
2f1aaa45b2
commit
fb80d58af7
61
CHANGELOG.md
61
CHANGELOG.md
|
|
@ -7,6 +7,67 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## Repository Identity Evaluation
|
||||||
|
|
||||||
|
The limitations of evaluating repository identities were found on multiple
|
||||||
|
repositories, including the `heartwood` repository. This prompted a review of
|
||||||
|
the evaluation logic, which resulted in several improvements.
|
||||||
|
|
||||||
|
The bulk of the improvements come from two aspects in the evaluation. The first
|
||||||
|
is keeping track of the parent and children relationship of revisions. The
|
||||||
|
second is having a richer model of a revision's state.
|
||||||
|
|
||||||
|
Every revision (except the initial revision which is created during `rad init`)
|
||||||
|
explicitly refers to a parent revision. This is similar to Git commits, which
|
||||||
|
usually refer to one parent. Similarly, root commits do not refer to any parent,
|
||||||
|
and merge commits refer to multiple parents. For repository identity, merges
|
||||||
|
are not possible. This gives the first relation of interest: We say that two
|
||||||
|
revisions `A` and `B` are in relation "parent" if `A` refers to `B` explicitly
|
||||||
|
as its parent. The inverse relation is called "child". The transitive closure
|
||||||
|
of "parent" is called "ancestor" and the transitive closure of "child" is called
|
||||||
|
"descendant". Further, we say that two revisions `A` and `B` are in relation
|
||||||
|
"sibling" if they are both in relation "parent" with the same revision `C`.
|
||||||
|
|
||||||
|
With these relationships in mind, a revision can now be in one of four states:
|
||||||
|
1. *Active*: this is the initial state of any revision when it is proposed. The
|
||||||
|
proposal is waiting for delegates to accept or reject it. Or alternatively,
|
||||||
|
the revision can be redacted.
|
||||||
|
A revision will remain active, even if it has a majority of accepted votes,
|
||||||
|
if its parent is still active.
|
||||||
|
2. *Accepted*: the revision was accepted by a majority of delegates. The
|
||||||
|
revision can no longer be rejected nor redacted.
|
||||||
|
When a revision is accepted, its children are also evaluated, recursively, to
|
||||||
|
see if they also have reached a majority.
|
||||||
|
3. *Rejected*: there are now three variants of rejection for a revision:
|
||||||
|
a. The revision was directly rejected by a majority of the delegates, by them
|
||||||
|
casting their rejection votes.
|
||||||
|
b. The parent of the revision was rejected, and thus this revision was
|
||||||
|
transitively rejected.
|
||||||
|
c. A sibling of the revision was accepted, and thus this revision (and all
|
||||||
|
other siblings) are rejected.
|
||||||
|
4. *Redacted*: there are two variants of redaction for a revision:
|
||||||
|
a. The author explicitly redacted (withdrew) the revision.
|
||||||
|
b. The parent of the revision was redacted, and thus this revision was
|
||||||
|
transitively redacted.
|
||||||
|
|
||||||
|
This modeling of revisions ensures that the evaluation of the state remains
|
||||||
|
consistent, and accounts for the previous cases we had come across in the wild.
|
||||||
|
|
||||||
|
The final ingredient that was added ensures that the evaluation remains
|
||||||
|
consistent when it involves delegates accepting a revision. A delegate can only
|
||||||
|
accept a revision if they have not accepted any other active revision that is a
|
||||||
|
sibling of the revision they are voting on.
|
||||||
|
This prevents scenarios such as Alice creating and accepting two revisions `A`
|
||||||
|
and `B`, and Bob and Eve accepting each respectively. Both revisions would then
|
||||||
|
reach majority, but the evaluation would pick one arbitrarily based on the
|
||||||
|
topological sort of the COB graph. However, with the above condition in place,
|
||||||
|
this cannot happen.
|
||||||
|
|
||||||
|
We will note that we found an inconsistency where the concurrent operations
|
||||||
|
"redact" and "accept" will produce a different identity document depending on
|
||||||
|
which is ordered first. Further analysis of the ordering of pairs of actions is
|
||||||
|
required, but is left to future work.
|
||||||
|
|
||||||
## Improvements
|
## Improvements
|
||||||
|
|
||||||
- `rad patch list` includes a `Labels` column, showing any assigned labels to
|
- `rad patch list` includes a `Labels` column, showing any assigned labels to
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue