binky-control/workplans/BINKY-WP-0006-railiance-rhythm-continuous-intake.md
tegwick 089caa3c3b
All checks were successful
Work Records / validate (push) Successful in 17s
chore: hub writeback after BINKY-WP-0006 retarget
2026-07-22 00:03:28 +02:00

5.6 KiB

id type title domain repo status owner topic_slug created updated state_hub_workstream_id
BINKY-WP-0006 workplan Railiance rhythm: llm-connect execution (no host coding agent) infotech binky-control ready codex the-custodian 2026-07-21 2026-07-21 1c068209-c3f7-4445-82ed-f762a095120c

Close residual gaps after BINKY-WP-0004 cutover so Binky rhythm runs unattended on Railiance without installing Claude Code or any coding agent/harness shell on the host.

Architectural decision (founder direction 2026-07-21)

Wrong Right
Install Claude CLI / coding agent on railiance01 Use llm-connect (already in activity-core ns on railiance) via OpenRouter
AgenticClaudeCodeAdapter as default on server Hosted text adapter + deterministic apply of structured results
Re-implement policy in every client Keep Green/Blue rules in harness apply layer; model only classifies/drafts

Two-phase mail path (already half-built)

  1. Deterministic scan (agent-harness mail-scan) — IMAP via AppRole, CSV under mailmeta/reports/, hub binky_mail_intake counts. No LLM.
    Proven on railiance01 2026-07-21.
  2. Triage — today wrongly defaults to Claude Code agentic session.
    Target: call in-cluster
    http://llm-connect.activity-core.svc.cluster.local:8080 (OpenRouter, cost-efficient open-weights or cheap hosted model) → JSON triage plan → deterministic applier commits metadata-only queue/log updates.

Daily brief / weekly review follow the same pattern (structured draft → apply → commit), not a full IDE agent on the node.

Existing platform assets

  • llm-connect Deployment live on railiance01 (LLM_CONNECT_PROVIDER=openrouter, model currently google/gemini-2.5-flash in ConfigMap — may retarget to open-weights for cost).
  • OpenBao lane for OpenRouter key already used by that service (llm-connect-provider-secrets / CCR path under activity-core).
  • activity-core llm_client.py is the HTTP client pattern to reuse.
  • agent-harness runner.py already accepts an injected adapter= (swap default off Claude Code for server profiles).

Task: Spec llm-connect mail-triage contract

id: BINKY-WP-0006-T01
status: todo
priority: high
state_hub_task_id: "912a8802-e80f-4c04-aecd-9586c3b7a4b0"

Write integrations/railiance-llm-rhythm.md (or extend cutover runbook):

  • Input: newest mailmeta/reports/*.csv (metadata columns only; no bodies).
  • Output JSON schema: log entries, queue candidates, suspicious flags (sender/subject/date only).
  • Model profile: OpenRouter cost-efficient default (prefer open-weights; name candidates + fallback); max tokens; temperature low.
  • Apply rules: Blue lane, no push, no network from apply step; suspicious mail never acted on.
  • Where it runs: railiance Job/CronJob or host timer calling agent-harness mail-triage (new subcommand), not Claude.

Done when: doc reviewed against AutonomyPolicy + mailscan two-phase design.

Task: Implement hosted triage path in agent-harness

id: BINKY-WP-0006-T02
status: todo
priority: high
state_hub_task_id: "00439d4e-d6ee-4cbc-98e2-431eca4651fe"

In agent-harness (implementation repo; this WP tracks binky integration):

  1. LlmConnectHttpAdapter (or client matching activity-core llm_client.py) using LLM_CONNECT_URL.
  2. mail-triage command: read report → prompt → parse JSON → apply to mailmeta/mail-log.md + queues → local commit → hub event.
  3. Server profile default: never require claude CLI.
  4. Tests with fixture CSV + mock HTTP llm-connect.

Done when: unit tests green; dry-run docs for railiance.

Task: Wire OpenRouter model profile on railiance llm-connect

id: BINKY-WP-0006-T03
status: todo
priority: high
state_hub_task_id: "1f82c8e0-945e-44b6-a5dc-22dd055e751d"

On railiance01 activity-core llm-connect ConfigMap (and optional dedicated profile env for rhythm):

  • Confirm OpenRouter secret still healthy (no values in git/chat).
  • Choose cost-efficient model (open-weights preferred; document choice and $/MTok rationale).
  • Smoke: in-cluster request from a Job to llm-connect with a tiny prompt.
  • Expose URL to host timers if host-run: LLM_CONNECT_URL=http://… via cluster DNS or port-forward service policy (prefer in-cluster CronJob over host if possible).

Done when: smoke OK; ConfigMap change committed in llm-connect/activity-core overlays as appropriate.

Task: Railiance schedule uses llm path; drop Claude residual

id: BINKY-WP-0006-T04
status: todo
priority: medium
state_hub_task_id: "2093bf62-20ef-4d3e-9b91-be77a38603f7"

Update scripts/railiance-rhythm/run-mail.sh to call mail-scan then mail-triage (llm-connect), remove require_claude for mail. Prefer migrating daily/review similarly or keep them laptop-optional until T05.

Update OperatingRhythm.md + executor-cutover-runbook residual section: no coding agent on railiance.

Task: Daily/review via llm-connect (optional same WP if small)

id: BINKY-WP-0006-T05
status: todo
priority: medium
state_hub_task_id: "503ff56b-ac38-44b0-911e-937e0c2fc089"

Extend the same pattern to daily brief + weekly review prep: structured generation via llm-connect + deterministic markdown apply + commit. If scope grows, spawn BINKY-WP-0007 and mark this task done with handoff.

Task: Closure

id: BINKY-WP-0006-T06
status: todo
priority: low
state_hub_task_id: "3a93d7d4-f949-4a85-ad2e-a566ccc1f966"

Three clean unattended mail cycles on railiance (scan+triage); milestone; statehub fix-consistency.