Strengthened the disposable reorg rehearsal

This commit is contained in:
2026-10-20 19:31:08 -04:00
parent 22da9764eb
commit 8cfcf6c025
6 changed files with 62 additions and 15 deletions
+12 -5
View File
@@ -90,7 +90,7 @@ function canonicalEvents(streamId: string, linkedTxId = '1'.repeat(64)) {
const a = 'a'.repeat(64), b = 'b'.repeat(64), c = 'c'.repeat(64);
add('connect', 1, a, GENESIS_HASH, [linkedTxId]);
add('disconnect', 1, a, GENESIS_HASH, [linkedTxId]);
add('connect', 1, b, GENESIS_HASH, ['2'.repeat(64)]);
add('connect', 1, b, GENESIS_HASH, [linkedTxId]);
add('connect', 2, c, b, ['3'.repeat(64)]);
return rows;
}
@@ -486,7 +486,7 @@ test('sale rehearsal requires explicit disposable instance consent and exact tra
const o = await f.execute(buyer, { type: 'reserve', listingId: l.id, priceAtomicXmr: l.priceAtomicXmr, feeBps: 250 }) as CustodyOrder;
const t1 = saleTranscript(o, f.market.id);
assert.throws(() => f.market.observeSaleRehearsal(o.id, t1.input), /unavailable/);
assert.throws(() => f.market.observeCanonicalEvents({}), /unavailable/);
await assert.rejects(f.market.observeCanonicalEvents({}), /unavailable/);
const rehearsal = await PostgresCustody.open(f.runtime, { ...options, disposableSaleRehearsal: true });
try {
const wrong = structuredClone(t1.input); wrong.lock = { ...t1.input.lock, terms: { ...t1.input.lock.terms, priceAtomicXmr: '1' } } as typeof wrong.lock;
@@ -646,13 +646,20 @@ test('disconnect of the exact posted candidate terminal transaction commits an o
assert.equal(credited.availableAtomicXmr, '96500000000');
const first = await observer.observeCanonicalEvents(canonicalPage(streamId, events, 0, 1));
assert.equal(first.cursor, 1);
await assert.rejects(observer.observeCanonicalEvents(canonicalPage(streamId, events, 1, 1)), /posted-sale-terminal-disconnected/);
await assert.rejects(observer.observeCanonicalEvents(canonicalPage(streamId, events, 1, 1)), /hold|incident unresolved/);
assert.equal((await f.admin.query("SELECT count(*)::int AS n FROM wk_custody.custody_meta WHERE key LIKE 'canonical-inbox:v1:event:%'")).rows[0].n, 1);
// The same transaction reappears on the replacement branch in this page; still review, never auto-clear.
const review = await observer.observeCanonicalEvents(canonicalPage(streamId, events, 1, 2));
assert.equal(review.reviewRequired, true);
assert.equal(review.cursor, 3); // Disconnect and reappearance are durably retained with the review marker.
await assert.rejects(observer.observeCanonicalEvents(canonicalPage(streamId, events, 1, 2)), /hold|incident unresolved/);
assert.equal((await f.admin.query("SELECT count(*)::int AS n FROM wk_custody.custody_meta WHERE key LIKE 'canonical-inbox:v1:event:%'")).rows[0].n, 3);
assert.equal((await f.activity(seller)).availableAtomicXmr, credited.availableAtomicXmr);
assert.equal((await f.admin.query("SELECT count(*)::int AS n FROM wk_custody.journals WHERE id=$1", [`settle:${o.id}`])).rows[0].n, 1);
const incident = await f.admin.query("SELECT value FROM wk_custody.custody_meta WHERE key='integrity_incident_v1'");
assert.match(incident.rows[0].value, /posted-sale-terminal-disconnected/);
await assert.rejects(observer.audit(), /unresolved-integrity-incident/);
await assert.rejects(resolveCustodyIncident(f.admin, randomUUID()), /posted-sale-terminal-disconnected/);
assert.equal((await f.admin.query("SELECT count(*)::int AS n FROM wk_custody.custody_meta WHERE key LIKE 'sale-reorg-review:%'")).rows[0].n, 1);
await assert.rejects(PostgresCustody.open(f.runtime, options), /unresolved-integrity/);
await assert.rejects(f.execute(other, { type: 'mock-credit' }), /incident is unresolved/);
} finally { await observer.close(); await rehearsal.close(); }
});