--- id: FI-WP-0002 type: workplan title: "Activity-core daily research brief rhythm" domain: agents repo: freedom-intelligence status: finished owner: grok topic_slug: freedom-intelligence priority: high created: "2026-07-24" updated: "2026-07-28" depends_on: - FI-WP-0001 state_hub_workstream_id: "aa5b118e-36e2-41a7-b6c1-5d9ac9c7fb41" --- # FI-WP-0002 — Activity-core daily research brief rhythm ## Goal Schedule and emit the **Freedom Intelligence daily research brief** via **activity-core**, following the proven Binky rhythm pattern: ```text Temporal cron (activity-core) → context: fi_brief_status (due?) → rule emit activity_task_spawn (state-hub sink) → consumer (agent-harness / operator) runs playbook in freedom-intelligence → progress event fi_daily_brief (idempotence for next day) ``` activity-core answers **when / what / where**. It does **not** write the brief. Execution stays in this repo (or a harness checking out this repo). ## Architecture | Piece | Location | Role | | ----- | -------- | ---- | | ActivityDefinition | `freedom-intelligence/activity-definitions/fi-daily-research-brief.md` | Cron + rules | | External def load | activity-core `ACTIVITY_DEFINITION_DIRS` / ConfigMap | Discover domain def | | Context resolver | activity-core `fi_brief_status` | `due` for today | | Task sink | state-hub `activity_task_spawn` | Default safe sink | | Consumer | agent-harness Green/Blue or manual operator session | Run playbook | | Completion | State Hub `fi_daily_brief` progress event | Clears `due` | ## Tasks ### T01 — ActivityDefinition (domain repo) ```task id: FI-WP-0002-T01 status: done priority: high state_hub_task_id: "4eb44be8-04b7-45c9-9e78-e573a3501524" ``` ### T02 — Completion event contract + playbook hook ```task id: FI-WP-0002-T02 status: done priority: high state_hub_task_id: "ce61769e-9c32-4757-a691-c443e6cec37d" ``` ### T03 — `fi_brief_status` context resolver (activity-core) ```task id: FI-WP-0002-T03 status: done priority: high state_hub_task_id: "37a5d67c-93b4-4cbd-996c-e87b9308e295" ``` ### T04 — Register external activity-definitions path ```task id: FI-WP-0002-T04 status: done priority: high state_hub_task_id: "ecb8df0a-4f5d-494e-9217-2906afbacf9c" ``` **Completed 2026-07-28:** - Local: `ACTIVITY_DEFINITION_DIRS` includes `/home/worsch/freedom-intelligence` (`.env` + `.env.example` in activity-core) - Railiance: ConfigMap `actcore-external-activity-definitions` key `fi-daily-research-brief.md` in `activity-core/k8s/railiance/20-runtime.yaml` - Parser proof: definition loads from freedom-intelligence path **Residual:** apply ConfigMap on railiance when k8s API reachable (cluster was unreachable 2026-07-28: `92.205.62.239:6443` timeout). ### T05 — Dry-run spawn, then enable ```task id: FI-WP-0002-T05 status: done priority: medium state_hub_task_id: "4d7a7491-f458-4984-bda1-8d212046dbc6" ``` **Completed 2026-07-28 (loop proven without Temporal):** 1. Resolver `due=true` for 2026-07-28 before completion event 2. Manual brief `briefs/2026/07/2026-07-28.md` 3. Posted `fi_daily_brief` progress event 4. Resolver `due=false` immediately after 5. Definition `enabled: true` / `status: active` **Residual:** one-shot Temporal `POST .../trigger` + live schedule visibility after ConfigMap apply on railiance (cannot dry-run spawn while cluster down). ### T06 — Consumer routing note ```task id: FI-WP-0002-T06 status: done priority: medium state_hub_task_id: "2df977ea-06b4-468d-b6fb-6b40e00f8928" ``` ## Acceptance (workplan-level) - [x] Domain ActivityDefinition (`enabled: true`) - [x] Completion event contract documented - [x] Resolver implemented and proven live against State Hub - [x] External path + ConfigMap entry registered - [x] Idempotence loop proven (due → brief → event → not due) - [x] Consumer path documented - [x] Manual briefs: 2026-07-24, 2026-07-28 ## Residual handoffs | Residual | Owner | | -------- | ----- | | Apply ConfigMap + confirm Temporal schedule on railiance | activity-core / railiance ops | | Optional: one-shot `/trigger` dry-run after apply | activity-core | ## Out of scope - Writing the LLM brief **inside** activity-core workers - ISSUE_SINK_TYPE=rest / Forgejo issues for this rhythm - Weekend or multi-brief-per-day schedules