# Futarchy Ingestion Daemon

A daemon that monitors futard.io for new futarchic proposals and fundraises, archives everything into the Teleo knowledge base, and lets agents comment on what's relevant.

## Scope

Two data sources, one daemon:
1. **Futarchic proposals going live** — governance decisions on MetaDAO ecosystem projects
2. **New fundraises going live on futard.io** — permissionless launches (ownership coin ICOs)

**Archive everything.** No filtering at the daemon level. Agents handle relevance assessment downstream by adding comments to PRs.

## Architecture

```
futard.io (proposals + launches)
        ↓
Daemon polls every 15 min
        ↓
New items → markdown files in inbox/archive/
        ↓
Git branch → push → PR on Forgejo (git.livingip.xyz)
        ↓
Webhook triggers headless agents
        ↓
Agents review, comment on relevance, extract claims if warranted
```

## What the daemon produces

One markdown file per event in `inbox/archive/`.

### Filename convention

```
YYYY-MM-DD-futardio-{event-type}-{project-slug}.md
```

Examples:
- `2026-03-09-futardio-launch-solforge.md`
- `2026-03-09-futardio-proposal-ranger-liquidation.md`

### Frontmatter

```yaml
---
type: source
title: "Futardio: SolForge fundraise goes live"
author: "futard.io"
url: "https://futard.io/launches/solforge"
date: 2026-03-09
domain: internet-finance
format: data
status: unprocessed
tags: [futardio, metadao, futarchy, solana]
event_type: launch | proposal
---
```

`event_type` distinguishes the two data sources:
- `launch` — new fundraise / ownership coin ICO going live
- `proposal` — futarchic governance proposal going live

### Body — launches

```markdown
## Launch Details
- Project: [name]
- Description: [from listing]
- FDV: [value]
- Funding target: [amount]
- Status: LIVE
- Launch date: [date]
- URL: [direct link]

## Use of Funds
[from listing if available]

## Team / Description
[from listing if available]

## Raw Data
[any additional structured data from the API/page]
```

### Body — proposals

```markdown
## Proposal Details
- Project: [which project this proposal governs]
- Proposal: [title/description]
- Type: [spending, parameter change, liquidation, etc.]
- Status: LIVE
- Created: [date]
- URL: [direct link]

## Conditional Markets
- Pass market price: [if available]
- Fail market price: [if available]
- Volume: [if available]

## Raw Data
[any additional structured data]
```

### What NOT to include

- No analysis or interpretation — just raw data
- No claim extraction — agents do that
- No filtering — archive every launch and every proposal

## Deduplication

SQLite table to track what's been archived:

```sql
CREATE TABLE archived (
    source_id TEXT UNIQUE,  -- futardio on-chain account address or proposal ID
    event_type TEXT,        -- 'launch' or 'proposal'
    title TEXT,
    url TEXT,
    archived_at TEXT DEFAULT CURRENT_TIMESTAMP
);
```

Before creating a file, check if `source_id` exists. If yes, skip. Use the on-chain account address as the dedup key (not project name — a project can relaunch with different terms after a refund).

## Git workflow

```bash
# 1. Pull latest main
git checkout main && git pull

# 2. Branch
git checkout -b ingestion/futardio-$(date +%Y%m%d-%H%M)

# 3. Write source files to inbox/archive/
# (daemon creates the .md files here)

# 4. Commit
git add inbox/archive/*.md
git commit -m "ingestion: N sources from futardio $(date +%Y%m%d-%H%M)

- Events: [list of launches/proposals]
- Type: [launch/proposal/mixed]"

# 5. Push
git push -u origin HEAD

# 6. Open PR on Forgejo
curl -X POST "https://git.livingip.xyz/api/v1/repos/teleo/teleo-codex/pulls" \
  -H "Authorization: token $FORGEJO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "ingestion: N futardio events — $(date +%Y%m%d-%H%M)",
    "body": "## Batch\n- N source files\n- Types: launch/proposal\n\nAutomated futardio ingestion daemon.",
    "head": "ingestion/futardio-TIMESTAMP",
    "base": "main"
  }'
```

If no new events found in a poll cycle, do nothing (no empty branches/PRs).

## Setup requirements

- [ ] Forgejo account for the daemon (or shared ingestion account) with API token
- [ ] Git clone of teleo-codex on VPS
- [ ] SQLite database file for dedup
- [ ] Cron job: every 15 minutes
- [ ] Access to futard.io data (web scraping or API if available)

## What happens after the PR is opened

1. Forgejo webhook triggers the eval pipeline
2. Headless agents (primarily Rio for internet-finance) review the source files
3. Agents add comments noting what's relevant and why
4. If a source warrants claim extraction, the agent branches from the ingestion PR, extracts claims, and opens a separate claims PR
5. The ingestion PR merges once reviewed (it's just archiving — low bar)
6. Claims PRs go through full eval pipeline (Leo + domain peer review)

## Monitoring

The daemon should log:
- Poll timestamp
- Number of new items found
- Number archived (after dedup)
- Any errors (network, auth, parse failures)

## Future extensions

This daemon covers futard.io only. Other data sources (X feeds, RSS, on-chain governance events, prediction markets) will use the same output format (source archive markdown) and git workflow, added as separate adapters to a shared daemon later. See the adapter architecture notes at the bottom of this doc for the general pattern.

---

## Appendix: General adapter architecture (for later)

When we add more data sources, the daemon becomes a single service with pluggable adapters:

```yaml
sources:
  futardio:
    adapter: futardio
    interval: 15m
    domain: internet-finance
  x-ai:
    adapter: twitter
    interval: 30m
    network: theseus-network.json
  x-finance:
    adapter: twitter
    interval: 30m
    network: rio-network.json
  rss:
    adapter: rss
    interval: 15m
    feeds: feeds.yaml
```

Same output format, same git workflow, same dedup database. Only the pull logic changes per adapter.

## Files to read

| File | What it tells you |
|------|-------------------|
| `schemas/source.md` | Canonical source archive schema |
| `CONTRIBUTING.md` | Contributor workflow |
| `CLAUDE.md` | Collective operating manual |
| `inbox/archive/*.md` | Real examples of archived sources |
