Removes scripts/railiance-rhythm (units, installer, runner); the host units were uninstalled from railiance01. Docs now name the claim loop as the only scheduled executor, a manual one-shot for recovery until the legacy expiry, and profile-pin rollback after cutover. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Assistant: claude-code Assistant-Model: opus Assistant-Process: 51320@bnt-lap001 Assistant-Session: 9d40b4c7-8e3c-42ee-b755-d658d4640d6c
158 lines
5.6 KiB
Markdown
158 lines
5.6 KiB
Markdown
# 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)
|
||
no host timer (removed 2026-09-22, FI-WP-0005-T06); recovery = manual one-shot below
|
||
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 | none (removed 2026-09-22, FI-WP-0005-T06) |
|
||
|
||
---
|
||
|
||
## 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/<id>/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`
|
||
|
||
---
|
||
|
||
## Recovery: manual one-shot (until 2026-12-31)
|
||
|
||
There is no host timer. The claim loop is the only scheduled executor. If it
|
||
is down and a day must be produced, run the compatibility command once on
|
||
railiance01. The launcher loads `claim-loop.env` and resolves the llm-connect
|
||
and hub URLs:
|
||
|
||
```bash
|
||
cd ~/freedom-intelligence && git pull --ff-only
|
||
~/bin/rein-aharness-claim fi-research-brief \
|
||
--target-repo ~/freedom-intelligence --date YYYY-MM-DD
|
||
```
|
||
|
||
This path ends at the FI-WP-0005 cutover or the legacy expiry (2026-12-31),
|
||
whichever comes first. After cutover, rollback means pinning the previous
|
||
Glas profile version or reverting the definition revision
|
||
(`activity-definitions/fi-daily-research-brief.declaration.yaml`), not
|
||
re-installing a timer.
|
||
|
||
### 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)
|
||
|
||
## Durability audit and historical corrections
|
||
|
||
See [the Git-backed audit contract](brief-durability-audit.md) for live-origin verification,
|
||
paginated Hub reads, and append-only correction records. `--allow-reconciled`
|
||
explicitly acknowledges the five missing September 7–11 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.
|