# rein-aharness (formerly `agent-harness`, renamed per glas-harness ADR-001 "rein" harness family) The single shared runtime for unattended agent instances in the Coulomb / Operational Knowledge ecosystem. Projects declare agents (manifest + `.kaizen/` state); this harness runs them — blueprint via kaizen-agentic, tasks via activity-core, compute via llm-connect, credentials via OpenBao/ops-warden, reporting to the Custodian State Hub. Within the glas-harness meta-framework, this repo is the **`rein-aharness` rein**: the Claude-Code-CLI-driven, unattended/scheduled harness for tenants that need governed cron-style agent runs. See [glas-harness ADR-001](../glas-harness/docs/adr/ADR-001-rein-harness-family.md) for how it relates to other reins (e.g. `rein-openweights`). The CLI command (`rein-aharness`) and Python package (`rein_aharness`) are renamed. Deploy artifacts (Docker image tag, k8s namespace, Railiance host paths) are renamed in this repo too, but the live Railiance cutover itself (moving the host-side checkout + secrets dir, redeploying) is a separate, deliberate step — tracked in [workplans/HARNESS-WP-0002](workplans/HARNESS-WP-0002-rename-and-glas-harness-alignment.md) and [deploy/README.md](deploy/README.md)'s rename cutover checklist. - Why and boundaries: [INTENT.md](INTENT.md) - Decision + architecture: [docs/adr/ADR-001](docs/adr/ADR-001-agent-harness-architecture.md) (kept under its original filename — it documents the pre-rename decision), [docs/architecture.md](docs/architecture.md) - Current work: [workplans/](workplans/) ## Usage ``` # Validate a consuming repo's instance manifest (.kaizen/schedule.yml) rein-aharness validate --target ~/binky-control rein-aharness validate --target ~/binky-control --strict # require harness fields # List named tool profiles rein-aharness profiles # Run exactly one task (local JSON task-file path — dev) rein-aharness run --task-file examples/task-hello-sandbox.json [--no-hub] [--no-metrics] # Production intake: poll issue-core (activity-core emissions), claim, run, close export ISSUE_CORE_URL=http://127.0.0.1:8765 ISSUE_CORE_API_KEY=… rein-aharness poll rein-aharness run --from-issue-core # Deterministic mailbox scan (no LLM session) rein-aharness mail-scan --target-repo ~/binky-control # Mail triage via llm-connect HTTP (OpenRouter behind the service; no Claude CLI) export LLM_CONNECT_URL=http://llm-connect.activity-core.svc.cluster.local:8080 rein-aharness mail-triage --target-repo ~/binky-control # Daily brief via llm-connect (structured JSON → briefs/YYYY-MM-DD-daily-brief.md) rein-aharness brief-daily --target-repo ~/binky-control # Railiance packaging smoke (commit + optional push + hub; no Claude required) rein-aharness smoke --work-dir ~/work/executor-sandbox ``` Railiance deploy: [deploy/README.md](deploy/README.md). Each `run` resolves the agent's tool profile + budget from the target repo's instance manifest (default `green-commit-only`), loads a persona bundle (`kaizen-agentic schedule prepare`), runs a bounded agentic session (cwd-pinned, hard allow-list, never pushes), verifies a local commit, writes `.kaizen/metrics`, and posts a State Hub progress event. Instance manifest contract: [docs/instance-manifest.md](docs/instance-manifest.md). Example: [examples/schedule.harness.yml](examples/schedule.harness.yml). Tests: `PYTHONPATH=".:$HOME/llm-connect" python3 -m pytest tests/ -q`