Catch up field brief, catalog Kimi K3, and wire live daily recurrence.

Add 2026-08-03 week catch-up brief with Kimi K3 as S1 strategic (collection
deferred on ~1454 GiB vs 850 GiB soft quota), document recurrence ops, and add a
workstation due-notice consumer cron helper. Production schedule was applied to
railiance ConfigMap and Temporal (weekdays 07:30 Europe/Berlin).
This commit is contained in:
tegwick 2026-08-03 17:37:53 +02:00
parent 441de11a3e
commit 70cbfe0c6c
10 changed files with 389 additions and 38 deletions

3
.gitignore vendored
View file

@ -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/

View file

@ -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** |

View file

@ -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`

View file

@ -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).

View file

@ -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).
---

98
docs/recurrence-ops.md Normal file
View file

@ -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-<activity-definition-uuid>`.
---
## 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/<id>/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 (~3090s)
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: <agent-or-operator>
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: <int>
```
API: `POST http://127.0.0.1:8000/progress/`

View file

@ -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`).

View file

@ -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."

View file

@ -36,7 +36,7 @@ hundreds of GiBTB.
| 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) | ~300700+ 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) | tenshundreds GiB |
| **S4** | Strong open dense mid-large | Qwen3-72B or Llama 3.3 70B / Llama 4 open text variant | ~40150 GiB quant / larger fp |

View file

@ -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" <<EOF
FI daily research brief is DUE for $date_s.
1. cd $FI_REPO
2. Follow docs/daily-brief-playbook.md
3. Write $brief_path
4. Post State Hub progress event fi_daily_brief
Spawn consumer ran at $(date -Is).
EOF
echo "wrote $notice"
} | tee -a "$log"