# 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) primary: claim-loop → ops_run → fi-research-brief (REIN-A-0002) break-glass only: host timer 07:35 (disabled 2026-08-05; re-enable if claim loop down) llm-connect drafts brief → commit → push → 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` | | Claim loop | `rein-aharness claim-loop` (ops_run; REIN-A-0002) | | Host timer | `scripts/railiance-rhythm/` (**break-glass** after T05 proof) | --- ## 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 Mon–Fri Europe/Berlin # Ops UI: activity.coulomb.social → automations # Manual fire: POST /activity-definitions//trigger ``` 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` --- ## 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-core’s 07:30 schedule (**break-glass** once claim-loop is proven). ### Preferred: claim-loop (REIN-A-0002) ```bash # On railiance01 after activity-core ops_run migration (WP-0026-T07) cd ~/rein-aharness && git pull && uv sync # or pip install -e . export ACTIVITY_CORE_URL=http://127.0.0.1:8010 # port-forward actcore-api if needed export ACTIVITY_CORE_WORKER_TOKEN=… # actcore-runtime-secret export AGENT_HARNESS_REPO_MAP="{\"freedom-intelligence\":\"$HOME/freedom-intelligence\"}" ./deploy/scripts/install-claim-loop-user.sh # edit ~/.config/rein-aharness/claim-loop.env then: systemctl --user start rein-aharness-claim-loop.service ``` See `rein-aharness/docs/ops-run-claim-loop.md` and `activity-core/docs/deploy-ops-run-queue-railiance.md`. --- ## 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: ``` 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)