Align FI recurrence with activity-core + rein-aharness (drop workstation cron).
Document the three-layer model, add railiance-rhythm executor install, and point playbooks at rein-aharness fi-research-brief instead of local crontab.
This commit is contained in:
parent
70cbfe0c6c
commit
46cfcd7a51
10 changed files with 248 additions and 100 deletions
2
SCOPE.md
2
SCOPE.md
|
|
@ -99,7 +99,7 @@ Git holds briefs, schemas, policies, and catalog metadata. Model weight blobs st
|
||||||
| Inventory | R verified; **Kimi K3** S1 approved+deferred (~1454 GiB); other S deferred; W candidate |
|
| Inventory | R verified; **Kimi K3** S1 approved+deferred (~1454 GiB); other S deferred; W candidate |
|
||||||
| Reserve policy | Capability-first — not gated by current VRAM |
|
| Reserve policy | Capability-first — not gated by current VRAM |
|
||||||
| Activity-core | Definition **enabled on railiance**; Temporal schedule weekdays 07:30 Berlin |
|
| Activity-core | Definition **enabled on railiance**; Temporal schedule weekdays 07:30 Berlin |
|
||||||
| Consumer | Workstation cron `consume-fi-brief-spawn.sh` 07:40 weekdays |
|
| Executor | rein-aharness `fi-research-brief` via railiance user timer 07:35 (not workstation cron) |
|
||||||
| State Hub | Repo under **agents**; workplans finished + hub-indexed |
|
| State Hub | Repo under **agents**; workplans finished + hub-indexed |
|
||||||
| Workplans | FI-WP-0001…0003 **finished** |
|
| Workplans | FI-WP-0001…0003 **finished** |
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -55,15 +55,12 @@ action:
|
||||||
|
|
||||||
## Enable checklist
|
## Enable checklist
|
||||||
|
|
||||||
1. [x] FI-WP-0002-T03 resolver live (`fi_brief_status` in activity-core)
|
1. [x] Resolver `fi_brief_status` in activity-core
|
||||||
2. [x] FI-WP-0002-T04 external definition path registered
|
2. [x] ConfigMap projection + Temporal schedule (weekdays 07:30 Europe/Berlin)
|
||||||
- Local: `ACTIVITY_DEFINITION_DIRS` includes `/home/worsch/freedom-intelligence`
|
3. [x] Completion event `fi_daily_brief` proven
|
||||||
- Railiance: ConfigMap `actcore-external-activity-definitions` key
|
|
||||||
`fi-daily-research-brief.md` (**applied live 2026-08-03**)
|
|
||||||
3. [x] Completion event proven (`fi_daily_brief` 2026-07-24, 07-28, 08-03)
|
|
||||||
4. [x] `enabled: true` / `status: active`
|
4. [x] `enabled: true` / `status: active`
|
||||||
5. [x] Temporal schedule live: `activity-schedule-3169ab1f-882b-59c7-9763-d014dc96f4fc`
|
5. [x] Executor: `rein-aharness fi-research-brief` + `scripts/railiance-rhythm/`
|
||||||
(weekdays 07:30 Europe/Berlin; not paused; next fires from 2026-08-04)
|
(install on railiance01; not workstation cron)
|
||||||
6. [x] Workstation consumer cron: `scripts/consume-fi-brief-spawn.sh` at 07:40
|
|
||||||
|
|
||||||
Ops: `docs/recurrence-ops.md`
|
Layers: activity-core (when/what/where) → rein-aharness (execute) → this repo.
|
||||||
|
See `docs/recurrence-ops.md` and `activity-core/docs/recurring-automations-playbook.md`.
|
||||||
|
|
|
||||||
|
|
@ -74,38 +74,41 @@ full resurveys.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Automation consumer
|
## Automation consumer (activity-core design)
|
||||||
|
|
||||||
|
**Organizer:** activity-core (when / what / where) — not workstation cron.
|
||||||
|
**Executor:** rein-aharness on railiance01 (`fi-research-brief`).
|
||||||
|
**Org playbook:** `activity-core/docs/recurring-automations-playbook.md`.
|
||||||
|
|
||||||
When activity-core emits `activity_task_spawn` with
|
When activity-core emits `activity_task_spawn` with
|
||||||
`target_repo: freedom-intelligence` and labels including `research-brief`:
|
`target_repo: freedom-intelligence` and labels including `research-brief`:
|
||||||
|
|
||||||
1. Checkout this repo on the execution host
|
1. Railiance host timer (or manual) runs
|
||||||
2. Run this playbook end-to-end
|
`rein-aharness fi-research-brief --target-repo ~/freedom-intelligence`
|
||||||
3. Prefer **llm-connect / OpenRouter** for any LLM drafting (Binky lesson: do
|
2. llm-connect drafts the brief; harness commits and posts **`fi_daily_brief`**
|
||||||
not install coding-agent CLIs on railiance01 solely for this)
|
3. Idempotency: one brief file per date; resolver clears `due` on completion event
|
||||||
4. Always post `fi_daily_brief` even if the brief is “no material delta”
|
|
||||||
5. Idempotency key: do not open a second brief file for the same `date`
|
|
||||||
|
|
||||||
Activity definition: `activity-definitions/fi-daily-research-brief.md`
|
Do **not** install Claude Code / Codex on railiance01 for this rhythm.
|
||||||
Workplan: `workplans/FI-WP-0002-activity-core-daily-research.md`
|
|
||||||
Resolver: activity-core state-hub query `fi_brief_status` (implemented 2026-07-24)
|
| Piece | Location |
|
||||||
|
| ----- | -------- |
|
||||||
|
| Definition | `activity-definitions/fi-daily-research-brief.md` |
|
||||||
|
| Ops | `docs/recurrence-ops.md` |
|
||||||
|
| Executor install | `scripts/railiance-rhythm/install-on-railiance.sh` |
|
||||||
|
| Workplan | FI-WP-0002 (finished) |
|
||||||
|
| Resolver | `fi_brief_status` in activity-core |
|
||||||
|
|
||||||
### Ops: load this repo’s definitions
|
### Ops: load this repo’s definitions
|
||||||
|
|
||||||
Dev / workstation worker:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
export ACTIVITY_DEFINITION_DIRS=/home/worsch/freedom-intelligence
|
# Dev
|
||||||
# then: make sync-activity-definitions (with ACTCORE_DB_URL + stack)
|
export ACTIVITY_DEFINITION_DIRS=.../freedom-intelligence
|
||||||
|
make -C ~/activity-core sync-activity-definitions
|
||||||
|
|
||||||
|
# Production: ConfigMap actcore-external-activity-definitions
|
||||||
|
# then POST /admin/sync?definitions=true&schedules=true
|
||||||
```
|
```
|
||||||
|
|
||||||
Production (railiance): projected into ConfigMap
|
|
||||||
`actcore-external-activity-definitions` key `fi-daily-research-brief.md`
|
|
||||||
(**enabled 2026-08-03**; Temporal schedule weekdays 07:30 Europe/Berlin).
|
|
||||||
|
|
||||||
Ops runbook: `docs/recurrence-ops.md`
|
|
||||||
Workstation due-notice cron: `scripts/consume-fi-brief-spawn.sh` (07:40 weekdays).
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Quality bar
|
## Quality bar
|
||||||
|
|
|
||||||
|
|
@ -1,93 +1,87 @@
|
||||||
# Freedom Intelligence daily brief — recurrence ops
|
# Freedom Intelligence daily brief — activity-core recurrence
|
||||||
|
|
||||||
**Status:** production schedule wired 2026-08-03
|
**Status:** activity-core schedule live; rein-aharness executor on Railiance
|
||||||
**Definition:** `activity-definitions/fi-daily-research-brief.md`
|
**Do not** use workstation crontab as the primary path (retired anti-pattern).
|
||||||
**Playbook:** `docs/daily-brief-playbook.md`
|
|
||||||
|
Canonical org playbook: `activity-core/docs/recurring-automations-playbook.md`.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Architecture (live)
|
## Design (correct layers)
|
||||||
|
|
||||||
```text
|
```text
|
||||||
Temporal schedule (railiance activity-core)
|
activity-core (when / what / where)
|
||||||
cron: 30 7 * * 1-5 Europe/Berlin
|
Temporal: weekdays 07:30 Europe/Berlin
|
||||||
→ fi_brief_status (state-hub)
|
context: fi_brief_status → due?
|
||||||
→ if due: activity_task_spawn (state-hub sink)
|
rule: emit activity_task_spawn target_repo=freedom-intelligence
|
||||||
→ workstation consumer notice (optional cron)
|
│
|
||||||
→ operator/agent executes playbook in freedom-intelligence
|
▼
|
||||||
→ progress event fi_daily_brief → next day due=false
|
rein-aharness on railiance01 (does the work)
|
||||||
|
host timer 07:35 → fi-research-brief
|
||||||
|
llm-connect drafts brief → commit → fi_daily_brief
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
freedom-intelligence repo
|
||||||
|
briefs/YYYY/MM/YYYY-MM-DD.md
|
||||||
|
catalog / RESERVE-STATUS updates as needed
|
||||||
```
|
```
|
||||||
|
|
||||||
| Piece | Where |
|
| Piece | Location |
|
||||||
| ----- | ----- |
|
| ----- | -------- |
|
||||||
| Source of truth (def) | `freedom-intelligence/activity-definitions/fi-daily-research-brief.md` |
|
| Definition (source of truth) | `activity-definitions/fi-daily-research-brief.md` |
|
||||||
| Production projection | ConfigMap `actcore-external-activity-definitions` key `fi-daily-research-brief.md` |
|
| Cluster projection | ConfigMap `actcore-external-activity-definitions` |
|
||||||
| GitOps copy | `activity-core/k8s/railiance/20-runtime.yaml` (keep in sync) |
|
| GitOps CM copy | `activity-core/k8s/railiance/20-runtime.yaml` |
|
||||||
| Resolver | activity-core `fi_brief_status` |
|
| Resolver | activity-core `fi_brief_status` |
|
||||||
| Sink | `ISSUE_SINK_TYPE=state-hub` → `activity_task_spawn` |
|
| Sink | `ISSUE_SINK_TYPE=state-hub` → `activity_task_spawn` |
|
||||||
| Consumer (workstation) | `scripts/consume-fi-brief-spawn.sh` (due notice; not auto-LLM) |
|
| Executor | `rein-aharness fi-research-brief` |
|
||||||
|
| Host timer | `scripts/railiance-rhythm/` (interim until spawn poller) |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Verify schedule
|
## Verify activity-core (organizer)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Definition present + enabled on API
|
# Definition enabled
|
||||||
kubectl -n activity-core exec deploy/actcore-api -- \
|
kubectl -n activity-core exec deploy/actcore-api -- python3 -c \
|
||||||
python3 -c "import urllib.request,json; d=json.loads(urllib.request.urlopen('http://localhost:8010/activity-definitions/').read());
|
'import urllib.request,json; d=json.loads(urllib.request.urlopen(
|
||||||
print([x for x in d if 'Freedom Intelligence' in (x.get('name') or '')])"
|
"http://localhost:8010/activity-definitions/").read());
|
||||||
|
print([x for x in d if "Freedom Intelligence" in (x.get("name") or "")])'
|
||||||
|
|
||||||
# After def change: re-project ConfigMap then
|
# Schedule (example id — re-check after re-sync)
|
||||||
kubectl -n activity-core exec deploy/actcore-api -- \
|
# activity-schedule-3169ab1f-882b-59c7-9763-d014dc96f4fc
|
||||||
python3 -c "import urllib.request; print(urllib.request.urlopen(urllib.request.Request('http://localhost:8010/admin/sync?definitions=true&schedules=true', method='POST')).read().decode())"
|
# paused=False, 07:30 Mon–Fri Europe/Berlin
|
||||||
|
|
||||||
|
# Ops UI: activity.coulomb.social → automations
|
||||||
|
# Manual fire: POST /activity-definitions/<id>/trigger
|
||||||
```
|
```
|
||||||
|
|
||||||
Schedule id pattern: `activity-schedule-<activity-definition-uuid>`.
|
After definition edits:
|
||||||
|
|
||||||
|
1. Update ConfigMap key from this repo’s definition file
|
||||||
|
2. Wait for volume refresh
|
||||||
|
3. `POST /admin/sync?definitions=true&schedules=true`
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Workstation consumer (optional but recommended)
|
## Install executor on railiance01
|
||||||
|
|
||||||
After activity-core fires at 07:30, run a due-check on the workstation:
|
|
||||||
|
|
||||||
```cron
|
|
||||||
# crontab -e (Europe/Berlin host clock or TZ=Europe/Berlin)
|
|
||||||
40 7 * * 1-5 /home/worsch/freedom-intelligence/scripts/consume-fi-brief-spawn.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
This writes `.local/consumer-logs/DUE-YYYY-MM-DD.txt` when a brief is still due.
|
|
||||||
An agent session or operator then runs the playbook and posts `fi_daily_brief`.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Manual one-shot (if schedule missed)
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Resolve activity id from API list, then:
|
# On railiance01
|
||||||
kubectl -n activity-core exec deploy/actcore-api -- \
|
git clone forgejo-remote:coulomb/freedom-intelligence.git ~/freedom-intelligence
|
||||||
python3 -c "import urllib.request; print(urllib.request.urlopen(urllib.request.Request('http://localhost:8010/activity-definitions/<id>/trigger', method='POST')).read().decode())"
|
cd ~/freedom-intelligence && ./scripts/railiance-rhythm/install-on-railiance.sh
|
||||||
|
|
||||||
|
# rein-aharness must expose fi-research-brief (deploy/pull rein-aharness)
|
||||||
|
# Logs: ~/.cache/freedom-intelligence/rhythm/
|
||||||
```
|
```
|
||||||
|
|
||||||
Then execute playbook + post progress event.
|
Timer is **07:35** Berlin — five minutes after activity-core’s 07:30 schedule.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Update definition
|
## Completion event (required for due=false)
|
||||||
|
|
||||||
1. Edit `activity-definitions/fi-daily-research-brief.md` in this repo
|
|
||||||
2. Copy content into ConfigMap key (or re-apply from `activity-core` 20-runtime.yaml)
|
|
||||||
3. Wait for volume refresh (~30–90s)
|
|
||||||
4. `POST /admin/sync?definitions=true&schedules=true`
|
|
||||||
5. Commit both freedom-intelligence and activity-core if 20-runtime.yaml changed
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Completion event (required)
|
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
event_type: fi_daily_brief
|
event_type: fi_daily_brief
|
||||||
author: <agent-or-operator>
|
|
||||||
summary: "FI daily brief YYYY-MM-DD"
|
|
||||||
detail:
|
detail:
|
||||||
repo: freedom-intelligence
|
repo: freedom-intelligence
|
||||||
date: "YYYY-MM-DD"
|
date: "YYYY-MM-DD"
|
||||||
|
|
@ -95,4 +89,13 @@ detail:
|
||||||
collection_candidates: <int>
|
collection_candidates: <int>
|
||||||
```
|
```
|
||||||
|
|
||||||
API: `POST http://127.0.0.1:8000/progress/`
|
Posted automatically by `rein-aharness fi-research-brief` on success.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## What not to do
|
||||||
|
|
||||||
|
- Workstation `crontab` that writes the brief (bypasses activity-core)
|
||||||
|
- Installing Claude Code / Codex on railiance01 for this rhythm
|
||||||
|
- Treating host timers as the scheduler of record
|
||||||
|
- Skipping the completion event (leaves `due=true` forever)
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,13 @@
|
||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# Workstation consumer for FI daily research brief spawns.
|
# BREAK-GLASS only — not the primary recurrence path.
|
||||||
#
|
#
|
||||||
# activity-core emits activity_task_spawn (state-hub sink) with
|
# Primary design:
|
||||||
# target_repo=freedom-intelligence. This script:
|
# activity-core (schedule + fi_brief_status + spawn)
|
||||||
# 1) checks fi_brief_status due (or open spawn)
|
# → rein-aharness fi-research-brief on railiance01
|
||||||
# 2) reminds operator / runs playbook path
|
# See docs/recurrence-ops.md and activity-core/docs/recurring-automations-playbook.md
|
||||||
# 3) does NOT invent brief content — open a session with the playbook
|
|
||||||
#
|
#
|
||||||
# Schedule suggestion (Europe/Berlin, after 07:30 spawn):
|
# This script only prints due status for operators debugging from a workstation.
|
||||||
# 40 7 * * 1-5 /home/worsch/freedom-intelligence/scripts/consume-fi-brief-spawn.sh
|
# Do NOT install it as the main crontab for FI briefs.
|
||||||
#
|
#
|
||||||
# Env:
|
# Env:
|
||||||
# STATE_HUB_URL default http://127.0.0.1:8000
|
# STATE_HUB_URL default http://127.0.0.1:8000
|
||||||
|
|
|
||||||
23
scripts/railiance-rhythm/install-on-railiance.sh
Executable file
23
scripts/railiance-rhythm/install-on-railiance.sh
Executable file
|
|
@ -0,0 +1,23 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
# Install host-side FI research brief timer on railiance01 (user systemd).
|
||||||
|
# Run ON railiance01 from a freedom-intelligence checkout:
|
||||||
|
# ./scripts/railiance-rhythm/install-on-railiance.sh
|
||||||
|
#
|
||||||
|
# Prerequisites:
|
||||||
|
# - activity-core definition fi-daily-research-brief enabled (cluster)
|
||||||
|
# - rein-aharness installed with fi-research-brief command
|
||||||
|
# - freedom-intelligence clone with write access for brief commits
|
||||||
|
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
|
||||||
|
|
||||||
|
cp -f "${ROOT}/scripts/railiance-rhythm/systemd/fi-research-brief-daily.service" "${UNIT_DIR}/"
|
||||||
|
cp -f "${ROOT}/scripts/railiance-rhythm/systemd/fi-research-brief-daily.timer" "${UNIT_DIR}/"
|
||||||
|
|
||||||
|
systemctl --user daemon-reload
|
||||||
|
systemctl --user enable --now fi-research-brief-daily.timer
|
||||||
|
systemctl --user list-timers --all | grep fi-research || true
|
||||||
|
echo "Installed. Logs: ~/.cache/freedom-intelligence/rhythm/"
|
||||||
|
echo "Cadence truth: activity-core (07:30). Executor: this timer (07:35) → rein-aharness."
|
||||||
86
scripts/railiance-rhythm/run-common.sh
Executable file
86
scripts/railiance-rhythm/run-common.sh
Executable file
|
|
@ -0,0 +1,86 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
# Shared env for Railiance host-side Freedom Intelligence research brief.
|
||||||
|
#
|
||||||
|
# activity-core owns cadence (Temporal + fi_brief_status + activity_task_spawn).
|
||||||
|
# This host timer is the *executor* path (same pattern as binky-control):
|
||||||
|
# rein-aharness consumes the work and posts fi_daily_brief.
|
||||||
|
#
|
||||||
|
# ISSUE_SINK_TYPE=state-hub writes progress only (not claimable issues), so a
|
||||||
|
# host timer remains the interim executor until rein-aharness poll/claim of
|
||||||
|
# activity_task_spawn is fully wired. Cadence truth still lives in activity-core.
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
: "${HOME:=/home/tegwick}"
|
||||||
|
|
||||||
|
# Prefer rein-aharness venv (current name); fall back to legacy agent-harness path.
|
||||||
|
if [[ -x "${HOME}/.local/rein-aharness/venv/bin/rein-aharness" ]]; then
|
||||||
|
export PATH="${HOME}/.local/rein-aharness/venv/bin:${HOME}/.local/bin:${PATH}"
|
||||||
|
# shellcheck disable=SC1091
|
||||||
|
[[ -f "${HOME}/.local/rein-aharness/env" ]] && source "${HOME}/.local/rein-aharness/env"
|
||||||
|
elif [[ -x "${HOME}/.local/agent-harness/venv/bin/rein-aharness" ]]; then
|
||||||
|
export PATH="${HOME}/.local/agent-harness/venv/bin:${HOME}/.local/bin:${PATH}"
|
||||||
|
# shellcheck disable=SC1091
|
||||||
|
[[ -f "${HOME}/.local/agent-harness/env" ]] && source "${HOME}/.local/agent-harness/env"
|
||||||
|
else
|
||||||
|
export PATH="${HOME}/.local/bin:${PATH}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
export STATE_HUB_URL="${STATE_HUB_URL:-http://127.0.0.1:18000}"
|
||||||
|
export PYTHONPATH="${HOME}/rein-aharness:${HOME}/llm-connect${PYTHONPATH:+:$PYTHONPATH}"
|
||||||
|
export FI_REPO="${FI_REPO:-${HOME}/freedom-intelligence}"
|
||||||
|
export LOG_DIR="${LOG_DIR:-${HOME}/.cache/freedom-intelligence/rhythm}"
|
||||||
|
mkdir -p "${LOG_DIR}"
|
||||||
|
|
||||||
|
log() { echo "$(date -Iseconds) $*" | tee -a "${LOG_DIR}/railiance-rhythm.log"; }
|
||||||
|
|
||||||
|
require_repo() {
|
||||||
|
if [[ ! -d "${FI_REPO}/.git" ]]; then
|
||||||
|
log "ERROR: freedom-intelligence missing at ${FI_REPO}; clone with deploy key"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
git -C "${FI_REPO}" fetch --quiet origin main || true
|
||||||
|
git -C "${FI_REPO}" checkout --quiet main
|
||||||
|
git -C "${FI_REPO}" pull --ff-only --quiet origin main || log "WARN: pull failed (continuing on local)"
|
||||||
|
}
|
||||||
|
|
||||||
|
require_llm_connect() {
|
||||||
|
if [[ -z "${LLM_CONNECT_URL:-}" ]]; then
|
||||||
|
local candidates=()
|
||||||
|
candidates+=("http://127.0.0.1:18080")
|
||||||
|
if command -v kubectl >/dev/null 2>&1; then
|
||||||
|
local cip
|
||||||
|
cip="$(kubectl -n activity-core get svc llm-connect \
|
||||||
|
-o jsonpath='{.spec.clusterIP}' 2>/dev/null || true)"
|
||||||
|
if [[ -n "${cip}" ]]; then
|
||||||
|
candidates+=("http://${cip}:8080")
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
candidates+=("http://llm-connect.activity-core.svc.cluster.local:8080")
|
||||||
|
local u
|
||||||
|
for u in "${candidates[@]}"; do
|
||||||
|
if curl -sf -m 2 "${u}/health" >/dev/null 2>&1; then
|
||||||
|
export LLM_CONNECT_URL="${u}"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if [[ -z "${LLM_CONNECT_URL:-}" ]]; then
|
||||||
|
export LLM_CONNECT_URL="${candidates[-1]}"
|
||||||
|
log "WARN: no llm-connect health probe succeeded; using ${LLM_CONNECT_URL}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
log "LLM_CONNECT_URL=${LLM_CONNECT_URL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
ensure_git_identity() {
|
||||||
|
git -C "${FI_REPO}" config user.email >/dev/null 2>&1 \
|
||||||
|
|| git -C "${FI_REPO}" config user.email "rein-aharness@railiance.local"
|
||||||
|
git -C "${FI_REPO}" config user.name >/dev/null 2>&1 \
|
||||||
|
|| git -C "${FI_REPO}" config user.name "rein-aharness"
|
||||||
|
}
|
||||||
|
|
||||||
|
require_harness() {
|
||||||
|
if ! command -v rein-aharness >/dev/null 2>&1; then
|
||||||
|
log "ERROR: rein-aharness not on PATH. Install rein-aharness venv on this host."
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
}
|
||||||
17
scripts/railiance-rhythm/run-daily.sh
Executable file
17
scripts/railiance-rhythm/run-daily.sh
Executable file
|
|
@ -0,0 +1,17 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
# Weekday 07:35 Europe/Berlin — FI research brief executor (rein-aharness).
|
||||||
|
#
|
||||||
|
# Cadence authority: activity-core definition fi-daily-research-brief
|
||||||
|
# (Temporal 07:30 Europe/Berlin, fi_brief_status due check, activity_task_spawn).
|
||||||
|
# This timer is the host executor, 5 minutes after the schedule fire window.
|
||||||
|
set -euo pipefail
|
||||||
|
# shellcheck disable=SC1091
|
||||||
|
source "$(dirname "$0")/run-common.sh"
|
||||||
|
require_repo
|
||||||
|
ensure_git_identity
|
||||||
|
require_harness
|
||||||
|
require_llm_connect
|
||||||
|
log "START fi-research-brief (rein-aharness / llm-connect)"
|
||||||
|
rein-aharness fi-research-brief --target-repo "${FI_REPO}" \
|
||||||
|
2>&1 | tee -a "${LOG_DIR}/daily.log"
|
||||||
|
log "END fi-research-brief rc=${PIPESTATUS[0]}"
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
[Unit]
|
||||||
|
Description=Freedom Intelligence daily research brief (rein-aharness on Railiance)
|
||||||
|
After=network-online.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
Environment=HOME=%h
|
||||||
|
WorkingDirectory=%h/freedom-intelligence
|
||||||
|
ExecStart=%h/freedom-intelligence/scripts/railiance-rhythm/run-daily.sh
|
||||||
|
Nice=10
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
[Unit]
|
||||||
|
Description=Timer: FI research brief weekdays 07:35 Europe/Berlin
|
||||||
|
|
||||||
|
[Timer]
|
||||||
|
OnCalendar=Mon..Fri *-*-* 07:35:00 Europe/Berlin
|
||||||
|
Persistent=true
|
||||||
|
Unit=fi-research-brief-daily.service
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=timers.target
|
||||||
Loading…
Add table
Add a link
Reference in a new issue