# Playbook — One campaign, three resolutions, and the way back down to evidence

Ask the same question at raw and campaign level, compare what each costs, then walk a summary back to the 128 posts behind it.

## What you need

- Docker 24 or later
- Python 3.9 or later
- About 4 minutes: this dataset writes around 420 records and relationships

## 1. Start a disposable Corrobore

```bash
mkdir -p .corrobore-tls .corrobore-secrets
printf '%s\n' 'change-me' > .corrobore-secrets/http-token
openssl req -x509 -newkey rsa:2048 -sha256 -nodes \
  -keyout .corrobore-tls/server.key -out .corrobore-tls/server.crt \
  -days 30 -subj '/CN=localhost' \
  -addext 'basicConstraints=critical,CA:FALSE' \
  -addext 'keyUsage=critical,digitalSignature,keyEncipherment' \
  -addext 'extendedKeyUsage=serverAuth' \
  -addext 'subjectAltName=DNS:localhost,IP:127.0.0.1'

docker run --rm -d --name corrobore-playbook \
  -p 127.0.0.1:8080:8080 \
  -e CORROBORE_STORAGE_MODE=ephemeral \
  -v "$PWD/.corrobore-secrets/http-token:/run/secrets/corrobore-http-token:ro" \
  -v "$PWD/.corrobore-tls/server.crt:/run/secrets/tls.crt:ro" \
  -v "$PWD/.corrobore-tls/server.key:/run/secrets/tls.key:ro" \
  ghcr.io/estance-labs/corrobore:latest

curl --insecure -H 'Authorization: Bearer change-me' https://127.0.0.1:8080/health/ready
```

## 2. Install the notebook dependencies

```bash
pip install requests
```

## 3. Run the notebook

```bash
jupyter lab notebook.ipynb
```

The notebook loads `dataset.json` from the same directory. Keep the three files together.

## 4. What to observe

1. The campaign-level recall answers the briefing question with a fraction of the payload the raw-level recall needs.
2. Every episode opens onto its source posts through `derived_from`, so no summary is a dead end.
3. The four-minute burst is one record with eight participant roles; the same observation as pairwise edges would be 28 assertions nobody made.
4. Routing the question to a level is a decision taken before any budget is spent.

## 5. Change one thing and re-run

- Seed the campaign question at `post--001` with `max_depth: 3` and watch the payload grow without improving the answer.
- Delete the `derived_from` edges from the dataset and observe that the summary becomes unfalsifiable.
- Add a ninth participant to the coordination event and recompute the pairwise count.
- Lower `supernode_threshold` to 32 and see which level starts hitting the guard first.

## Boundaries

- The campaign, the accounts and the posts are synthetic.
- Resolution levels are modeled as record kinds and derivation as a relationship; the typed resolution model and true hyperrelations are `graph-core` primitives without an HTTP route in this release.
- The n-ary event here is one record carrying participant roles in its properties, which preserves arity but is not the engine's hyperrelation type.

## Tear down

```bash
docker rm -f corrobore-playbook
```

---

Documentation: https://docs.corrobore.org — Source: https://github.com/Estance-Labs/corrobore
