# single-node service runbook
Minimal operator runbook for the first Iridium service candidate surface.
This is intentionally narrow. It is for local evaluation and single-node operator checks, not a hardened production deployment.
For the packaging-oriented install view of the same surface, see `docs/service_install.md`.
## prerequisites
- Build the CLI:
```sh
cargo build --bin ir
```
- Choose a local data root. The service commands expect `--data` to point at the parent of the `data/` directory they will use.
Example layout:
```text
/tmp/iridium-service-root/
└── data/
```
## recommended settings
Use the current validated service-candidate settings:
```text
listen_address=127.0.0.1:7001
telemetry_endpoint=stdout
tls_mode=operator-optional
admin_token=local-dev
max_requests=16
```
These settings match the verified Sprint 4 operator surface and artifact scripts.
## seed a local fixture
```sh
rm -rf /tmp/iridium-service-root
mkdir -p /tmp/iridium-service-root
cargo run --quiet --bin ir -- --data /tmp/iridium-service-root ingest-node 1 1 2,3
```
## validate the config
```sh
cargo run --quiet --bin ir -- \
--data /tmp/iridium-service-root \
service-validate \
--listen 127.0.0.1:7001 \
--telemetry-endpoint stdout \
--tls operator-optional \
--admin-token local-dev \
--max-requests 16
```
## inspect the shared service contract
```sh
cargo run --quiet --bin ir -- service-report --listen 127.0.0.1:7001
```
## start the service
```sh
cargo run --quiet --bin ir -- \
--data /tmp/iridium-service-root \
service-serve \
--listen 127.0.0.1:7001 \
--telemetry-endpoint stdout \
--tls operator-optional \
--admin-token local-dev \
--max-requests 16
```
## operator checks
Run these from another terminal while `service-serve` is active:
```sh
curl http://127.0.0.1:7001/livez
curl http://127.0.0.1:7001/readyz
curl http://127.0.0.1:7001/metrics
curl 'http://127.0.0.1:7001/v1/query?q=MATCH+%28n%29+RETURN+n+LIMIT+1'
curl -H 'Authorization: Bearer local-dev' http://127.0.0.1:7001/admin/status
curl -H 'Authorization: Bearer local-dev' 'http://127.0.0.1:7001/admin/lifecycle?action=stop'
```
Expected outcomes:
- `/livez` returns `live`
- `/readyz` returns the service contract JSON
- `/metrics` returns Prometheus-style text metrics
- `/v1/query` returns one row for the seeded node
- `/admin/status` returns the service contract JSON
- `/admin/lifecycle?action=stop` returns a lifecycle response and stops the bounded service loop
## operator artifacts
Generate the product-owned service artifacts after or instead of the manual checks:
```sh
python3 scripts/service_candidate_report.py --report-dir artifacts
python3 scripts/service_lifecycle_report.py --report-dir artifacts
python3 scripts/service_compatibility_report.py --report-dir artifacts
```
This writes:
- `artifacts/service_candidate_report.json`
- `artifacts/service_candidate_report.md`
- `artifacts/service_lifecycle_report.json`
- `artifacts/service_lifecycle_report.md`
- `artifacts/service_compatibility_report.json`
- `artifacts/service_compatibility_report.md`
The compatibility report also refreshes a service-backed retrieval-quality proof on the canonical fixture:
- `artifacts/retrieval_quality_service_report.json`
- `artifacts/retrieval_quality_service_report.md`
## limits
- TLS is config-shaped only. The current service path does not implement encrypted transport.
- Auth is limited to optional bearer-token gating on admin routes.
- The service candidate path is blocking and single-process.
- The current runbook is for evaluator and operator validation, not deployment automation.