# Playbook — An attribution answer that admits what would overturn it

Assemble an answer carrying its supporting subgraph, its counter-evidence and its gaps, then show why analytical confidence and retrieval completeness must be reported separately.

## What you need

- Docker 24 or later
- Python 3.9 or later
- About 3 minutes

## 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 envelope carries four supporting items, three contradicting ones and three unresolved gaps for a single statement.
2. The strongest-sounding support is the least reliable source in the set, and the envelope makes that visible.
3. Re-running under a starved budget leaves analytical confidence unchanged while the retrieval reports itself truncated.
4. A publication gate reading both numbers refuses the starved answer that a confidence-only check would have shipped.
5. The `recall_id` walks back to the paths and evidence source ids behind the answer.

## 5. Change one thing and re-run

- Raise `max_items` on the starved recall until the counter-evidence reappears, and watch the gate flip.
- Remove `evidence--tool-leaked` from the dataset and observe how much stronger, and how much less honest, the answer becomes.
- Add a fourth unknown with `impact: high` and decide whether your gate should also refuse on gap severity.
- Change the statement confidence to 0.9 and confirm the completeness check still blocks the starved answer.

## Boundaries

- The cluster, the evidence and the gaps are synthetic.
- `ProofCarryingAnswer` is a `graph-core` type with no HTTP route in this release; the envelope here is assembled client-side from contract fields.
- Confidence in this dataset is authored rather than computed. Calibrated assessment is a `graph-core` concern.

## Tear down

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

---

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