Resolution Protocol (RP)

An open protocol for recorders. Every voice a recorder hears gains an identity and its own record, and controls that record by speaking (or by a button): how much of its words is kept, and for how long. Lowest wins; a voice raises only itself; a raise that affects others takes effect at once but anyone can undo it, retroactively, within the objection window; content degrades on a schedule and becomes unrecoverable.

Layout

protocol/
  SPEC.md                    normative text
  schemas/                   profile · locale · event (JSON Schema 2020-12)
  locales/<bcp47>.json       spoken phrases → intents, as data
  vectors/                   phrases.<locale>.json · sessions.json · retention.json
  python/resolution_protocol levels · profile · grammar · session · retention · conformance
  js/resolution.js           the same engine for browsers and Node; js/conformance.js runs the vectors
  research/prior-art.md      what was borrowed, and what was rejected on purpose

Use it

from resolution_protocol import Profile, Session, load_locale, parse

p = Profile.from_dict({"id": "my-recorder", "default_level": 0, "locales": ["en"], "invocation": ["notes"],
                       "retention": [{"until": "P7D", "max_level": 4}, {"until": "P90D", "max_level": 1}]})
en = load_locale("protocol/locales/en.json")
s = Session(p)
s.heard("spk-1", now=0)
for intent in parse("you can quote me", [en], p.invocation):
    s.apply(intent, "spk-1", confidence=0.93, now=0)
s.applied("spk-1")           # → 4 (verbatim, for spk-1's own words)
s.applied(None)              # → 0 (everyone who has said nothing stays off the record)
s.stamp("spk-1", 0, 4.2)     # file the speech in spk-1's own record, at that level
s.usable(level=3)            # what an attributed summary may draw on
const RP = require('./protocol/js/resolution.js');   // or <script src> → window.ResolutionProtocol
const s = new RP.Session({ id: 'my-recorder', default_level: 0, locales: ['en'], retention: [{ until: 'P7D', max_level: 4 }] });

Check an implementation

python3 -m resolution_protocol.conformance     # from protocol/python
node protocol/js/conformance.js

To add a language, add locales/<tag>.json and vectors/phrases.<tag>.json. To add a recorder, write a profile (see Goldfish's) and bind its ports (SPEC §12).

# Resolution Protocol (RP)

An open protocol for recorders. Every voice a recorder hears gains an identity and its own record, and controls that record by speaking (or by a button): how much of its words is kept, and for how long. Lowest wins; a voice raises only itself; a raise that affects others takes effect at once but anyone can undo it, retroactively, within the objection window; content degrades on a schedule and becomes unrecoverable.

- **Spec:** [SPEC.md](SPEC.md) (v0.2 draft; Appendix C lists the changes from 0.1)
- **Prior art:** [research/prior-art.md](research/prior-art.md). It covers SIPREC, Teams, Meet, Zoom, ODRL, DPV, ISO/IEC 27560, IEEE 7012, GPC, NIST 800-88, C2PA and the AI Act.
- **Reference implementations:** [python/resolution_protocol](python/resolution_protocol) and [js/resolution.js](js/resolution.js) (browser and Node). Neither has dependencies.
- **Conformance vectors:** [vectors/](vectors/) — phrases per locale, sessions (generated by `tools/make_session_vectors.py`), retention. `tools/fuzz_parity.py` checks the two implementations against each other on random sessions.
- **Grammars:** [locales/](locales/) — `en` (reference) and `es` (draft).
- **Schemas:** [schemas/](schemas/) — profile, locale, event.

## Layout

```
protocol/
  SPEC.md                    normative text
  schemas/                   profile · locale · event (JSON Schema 2020-12)
  locales/<bcp47>.json       spoken phrases → intents, as data
  vectors/                   phrases.<locale>.json · sessions.json · retention.json
  python/resolution_protocol levels · profile · grammar · session · retention · conformance
  js/resolution.js           the same engine for browsers and Node; js/conformance.js runs the vectors
  research/prior-art.md      what was borrowed, and what was rejected on purpose
```

## Use it

```python
from resolution_protocol import Profile, Session, load_locale, parse

p = Profile.from_dict({"id": "my-recorder", "default_level": 0, "locales": ["en"], "invocation": ["notes"],
                       "retention": [{"until": "P7D", "max_level": 4}, {"until": "P90D", "max_level": 1}]})
en = load_locale("protocol/locales/en.json")
s = Session(p)
s.heard("spk-1", now=0)
for intent in parse("you can quote me", [en], p.invocation):
    s.apply(intent, "spk-1", confidence=0.93, now=0)
s.applied("spk-1")           # → 4 (verbatim, for spk-1's own words)
s.applied(None)              # → 0 (everyone who has said nothing stays off the record)
s.stamp("spk-1", 0, 4.2)     # file the speech in spk-1's own record, at that level
s.usable(level=3)            # what an attributed summary may draw on
```

```js
const RP = require('./protocol/js/resolution.js');   // or <script src> → window.ResolutionProtocol
const s = new RP.Session({ id: 'my-recorder', default_level: 0, locales: ['en'], retention: [{ until: 'P7D', max_level: 4 }] });
```

## Check an implementation

```
python3 -m resolution_protocol.conformance     # from protocol/python
node protocol/js/conformance.js
```

To add a language, add `locales/<tag>.json` and `vectors/phrases.<tag>.json`. To add a recorder, write a profile (see [Goldfish's](../v01/profile/goldfish.profile.json)) and bind its ports (SPEC §12).