Establish Freedom Intelligence lab foundation and baseline research.

Add INTENT/SCOPE, daily-brief playbook, activity-core definition (disabled),
workplans FI-WP-0001..0003, baseline field survey with open-weight collection
recommendations, and inventory catalog candidates for the model reserve.
This commit is contained in:
tegwick 2026-07-24 00:15:27 +02:00
parent 1dc1e09517
commit b5f911140b
28 changed files with 2651 additions and 1 deletions

View file

@ -0,0 +1,161 @@
# Backup storage policy — open-weight model reserve
**Status:** foundation draft (concrete path and budget **TBD**)
**Related:** `INTENT.md`, `SCOPE.md`, `inventory/collection-policy.md`
**Adjacent:** `disaster-control` BackupPolicy (platform backups — different concern)
---
## Purpose
Define where Freedom Intelligence stores **open-weight model blobs** (and justified
companions), how much capacity we allow, and how this reserve relates to other
lab backup facilities.
Git never stores weight tensors. Git stores:
* inventory catalog metadata (`inventory/catalog/`)
* policies and schemas
* research briefs
---
## Storage class
| Requirement | Policy |
| ----------- | ------ |
| **Class** | Backup / bulk durable storage — **not** hot cluster PVCs or app disks |
| **Durability** | Same or better retention posture as other lab bulk assets; prefer media that survives workstation rebuilds |
| **Performance** | Sequential read for restore/training pull is enough; low latency not required |
| **Access** | Operator and approved lab hosts only; not a public mirror |
| **Separation** | Do not co-mingle with age-encrypted operational backups (Forgejo dumps, k3s state) without a clear subdirectory and different lifecycle rules |
Platform backup paths such as `/opt/backup/railiance/{infra,cluster}/` and
`~/.cache/railiance/backups/` are **operational recovery** lanes. The model
reserve may live on the **same physical facility** only if isolated by path and
quota so large weight pulls cannot crowd out restore media.
---
## Target location (to pin)
| Field | Value |
| ----- | ----- |
| **Host / facility** | `TBD` — operator pin (e.g. backup NAS, off-cluster bulk volume, dedicated disk) |
| **Base path or bucket** | `TBD` — suggested shape: `…/freedom-intelligence/models/` |
| **Layout under base** | See [On-disk layout](#on-disk-layout) |
| **Mount on lab hosts** | `TBD` |
| **Credentials** | `TBD` — if remote: OpenBao or existing backup credential lane; never commit secrets |
Until pinned, **do not** bulk-download multi-GB models into this git workspace or
into hot root filesystems.
### Suggested path shape (non-binding)
```text
{BACKUP_ROOT}/freedom-intelligence/
├── models/
│ └── {org}__{name}/
│ └── {revision}/
│ ├── blobs/ # weight files, shards
│ └── MANIFEST.txt # optional local copy of hashes
├── companions/ # adapters, tokenizers only when separate
└── staging/ # incomplete downloads; not catalog-ready
```
Map each `{org}__{name}/{revision}` to an inventory catalog entry.
---
## On-disk layout
| Path element | Rule |
| ------------ | ---- |
| `org__name` | Hugging Face-style id with `/``__` |
| `revision` | Git commit SHA, tag, or release id used at download time |
| `blobs/` | Actual files; prefer original names from source |
| `staging/` | Incomplete transfers; purge or resume; never mark collected until complete + verified |
---
## Capacity budget
| Parameter | Policy |
| --------- | ------ |
| **Soft quota** | `TBD` GiB/TiB — operator pin based on free backup capacity |
| **Hard stop** | No new collection when soft quota exceeded unless operator raises budget |
| **Per-pull threshold** | See `inventory/collection-policy.md` (size gates approval) |
| **Growth review** | Revisit quota when catalog total exceeds 70% of soft quota |
| **Eviction** | Prefer archive/delete lowest-priority, easily re-obtainable revisions first; record eviction in catalog history |
---
## Integrity and provenance
For every completed collection:
1. Record source URL and revision in the catalog entry.
2. Store checksums (`sha256` of each blob or upstream manifest digest).
3. Record download date (UTC) and downloader identity.
4. Prefer official org releases over anonymous re-uploads.
5. Keep license text or SPDX id in catalog; refuse unclear licenses.
Verification command examples belong in tooling later; policy only requires that
**catalog claims match on-disk checksums** before status `collected`.
---
## Retention
| Class | Retention |
| ----- | --------- |
| **Strategic reserve** (high priority, hard to re-obtain) | Keep until explicit deprecation |
| **Working set** (common bases for training experiments) | Keep while in active use + one superseded revision optional |
| **Staging** | Max 14 days incomplete, then purge |
| **Deprecated** | Metadata retained in catalog with status `evicted` or `superseded`; blobs may be deleted |
---
## Encryption and offsite
| Topic | Policy |
| ----- | ------ |
| **At rest** | Follow host/facility default; extra age/GPG of multi-hundred-GB trees is optional and costly |
| **In transit** | HTTPS or trusted lab network only |
| **Offsite copy** | Optional later; not required for foundation. If added, coordinate with `disaster-control` so model reserve does not break operational backup SLAs |
---
## What must not live here
* Closed weights or artifacts whose terms forbid offline retention
* Secrets, API keys, customer data, or training corpora with personal data (domain datasets need their own policy)
* Operational backups (databases, k3s state, Forgejo dumps)
* Git LFS dumps of full model trees as a substitute for backup storage
---
## Operator checklist to pin TBD fields
- [ ] Choose facility and base path
- [ ] Confirm free capacity and set soft quota
- [ ] Document mount/access for lab hosts
- [ ] Confirm credential path (if any)
- [ ] Create empty `models/` and `staging/` directories
- [ ] Update this file: replace `TBD` rows with concrete values
- [ ] Note pin date and operator in revision history below
### Pin log
| Date | Operator | Change |
| ---- | -------- | ------ |
| 2026-07-23 | foundation | Policy created; path and quota unpinned |
---
## Relationship to disaster-control
`disaster-control` owns **platform resilience** (what to restore after loss).
Freedom Intelligence owns **which open weights we choose to retain** and their
inventory. Shared facilities are fine; shared lifecycle rules are not automatic —
model reserve is large, slow-changing, and rarely needed for emergency restore.

View file

@ -0,0 +1,111 @@
# Daily research brief — playbook
**Audience:** operator or agent executing `target_repo: freedom-intelligence`
**Template:** `briefs/_template.md`
**Baseline memory:** `research/2026-07-24-baseline-field-survey.md`
**Sources:** `docs/sources-allowlist.md`
---
## Purpose
Produce **one** curated brief per active day covering axes AD when there is
signal. Briefs are **deltas** from the baseline survey and prior briefs — not
full resurveys.
---
## Idempotence
| Rule | Detail |
| ---- | ------ |
| One brief per date | Path `briefs/YYYY/MM/YYYY-MM-DD.md` |
| Calendar | Prefer **Europe/Berlin** date in front matter |
| Skip empty days | Either omit file or write `*No material delta.*` in Headline deltas |
| Automation due bit | Cleared only by State Hub event `fi_daily_brief` (below) |
---
## Manual procedure
1. **Orient**
- Read last 12 briefs if any; skim baseline § executive snapshot if first week
- `git pull` on freedom-intelligence
2. **Scan** (`docs/sources-allowlist.md`) — 3060 minutes cap
- Capture only items that change capability, cost, access, or operability
3. **Draft**
```bash
mkdir -p briefs/$(date +%Y/%m)
cp briefs/_template.md briefs/$(date +%Y/%m)/$(date +%Y-%m-%d).md
```
- Fill front matter (`status: final` when done)
- Leave empty sections as `*(none)*`
- Cite primary URLs
4. **Collection candidates**
- Use inventory field names; set priority
- If nominating: add or update `inventory/catalog/{id}.yaml` with
`status: candidate` and `collection.brief_refs`
5. **Lab implications**
- Link open workplans (`FI-WP-*`) only when action is real
6. **Commit** (operator policy) — brief + any catalog YAML
7. **Completion evidence** (required for activity-core rhythm)
Post State Hub progress (HTTP or MCP), shape:
```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: 0
```
Workstation API often `http://127.0.0.1:8000`; remote tunnel ports per
Custodian docs. See `docs/state-hub-delivery.md`.
---
## Automation consumer
When activity-core emits `activity_task_spawn` with
`target_repo: freedom-intelligence` and labels including `research-brief`:
1. Checkout this repo on the execution host
2. Run this playbook end-to-end
3. Prefer **llm-connect / OpenRouter** for any LLM drafting (Binky lesson: do
not install coding-agent CLIs on railiance01 solely for this)
4. Always post `fi_daily_brief` even if the brief is “no material delta”
5. Idempotency key: do not open a second brief file for the same `date`
Activity definition: `activity-definitions/fi-daily-research-brief.md`
Workplan: `workplans/FI-WP-0002-activity-core-daily-research.md`
---
## Quality bar
| Check | Pass |
| ----- | ---- |
| Signal | No filler paragraphs |
| Sources | At least one primary link per non-empty axis row |
| Honesty | Benchmarks marked directional; prices “verify before budget” |
| Collection | License noted for any candidate |
| Length | Prefer one screen to three; deep dives go under `research/` |
---
## First daily after baseline
The baseline survey (2026-07-24) already covers the field. The **first daily**
should only list changes **after** that documents research window. If nothing
moved, a short no-delta brief still completes the rhythm and posts
`fi_daily_brief`.

65
docs/hardware-envelope.md Normal file
View file

@ -0,0 +1,65 @@
# Hardware envelope — homelab accessible (draft)
**Status:** assumptions + TBD measurements
**Used by:** inventory `hardware_class`, axis B/C prioritization, collection size decisions
---
## Purpose
Define what Freedom Intelligence means by **homelab accessible** so we do not
collect models that only make sense on hyperscale clusters.
---
## Working tiers (until hosts are measured)
| Tier | Assumed capacity | Target model class |
| ---- | ---------------- | ------------------ |
| **T0 — CPU / edge** | 1664 GB system RAM, no GPU | ≤3B Q4; embeddings ≤0.5B |
| **T1 — consumer GPU** | 812 GB VRAM | 78B Q4/Q5; 3B fp16 |
| **T2 — enthusiast GPU** | 1624 GB VRAM | 14B Q4; 8B fp16; light 32B Q4 |
| **T3 — lab multi-GPU** | 2×24 GB+ or 48 GB+ | 32B fp16 / 70B Q4; small MoE |
| **T4 — out of envelope** | multi-node / 8×A100-class | Full DeepSeek-V3 MoE — P2 watch only |
P0 collection targets **T0T2**. P2 full MoE is **T4**.
---
## Lab hosts (fill in)
| Host | Role | GPU | VRAM | RAM | Notes |
| ---- | ---- | --- | ---- | --- | ----- |
| TBD | primary local inference | TBD | TBD | TBD | |
| TBD | training experiments | TBD | TBD | TBD | |
| railiance01 | cluster (not weight store) | n/a | n/a | n/a | Prefer not to fill hot disks with weights |
---
## Inference runtime defaults (intent)
| Runtime | When |
| ------- | ---- |
| llama.cpp / GGUF | Desktop & edge |
| vLLM | Server multi-request |
| MLX | Apple silicon if present |
| Ollama | Quick operator UX only |
---
## Training defaults (intent)
| Method | Envelope |
| ------ | -------- |
| QLoRA 78B | T1T2 |
| QLoRA 14B | T2 |
| Full FT 7B | T2T3 |
| 70B+ FT | T3+ only with explicit plan |
---
## Pin log
| Date | Change |
| ---- | ------ |
| 2026-07-24 | Draft tiers; host table empty |

62
docs/sources-allowlist.md Normal file
View file

@ -0,0 +1,62 @@
# Sources allowlist — daily research
Standing channels for Freedom Intelligence briefs (axes AD). Prefer **primary**
sources over aggregators. This is a watchlist, not a scrape mandate.
---
## Axis A — Frontier & commercial
| Channel | What to extract |
| ------- | --------------- |
| OpenAI / Anthropic / Google / xAI / DeepSeek blogs & release notes | Capability claims, deprecations |
| Official pricing pages | $/MTok in/out, cache, batch |
| Model cards for API models | Context limits, tool use, policies |
| LMSYS / Arena / artificialanalysis-class charts | Directional only; note gaming risk |
| SWE-bench Verified / Live leaderboards | Harness+model pairs, not raw IQ |
## Axis B — Edge / local / open
| Channel | What to extract |
| ------- | --------------- |
| Hugging Face org feeds: `Qwen`, `deepseek-ai`, `meta-llama`, `google`, `mistralai`, `BAAI`, `nomic-ai` | New weights, licenses, sizes |
| llama.cpp, vLLM, MLX, Ollama release notes | Runtime breakthroughs |
| GGUF / official quant announcements | Only after base model known |
## Axis C — Training & specialization
| Channel | What to extract |
| ------- | --------------- |
| arXiv cs.LG, cs.CL, cs.AI (recent) | Methods that fit homelab |
| Unsloth, Hugging Face TRL, Axolotl, LLaMA-Factory | Practical recipes |
| Preference-optimization papers/releases | DPO/ORPO/RLVR-class |
## Axis D — Harness & fleet
| Channel | What to extract |
| ------- | --------------- |
| OpenHands, Aider, SWE-agent, OpenCode, Cline repos/releases | Harness capability |
| sand-boxer / agent-harness / activity-core (internal) | Coulomb adjacency |
| MCP / tool-protocol standards | Interop shifts |
## Internal memory
| Artifact | Role |
| -------- | ---- |
| `research/2026-07-24-baseline-field-survey.md` | Baseline; dailies are deltas |
| Prior `briefs/YYYY/MM/*.md` | Avoid duplicate headlines |
| `inventory/catalog/` | Collection status |
## Do not
- Treat Twitter/X rumor as confirmed without primary link
- Mirror entire HF orgs
- Cite paywalled claims without noting access limit
- Collect weights that fail the license gate (`inventory/collection-policy.md`)
- Store API keys or customer data in briefs
## Cadence hint
For a 3060 minute manual brief: scan A pricing+releases (10m), B HF/org
releases (10m), C one methods thread (10m), D harness releases (10m), write
(15m). Skip empty sections.

View file

@ -0,0 +1,62 @@
# State Hub / operator delivery
**Status:** contract defined; optional distribution not fully wired
**Related:** `docs/daily-brief-playbook.md`, `workplans/FI-WP-0002-activity-core-daily-research.md`
---
## Required: completion evidence for daily rhythm
Every completed brief day (including “no material delta”) should post:
```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: 0
```
This is the **idempotence signal** for activity-core context query
`fi_brief_status` (FI-WP-0002-T03): `due=false` when an event exists for today
(Europe/Berlin) with `detail.repo=freedom-intelligence`.
Inbound automation uses `activity_task_spawn` from activity-core (state-hub sink).
See `activity-core/docs/task-emission-consumer-contract.md`.
---
## Optional: operator visibility
| Channel | Use |
| ------- | --- |
| **Progress event** (above) | Minimum — always for automation health |
| **Inbox message** | Only when high-priority collection candidates appear |
| **Wiki / Nextcloud** | Optional human mirror later |
---
## Non-goals
* Freedom Intelligence is **not** required to be a full State Hub domain yet
* Do not use `ISSUE_SINK_TYPE=rest` / Forgejo issues for this rhythm
* Do not register workplans by hand in the hub (`fix-consistency` after commit)
---
## Fallback without MCP
HTTP against State Hub API (workstation `http://127.0.0.1:8000` or remote
tunnel ports). Check health before declaring hub down.
---
## Pin log
| Date | Change |
| ---- | ------ |
| 2026-07-23 | Stub created |
| 2026-07-24 | `fi_daily_brief` contract + activity-core linkage documented |