freedom-intelligence/docs/recurrence-ops.md
tegwick 8bd2e5ff92 Verify brief publication against live origin and record historical gaps
Assistant: codex
Assistant-Model: gpt-6-astra
Assistant-Session: 01a09cbd-43c1-79f3-809e-1ee97b40b64d
2026-09-14 00:37:51 +02:00

5.3 KiB
Raw Blame History

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)

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

# 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)

# 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)

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:

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)

Durability audit and historical corrections

See the Git-backed audit contract for live-origin verification, paginated Hub reads, and append-only correction records. --allow-reconciled explicitly acknowledges the five missing September 711 briefs; it never counts them as successful. Use --require-date YYYY-MM-DD to prove a scheduled day has a valid published completion. An unavailable Hub/remote fails the audit.