freedom-intelligence/docs/recurrence-ops.md
tegwick a78187c33e Make the sensing loop durable and pin the reserve to Scaleway
The weekday brief only counts when the file is on origin/main. Hub
events without git objects are failures. The open-weight SoT moves
from the VAULT 850 GiB quota to a dedicated Scaleway bucket (One Zone
IA for R, Glacier for S) so V4-Flash and K3 are economically in-scope.

Catalogs the real DeepSeek-V4-Flash-0731 (MIT ~167 GiB MoE, not 12B)
and nominates Qwen3.8-27B. Bucket create remains FI-WP-0004-T08.

Assistant: grok
Assistant-Session: 01a09c6a-1cfc-75b1-a78d-c13eaf22241d
2026-09-13 22:45:43 +02:00

145 lines
4.9 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)
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 → git push origin → fi_daily_brief
(fi_daily_brief is forbidden until origin has the file)
Operator morning review (no AI) from this repo:
```bash
cd ~/freedom-intelligence && git pull --ff-only
activity status
activity inbox
# activity ack briefs/YYYY/MM/YYYY-MM-DD.md
```
Requires `activity` CLI from activity-core (`uv tool install -e ~/activity-core`).
Optional: `ACTIVITY_CORE_URL` + `STATE_HUB_URL` for live runs/hub join.
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 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
(**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: <int>
```
Posted automatically by `rein-aharness fi-research-brief` **only after**
`git push origin` succeeds. `detail.pushed` and `detail.origin_sha` are
required. A local commit with a failed push is `executor_run` / `ok=false`.
FI is the definition owner: origin publication is a **granted** capability
of this rhythm (FI-WP-0004-T04), not an ungoverned env widening of
`FI_RESEARCH_BRIEF_PUSH`.
Verify drift:
```bash
python3 scripts/verify_brief_durability.py --require-hub
```
---
## 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)
- Posting `fi_daily_brief` for a local-only commit (clears `due`, loses the day)
- Reusing `railiance-platform-pg-backup` for weights (30-day expiry)