Custody: rows+chain commit atomically per batch; audit gains reverse check (unchained content fails), opens read-only, refuses missing stores. Gate: tie-averaged Spearman (order-invariant; old impl could flip the gate by alphabetization), both raters required, peeks labeled + unservable + never pass. Manifests: corpus_hash covers full records (manifest_version 2). Embedding cache self-invalidating (text-hash + model@revision key, chunked reads, one implementation). serve: --config, health survives bad timestamps, routes generated from artifacts.KINDS. cycle command owns window policy; compose ships the collector. artifacts.py pins byte-determinism (utf-8, sorted keys) for every writer. congress.py (dead custody-bypassing draft) deleted. stats.py + hardening regression suite; 60 tests.
39 lines
1.0 KiB
YAML
39 lines
1.0 KiB
YAML
# The full deployment: read-only API plus the 6-hourly collector.
|
|
# docker compose up -d # api :8477 + collector
|
|
# docker compose run --rm api ingest # any one-shot command
|
|
# docker compose run --rm api validate --ratings ... # gate day
|
|
#
|
|
# The collector's only shell is a sleep loop; everything with logic in it —
|
|
# window policy, artifact naming, audit — is `tiltmeter cycle`, tested Python.
|
|
x-common: &common
|
|
image: tiltmeter:latest
|
|
build: .
|
|
user: "568:568"
|
|
environment:
|
|
HOME: /tmp
|
|
volumes:
|
|
- ./data:/app/data
|
|
- ./releases:/app/releases
|
|
restart: unless-stopped
|
|
logging:
|
|
driver: json-file
|
|
options:
|
|
max-size: 10m
|
|
max-file: "3"
|
|
|
|
services:
|
|
api:
|
|
<<: *common
|
|
command: ["serve", "--releases", "releases"]
|
|
ports:
|
|
- "8477:8477"
|
|
collector:
|
|
<<: *common
|
|
entrypoint: ["/bin/sh", "-c"]
|
|
command:
|
|
- |
|
|
while true; do
|
|
tiltmeter cycle || echo "cycle failed; retrying next interval"
|
|
sleep 21600
|
|
done
|