@real-life/trust-protocol 0.3.0 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/probe/continuity.d.ts.map +1 -1
- package/dist/probe/continuity.js +15 -2
- package/dist/probe/continuity.js.map +1 -1
- package/dist/probe/introduce.d.ts +1 -9
- package/dist/probe/introduce.d.ts.map +1 -1
- package/dist/probe/introduce.js +11 -0
- package/dist/probe/introduce.js.map +1 -1
- package/dist/probe/membership.d.ts +6 -0
- package/dist/probe/membership.d.ts.map +1 -1
- package/dist/probe/membership.js +18 -1
- package/dist/probe/membership.js.map +1 -1
- package/package.json +3 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"continuity.d.ts","sourceRoot":"","sources":["../../src/probe/continuity.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,CAAC,MAAM,WAAW,CAAA;AAC9B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAoBvC,eAAO,MAAM,cAAc,GAAI,GAAG,MAAM;;;CAGtC,CAAA;AAOF,wBAAsB,UAAU,CAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ;;;;YA0DvF;AA8ID,wBAAsB,iBAAiB,CAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ,gBAwDxF;
|
|
1
|
+
{"version":3,"file":"continuity.d.ts","sourceRoot":"","sources":["../../src/probe/continuity.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,CAAC,MAAM,WAAW,CAAA;AAC9B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAoBvC,eAAO,MAAM,cAAc,GAAI,GAAG,MAAM;;;CAGtC,CAAA;AAOF,wBAAsB,UAAU,CAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ;;;;YA0DvF;AA8ID,wBAAsB,iBAAiB,CAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ,gBAwDxF;AAmQD;;;;;GAKG;AACH,wBAAsB,eAAe,CAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ,gBAgF5F"}
|
package/dist/probe/continuity.js
CHANGED
|
@@ -509,8 +509,15 @@ async function handleProbe(p, { key, t }, artifact, threadId, when, ent, mkAck,
|
|
|
509
509
|
}
|
|
510
510
|
}
|
|
511
511
|
else {
|
|
512
|
-
// Nicht-Record: Match-Report (löst NIE eine Kette aus)
|
|
513
|
-
|
|
512
|
+
// Nicht-Record: Match-Report (löst NIE eine Kette aus). Ist die
|
|
513
|
+
// Record-Wahl auf diesem Tupel schon verifiziert, ist die Report-
|
|
514
|
+
// Pflicht GESTORBEN (6a.3) — eine späte Probe der Record-Seite erzeugt
|
|
515
|
+
// keinen Report mehr: „a match report flushed after the choice is a
|
|
516
|
+
// stale counter-claim that MUST NOT be sent". Ohne diese Schranke
|
|
517
|
+
// entstand ein nie retirebarer Eintrag, den jeder Flush byte-identisch
|
|
518
|
+
// erneut sandte (Gesamtsimulator, 06.09.2026: Endlos-Retry nach der
|
|
519
|
+
// gegenseitigen Verifikation)
|
|
520
|
+
if (!t.contReported && !t.contRecordPrior) {
|
|
514
521
|
t.contReported = matches[0];
|
|
515
522
|
try {
|
|
516
523
|
outbound.push(await buildMapping(p, key, matches[0], when, ent));
|
|
@@ -707,6 +714,12 @@ export async function flushContinuity(p, newKey, when, ent = {}) {
|
|
|
707
714
|
// with freshly sampled padding" (Review 5, B-3): stale Einträge
|
|
708
715
|
// werden RETIRED (Ack-Ref bleibt, Review 6, B-3), EINE frische
|
|
709
716
|
// Probe ersetzt sie (Bau nach der Lock-Sektion)
|
|
717
|
+
// ein Report nach verifizierter Record-Wahl ist tot (6a.3) — auch wenn
|
|
718
|
+
// er der Wahl zuvorkam, aber erst danach in die Outbox gelangte
|
|
719
|
+
if (t.contRecordPrior)
|
|
720
|
+
for (const o of (t.outbox ?? new Map()).values())
|
|
721
|
+
if (o.kind === 'continuity-mapping' && o.duty !== 'align')
|
|
722
|
+
o.retired = true;
|
|
710
723
|
const retries = [...(t.outbox ?? new Map()).values()]
|
|
711
724
|
.filter((o) => o.kind === 'continuity-mapping' && !o.retired)
|
|
712
725
|
.map((o) => ({ to: t, kind: o.kind + '/0.1 (Retry, byte-identisch)', env: o.env }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"continuity.js","sourceRoot":"","sources":["../../src/probe/continuity.ts"],"names":[],"mappings":"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","sourcesContent":["// continuity.mjs — rltp-visibility §6a im Simulator: continuity-probe@1 +\n// continuity-mapping@1. „Kontinuität wird NACH der Zeremonie aufgelöst,\n// nie in ihr\" (Encounter 4.4): jedes Enactment UND jede Vorstellung prägt\n// ein frisches Tupel; ob es ein Wiedersehen war, klärt die Probe über den\n// frischen Kanal — automatisch, ohne Dialog, ohne Namen.\n//\n// Die Probe ist das dritte Mitglied EINER Familie (Stern, Mapping, Probe:\n// geblendete Werte unter Beziehungs-Schlüsseln): die EIGENEN bisherigen\n// pair-Anker reisen als HMAC unter k_p (DH des NEUEN Kanals), gepolstert\n// auf Vielfache von 256, sortiert, sequenziert. Nur wer eine der\n// Beziehungen wirklich hält, kann matchen; ein leerer Bestand sendet\n// trotzdem (sonst leakte die Abwesenheit die Kardinalität „null\").\n//\n// Die Maschine (6a.4): EIN Wähler (Record-Seite = lexikographisch\n// kleinerer neuer pair-Anker), EINE endgültige Wahl (eingefroren,\n// Abweichung = Äquivokation), EIN Auslöser (Record-Seite kettet atomar\n// mit ihrer Wahl; die Gegenseite NUR auf deren verifiziertes Mapping —\n// ihr eigenes ist ein Match-Report). Kette: neues Tupel wird Kopf, das\n// alte deaktiviert; Evidenz akkumuliert AUF DER BEZIEHUNG (✓ bleibt ✓),\n// für Dritte unsichtbar. Wer die Probe nicht beantworten kann, IST\n// protokollisch eine neue Beziehung (Identity 9.3).\nimport { jcs, makeValidator } from '../core.js'\nimport { SCHEMAS } from '../schemas.js'\nimport * as C from './deps.js'\nimport type { Person } from './deps.js'\nimport { hmac, hmacU, reissueTrust, chainAdmission, withContactLock, withIssueLock } from './trust.js'\nimport { buildAck, ACK_TYPE } from './acks.js'\n\nconst say = (p: Person, m: string) => p.log.push(m)\nconst CHUNK = 256\nconst V = makeValidator(SCHEMAS)\nconst schemaOk = (file: string, data: any) => V.validate(data, SCHEMAS[file], SCHEMAS[file]).length === 0\n\n// ── Schlüssel (Spec-Infostrings, richtungsgebunden) ─────────────────────\n// k_p = HKDF(ECDH(newPairX_sender, newPairX_recipient),\n// 'rltp/visibility/blind/probe/' + senderNewPair + '/' + recipientNewPair)\nconst kProbe = async (xPriv: CryptoKey, theirKa: string, senderAnchor: string, recipientAnchor: string) =>\n C.hkdf(await C.ecdh(xPriv, C.xRawOfMk(theirKa)!), 'rltp/visibility/blind/probe/' + senderAnchor + '/' + recipientAnchor)\nconst kMac = async (xPriv: CryptoKey, theirKa: string, info: string) =>\n C.hkdf(await C.ecdh(xPriv, C.xRawOfMk(theirKa)!), info)\n\n// ── Schnappschuss-Helfer (Prior-Candidate-Set, Sicht des Halters) ───────\n// wird von introduce.mjs BEI TUPEL-ERZEUGUNG aufgerufen: aktive Heads,\n// das frische Tupel selbst ausgeschlossen; deaktivierte Glieder nie.\nexport const snapshotPriors = (p: Person) => ({\n own: [...p.contacts.values()].filter((c) => !c.deactivated && c.channel?.own).map((c) => c.channel.own.anchor),\n counterpart: [...p.contacts.entries()].filter(([, c]) => !c.deactivated).map(([k]) => k),\n})\n\n// ── continuity-probe@1: bauen ───────────────────────────────────────────\n// Sequenzvergabe SYNCHRON (BigInt-String — 18 Stellen exakt), Bau je\n// Kontakt serialisiert: zwei parallele buildProbe-Aufrufe teilen nie\n// eine Sequenz, und der Wire-Wert ist der reservierte (Review 2, B-1)\nconst withContLock = withContactLock // EIN Lock je Kontakt, geteilt mit trust (Review 4, B-1)\nexport async function buildProbe (p: Person, newKey: string, when: number, ent: any = {}) {\n const t = p.contacts.get(newKey)\n if (!t?.channel?.own || t.deactivated) return null // deaktivierte Tupel stellen nichts aus (Review 8, B-2)\n return withContLock(t, async () => {\n if (t.deactivated) return null // Re-Check nach dem Lock-Erwerb\n // Sequenz nur GEPEEKT (Review 25): „assigning … and committing are\n // one step\" — ein Bau-Fehler verbraucht nichts, auch am letzten\n // Wert entsteht nie falsche Erschöpfung; committet wird synchron\n // mit der Outbox (persisted atomically before send)\n const nextProbe = BigInt(t.probeSeqOut ?? '0') + 1n\n if (nextProbe > 10n ** 18n - 1n) throw new Error('scope exhausted — issues nothing further (2.1)')\n const probeSeq = String(nextProbe)\n const kp = await kProbe(t.channel.own.x.priv, t.channel.counterpartKa, t.channel.own.anchor, newKey)\n const entries = []\n // §6a: prior ist „nie das frische Tupel\" — Hygiene am NUTZUNGSORT:\n // ein Host, der das Set nach der Tupel-Anlage (neu) schnappschießt,\n // darf keine Selbst-Kette provozieren können (Selbst-Match →\n // chainTuple(key, key) deaktivierte den eigenen Kopf)\n for (const a of t.priorCands?.own ?? []) if (a !== t.channel.own.anchor) entries.push(await hmacU(kp, a))\n // Polstern auf das nächste Vielfache von 256 (leerer Bestand → 1 Voll-Polster-Chunk);\n // KOLLISION → Neusampling (Review 6, MAJOR: „the padding value is\n // resampled\") — ein injizierter ent.pad wird höchstens EINMAL\n // verwendet, Duplikate fallen auf frische Zufallswerte zurück\n const total = Math.max(CHUNK, Math.ceil(entries.length / CHUNK) * CHUNK)\n const used = new Set(entries)\n while (entries.length < total) {\n let v = 'u' + C.b64uOf(ent.pad ?? C.rand(32))\n while (used.has(v)) v = 'u' + C.b64uOf(C.rand(32))\n used.add(v)\n entries.push(v)\n }\n entries.sort()\n // Bau + Seal + Digest sind FEHLBAR und warten — vorbereiten, dann\n // Re-Check, dann Outbox-Schreibungen synchron (Review 9, B-3: ein\n // während der Awaits deaktiviertes Tupel stellt nichts aus)\n const preps = []\n const threadId = ent.threadId ?? globalThis.crypto.randomUUID()\n for (let i = 0; i * CHUNK < entries.length; i++) {\n const body = { type: 'continuity-probe@1', probe: probeSeq, seq: String(i + 1), last: (i + 1) * CHUNK >= entries.length, blinded: entries.slice(i * CHUNK, (i + 1) * CHUNK) }\n const artifact = { body, proof: { mac: await hmacU(kp, jcs(body)) } }\n const doc = { id: globalThis.crypto.randomUUID(), type: 'https://real-life.org/trust-tasks/continuity-probe/0.1', issuer: t.channel.own.anchor, recipient: newKey, threadId, issuedAt: C.iso(when), payload: artifact }\n const env = await C.seal(doc, t.channel.counterpartKa, ent)\n const digest = await C.digestDoc(doc)\n preps.push({ digest, env })\n }\n if (t.deactivated) return null // Re-Check (B-3), danach kein await\n // COMMIT — Sequenz + Outbox in EINEM synchronen Zug (Review 25):\n // byte-identische Redelivery-Zuordnung fürs Ack-Matching (4.2;\n // erneut SENDEN tut ein Retry nie, §6a)\n t.probeSeqOut = probeSeq\n const outbound = []\n for (const { digest, env } of preps) {\n ;(t.outbox ??= new Map()).set(digest, { env, threadId, kind: 'continuity-probe' })\n outbound.push({ to: t, kind: 'continuity-probe/0.1 (geblendet, gepolstert, versiegelt)', env })\n }\n say(p, `Kontinuitäts-Probe an ${t.name}: ${t.priorCands?.own.length ?? 0} eigene Beziehungs-Anker, geblendet + gepolstert (${entries.length})`)\n return outbound\n })\n}\n\n// ── continuity-mapping@1: bauen ─────────────────────────────────────────\n// prior = EIGENER alter pair-Anker · next = eigener neuer · to = neuer der\n// Gegenseite; mac1 unter dem ALTEN Beziehungs-Schlüssel, mac2 unter dem\n// NEUEN — nur derselbe Schlüssel-Inhaber kann beide (für die Adressatin\n// fälschbar: Klasse V, abstreitbar).\n// PREPARE (fehlbar: MACs, Seal, Digest — mutiert nichts) und COMMIT\n// (synchron: Zähler + Outbox) getrennt (Review 12, B-2): die Record-\n// Wahl kettet ATOMAR mit der Ausgabe ihres Mappings — beide Schritte\n// liegen dann in EINEM synchronen Zug. Alle Aufrufer laufen unter dem\n// Kontakt-Lock des Tupels (Handler + Flush), der die Revisionsvergabe\n// serialisiert; buildMapping hält zusätzlich den Issue-Lock.\nasync function prepareContMapping (p: Person, newKey: string, oldKey: string, when: number, ent: any = {}, duty?: string) {\n const t = p.contacts.get(newKey), old = p.contacts.get(oldKey)\n if (t.deactivated) throw new Error('tuple deactivated — issues nothing (§6.4)')\n // 6.4/6a.4: Revision je (next, to) monoton — nur gepeekt, ein\n // Fehlschlag verbraucht nichts (§6.4: one step per scope)\n const nextRev = BigInt(t.contRevOut ?? '0') + 1n\n if (nextRev > 10n ** 18n - 1n) throw new Error('scope exhausted — issues nothing further (2.1)')\n const rev = String(nextRev)\n const body = { type: 'continuity-mapping@1', prior: old.channel.own.anchor, next: t.channel.own.anchor, to: newKey, revision: rev, issuedAt: C.iso(when) }\n const msg = jcs(body)\n const artifact = { body, proof: {\n mac1: await hmacU(await kMac(old.channel.own.x.priv, old.channel.counterpartKa, 'rltp/visibility/mac/cont1'), msg),\n mac2: await hmacU(await kMac(t.channel.own.x.priv, t.channel.counterpartKa, 'rltp/visibility/mac/cont2'), msg) } }\n const doc = { id: globalThis.crypto.randomUUID(), type: 'https://real-life.org/trust-tasks/continuity-mapping/0.1', issuer: t.channel.own.anchor, recipient: newKey, threadId: ent.threadId ?? globalThis.crypto.randomUUID(), issuedAt: C.iso(when), payload: artifact }\n const env = await C.seal(doc, t.channel.counterpartKa, ent)\n const digest = await C.digestDoc(doc)\n return { t, rev, env, digest, threadId: doc.threadId, duty, prior: old.channel.own.anchor }\n}\nconst commitContMapping = (prep: any) => {\n prep.t.contRevOut = prep.rev\n ;(prep.t.outbox ??= new Map()).set(prep.digest, { env: prep.env, threadId: prep.threadId, kind: 'continuity-mapping', duty: prep.duty, prior: prep.prior })\n return { to: prep.t, kind: 'continuity-mapping/0.1 (mac1 alt · mac2 neu, versiegelt)', env: prep.env }\n}\nasync function buildMapping (p: Person, newKey: string, oldKey: string, when: number, ent: any = {}, duty?: string) {\n const t = p.contacts.get(newKey)\n return withIssueLock(t, async () => {\n const prep = await prepareContMapping(p, newKey, oldKey, when, ent, duty)\n if (t.deactivated) throw new Error('tuple deactivated — issues nothing (§6.4)') // Re-Check (B-2), danach kein await\n return commitContMapping(prep)\n })\n}\n\n// ── die Kette: neues Tupel wird Kopf, das alte deaktiviert ──────────────\n// Visibility 0.29 §6.4: PER-TUPEL-ZUSTAND WANDERT NICHT — Grade,\n// Stern-Salts, Baseline und empfangene Sterne sterben mit dem alten\n// Kopf (der neue beginnt fail-closed; das Fenster schließen 5.5s\n// Neuausstellung und das New-Head-Korollar von 5.4, nie eine\n// Migration). KETTEN-Ebene wandert: Kontakt-Gedächtnis, Evidenz\n// (✓ akkumuliert), das WISSEN um den offengelegten Anker (die\n// Admissionsschicht hängt an der Beziehung), die eigene\n// Vertrauens-ENTSCHEIDUNG (trustGiven) und die Pause.\nfunction chainTuple (p: Person, newKey: string, oldKey: string, when: number) {\n const head = p.contacts.get(newKey), old = p.contacts.get(oldKey)\n if (!head || !old || head === old || old.deactivated) return false // idempotent; NIE Selbst-Kette (§6a)\n old.deactivated = true\n old.chainedInto = newKey\n head.chain = [...(old.chain ?? []), oldKey]\n // Zustands-Vorrang entlang der Kette (Encounter 4.2, „evidence accumulates\n // on the relationship through its chain\"): ✓ > Zeremonie-Richtung (→/←)\n // > Vorstellung (⇄). Eine einseitige Zeremonie ist stärker als eine\n // Vorstellung — der Kopf verliert seine Richtung nicht an ein ⇄\n if (old.state === '✓' || head.state === '✓') { head.state = '✓'; head.provenance = 'ceremony' }\n else if (head.state === '→' || head.state === '←') { /* die Richtung des Kopfes bleibt */ }\n else if (old.state === '→' || old.state === '←') { head.state = old.state; head.provenance = 'ceremony' }\n else if (old.state === '⇄' || head.state === '⇄') head.state = '⇄'\n head.since = [old.since, head.since].filter(Boolean).sort()[0]\n head.name = old.name // lokales Kontakt-Gedächtnis\n head.selfAnchor ??= old.selfAnchor // Ketten-WISSEN: wer das ist (das Mapping selbst stirbt mit dem Tupel, §6.4)\n const oldRel = old.relId ?? oldKey\n // Admission (B-4): der neue Kopf löst über die überlebende Beziehung\n // auf; ein schon existierender Eintrag der frischen Beziehung\n // verschmilzt atomar (früheste Position, Aliase, k−1). Die\n // IDENTITÄT ist die des TATSÄCHLICH überlebenden Eintrags (Review\n // 36: „the merged relationship's identity is the surviving\n // entry's\") — existiert nur der frische, bleibt DESSEN Identität;\n // existiert keiner, die des jüngsten Kopfs (Review 4, B-4)\n const survivor = chainAdmission(p, oldRel, newKey, newKey, when)\n // Ketten-Identität = die des Survivors NUR, wenn sie zu DIESER Kette\n // gehört (Review 36 + 37, B-1): die kanonische Identität eines\n // Weg-2-Merges gehört einer ANDEREN, weiterhin aktiven Beziehung —\n // Admission-Identität und Beziehungsstrang bleiben unterscheidbar,\n // der Abgang dieser Kette darf die andere nie mitreißen\n const sid = survivor?.id\n const sidInChain = sid !== undefined && (sid === oldRel || sid === newKey || (p.contacts.get(sid)?.relId ?? null) === oldRel)\n head.relId = sidInChain ? sid : (survivor ? oldRel : newKey)\n // die GANZE Kette identifiziert sich als DIESE Beziehung — auch der\n // alte Kopf (Review 36: der Abgang räumt sämtliche Ketten-Aliase)\n old.relId = head.relId\n head.trustGiven ??= old.trustGiven // die Entscheidung gehört der Beziehung (V2)\n // 5.5: „MUST re-issue its most recently ISSUED grade\" — der\n // Ordnungsstempel entscheidet, nie der zufällig frischere Kopf\n // (Review 27: setGrade auf dem alten Kopf NACH dem Trust-Akt des\n // frischen muss die Kettung überleben)\n if (old.gradeOutLast !== undefined && (head.gradeOutLast === undefined || (old.gradeOutOrder ?? 0n) > (head.gradeOutOrder ?? 0n))) {\n head.gradeOutLast = old.gradeOutLast\n head.gradeOutOrder = old.gradeOutOrder\n }\n // Pause ist chain-level und ÜBERLEBT die Kettung (Review 37, B-2):\n // der Zustand der Beziehung, auf die gekettet wird, gewinnt gegen\n // Vor-Kettungs-Akte des frischen Tupels\n head.trustPaused = old.trustPaused ?? head.trustPaused\n head.sharedGroups = [...new Set([...(old.sharedGroups ?? []), ...(head.sharedGroups ?? [])])]\n // NICHT migriert (per Tupel, stirbt mit dem alten Kopf):\n // trustReceived, starReceived, starInfo, starSaltIn, sentMapping,\n // sub (Baseline/inFlight), starSeqNext. Die 5.5-Neuausstellung ist\n // die stehende Pflicht des neuen Kopfs; ihr Producer ist\n // trust.reissueTrust via starRefreshAll.\n // die Pflicht entsteht, wenn eine DECLARATION ausgestellt war (5.5:\n // „a subject holding an issued declaration … MUST re-issue\") — auch\n // ohne Trust-Akt (eigenständiges setGrade); Review 33, B-1\n if (head.trustGiven || head.gradeOutLast !== undefined) head.trustReissueDue = true\n say(p, `Kontinuität: ${head.name} wiedererkannt — neues Tupel an die Beziehung gekettet (${head.state}, ${head.chain.length + 1} Enactments)`)\n return true\n}\n\n// V2-Hook (5.5): direkt nach der Kettung wird die Neuausstellung\n// versucht; ein Bau-Fehler lässt die Pflicht (trustReissueDue) stehen —\n// ihr Producer ist starRefreshAll, nie eine Wiederzustellung.\nasync function v2Reissue (p: Person, newKey: string, when: number, ent: any, outbound: any[]): Promise<string | undefined> {\n const t = p.contacts.get(newKey)\n if (!t?.trustReissueDue) return undefined\n try {\n const r = await reissueTrust(p, newKey, when, ent)\n if (r) outbound.push(...r.outbound)\n return undefined\n } catch (e: any) { return String(e?.message ?? e) }\n}\n\n// ── Empfangs-Dispatch ───────────────────────────────────────────────────\nconst iAmRecord = (t: any, newKey: string) => t.channel.own.anchor < newKey // lexikographisch kleinerer NEUER Anker\nconst tupleOf = (p: Person, rkid: string) => {\n const ctx = p.contexts.get(rkid)\n if (!ctx) return null\n const e = [...p.contacts.entries()].find(([, c]) => c.channel?.own?.anchor === ctx.anchor)\n return e ? { key: e[0], t: e[1], ctx } : null\n}\n\nconst TT_PROBE = 'https://real-life.org/trust-tasks/continuity-probe/0.1'\nconst TT_MAP = 'https://real-life.org/trust-tasks/continuity-mapping/0.1'\nexport async function receiveContinuity (p: Person, env: any, when: number, ent: any = {}) {\n const opened = await C.openEnvelope(p, env) // Stufen 1–4, Cache-Lesung\n if (opened.error) return { handled: false }\n const hit = tupleOf(p, env.rkid)\n if (!hit) return { handled: false }\n if (opened.duplicate) {\n // 4.2: byte-identischer Re-Ack innerhalb der Retention\n const stored = hit.t.ackStore?.get(opened.digest)\n return { handled: true, duplicate: true, ack: stored ? { to: hit.t, kind: 'delivery-ack/0.1 (Re-Ack, byte-identisch)', env: stored } : undefined }\n }\n const doc = opened.doc\n if (doc?.type !== TT_PROBE && doc?.type !== TT_MAP) return { handled: false, doc }\n // Dokumentprofil (Delivery §3) + Artefakt-Schema (Stufen 5/7)\n if (!schemaOk('rltp-delivery-document.schema.json', doc) || doc.proof !== undefined) return { handled: true, error: 'malformed document' }\n // Stufe 5: recipient; die issuer-Bindung (Stufe 8) läuft NACH den\n // Payload-Schemata (Review 32)\n if (doc.recipient !== hit.t.channel.own.anchor) return { handled: true, error: 'outer binding (recipient)' }\n // Kalender-Validität des DOKUMENTS (Review 12, B-3); die PAYLOAD-\n // Kalenderprüfung sitzt NACH dem Artefakt-Schema (Review 31)\n if (!C.calOK(doc.issuedAt)) return { handled: true, error: 'calendar-invalid issuedAt' }\n if (doc.type === TT_PROBE && !schemaOk('visibility-continuity-probe.schema.json', doc.payload)) return { handled: true, error: 'malformed probe' }\n if (doc.type === TT_MAP && !schemaOk('visibility-continuity-mapping.schema.json', doc.payload)) return { handled: true, error: 'malformed mapping' }\n if (doc.type === TT_MAP && !C.calOK(doc.payload?.body?.issuedAt)) return { handled: true, error: 'calendar-invalid issuedAt' } // Stufe 8, nach dem Schema (Review 31)\n if (doc.issuer !== hit.key) return { handled: true, error: 'outer binding (issuer, Stufe 8)' }\n // Profil-Regel (Review 29/30): Stufe 8 NACH dem Payload-Schema —\n // ein präsentes ceremony.enactment kann bei diesen Payloads nie\n // nachrechnen (kein umschlossenes Bindungsmaterial) →\n // failed(validation-failed); andere Framework-Member passieren (§4.11.1)\n if (doc.ceremony?.enactment !== undefined) return { handled: true, error: 'ceremony.enactment kann nicht nachrechnen (validation-failed)' }\n // GESAMTER Empfang unter dem Kontakt-Lock (B-1: kein Rollback durch\n // parallele Handler); der Ack entsteht IN den Handlern nach der\n // vollen Validierung (M-2), Commit hier atomar mit Cache+Store\n return withContLock(hit.t, async () => {\n // §6.4: ein deaktiviertes Tupel nimmt nichts mehr an (Review 5, B-1)\n if (hit.t.deactivated) return { handled: true, error: 'tuple deactivated' }\n // Stage-4-Reentry nach Lock-Wartezeit: ein inzwischen verarbeitetes\n // Duplikat erhält den gespeicherten Ack byte-identisch\n if ((p.deliveryCache ?? new Set()).has(opened.digest!)) {\n const stored = hit.t.ackStore?.get(opened.digest)\n return { handled: true, duplicate: true, ack: stored ? { to: hit.t, kind: 'delivery-ack/0.1 (Re-Ack, byte-identisch)', env: stored } : undefined }\n }\n const mkAck = () => buildAck(p, hit.t, opened.digest!, doc.threadId, when).then((a: any) => a.env)\n // Effekt + completed-effect cache + gespeicherter Ack committen in\n // EINEM synchronen Zug IM Handler (Review 6, B-5: „inside the\n // effect's transaction\") — die Outbound-PRODUKTION (buildMapping,\n // V2) läuft danach; ihr Scheitern hinterlässt eine Pflicht, nie\n // einen halben Empfangs-Commit\n const commitAck = (ackEnv: any) => {\n C.effectDone(p, opened.digest)\n ;(hit.t.ackStore ??= new Map()).set(opened.digest, ackEnv)\n return { to: hit.t, kind: 'delivery-ack/0.1', env: ackEnv }\n }\n return doc.type === TT_PROBE\n ? handleProbe(p, hit, doc.payload, doc.threadId, when, ent, mkAck, commitAck)\n : handleMapping(p, hit, doc.payload, when, ent, mkAck, commitAck)\n })\n}\n\nasync function handleProbe (p: Person, { key, t }: any, artifact: any, threadId: string, when: number, ent: any, mkAck: () => Promise<any>, commitAck: (env: any) => any) {\n // Schema lief im Dispatch; hier die wertgebundenen Reste (M-3)\n const doc = artifact.body\n if (!C.intStr(doc.probe) || !C.intStr(doc.seq) // NaN in probeSeqIn wäre Replay-Zustandskorruption (Review 9, P-B1)\n || doc.blinded.length !== 256) // die Chunkform ist FEST: genau 256 Einträge (Review 10, P-B1-Rest)\n return { handled: true, error: 'malformed probe' }\n // Senderseitiger k_p, aus Empfängersicht nachgerechnet (Richtung!)\n const kp = await kProbe(t.channel.own.x.priv, t.channel.counterpartKa, key, t.channel.own.anchor)\n if ((await hmacU(kp, jcs(doc))) !== artifact.proof.mac) return { handled: true, error: 'probe mac' }\n if (BigInt(doc.probe) <= BigInt(t.probeSeqIn ?? '0')) return { handled: true, error: 'probe replay (nicht streng größer)' }\n // VERGIFTETE Probe (Review 21): nach einem Assembly-Konflikt wird\n // KEIN weiterer Chunk dieser Lieferung quittiert — sonst\n // kombinieren früh geackte, verlorene Pufferwirkungen mit späteren\n // Acks zu einer falschen Completion (§6a.2 übernimmt die\n // 5.2a-Konfliktregeln in kind)\n if (t.probePoison?.has(doc.probe)) return { handled: true, error: 'probe vergiftet (assembly conflict)' }\n // Re-Check nach den MAC-Awaits (Review 6, B-1): die Assembly ist\n // Tupel-Zustand und nimmt nach einer Deaktivierung nichts mehr auf\n if (t.deactivated) return { handled: true, error: 'tuple deactivated' }\n // Chunk-Sammlung pro (Tupel, probe): LÜCKEN PUFFERN (Ankunftsreihen-\n // folge irrelevant, 5.2a in kind), nur eine STRIKT HÖHERE probe\n // verdrängt die offene, eine niedrigere wird verworfen; threadId-\n // Dissens verwirft; seq-Konflikt (andere Bytes) verwirft (byte-\n // identische Wiederholung fängt duplicate-known auf Envelope-Ebene).\n // Entscheidungen auf LOCALS (Review 6, B-1) — GESCHRIEBEN wird erst\n // nach Ack-Bau und letztem Re-Check, synchron mit dem Commit\n const cur = t.probeAsm\n const displaced = cur && BigInt(doc.probe) > BigInt(cur.probe)\n if (cur && !displaced && BigInt(doc.probe) < BigInt(cur.probe)) return { handled: true, error: 'below open probe assembly' }\n const a = (!cur || displaced) ? { probe: doc.probe, threadId, chunks: new Map(), lastSeq: undefined as string | undefined } : cur\n if (threadId !== a.threadId) { t.probeAsm = null; (t.probePoison ??= new Set()).add(doc.probe); return { handled: true, error: 'probe assembly conflict (threadId)' } }\n const seq = BigInt(doc.seq)\n if (a.chunks.has(doc.seq)) { t.probeAsm = null; (t.probePoison ??= new Set()).add(doc.probe); return { handled: true, error: 'probe assembly conflict (seq)' } }\n if (doc.last && a.lastSeq !== undefined) { t.probeAsm = null; (t.probePoison ??= new Set()).add(doc.probe); return { handled: true, error: 'probe assembly conflict (two last)' } }\n const candLast = doc.last ? doc.seq : a.lastSeq\n if (candLast !== undefined && seq > BigInt(candLast)) { t.probeAsm = null; (t.probePoison ??= new Set()).add(doc.probe); return { handled: true, error: 'seq beyond last' } }\n // auch BEREITS GEPUFFERTE Chunks oberhalb von last verwerfen die\n // Assembly (Review 16, B-1 — 5.2a in kind, Ankunftsreihenfolge egal)\n if (candLast !== undefined) for (const s of a.chunks.keys()) if (BigInt(s) > BigInt(candLast)) { t.probeAsm = null; (t.probePoison ??= new Set()).add(doc.probe); return { handled: true, error: 'seq beyond last (gepuffert)' } }\n // Komplettierung VOR dem Puffern vorhersagen (Review 5, B-4 — die\n // Star-Struktur gespiegelt): jeder NICHT-komplettierende Chunk (auch\n // ein früh eintreffender last:true) wird nach den Per-Chunk-Gates\n // quittiert und gepuffert; NUR der KOMPLETTIERENDE wartet auf die\n // Union-Validierung (M-2) — Ankunftsreihenfolge ist irrelevant (5.2a)\n const complete = candLast !== undefined && (() => {\n for (let i = 1n; i <= BigInt(candLast); i++) if (String(i) !== doc.seq && !a.chunks.has(String(i))) return false\n return true\n })()\n if (!complete) {\n const __ackEnv = await mkAck()\n if (t.deactivated) return { handled: true, error: 'tuple deactivated' } // Re-Check (B-1), danach kein await\n t.probeAsm = a // Übernahme JETZT — synchron mit Puffern + Commit (B-5)\n if (doc.last) a.lastSeq = doc.seq\n a.chunks.set(doc.seq, doc.blinded)\n return { handled: true, partial: true, ack: commitAck(__ackEnv) }\n }\n // Union aus Puffer + aktuellem Chunk OHNE Mutation; globale\n // Sortierung + Duplikatfreiheit (§6a.2)\n const union: string[] = []\n for (let i = 1n; i <= BigInt(candLast!); i++) union.push(...(String(i) === doc.seq ? doc.blinded : a.chunks.get(String(i))))\n if (!union.every((x, i, arr) => i === 0 || arr[i - 1] < x)) { t.probeAsm = null; (t.probePoison ??= new Set()).add(doc.probe); return { handled: true, error: 'probe assembly invalid (order/duplicates)' } }\n // Schnitt gegen die GEGENSEITEN-Anker des eigenen Prior-Candidate-Sets\n // — reine Rechnung, VOR dem Ack-Bau, damit zwischen Re-Check und\n // Übernahme kein await mehr liegt (Review 5, B-1)\n const matches = []\n for (const cp of t.priorCands?.counterpart ?? []) {\n if (cp === key) continue // §6a: das frische Tupel selbst ist NIE ein prior (Selbst-Ketten-Schutz)\n if (union.includes(await hmacU(kp, cp))) matches.push(cp)\n }\n const __ackEnv = await mkAck() // JETZT ist alles validiert (M-2)\n if (t.deactivated) return { handled: true, error: 'tuple deactivated' } // Re-Check (B-1), danach kein await bis zum Commit\n // Übernahme + Cache + Ack in EINEM synchronen Zug (B-5); die\n // Kettenwahl mutiert ebenfalls synchron — erst DANACH die fehlbare\n // Outbound-Produktion (ihr Scheitern hinterlässt eine Pflicht)\n t.probeAsm = null\n if (BigInt(doc.probe) > BigInt(t.probeSeqIn ?? '0')) t.probeSeqIn = doc.probe // monoton (B-1)\n if (t.probePoison) for (const ps of t.probePoison) if (BigInt(ps) <= BigInt(t.probeSeqIn)) t.probePoison.delete(ps) // Gift unterhalb des High-Water ist gegenstandslos\n const ack = commitAck(__ackEnv)\n if (!matches.length) { say(p, `Probe von ${t.name}: kein Match — ehrlich eine neue Beziehung`); return { handled: true, matches: 0, ack } }\n const outbound = []\n let chained = false\n let outboundError\n if (iAmRecord(t, key)) {\n // Record-Seite: einmal wählen, endgültig — „the record side chains\n // atomically with issuing its choice\" (Review 12, B-2): erst das\n // Wahl-Mapping FEHLBAR vorbereiten, dann Wahl + Kette + Ausgabe in\n // EINEM synchronen Zug; scheitert die Vorbereitung, wird NICHT\n // gekettet und die volle Wahl-Pflicht bleibt stehen (Flush holt sie\n // atomar nach)\n if (!t.contChosen) {\n // Wahl frei — hier: der erste LEBENDE, KETTBARE Match (Review 19,\n // B-4: ein von einem konkurrierenden Tupel verbrauchter erster\n // Match blockiert die weiteren gültigen nicht; reichste Historie\n // wäre App-Sache). Kette ZUERST (Review 13, B-1): „chains\n // atomically with issuing its choice\" heißt beides oder keins.\n for (const choice of matches) {\n if (p.contacts.get(choice)?.deactivated) continue // toter prior → nächster Match\n let prep: any\n try { prep = await prepareContMapping(p, key, choice, when, ent) }\n catch (err: any) {\n // die Pflicht trägt ALLE Matches (Review 20, B-3): wird der\n // erste vor dem Flush unkettbar, versucht der Flush die\n // übrigen lebenden Kandidaten\n t.contMappingDue = { prior: choice, kind: 'choice', alts: matches.filter((x) => x !== choice) }\n outboundError = String(err?.message ?? err)\n break\n }\n if (t.deactivated || t.contChosen) break\n chained = chainTuple(p, key, choice, when)\n if (!chained) continue // Rennen verloren → nächster lebender Match\n t.contChosen = choice\n if (t.contMappingDue?.kind === 'choice') delete t.contMappingDue // die alte Bau-Pflicht ist ERFÜLLT (Review 14, B-2)\n outbound.push(commitContMapping(prep))\n const v2Err = await v2Reissue(p, key, when, ent, outbound)\n if (v2Err) outboundError = outboundError ? outboundError + ' · ' + v2Err : v2Err\n break\n }\n }\n } else {\n // Nicht-Record: Match-Report (löst NIE eine Kette aus)\n if (!t.contReported) {\n t.contReported = matches[0]\n try { outbound.push(await buildMapping(p, key, matches[0], when, ent)) }\n catch (err: any) { t.contMappingDue = { prior: matches[0], kind: 'report' }; outboundError = String(err?.message ?? err) }\n }\n }\n return { handled: true, matches: matches.length, chained, name: chained ? t.name : undefined, outbound, outboundError, ack }\n}\n\nasync function handleMapping (p: Person, { key, t }: any, artifact: any, when: number, ent: any, mkAck: () => Promise<any>, commitAck: (env: any) => any) {\n if (!C.shaped(artifact ?? {}, { body: 'object', proof: 'object' })\n || !C.shaped(artifact.body, { prior: 'string', next: 'string', to: 'string' })\n || typeof artifact.proof.mac1 !== 'string' || typeof artifact.proof.mac2 !== 'string') return { handled: true, error: 'malformed mapping' }\n const body = artifact.body\n const { mac1, mac2 } = artifact.proof\n const fail = (why: string) => { say(p, `Kontinuitäts-Mapping verworfen: ${why}`); return { handled: true, error: why } }\n if (body.to !== t.channel.own.anchor) return fail('to ≠ eigener neuer Anker')\n if (body.next !== key) return fail('next ≠ neuer Anker der Gegenseite')\n // prior MUSS im Schnappschuss liegen (nie das frische Tupel, nie tiefere Kettenglieder)\n if (body.prior === key) return fail('prior = frisches Tupel (§6a)') // Selbst-Ketten-Schutz, auch bei vergiftetem Schnappschuss\n if (!(t.priorCands?.counterpart ?? []).includes(body.prior)) return fail('prior nicht im Prior-Candidate-Set')\n const old = p.contacts.get(body.prior)\n if (!old?.channel?.own) return fail('alte Beziehung ohne eigenen Kontext')\n const msg = jcs(body)\n if ((await hmacU(await kMac(old.channel.own.x.priv, old.channel.counterpartKa, 'rltp/visibility/mac/cont1'), msg)) !== mac1) return fail('mac1 (alter Beziehungs-Schlüssel)')\n if ((await hmacU(await kMac(t.channel.own.x.priv, t.channel.counterpartKa, 'rltp/visibility/mac/cont2'), msg)) !== mac2) return fail('mac2 (neuer Beziehungs-Schlüssel)')\n // 6.4, die GENERISCHE Revisionsregel im (next, to)-Scope (Review 11,\n // B-2): höher ersetzt · gleich + JCS-identischer Body = idempotenter\n // Repeat (No-op, geackt) · gleich + anderer Body = Äquivokation ·\n // niedriger = reject. Der Revisionsstand rückt erst NACH allen\n // Ablehnungsgründen vor (Record-Freeze gilt whatever its revision)\n if (BigInt(body.revision) === BigInt(t.contRevIn ?? '0')) {\n if (t.contBodyIn && msg === t.contBodyIn) {\n const __ackEnv = await mkAck()\n if (t.deactivated) return fail('tuple deactivated')\n return { handled: true, idempotent: true, ack: commitAck(__ackEnv) }\n }\n return fail('Äquivokation — gleiche Revision, anderer Body')\n }\n if (BigInt(body.revision) < BigInt(t.contRevIn ?? '0')) return fail('mapping revision (niedriger)')\n const senderIsRecord = key < t.channel.own.anchor\n // Record-Freeze VOR Ack und Revisionsstand (B-3): ein verworfenes\n // Dokument konsumiert weder Revision noch Krypto\n if (senderIsRecord && t.contRecordPrior && t.contRecordPrior !== body.prior) return fail('Äquivokation — Record-Wahl ist eingefroren')\n // §6a.4/6.4: „On verification of a record-side mapping, chain\" —\n // wurde der genannte alte Kopf von einem KONKURRIERENDEN Tupel\n // gekettet, ist die Kette hier nicht möglich: ablehnen statt\n // Freeze + Ack + Alignment ohne Kette (Review 14, B-3). ABER: „a\n // head deactivated by THIS VERY chaining remains a valid prior for\n // this tuple\" (Review 15) — eine höhere Revision derselben\n // eingefrorenen Wahl wird per 6.4 normal verarbeitet\n const priorTaken = () => old.deactivated && old.chainedInto !== key\n if (senderIsRecord && priorTaken()) return fail('prior von konkurrierendem Tupel gekettet (§6.4) — nicht kettbar')\n const __ackEnv = await mkAck() // alle Gates bestanden — VOR der Mutation\n if (t.deactivated) return fail('tuple deactivated') // Re-Check (B-1), danach kein await bis zum Commit\n if (senderIsRecord && priorTaken()) return fail('prior von konkurrierendem Tupel gekettet (§6.4) — nicht kettbar') // Re-Check (B-3)\n // Effekt (Revision, Freeze, Kette) + Cache + Ack in EINEM synchronen\n // Zug (Review 6, B-5/B-1); die fehlbare Outbound-Produktion läuft\n // DANACH — ihr Scheitern hinterlässt die Pflicht (contMappingDue),\n // nie einen halben Commit\n t.contRevIn = body.revision\n t.contBodyIn = msg // für den Idempotenz-Vergleich (Review 11, B-2)\n const outbound: any[] = []\n let chainedNow = false // das ECHTE Kettenergebnis (Review 14, B-3), nie eine Ableitung\n const done = (extra: any = {}) => ({ handled: true, chained: chainedNow, name: t.name, outbound, ack, ...extra })\n let ack: any\n if (senderIsRecord) {\n t.contRecordPrior = body.prior\n // nach den Re-Checks garantiert kettbar ODER schon in GENAU dieses\n // Tupel gekettet (Re-Verifikation derselben Wahl, Review 15)\n chainedNow = chainTuple(p, key, body.prior, when) || old.chainedInto === key\n // „the non-record side's match-report duty … dies on verifying the\n // record side's mapping on that tuple\" (Review 11, B-3): der alte\n // Match-Report wird retired — nie mehr gesendet (stale\n // counter-claim MUST NOT be sent), sein Ack-Ref bleibt erhalten\n for (const o of (t.outbox ?? new Map()).values()) if (o.kind === 'continuity-mapping' && o.duty !== 'align') o.retired = true\n if (t.contMappingDue?.kind === 'report') delete t.contMappingDue\n ack = commitAck(__ackEnv)\n if (!t.contAligned) {\n // ein noch UNQUITTIERTES Alignment wird byte-identisch erneut\n // gesendet (Review 16, B-2: „is resent — same revision,\n // idempotent by 6.4\") — eine höhere Record-Revision derselben\n // Wahl prägt NIE eine zweite Alignment-Revision für dieselbe\n // offene Pflicht\n const pending = [...(t.outbox ?? new Map()).values()].find((o: any) => o.kind === 'continuity-mapping' && o.duty === 'align' && !o.retired)\n if (pending) outbound.push({ to: t, kind: 'continuity-mapping/0.1 (Retry, byte-identisch)', env: pending.env })\n else {\n // Produktion registriert in der Outbox; die Pflicht stirbt erst\n // mit dem QUITTIERTEN Dokument (Ack-Pfad setzt contAligned)\n try { outbound.push(await buildMapping(p, key, body.prior, when, ent, 'align')); if (t.contMappingDue?.prior === body.prior) delete t.contMappingDue }\n catch (err: any) { t.contMappingDue = { prior: body.prior, kind: 'align' }; return done({ outboundError: String(err?.message ?? err) }) }\n }\n }\n const v2Err = await v2Reissue(p, key, when, ent, outbound)\n if (v2Err) return done({ outboundError: v2Err })\n } else {\n // Match-Report der Nicht-Record-Seite: darf die Wahl INFORMIEREN,\n // kettet nie selbst. Die Record-Wahl darauf kettet ATOMAR mit der\n // Ausgabe ihres Mappings (Review 12, B-2): erst vorbereiten, dann\n // Wahl + Kette + Ausgabe synchron; Fehlschlag → volle Wahl-Pflicht\n if (iAmRecord(t, key) && !t.contChosen) {\n ack = commitAck(__ackEnv) // der EMPFANGS-Effekt (Revision) committet unabhängig von der Wahl\n let prep: any\n try { prep = await prepareContMapping(p, key, body.prior, when, ent) }\n catch (err: any) { t.contMappingDue = { prior: body.prior, kind: 'choice' }; return done({ outboundError: String(err?.message ?? err) }) }\n if (t.deactivated || t.contChosen) return done()\n // Kette ZUERST (Review 13, B-1): scheitert sie, keine Wahl, keine Ausgabe\n chainedNow = chainTuple(p, key, body.prior, when)\n if (chainedNow) {\n t.contChosen = body.prior\n if (t.contMappingDue?.kind === 'choice') delete t.contMappingDue // die alte Bau-Pflicht ist ERFÜLLT (Review 14, B-2)\n outbound.push(commitContMapping(prep))\n const v2Err = await v2Reissue(p, key, when, ent, outbound)\n if (v2Err) return done({ outboundError: v2Err })\n }\n } else {\n // NUR das Gegen-Mapping AUF DER GEWÄHLTEN Beziehung ist die\n // ALIGNMENT-Antwort (Review 14, B-1): body.prior = der eigene\n // alte Anker des Senders = unser Kontaktschlüssel der gewählten\n // alten Beziehung (t.contChosen). Ein Match-Report für eine\n // ANDERE gemeinsame Altbeziehung beantwortet die Wahl NICHT —\n // erst die echte Antwort beendet die Resend-Pflicht (retiren,\n // Ack-Ref bleibt; Review 13, B-2)\n if (t.contChosen && body.prior === t.contChosen) for (const o of (t.outbox ?? new Map()).values()) if (o.kind === 'continuity-mapping') o.retired = true\n ack = commitAck(__ackEnv)\n }\n }\n return done()\n}\n\n/**\n * The host's producing call for a mapping the receiver still owes\n * (review 6, B-3): a transient seal failure during probe/mapping\n * handling persists the obligation in contMappingDue; this call — not a\n * redelivery, which the freshness rule forbids — builds and returns it.\n */\nexport async function flushContinuity (p: Person, newKey: string, when: number, ent: any = {}) {\n const t = p.contacts.get(newKey)\n if (!t || t.deactivated) return { outbound: [] } // Per-Tupel-Pflichten sterben mit dem Tupel (Review 8, B-2)\n // Retry-ENTSCHEIDUNG und Pflicht-Bau laufen unter dem Kontakt-Lock\n // (Review 12, B-1): der Empfang (der Reports retired) hält denselben\n // Lock — kein Fenster, in dem ein gestarteter Flush eine gerade\n // gestorbene Report-Pflicht doch noch ausstellt („a match report\n // flushed after the choice … MUST NOT be sent\"). Nur der frische\n // Probe-Neubau läuft danach (buildProbe nimmt denselben Lock selbst).\n const r: any = await withContactLock(t, async () => {\n if (t.deactivated) return { outbound: [] }\n // unquittierte MAPPINGS: byte-identischer Retry (4.2), retired nie\n // (gestorbene Match-Report-Pflicht, Review 11, B-3). PROBEN nie\n // byte-identisch — §6a: „a resend is always a fresh probe sequence\n // with freshly sampled padding\" (Review 5, B-3): stale Einträge\n // werden RETIRED (Ack-Ref bleibt, Review 6, B-3), EINE frische\n // Probe ersetzt sie (Bau nach der Lock-Sektion)\n const retries: any[] = [...(t.outbox ?? new Map()).values()]\n .filter((o: any) => o.kind === 'continuity-mapping' && !o.retired)\n .map((o: any) => ({ to: t, kind: o.kind + '/0.1 (Retry, byte-identisch)', env: o.env }))\n const staleProbes = [...(t.outbox ?? new Map()).values()].filter((o: any) => o.kind === 'continuity-probe' && !o.retired)\n let probeDue = false\n if (staleProbes.length) { for (const o of staleProbes) o.retired = true; probeDue = true }\n if (!t.contMappingDue) return { outbound: retries, probeDue }\n // Single-Flight (Review 7, B-3): zwei parallele Flushes liefern nie\n // zwei Mappings für EINE Pflicht\n if (t.contFlushPending) return { outbound: retries, pending: true, probeDue }\n t.contFlushPending = true\n try {\n const due = t.contMappingDue\n // eine Choice-Pflicht nach bereits GEFALLENER Wahl ist tot\n // (Review 14, B-2): der Direktpfad hat sie erfüllt oder ersetzt —\n // sie darf NIE in den generischen Bau fallen (der eine frische\n // Revision prägte statt der Same-Revision-Wiederholung)\n if (due.kind === 'choice' && t.contChosen) {\n if (t.contMappingDue === due) delete t.contMappingDue\n return { outbound: retries, probeDue }\n }\n if (due.kind === 'choice' && !t.contChosen) {\n // die nachgeholte RECORD-WAHL kettet atomar mit der Ausgabe\n // (Review 12, B-2) und ITERIERT alle bekannten Matches\n // (Review 20, B-3): erster lebender, kettbarer Kandidat\n // gewinnt; sind alle tot, stirbt die Pflicht ehrlich\n // ungekettet (spätere Probes wählen neu). Ein Bau-Fehler\n // wirft → der äußere catch hält die Pflicht am Leben.\n const cands = [...new Set([due.prior, ...(due.alts ?? [])])]\n for (const cand of cands) {\n if (p.contacts.get(cand)?.deactivated) continue\n const prep = await prepareContMapping(p, newKey, cand, when, ent)\n if (t.deactivated) return { outbound: retries, probeDue }\n if (t.contChosen) break\n if (!chainTuple(p, newKey, cand, when)) continue // Rennen verloren → nächster Kandidat\n t.contChosen = cand\n retries.push(commitContMapping(prep))\n break\n }\n if (t.contMappingDue === due) delete t.contMappingDue\n return { outbound: retries, probeDue }\n }\n const mapping = await buildMapping(p, newKey, due.prior, when, ent, due.kind)\n // der Flush stellt GENAU den Zustand her, den der gelungene\n // Direktpfad hinterlassen hätte — kind-bewusst. Und er löscht NUR\n // die Pflicht, die er selbst gebaut hat: ist während des await\n // eine NEUERE an ihre Stelle getreten, bleibt sie stehen (Review\n // 8, B-3); aligned setzt erst der ACK — hier stirbt die BAU-Pflicht\n if (t.contMappingDue === due) delete t.contMappingDue\n return { outbound: [...retries, mapping], probeDue }\n } catch (err: any) {\n return { outbound: retries, probeDue, outboundError: String(err?.message ?? err) }\n } finally { t.contFlushPending = false }\n })\n if (r.probeDue) {\n try { r.outbound.push(...(await buildProbe(p, newKey, when, { ...ent, pad: undefined, threadId: undefined }) ?? [])) }\n catch (err: any) { r.outboundError = r.outboundError ? r.outboundError + ' · ' + String(err?.message ?? err) : String(err?.message ?? err) }\n }\n delete r.probeDue\n return r\n}\n"]}
|
|
1
|
+
{"version":3,"file":"continuity.js","sourceRoot":"","sources":["../../src/probe/continuity.ts"],"names":[],"mappings":"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","sourcesContent":["// continuity.mjs — rltp-visibility §6a im Simulator: continuity-probe@1 +\n// continuity-mapping@1. „Kontinuität wird NACH der Zeremonie aufgelöst,\n// nie in ihr\" (Encounter 4.4): jedes Enactment UND jede Vorstellung prägt\n// ein frisches Tupel; ob es ein Wiedersehen war, klärt die Probe über den\n// frischen Kanal — automatisch, ohne Dialog, ohne Namen.\n//\n// Die Probe ist das dritte Mitglied EINER Familie (Stern, Mapping, Probe:\n// geblendete Werte unter Beziehungs-Schlüsseln): die EIGENEN bisherigen\n// pair-Anker reisen als HMAC unter k_p (DH des NEUEN Kanals), gepolstert\n// auf Vielfache von 256, sortiert, sequenziert. Nur wer eine der\n// Beziehungen wirklich hält, kann matchen; ein leerer Bestand sendet\n// trotzdem (sonst leakte die Abwesenheit die Kardinalität „null\").\n//\n// Die Maschine (6a.4): EIN Wähler (Record-Seite = lexikographisch\n// kleinerer neuer pair-Anker), EINE endgültige Wahl (eingefroren,\n// Abweichung = Äquivokation), EIN Auslöser (Record-Seite kettet atomar\n// mit ihrer Wahl; die Gegenseite NUR auf deren verifiziertes Mapping —\n// ihr eigenes ist ein Match-Report). Kette: neues Tupel wird Kopf, das\n// alte deaktiviert; Evidenz akkumuliert AUF DER BEZIEHUNG (✓ bleibt ✓),\n// für Dritte unsichtbar. Wer die Probe nicht beantworten kann, IST\n// protokollisch eine neue Beziehung (Identity 9.3).\nimport { jcs, makeValidator } from '../core.js'\nimport { SCHEMAS } from '../schemas.js'\nimport * as C from './deps.js'\nimport type { Person } from './deps.js'\nimport { hmac, hmacU, reissueTrust, chainAdmission, withContactLock, withIssueLock } from './trust.js'\nimport { buildAck, ACK_TYPE } from './acks.js'\n\nconst say = (p: Person, m: string) => p.log.push(m)\nconst CHUNK = 256\nconst V = makeValidator(SCHEMAS)\nconst schemaOk = (file: string, data: any) => V.validate(data, SCHEMAS[file], SCHEMAS[file]).length === 0\n\n// ── Schlüssel (Spec-Infostrings, richtungsgebunden) ─────────────────────\n// k_p = HKDF(ECDH(newPairX_sender, newPairX_recipient),\n// 'rltp/visibility/blind/probe/' + senderNewPair + '/' + recipientNewPair)\nconst kProbe = async (xPriv: CryptoKey, theirKa: string, senderAnchor: string, recipientAnchor: string) =>\n C.hkdf(await C.ecdh(xPriv, C.xRawOfMk(theirKa)!), 'rltp/visibility/blind/probe/' + senderAnchor + '/' + recipientAnchor)\nconst kMac = async (xPriv: CryptoKey, theirKa: string, info: string) =>\n C.hkdf(await C.ecdh(xPriv, C.xRawOfMk(theirKa)!), info)\n\n// ── Schnappschuss-Helfer (Prior-Candidate-Set, Sicht des Halters) ───────\n// wird von introduce.mjs BEI TUPEL-ERZEUGUNG aufgerufen: aktive Heads,\n// das frische Tupel selbst ausgeschlossen; deaktivierte Glieder nie.\nexport const snapshotPriors = (p: Person) => ({\n own: [...p.contacts.values()].filter((c) => !c.deactivated && c.channel?.own).map((c) => c.channel.own.anchor),\n counterpart: [...p.contacts.entries()].filter(([, c]) => !c.deactivated).map(([k]) => k),\n})\n\n// ── continuity-probe@1: bauen ───────────────────────────────────────────\n// Sequenzvergabe SYNCHRON (BigInt-String — 18 Stellen exakt), Bau je\n// Kontakt serialisiert: zwei parallele buildProbe-Aufrufe teilen nie\n// eine Sequenz, und der Wire-Wert ist der reservierte (Review 2, B-1)\nconst withContLock = withContactLock // EIN Lock je Kontakt, geteilt mit trust (Review 4, B-1)\nexport async function buildProbe (p: Person, newKey: string, when: number, ent: any = {}) {\n const t = p.contacts.get(newKey)\n if (!t?.channel?.own || t.deactivated) return null // deaktivierte Tupel stellen nichts aus (Review 8, B-2)\n return withContLock(t, async () => {\n if (t.deactivated) return null // Re-Check nach dem Lock-Erwerb\n // Sequenz nur GEPEEKT (Review 25): „assigning … and committing are\n // one step\" — ein Bau-Fehler verbraucht nichts, auch am letzten\n // Wert entsteht nie falsche Erschöpfung; committet wird synchron\n // mit der Outbox (persisted atomically before send)\n const nextProbe = BigInt(t.probeSeqOut ?? '0') + 1n\n if (nextProbe > 10n ** 18n - 1n) throw new Error('scope exhausted — issues nothing further (2.1)')\n const probeSeq = String(nextProbe)\n const kp = await kProbe(t.channel.own.x.priv, t.channel.counterpartKa, t.channel.own.anchor, newKey)\n const entries = []\n // §6a: prior ist „nie das frische Tupel\" — Hygiene am NUTZUNGSORT:\n // ein Host, der das Set nach der Tupel-Anlage (neu) schnappschießt,\n // darf keine Selbst-Kette provozieren können (Selbst-Match →\n // chainTuple(key, key) deaktivierte den eigenen Kopf)\n for (const a of t.priorCands?.own ?? []) if (a !== t.channel.own.anchor) entries.push(await hmacU(kp, a))\n // Polstern auf das nächste Vielfache von 256 (leerer Bestand → 1 Voll-Polster-Chunk);\n // KOLLISION → Neusampling (Review 6, MAJOR: „the padding value is\n // resampled\") — ein injizierter ent.pad wird höchstens EINMAL\n // verwendet, Duplikate fallen auf frische Zufallswerte zurück\n const total = Math.max(CHUNK, Math.ceil(entries.length / CHUNK) * CHUNK)\n const used = new Set(entries)\n while (entries.length < total) {\n let v = 'u' + C.b64uOf(ent.pad ?? C.rand(32))\n while (used.has(v)) v = 'u' + C.b64uOf(C.rand(32))\n used.add(v)\n entries.push(v)\n }\n entries.sort()\n // Bau + Seal + Digest sind FEHLBAR und warten — vorbereiten, dann\n // Re-Check, dann Outbox-Schreibungen synchron (Review 9, B-3: ein\n // während der Awaits deaktiviertes Tupel stellt nichts aus)\n const preps = []\n const threadId = ent.threadId ?? globalThis.crypto.randomUUID()\n for (let i = 0; i * CHUNK < entries.length; i++) {\n const body = { type: 'continuity-probe@1', probe: probeSeq, seq: String(i + 1), last: (i + 1) * CHUNK >= entries.length, blinded: entries.slice(i * CHUNK, (i + 1) * CHUNK) }\n const artifact = { body, proof: { mac: await hmacU(kp, jcs(body)) } }\n const doc = { id: globalThis.crypto.randomUUID(), type: 'https://real-life.org/trust-tasks/continuity-probe/0.1', issuer: t.channel.own.anchor, recipient: newKey, threadId, issuedAt: C.iso(when), payload: artifact }\n const env = await C.seal(doc, t.channel.counterpartKa, ent)\n const digest = await C.digestDoc(doc)\n preps.push({ digest, env })\n }\n if (t.deactivated) return null // Re-Check (B-3), danach kein await\n // COMMIT — Sequenz + Outbox in EINEM synchronen Zug (Review 25):\n // byte-identische Redelivery-Zuordnung fürs Ack-Matching (4.2;\n // erneut SENDEN tut ein Retry nie, §6a)\n t.probeSeqOut = probeSeq\n const outbound = []\n for (const { digest, env } of preps) {\n ;(t.outbox ??= new Map()).set(digest, { env, threadId, kind: 'continuity-probe' })\n outbound.push({ to: t, kind: 'continuity-probe/0.1 (geblendet, gepolstert, versiegelt)', env })\n }\n say(p, `Kontinuitäts-Probe an ${t.name}: ${t.priorCands?.own.length ?? 0} eigene Beziehungs-Anker, geblendet + gepolstert (${entries.length})`)\n return outbound\n })\n}\n\n// ── continuity-mapping@1: bauen ─────────────────────────────────────────\n// prior = EIGENER alter pair-Anker · next = eigener neuer · to = neuer der\n// Gegenseite; mac1 unter dem ALTEN Beziehungs-Schlüssel, mac2 unter dem\n// NEUEN — nur derselbe Schlüssel-Inhaber kann beide (für die Adressatin\n// fälschbar: Klasse V, abstreitbar).\n// PREPARE (fehlbar: MACs, Seal, Digest — mutiert nichts) und COMMIT\n// (synchron: Zähler + Outbox) getrennt (Review 12, B-2): die Record-\n// Wahl kettet ATOMAR mit der Ausgabe ihres Mappings — beide Schritte\n// liegen dann in EINEM synchronen Zug. Alle Aufrufer laufen unter dem\n// Kontakt-Lock des Tupels (Handler + Flush), der die Revisionsvergabe\n// serialisiert; buildMapping hält zusätzlich den Issue-Lock.\nasync function prepareContMapping (p: Person, newKey: string, oldKey: string, when: number, ent: any = {}, duty?: string) {\n const t = p.contacts.get(newKey), old = p.contacts.get(oldKey)\n if (t.deactivated) throw new Error('tuple deactivated — issues nothing (§6.4)')\n // 6.4/6a.4: Revision je (next, to) monoton — nur gepeekt, ein\n // Fehlschlag verbraucht nichts (§6.4: one step per scope)\n const nextRev = BigInt(t.contRevOut ?? '0') + 1n\n if (nextRev > 10n ** 18n - 1n) throw new Error('scope exhausted — issues nothing further (2.1)')\n const rev = String(nextRev)\n const body = { type: 'continuity-mapping@1', prior: old.channel.own.anchor, next: t.channel.own.anchor, to: newKey, revision: rev, issuedAt: C.iso(when) }\n const msg = jcs(body)\n const artifact = { body, proof: {\n mac1: await hmacU(await kMac(old.channel.own.x.priv, old.channel.counterpartKa, 'rltp/visibility/mac/cont1'), msg),\n mac2: await hmacU(await kMac(t.channel.own.x.priv, t.channel.counterpartKa, 'rltp/visibility/mac/cont2'), msg) } }\n const doc = { id: globalThis.crypto.randomUUID(), type: 'https://real-life.org/trust-tasks/continuity-mapping/0.1', issuer: t.channel.own.anchor, recipient: newKey, threadId: ent.threadId ?? globalThis.crypto.randomUUID(), issuedAt: C.iso(when), payload: artifact }\n const env = await C.seal(doc, t.channel.counterpartKa, ent)\n const digest = await C.digestDoc(doc)\n return { t, rev, env, digest, threadId: doc.threadId, duty, prior: old.channel.own.anchor }\n}\nconst commitContMapping = (prep: any) => {\n prep.t.contRevOut = prep.rev\n ;(prep.t.outbox ??= new Map()).set(prep.digest, { env: prep.env, threadId: prep.threadId, kind: 'continuity-mapping', duty: prep.duty, prior: prep.prior })\n return { to: prep.t, kind: 'continuity-mapping/0.1 (mac1 alt · mac2 neu, versiegelt)', env: prep.env }\n}\nasync function buildMapping (p: Person, newKey: string, oldKey: string, when: number, ent: any = {}, duty?: string) {\n const t = p.contacts.get(newKey)\n return withIssueLock(t, async () => {\n const prep = await prepareContMapping(p, newKey, oldKey, when, ent, duty)\n if (t.deactivated) throw new Error('tuple deactivated — issues nothing (§6.4)') // Re-Check (B-2), danach kein await\n return commitContMapping(prep)\n })\n}\n\n// ── die Kette: neues Tupel wird Kopf, das alte deaktiviert ──────────────\n// Visibility 0.29 §6.4: PER-TUPEL-ZUSTAND WANDERT NICHT — Grade,\n// Stern-Salts, Baseline und empfangene Sterne sterben mit dem alten\n// Kopf (der neue beginnt fail-closed; das Fenster schließen 5.5s\n// Neuausstellung und das New-Head-Korollar von 5.4, nie eine\n// Migration). KETTEN-Ebene wandert: Kontakt-Gedächtnis, Evidenz\n// (✓ akkumuliert), das WISSEN um den offengelegten Anker (die\n// Admissionsschicht hängt an der Beziehung), die eigene\n// Vertrauens-ENTSCHEIDUNG (trustGiven) und die Pause.\nfunction chainTuple (p: Person, newKey: string, oldKey: string, when: number) {\n const head = p.contacts.get(newKey), old = p.contacts.get(oldKey)\n if (!head || !old || head === old || old.deactivated) return false // idempotent; NIE Selbst-Kette (§6a)\n old.deactivated = true\n old.chainedInto = newKey\n head.chain = [...(old.chain ?? []), oldKey]\n // Zustands-Vorrang entlang der Kette (Encounter 4.2, „evidence accumulates\n // on the relationship through its chain\"): ✓ > Zeremonie-Richtung (→/←)\n // > Vorstellung (⇄). Eine einseitige Zeremonie ist stärker als eine\n // Vorstellung — der Kopf verliert seine Richtung nicht an ein ⇄\n if (old.state === '✓' || head.state === '✓') { head.state = '✓'; head.provenance = 'ceremony' }\n else if (head.state === '→' || head.state === '←') { /* die Richtung des Kopfes bleibt */ }\n else if (old.state === '→' || old.state === '←') { head.state = old.state; head.provenance = 'ceremony' }\n else if (old.state === '⇄' || head.state === '⇄') head.state = '⇄'\n head.since = [old.since, head.since].filter(Boolean).sort()[0]\n head.name = old.name // lokales Kontakt-Gedächtnis\n head.selfAnchor ??= old.selfAnchor // Ketten-WISSEN: wer das ist (das Mapping selbst stirbt mit dem Tupel, §6.4)\n const oldRel = old.relId ?? oldKey\n // Admission (B-4): der neue Kopf löst über die überlebende Beziehung\n // auf; ein schon existierender Eintrag der frischen Beziehung\n // verschmilzt atomar (früheste Position, Aliase, k−1). Die\n // IDENTITÄT ist die des TATSÄCHLICH überlebenden Eintrags (Review\n // 36: „the merged relationship's identity is the surviving\n // entry's\") — existiert nur der frische, bleibt DESSEN Identität;\n // existiert keiner, die des jüngsten Kopfs (Review 4, B-4)\n const survivor = chainAdmission(p, oldRel, newKey, newKey, when)\n // Ketten-Identität = die des Survivors NUR, wenn sie zu DIESER Kette\n // gehört (Review 36 + 37, B-1): die kanonische Identität eines\n // Weg-2-Merges gehört einer ANDEREN, weiterhin aktiven Beziehung —\n // Admission-Identität und Beziehungsstrang bleiben unterscheidbar,\n // der Abgang dieser Kette darf die andere nie mitreißen\n const sid = survivor?.id\n const sidInChain = sid !== undefined && (sid === oldRel || sid === newKey || (p.contacts.get(sid)?.relId ?? null) === oldRel)\n head.relId = sidInChain ? sid : (survivor ? oldRel : newKey)\n // die GANZE Kette identifiziert sich als DIESE Beziehung — auch der\n // alte Kopf (Review 36: der Abgang räumt sämtliche Ketten-Aliase)\n old.relId = head.relId\n head.trustGiven ??= old.trustGiven // die Entscheidung gehört der Beziehung (V2)\n // 5.5: „MUST re-issue its most recently ISSUED grade\" — der\n // Ordnungsstempel entscheidet, nie der zufällig frischere Kopf\n // (Review 27: setGrade auf dem alten Kopf NACH dem Trust-Akt des\n // frischen muss die Kettung überleben)\n if (old.gradeOutLast !== undefined && (head.gradeOutLast === undefined || (old.gradeOutOrder ?? 0n) > (head.gradeOutOrder ?? 0n))) {\n head.gradeOutLast = old.gradeOutLast\n head.gradeOutOrder = old.gradeOutOrder\n }\n // Pause ist chain-level und ÜBERLEBT die Kettung (Review 37, B-2):\n // der Zustand der Beziehung, auf die gekettet wird, gewinnt gegen\n // Vor-Kettungs-Akte des frischen Tupels\n head.trustPaused = old.trustPaused ?? head.trustPaused\n head.sharedGroups = [...new Set([...(old.sharedGroups ?? []), ...(head.sharedGroups ?? [])])]\n // NICHT migriert (per Tupel, stirbt mit dem alten Kopf):\n // trustReceived, starReceived, starInfo, starSaltIn, sentMapping,\n // sub (Baseline/inFlight), starSeqNext. Die 5.5-Neuausstellung ist\n // die stehende Pflicht des neuen Kopfs; ihr Producer ist\n // trust.reissueTrust via starRefreshAll.\n // die Pflicht entsteht, wenn eine DECLARATION ausgestellt war (5.5:\n // „a subject holding an issued declaration … MUST re-issue\") — auch\n // ohne Trust-Akt (eigenständiges setGrade); Review 33, B-1\n if (head.trustGiven || head.gradeOutLast !== undefined) head.trustReissueDue = true\n say(p, `Kontinuität: ${head.name} wiedererkannt — neues Tupel an die Beziehung gekettet (${head.state}, ${head.chain.length + 1} Enactments)`)\n return true\n}\n\n// V2-Hook (5.5): direkt nach der Kettung wird die Neuausstellung\n// versucht; ein Bau-Fehler lässt die Pflicht (trustReissueDue) stehen —\n// ihr Producer ist starRefreshAll, nie eine Wiederzustellung.\nasync function v2Reissue (p: Person, newKey: string, when: number, ent: any, outbound: any[]): Promise<string | undefined> {\n const t = p.contacts.get(newKey)\n if (!t?.trustReissueDue) return undefined\n try {\n const r = await reissueTrust(p, newKey, when, ent)\n if (r) outbound.push(...r.outbound)\n return undefined\n } catch (e: any) { return String(e?.message ?? e) }\n}\n\n// ── Empfangs-Dispatch ───────────────────────────────────────────────────\nconst iAmRecord = (t: any, newKey: string) => t.channel.own.anchor < newKey // lexikographisch kleinerer NEUER Anker\nconst tupleOf = (p: Person, rkid: string) => {\n const ctx = p.contexts.get(rkid)\n if (!ctx) return null\n const e = [...p.contacts.entries()].find(([, c]) => c.channel?.own?.anchor === ctx.anchor)\n return e ? { key: e[0], t: e[1], ctx } : null\n}\n\nconst TT_PROBE = 'https://real-life.org/trust-tasks/continuity-probe/0.1'\nconst TT_MAP = 'https://real-life.org/trust-tasks/continuity-mapping/0.1'\nexport async function receiveContinuity (p: Person, env: any, when: number, ent: any = {}) {\n const opened = await C.openEnvelope(p, env) // Stufen 1–4, Cache-Lesung\n if (opened.error) return { handled: false }\n const hit = tupleOf(p, env.rkid)\n if (!hit) return { handled: false }\n if (opened.duplicate) {\n // 4.2: byte-identischer Re-Ack innerhalb der Retention\n const stored = hit.t.ackStore?.get(opened.digest)\n return { handled: true, duplicate: true, ack: stored ? { to: hit.t, kind: 'delivery-ack/0.1 (Re-Ack, byte-identisch)', env: stored } : undefined }\n }\n const doc = opened.doc\n if (doc?.type !== TT_PROBE && doc?.type !== TT_MAP) return { handled: false, doc }\n // Dokumentprofil (Delivery §3) + Artefakt-Schema (Stufen 5/7)\n if (!schemaOk('rltp-delivery-document.schema.json', doc) || doc.proof !== undefined) return { handled: true, error: 'malformed document' }\n // Stufe 5: recipient; die issuer-Bindung (Stufe 8) läuft NACH den\n // Payload-Schemata (Review 32)\n if (doc.recipient !== hit.t.channel.own.anchor) return { handled: true, error: 'outer binding (recipient)' }\n // Kalender-Validität des DOKUMENTS (Review 12, B-3); die PAYLOAD-\n // Kalenderprüfung sitzt NACH dem Artefakt-Schema (Review 31)\n if (!C.calOK(doc.issuedAt)) return { handled: true, error: 'calendar-invalid issuedAt' }\n if (doc.type === TT_PROBE && !schemaOk('visibility-continuity-probe.schema.json', doc.payload)) return { handled: true, error: 'malformed probe' }\n if (doc.type === TT_MAP && !schemaOk('visibility-continuity-mapping.schema.json', doc.payload)) return { handled: true, error: 'malformed mapping' }\n if (doc.type === TT_MAP && !C.calOK(doc.payload?.body?.issuedAt)) return { handled: true, error: 'calendar-invalid issuedAt' } // Stufe 8, nach dem Schema (Review 31)\n if (doc.issuer !== hit.key) return { handled: true, error: 'outer binding (issuer, Stufe 8)' }\n // Profil-Regel (Review 29/30): Stufe 8 NACH dem Payload-Schema —\n // ein präsentes ceremony.enactment kann bei diesen Payloads nie\n // nachrechnen (kein umschlossenes Bindungsmaterial) →\n // failed(validation-failed); andere Framework-Member passieren (§4.11.1)\n if (doc.ceremony?.enactment !== undefined) return { handled: true, error: 'ceremony.enactment kann nicht nachrechnen (validation-failed)' }\n // GESAMTER Empfang unter dem Kontakt-Lock (B-1: kein Rollback durch\n // parallele Handler); der Ack entsteht IN den Handlern nach der\n // vollen Validierung (M-2), Commit hier atomar mit Cache+Store\n return withContLock(hit.t, async () => {\n // §6.4: ein deaktiviertes Tupel nimmt nichts mehr an (Review 5, B-1)\n if (hit.t.deactivated) return { handled: true, error: 'tuple deactivated' }\n // Stage-4-Reentry nach Lock-Wartezeit: ein inzwischen verarbeitetes\n // Duplikat erhält den gespeicherten Ack byte-identisch\n if ((p.deliveryCache ?? new Set()).has(opened.digest!)) {\n const stored = hit.t.ackStore?.get(opened.digest)\n return { handled: true, duplicate: true, ack: stored ? { to: hit.t, kind: 'delivery-ack/0.1 (Re-Ack, byte-identisch)', env: stored } : undefined }\n }\n const mkAck = () => buildAck(p, hit.t, opened.digest!, doc.threadId, when).then((a: any) => a.env)\n // Effekt + completed-effect cache + gespeicherter Ack committen in\n // EINEM synchronen Zug IM Handler (Review 6, B-5: „inside the\n // effect's transaction\") — die Outbound-PRODUKTION (buildMapping,\n // V2) läuft danach; ihr Scheitern hinterlässt eine Pflicht, nie\n // einen halben Empfangs-Commit\n const commitAck = (ackEnv: any) => {\n C.effectDone(p, opened.digest)\n ;(hit.t.ackStore ??= new Map()).set(opened.digest, ackEnv)\n return { to: hit.t, kind: 'delivery-ack/0.1', env: ackEnv }\n }\n return doc.type === TT_PROBE\n ? handleProbe(p, hit, doc.payload, doc.threadId, when, ent, mkAck, commitAck)\n : handleMapping(p, hit, doc.payload, when, ent, mkAck, commitAck)\n })\n}\n\nasync function handleProbe (p: Person, { key, t }: any, artifact: any, threadId: string, when: number, ent: any, mkAck: () => Promise<any>, commitAck: (env: any) => any) {\n // Schema lief im Dispatch; hier die wertgebundenen Reste (M-3)\n const doc = artifact.body\n if (!C.intStr(doc.probe) || !C.intStr(doc.seq) // NaN in probeSeqIn wäre Replay-Zustandskorruption (Review 9, P-B1)\n || doc.blinded.length !== 256) // die Chunkform ist FEST: genau 256 Einträge (Review 10, P-B1-Rest)\n return { handled: true, error: 'malformed probe' }\n // Senderseitiger k_p, aus Empfängersicht nachgerechnet (Richtung!)\n const kp = await kProbe(t.channel.own.x.priv, t.channel.counterpartKa, key, t.channel.own.anchor)\n if ((await hmacU(kp, jcs(doc))) !== artifact.proof.mac) return { handled: true, error: 'probe mac' }\n if (BigInt(doc.probe) <= BigInt(t.probeSeqIn ?? '0')) return { handled: true, error: 'probe replay (nicht streng größer)' }\n // VERGIFTETE Probe (Review 21): nach einem Assembly-Konflikt wird\n // KEIN weiterer Chunk dieser Lieferung quittiert — sonst\n // kombinieren früh geackte, verlorene Pufferwirkungen mit späteren\n // Acks zu einer falschen Completion (§6a.2 übernimmt die\n // 5.2a-Konfliktregeln in kind)\n if (t.probePoison?.has(doc.probe)) return { handled: true, error: 'probe vergiftet (assembly conflict)' }\n // Re-Check nach den MAC-Awaits (Review 6, B-1): die Assembly ist\n // Tupel-Zustand und nimmt nach einer Deaktivierung nichts mehr auf\n if (t.deactivated) return { handled: true, error: 'tuple deactivated' }\n // Chunk-Sammlung pro (Tupel, probe): LÜCKEN PUFFERN (Ankunftsreihen-\n // folge irrelevant, 5.2a in kind), nur eine STRIKT HÖHERE probe\n // verdrängt die offene, eine niedrigere wird verworfen; threadId-\n // Dissens verwirft; seq-Konflikt (andere Bytes) verwirft (byte-\n // identische Wiederholung fängt duplicate-known auf Envelope-Ebene).\n // Entscheidungen auf LOCALS (Review 6, B-1) — GESCHRIEBEN wird erst\n // nach Ack-Bau und letztem Re-Check, synchron mit dem Commit\n const cur = t.probeAsm\n const displaced = cur && BigInt(doc.probe) > BigInt(cur.probe)\n if (cur && !displaced && BigInt(doc.probe) < BigInt(cur.probe)) return { handled: true, error: 'below open probe assembly' }\n const a = (!cur || displaced) ? { probe: doc.probe, threadId, chunks: new Map(), lastSeq: undefined as string | undefined } : cur\n if (threadId !== a.threadId) { t.probeAsm = null; (t.probePoison ??= new Set()).add(doc.probe); return { handled: true, error: 'probe assembly conflict (threadId)' } }\n const seq = BigInt(doc.seq)\n if (a.chunks.has(doc.seq)) { t.probeAsm = null; (t.probePoison ??= new Set()).add(doc.probe); return { handled: true, error: 'probe assembly conflict (seq)' } }\n if (doc.last && a.lastSeq !== undefined) { t.probeAsm = null; (t.probePoison ??= new Set()).add(doc.probe); return { handled: true, error: 'probe assembly conflict (two last)' } }\n const candLast = doc.last ? doc.seq : a.lastSeq\n if (candLast !== undefined && seq > BigInt(candLast)) { t.probeAsm = null; (t.probePoison ??= new Set()).add(doc.probe); return { handled: true, error: 'seq beyond last' } }\n // auch BEREITS GEPUFFERTE Chunks oberhalb von last verwerfen die\n // Assembly (Review 16, B-1 — 5.2a in kind, Ankunftsreihenfolge egal)\n if (candLast !== undefined) for (const s of a.chunks.keys()) if (BigInt(s) > BigInt(candLast)) { t.probeAsm = null; (t.probePoison ??= new Set()).add(doc.probe); return { handled: true, error: 'seq beyond last (gepuffert)' } }\n // Komplettierung VOR dem Puffern vorhersagen (Review 5, B-4 — die\n // Star-Struktur gespiegelt): jeder NICHT-komplettierende Chunk (auch\n // ein früh eintreffender last:true) wird nach den Per-Chunk-Gates\n // quittiert und gepuffert; NUR der KOMPLETTIERENDE wartet auf die\n // Union-Validierung (M-2) — Ankunftsreihenfolge ist irrelevant (5.2a)\n const complete = candLast !== undefined && (() => {\n for (let i = 1n; i <= BigInt(candLast); i++) if (String(i) !== doc.seq && !a.chunks.has(String(i))) return false\n return true\n })()\n if (!complete) {\n const __ackEnv = await mkAck()\n if (t.deactivated) return { handled: true, error: 'tuple deactivated' } // Re-Check (B-1), danach kein await\n t.probeAsm = a // Übernahme JETZT — synchron mit Puffern + Commit (B-5)\n if (doc.last) a.lastSeq = doc.seq\n a.chunks.set(doc.seq, doc.blinded)\n return { handled: true, partial: true, ack: commitAck(__ackEnv) }\n }\n // Union aus Puffer + aktuellem Chunk OHNE Mutation; globale\n // Sortierung + Duplikatfreiheit (§6a.2)\n const union: string[] = []\n for (let i = 1n; i <= BigInt(candLast!); i++) union.push(...(String(i) === doc.seq ? doc.blinded : a.chunks.get(String(i))))\n if (!union.every((x, i, arr) => i === 0 || arr[i - 1] < x)) { t.probeAsm = null; (t.probePoison ??= new Set()).add(doc.probe); return { handled: true, error: 'probe assembly invalid (order/duplicates)' } }\n // Schnitt gegen die GEGENSEITEN-Anker des eigenen Prior-Candidate-Sets\n // — reine Rechnung, VOR dem Ack-Bau, damit zwischen Re-Check und\n // Übernahme kein await mehr liegt (Review 5, B-1)\n const matches = []\n for (const cp of t.priorCands?.counterpart ?? []) {\n if (cp === key) continue // §6a: das frische Tupel selbst ist NIE ein prior (Selbst-Ketten-Schutz)\n if (union.includes(await hmacU(kp, cp))) matches.push(cp)\n }\n const __ackEnv = await mkAck() // JETZT ist alles validiert (M-2)\n if (t.deactivated) return { handled: true, error: 'tuple deactivated' } // Re-Check (B-1), danach kein await bis zum Commit\n // Übernahme + Cache + Ack in EINEM synchronen Zug (B-5); die\n // Kettenwahl mutiert ebenfalls synchron — erst DANACH die fehlbare\n // Outbound-Produktion (ihr Scheitern hinterlässt eine Pflicht)\n t.probeAsm = null\n if (BigInt(doc.probe) > BigInt(t.probeSeqIn ?? '0')) t.probeSeqIn = doc.probe // monoton (B-1)\n if (t.probePoison) for (const ps of t.probePoison) if (BigInt(ps) <= BigInt(t.probeSeqIn)) t.probePoison.delete(ps) // Gift unterhalb des High-Water ist gegenstandslos\n const ack = commitAck(__ackEnv)\n if (!matches.length) { say(p, `Probe von ${t.name}: kein Match — ehrlich eine neue Beziehung`); return { handled: true, matches: 0, ack } }\n const outbound = []\n let chained = false\n let outboundError\n if (iAmRecord(t, key)) {\n // Record-Seite: einmal wählen, endgültig — „the record side chains\n // atomically with issuing its choice\" (Review 12, B-2): erst das\n // Wahl-Mapping FEHLBAR vorbereiten, dann Wahl + Kette + Ausgabe in\n // EINEM synchronen Zug; scheitert die Vorbereitung, wird NICHT\n // gekettet und die volle Wahl-Pflicht bleibt stehen (Flush holt sie\n // atomar nach)\n if (!t.contChosen) {\n // Wahl frei — hier: der erste LEBENDE, KETTBARE Match (Review 19,\n // B-4: ein von einem konkurrierenden Tupel verbrauchter erster\n // Match blockiert die weiteren gültigen nicht; reichste Historie\n // wäre App-Sache). Kette ZUERST (Review 13, B-1): „chains\n // atomically with issuing its choice\" heißt beides oder keins.\n for (const choice of matches) {\n if (p.contacts.get(choice)?.deactivated) continue // toter prior → nächster Match\n let prep: any\n try { prep = await prepareContMapping(p, key, choice, when, ent) }\n catch (err: any) {\n // die Pflicht trägt ALLE Matches (Review 20, B-3): wird der\n // erste vor dem Flush unkettbar, versucht der Flush die\n // übrigen lebenden Kandidaten\n t.contMappingDue = { prior: choice, kind: 'choice', alts: matches.filter((x) => x !== choice) }\n outboundError = String(err?.message ?? err)\n break\n }\n if (t.deactivated || t.contChosen) break\n chained = chainTuple(p, key, choice, when)\n if (!chained) continue // Rennen verloren → nächster lebender Match\n t.contChosen = choice\n if (t.contMappingDue?.kind === 'choice') delete t.contMappingDue // die alte Bau-Pflicht ist ERFÜLLT (Review 14, B-2)\n outbound.push(commitContMapping(prep))\n const v2Err = await v2Reissue(p, key, when, ent, outbound)\n if (v2Err) outboundError = outboundError ? outboundError + ' · ' + v2Err : v2Err\n break\n }\n }\n } else {\n // Nicht-Record: Match-Report (löst NIE eine Kette aus). Ist die\n // Record-Wahl auf diesem Tupel schon verifiziert, ist die Report-\n // Pflicht GESTORBEN (6a.3) — eine späte Probe der Record-Seite erzeugt\n // keinen Report mehr: „a match report flushed after the choice is a\n // stale counter-claim that MUST NOT be sent\". Ohne diese Schranke\n // entstand ein nie retirebarer Eintrag, den jeder Flush byte-identisch\n // erneut sandte (Gesamtsimulator, 06.09.2026: Endlos-Retry nach der\n // gegenseitigen Verifikation)\n if (!t.contReported && !t.contRecordPrior) {\n t.contReported = matches[0]\n try { outbound.push(await buildMapping(p, key, matches[0], when, ent)) }\n catch (err: any) { t.contMappingDue = { prior: matches[0], kind: 'report' }; outboundError = String(err?.message ?? err) }\n }\n }\n return { handled: true, matches: matches.length, chained, name: chained ? t.name : undefined, outbound, outboundError, ack }\n}\n\nasync function handleMapping (p: Person, { key, t }: any, artifact: any, when: number, ent: any, mkAck: () => Promise<any>, commitAck: (env: any) => any) {\n if (!C.shaped(artifact ?? {}, { body: 'object', proof: 'object' })\n || !C.shaped(artifact.body, { prior: 'string', next: 'string', to: 'string' })\n || typeof artifact.proof.mac1 !== 'string' || typeof artifact.proof.mac2 !== 'string') return { handled: true, error: 'malformed mapping' }\n const body = artifact.body\n const { mac1, mac2 } = artifact.proof\n const fail = (why: string) => { say(p, `Kontinuitäts-Mapping verworfen: ${why}`); return { handled: true, error: why } }\n if (body.to !== t.channel.own.anchor) return fail('to ≠ eigener neuer Anker')\n if (body.next !== key) return fail('next ≠ neuer Anker der Gegenseite')\n // prior MUSS im Schnappschuss liegen (nie das frische Tupel, nie tiefere Kettenglieder)\n if (body.prior === key) return fail('prior = frisches Tupel (§6a)') // Selbst-Ketten-Schutz, auch bei vergiftetem Schnappschuss\n if (!(t.priorCands?.counterpart ?? []).includes(body.prior)) return fail('prior nicht im Prior-Candidate-Set')\n const old = p.contacts.get(body.prior)\n if (!old?.channel?.own) return fail('alte Beziehung ohne eigenen Kontext')\n const msg = jcs(body)\n if ((await hmacU(await kMac(old.channel.own.x.priv, old.channel.counterpartKa, 'rltp/visibility/mac/cont1'), msg)) !== mac1) return fail('mac1 (alter Beziehungs-Schlüssel)')\n if ((await hmacU(await kMac(t.channel.own.x.priv, t.channel.counterpartKa, 'rltp/visibility/mac/cont2'), msg)) !== mac2) return fail('mac2 (neuer Beziehungs-Schlüssel)')\n // 6.4, die GENERISCHE Revisionsregel im (next, to)-Scope (Review 11,\n // B-2): höher ersetzt · gleich + JCS-identischer Body = idempotenter\n // Repeat (No-op, geackt) · gleich + anderer Body = Äquivokation ·\n // niedriger = reject. Der Revisionsstand rückt erst NACH allen\n // Ablehnungsgründen vor (Record-Freeze gilt whatever its revision)\n if (BigInt(body.revision) === BigInt(t.contRevIn ?? '0')) {\n if (t.contBodyIn && msg === t.contBodyIn) {\n const __ackEnv = await mkAck()\n if (t.deactivated) return fail('tuple deactivated')\n return { handled: true, idempotent: true, ack: commitAck(__ackEnv) }\n }\n return fail('Äquivokation — gleiche Revision, anderer Body')\n }\n if (BigInt(body.revision) < BigInt(t.contRevIn ?? '0')) return fail('mapping revision (niedriger)')\n const senderIsRecord = key < t.channel.own.anchor\n // Record-Freeze VOR Ack und Revisionsstand (B-3): ein verworfenes\n // Dokument konsumiert weder Revision noch Krypto\n if (senderIsRecord && t.contRecordPrior && t.contRecordPrior !== body.prior) return fail('Äquivokation — Record-Wahl ist eingefroren')\n // §6a.4/6.4: „On verification of a record-side mapping, chain\" —\n // wurde der genannte alte Kopf von einem KONKURRIERENDEN Tupel\n // gekettet, ist die Kette hier nicht möglich: ablehnen statt\n // Freeze + Ack + Alignment ohne Kette (Review 14, B-3). ABER: „a\n // head deactivated by THIS VERY chaining remains a valid prior for\n // this tuple\" (Review 15) — eine höhere Revision derselben\n // eingefrorenen Wahl wird per 6.4 normal verarbeitet\n const priorTaken = () => old.deactivated && old.chainedInto !== key\n if (senderIsRecord && priorTaken()) return fail('prior von konkurrierendem Tupel gekettet (§6.4) — nicht kettbar')\n const __ackEnv = await mkAck() // alle Gates bestanden — VOR der Mutation\n if (t.deactivated) return fail('tuple deactivated') // Re-Check (B-1), danach kein await bis zum Commit\n if (senderIsRecord && priorTaken()) return fail('prior von konkurrierendem Tupel gekettet (§6.4) — nicht kettbar') // Re-Check (B-3)\n // Effekt (Revision, Freeze, Kette) + Cache + Ack in EINEM synchronen\n // Zug (Review 6, B-5/B-1); die fehlbare Outbound-Produktion läuft\n // DANACH — ihr Scheitern hinterlässt die Pflicht (contMappingDue),\n // nie einen halben Commit\n t.contRevIn = body.revision\n t.contBodyIn = msg // für den Idempotenz-Vergleich (Review 11, B-2)\n const outbound: any[] = []\n let chainedNow = false // das ECHTE Kettenergebnis (Review 14, B-3), nie eine Ableitung\n const done = (extra: any = {}) => ({ handled: true, chained: chainedNow, name: t.name, outbound, ack, ...extra })\n let ack: any\n if (senderIsRecord) {\n t.contRecordPrior = body.prior\n // nach den Re-Checks garantiert kettbar ODER schon in GENAU dieses\n // Tupel gekettet (Re-Verifikation derselben Wahl, Review 15)\n chainedNow = chainTuple(p, key, body.prior, when) || old.chainedInto === key\n // „the non-record side's match-report duty … dies on verifying the\n // record side's mapping on that tuple\" (Review 11, B-3): der alte\n // Match-Report wird retired — nie mehr gesendet (stale\n // counter-claim MUST NOT be sent), sein Ack-Ref bleibt erhalten\n for (const o of (t.outbox ?? new Map()).values()) if (o.kind === 'continuity-mapping' && o.duty !== 'align') o.retired = true\n if (t.contMappingDue?.kind === 'report') delete t.contMappingDue\n ack = commitAck(__ackEnv)\n if (!t.contAligned) {\n // ein noch UNQUITTIERTES Alignment wird byte-identisch erneut\n // gesendet (Review 16, B-2: „is resent — same revision,\n // idempotent by 6.4\") — eine höhere Record-Revision derselben\n // Wahl prägt NIE eine zweite Alignment-Revision für dieselbe\n // offene Pflicht\n const pending = [...(t.outbox ?? new Map()).values()].find((o: any) => o.kind === 'continuity-mapping' && o.duty === 'align' && !o.retired)\n if (pending) outbound.push({ to: t, kind: 'continuity-mapping/0.1 (Retry, byte-identisch)', env: pending.env })\n else {\n // Produktion registriert in der Outbox; die Pflicht stirbt erst\n // mit dem QUITTIERTEN Dokument (Ack-Pfad setzt contAligned)\n try { outbound.push(await buildMapping(p, key, body.prior, when, ent, 'align')); if (t.contMappingDue?.prior === body.prior) delete t.contMappingDue }\n catch (err: any) { t.contMappingDue = { prior: body.prior, kind: 'align' }; return done({ outboundError: String(err?.message ?? err) }) }\n }\n }\n const v2Err = await v2Reissue(p, key, when, ent, outbound)\n if (v2Err) return done({ outboundError: v2Err })\n } else {\n // Match-Report der Nicht-Record-Seite: darf die Wahl INFORMIEREN,\n // kettet nie selbst. Die Record-Wahl darauf kettet ATOMAR mit der\n // Ausgabe ihres Mappings (Review 12, B-2): erst vorbereiten, dann\n // Wahl + Kette + Ausgabe synchron; Fehlschlag → volle Wahl-Pflicht\n if (iAmRecord(t, key) && !t.contChosen) {\n ack = commitAck(__ackEnv) // der EMPFANGS-Effekt (Revision) committet unabhängig von der Wahl\n let prep: any\n try { prep = await prepareContMapping(p, key, body.prior, when, ent) }\n catch (err: any) { t.contMappingDue = { prior: body.prior, kind: 'choice' }; return done({ outboundError: String(err?.message ?? err) }) }\n if (t.deactivated || t.contChosen) return done()\n // Kette ZUERST (Review 13, B-1): scheitert sie, keine Wahl, keine Ausgabe\n chainedNow = chainTuple(p, key, body.prior, when)\n if (chainedNow) {\n t.contChosen = body.prior\n if (t.contMappingDue?.kind === 'choice') delete t.contMappingDue // die alte Bau-Pflicht ist ERFÜLLT (Review 14, B-2)\n outbound.push(commitContMapping(prep))\n const v2Err = await v2Reissue(p, key, when, ent, outbound)\n if (v2Err) return done({ outboundError: v2Err })\n }\n } else {\n // NUR das Gegen-Mapping AUF DER GEWÄHLTEN Beziehung ist die\n // ALIGNMENT-Antwort (Review 14, B-1): body.prior = der eigene\n // alte Anker des Senders = unser Kontaktschlüssel der gewählten\n // alten Beziehung (t.contChosen). Ein Match-Report für eine\n // ANDERE gemeinsame Altbeziehung beantwortet die Wahl NICHT —\n // erst die echte Antwort beendet die Resend-Pflicht (retiren,\n // Ack-Ref bleibt; Review 13, B-2)\n if (t.contChosen && body.prior === t.contChosen) for (const o of (t.outbox ?? new Map()).values()) if (o.kind === 'continuity-mapping') o.retired = true\n ack = commitAck(__ackEnv)\n }\n }\n return done()\n}\n\n/**\n * The host's producing call for a mapping the receiver still owes\n * (review 6, B-3): a transient seal failure during probe/mapping\n * handling persists the obligation in contMappingDue; this call — not a\n * redelivery, which the freshness rule forbids — builds and returns it.\n */\nexport async function flushContinuity (p: Person, newKey: string, when: number, ent: any = {}) {\n const t = p.contacts.get(newKey)\n if (!t || t.deactivated) return { outbound: [] } // Per-Tupel-Pflichten sterben mit dem Tupel (Review 8, B-2)\n // Retry-ENTSCHEIDUNG und Pflicht-Bau laufen unter dem Kontakt-Lock\n // (Review 12, B-1): der Empfang (der Reports retired) hält denselben\n // Lock — kein Fenster, in dem ein gestarteter Flush eine gerade\n // gestorbene Report-Pflicht doch noch ausstellt („a match report\n // flushed after the choice … MUST NOT be sent\"). Nur der frische\n // Probe-Neubau läuft danach (buildProbe nimmt denselben Lock selbst).\n const r: any = await withContactLock(t, async () => {\n if (t.deactivated) return { outbound: [] }\n // unquittierte MAPPINGS: byte-identischer Retry (4.2), retired nie\n // (gestorbene Match-Report-Pflicht, Review 11, B-3). PROBEN nie\n // byte-identisch — §6a: „a resend is always a fresh probe sequence\n // with freshly sampled padding\" (Review 5, B-3): stale Einträge\n // werden RETIRED (Ack-Ref bleibt, Review 6, B-3), EINE frische\n // Probe ersetzt sie (Bau nach der Lock-Sektion)\n // ein Report nach verifizierter Record-Wahl ist tot (6a.3) — auch wenn\n // er der Wahl zuvorkam, aber erst danach in die Outbox gelangte\n if (t.contRecordPrior) for (const o of (t.outbox ?? new Map()).values()) if (o.kind === 'continuity-mapping' && o.duty !== 'align') o.retired = true\n const retries: any[] = [...(t.outbox ?? new Map()).values()]\n .filter((o: any) => o.kind === 'continuity-mapping' && !o.retired)\n .map((o: any) => ({ to: t, kind: o.kind + '/0.1 (Retry, byte-identisch)', env: o.env }))\n const staleProbes = [...(t.outbox ?? new Map()).values()].filter((o: any) => o.kind === 'continuity-probe' && !o.retired)\n let probeDue = false\n if (staleProbes.length) { for (const o of staleProbes) o.retired = true; probeDue = true }\n if (!t.contMappingDue) return { outbound: retries, probeDue }\n // Single-Flight (Review 7, B-3): zwei parallele Flushes liefern nie\n // zwei Mappings für EINE Pflicht\n if (t.contFlushPending) return { outbound: retries, pending: true, probeDue }\n t.contFlushPending = true\n try {\n const due = t.contMappingDue\n // eine Choice-Pflicht nach bereits GEFALLENER Wahl ist tot\n // (Review 14, B-2): der Direktpfad hat sie erfüllt oder ersetzt —\n // sie darf NIE in den generischen Bau fallen (der eine frische\n // Revision prägte statt der Same-Revision-Wiederholung)\n if (due.kind === 'choice' && t.contChosen) {\n if (t.contMappingDue === due) delete t.contMappingDue\n return { outbound: retries, probeDue }\n }\n if (due.kind === 'choice' && !t.contChosen) {\n // die nachgeholte RECORD-WAHL kettet atomar mit der Ausgabe\n // (Review 12, B-2) und ITERIERT alle bekannten Matches\n // (Review 20, B-3): erster lebender, kettbarer Kandidat\n // gewinnt; sind alle tot, stirbt die Pflicht ehrlich\n // ungekettet (spätere Probes wählen neu). Ein Bau-Fehler\n // wirft → der äußere catch hält die Pflicht am Leben.\n const cands = [...new Set([due.prior, ...(due.alts ?? [])])]\n for (const cand of cands) {\n if (p.contacts.get(cand)?.deactivated) continue\n const prep = await prepareContMapping(p, newKey, cand, when, ent)\n if (t.deactivated) return { outbound: retries, probeDue }\n if (t.contChosen) break\n if (!chainTuple(p, newKey, cand, when)) continue // Rennen verloren → nächster Kandidat\n t.contChosen = cand\n retries.push(commitContMapping(prep))\n break\n }\n if (t.contMappingDue === due) delete t.contMappingDue\n return { outbound: retries, probeDue }\n }\n const mapping = await buildMapping(p, newKey, due.prior, when, ent, due.kind)\n // der Flush stellt GENAU den Zustand her, den der gelungene\n // Direktpfad hinterlassen hätte — kind-bewusst. Und er löscht NUR\n // die Pflicht, die er selbst gebaut hat: ist während des await\n // eine NEUERE an ihre Stelle getreten, bleibt sie stehen (Review\n // 8, B-3); aligned setzt erst der ACK — hier stirbt die BAU-Pflicht\n if (t.contMappingDue === due) delete t.contMappingDue\n return { outbound: [...retries, mapping], probeDue }\n } catch (err: any) {\n return { outbound: retries, probeDue, outboundError: String(err?.message ?? err) }\n } finally { t.contFlushPending = false }\n })\n if (r.probeDue) {\n try { r.outbound.push(...(await buildProbe(p, newKey, when, { ...ent, pad: undefined, threadId: undefined }) ?? [])) }\n catch (err: any) { r.outboundError = r.outboundError ? r.outboundError + ' · ' + String(err?.message ?? err) : String(err?.message ?? err) }\n }\n delete r.probeDue\n return r\n}\n"]}
|
|
@@ -44,15 +44,7 @@ export declare function receiveOffer(p: Person, env: any): Promise<{
|
|
|
44
44
|
error: string;
|
|
45
45
|
duplicate?: undefined;
|
|
46
46
|
}>;
|
|
47
|
-
export declare function consent(p: Person, entry: any, drop: any, when: number, ent?: any): Promise<
|
|
48
|
-
queued: boolean;
|
|
49
|
-
ctx?: undefined;
|
|
50
|
-
mutual?: undefined;
|
|
51
|
-
} | {
|
|
52
|
-
ctx: C.Context;
|
|
53
|
-
mutual: boolean;
|
|
54
|
-
queued?: undefined;
|
|
55
|
-
}>;
|
|
47
|
+
export declare function consent(p: Person, entry: any, drop: any, when: number, ent?: any): Promise<any>;
|
|
56
48
|
export declare function checkDrop(p: Person, entry: any, drop: any): Promise<{
|
|
57
49
|
mutual: boolean;
|
|
58
50
|
error?: undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"introduce.d.ts","sourceRoot":"","sources":["../../src/probe/introduce.ts"],"names":[],"mappings":"AA+BA,OAAO,KAAK,CAAC,MAAM,WAAW,CAAA;AAC9B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAOvC,wBAAgB,YAAY,CAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,MAAM,CAexE;AAED,wBAAsB,QAAQ,CAAE,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,UAAU,sBAI5D;AAMD,wBAAsB,YAAY,CAAE,CAAC,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ;;;GAG3D;AACD,wBAAsB,gBAAgB,CAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM;;;;GAc3F;AAED,wBAAsB,QAAQ,CAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ;;;;GAGhF;AAGD,wBAAgB,UAAU;;SAGX,GAAG,EAAE;eACJ,MAAM,QAAQ,MAAM,MAAM,MAAM;eAChC,MAAM,MAAM,MAAM;EAEjC;AAwBD,wBAAsB,SAAS,CAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ;;;;;;GAwBxG;AAGD,wBAAsB,YAAY,CAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG;;;;;;;;;;;;;;GAOtD;AA8BD,wBAAsB,OAAO,CAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ
|
|
1
|
+
{"version":3,"file":"introduce.d.ts","sourceRoot":"","sources":["../../src/probe/introduce.ts"],"names":[],"mappings":"AA+BA,OAAO,KAAK,CAAC,MAAM,WAAW,CAAA;AAC9B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAOvC,wBAAgB,YAAY,CAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,MAAM,CAexE;AAED,wBAAsB,QAAQ,CAAE,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,UAAU,sBAI5D;AAMD,wBAAsB,YAAY,CAAE,CAAC,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ;;;GAG3D;AACD,wBAAsB,gBAAgB,CAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM;;;;GAc3F;AAED,wBAAsB,QAAQ,CAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ;;;;GAGhF;AAGD,wBAAgB,UAAU;;SAGX,GAAG,EAAE;eACJ,MAAM,QAAQ,MAAM,MAAM,MAAM;eAChC,MAAM,MAAM,MAAM;EAEjC;AAwBD,wBAAsB,SAAS,CAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ;;;;;;GAwBxG;AAGD,wBAAsB,YAAY,CAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG;;;;;;;;;;;;;;GAOtD;AA8BD,wBAAsB,OAAO,CAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ,gBAS3F;AA0BD,wBAAsB,SAAS,CAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG;;;;;;;;;;;;UAkChE;AAGD,wBAAsB,SAAS,CAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,iBAQrE"}
|
package/dist/probe/introduce.js
CHANGED
|
@@ -195,11 +195,22 @@ async function receiveOfferInner(p, env, offer) {
|
|
|
195
195
|
// controls the own card; the counterpart's card arrives via sync
|
|
196
196
|
// (checkDrop) whether or not this side ever consents.
|
|
197
197
|
export async function consent(p, entry, drop, when, ent = {}) {
|
|
198
|
+
// the release happens once: a repeated consent keeps the released context
|
|
199
|
+
// and card (a new pair would orphan the channel the counterpart holds);
|
|
200
|
+
// a call while the release is in flight shares it (single-flight, #8)
|
|
201
|
+
if (entry.released)
|
|
202
|
+
return { ctx: entry.ownCtx, mutual: !!entry.counterpartAnchor };
|
|
203
|
+
if (entry.releasing)
|
|
204
|
+
return entry.releasing;
|
|
198
205
|
if (!p.online) {
|
|
199
206
|
p.queue.push(() => consent(p, entry, drop, when, ent));
|
|
200
207
|
say(p, 'offline — Freigabe wartet auf Netz');
|
|
201
208
|
return { queued: true };
|
|
202
209
|
}
|
|
210
|
+
entry.releasing = release(p, entry, drop, when, ent).finally(() => { entry.releasing = null; });
|
|
211
|
+
return entry.releasing;
|
|
212
|
+
}
|
|
213
|
+
async function release(p, entry, drop, when, ent) {
|
|
203
214
|
const { offer } = entry;
|
|
204
215
|
const secret = C.fromB64u(offer.rendezvous);
|
|
205
216
|
const myDir = offer.direction;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"introduce.js","sourceRoot":"","sources":["../../src/probe/introduce.ts"],"names":[],"mappings":"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","sourcesContent":["// introduce.mjs — the introduction act, PROBE for the §8 recast.\n// DOM-free, deterministic-capable, on rltp-core + rltp-crypto.\n//\n// THE MODEL (Anton's cuts, 25.08. — supersedes converged §8@1's\n// requester-initiated ferry):\n// 1. MEDIATOR-INITIATED: only M can point at both parties (a requester\n// has no in-app handle for the target; the verbal wish lives in real\n// life). M opens a contact, taps \"Vorstellen…\", picks the other.\n// 2. INDEPENDENT RELEASE (ceremony-parallel): both sides receive the\n// offer simultaneously; EACH consent releases that person's OWN\n// fresh card — one-sided outcomes stay first-class (◇), mutuality\n// arises when both have released (⇄).\n// 3. RENDEZVOUS DROP, not ferry: the offers carry a per-act secret;\n// consenting devices deposit their sealed card at a derived topic\n// and fetch the counterpart's — THE MEDIATOR IS NEVER NEEDED AGAIN\n// after the initiating act (airplane-mode scenario). The drop is a\n// PORT (put/get by derived topic, opaque blobs, TTL); relay-topic /\n// DHT / iroh node / M's device are adapters below it.\n// 4. The mediator VOUCHER binds the ACT, not the card (the drop model\n// makes card-digest vouchers impossible — M never sees the cards;\n// harvest finding for the recast). Each offer carries the voucher\n// FOR THE COUNTERPART, signed under M's channel anchor toward that\n// counterpart; the consenting side deposits it beside its card, so\n// the fetcher verifies \"this introduction came from MY M\".\n// Trust: M remains the authenticity anchor of the introduction either\n// way; the systemic control is the first real encounter (◇→✓,\n// continuity). Deniability/linkability hardening is RECAST WORK — this\n// probe signs plainly and says so.\nimport { jcs, makeValidator, tsec } from '../core.js'\nimport { SCHEMAS } from '../schemas.js'\nconst VAL = makeValidator(SCHEMAS)\nimport * as C from './deps.js'\nimport type { Person } from './deps.js'\nimport { snapshotPriors } from './continuity.js'\n\nconst te = new TextEncoder(), td = new TextDecoder()\nconst S = globalThis.crypto.subtle\n\n// ── people ──────────────────────────────────────────────────────────────\nexport function createPerson (name: string, rootIkm?: Uint8Array): Person {\n return {\n name,\n rootIkm: rootIkm ?? C.rand(64),\n contexts: new Map(), // anchor/keyAgreement -> pair ctx (fresh-always)\n contacts: new Map(), // counterpart anchor -> { name, card, provenance, state, channel }\n inbox: [], // received offers/invites awaiting the human\n groups: new Map(), // genesisDigest -> group state (Stage C, groups.mjs)\n online: true,\n queue: [], // actions deferred while offline (device ferry of ONESELF)\n log: [],\n // the demo community's genesis — a PROBE FIXTURE the person carries,\n // so the strict identity layer never needs a default\n communityGenesis: C.COMMUNITY_GENESIS,\n }\n}\nconst say = (p: Person, m: string) => p.log.push(m)\nexport async function freshCtx (p: Person, nonce?: Uint8Array) {\n const ctx = await C.pairContext(p.rootIkm, nonce ?? C.rand(32))\n p.contexts.set(ctx.anchor, ctx); p.contexts.set(ctx.keyAgreement, ctx)\n return ctx\n}\n\n// ── die Zeremonie in SCHRITTEN — die App-Choreografie (Encounter 5.2):\n// Code zeigen → scannen → BEIDE bestätigen bewusst; erst dann entsteht\n// das Enactment. Der gezeigte Anker ist immer frisch (4.4) und verrät\n// nichts — wer ihn wirklich trifft, klärt hinterher die §6a-Probe.\nexport async function ceremonyShow (p: Person, ent: any = {}) {\n const ctx = await freshCtx(p, ent.nonce)\n return { ctx, ch: C.challengeOf(ent.ch ?? C.rand(17)) }\n}\nexport async function ceremonyComplete (a: Person, sa: any, b: Person, sb: any, when: number) {\n const ctxA = sa.ctx, ctxB = sb.ctx, chA = sa.ch, chB = sb.ch\n const bind = await C.binding(C.CEREMONY, chA, chB)\n const iso = C.iso(when)\n const cardA = await C.signCard(ctxA, C.cardBody(ctxA, { name: a.name, challenge: { value: chA, issuedAt: iso } }), iso)\n const cardB = await C.signCard(ctxB, C.cardBody(ctxB, { name: b.name, challenge: { value: chB, issuedAt: iso } }), iso)\n const credA = await C.issueCredential(ctxA, ctxB.anchor, C.CEREMONY, chB, bind, iso)\n const credB = await C.issueCredential(ctxB, ctxA.anchor, C.CEREMONY, chA, bind, iso)\n const priorsA = snapshotPriors(a), priorsB = snapshotPriors(b) // Schnappschuss VOR dem frischen Tupel (6a)\n a.contacts.set(ctxB.anchor, { name: b.name, card: cardB, credential: credA, provenance: 'ceremony', state: '✓', since: iso, channel: { own: ctxA, counterpartKa: cardB.keyAgreement }, priorCands: priorsA })\n b.contacts.set(ctxA.anchor, { name: a.name, card: cardA, credential: credB, provenance: 'ceremony', state: '✓', since: iso, channel: { own: ctxB, counterpartKa: cardA.keyAgreement }, priorCands: priorsB })\n say(a, `Zeremonie mit ${b.name}: ✓ verifiziert (frisches Tupel)`)\n say(b, `Zeremonie mit ${a.name}: ✓ verifiziert (frisches Tupel)`)\n return { ctxA, ctxB, bind }\n}\n// Test-Shortcut: beide Schritte in einem Zug (Vorgeschichte in Szenarien)\nexport async function ceremony (a: Person, b: Person, when: number, ent: any = {}) {\n return ceremonyComplete(a, await ceremonyShow(a, { nonce: ent.nonceA, ch: ent.chA }),\n b, await ceremonyShow(b, { nonce: ent.nonceB, ch: ent.chB }), when)\n}\n\n// ── the rendezvous drop PORT: put/get by derived topic, opaque blobs ────\nexport function createDrop () {\n return {\n slots: new Map<string, string>(), // topic -> b64u blob\n log: [] as any[], // { n, op, topic, by }\n put (topic: string, blob: string, by: string) { this.slots.set(topic, blob); this.log.push({ n: this.log.length, op: 'put', topic: topic.slice(0, 16) + '…', by }) },\n get (topic: string, by: string) { this.log.push({ n: this.log.length, op: 'get', topic: topic.slice(0, 16) + '…', by }); return this.slots.get(topic) ?? null },\n }\n}\nconst dropTopic = async (secret: Uint8Array, dir: string) => C.b64uOf(await C.hkdf(secret, 'rltp/introduce/topic/' + dir))\nconst dropKey = async (secret: Uint8Array, dir: string) => S.importKey('raw', await C.hkdf(secret, 'rltp/introduce/key/' + dir), { name: 'AES-GCM' }, false, ['encrypt', 'decrypt'])\nasync function dropSeal (secret: Uint8Array, dir: string, obj: any, nonce: Uint8Array | undefined) {\n const n = nonce ?? C.rand(12)\n const ct = new Uint8Array(await S.encrypt({ name: 'AES-GCM', iv: n }, await dropKey(secret, dir), te.encode(jcs(obj))))\n return C.b64uOf(C.cat(n, ct))\n}\nasync function dropOpen (secret: Uint8Array, dir: string, blob: string) {\n try {\n const raw = C.fromB64u(blob)\n const pt = await S.decrypt({ name: 'AES-GCM', iv: raw.subarray(0, 12) }, await dropKey(secret, dir), raw.subarray(12))\n return JSON.parse(td.decode(new Uint8Array(pt)))\n } catch { return null }\n}\n\n// ── 1. the mediator's ONE act: \"Vorstellen…\" ────────────────────────────\n// Produces two sealed offers over the EXISTING channels. After this, the\n// mediator's device is done — nothing below ever touches it again.\n// Introducible are ✓ AND ⇄ contacts (Anton's cut, 24.08.) — but the offer\n// carries the mediator's OWN provenance toward the peer (met | introduced,\n// the vouch@2 vocabulary): the recipient decides informed, and a chain of\n// introductions never washes amber to blue — reach spreads, verification\n// does not. ◇ cannot mediate: no own channel context exists.\nexport async function introduce (m: Person, anchorA: string, anchorB: string, when: number, ent: any = {}) {\n const A = m.contacts.get(anchorA), B = m.contacts.get(anchorB)\n if (!A || !B) throw new Error('mediator does not hold both contacts')\n if (!A.channel?.own || !B.channel?.own) throw new Error('introducing needs a mutual channel to BOTH (◇ cannot mediate)')\n const secret = ent.secret ?? C.rand(32)\n const act = await C.digestBytes(secret) // act id: public handle, secret stays sealed\n const iso = C.iso(when)\n const provOf = (c: any) => c.provenance === 'ceremony' ? 'met' : 'introduced'\n const mk = async (mine: any, other: any, dir: string) => {\n // voucher FOR the counterpart, under M's channel anchor toward the counterpart;\n // it carries M's self-attested provenance toward the person it vouches for\n const voucher = await C.diSign(other.channel.own, { type: 'introduction-voucher@2', act, direction: dir, provenance: provOf(mine), issuedAt: iso }, iso)\n const offer = await C.diSign(mine.channel.own, {\n type: 'introduction-offer@2', act, direction: dir, issuedAt: iso,\n peer: { name: other.name, provenance: provOf(other) }, // M's LOCAL memory — words + honest basis, no anchors\n rendezvous: C.b64uOf(secret),\n voucherForCounterpart: voucher,\n }, iso)\n return C.seal(offer, mine.channel.counterpartKa, { ephSeed: ent.ephSeed, nonce: ent.sealNonce })\n }\n const envA = await mk(A, B, 'a')\n const envB = await mk(B, A, 'b')\n say(m, `Vorstellen: ${A.name} ⇠⇢ ${B.name} — zwei Angebote versiegelt, Akt ${act.slice(0, 12)}… · mein Gerät ist ab jetzt nicht mehr nötig`)\n return { act, offers: [{ to: anchorA, env: envA }, { to: anchorB, env: envB }] }\n}\n\n// ── 2. receiving the offer (each side, independently) ───────────────────\nexport async function receiveOffer (p: Person, env: any) {\n const opened = await C.openEnvelope(p, env) // Stufen 1–4, Cache-Lesung\n if (opened.duplicate) return { duplicate: true } // kein Fehler: der Effekt ist längst da\n if (opened.error) return { error: opened.error }\n const r = await receiveOfferInner(p, env, opened.doc)\n if (!(r as any).error) C.effectDone(p, opened.digest)\n return r\n}\nasync function receiveOfferInner (p: Person, env: any, offer: any) {\n // form BEFORE fields (M-3; value forms per review 9, P-B1): the offer\n // binds ITS artifact form before anything enters the inbox\n if (!C.shaped(offer, { type: 'string', act: 'string', direction: 'string', rendezvous: 'string', issuedAt: 'string', peer: 'object', proof: 'object' })\n || offer.type !== 'introduction-offer@2'\n || (offer.direction !== 'a' && offer.direction !== 'b')\n || !C.calOK(offer.issuedAt)\n || !C.shaped(offer.peer, { name: 'string', provenance: 'string' })\n || (offer.peer.provenance !== 'met' && offer.peer.provenance !== 'introduced')) return { error: 'malformed offer' }\n try { if (C.fromB64u(offer.rendezvous).length !== 32) return { error: 'malformed offer' } }\n catch { return { error: 'malformed offer' } }\n // der mitreisende Voucher ist Teil der Offer-Form (Review 10, P-B1-Rest):\n // er wird beim Consent unbesehen ins Drop-Paket übernommen\n const v = offer.voucherForCounterpart\n if (!C.shaped(v, { type: 'string', act: 'string', direction: 'string', provenance: 'string', issuedAt: 'string', proof: 'object' })\n || v.type !== 'introduction-voucher@2' || v.act !== offer.act || !C.calOK(v.issuedAt)) return { error: 'malformed offer' }\n const from = [...p.contacts.entries()].find(([anchor, c]) => c.channel && offer.proof?.verificationMethod?.startsWith(anchor))\n if (!from) return { error: 'offer not from a held contact' }\n if (!(await C.diVerify(offer, from[0]))) return { error: 'offer proof fails' }\n const entry = { offer, mediator: from[1].name, mediatorAnchor: from[0], decided: false }\n p.inbox.push(entry)\n say(p, `${from[1].name} möchte dich mit ${offer.peer.name} verbinden`)\n return { entry }\n}\n\n// ── 3. consent: release the OWN card — independent of the other side.\n// Releasing and receiving are SEPARATE (ceremony-parallel): consent only\n// controls the own card; the counterpart's card arrives via sync\n// (checkDrop) whether or not this side ever consents.\nexport async function consent (p: Person, entry: any, drop: any, when: number, ent: any = {}) {\n if (!p.online) { p.queue.push(() => consent(p, entry, drop, when, ent)); say(p, 'offline — Freigabe wartet auf Netz'); return { queued: true } }\n const { offer } = entry\n const secret = C.fromB64u(offer.rendezvous)\n const myDir = offer.direction\n const ctx = await freshCtx(p, ent.nonce)\n const iso = C.iso(when)\n const card = await C.signCard(ctx, C.cardBody(ctx, { name: p.name, challenge: { value: C.challengeOf(ent.ch ?? C.rand(17)), issuedAt: iso } }), iso)\n drop.put(await dropTopic(secret, myDir), await dropSeal(secret, myDir, { card, voucher: offer.voucherForCounterpart }, ent.dropNonce), p.name)\n entry.decided = true\n entry.released = true\n entry.ownCtx = ctx\n entry.ownCard = card\n say(p, `Verbinden mit ${offer.peer.name}: eigene Karte freigegeben (◇ gesendet)`)\n // if the counterpart's card is already held, the relationship is mutual now\n if (entry.counterpartAnchor) {\n const c = p.contacts.get(entry.counterpartAnchor)\n if (c) { c.state = '⇄'; c.channel.own = ctx; say(p, `⇄ verbunden mit ${c.name} — beide Karten liegen vor`) }\n }\n const fetched = await checkDrop(p, entry, drop)\n return { ctx, mutual: !!(entry.released && entry.counterpartAnchor) }\n}\n\n// ── 4. sync: fetch the counterpart's card — PASSIVE receipt, independent\n// of the own decision (like a shared contact arriving; ignoring the offer\n// never blocks what the other side chose to release) ────────────────────\nexport async function checkDrop (p: Person, entry: any, drop: any) {\n if (!p.online || entry.done) return null\n const { offer } = entry\n const secret = C.fromB64u(offer.rendezvous)\n const otherDir = offer.direction === 'a' ? 'b' : 'a'\n const blob = drop.get(await dropTopic(secret, otherDir), p.name)\n if (!blob) return { mutual: false }\n const pkg = await dropOpen(secret, otherDir, blob)\n if (!pkg) { say(p, 'Drop-Blob unlesbar (falsches Geheimnis?)'); return { error: 'undecryptable' } }\n // form BEFORE fields (M-3), THEN the cryptography — and the card runs\n // through its CLOSED wire-0.25 schema, not an ad-hoc field list\n // (review 3, M-4: a valid signature binds a schema-violating card too)\n if (!C.shaped(pkg, { card: 'object', voucher: 'object' })\n || !C.shaped(pkg.voucher, { act: 'string' })) { say(p, 'Drop-Paket formwidrig'); return { error: 'malformed' } }\n {\n const s = SCHEMAS['contact-card.schema.json']\n const errs = VAL.validate(pkg.card, s, s)\n if (errs.length) { say(p, 'Karte schema-widrig: ' + errs[0]); return { error: 'card schema' } }\n }\n // the counterpart card: schema + DI; the voucher: signed by MY mediator\n if (!(await C.diVerify(pkg.card, pkg.card.anchor))) { say(p, 'Karte verifiziert nicht'); return { error: 'card' } }\n if (!(await C.diVerify(pkg.voucher, entry.mediatorAnchor)) || pkg.voucher.act !== offer.act) { say(p, 'Voucher verifiziert nicht unter meinem Vermittler'); return { error: 'voucher' } }\n entry.done = true\n entry.counterpartAnchor = pkg.card.anchor\n const mutual = !!entry.released\n const priors = snapshotPriors(p) // Schnappschuss VOR dem frischen Tupel (6a)\n p.contacts.set(pkg.card.anchor, {\n name: pkg.card.name, card: pkg.card, provenance: `introduced via ${entry.mediator}`, since: entry.offer.issuedAt,\n mediatorProvenance: entry.offer.peer.provenance ?? 'met', priorCands: priors,\n state: mutual ? '⇄' : '◇', channel: { own: entry.ownCtx ?? null, counterpartKa: pkg.card.keyAgreement },\n voucher: pkg.voucher,\n })\n say(p, mutual ? `⇄ verbunden mit ${pkg.card.name} — via ${entry.mediator} (Voucher geprüft)` : `◇ ${pkg.card.name} erhalten — vorgestellt via ${entry.mediator} (einseitig; du hast nichts freigegeben)`)\n return { mutual, card: pkg.card }\n}\n\n// ── device lifecycle ────────────────────────────────────────────────────\nexport async function setOnline (p: Person, online: boolean, drop: any) {\n p.online = online\n say(p, online ? 'online' : 'offline (Flugmodus)')\n if (online) {\n const q = p.queue.splice(0)\n for (const fn of q) await fn()\n for (const e of p.inbox) if (!e.kind) await checkDrop(p, e, drop) // nur Vorstellungs-Angebote haben einen Drop\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"introduce.js","sourceRoot":"","sources":["../../src/probe/introduce.ts"],"names":[],"mappings":"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","sourcesContent":["// introduce.mjs — the introduction act, PROBE for the §8 recast.\n// DOM-free, deterministic-capable, on rltp-core + rltp-crypto.\n//\n// THE MODEL (Anton's cuts, 25.08. — supersedes converged §8@1's\n// requester-initiated ferry):\n// 1. MEDIATOR-INITIATED: only M can point at both parties (a requester\n// has no in-app handle for the target; the verbal wish lives in real\n// life). M opens a contact, taps \"Vorstellen…\", picks the other.\n// 2. INDEPENDENT RELEASE (ceremony-parallel): both sides receive the\n// offer simultaneously; EACH consent releases that person's OWN\n// fresh card — one-sided outcomes stay first-class (◇), mutuality\n// arises when both have released (⇄).\n// 3. RENDEZVOUS DROP, not ferry: the offers carry a per-act secret;\n// consenting devices deposit their sealed card at a derived topic\n// and fetch the counterpart's — THE MEDIATOR IS NEVER NEEDED AGAIN\n// after the initiating act (airplane-mode scenario). The drop is a\n// PORT (put/get by derived topic, opaque blobs, TTL); relay-topic /\n// DHT / iroh node / M's device are adapters below it.\n// 4. The mediator VOUCHER binds the ACT, not the card (the drop model\n// makes card-digest vouchers impossible — M never sees the cards;\n// harvest finding for the recast). Each offer carries the voucher\n// FOR THE COUNTERPART, signed under M's channel anchor toward that\n// counterpart; the consenting side deposits it beside its card, so\n// the fetcher verifies \"this introduction came from MY M\".\n// Trust: M remains the authenticity anchor of the introduction either\n// way; the systemic control is the first real encounter (◇→✓,\n// continuity). Deniability/linkability hardening is RECAST WORK — this\n// probe signs plainly and says so.\nimport { jcs, makeValidator, tsec } from '../core.js'\nimport { SCHEMAS } from '../schemas.js'\nconst VAL = makeValidator(SCHEMAS)\nimport * as C from './deps.js'\nimport type { Person } from './deps.js'\nimport { snapshotPriors } from './continuity.js'\n\nconst te = new TextEncoder(), td = new TextDecoder()\nconst S = globalThis.crypto.subtle\n\n// ── people ──────────────────────────────────────────────────────────────\nexport function createPerson (name: string, rootIkm?: Uint8Array): Person {\n return {\n name,\n rootIkm: rootIkm ?? C.rand(64),\n contexts: new Map(), // anchor/keyAgreement -> pair ctx (fresh-always)\n contacts: new Map(), // counterpart anchor -> { name, card, provenance, state, channel }\n inbox: [], // received offers/invites awaiting the human\n groups: new Map(), // genesisDigest -> group state (Stage C, groups.mjs)\n online: true,\n queue: [], // actions deferred while offline (device ferry of ONESELF)\n log: [],\n // the demo community's genesis — a PROBE FIXTURE the person carries,\n // so the strict identity layer never needs a default\n communityGenesis: C.COMMUNITY_GENESIS,\n }\n}\nconst say = (p: Person, m: string) => p.log.push(m)\nexport async function freshCtx (p: Person, nonce?: Uint8Array) {\n const ctx = await C.pairContext(p.rootIkm, nonce ?? C.rand(32))\n p.contexts.set(ctx.anchor, ctx); p.contexts.set(ctx.keyAgreement, ctx)\n return ctx\n}\n\n// ── die Zeremonie in SCHRITTEN — die App-Choreografie (Encounter 5.2):\n// Code zeigen → scannen → BEIDE bestätigen bewusst; erst dann entsteht\n// das Enactment. Der gezeigte Anker ist immer frisch (4.4) und verrät\n// nichts — wer ihn wirklich trifft, klärt hinterher die §6a-Probe.\nexport async function ceremonyShow (p: Person, ent: any = {}) {\n const ctx = await freshCtx(p, ent.nonce)\n return { ctx, ch: C.challengeOf(ent.ch ?? C.rand(17)) }\n}\nexport async function ceremonyComplete (a: Person, sa: any, b: Person, sb: any, when: number) {\n const ctxA = sa.ctx, ctxB = sb.ctx, chA = sa.ch, chB = sb.ch\n const bind = await C.binding(C.CEREMONY, chA, chB)\n const iso = C.iso(when)\n const cardA = await C.signCard(ctxA, C.cardBody(ctxA, { name: a.name, challenge: { value: chA, issuedAt: iso } }), iso)\n const cardB = await C.signCard(ctxB, C.cardBody(ctxB, { name: b.name, challenge: { value: chB, issuedAt: iso } }), iso)\n const credA = await C.issueCredential(ctxA, ctxB.anchor, C.CEREMONY, chB, bind, iso)\n const credB = await C.issueCredential(ctxB, ctxA.anchor, C.CEREMONY, chA, bind, iso)\n const priorsA = snapshotPriors(a), priorsB = snapshotPriors(b) // Schnappschuss VOR dem frischen Tupel (6a)\n a.contacts.set(ctxB.anchor, { name: b.name, card: cardB, credential: credA, provenance: 'ceremony', state: '✓', since: iso, channel: { own: ctxA, counterpartKa: cardB.keyAgreement }, priorCands: priorsA })\n b.contacts.set(ctxA.anchor, { name: a.name, card: cardA, credential: credB, provenance: 'ceremony', state: '✓', since: iso, channel: { own: ctxB, counterpartKa: cardA.keyAgreement }, priorCands: priorsB })\n say(a, `Zeremonie mit ${b.name}: ✓ verifiziert (frisches Tupel)`)\n say(b, `Zeremonie mit ${a.name}: ✓ verifiziert (frisches Tupel)`)\n return { ctxA, ctxB, bind }\n}\n// Test-Shortcut: beide Schritte in einem Zug (Vorgeschichte in Szenarien)\nexport async function ceremony (a: Person, b: Person, when: number, ent: any = {}) {\n return ceremonyComplete(a, await ceremonyShow(a, { nonce: ent.nonceA, ch: ent.chA }),\n b, await ceremonyShow(b, { nonce: ent.nonceB, ch: ent.chB }), when)\n}\n\n// ── the rendezvous drop PORT: put/get by derived topic, opaque blobs ────\nexport function createDrop () {\n return {\n slots: new Map<string, string>(), // topic -> b64u blob\n log: [] as any[], // { n, op, topic, by }\n put (topic: string, blob: string, by: string) { this.slots.set(topic, blob); this.log.push({ n: this.log.length, op: 'put', topic: topic.slice(0, 16) + '…', by }) },\n get (topic: string, by: string) { this.log.push({ n: this.log.length, op: 'get', topic: topic.slice(0, 16) + '…', by }); return this.slots.get(topic) ?? null },\n }\n}\nconst dropTopic = async (secret: Uint8Array, dir: string) => C.b64uOf(await C.hkdf(secret, 'rltp/introduce/topic/' + dir))\nconst dropKey = async (secret: Uint8Array, dir: string) => S.importKey('raw', await C.hkdf(secret, 'rltp/introduce/key/' + dir), { name: 'AES-GCM' }, false, ['encrypt', 'decrypt'])\nasync function dropSeal (secret: Uint8Array, dir: string, obj: any, nonce: Uint8Array | undefined) {\n const n = nonce ?? C.rand(12)\n const ct = new Uint8Array(await S.encrypt({ name: 'AES-GCM', iv: n }, await dropKey(secret, dir), te.encode(jcs(obj))))\n return C.b64uOf(C.cat(n, ct))\n}\nasync function dropOpen (secret: Uint8Array, dir: string, blob: string) {\n try {\n const raw = C.fromB64u(blob)\n const pt = await S.decrypt({ name: 'AES-GCM', iv: raw.subarray(0, 12) }, await dropKey(secret, dir), raw.subarray(12))\n return JSON.parse(td.decode(new Uint8Array(pt)))\n } catch { return null }\n}\n\n// ── 1. the mediator's ONE act: \"Vorstellen…\" ────────────────────────────\n// Produces two sealed offers over the EXISTING channels. After this, the\n// mediator's device is done — nothing below ever touches it again.\n// Introducible are ✓ AND ⇄ contacts (Anton's cut, 24.08.) — but the offer\n// carries the mediator's OWN provenance toward the peer (met | introduced,\n// the vouch@2 vocabulary): the recipient decides informed, and a chain of\n// introductions never washes amber to blue — reach spreads, verification\n// does not. ◇ cannot mediate: no own channel context exists.\nexport async function introduce (m: Person, anchorA: string, anchorB: string, when: number, ent: any = {}) {\n const A = m.contacts.get(anchorA), B = m.contacts.get(anchorB)\n if (!A || !B) throw new Error('mediator does not hold both contacts')\n if (!A.channel?.own || !B.channel?.own) throw new Error('introducing needs a mutual channel to BOTH (◇ cannot mediate)')\n const secret = ent.secret ?? C.rand(32)\n const act = await C.digestBytes(secret) // act id: public handle, secret stays sealed\n const iso = C.iso(when)\n const provOf = (c: any) => c.provenance === 'ceremony' ? 'met' : 'introduced'\n const mk = async (mine: any, other: any, dir: string) => {\n // voucher FOR the counterpart, under M's channel anchor toward the counterpart;\n // it carries M's self-attested provenance toward the person it vouches for\n const voucher = await C.diSign(other.channel.own, { type: 'introduction-voucher@2', act, direction: dir, provenance: provOf(mine), issuedAt: iso }, iso)\n const offer = await C.diSign(mine.channel.own, {\n type: 'introduction-offer@2', act, direction: dir, issuedAt: iso,\n peer: { name: other.name, provenance: provOf(other) }, // M's LOCAL memory — words + honest basis, no anchors\n rendezvous: C.b64uOf(secret),\n voucherForCounterpart: voucher,\n }, iso)\n return C.seal(offer, mine.channel.counterpartKa, { ephSeed: ent.ephSeed, nonce: ent.sealNonce })\n }\n const envA = await mk(A, B, 'a')\n const envB = await mk(B, A, 'b')\n say(m, `Vorstellen: ${A.name} ⇠⇢ ${B.name} — zwei Angebote versiegelt, Akt ${act.slice(0, 12)}… · mein Gerät ist ab jetzt nicht mehr nötig`)\n return { act, offers: [{ to: anchorA, env: envA }, { to: anchorB, env: envB }] }\n}\n\n// ── 2. receiving the offer (each side, independently) ───────────────────\nexport async function receiveOffer (p: Person, env: any) {\n const opened = await C.openEnvelope(p, env) // Stufen 1–4, Cache-Lesung\n if (opened.duplicate) return { duplicate: true } // kein Fehler: der Effekt ist längst da\n if (opened.error) return { error: opened.error }\n const r = await receiveOfferInner(p, env, opened.doc)\n if (!(r as any).error) C.effectDone(p, opened.digest)\n return r\n}\nasync function receiveOfferInner (p: Person, env: any, offer: any) {\n // form BEFORE fields (M-3; value forms per review 9, P-B1): the offer\n // binds ITS artifact form before anything enters the inbox\n if (!C.shaped(offer, { type: 'string', act: 'string', direction: 'string', rendezvous: 'string', issuedAt: 'string', peer: 'object', proof: 'object' })\n || offer.type !== 'introduction-offer@2'\n || (offer.direction !== 'a' && offer.direction !== 'b')\n || !C.calOK(offer.issuedAt)\n || !C.shaped(offer.peer, { name: 'string', provenance: 'string' })\n || (offer.peer.provenance !== 'met' && offer.peer.provenance !== 'introduced')) return { error: 'malformed offer' }\n try { if (C.fromB64u(offer.rendezvous).length !== 32) return { error: 'malformed offer' } }\n catch { return { error: 'malformed offer' } }\n // der mitreisende Voucher ist Teil der Offer-Form (Review 10, P-B1-Rest):\n // er wird beim Consent unbesehen ins Drop-Paket übernommen\n const v = offer.voucherForCounterpart\n if (!C.shaped(v, { type: 'string', act: 'string', direction: 'string', provenance: 'string', issuedAt: 'string', proof: 'object' })\n || v.type !== 'introduction-voucher@2' || v.act !== offer.act || !C.calOK(v.issuedAt)) return { error: 'malformed offer' }\n const from = [...p.contacts.entries()].find(([anchor, c]) => c.channel && offer.proof?.verificationMethod?.startsWith(anchor))\n if (!from) return { error: 'offer not from a held contact' }\n if (!(await C.diVerify(offer, from[0]))) return { error: 'offer proof fails' }\n const entry = { offer, mediator: from[1].name, mediatorAnchor: from[0], decided: false }\n p.inbox.push(entry)\n say(p, `${from[1].name} möchte dich mit ${offer.peer.name} verbinden`)\n return { entry }\n}\n\n// ── 3. consent: release the OWN card — independent of the other side.\n// Releasing and receiving are SEPARATE (ceremony-parallel): consent only\n// controls the own card; the counterpart's card arrives via sync\n// (checkDrop) whether or not this side ever consents.\nexport async function consent (p: Person, entry: any, drop: any, when: number, ent: any = {}) {\n // the release happens once: a repeated consent keeps the released context\n // and card (a new pair would orphan the channel the counterpart holds);\n // a call while the release is in flight shares it (single-flight, #8)\n if (entry.released) return { ctx: entry.ownCtx, mutual: !!entry.counterpartAnchor }\n if (entry.releasing) return entry.releasing\n if (!p.online) { p.queue.push(() => consent(p, entry, drop, when, ent)); say(p, 'offline — Freigabe wartet auf Netz'); return { queued: true } }\n entry.releasing = release(p, entry, drop, when, ent).finally(() => { entry.releasing = null })\n return entry.releasing\n}\nasync function release (p: Person, entry: any, drop: any, when: number, ent: any) {\n const { offer } = entry\n const secret = C.fromB64u(offer.rendezvous)\n const myDir = offer.direction\n const ctx = await freshCtx(p, ent.nonce)\n const iso = C.iso(when)\n const card = await C.signCard(ctx, C.cardBody(ctx, { name: p.name, challenge: { value: C.challengeOf(ent.ch ?? C.rand(17)), issuedAt: iso } }), iso)\n drop.put(await dropTopic(secret, myDir), await dropSeal(secret, myDir, { card, voucher: offer.voucherForCounterpart }, ent.dropNonce), p.name)\n entry.decided = true\n entry.released = true\n entry.ownCtx = ctx\n entry.ownCard = card\n say(p, `Verbinden mit ${offer.peer.name}: eigene Karte freigegeben (◇ gesendet)`)\n // if the counterpart's card is already held, the relationship is mutual now\n if (entry.counterpartAnchor) {\n const c = p.contacts.get(entry.counterpartAnchor)\n if (c) { c.state = '⇄'; c.channel.own = ctx; say(p, `⇄ verbunden mit ${c.name} — beide Karten liegen vor`) }\n }\n const fetched = await checkDrop(p, entry, drop)\n return { ctx, mutual: !!(entry.released && entry.counterpartAnchor) }\n}\n\n// ── 4. sync: fetch the counterpart's card — PASSIVE receipt, independent\n// of the own decision (like a shared contact arriving; ignoring the offer\n// never blocks what the other side chose to release) ────────────────────\nexport async function checkDrop (p: Person, entry: any, drop: any) {\n if (!p.online || entry.done) return null\n const { offer } = entry\n const secret = C.fromB64u(offer.rendezvous)\n const otherDir = offer.direction === 'a' ? 'b' : 'a'\n const blob = drop.get(await dropTopic(secret, otherDir), p.name)\n if (!blob) return { mutual: false }\n const pkg = await dropOpen(secret, otherDir, blob)\n if (!pkg) { say(p, 'Drop-Blob unlesbar (falsches Geheimnis?)'); return { error: 'undecryptable' } }\n // form BEFORE fields (M-3), THEN the cryptography — and the card runs\n // through its CLOSED wire-0.25 schema, not an ad-hoc field list\n // (review 3, M-4: a valid signature binds a schema-violating card too)\n if (!C.shaped(pkg, { card: 'object', voucher: 'object' })\n || !C.shaped(pkg.voucher, { act: 'string' })) { say(p, 'Drop-Paket formwidrig'); return { error: 'malformed' } }\n {\n const s = SCHEMAS['contact-card.schema.json']\n const errs = VAL.validate(pkg.card, s, s)\n if (errs.length) { say(p, 'Karte schema-widrig: ' + errs[0]); return { error: 'card schema' } }\n }\n // the counterpart card: schema + DI; the voucher: signed by MY mediator\n if (!(await C.diVerify(pkg.card, pkg.card.anchor))) { say(p, 'Karte verifiziert nicht'); return { error: 'card' } }\n if (!(await C.diVerify(pkg.voucher, entry.mediatorAnchor)) || pkg.voucher.act !== offer.act) { say(p, 'Voucher verifiziert nicht unter meinem Vermittler'); return { error: 'voucher' } }\n entry.done = true\n entry.counterpartAnchor = pkg.card.anchor\n const mutual = !!entry.released\n const priors = snapshotPriors(p) // Schnappschuss VOR dem frischen Tupel (6a)\n p.contacts.set(pkg.card.anchor, {\n name: pkg.card.name, card: pkg.card, provenance: `introduced via ${entry.mediator}`, since: entry.offer.issuedAt,\n mediatorProvenance: entry.offer.peer.provenance ?? 'met', priorCands: priors,\n state: mutual ? '⇄' : '◇', channel: { own: entry.ownCtx ?? null, counterpartKa: pkg.card.keyAgreement },\n voucher: pkg.voucher,\n })\n say(p, mutual ? `⇄ verbunden mit ${pkg.card.name} — via ${entry.mediator} (Voucher geprüft)` : `◇ ${pkg.card.name} erhalten — vorgestellt via ${entry.mediator} (einseitig; du hast nichts freigegeben)`)\n return { mutual, card: pkg.card }\n}\n\n// ── device lifecycle ────────────────────────────────────────────────────\nexport async function setOnline (p: Person, online: boolean, drop: any) {\n p.online = online\n say(p, online ? 'online' : 'offline (Flugmodus)')\n if (online) {\n const q = p.queue.splice(0)\n for (const fn of q) await fn()\n for (const e of p.inbox) if (!e.kind) await checkDrop(p, e, drop) // nur Vorstellungs-Angebote haben einen Drop\n }\n}\n"]}
|
|
@@ -34,10 +34,16 @@ export declare function receiveDoc(p: Person, env: any, when: number, ent?: any)
|
|
|
34
34
|
}[];
|
|
35
35
|
error?: undefined;
|
|
36
36
|
idempotent?: undefined;
|
|
37
|
+
} | {
|
|
38
|
+
handled: boolean;
|
|
39
|
+
idempotent: boolean;
|
|
40
|
+
error?: undefined;
|
|
41
|
+
joined?: undefined;
|
|
37
42
|
} | {
|
|
38
43
|
handled: boolean;
|
|
39
44
|
joined: any;
|
|
40
45
|
error?: undefined;
|
|
46
|
+
idempotent?: undefined;
|
|
41
47
|
} | {
|
|
42
48
|
handled: boolean;
|
|
43
49
|
idempotent: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"membership.d.ts","sourceRoot":"","sources":["../../src/probe/membership.ts"],"names":[],"mappings":"AAiCA,OAAO,KAAK,CAAC,MAAM,WAAW,CAAA;AAC9B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAYvC,wBAAsB,aAAa,CAAE,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,sBAKpE;AAKD,wBAAsB,UAAU,CAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ,gBAoBtF;AAWD,wBAAsB,cAAc,CAAE,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ;;;GAYzH;AAID,wBAAsB,UAAU,CAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ
|
|
1
|
+
{"version":3,"file":"membership.d.ts","sourceRoot":"","sources":["../../src/probe/membership.ts"],"names":[],"mappings":"AAiCA,OAAO,KAAK,CAAC,MAAM,WAAW,CAAA;AAC9B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAYvC,wBAAsB,aAAa,CAAE,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,sBAKpE;AAKD,wBAAsB,UAAU,CAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ,gBAoBtF;AAWD,wBAAsB,cAAc,CAAE,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ;;;GAYzH;AAID,wBAAsB,UAAU,CAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAOjF;AAoDD,wBAAsB,WAAW,CAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,mBAAmB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ;;;GAqB7I;AAyBD,wBAAsB,YAAY,CAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ;;;GAoBrF;AAkGD,wBAAsB,QAAQ,CAAE,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ;;;;;GA2BtI"}
|
package/dist/probe/membership.js
CHANGED
|
@@ -329,7 +329,7 @@ const Buffer_ = (s) => new TextEncoder().encode(s).length;
|
|
|
329
329
|
async function handleWelcome(p, doc, from) {
|
|
330
330
|
// form BEFORE fields (M-3): the roster travels as data and becomes
|
|
331
331
|
// this person's map — every entry earns its shape before adoption
|
|
332
|
-
if (!C.shaped(doc, { issuer: 'string', recipient: 'string', payload: 'object', proof: 'object' })
|
|
332
|
+
if (!C.shaped(doc, { issuer: 'string', recipient: 'string', threadId: 'string', payload: 'object', proof: 'object' })
|
|
333
333
|
|| !C.shaped(doc.payload, { genesisDigest: 'string', group: 'string', label: 'string', roster: 'array' })
|
|
334
334
|
|| !doc.payload.roster.every((m) => C.shaped(m, { anchor: 'string', name: 'string', addedAt: 'string' })))
|
|
335
335
|
return { handled: true, error: 'malformed welcome' };
|
|
@@ -347,6 +347,22 @@ async function handleWelcome(p, doc, from) {
|
|
|
347
347
|
}
|
|
348
348
|
if (doc.recipient !== my.anchor)
|
|
349
349
|
return { handled: true, error: 'welcome not for my member anchor' };
|
|
350
|
+
// a held group is never rewritten by a later welcome
|
|
351
|
+
if (p.groups.has(gd))
|
|
352
|
+
return { handled: true, idempotent: true };
|
|
353
|
+
// the welcome answers an invitation THIS device accepted (Membership
|
|
354
|
+
// Tasks: it travels in the invite's thread, from the inviter, for the
|
|
355
|
+
// accept's subject and the invited group) — a signed welcome from a held
|
|
356
|
+
// contact without that binding adopts nothing
|
|
357
|
+
const entry = p.inbox.find((e) => e.kind === 'invite' && e.accepted && !e.welcomed
|
|
358
|
+
&& e.invite.taskContext === doc.threadId && e.invite.issuer === doc.issuer
|
|
359
|
+
&& e.myMemberCtx.anchor === doc.recipient
|
|
360
|
+
&& e.invite.credentialSubject.genesisDigest === gd && e.invite.credentialSubject.group === doc.payload.group);
|
|
361
|
+
if (!entry)
|
|
362
|
+
return { handled: true, error: 'welcome without an accepted invitation' };
|
|
363
|
+
const listed = new Set(doc.payload.roster.map((m) => m.anchor));
|
|
364
|
+
if (!listed.has(doc.issuer) || !listed.has(my.anchor))
|
|
365
|
+
return { handled: true, error: 'welcome roster omits its issuer or subject' };
|
|
350
366
|
const g = {
|
|
351
367
|
label: doc.payload.label, groupDid: doc.payload.group, genesisDigest: gd,
|
|
352
368
|
genesis: doc.payload.genesis, myMemberCtx: my, role: 'member',
|
|
@@ -357,6 +373,7 @@ async function handleWelcome(p, doc, from) {
|
|
|
357
373
|
};
|
|
358
374
|
g.myAcceptDigest = g.roster.get(my.anchor)?.acceptDigest ?? null;
|
|
359
375
|
p.groups.set(gd, g);
|
|
376
|
+
entry.welcomed = true;
|
|
360
377
|
if (from)
|
|
361
378
|
(from.sharedGroups ??= []).push(gd); // der Invitee WEISS, wer ihn eingeladen hat
|
|
362
379
|
say(p, `Willkommen in „${g.label}" — Roster mit ${g.roster.size} Mitgliedern übernommen`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"membership.js","sourceRoot":"","sources":["../../src/probe/membership.ts"],"names":[],"mappings":"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","sourcesContent":["// groups.mjs — Stage C: groups over the introduced channel. PROBE.\n// DOM-free, on rltp-core + rltp-crypto (+ the shipped schemas: the invite\n// IS the DTG InvitationCredential of membership-invite/0.2, the accept IS\n// membership-accept/0.2 — both schema-validated at issuance AND receipt).\n//\n// WHAT THIS PROBE EXERCISES (the converged Membership 0.16 / Access 0.30\n// semantics, instantiated live):\n// founding — the founder signs the genesis under a FOUNDING pair\n// context (Access 3.4.1: group/<digest> cannot exist\n// before the digest does); genesisDigest = multihash\n// over the proof-free genesis; the founder then derives\n// the member anchor group/<digest> and self-enrolls.\n// prelude — the inviter cannot derive the invitee's member anchor;\n// the invitee's app derives it from the genesisDigest\n// (canonical-u before the label, Access 5.1) and answers\n// over the EXISTING relationship channel (Membership 1.2).\n// invite — a conformant DTG InvitationCredential in a delivery\n// document WITHOUT a document proof (one carrier,\n// Membership 2); invitee re-derives and compares\n// (the prelude check, Membership 3.1).\n// accept — consent, task-proved under the subject; ref = the\n// CREDENTIAL digest (decoded-bytes equality).\n// admission — the inviter runs the Access 5.3 pair-internal checks\n// (path convention, time window incl. membership-skew,\n// size budget, card enclosure profile) and updates the\n// roster; a WELCOME (probe form) carries the roster to\n// members over their channels.\n// OUT OF PROBE SCOPE (named, not faked): the full access-operation\n// envelope (oid/prev/epochs), welcome seal + keydist/epoch keys, vouch\n// paths and candidacy surfacing, removal. That is the library's next\n// growth ring — the checks here are the real ones, the transport forms\n// marked @probe are not wire-normative.\nimport { jcs, makeValidator, toU, sameDigest, tsec, calOK } from '../core.js'\nimport * as C from './deps.js'\nimport type { Person } from './deps.js'\nimport { SCHEMAS } from '../schemas.js'\n\nconst V = makeValidator(SCHEMAS)\nconst validOr = (data: any, file: string) => { const s = SCHEMAS[file]; const errs = V.validate(data, s, s); if (errs.length) throw new Error(file + ': ' + errs[0]); return data }\nconst MEMBERSHIP_SKEW = 300 // PT5M (Membership §5)\nconst TT = 'https://real-life.org/trust-tasks/'\nconst CTX3 = ['https://www.w3.org/ns/credentials/v2', 'https://firstperson.network/credentials/dtg/v1', 'https://real-life.org/rltp/v1']\nconst say = (p: Person, m: string) => p.log.push(m)\nconst uuid = (ent?: any) => ent ?? globalThis.crypto.randomUUID()\n\n// member anchor: canonical-u re-encoding BEFORE the label (Access 5.1)\nexport async function memberContext (p: Person, genesisDigest: string) {\n const label = 'group/' + toU(genesisDigest)\n const ctx = await C.labeledContext(p.rootIkm, label)\n p.contexts.set(ctx.anchor, ctx); p.contexts.set(ctx.keyAgreement, ctx)\n return ctx\n}\nconst memberCard = async (ctx: any, name: string, whenIso: string) =>\n validOr(await C.signCard(ctx, C.cardBody(ctx, { name }), whenIso), 'contact-card.schema.json')\n\n// ── founding ────────────────────────────────────────────────────────────\nexport async function foundGroup (p: Person, label: string, when: number, ent: any = {}) {\n const iso = C.iso(when)\n const founding = await C.pairContext(p.rootIkm, ent.foundingNonce ?? C.rand(32)) // pair class: the founding occasion\n const groupDid = C.anchorOfEd((await C.edFromSeed(ent.groupSeed ?? C.rand(32))).pubRaw) // group address (probe mint; Identity work)\n const genesisBody = { type: 'group-genesis@probe', group: groupDid, label, founder: founding.anchor, issuedAt: iso }\n const genesis = await C.diSign(founding, genesisBody, iso)\n const genesisDigest = await C.digestDoc(genesisBody) // proof-free signature input (Access 3.2)\n const my = await memberContext(p, genesisDigest)\n const card = await memberCard(my, p.name, iso)\n const g: any = {\n label, groupDid, genesisDigest, genesis, myMemberCtx: my, role: 'founder',\n vouchThreshold: ent.vouchThreshold ?? 1, // Bürgschaftsschwelle (Gruppenregel; UI zeigt sie nur > 1)\n vouchesReceived: new Map(), // Bürgschaften FÜR MICH (issuer -> vouch@2)\n myVouches: new Map(), // Bürgschaften VON MIR (candidate -> vouch@2)\n roster: new Map([[my.anchor, { name: p.name, card, addedAt: iso, founder: true }]]),\n threads: new Map(), // invitee member anchor -> { threadId, invite } (open invitations)\n }\n p.groups.set(genesisDigest, g)\n say(p, `Gruppe „${label}\" gegründet — Genesis unter Gründungs-pair-Anker, Member-Anker ${my.anchor.slice(0, 20)}… abgeleitet`)\n return g\n}\n\n// ── transport helper: sealed doc over an existing relationship channel ──\nasync function sendDoc (p: Person, contact: any, doc: any, ent: any = {}) {\n return { to: contact, env: await C.seal(doc, contact.channel.counterpartKa, ent) }\n}\nconst channelCtxOf = (p: Person, doc: any) => p.contexts.get(doc.recipient) ?? null\nconst contactByAnchor = (p: Person, anchor: string) => p.contacts.get(anchor) ?? null\nconst contactOfIssuer = (p: Person, issuer: string) => p.contacts.get(issuer) ?? null\n\n// ── prelude (Membership 1.2/3.1: the invitee supplies the member anchor) ─\nexport async function preludeRequest (p: Person, contactAnchor: string, genesisDigest: string, when: number, ent: any = {}) {\n const contact = contactByAnchor(p, contactAnchor)\n const g = p.groups.get(genesisDigest)\n const body = {\n id: uuid(ent.id), type: TT + 'membership-prelude-request@probe',\n issuer: contact.channel.own.anchor, recipient: contactAnchor,\n threadId: uuid(ent.threadId), issuedAt: C.iso(when),\n payload: { genesisDigest, group: g.groupDid, label: g.label },\n }\n const doc = await C.diSign(contact.channel.own, body, C.iso(when))\n say(p, `Prelude an ${contact.name}: genesisDigest der Gruppe „${g.label}\" über den Beziehungs-Kanal`)\n return sendDoc(p, contact, doc, ent)\n}\n\n// ── receive dispatch: every membership doc travels the channel sealed ───\n// Returns { handled, outbound?: [{to, env}], prompt?: entry }.\nexport async function receiveDoc (p: Person, env: any, when: number, ent: any = {}) {\n const opened = await C.openEnvelope(p, env) // Stufen 1–4, Cache-Lesung\n if (opened.duplicate) return { handled: true, duplicate: true }\n if (opened.error) return { handled: false }\n const r = await receiveDocInner(p, env, opened.doc, when, ent)\n if (r?.handled && !(r as any).error) C.effectDone(p, opened.digest)\n return r\n}\nasync function receiveDocInner (p: Person, env: any, doc: any, when: number, ent: any = {}) {\n const ctx = channelCtxOf(p, { recipient: env.rkid }) ?? p.contexts.get(env.rkid)\n if (!ctx) return { handled: false }\n if (typeof doc?.type !== 'string' || !doc.type.startsWith(TT + 'membership-')) return { handled: false, doc }\n // the sender is identified by the CHANNEL the envelope arrived on (rkid\n // names our own pair context of exactly one relationship) — membership\n // documents carry MEMBER anchors as issuer, which no contact key holds\n const from = [...p.contacts.values()].find((c) => c.channel?.own?.anchor === ctx.anchor) ?? contactOfIssuer(p, doc.issuer)\n switch (doc.type.slice((TT + 'membership-').length)) {\n case 'prelude-request@probe': {\n // form BEFORE fields (review 3, M-3): a valid signature binds\n // whatever was signed — payload.genesisDigest earns its type here\n if (!C.shaped(doc, { issuer: 'string', threadId: 'string', payload: 'object', proof: 'object' })\n || !C.shaped(doc.payload, { genesisDigest: 'string', group: 'string', label: 'string' })) return { handled: true, error: 'malformed prelude' }\n if (!from || !(await C.diVerify(doc, doc.issuer))) return { handled: true, error: 'prelude proof' }\n let my\n try { my = await memberContext(p, doc.payload.genesisDigest) } catch { return { handled: true, error: 'genesisDigest not canonical' } }\n const body = {\n id: uuid(), type: TT + 'membership-prelude-reply@probe',\n issuer: from.channel.own.anchor, recipient: doc.issuer,\n threadId: doc.threadId, issuedAt: C.iso(when),\n payload: { genesisDigest: doc.payload.genesisDigest, memberAnchor: my.anchor },\n }\n const reply = await C.diSign(from.channel.own, body, C.iso(when))\n say(p, `Prelude von ${from.name}: Member-Anker für „${doc.payload.label}\" abgeleitet und geantwortet`)\n return { handled: true, outbound: [await sendDoc(p, from, reply, ent)] }\n }\n case 'prelude-reply@probe': {\n if (!C.shaped(doc, { issuer: 'string', threadId: 'string', payload: 'object', proof: 'object' })\n || !C.shaped(doc.payload, { genesisDigest: 'string', memberAnchor: 'string' })\n || C.edRawOfAnchor(doc.payload.memberAnchor) === null) return { handled: true, error: 'malformed prelude-reply' }\n if (!from || !(await C.diVerify(doc, doc.issuer))) return { handled: true, error: 'prelude-reply proof' }\n const g = [...p.groups.values()].find((g) => g.genesisDigest === doc.payload.genesisDigest)\n if (!g) return { handled: true, error: 'unknown group' }\n // Log erst NACH dem gelungenen Bau; ein Schema-Throw aus\n // buildInvite verlässt die Empfangs-Promise nie (Review 9, P-B2)\n let inv\n try { inv = await buildInvite(p, g, from, doc.payload.memberAnchor, when, doc.threadId, ent) }\n catch (e: any) { return { handled: true, error: 'invite build: ' + String(e?.message ?? e) } }\n say(p, `${from.name}s Member-Anker erhalten — Einladung wird ausgestellt`)\n return { handled: true, outbound: [inv] }\n }\n case 'invite/0.2': return handleInvite(p, doc, from, when)\n case 'accept/0.2': return handleAccept(p, doc, from, when, ent)\n case 'welcome@probe': return handleWelcome(p, doc, from)\n case 'vouch/0.1': return handleVouch(p, doc, from)\n }\n return { handled: false, doc }\n}\n\n// ── the invite: a conformant DTG InvitationCredential (one carrier) ─────\nexport async function buildInvite (p: Person, g: any, contact: any, inviteeMemberAnchor: string, when: number, threadId: string, ent: any = {}) {\n const iso = C.iso(when), until = C.iso(when + 24 * 3600 * 1000)\n const inviterCard = await memberCard(g.myMemberCtx, p.name, iso)\n const credBody = {\n '@context': CTX3,\n type: ['VerifiableCredential', 'DTGCredential', 'InvitationCredential', 'MembershipInvite'],\n issuer: g.myMemberCtx.anchor,\n credentialSubject: { id: inviteeMemberAnchor, group: g.groupDid, genesisDigest: g.genesisDigest, card: inviterCard, name: g.label },\n validFrom: iso, validUntil: until, taskContext: threadId,\n }\n const invite = await C.diSign(g.myMemberCtx, credBody, iso)\n validOr({ invite }, 'payload-membership-invite.schema.json')\n const doc = { // document-level proof ABSENT: the credential is the one carrier (Membership 2)\n id: uuid(ent.docId), type: TT + 'membership-invite/0.2',\n issuer: g.myMemberCtx.anchor, recipient: inviteeMemberAnchor,\n threadId, issuedAt: iso, payload: { invite },\n }\n validOr(doc, 'rltp-delivery-document.schema.json')\n g.threads.set(inviteeMemberAnchor, { threadId, invite, contactAnchor: [...p.contacts.entries()].find(([, c]) => c === contact)![0] })\n say(p, `Einladung (InvitationCredential) an ${contact.name} — Thread ${threadId.slice(0, 8)}…`)\n return sendDoc(p, contact, doc, ent)\n}\n\nasync function handleInvite (p: Person, doc: any, from: any, when: number) {\n if (!from) return { handled: true, error: 'invite not from a held contact' }\n const inv = doc.payload?.invite\n try { validOr(doc.payload, 'payload-membership-invite.schema.json'); validOr(doc, 'rltp-delivery-document.schema.json') } catch (e: any) { say(p, 'Einladung schema-ungültig: ' + e.message); return { handled: true, error: 'schema' } }\n if ('proof' in doc) { say(p, 'Einladung trägt Dokument-Proof — one carrier verletzt'); return { handled: true, error: 'one-carrier' } }\n if (!(await C.diVerify(inv, inv.issuer))) return { handled: true, error: 'credential proof' }\n if (inv.issuer !== doc.issuer || inv.credentialSubject.id !== doc.recipient || inv.taskContext !== doc.threadId) return { handled: true, error: 'document bindings' }\n if (inv.credentialSubject.card.anchor !== inv.issuer || !(await C.diVerify(inv.credentialSubject.card, inv.issuer))) return { handled: true, error: 'card ownership' }\n const cardOK = !('sentTo' in inv.credentialSubject.card) && !('boundTo' in inv.credentialSubject.card) && !('deliveryHints' in inv.credentialSubject.card)\n if (!cardOK) return { handled: true, error: 'card enclosure profile' }\n if (![inv.validFrom, inv.validUntil, inv.proof.created].every(calOK) || tsec(inv.validUntil) < tsec(inv.validFrom)) return { handled: true, error: 'validity' }\n // THE PRELUDE CHECK (Membership 3.1): my own derivation from the\n // genesisDigest must equal credentialSubject.id — a substituted anchor\n // dies here, whatever the prelude's path was\n const my = await memberContext(p, inv.credentialSubject.genesisDigest)\n if (my.anchor !== inv.credentialSubject.id) { say(p, 'Prelude-Check FEHLGESCHLAGEN: Einladung nennt nicht meine Ableitung'); return { handled: true, error: 'prelude mismatch' } }\n const entry = { kind: 'invite', doc, invite: inv, from: from.name, fromAnchor: doc.issuer, fromContact: from, myMemberCtx: my, decided: false }\n p.inbox.push(entry)\n say(p, `${from.name} lädt dich in „${inv.credentialSubject.name ?? 'eine Gruppe'}\" ein (Einladung geprüft, Prelude-Check bestanden)`)\n return { handled: true, prompt: entry }\n}\n\n// ── the accept: consent, task-proved, credential-digest ref ─────────────\nexport async function acceptInvite (p: Person, entry: any, when: number, ent: any = {}) {\n const inv = entry.invite\n const iso = C.iso(when)\n const card = await memberCard(entry.myMemberCtx, p.name, iso)\n const payload = { accept: {\n group: inv.credentialSubject.group, subject: entry.myMemberCtx.anchor,\n ref: await C.digestDoc(inv), // the invitation identity: JCS over the COMPLETE credential incl. proof\n card, candidacy: ent.candidacy ?? false,\n } }\n validOr(payload, 'payload-membership-accept.schema.json')\n const body = {\n id: uuid(ent.docId), type: TT + 'membership-accept/0.2',\n issuer: entry.myMemberCtx.anchor, recipient: inv.issuer,\n threadId: inv.taskContext, issuedAt: iso, payload,\n }\n const doc = await C.diSign(entry.myMemberCtx, body, iso) // task proof under the subject (Membership 2)\n validOr(doc, 'rltp-delivery-document.schema.json')\n entry.decided = true; entry.accepted = true\n say(p, `Beitritt zu „${inv.credentialSubject.name}\" erklärt (Accept, ref = Credential-Digest)`)\n return sendDoc(p, entry.fromContact, doc, ent)\n}\n\n// ── admission: the Access 5.3 pair-internal checks, then roster + welcome ─\nasync function handleAccept (p: Person, doc: any, from: any, when: number, ent: any = {}) {\n const g = [...p.groups.values()].find((g) => g.threads.has(doc.issuer))\n if (!g) return { handled: true, error: 'no open invitation for this subject' }\n const th = g.threads.get(doc.issuer)\n const inv = th.invite, acc = doc.payload?.accept\n const fail = async (why: string) => { say(p, `Admission abgelehnt: ${why}`); return { handled: true, error: why } }\n try { validOr(doc.payload, 'payload-membership-accept.schema.json'); validOr(doc, 'rltp-delivery-document.schema.json') } catch { return fail('schema') }\n if (!(await C.diVerify(doc, doc.issuer))) return fail('accept task proof')\n if (!sameDigest(acc.ref, await C.digestDoc(inv))) return fail('ref ≠ credential digest') // decoded-bytes equality\n if (acc.subject !== inv.credentialSubject.id || acc.subject !== doc.issuer) return fail('subject binding')\n if (acc.group !== inv.credentialSubject.group || !sameDigest(inv.credentialSubject.genesisDigest, g.genesisDigest)) return fail('group binding')\n if (doc.threadId !== inv.taskContext) return fail('thread binding')\n if (acc.card.anchor !== acc.subject || !(await C.diVerify(acc.card, acc.subject))) return fail('card ownership')\n if (('sentTo' in acc.card) || ('boundTo' in acc.card) || ('deliveryHints' in acc.card)) return fail('card enclosure profile')\n if (![doc.issuedAt, doc.proof.created].every(calOK)) return fail('calendar validity')\n if (tsec(doc.issuedAt) > tsec(inv.validUntil) + MEMBERSHIP_SKEW * 1000 || tsec(doc.proof.created) > tsec(inv.validUntil) + MEMBERSHIP_SKEW * 1000) return fail('accept after validUntil + membership-skew')\n if (Buffer_(jcs(doc)) > 16384 || Buffer_(jcs({ invite: inv })) > 16384) return fail('size budget')\n if (!g.roster.has(inv.issuer)) return fail('inviter not a member')\n if (g.roster.has(acc.subject)) { say(p, 'Same-Subject-Admission: idempotent'); return { handled: true, idempotent: true } }\n // ATOMICITY (review 3, B-2): every await that can fail — digest,\n // signing, sealing — happens BEFORE the first state mutation. If the\n // welcome cannot be built, the roster has not grown, the thread still\n // stands, and the SAME delivery can be retried cleanly.\n const newEntry = { name: acc.card.name, card: acc.card, addedAt: C.iso(when), candidacy: acc.candidacy === true,\n acceptDigest: await C.digestDoc(doc), contactAnchor: th.contactAnchor }\n const contact = contactByAnchor(p, th.contactAnchor)\n const rosterAfter = [...g.roster.entries(), [acc.subject, newEntry] as const]\n const wBody = {\n id: uuid(), type: TT + 'membership-welcome@probe',\n issuer: g.myMemberCtx.anchor, recipient: acc.subject,\n threadId: doc.threadId, issuedAt: C.iso(when),\n payload: { genesisDigest: g.genesisDigest, group: g.groupDid, label: g.label, genesis: g.genesis, vouchThreshold: g.vouchThreshold ?? 1,\n roster: rosterAfter.map(([anchor, m]: any) => ({ anchor, name: m.name, addedAt: m.addedAt, founder: !!m.founder, candidacy: !!m.candidacy, acceptDigest: m.acceptDigest ?? null })) },\n }\n const welcome = await sendDoc(p, contact, await C.diSign(g.myMemberCtx, wBody, C.iso(when)), ent)\n // — from here on, synchronous only —\n g.roster.set(acc.subject, newEntry)\n { const c = contactByAnchor(p, th.contactAnchor); if (c) (c.sharedGroups ??= []).push(g.genesisDigest) } // der Inviter WEISS, wer beigetreten ist\n g.threads.delete(doc.issuer)\n say(p, `${acc.card.name} ist Mitglied von „${g.label}\" — Admission kanonisch, Consent konsumiert`)\n return { handled: true, admitted: acc.subject, outbound: [welcome] }\n}\nconst Buffer_ = (s: any) => new TextEncoder().encode(s).length\n\nasync function handleWelcome (p: Person, doc: any, from: any) {\n // form BEFORE fields (M-3): the roster travels as data and becomes\n // this person's map — every entry earns its shape before adoption\n if (!C.shaped(doc, { issuer: 'string', recipient: 'string', payload: 'object', proof: 'object' })\n || !C.shaped(doc.payload, { genesisDigest: 'string', group: 'string', label: 'string', roster: 'array' })\n || !doc.payload.roster.every((m: any) => C.shaped(m, { anchor: 'string', name: 'string', addedAt: 'string' }))) return { handled: true, error: 'malformed welcome' }\n if (toU(doc.payload.genesisDigest) !== doc.payload.genesisDigest) return { handled: true, error: 'malformed welcome (genesisDigest)' }\n if (!(await C.diVerify(doc, doc.issuer))) return { handled: true, error: 'welcome proof' }\n const gd = doc.payload.genesisDigest\n let my\n try { my = await memberContext(p, gd) } catch { return { handled: true, error: 'genesisDigest not canonical' } }\n if (doc.recipient !== my.anchor) return { handled: true, error: 'welcome not for my member anchor' }\n const g: any = {\n label: doc.payload.label, groupDid: doc.payload.group, genesisDigest: gd,\n genesis: doc.payload.genesis, myMemberCtx: my, role: 'member',\n vouchThreshold: doc.payload.vouchThreshold ?? 1,\n vouchesReceived: new Map(), myVouches: new Map(),\n roster: new Map(doc.payload.roster.map((m: any) => [m.anchor, m])),\n threads: new Map(),\n }\n g.myAcceptDigest = g.roster.get(my.anchor)?.acceptDigest ?? null\n p.groups.set(gd, g)\n if (from) (from.sharedGroups ??= []).push(gd) // der Invitee WEISS, wer ihn eingeladen hat\n say(p, `Willkommen in „${g.label}\" — Roster mit ${g.roster.size} Mitgliedern übernommen`)\n return { handled: true, joined: gd }\n}\n\n// ── die Bürgschaft (Task membership-vouch/0.1, Artefakt vouch@2) ────────\n// ein konformes DTG EndorsementCredential ──────────────────────────────\n// (AdmissionVouch, Access 4.2/4.3): genesisDigest bindet die Gruppe,\n// accept bindet die KONSENTIERTE Kandidatur (keine stehende Bürgschaft),\n// provenance ist selbst-attestiert (met | introduced). Signiert unter dem\n// MEMBER-Anker des Bürgen; schema-validiert bei Ausstellung UND Empfang.\n// Transport (probe): über den Beziehungs-Kanal zum KANDIDATEN — nur wer\n// einen Kanal zum Kandidaten hält, kann liefern (per-device-Wissen,\n// nichts wird erfunden); der Kandidat sammelt und zählt gegen die\n// Schwelle. Gruppenweite Sichtbarkeit der Zählung = Access-Envelope-Ring.\nexport async function vouchFor (p: Person, genesisDigest: string, candidateAnchor: string, provenance: any, when: number, ent: any = {}) {\n const g = p.groups.get(genesisDigest)\n const m = g?.roster.get(candidateAnchor)\n if (!g || !m) return { error: 'unbekannter Kandidat' }\n if (!m.candidacy) return { error: 'keine sichtbare Kandidatur (Opt-in fehlt)' }\n if (!m.acceptDigest) return { error: 'kein accept-Bezug — Bürgschaft wäre stehend' }\n if (!m.contactAnchor || !p.contacts.get(m.contactAnchor)) return { error: 'kein Kanal zum Kandidaten' }\n if (g.myVouches.has(candidateAnchor)) return { error: 'bereits gebürgt' }\n const iso = C.iso(when)\n const cred = await C.diSign(g.myMemberCtx, {\n '@context': CTX3,\n type: ['VerifiableCredential', 'DTGCredential', 'EndorsementCredential', 'AdmissionVouch'],\n issuer: g.myMemberCtx.anchor,\n validFrom: iso,\n credentialSubject: { id: candidateAnchor, endorsement: {\n type: 'AdmissionVouch', genesisDigest: toU(g.genesisDigest), accept: toU(m.acceptDigest), provenance } },\n }, iso)\n validOr(cred, 'access-vouch.schema.json')\n g.myVouches.set(candidateAnchor, cred)\n const contact = p.contacts.get(m.contactAnchor)\n const doc = {\n id: uuid(ent.docId), type: TT + 'membership-vouch/0.1',\n issuer: g.myMemberCtx.anchor, recipient: candidateAnchor,\n threadId: uuid(ent.threadId), issuedAt: iso, payload: { vouch: cred },\n }\n say(p, `Bürgschaft für ${m.name} in „${g.label}\" ausgestellt (${provenance}, accept-gebunden)`)\n return sendDoc(p, contact, await C.diSign(g.myMemberCtx, doc, iso), ent)\n}\n\n// Kandidatenseite: jede Prüfung an ihrem Punkt, dann zählen\nasync function handleVouch (p: Person, doc: any, from: any) {\n const cred = doc.payload?.vouch\n const g = [...p.groups.values()].find((g) => cred && sameDigest(cred.credentialSubject?.endorsement?.genesisDigest ?? '', g.genesisDigest))\n const fail = (why: string) => { say(p, `Bürgschaft verworfen: ${why}`); return { handled: true, error: why } }\n if (!g) return fail('unbekannte Gruppe')\n try { validOr(cred, 'access-vouch.schema.json') } catch { return fail('schema') }\n if (!(await C.diVerify(cred, cred.issuer)) || !(await C.diVerify(doc, doc.issuer))) return fail('proof')\n if (cred.issuer !== doc.issuer) return fail('issuer binding')\n if (!g.roster.has(cred.issuer)) return fail('Bürge ist kein Mitglied')\n if (cred.credentialSubject.id !== g.myMemberCtx.anchor) return fail('nicht für mich')\n if (!g.myAcceptDigest || !sameDigest(cred.credentialSubject.endorsement.accept, g.myAcceptDigest)) return fail('accept-Bindung')\n if (g.vouchesReceived.has(cred.issuer)) { say(p, 'Bürgschaft doppelt — idempotent'); return { handled: true, idempotent: true } }\n g.vouchesReceived.set(cred.issuer, cred)\n const n = g.vouchesReceived.size, need = g.vouchThreshold ?? 1\n if (n >= need) {\n const me = g.roster.get(g.myMemberCtx.anchor)\n if (me) me.candidacy = false\n g.candidacyFulfilled = true\n say(p, `Bürgschaft von ${g.roster.get(cred.issuer)?.name ?? '?'} — Schwelle erreicht (${n}/${need}), Kandidatur erfüllt`)\n } else {\n say(p, `Bürgschaft von ${g.roster.get(cred.issuer)?.name ?? '?'} erhalten (${n}/${need})`)\n }\n return { handled: true, vouched: cred.issuer, fulfilled: n >= need }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"membership.js","sourceRoot":"","sources":["../../src/probe/membership.ts"],"names":[],"mappings":"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","sourcesContent":["// groups.mjs — Stage C: groups over the introduced channel. PROBE.\n// DOM-free, on rltp-core + rltp-crypto (+ the shipped schemas: the invite\n// IS the DTG InvitationCredential of membership-invite/0.2, the accept IS\n// membership-accept/0.2 — both schema-validated at issuance AND receipt).\n//\n// WHAT THIS PROBE EXERCISES (the converged Membership 0.16 / Access 0.30\n// semantics, instantiated live):\n// founding — the founder signs the genesis under a FOUNDING pair\n// context (Access 3.4.1: group/<digest> cannot exist\n// before the digest does); genesisDigest = multihash\n// over the proof-free genesis; the founder then derives\n// the member anchor group/<digest> and self-enrolls.\n// prelude — the inviter cannot derive the invitee's member anchor;\n// the invitee's app derives it from the genesisDigest\n// (canonical-u before the label, Access 5.1) and answers\n// over the EXISTING relationship channel (Membership 1.2).\n// invite — a conformant DTG InvitationCredential in a delivery\n// document WITHOUT a document proof (one carrier,\n// Membership 2); invitee re-derives and compares\n// (the prelude check, Membership 3.1).\n// accept — consent, task-proved under the subject; ref = the\n// CREDENTIAL digest (decoded-bytes equality).\n// admission — the inviter runs the Access 5.3 pair-internal checks\n// (path convention, time window incl. membership-skew,\n// size budget, card enclosure profile) and updates the\n// roster; a WELCOME (probe form) carries the roster to\n// members over their channels.\n// OUT OF PROBE SCOPE (named, not faked): the full access-operation\n// envelope (oid/prev/epochs), welcome seal + keydist/epoch keys, vouch\n// paths and candidacy surfacing, removal. That is the library's next\n// growth ring — the checks here are the real ones, the transport forms\n// marked @probe are not wire-normative.\nimport { jcs, makeValidator, toU, sameDigest, tsec, calOK } from '../core.js'\nimport * as C from './deps.js'\nimport type { Person } from './deps.js'\nimport { SCHEMAS } from '../schemas.js'\n\nconst V = makeValidator(SCHEMAS)\nconst validOr = (data: any, file: string) => { const s = SCHEMAS[file]; const errs = V.validate(data, s, s); if (errs.length) throw new Error(file + ': ' + errs[0]); return data }\nconst MEMBERSHIP_SKEW = 300 // PT5M (Membership §5)\nconst TT = 'https://real-life.org/trust-tasks/'\nconst CTX3 = ['https://www.w3.org/ns/credentials/v2', 'https://firstperson.network/credentials/dtg/v1', 'https://real-life.org/rltp/v1']\nconst say = (p: Person, m: string) => p.log.push(m)\nconst uuid = (ent?: any) => ent ?? globalThis.crypto.randomUUID()\n\n// member anchor: canonical-u re-encoding BEFORE the label (Access 5.1)\nexport async function memberContext (p: Person, genesisDigest: string) {\n const label = 'group/' + toU(genesisDigest)\n const ctx = await C.labeledContext(p.rootIkm, label)\n p.contexts.set(ctx.anchor, ctx); p.contexts.set(ctx.keyAgreement, ctx)\n return ctx\n}\nconst memberCard = async (ctx: any, name: string, whenIso: string) =>\n validOr(await C.signCard(ctx, C.cardBody(ctx, { name }), whenIso), 'contact-card.schema.json')\n\n// ── founding ────────────────────────────────────────────────────────────\nexport async function foundGroup (p: Person, label: string, when: number, ent: any = {}) {\n const iso = C.iso(when)\n const founding = await C.pairContext(p.rootIkm, ent.foundingNonce ?? C.rand(32)) // pair class: the founding occasion\n const groupDid = C.anchorOfEd((await C.edFromSeed(ent.groupSeed ?? C.rand(32))).pubRaw) // group address (probe mint; Identity work)\n const genesisBody = { type: 'group-genesis@probe', group: groupDid, label, founder: founding.anchor, issuedAt: iso }\n const genesis = await C.diSign(founding, genesisBody, iso)\n const genesisDigest = await C.digestDoc(genesisBody) // proof-free signature input (Access 3.2)\n const my = await memberContext(p, genesisDigest)\n const card = await memberCard(my, p.name, iso)\n const g: any = {\n label, groupDid, genesisDigest, genesis, myMemberCtx: my, role: 'founder',\n vouchThreshold: ent.vouchThreshold ?? 1, // Bürgschaftsschwelle (Gruppenregel; UI zeigt sie nur > 1)\n vouchesReceived: new Map(), // Bürgschaften FÜR MICH (issuer -> vouch@2)\n myVouches: new Map(), // Bürgschaften VON MIR (candidate -> vouch@2)\n roster: new Map([[my.anchor, { name: p.name, card, addedAt: iso, founder: true }]]),\n threads: new Map(), // invitee member anchor -> { threadId, invite } (open invitations)\n }\n p.groups.set(genesisDigest, g)\n say(p, `Gruppe „${label}\" gegründet — Genesis unter Gründungs-pair-Anker, Member-Anker ${my.anchor.slice(0, 20)}… abgeleitet`)\n return g\n}\n\n// ── transport helper: sealed doc over an existing relationship channel ──\nasync function sendDoc (p: Person, contact: any, doc: any, ent: any = {}) {\n return { to: contact, env: await C.seal(doc, contact.channel.counterpartKa, ent) }\n}\nconst channelCtxOf = (p: Person, doc: any) => p.contexts.get(doc.recipient) ?? null\nconst contactByAnchor = (p: Person, anchor: string) => p.contacts.get(anchor) ?? null\nconst contactOfIssuer = (p: Person, issuer: string) => p.contacts.get(issuer) ?? null\n\n// ── prelude (Membership 1.2/3.1: the invitee supplies the member anchor) ─\nexport async function preludeRequest (p: Person, contactAnchor: string, genesisDigest: string, when: number, ent: any = {}) {\n const contact = contactByAnchor(p, contactAnchor)\n const g = p.groups.get(genesisDigest)\n const body = {\n id: uuid(ent.id), type: TT + 'membership-prelude-request@probe',\n issuer: contact.channel.own.anchor, recipient: contactAnchor,\n threadId: uuid(ent.threadId), issuedAt: C.iso(when),\n payload: { genesisDigest, group: g.groupDid, label: g.label },\n }\n const doc = await C.diSign(contact.channel.own, body, C.iso(when))\n say(p, `Prelude an ${contact.name}: genesisDigest der Gruppe „${g.label}\" über den Beziehungs-Kanal`)\n return sendDoc(p, contact, doc, ent)\n}\n\n// ── receive dispatch: every membership doc travels the channel sealed ───\n// Returns { handled, outbound?: [{to, env}], prompt?: entry }.\nexport async function receiveDoc (p: Person, env: any, when: number, ent: any = {}) {\n const opened = await C.openEnvelope(p, env) // Stufen 1–4, Cache-Lesung\n if (opened.duplicate) return { handled: true, duplicate: true }\n if (opened.error) return { handled: false }\n const r = await receiveDocInner(p, env, opened.doc, when, ent)\n if (r?.handled && !(r as any).error) C.effectDone(p, opened.digest)\n return r\n}\nasync function receiveDocInner (p: Person, env: any, doc: any, when: number, ent: any = {}) {\n const ctx = channelCtxOf(p, { recipient: env.rkid }) ?? p.contexts.get(env.rkid)\n if (!ctx) return { handled: false }\n if (typeof doc?.type !== 'string' || !doc.type.startsWith(TT + 'membership-')) return { handled: false, doc }\n // the sender is identified by the CHANNEL the envelope arrived on (rkid\n // names our own pair context of exactly one relationship) — membership\n // documents carry MEMBER anchors as issuer, which no contact key holds\n const from = [...p.contacts.values()].find((c) => c.channel?.own?.anchor === ctx.anchor) ?? contactOfIssuer(p, doc.issuer)\n switch (doc.type.slice((TT + 'membership-').length)) {\n case 'prelude-request@probe': {\n // form BEFORE fields (review 3, M-3): a valid signature binds\n // whatever was signed — payload.genesisDigest earns its type here\n if (!C.shaped(doc, { issuer: 'string', threadId: 'string', payload: 'object', proof: 'object' })\n || !C.shaped(doc.payload, { genesisDigest: 'string', group: 'string', label: 'string' })) return { handled: true, error: 'malformed prelude' }\n if (!from || !(await C.diVerify(doc, doc.issuer))) return { handled: true, error: 'prelude proof' }\n let my\n try { my = await memberContext(p, doc.payload.genesisDigest) } catch { return { handled: true, error: 'genesisDigest not canonical' } }\n const body = {\n id: uuid(), type: TT + 'membership-prelude-reply@probe',\n issuer: from.channel.own.anchor, recipient: doc.issuer,\n threadId: doc.threadId, issuedAt: C.iso(when),\n payload: { genesisDigest: doc.payload.genesisDigest, memberAnchor: my.anchor },\n }\n const reply = await C.diSign(from.channel.own, body, C.iso(when))\n say(p, `Prelude von ${from.name}: Member-Anker für „${doc.payload.label}\" abgeleitet und geantwortet`)\n return { handled: true, outbound: [await sendDoc(p, from, reply, ent)] }\n }\n case 'prelude-reply@probe': {\n if (!C.shaped(doc, { issuer: 'string', threadId: 'string', payload: 'object', proof: 'object' })\n || !C.shaped(doc.payload, { genesisDigest: 'string', memberAnchor: 'string' })\n || C.edRawOfAnchor(doc.payload.memberAnchor) === null) return { handled: true, error: 'malformed prelude-reply' }\n if (!from || !(await C.diVerify(doc, doc.issuer))) return { handled: true, error: 'prelude-reply proof' }\n const g = [...p.groups.values()].find((g) => g.genesisDigest === doc.payload.genesisDigest)\n if (!g) return { handled: true, error: 'unknown group' }\n // Log erst NACH dem gelungenen Bau; ein Schema-Throw aus\n // buildInvite verlässt die Empfangs-Promise nie (Review 9, P-B2)\n let inv\n try { inv = await buildInvite(p, g, from, doc.payload.memberAnchor, when, doc.threadId, ent) }\n catch (e: any) { return { handled: true, error: 'invite build: ' + String(e?.message ?? e) } }\n say(p, `${from.name}s Member-Anker erhalten — Einladung wird ausgestellt`)\n return { handled: true, outbound: [inv] }\n }\n case 'invite/0.2': return handleInvite(p, doc, from, when)\n case 'accept/0.2': return handleAccept(p, doc, from, when, ent)\n case 'welcome@probe': return handleWelcome(p, doc, from)\n case 'vouch/0.1': return handleVouch(p, doc, from)\n }\n return { handled: false, doc }\n}\n\n// ── the invite: a conformant DTG InvitationCredential (one carrier) ─────\nexport async function buildInvite (p: Person, g: any, contact: any, inviteeMemberAnchor: string, when: number, threadId: string, ent: any = {}) {\n const iso = C.iso(when), until = C.iso(when + 24 * 3600 * 1000)\n const inviterCard = await memberCard(g.myMemberCtx, p.name, iso)\n const credBody = {\n '@context': CTX3,\n type: ['VerifiableCredential', 'DTGCredential', 'InvitationCredential', 'MembershipInvite'],\n issuer: g.myMemberCtx.anchor,\n credentialSubject: { id: inviteeMemberAnchor, group: g.groupDid, genesisDigest: g.genesisDigest, card: inviterCard, name: g.label },\n validFrom: iso, validUntil: until, taskContext: threadId,\n }\n const invite = await C.diSign(g.myMemberCtx, credBody, iso)\n validOr({ invite }, 'payload-membership-invite.schema.json')\n const doc = { // document-level proof ABSENT: the credential is the one carrier (Membership 2)\n id: uuid(ent.docId), type: TT + 'membership-invite/0.2',\n issuer: g.myMemberCtx.anchor, recipient: inviteeMemberAnchor,\n threadId, issuedAt: iso, payload: { invite },\n }\n validOr(doc, 'rltp-delivery-document.schema.json')\n g.threads.set(inviteeMemberAnchor, { threadId, invite, contactAnchor: [...p.contacts.entries()].find(([, c]) => c === contact)![0] })\n say(p, `Einladung (InvitationCredential) an ${contact.name} — Thread ${threadId.slice(0, 8)}…`)\n return sendDoc(p, contact, doc, ent)\n}\n\nasync function handleInvite (p: Person, doc: any, from: any, when: number) {\n if (!from) return { handled: true, error: 'invite not from a held contact' }\n const inv = doc.payload?.invite\n try { validOr(doc.payload, 'payload-membership-invite.schema.json'); validOr(doc, 'rltp-delivery-document.schema.json') } catch (e: any) { say(p, 'Einladung schema-ungültig: ' + e.message); return { handled: true, error: 'schema' } }\n if ('proof' in doc) { say(p, 'Einladung trägt Dokument-Proof — one carrier verletzt'); return { handled: true, error: 'one-carrier' } }\n if (!(await C.diVerify(inv, inv.issuer))) return { handled: true, error: 'credential proof' }\n if (inv.issuer !== doc.issuer || inv.credentialSubject.id !== doc.recipient || inv.taskContext !== doc.threadId) return { handled: true, error: 'document bindings' }\n if (inv.credentialSubject.card.anchor !== inv.issuer || !(await C.diVerify(inv.credentialSubject.card, inv.issuer))) return { handled: true, error: 'card ownership' }\n const cardOK = !('sentTo' in inv.credentialSubject.card) && !('boundTo' in inv.credentialSubject.card) && !('deliveryHints' in inv.credentialSubject.card)\n if (!cardOK) return { handled: true, error: 'card enclosure profile' }\n if (![inv.validFrom, inv.validUntil, inv.proof.created].every(calOK) || tsec(inv.validUntil) < tsec(inv.validFrom)) return { handled: true, error: 'validity' }\n // THE PRELUDE CHECK (Membership 3.1): my own derivation from the\n // genesisDigest must equal credentialSubject.id — a substituted anchor\n // dies here, whatever the prelude's path was\n const my = await memberContext(p, inv.credentialSubject.genesisDigest)\n if (my.anchor !== inv.credentialSubject.id) { say(p, 'Prelude-Check FEHLGESCHLAGEN: Einladung nennt nicht meine Ableitung'); return { handled: true, error: 'prelude mismatch' } }\n const entry = { kind: 'invite', doc, invite: inv, from: from.name, fromAnchor: doc.issuer, fromContact: from, myMemberCtx: my, decided: false }\n p.inbox.push(entry)\n say(p, `${from.name} lädt dich in „${inv.credentialSubject.name ?? 'eine Gruppe'}\" ein (Einladung geprüft, Prelude-Check bestanden)`)\n return { handled: true, prompt: entry }\n}\n\n// ── the accept: consent, task-proved, credential-digest ref ─────────────\nexport async function acceptInvite (p: Person, entry: any, when: number, ent: any = {}) {\n const inv = entry.invite\n const iso = C.iso(when)\n const card = await memberCard(entry.myMemberCtx, p.name, iso)\n const payload = { accept: {\n group: inv.credentialSubject.group, subject: entry.myMemberCtx.anchor,\n ref: await C.digestDoc(inv), // the invitation identity: JCS over the COMPLETE credential incl. proof\n card, candidacy: ent.candidacy ?? false,\n } }\n validOr(payload, 'payload-membership-accept.schema.json')\n const body = {\n id: uuid(ent.docId), type: TT + 'membership-accept/0.2',\n issuer: entry.myMemberCtx.anchor, recipient: inv.issuer,\n threadId: inv.taskContext, issuedAt: iso, payload,\n }\n const doc = await C.diSign(entry.myMemberCtx, body, iso) // task proof under the subject (Membership 2)\n validOr(doc, 'rltp-delivery-document.schema.json')\n entry.decided = true; entry.accepted = true\n say(p, `Beitritt zu „${inv.credentialSubject.name}\" erklärt (Accept, ref = Credential-Digest)`)\n return sendDoc(p, entry.fromContact, doc, ent)\n}\n\n// ── admission: the Access 5.3 pair-internal checks, then roster + welcome ─\nasync function handleAccept (p: Person, doc: any, from: any, when: number, ent: any = {}) {\n const g = [...p.groups.values()].find((g) => g.threads.has(doc.issuer))\n if (!g) return { handled: true, error: 'no open invitation for this subject' }\n const th = g.threads.get(doc.issuer)\n const inv = th.invite, acc = doc.payload?.accept\n const fail = async (why: string) => { say(p, `Admission abgelehnt: ${why}`); return { handled: true, error: why } }\n try { validOr(doc.payload, 'payload-membership-accept.schema.json'); validOr(doc, 'rltp-delivery-document.schema.json') } catch { return fail('schema') }\n if (!(await C.diVerify(doc, doc.issuer))) return fail('accept task proof')\n if (!sameDigest(acc.ref, await C.digestDoc(inv))) return fail('ref ≠ credential digest') // decoded-bytes equality\n if (acc.subject !== inv.credentialSubject.id || acc.subject !== doc.issuer) return fail('subject binding')\n if (acc.group !== inv.credentialSubject.group || !sameDigest(inv.credentialSubject.genesisDigest, g.genesisDigest)) return fail('group binding')\n if (doc.threadId !== inv.taskContext) return fail('thread binding')\n if (acc.card.anchor !== acc.subject || !(await C.diVerify(acc.card, acc.subject))) return fail('card ownership')\n if (('sentTo' in acc.card) || ('boundTo' in acc.card) || ('deliveryHints' in acc.card)) return fail('card enclosure profile')\n if (![doc.issuedAt, doc.proof.created].every(calOK)) return fail('calendar validity')\n if (tsec(doc.issuedAt) > tsec(inv.validUntil) + MEMBERSHIP_SKEW * 1000 || tsec(doc.proof.created) > tsec(inv.validUntil) + MEMBERSHIP_SKEW * 1000) return fail('accept after validUntil + membership-skew')\n if (Buffer_(jcs(doc)) > 16384 || Buffer_(jcs({ invite: inv })) > 16384) return fail('size budget')\n if (!g.roster.has(inv.issuer)) return fail('inviter not a member')\n if (g.roster.has(acc.subject)) { say(p, 'Same-Subject-Admission: idempotent'); return { handled: true, idempotent: true } }\n // ATOMICITY (review 3, B-2): every await that can fail — digest,\n // signing, sealing — happens BEFORE the first state mutation. If the\n // welcome cannot be built, the roster has not grown, the thread still\n // stands, and the SAME delivery can be retried cleanly.\n const newEntry = { name: acc.card.name, card: acc.card, addedAt: C.iso(when), candidacy: acc.candidacy === true,\n acceptDigest: await C.digestDoc(doc), contactAnchor: th.contactAnchor }\n const contact = contactByAnchor(p, th.contactAnchor)\n const rosterAfter = [...g.roster.entries(), [acc.subject, newEntry] as const]\n const wBody = {\n id: uuid(), type: TT + 'membership-welcome@probe',\n issuer: g.myMemberCtx.anchor, recipient: acc.subject,\n threadId: doc.threadId, issuedAt: C.iso(when),\n payload: { genesisDigest: g.genesisDigest, group: g.groupDid, label: g.label, genesis: g.genesis, vouchThreshold: g.vouchThreshold ?? 1,\n roster: rosterAfter.map(([anchor, m]: any) => ({ anchor, name: m.name, addedAt: m.addedAt, founder: !!m.founder, candidacy: !!m.candidacy, acceptDigest: m.acceptDigest ?? null })) },\n }\n const welcome = await sendDoc(p, contact, await C.diSign(g.myMemberCtx, wBody, C.iso(when)), ent)\n // — from here on, synchronous only —\n g.roster.set(acc.subject, newEntry)\n { const c = contactByAnchor(p, th.contactAnchor); if (c) (c.sharedGroups ??= []).push(g.genesisDigest) } // der Inviter WEISS, wer beigetreten ist\n g.threads.delete(doc.issuer)\n say(p, `${acc.card.name} ist Mitglied von „${g.label}\" — Admission kanonisch, Consent konsumiert`)\n return { handled: true, admitted: acc.subject, outbound: [welcome] }\n}\nconst Buffer_ = (s: any) => new TextEncoder().encode(s).length\n\nasync function handleWelcome (p: Person, doc: any, from: any) {\n // form BEFORE fields (M-3): the roster travels as data and becomes\n // this person's map — every entry earns its shape before adoption\n if (!C.shaped(doc, { issuer: 'string', recipient: 'string', threadId: 'string', payload: 'object', proof: 'object' })\n || !C.shaped(doc.payload, { genesisDigest: 'string', group: 'string', label: 'string', roster: 'array' })\n || !doc.payload.roster.every((m: any) => C.shaped(m, { anchor: 'string', name: 'string', addedAt: 'string' }))) return { handled: true, error: 'malformed welcome' }\n if (toU(doc.payload.genesisDigest) !== doc.payload.genesisDigest) return { handled: true, error: 'malformed welcome (genesisDigest)' }\n if (!(await C.diVerify(doc, doc.issuer))) return { handled: true, error: 'welcome proof' }\n const gd = doc.payload.genesisDigest\n let my\n try { my = await memberContext(p, gd) } catch { return { handled: true, error: 'genesisDigest not canonical' } }\n if (doc.recipient !== my.anchor) return { handled: true, error: 'welcome not for my member anchor' }\n // a held group is never rewritten by a later welcome\n if (p.groups.has(gd)) return { handled: true, idempotent: true }\n // the welcome answers an invitation THIS device accepted (Membership\n // Tasks: it travels in the invite's thread, from the inviter, for the\n // accept's subject and the invited group) — a signed welcome from a held\n // contact without that binding adopts nothing\n const entry = p.inbox.find((e: any) => e.kind === 'invite' && e.accepted && !e.welcomed\n && e.invite.taskContext === doc.threadId && e.invite.issuer === doc.issuer\n && e.myMemberCtx.anchor === doc.recipient\n && e.invite.credentialSubject.genesisDigest === gd && e.invite.credentialSubject.group === doc.payload.group)\n if (!entry) return { handled: true, error: 'welcome without an accepted invitation' }\n const listed = new Set(doc.payload.roster.map((m: any) => m.anchor))\n if (!listed.has(doc.issuer) || !listed.has(my.anchor)) return { handled: true, error: 'welcome roster omits its issuer or subject' }\n const g: any = {\n label: doc.payload.label, groupDid: doc.payload.group, genesisDigest: gd,\n genesis: doc.payload.genesis, myMemberCtx: my, role: 'member',\n vouchThreshold: doc.payload.vouchThreshold ?? 1,\n vouchesReceived: new Map(), myVouches: new Map(),\n roster: new Map(doc.payload.roster.map((m: any) => [m.anchor, m])),\n threads: new Map(),\n }\n g.myAcceptDigest = g.roster.get(my.anchor)?.acceptDigest ?? null\n p.groups.set(gd, g)\n entry.welcomed = true\n if (from) (from.sharedGroups ??= []).push(gd) // der Invitee WEISS, wer ihn eingeladen hat\n say(p, `Willkommen in „${g.label}\" — Roster mit ${g.roster.size} Mitgliedern übernommen`)\n return { handled: true, joined: gd }\n}\n\n// ── die Bürgschaft (Task membership-vouch/0.1, Artefakt vouch@2) ────────\n// ein konformes DTG EndorsementCredential ──────────────────────────────\n// (AdmissionVouch, Access 4.2/4.3): genesisDigest bindet die Gruppe,\n// accept bindet die KONSENTIERTE Kandidatur (keine stehende Bürgschaft),\n// provenance ist selbst-attestiert (met | introduced). Signiert unter dem\n// MEMBER-Anker des Bürgen; schema-validiert bei Ausstellung UND Empfang.\n// Transport (probe): über den Beziehungs-Kanal zum KANDIDATEN — nur wer\n// einen Kanal zum Kandidaten hält, kann liefern (per-device-Wissen,\n// nichts wird erfunden); der Kandidat sammelt und zählt gegen die\n// Schwelle. Gruppenweite Sichtbarkeit der Zählung = Access-Envelope-Ring.\nexport async function vouchFor (p: Person, genesisDigest: string, candidateAnchor: string, provenance: any, when: number, ent: any = {}) {\n const g = p.groups.get(genesisDigest)\n const m = g?.roster.get(candidateAnchor)\n if (!g || !m) return { error: 'unbekannter Kandidat' }\n if (!m.candidacy) return { error: 'keine sichtbare Kandidatur (Opt-in fehlt)' }\n if (!m.acceptDigest) return { error: 'kein accept-Bezug — Bürgschaft wäre stehend' }\n if (!m.contactAnchor || !p.contacts.get(m.contactAnchor)) return { error: 'kein Kanal zum Kandidaten' }\n if (g.myVouches.has(candidateAnchor)) return { error: 'bereits gebürgt' }\n const iso = C.iso(when)\n const cred = await C.diSign(g.myMemberCtx, {\n '@context': CTX3,\n type: ['VerifiableCredential', 'DTGCredential', 'EndorsementCredential', 'AdmissionVouch'],\n issuer: g.myMemberCtx.anchor,\n validFrom: iso,\n credentialSubject: { id: candidateAnchor, endorsement: {\n type: 'AdmissionVouch', genesisDigest: toU(g.genesisDigest), accept: toU(m.acceptDigest), provenance } },\n }, iso)\n validOr(cred, 'access-vouch.schema.json')\n g.myVouches.set(candidateAnchor, cred)\n const contact = p.contacts.get(m.contactAnchor)\n const doc = {\n id: uuid(ent.docId), type: TT + 'membership-vouch/0.1',\n issuer: g.myMemberCtx.anchor, recipient: candidateAnchor,\n threadId: uuid(ent.threadId), issuedAt: iso, payload: { vouch: cred },\n }\n say(p, `Bürgschaft für ${m.name} in „${g.label}\" ausgestellt (${provenance}, accept-gebunden)`)\n return sendDoc(p, contact, await C.diSign(g.myMemberCtx, doc, iso), ent)\n}\n\n// Kandidatenseite: jede Prüfung an ihrem Punkt, dann zählen\nasync function handleVouch (p: Person, doc: any, from: any) {\n const cred = doc.payload?.vouch\n const g = [...p.groups.values()].find((g) => cred && sameDigest(cred.credentialSubject?.endorsement?.genesisDigest ?? '', g.genesisDigest))\n const fail = (why: string) => { say(p, `Bürgschaft verworfen: ${why}`); return { handled: true, error: why } }\n if (!g) return fail('unbekannte Gruppe')\n try { validOr(cred, 'access-vouch.schema.json') } catch { return fail('schema') }\n if (!(await C.diVerify(cred, cred.issuer)) || !(await C.diVerify(doc, doc.issuer))) return fail('proof')\n if (cred.issuer !== doc.issuer) return fail('issuer binding')\n if (!g.roster.has(cred.issuer)) return fail('Bürge ist kein Mitglied')\n if (cred.credentialSubject.id !== g.myMemberCtx.anchor) return fail('nicht für mich')\n if (!g.myAcceptDigest || !sameDigest(cred.credentialSubject.endorsement.accept, g.myAcceptDigest)) return fail('accept-Bindung')\n if (g.vouchesReceived.has(cred.issuer)) { say(p, 'Bürgschaft doppelt — idempotent'); return { handled: true, idempotent: true } }\n g.vouchesReceived.set(cred.issuer, cred)\n const n = g.vouchesReceived.size, need = g.vouchThreshold ?? 1\n if (n >= need) {\n const me = g.roster.get(g.myMemberCtx.anchor)\n if (me) me.candidacy = false\n g.candidacyFulfilled = true\n say(p, `Bürgschaft von ${g.roster.get(cred.issuer)?.name ?? '?'} — Schwelle erreicht (${n}/${need}), Kandidatur erfüllt`)\n } else {\n say(p, `Bürgschaft von ${g.roster.get(cred.issuer)?.name ?? '?'} erhalten (${n}/${need})`)\n }\n return { handled: true, vouched: cred.issuer, fulfilled: n >= need }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@real-life/trust-protocol",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.2",
|
|
4
4
|
"description": "The Real Life Trust Protocol (RLTP) \u2014 the executable form of the specification: encounters, introductions, trust disclosure, groups, continuity, and the delivery channel. Zero dependencies, WebCrypto only.",
|
|
5
5
|
"license": "CC-BY-4.0",
|
|
6
6
|
"type": "module",
|
|
@@ -49,7 +49,8 @@
|
|
|
49
49
|
],
|
|
50
50
|
"repository": {
|
|
51
51
|
"type": "git",
|
|
52
|
-
"url": "https://github.com/real-life-org/
|
|
52
|
+
"url": "https://github.com/real-life-org/trust-protocol",
|
|
53
|
+
"directory": "lib"
|
|
53
54
|
},
|
|
54
55
|
"homepage": "https://rltp.real-life.org",
|
|
55
56
|
"engines": {
|