--- id: FI-WP-0002 type: workplan title: "Activity-core daily research brief rhythm" domain: agents repo: freedom-intelligence status: active owner: grok topic_slug: freedom-intelligence priority: high created: "2026-07-24" updated: "2026-07-24" 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` / external paths | Discover domain def | | Context resolver | activity-core state-hub query `fi_brief_status` (or shell equivalent) | `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` | Reference contracts: - `activity-core/docs/task-emission-consumer-contract.md` - Binky: `activity-definitions/binky-daily-rhythm.md` + `binky-control/OperatingRhythm.md` - `docs/daily-brief-playbook.md` (this repo) ## Schedule (proposed) | Field | Value | | ----- | ----- | | Cron | `30 7 * * 1-5` (weekdays 07:30) | | Timezone | `Europe/Berlin` | | Misfire | `skip` | | First enable | after dry-run spawn + one manual brief completion event proven | Weekends optional later (`0 9 * * 6` optional Saturday scan) — not in v1. ## Tasks ### T01 — ActivityDefinition (domain repo, disabled) ```task id: FI-WP-0002-T01 status: done priority: high state_hub_task_id: "4eb44be8-04b7-45c9-9e78-e573a3501524" ``` Add `activity-definitions/fi-daily-research-brief.md`: - `enabled: false` until dry-run passes - cron + timezone as above - context source for due check (stub params documented if resolver not yet live) - rule: emit task when `due`, `target_repo: freedom-intelligence`, labels `["freedom-intelligence", "research-brief", "automated"]` - description points at `docs/daily-brief-playbook.md` **Done when:** file exists, frontmatter valid, matches ADR-002 shape used by existing definitions (binky / forgejo prune). --- ### 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" ``` Document and implement playbook steps for: ```yaml event_type: fi_daily_brief author: summary: "FI daily brief YYYY-MM-DD" detail: repo: freedom-intelligence date: "YYYY-MM-DD" path: "briefs/YYYY/MM/YYYY-MM-DD.md" collection_candidates: ``` Wire into `docs/daily-brief-playbook.md` and `docs/state-hub-delivery.md`. **Done when:** completion evidence shape is unambiguous for a future resolver. --- ### 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" ``` **Cross-repo (activity-core):** implement state-hub (or shell) resolver: - Query name: `fi_brief_status` - Returns `{ items: [{ kind: "daily_brief", due: bool, date: "YYYY-MM-DD" }] }` - `due: true` when no `fi_daily_brief` progress event with `detail.repo=freedom-intelligence` exists for today (Europe/Berlin) Mirror `binky_rhythm_status` pattern. Add unit tests with mocked hub. **Done when:** resolver merged in activity-core and callable from definition params. **Completed 2026-07-24:** `activity-core` `state_hub.py` `_fi_brief_status` + tests (`test_fi_brief_status_*`). Ship with activity-core commit/push. --- ### T04 — Register external activity-definitions path ```task id: FI-WP-0002-T04 status: todo priority: high state_hub_task_id: "ecb8df0a-4f5d-494e-9217-2906afbacf9c" ``` **Cross-repo / ops:** ensure railiance activity-core worker loads this repo’s `activity-definitions/` (env `ACTIVITY_DEFINITION_DIRS` or documented external path). Run `make sync-activity-definitions` / schedule reconciliation. **Done when:** definition appears in automation inventory; schedule id `activity-schedule-fi-daily-research-brief` (or equivalent) is visible when enabled. --- ### T05 — Dry-run spawn, then enable ```task id: FI-WP-0002-T05 status: todo priority: medium state_hub_task_id: "4d7a7491-f458-4984-bda1-8d212046dbc6" ``` 1. Manual `POST .../activity-definitions//trigger` with def still disabled or one-shot test path 2. Confirm `activity_task_spawn` in State Hub (no Forgejo spam) 3. Manually execute playbook once; post `fi_daily_brief` 4. Confirm next resolver `due=false` for that date 5. Set `enabled: true` on definition; commit **Done when:** one full loop proven; weekday schedule live. --- ### T06 — Consumer routing note (agent-harness) ```task id: FI-WP-0002-T06 status: done priority: medium state_hub_task_id: "2df977ea-06b4-468d-b6fb-6b40e00f8928" ``` Document how harness/operator picks up `target_repo: freedom-intelligence` tasks (checkout path, Green/Blue profile, LLM via llm-connect if used). Prefer **no** Claude Code install on railiance01 (Binky residual lesson). **Done when:** `docs/daily-brief-playbook.md` § Automation consumer is enough for the next agent session. **Completed 2026-07-24:** playbook § Automation consumer + state-hub-delivery contract; first manual brief posted with `fi_daily_brief` event. --- ## Acceptance (workplan-level) - [x] Domain ActivityDefinition drafted (`enabled: false`) - [x] Completion event contract documented - [x] Resolver implemented in activity-core (T03) — ship with activity-core deploy - [ ] External path + dry-run enable (T04–T05) - [x] Consumer path documented for harness (T06) - [x] First manual daily brief + `fi_daily_brief` progress event (2026-07-24) ## 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 - Full State Hub domain onboarding for freedom-intelligence ## Residual handoffs | Residual | Owner repo | | -------- | ---------- | | `fi_brief_status` resolver | activity-core | | ACTIVITY_DEFINITION_DIRS pin | activity-core / railiance ops | | Harness consumer profile | agent-harness / the-custodian as applicable |