BINKY-WP-0004 finished: retire workstation cron, Railiance rhythm timers
Some checks failed
Work Records / validate (push) Has been cancelled

Complete T06 cutover: remove binky rhythm bridge crontab, install
scripts/railiance-rhythm systemd user timers on railiance01 (Europe/Berlin),
document residual continuous-intake gaps as BINKY-WP-0006. Three completion
event types verified (daily_brief, mail_intake on Railiance, weekly_review).
DEC-2026-003 marked resolved/executed.
This commit is contained in:
tegwick 2026-07-21 23:51:43 +02:00
parent f17a065ed0
commit c3ea150971
22 changed files with 380 additions and 149 deletions

View file

@ -0,0 +1,22 @@
#!/usr/bin/env bash
# Install host-side rhythm timers on railiance01 (user systemd).
# Run ON railiance01 from a fresh binky-control checkout:
# ./scripts/railiance-rhythm/install-on-railiance.sh
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
UNIT_DIR="${HOME}/.config/systemd/user"
mkdir -p "${UNIT_DIR}"
chmod +x "${ROOT}/scripts/railiance-rhythm/"*.sh
for u in binky-rhythm-daily binky-rhythm-mail binky-rhythm-review; do
cp -f "${ROOT}/scripts/railiance-rhythm/systemd/${u}.service" "${UNIT_DIR}/"
cp -f "${ROOT}/scripts/railiance-rhythm/systemd/${u}.timer" "${UNIT_DIR}/"
done
systemctl --user daemon-reload
systemctl --user enable --now binky-rhythm-daily.timer
systemctl --user enable --now binky-rhythm-mail.timer
systemctl --user enable --now binky-rhythm-review.timer
systemctl --user list-timers --all | grep binky-rhythm || true
echo "Installed. Logs: ~/.cache/binky-control/rhythm/"
echo "Agentic daily/review require: claude CLI on PATH. mail-scan does not."

View file

@ -0,0 +1,37 @@
#!/usr/bin/env bash
# Shared env for Railiance host-side Binky rhythm (BINKY-WP-0004-T06 interim).
# activity-core schedules remain the source of cadence truth; this host timer
# is the *executor* until a continuous harness poller consumes emissions
# (ISSUE_SINK_TYPE=state-hub currently writes progress only — not claimable issues).
set -euo pipefail
: "${HOME:=/home/tegwick}"
export PATH="${HOME}/.local/agent-harness/venv/bin:${HOME}/.local/bin:${PATH}"
# shellcheck disable=SC1091
source "${HOME}/.local/agent-harness/env"
export STATE_HUB_URL="${STATE_HUB_URL:-http://127.0.0.1:18000}"
export PYTHONPATH="${HOME}/agent-harness:${HOME}/llm-connect${PYTHONPATH:+:$PYTHONPATH}"
export BINKY_REPO="${BINKY_REPO:-${HOME}/binky-control}"
export LOG_DIR="${LOG_DIR:-${HOME}/.cache/binky-control/rhythm}"
mkdir -p "${LOG_DIR}"
log() { echo "$(date -Iseconds) $*" | tee -a "${LOG_DIR}/railiance-rhythm.log"; }
require_repo() {
if [[ ! -d "${BINKY_REPO}/.git" ]]; then
log "ERROR: binky-control missing at ${BINKY_REPO}; clone via forgejo-agent-harness deploy key"
exit 1
fi
git -C "${BINKY_REPO}" fetch --quiet origin main || true
git -C "${BINKY_REPO}" checkout --quiet main
git -C "${BINKY_REPO}" pull --ff-only --quiet origin main || log "WARN: pull failed (continuing on local)"
}
require_claude() {
if ! command -v claude >/dev/null 2>&1; then
log "ERROR: claude CLI not on PATH — agentic rhythm cannot run on this host"
log " residual: install Claude Code (or swap in a hosted agentic adapter) on railiance01"
exit 2
fi
}

View file

@ -0,0 +1,12 @@
#!/usr/bin/env bash
# Weekday 08:23 Europe/Berlin — Binky daily rhythm via agent-harness.
set -euo pipefail
# shellcheck disable=SC1091
source "$(dirname "$0")/run-common.sh"
require_repo
require_claude
log "START daily-rhythm"
agent-harness run \
--task-file "${BINKY_REPO}/integrations/harness-tasks/daily-rhythm.json" \
2>&1 | tee -a "${LOG_DIR}/daily.log"
log "END daily-rhythm rc=${PIPESTATUS[0]}"

