# spikinglabs/rondel > Rondel: end-to-end encrypted retrospectives and meetings, no accounts Version 1, digest sha256:d651d9dec624ce3c0565c571b4a5fb96a61f75f06b83372d7c3d258d57850b0f. product pack · 72 obligations (72 decided, 0 default, 0 open, 5 unchecked) · 7 assumptions (1 monitored) · 325/325 checks trace to an obligation. ## Build this pack For coding agents whose user shared https://symbola.sh/packs/spikinglabs/rondel/ and wants it built. Run these steps yourself; ask the user only for the language if they have not named one. 1. Install the Symbola CLI (Python 3.11+): `uv tool install symbola` (or `pipx install symbola`). Not `pip install symbolon`: that PyPI name is another project. 2. Download the pack: `symbola pull spikinglabs/rondel --dest spec`. 3. Read `spec/AGENTS.md` and follow it. Build only from `spec/`: don't look for the original product's source, the registry repository (it holds holdout tests) or other builds. Packs released before the rename say `symbolon `: run `symbola ` instead. This is a product pack: `spec/PRODUCT.md` describes the whole product (its shape, surfaces and flows). Build that product, in the user's stack, with the components below as its core. Don't build a demo page around the components instead. 4. Build each component in its own folder and run its checks as you go, fixing what fails: symbola impl-init impl/backup --contract spec/components/backup/versions/1 symbola test spec/components/backup/versions/1 impl/backup In Python, define `run(input)` in `impl.py`: it takes and returns a dict, and raises `ValueError` for input the contract rejects. Pin third-party packages with `==` in `requirements.lock`. In another language, set `language = "command"` and `command = [...]` in `symbolon-impl.toml`; the program reads one JSON input per line on stdin and writes `{"output": ...}` per line. A component whose `symbolon.toml` says `driver = "cli"` is a command line: build the real program, set `command` to it, and symbola runs it once per check. 5. When every component passes, run `symbola keygen` once, then for each component `symbola attest spec/components/backup/versions/1 impl/backup -o attestations/backup.json`. On macOS, attest needs Docker running and accepts Python, Node or a static Linux binary (for Go, `GOOS=linux`); `symbola test` runs the same checks without it. You are done when every flow in `spec/PRODUCT.md` works in the product you built and attest reports PASSED for every component. Write open questions and the readings you chose in `NOTES.md`. Every command is described at https://kausalflow.github.io/symbola/cli/. Components: - `backup`: `spec/components/backup/versions/1` - `link-crypto`: `spec/components/link-crypto/versions/1` - `meeting`: `spec/components/meeting/versions/1` - `room`: `spec/components/room/versions/1` - `series`: `spec/components/series/versions/1` - `template`: `spec/components/template/versions/1` ## Read it online Start with https://symbola.sh/packs/spikinglabs/rondel/pack.md (brief, assumptions, obligations, and links to one file per component under https://files.symbola.sh/packs/spikinglabs/rondel/parts/), or download https://symbola.sh/packs/spikinglabs/rondel/latest.tar.gz. ## Files - [AGENTS.md](https://files.symbola.sh/packs/spikinglabs/rondel/files/AGENTS.md) - [BRIEF.md](https://files.symbola.sh/packs/spikinglabs/rondel/files/BRIEF.md) - [PRODUCT.md](https://files.symbola.sh/packs/spikinglabs/rondel/files/PRODUCT.md) - [assumptions/compatible-clients.toml](https://files.symbola.sh/packs/spikinglabs/rondel/files/assumptions/compatible-clients.toml) - [assumptions/device-clocks.toml](https://files.symbola.sh/packs/spikinglabs/rondel/files/assumptions/device-clocks.toml) - [assumptions/link-stays-private.toml](https://files.symbola.sh/packs/spikinglabs/rondel/files/assumptions/link-stays-private.toml) - [assumptions/names-are-free-text.toml](https://files.symbola.sh/packs/spikinglabs/rondel/files/assumptions/names-are-free-text.toml) - [assumptions/one-server-process.toml](https://files.symbola.sh/packs/spikinglabs/rondel/files/assumptions/one-server-process.toml) - [assumptions/secure-context.toml](https://files.symbola.sh/packs/spikinglabs/rondel/files/assumptions/secure-context.toml) - [assumptions/small-meetings.toml](https://files.symbola.sh/packs/spikinglabs/rondel/files/assumptions/small-meetings.toml) - [components/backup/versions/1/examples.jsonl](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/backup/versions/1/examples.jsonl) - [components/backup/versions/1/fixtures/read-0.26.0.json](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/backup/versions/1/fixtures/read-0.26.0.json) - [components/backup/versions/1/fixtures/read-0.27.0.json](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/backup/versions/1/fixtures/read-0.27.0.json) - [components/backup/versions/1/properties.py](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/backup/versions/1/properties.py) - [components/backup/versions/1/schema.py](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/backup/versions/1/schema.py) - [components/backup/versions/1/schema/input.json](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/backup/versions/1/schema/input.json) - [components/backup/versions/1/schema/output.json](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/backup/versions/1/schema/output.json) - [components/backup/versions/1/symbolon.toml](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/backup/versions/1/symbolon.toml) - [components/link-crypto/versions/1/examples.jsonl](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/link-crypto/versions/1/examples.jsonl) - [components/link-crypto/versions/1/fixtures/open-0.26.0.json](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/link-crypto/versions/1/fixtures/open-0.26.0.json) - [components/link-crypto/versions/1/fixtures/open-0.27.0.json](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/link-crypto/versions/1/fixtures/open-0.27.0.json) - [components/link-crypto/versions/1/properties.py](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/link-crypto/versions/1/properties.py) - [components/link-crypto/versions/1/schema.py](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/link-crypto/versions/1/schema.py) - [components/link-crypto/versions/1/schema/input.json](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/link-crypto/versions/1/schema/input.json) - [components/link-crypto/versions/1/schema/output.json](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/link-crypto/versions/1/schema/output.json) - [components/link-crypto/versions/1/symbolon.toml](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/link-crypto/versions/1/symbolon.toml) - [components/meeting/versions/1/examples.jsonl](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/meeting/versions/1/examples.jsonl) - [components/meeting/versions/1/fixtures/meeting-file-0.26.0.json](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/meeting/versions/1/fixtures/meeting-file-0.26.0.json) - [components/meeting/versions/1/fixtures/meeting-file-0.27.0.json](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/meeting/versions/1/fixtures/meeting-file-0.27.0.json) - [components/meeting/versions/1/fixtures/update-0.27.0.json](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/meeting/versions/1/fixtures/update-0.27.0.json) - [components/meeting/versions/1/properties.py](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/meeting/versions/1/properties.py) - [components/meeting/versions/1/schema.py](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/meeting/versions/1/schema.py) - [components/meeting/versions/1/schema/input.json](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/meeting/versions/1/schema/input.json) - [components/meeting/versions/1/schema/output.json](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/meeting/versions/1/schema/output.json) - [components/meeting/versions/1/symbolon.toml](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/meeting/versions/1/symbolon.toml) - [components/room/versions/1/examples.jsonl](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/room/versions/1/examples.jsonl) - [components/room/versions/1/properties.py](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/room/versions/1/properties.py) - [components/room/versions/1/schema.py](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/room/versions/1/schema.py) - [components/room/versions/1/schema/input.json](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/room/versions/1/schema/input.json) - [components/room/versions/1/schema/output.json](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/room/versions/1/schema/output.json) - [components/room/versions/1/symbolon.toml](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/room/versions/1/symbolon.toml) - [components/series/versions/1/examples.jsonl](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/series/versions/1/examples.jsonl) - [components/series/versions/1/fixtures/series-update-0.26.0.json](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/series/versions/1/fixtures/series-update-0.26.0.json) - [components/series/versions/1/fixtures/series-update-0.27.0.json](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/series/versions/1/fixtures/series-update-0.27.0.json) - [components/series/versions/1/properties.py](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/series/versions/1/properties.py) - [components/series/versions/1/schema.py](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/series/versions/1/schema.py) - [components/series/versions/1/schema/input.json](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/series/versions/1/schema/input.json) - [components/series/versions/1/schema/output.json](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/series/versions/1/schema/output.json) - [components/series/versions/1/symbolon.toml](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/series/versions/1/symbolon.toml) - [components/template/versions/1/examples.jsonl](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/template/versions/1/examples.jsonl) - [components/template/versions/1/fixtures/compat-retro.yaml](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/template/versions/1/fixtures/compat-retro.yaml) - [components/template/versions/1/properties.py](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/template/versions/1/properties.py) - [components/template/versions/1/schema.py](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/template/versions/1/schema.py) - [components/template/versions/1/schema/input.json](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/template/versions/1/schema/input.json) - [components/template/versions/1/schema/output.json](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/template/versions/1/schema/output.json) - [components/template/versions/1/symbolon.toml](https://files.symbola.sh/packs/spikinglabs/rondel/files/components/template/versions/1/symbolon.toml) - [obligations.toml](https://files.symbola.sh/packs/spikinglabs/rondel/files/obligations.toml) - [symbolon-pack.toml](https://files.symbola.sh/packs/spikinglabs/rondel/files/symbolon-pack.toml)