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.
tools/make_session_vectors.py), retention. tools/fuzz_parity.py checks the two implementations against each other on random sessions.en (reference) and es (draft).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
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 }] });
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).