View file

@ -0,0 +1,27 @@
#!/usr/bin/env bash
# Monday 09:37 Europe/Berlin — deterministic mail-scan then optional triage session.
set -euo pipefail
# shellcheck disable=SC1091
source "$(dirname "$0")/run-common.sh"
require_repo
log "START mail-scan"
# Deterministic pre-step (no Claude) — uses AppRole + OpenBao mail lane.
agent-harness mail-scan \
--target-repo "${BINKY_REPO}" \
--config "${BINKY_REPO}/integrations/mailbox-binky-company.yml" \
2>&1 | tee -a "${LOG_DIR}/mail.log"
scan_rc=${PIPESTATUS[0]}
log "mail-scan rc=${scan_rc}"
if [[ "${scan_rc}" -ne 0 ]]; then
exit "${scan_rc}"
fi
# Agentic triage if Claude present; otherwise scan+hub event is enough for intake idempotence.
if command -v claude >/dev/null 2>&1; then
log "START mail-triage session"
agent-harness run \
--task-file "${BINKY_REPO}/integrations/harness-tasks/mail-intake.json" \
2>&1 | tee -a "${LOG_DIR}/mail.log" || log "WARN: mail-triage session failed"
else
log "SKIP mail-triage session (no claude CLI); mail-scan hub event stands"
fi
log "END mail-intake"

View file

@ -0,0 +1,12 @@
#!/usr/bin/env bash
# Friday 16:43 Europe/Berlin — weekly founder review prep.
set -euo pipefail
# shellcheck disable=SC1091
source "$(dirname "$0")/run-common.sh"
require_repo
require_claude
log "START review-prep"
agent-harness run \
--task-file "${BINKY_REPO}/integrations/harness-tasks/review-prep.json" \
2>&1 | tee -a "${LOG_DIR}/review.log"
log "END review-prep rc=${PIPESTATUS[0]}"

View file

@ -0,0 +1,10 @@
[Unit]
Description=Binky daily operating rhythm (agent-harness on Railiance)
After=network-online.target
[Service]
Type=oneshot
Environment=HOME=%h
WorkingDirectory=%h/binky-control
ExecStart=%h/binky-control/scripts/railiance-rhythm/run-daily.sh
Nice=10

View file

@ -0,0 +1,11 @@
[Unit]
Description=Timer: Binky daily rhythm weekdays 08:23 Europe/Berlin
[Timer]
Timezone=Europe/Berlin
OnCalendar=Mon..Fri *-*-* 08:23:00
Persistent=true
Unit=binky-rhythm-daily.service
[Install]
WantedBy=timers.target

View file

@ -0,0 +1,10 @@
[Unit]
Description=Binky weekly mail intake (agent-harness on Railiance)
After=network-online.target
[Service]
Type=oneshot
Environment=HOME=%h
WorkingDirectory=%h/binky-control
ExecStart=%h/binky-control/scripts/railiance-rhythm/run-mail.sh
Nice=10

View file

@ -0,0 +1,11 @@
[Unit]
Description=Timer: Binky mail intake Mondays 09:37 Europe/Berlin
[Timer]
Timezone=Europe/Berlin
OnCalendar=Mon *-*-* 09:37:00
Persistent=true
Unit=binky-rhythm-mail.service
[Install]
WantedBy=timers.target

View file

@ -0,0 +1,10 @@
[Unit]
Description=Binky weekly review prep (agent-harness on Railiance)
After=network-online.target
[Service]
Type=oneshot
Environment=HOME=%h
WorkingDirectory=%h/binky-control
ExecStart=%h/binky-control/scripts/railiance-rhythm/run-review.sh
Nice=10

View file

@ -0,0 +1,11 @@
[Unit]
Description=Timer: Binky weekly review prep Fridays 16:43 Europe/Berlin
[Timer]
Timezone=Europe/Berlin
OnCalendar=Fri *-*-* 16:43:00
Persistent=true
Unit=binky-rhythm-review.service
[Install]
WantedBy=timers.target