eventslisted
Install: claude install-skill zedarvates/botte-secrete
# events — the unified decision log
One append-only file per project, one JSON line per decision. Nothing else in
the pipeline needs to change what it does — it just also calls `log_event`.
```bash
python -m skills.events.cli tail . # last 20 events
python -m skills.events.cli tail . -n 50 --json
python -m skills.events.cli log route . --field out=local --field tokens_saved=210
python -m skills.events.cli clear .
```
```python
from skills.events import log_event, read_events, tail_events, follow_events
log_event("route", project_root=".", filter=1, out="local", tokens_saved=210)
tail_events(".", n=20)
for rec in follow_events("."): # blocking generator, for --live tools
...
```
## Event kinds
| kind | typical fields | emitted by |
|------|-----------------|------------|
| `route` | filter, out (local/cloud), tokens_saved, reason | `auto_router.AutoRouter.decide` |
| `cache` | hit (bool), key, tokens_saved | `cache.ProjectCache` |
| `escalate` | from, to, reason | `auto_router.AutoRouter.run` |
| `nn_out` | model, probs/class | `botte_nn` predictors |
| `fusion` | strategy, models | `auto_router.fusion` |
`kind` is free-form — any skill can log its own label; the table above is
just what the showcase tools (demo mode, dashboard `--watch`, replay) render
by default.
## Design
- **Best-effort, never raises.** A logging failure must never break the
caller — same contract as `control_loop.record`.
- **Rotation** at 5 MB, keeps the newest half — same spir