diff --git a/.gitignore b/.gitignore index ab3e8ce..f35b40b 100644 --- a/.gitignore +++ b/.gitignore @@ -162,3 +162,6 @@ cython_debug/ # option (not recommended) you can uncomment the following to ignore the entire idea folder. #.idea/ + +# local consumer logs / notes +.local/ diff --git a/SCOPE.md b/SCOPE.md index aaf7578..4d51250 100644 --- a/SCOPE.md +++ b/SCOPE.md @@ -91,14 +91,15 @@ Git holds briefs, schemas, policies, and catalog metadata. Model weight blobs st | Area | Status | | ---- | ------ | -| Overall | **Operable lab** — foundation + daily rhythm + R-spine reserve (2026-07-28) | +| Overall | **Operable lab** — foundation + **live** weekday brief schedule + R-spine reserve | | INTENT / SCOPE | Drafted | | Baseline survey | `research/2026-07-24-baseline-field-survey.md` | -| Briefs | Playbook + briefs for 2026-07-24 and 2026-07-28 | +| Briefs | 2026-07-24, 07-28, **08-03** (week catch-up); playbook + recurrence ops | | Backup storage | **VAULT HD** `D:\vault\coulomb\freedom-intelligence\`; soft quota 850 GiB | -| Inventory | R verified (embeds, Qwen3-8B, R1-Distill-14B); S approved+deferred; W candidate | +| Inventory | R verified; **Kimi K3** S1 approved+deferred (~1454 GiB); other S deferred; W candidate | | Reserve policy | Capability-first — not gated by current VRAM | -| Activity-core | Definition **enabled**; ConfigMap entry; apply residual on railiance | +| Activity-core | Definition **enabled on railiance**; Temporal schedule weekdays 07:30 Berlin | +| Consumer | Workstation cron `consume-fi-brief-spawn.sh` 07:40 weekdays | | State Hub | Repo under **agents**; workplans finished + hub-indexed | | Workplans | FI-WP-0001…0003 **finished** | diff --git a/activity-definitions/fi-daily-research-brief.md b/activity-definitions/fi-daily-research-brief.md index f9ffec1..ace1c6d 100644 --- a/activity-definitions/fi-daily-research-brief.md +++ b/activity-definitions/fi-daily-research-brief.md @@ -53,17 +53,17 @@ action: labels: ["freedom-intelligence", "research-brief", "automated"] ``` -## Enable checklist (completed 2026-07-28) +## Enable checklist 1. [x] FI-WP-0002-T03 resolver live (`fi_brief_status` in activity-core) 2. [x] FI-WP-0002-T04 external definition path registered - Local: `ACTIVITY_DEFINITION_DIRS` includes `/home/worsch/freedom-intelligence` - - Railiance: `actcore-external-activity-definitions` ConfigMap key - `fi-daily-research-brief.md` in `activity-core/k8s/railiance/20-runtime.yaml` -3. [x] Completion event proven (`fi_daily_brief` for 2026-07-24; re-verified loop) -4. [x] `enabled: true` / `status: active` in this frontmatter + - Railiance: ConfigMap `actcore-external-activity-definitions` key + `fi-daily-research-brief.md` (**applied live 2026-08-03**) +3. [x] Completion event proven (`fi_daily_brief` 2026-07-24, 07-28, 08-03) +4. [x] `enabled: true` / `status: active` +5. [x] Temporal schedule live: `activity-schedule-3169ab1f-882b-59c7-9763-d014dc96f4fc` + (weekdays 07:30 Europe/Berlin; not paused; next fires from 2026-08-04) +6. [x] Workstation consumer cron: `scripts/consume-fi-brief-spawn.sh` at 07:40 -**Ops residual:** apply ConfigMap on railiance when cluster is reachable and -confirm Temporal schedule `activity-schedule-fi-daily-research-brief` (or -equivalent id from sync). Workstation cannot dry-run spawn while k8s API is -unreachable (2026-07-28). +Ops: `docs/recurrence-ops.md` diff --git a/briefs/2026/08/2026-08-03.md b/briefs/2026/08/2026-08-03.md new file mode 100644 index 0000000..001b719 --- /dev/null +++ b/briefs/2026/08/2026-08-03.md @@ -0,0 +1,68 @@ +--- +date: 2026-08-03 +timezone: Europe/Berlin +author: grok +status: final +sources_checked: + - research/2026-07-24-baseline-field-survey.md + - briefs/2026/07/2026-07-28.md + - public trackers (llm-stats, Artificial Analysis notes, HF moonshotai) + - huggingface.co/moonshotai/Kimi-K3 +--- + +# Freedom Intelligence Daily Brief — 2026-08-03 + +> **Week catch-up** from 2026-07-28 (recurring automation did not fire). +> Delta overview, not a full resurvey. + +## Headline deltas + +- **Kimi K3 open weights (Moonshot, ~Jul 27):** 2.8T MoE, ~1.45 TiB official tree, custom Kimi K3 License — currently **#1 open-weight** on several boards; primary strategic S1 candidate (storage exceeds 850 GiB soft quota as full tree). +- **DeepSeek V4-Flash-0731 (Jul 31):** same cheap price/size class, large capability jump — strong open price-performance; revisit as mid-size S/W vs our R spine. +- **Closed frontier churn:** Claude Fable 5 back after export pause; Claude Opus 5 / GPT-5.6 family / Grok 4.5 / Gemini Flash tiers all active in trackers. +- **Lab:** FI daily brief still **due** since Jul 28 (only two prior events); R spine remains on VAULT; recurrence wiring resumed this session. +- **Reserve action:** nominate `moonshotai/Kimi-K3` as S1 strategic with **collection deferred** pending capacity decision (full pull ≈1.45 TiB). + +## Frontier & commercial (axis A) + +| Item | Delta | Sources | Lab relevance | +| ---- | ----- | ------- | ------------- | +| Claude Fable 5 / Opus 5 | Fable restored; Opus competitive on coding/agentic | trackers / AA notes | Closed bar for harness evals via llm-connect | +| GPT-5.6 Sol/Terra/Luna | GA; Luna deep discount end-Jul | OpenAI pricing notes | Budget routing tiers | +| Grok 4.5 | Public coding-focused tier | xAI product notes | Compare agent coding bar | +| Gemini 3.5/3.6 Flash class | Fast tiers shipping | Google product notes | Cheap closed automation | + +## Edge / local / open (axis B) + +| Item | Delta | Sources | Lab relevance | +| ---- | ----- | ------- | ------------- | +| **Kimi K3** | Best open general/agentic class; 2.8T / 1M ctx / vision | [HF moonshotai/Kimi-K3](https://huggingface.co/moonshotai/Kimi-K3) | S1 identity; **too large for 850 GiB soft quota** as full tree | +| DeepSeek V4-Flash-0731 | Open MIT-class value leader after Jul 31 retrain | DeepSeek release trackers | Candidate later mid-tier collect | +| GLM-5.2 | Still “hostable strong open” for many teams | trackers | Alternative S dense if we skip full K3 | +| Qwen 3.7/3.8-class | Continued family updates | Alibaba trackers | Watch vs Qwen3-8B R default | + +## Training & specialization (axis C) + +*(none material for lab this window — no new FT stack displacement vs Unsloth/axolotl baseline)* + +## Harness & fleet (axis D) + +| Item | Delta | Sources | Lab relevance | +| ---- | ----- | ------- | ------------- | +| FI daily brief gap | No automated brief since 2026-07-28 | State Hub progress | Wire recurrence + consumer this session | +| Agent swarm narrative (Kimi) | Product emphasis on multi-agent / long-horizon | Kimi product | Align axis D watchlist with K3 agent demos | + +## Collection candidates + +| id | org | name | priority | reason | approx size | license | +| -- | --- | ---- | -------- | ------ | ----------- | ------- | +| moonshotai__Kimi-K3__strategic | moonshotai | Kimi-K3 | high | S1 best open general/agentic; displace V3 as primary strategic identity | ~1454 GiB official | custom (Kimi K3 License) — review commercial thresholds | + +**Decision:** catalog + **defer download** until soft-quota / disk exception. Prefer official compressed if/when published under soft quota. + +## Lab implications + +- Keep R spine (Qwen3-8B, R1-Distill-14B, embeds) as daily local defaults. +- Update strategic plan: S1 = Kimi K3 (identity), not only DeepSeek-V3. +- Unblock weekday schedule on activity-core (ConfigMap apply + sync + schedule check). +- Llama-3.2-3B still blocked on HF token (unchanged). diff --git a/docs/daily-brief-playbook.md b/docs/daily-brief-playbook.md index 7f2677e..b5259b7 100644 --- a/docs/daily-brief-playbook.md +++ b/docs/daily-brief-playbook.md @@ -99,11 +99,12 @@ export ACTIVITY_DEFINITION_DIRS=/home/worsch/freedom-intelligence # then: make sync-activity-definitions (with ACTCORE_DB_URL + stack) ``` -Production (railiance): either project -`activity-definitions/fi-daily-research-brief.md` into ConfigMap -`actcore-external-activity-definitions`, or mount a checkout under -`ACTIVITY_DEFINITION_DIRS` (`/etc/activity-core/external-definitions`). Keep -`enabled: false` until FI-WP-0002-T05 dry-run passes. +Production (railiance): projected into ConfigMap +`actcore-external-activity-definitions` key `fi-daily-research-brief.md` +(**enabled 2026-08-03**; Temporal schedule weekdays 07:30 Europe/Berlin). + +Ops runbook: `docs/recurrence-ops.md` +Workstation due-notice cron: `scripts/consume-fi-brief-spawn.sh` (07:40 weekdays). --- diff --git a/docs/recurrence-ops.md b/docs/recurrence-ops.md new file mode 100644 index 0000000..60e6d81 --- /dev/null +++ b/docs/recurrence-ops.md @@ -0,0 +1,98 @@ +# Freedom Intelligence daily brief — recurrence ops + +**Status:** production schedule wired 2026-08-03 +**Definition:** `activity-definitions/fi-daily-research-brief.md` +**Playbook:** `docs/daily-brief-playbook.md` + +--- + +## Architecture (live) + +```text +Temporal schedule (railiance activity-core) + cron: 30 7 * * 1-5 Europe/Berlin + → fi_brief_status (state-hub) + → if due: activity_task_spawn (state-hub sink) + → workstation consumer notice (optional cron) + → operator/agent executes playbook in freedom-intelligence + → progress event fi_daily_brief → next day due=false +``` + +| Piece | Where | +| ----- | ----- | +| Source of truth (def) | `freedom-intelligence/activity-definitions/fi-daily-research-brief.md` | +| Production projection | ConfigMap `actcore-external-activity-definitions` key `fi-daily-research-brief.md` | +| GitOps copy | `activity-core/k8s/railiance/20-runtime.yaml` (keep in sync) | +| Resolver | activity-core `fi_brief_status` | +| Sink | `ISSUE_SINK_TYPE=state-hub` → `activity_task_spawn` | +| Consumer (workstation) | `scripts/consume-fi-brief-spawn.sh` (due notice; not auto-LLM) | + +--- + +## Verify schedule + +```bash +# Definition present + enabled on API +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 '')])" + +# After def change: re-project ConfigMap then +kubectl -n activity-core exec deploy/actcore-api -- \ + python3 -c "import urllib.request; print(urllib.request.urlopen(urllib.request.Request('http://localhost:8010/admin/sync?definitions=true&schedules=true', method='POST')).read().decode())" +``` + +Schedule id pattern: `activity-schedule-`. + +--- + +## Workstation consumer (optional but recommended) + +After activity-core fires at 07:30, run a due-check on the workstation: + +```cron +# crontab -e (Europe/Berlin host clock or TZ=Europe/Berlin) +40 7 * * 1-5 /home/worsch/freedom-intelligence/scripts/consume-fi-brief-spawn.sh +``` + +This writes `.local/consumer-logs/DUE-YYYY-MM-DD.txt` when a brief is still due. +An agent session or operator then runs the playbook and posts `fi_daily_brief`. + +--- + +## Manual one-shot (if schedule missed) + +```bash +# Resolve activity id from API list, then: +kubectl -n activity-core exec deploy/actcore-api -- \ + python3 -c "import urllib.request; print(urllib.request.urlopen(urllib.request.Request('http://localhost:8010/activity-definitions//trigger', method='POST')).read().decode())" +``` + +Then execute playbook + post progress event. + +--- + +## Update definition + +1. Edit `activity-definitions/fi-daily-research-brief.md` in this repo +2. Copy content into ConfigMap key (or re-apply from `activity-core` 20-runtime.yaml) +3. Wait for volume refresh (~30–90s) +4. `POST /admin/sync?definitions=true&schedules=true` +5. Commit both freedom-intelligence and activity-core if 20-runtime.yaml changed + +--- + +## Completion event (required) + +```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: +``` + +API: `POST http://127.0.0.1:8000/progress/` diff --git a/inventory/RESERVE-STATUS.md b/inventory/RESERVE-STATUS.md index 79ea089..1387022 100644 --- a/inventory/RESERVE-STATUS.md +++ b/inventory/RESERVE-STATUS.md @@ -1,6 +1,6 @@ # Open-weight reserve status -**As of:** 2026-07-28 +**As of:** 2026-08-03 **Store:** `/mnt/d/vault/coulomb/freedom-intelligence/` (`D:\vault\coulomb\freedom-intelligence\`) **Soft quota:** 850 GiB · **Hard stop:** 920 GiB @@ -10,15 +10,13 @@ | Class | Count | Status mix | | ----- | ----: | ---------- | -| Catalog entries | 12 | see table | +| Catalog entries | 13 | + Kimi K3 S1 | | **verified** on disk | 4 | R embeds + Qwen3-8B + R1-Distill-14B | -| **approved** (pull deferred) | S giants + Llama edge | capacity / HF gate | +| **approved** (pull deferred) | S giants + Llama edge + **Kimi K3** | capacity / HF gate | | **candidate** (W) | 3 | headroom-gated | ### Disk use (model tree) -Run: `du -sh /mnt/d/vault/coulomb/freedom-intelligence/models` - | Path | Role | Approx | | ---- | ---- | ------ | | `models/nomic-ai__nomic-embed-text-v1.5/main` | R embed | ~0.5 GiB verified | @@ -26,26 +24,29 @@ Run: `du -sh /mnt/d/vault/coulomb/freedom-intelligence/models` | `models/Qwen__Qwen3-8B/main` | R instruct | ~15.3 GiB verified | | `models/deepseek-ai__DeepSeek-R1-Distill-Qwen-14B/main` | R reason | ~27.5 GiB verified | -**~45 GiB** of soft 850 GiB used by verified R spine → **~800+ GiB** headroom for S. +**~45 GiB** used → **~800+ GiB** soft-quota headroom (insufficient for full Kimi K3 ~1454 GiB). + +VAULT free (2026-08-03): ~1.7 TB free of 1.9 TB — full K3 would still dominate the volume and **violate soft quota**. --- -## Decision matrix (2026-07-28) +## Decision matrix (2026-08-03) | Id | Tier | Decision | Disk | | -- | ---- | -------- | ---- | | Qwen3-8B | R | **verified** | yes | -| Llama-3.2-3B-Instruct | R | **approved** | deferred — HF gate (need token) | +| Llama-3.2-3B-Instruct | R | **approved** | deferred — HF gate | | BGE-M3 | R | **verified** | yes | | R1-Distill-Qwen-14B | R | **verified** | yes | | nomic-embed-text-v1.5 | R | **verified** | yes | -| DeepSeek-V3 | S1 | **approved**, **collection deferred** | no — capacity / compressed plan later | -| DeepSeek-R1 full | S2 | **approved**, **collection deferred** | no — distill covers runnable reason | -| Qwen3-72B | S4 | **approved**, **collection deferred** | no — after R; pick vs Llama-70B | -| Llama-3.3-70B-Instruct | S4 | **approved**, **collection deferred** | no — gated + vs Qwen-72B | -| Qwen3-14B | W | **remain candidate** | no | -| R1-Distill-32B | W | **remain candidate** | no | -| bge-reranker-v2-m3 | W | **remain candidate** | no | +| **Kimi-K3** | **S1** | **approved**, **collection deferred** | no — ~1454 GiB > soft quota | +| DeepSeek-V3 | S1→secondary | **approved**, deferred | no — K3 is primary open SOTA identity | +| DeepSeek-R1 full | S2 | **approved**, deferred | no | +| Qwen3-72B | S4 | **approved**, deferred | no | +| Llama-3.3-70B-Instruct | S4 | **approved**, deferred | no | +| Qwen3-14B | W | candidate | no | +| R1-Distill-32B | W | candidate | no | +| bge-reranker-v2-m3 | W | candidate | no | --- @@ -57,15 +58,16 @@ Run: `du -sh /mnt/d/vault/coulomb/freedom-intelligence/models` | Edge micro-agent | Llama-3.2-3B blocked on HF auth | | Multilingual RAG embed | **Covered** (BGE-M3 + nomic) | | Local reason | **Covered** (R1-Distill-14B) | -| Frontier-open general MoE offline | Deferred S1 (V3 class) | +| Frontier-open general MoE offline | **Cataloged** Kimi K3 — pull blocked on capacity | | Full open reasoner MoE | Deferred S2 | --- ## Next pulls (operator) -1. Set `HF_TOKEN` and pull Llama-3.2-3B-Instruct. -2. Reassess soft quota; pick **one** of Qwen3-72B vs Llama-3.3-70B before any S1 giant. -3. For S1/S2: prefer **official compressed** distributions under soft quota. +1. **Capacity decision for Kimi K3** (raise soft quota / dedicate disk / official compressed only). +2. Set `HF_TOKEN` and pull Llama-3.2-3B-Instruct. +3. Optional S4: one of Qwen3-72B vs Llama-3.3-70B under remaining quota. +4. DeepSeek V4-Flash-0731 as mid open value candidate (catalog later if desired). Tool: `scripts/collect_model.py` (weights-only, sequential, writes `MANIFEST.json`). diff --git a/inventory/catalog/moonshotai__Kimi-K3__strategic.yaml b/inventory/catalog/moonshotai__Kimi-K3__strategic.yaml new file mode 100644 index 0000000..00ca5ee --- /dev/null +++ b/inventory/catalog/moonshotai__Kimi-K3__strategic.yaml @@ -0,0 +1,104 @@ +id: moonshotai__Kimi-K3__strategic +status: approved +name: Kimi-K3 +org: moonshotai +source: + kind: huggingface + url: https://huggingface.co/moonshotai/Kimi-K3 + revision: main + model_card_url: https://huggingface.co/moonshotai/Kimi-K3 + project_url: https://www.kimi.com/ + paper_url: https://huggingface.co/papers/2607.24653 +license: + spdx: LicenseRef-Kimi-K3 + url: https://huggingface.co/moonshotai/Kimi-K3 + allows_offline_retention: true + allows_local_ops: true + allows_fine_tune: true + notes: > + Custom Kimi K3 License (not plain MIT/Apache). Review commercial SaaS + revenue thresholds and attribution before external product embedding. + Confirm card text at pin time. +profile: + summary: "S1 open frontier MoE (2.8T) — best open general/agentic class mid-2026." + original_source: https://huggingface.co/moonshotai/Kimi-K3 + use_cases: + - "Long-horizon coding and agent workflows (offline optionality)" + - "Strategic reserve if closed APIs are unavailable or restricted" + - "Future multi-GPU / training-facility inference when hardware catches up" + - "Capability baseline against closed frontier for daily briefs" + - "Native vision + 1M-context knowledge work (when runnable)" + sweet_spots: + - "Top open-weight intelligence class after Jul 2026 weight release" + - "Agentic / coding / long-context open MoE identity" + - "Displaces prior S1 DeepSeek-V3 as primary open general target" + not_ideal_for: + - "Current single-GPU or small multi-GPU lab serve (far beyond run envelope)" + - "Fitting under 850 GiB soft quota at full precision (~1.45 TiB tree)" + - "Casual always-on chat (use R spine)" + capability_notes: > + Moonshot Kimi K3: ~2.8T total MoE parameters, sparse activation (~16/896 + experts), Kimi Delta Attention + Attention Residuals, native multimodal, + ~1M context. Official HF tree measured ~1454 GiB (96 shards). Collection + deferred until capacity exception or official compressed distribution. +swot: + strengths: + - "Leading open-weight general/agentic capability at release" + - "Open weights enable true offline retention optionality" + - "Strong coding / long-horizon / vision narrative" + weaknesses: + - "Disk footprint (~1.45 TiB) exceeds current soft quota and most lab GPUs" + - "Custom license with commercial thresholds" + - "Serve cost multi-node enterprise class" + opportunities: + - "Hold identity in catalog; pull compressed later if published" + - "Anchor daily briefs / evals against open SOTA" + - "Displace V3 as primary S1 when space allows" + threats: + - "Quota: full pull blocks all other S niches on VAULT" + - "Rapid supersession by K3.x or peer open giants" + - "Third-party quant quality variance if forced to unofficial packs" +size: + total_bytes: 1560998984390 + total_human: "~1454 GiB official HF tree (measured 2026-08-03); compressed TBD" +hardware_class: + min_vram_gb_q4: 0 + min_vram_gb_fp16: 0 + notes: "Beyond current lab run envelope (multi-node). Strategic reserve only." +axes: [A, B, C, D] +priority: high +collection: + approved_by: "bernd" + approved_at: "2026-08-03" + downloaded_at: null + downloaded_by: "" + storage_path: "" + brief_refs: + - briefs/2026/08/2026-08-03.md + - research/2026-07-24-nas-strategic-collection-plan.md + - docs/decisions/2026-07-24-nas-strategic-reserve.md +reason: > + S1 strategic — best open-weight general/agentic model class after Jul 2026 + release; keep capability identity even though full tree exceeds soft quota. +tags: [tier-s, strategic, beyond-run-envelope, moe, general, vision, kimi, s1] +companions: [] +notes: > + Do not bulk-download full tree under 850 GiB soft quota. Prefer official + compressed if/when available. Revisit capacity exception with operator. +history: + - at: "2026-08-03" + event: nominated + by: grok + detail: "Week catch-up brief — Kimi K3 open weights Jul 27 as new open SOTA." + - at: "2026-08-03" + event: approved + by: bernd + detail: "Operator direction: catalog and plan; collection deferred on capacity." + - at: "2026-08-03" + event: collection_deferred + by: grok + detail: "Official tree ~1454 GiB > soft quota 850 GiB; await capacity decision or compressed release." + - at: "2026-08-03" + event: profile_swot_added + by: grok + detail: "schema 0.2 profile + SWOT." diff --git a/research/2026-07-24-nas-strategic-collection-plan.md b/research/2026-07-24-nas-strategic-collection-plan.md index b89c8b5..539c643 100644 --- a/research/2026-07-24-nas-strategic-collection-plan.md +++ b/research/2026-07-24-nas-strategic-collection-plan.md @@ -36,7 +36,7 @@ hundreds of GiB–TB. | Priority | Capability niche | Representative targets (verify current HF id + license at pull) | Size class (order of magnitude) | | -------- | ---------------- | ---------------------------------------------------------------- | -------------------------------- | -| **S1** | Best open general / MoE chat | DeepSeek-V3 / V3.2 / V4-class open MoE (latest card) | ~300–700+ GiB depending on quant/precision | +| **S1** | Best open general / MoE chat | **Kimi K3** (`moonshotai/Kimi-K3`, Jul 2026) — primary; DeepSeek-V3/V4 secondary | K3 full ~1454 GiB (exceeds 850 GiB soft quota — capacity decision); V3/V4 class hundreds of GiB quant | | **S2** | Best open reasoner | DeepSeek-R1 full (or successor open reasoner) | similar large | | **S3** | Best open coding / SWE open weight | Top open code MoE or dense (e.g. GLM-5.x open, Qwen coder large — pick current SOTA open) | tens–hundreds GiB | | **S4** | Strong open dense mid-large | Qwen3-72B or Llama 3.3 70B / Llama 4 open text variant | ~40–150 GiB quant / larger fp | diff --git a/scripts/consume-fi-brief-spawn.sh b/scripts/consume-fi-brief-spawn.sh new file mode 100755 index 0000000..6978ece --- /dev/null +++ b/scripts/consume-fi-brief-spawn.sh @@ -0,0 +1,74 @@ +#!/usr/bin/env bash +# Workstation consumer for FI daily research brief spawns. +# +# activity-core emits activity_task_spawn (state-hub sink) with +# target_repo=freedom-intelligence. This script: +# 1) checks fi_brief_status due (or open spawn) +# 2) reminds operator / runs playbook path +# 3) does NOT invent brief content — open a session with the playbook +# +# Schedule suggestion (Europe/Berlin, after 07:30 spawn): +# 40 7 * * 1-5 /home/worsch/freedom-intelligence/scripts/consume-fi-brief-spawn.sh +# +# Env: +# STATE_HUB_URL default http://127.0.0.1:8000 +# FI_REPO default /home/worsch/freedom-intelligence + +set -euo pipefail + +STATE_HUB_URL="${STATE_HUB_URL:-http://127.0.0.1:8000}" +FI_REPO="${FI_REPO:-/home/worsch/freedom-intelligence}" +LOG_DIR="${FI_REPO}/.local/consumer-logs" +mkdir -p "$LOG_DIR" +log="$LOG_DIR/$(date +%Y-%m-%d).log" + +{ + echo "=== $(date -Is) consume-fi-brief-spawn ===" + # Prefer activity-core resolver if available; else raw progress heuristic + due_json="" + if command -v uv >/dev/null 2>&1 && [[ -d /home/worsch/activity-core ]]; then + due_json="$( + cd /home/worsch/activity-core && + STATE_HUB_URL="$STATE_HUB_URL" uv run python -c " +from activity_core.context_resolvers.state_hub import _fi_brief_status +import json +print(json.dumps(_fi_brief_status({'repo': 'freedom-intelligence'}), default=str)) +" 2>/dev/null || true + )" + fi + + if [[ -z "$due_json" ]]; then + echo "WARN: could not query fi_brief_status; check STATE_HUB_URL=$STATE_HUB_URL" + exit 0 + fi + + echo "status: $due_json" + due="$(python3 -c "import json,sys; d=json.loads(sys.argv[1]); print(d['items'][0]['due'])" "$due_json")" + date_s="$(python3 -c "import json,sys; d=json.loads(sys.argv[1]); print(d['items'][0]['date'])" "$due_json")" + + if [[ "$due" != "True" && "$due" != "true" ]]; then + echo "not due for $date_s — exit" + exit 0 + fi + + y="${date_s:0:4}" + m="${date_s:5:2}" + brief_path="$FI_REPO/briefs/$y/$m/$date_s.md" + echo "DUE: produce brief at $brief_path" + echo "Playbook: $FI_REPO/docs/daily-brief-playbook.md" + echo "On completion POST event_type=fi_daily_brief detail.repo=freedom-intelligence detail.date=$date_s" + + # Non-interactive marker for operators / agents + notice="$LOG_DIR/DUE-$date_s.txt" + cat >"$notice" <