The stuff this cycle made, archived 2026-10-21 and rendered from
git show rev65-attempt17-iterations11ofx:stuff/โฆ.
countersigner-race.mdforged-revocation-cutoff.mdsingle-pass-cutoff.mdRules 1 and 2 leave one way to drag a key's cutoff earlier: the thief must hold a second key with no countersigned revocation before the forgery. This file checks what that costs and whether the strata stay two-valued.
Keys A (honest, stolen) and B (also stolen, still unrevoked). Commit log:
| pos | event |
|---|---|
| 1 | A signs cut c1 |
| 2 | thief forges revoke(A), countersigned by B |
| 3 | A signs cut c2 (honest owner, unaware) |
| 4 | honest revoke(A), countersigned by C |
The forgery also burns B's usefulness only if someone revokes B. Once revoke(B) is countersigned at pos p, rule 2 voids every countersignature B makes after p, but not the one at pos 2. So the honest side wins only by revoking B *before* the forgery lands: it is a race on log position, and pos 2 < pos of revoke(B) means the thief keeps the gain.
Countersigning a revocation raises the price from one stolen key to two unrevoked stolen keys, but does not make the cutoff unforgeable. A retroactive rule (void B's countersignatures once B is shown to have been stolen earlier) would break the "single position" property, since a later event would then move an earlier cutoff back out.
Worked trace under rule 1 (cutoff = first *countersigned* revocation, by commit-log position) and rule 2 (a countersigner counts only if it has no countersigned revocation earlier in commit-log order).
Keys: H (honest), A and B (honest peers), T (thief, holds a copy of H's key).
| pos | event | counts? | H cutoff |
|---|---|---|---|
| 1 | H signs cut c1 | - | none |
| 2 | H signs cut c2 | - | none |
| 3 | T (as H) publishes revocation r1 of H | no countersign: recorded only | none |
| 4 | H signs cut c3 | - | none |
| 5 | A countersigns revocation r2 of H | yes | 5 |
Rescue restores c1, c2, c3 (all before position 5). T's forgery at 3 moved nothing, because rule 1 ignores it until countersigned.
Suppose T also stole B, and B was already revoked (countersigned by A) at position 2. T countersigns r1 with B at position 3. Without rule 2, H's cutoff becomes 3 and c3 is lost. With rule 2, B has a countersigned revocation earlier in the log (2 < 3), so B's countersignature does not count; the cutoff stays at 5.
If T steals a key that is *not yet* revoked, its countersignature counts. The cutoff can then move as early as the theft of the second key. So the bound is: a forged cutoff needs two live, distinct keys. Each stratum stays two-valued (a cut is before or after one position), and monotone (later countersigned revocations never move the cutoff, since only the first one counts).
Question: if rescue restores only cuts a key signed before its revocation by commit-log position, does each stratum stay monotone and two-valued, and can a forged revocation move that cutoff earlier?
Rule 1 sets a key's cutoff at its first *countersigned* revocation. Rule 2 says a countersignature counts only if the countersigning key has no counted countersigned revocation *earlier in commit-log order*. So whether K's revocation counts depends on whether J's revocation counted, which depends on J's countersigner, and so on.
Every link in that chain points strictly backward in the log. That makes the dependency well-founded. One forward walk resolves it:
cutoff[key] (unset at the start).cutoff[J] is still unset at this position. If it counts and cutoff[K] is unset, set cutoff[K] to this position.cutoff[K] is never touched again.cutoff[K]. Every cut falls on one side or the other, and the restored set is a prefix of K's cuts.countersigner-race.md would give up.| pos | event | counts? | cutoff after |
|---|---|---|---|
| 1 | A cuts x | โ | โ |
| 2 | revoke B, countersigned by A | yes | B=2 |
| 3 | revoke A, countersigned by B | no (B cut at 2) | B=2 |
| 4 | revoke A, countersigned by C | yes | A=4, B=2 |
A thief holding B forges A's revocation at 3 and gets nothing, because B was already cut at 2. Their window was before position 2. This matches the race described in countersigner-race.md, and the walk shows that race is the only remaining attack.