Implement REIN-A-0002 ops_run claim loop and approach registry.

Add activity-core ops_run client, approach selection (FI/Binky/mail/agent),
claim-loop worker with lease heartbeat, CLI run --from-ops-run and claim-loop,
install units, and docs demoting issue-core to legacy external tickets.
T05 timer cutover remains operator after five clean cycles.
This commit is contained in:
tegwick 2026-08-03 20:04:25 +02:00
parent 9644202eb2
commit 8200a672ea
15 changed files with 1807 additions and 73 deletions

View file

@ -1,70 +1,89 @@
# Task intake (HARNESS-WP-0001-T03)
# Task intake
activity-core emits tasks via IssueSink → `POST /issues/` on **issue-core**.
rein-aharness **consumes** them by polling the same service:
**Architecture:** ACT-ADR-005 · ACTIVITY-WP-0026 · REIN-A-0002
## Primary: activity-core `ops_run` (scheduled automation)
Internal fleet automation (FI daily brief, Binky rhythm, mail intake, …)
emits a claimable **`ops_run`** in activity-core. rein-aharness claims that
row — **not** issue-core and **not** Forgejo.
```
activity-core (cron/rule)
→ IssueCoreRestSink POST /issues/
→ issue-core backend (sqlite / gitea)
→ rein-aharness poll/claim GET+PATCH /issues/
→ run_task (profile + budget + persona + session)
→ PATCH close + hub progress + .kaizen/metrics
activity-core (Temporal + rules)
→ INSERT ops_run (open) + dual-write activity_task_spawn (state-hub)
→ rein-aharness claim-loop
POST /ops-runs/claim → approach registry → execute → complete/fail
→ domain completion events (fi_daily_brief, binky_daily_brief, …)
```
`TaskExecutorWorkflow` stays a stub (activity-core INTENT); execution lives here.
Full guide: **`docs/ops-run-claim-loop.md`**.
## Mail path (server / Railiance)
### CLI
```
rein-aharness mail-scan # deterministic IMAP (AppRole)
rein-aharness mail-triage # llm-connect HTTP → JSON → apply mail-log + commit
```bash
export ACTIVITY_CORE_URL=http://127.0.0.1:8010
export ACTIVITY_CORE_WORKER_TOKEN=…
export AGENT_HARNESS_REPO_MAP='{"freedom-intelligence":"~/freedom-intelligence","binky-control":"~/binky-control"}'
rein-aharness poll --source=ops-run --no-claim
rein-aharness run --from-ops-run
rein-aharness claim-loop
```
Requires `LLM_CONNECT_URL` (e.g. in-cluster
`http://llm-connect.activity-core.svc.cluster.local:8080`). Optional:
`MAIL_TRIAGE_MODEL`, `MAIL_TRIAGE_MAX_TOKENS`, `MAIL_TRIAGE_MAX_ROWS`.
**No Claude CLI** on the host.
`TaskExecutorWorkflow` in activity-core stays a stub; execution lives here.
## issue-core worker API
---
## Legacy / external: issue-core poll
issue-core remains for **external tracker tickets** and intentional
`ISSUE_SINK_TYPE=rest` projections to **Forgejo** (self-hosted forge only —
no Gitea product path).
```
activity-core (optional rest sink)
→ issue-core POST /issues/
→ rein-aharness poll --source=issue-core
→ run_task / close
```
Do **not** use this path as the claim queue for FI/Binky ops under WP-0022.
### issue-core worker API
| Method | Path | Role |
|--------|------|------|
| POST | `/issues/` | Ingest (activity-core) |
| POST | `/issues/` | Ingest (activity-core rest sink) |
| GET | `/issues/?state=open&label=automated` | Poll queue |
| GET | `/issues/{id}` | Fetch one |
| PATCH | `/issues/{id}` | Claim (`in_progress` + assignee) or `closed` |
Auth: `Authorization: Bearer $ISSUE_CORE_API_KEY` or `X-API-Key`.
## CLI
```bash
export ISSUE_CORE_URL=http://127.0.0.1:8765 # or in-cluster service
export ISSUE_CORE_URL=http://127.0.0.1:8765
export ISSUE_CORE_API_KEY=…
export AGENT_HARNESS_REPO_MAP='{"binky-control":"/home/tegwick/binky-control"}'
# Peek / claim without executing
rein-aharness poll
rein-aharness poll --no-claim
# Claim → run → close (or reopen on failure)
rein-aharness poll --source=issue-core
rein-aharness run --from-issue-core
# Local dev (unchanged)
rein-aharness run --task-file examples/task-hello-sandbox.json --no-hub
```
## Label filter
Default label filter: **`automated`** (`AGENT_HARNESS_INTAKE_LABELS`).
Default: issues must carry the **`automated`** label (matches activity-core
binky definitions). Override:
---
```bash
export AGENT_HARNESS_INTAKE_LABELS=automated,harness # ALL required
## Mail path (server / Railiance)
```
rein-aharness mail-scan # deterministic IMAP (AppRole)
rein-aharness mail-triage # llm-connect HTTP → JSON → apply mail-log + commit
# or via claim-loop when ops_run labels include mail-intake
```
## Agent + completion event mapping
Requires `LLM_CONNECT_URL`. **No Claude CLI** required for mail/brief approaches.
---
## Agent + completion event mapping (issue-core / agent-session)
From `activity_definition_id` or labels:
@ -75,11 +94,12 @@ From `activity_definition_id` or labels:
| `binky-weekly-review-prep` / `weekly-review` | `review-prep` | `binky_weekly_review` |
| else | `coach` | `executor_run` |
Instance policy (`tool_profile`, `budget`, `lane`) still comes from the
target repo's `.kaizen/schedule.yml`.
Approach registry for ops_run (preferred): see `docs/ops-run-claim-loop.md`.
---
## Repo path resolution
1. Absolute/expanded path if it is already a git repo
2. `AGENT_HARNESS_REPO_MAP` JSON
3. Search `AGENT_HARNESS_REPO_ROOTS` (default `~:~/work`) for the slug
3. Search `AGENT_HARNESS_REPO_ROOTS` (default `~:~/work`) for the slug