rein-aharness/docs/task-intake.md
tegwick 7520a53831 feat: mail-triage via llm-connect (no host Claude)
Add LLMConnectClient and mail-triage: CSV metadata → OpenRouter-backed
llm-connect JSON plan → deterministic mail-log apply + commit. Server path
for Binky mail intake on Railiance (BINKY-WP-0006).
2026-07-22 00:05:23 +02:00

85 lines
2.7 KiB
Markdown

# Task intake (HARNESS-WP-0001-T03)
activity-core emits tasks via IssueSink → `POST /issues/` on **issue-core**.
agent-harness **consumes** them by polling the same service:
```
activity-core (cron/rule)
→ IssueCoreRestSink POST /issues/
→ issue-core backend (sqlite / gitea)
→ agent-harness poll/claim GET+PATCH /issues/
→ run_task (profile + budget + persona + session)
→ PATCH close + hub progress + .kaizen/metrics
```
`TaskExecutorWorkflow` stays a stub (activity-core INTENT); execution lives here.
## Mail path (server / Railiance)
```
agent-harness mail-scan # deterministic IMAP (AppRole)
agent-harness mail-triage # llm-connect HTTP → JSON → apply mail-log + commit
```
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.
## issue-core worker API
| Method | Path | Role |
|--------|------|------|
| POST | `/issues/` | Ingest (activity-core) |
| 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_API_KEY=
export AGENT_HARNESS_REPO_MAP='{"binky-control":"/home/tegwick/binky-control"}'
# Peek / claim without executing
agent-harness poll
agent-harness poll --no-claim
# Claim → run → close (or reopen on failure)
agent-harness run --from-issue-core
# Local dev (unchanged)
agent-harness run --task-file examples/task-hello-sandbox.json --no-hub
```
## Label filter
Default: issues must carry the **`automated`** label (matches activity-core
binky definitions). Override:
```bash
export AGENT_HARNESS_INTAKE_LABELS=automated,harness # ALL required
```
## Agent + completion event mapping
From `activity_definition_id` or labels:
| Hint | Instance agent | completion_event_type |
|------|----------------|------------------------|
| `binky-daily-rhythm` / `rhythm` | `coach` | `binky_daily_brief` |
| `binky-weekly-mail-intake` / `mail-intake` | `mail-triage` | `binky_mail_intake` |
| `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`.
## 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