freedom-intelligence/docs/recurrence-ops.md
tegwick 46cfcd7a51 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.
2026-08-03 17:53:07 +02:00

101 lines
3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Freedom Intelligence daily brief — activity-core recurrence
**Status:** activity-core schedule live; rein-aharness executor on Railiance
**Do not** use workstation crontab as the primary path (retired anti-pattern).
Canonical org playbook: `activity-core/docs/recurring-automations-playbook.md`.
---
## Design (correct layers)
```text
activity-core (when / what / where)
Temporal: weekdays 07:30 Europe/Berlin
context: fi_brief_status → due?
rule: emit activity_task_spawn target_repo=freedom-intelligence
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 | Location |
| ----- | -------- |
| Definition (source of truth) | `activity-definitions/fi-daily-research-brief.md` |
| Cluster projection | ConfigMap `actcore-external-activity-definitions` |
| GitOps CM copy | `activity-core/k8s/railiance/20-runtime.yaml` |
| Resolver | activity-core `fi_brief_status` |
| Sink | `ISSUE_SINK_TYPE=state-hub``activity_task_spawn` |
| Executor | `rein-aharness fi-research-brief` |
| Host timer | `scripts/railiance-rhythm/` (interim until spawn poller) |
---
## Verify activity-core (organizer)
```bash
# Definition enabled
kubectl -n activity-core exec deploy/actcore-api -- python3 -c \
'import urllib.request,json; d=json.loads(urllib.request.urlopen(
"http://localhost:8010/activity-definitions/").read());
print([x for x in d if "Freedom Intelligence" in (x.get("name") or "")])'
# Schedule (example id — re-check after re-sync)
# activity-schedule-3169ab1f-882b-59c7-9763-d014dc96f4fc
# paused=False, 07:30 MonFri Europe/Berlin
# Ops UI: activity.coulomb.social → automations
# Manual fire: POST /activity-definitions/<id>/trigger
```
After definition edits:
1. Update ConfigMap key from this repos definition file
2. Wait for volume refresh
3. `POST /admin/sync?definitions=true&schedules=true`
---
## Install executor on railiance01
```bash
# On railiance01
git clone forgejo-remote:coulomb/freedom-intelligence.git ~/freedom-intelligence
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/
```
Timer is **07:35** Berlin — five minutes after activity-cores 07:30 schedule.
---
## Completion event (required for due=false)
```yaml
event_type: fi_daily_brief
detail:
repo: freedom-intelligence
date: "YYYY-MM-DD"
path: "briefs/YYYY/MM/YYYY-MM-DD.md"
collection_candidates: <int>
```
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)