scaffold: project structure, wire contract, roadmap and agent briefs

Lays out Velox Download Manager (IDM-class download manager for Ubuntu
26.04) as a monorepo ready for parallel lane development. No implementation
code by design.

- docs/: architecture, roadmap M0-M7, IDM-parity GUI spec, engine design,
  Firefox extension spec, risks/spikes, packaging
- contracts/: wire-contract skeleton (JSON Schema + fixture templates) —
  the single synchronization point between lanes
- docs/agents/: one brief per lane (PROTO, CORE, DAEMON, GUI, EXT, PKG/QA)
  with owned directories, build order and definition of done
- CLAUDE.md: rules of engagement — lane ownership, layering, non-negotiables
- CMake scaffolding with dev/tsan/release/ci presets

Two environment findings shape the design: Firefox here is the Mozilla snap
(native-messaging risk, so the extension carries a loopback-WebSocket
fallback), and Wayland forbids passive clipboard monitoring (so clipboard
capture is explicit-action-first).

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-09 18:21:11 +04:00
co-authored by Claude Opus 5
commit 8bb683b09d
90 changed files with 1814 additions and 0 deletions
+59
View File
@@ -0,0 +1,59 @@
# Agent brief — DAEMON (`veloxd`)
**Starts with CORE. You are the only process that owns state.**
## You own
```
daemon/** cli/** nmhost/** packaging/nativehost/**
```
Read `contracts/`, `core/include/`, `docs/`. Never write in `core/`, `gui/`, or `extension/`.
## Read first
`docs/01-architecture.md` §2–§5, `contracts/README.md`, `docs/05-extension-spec.md` §4
(you implement the daemon half of pairing).
## Build order
1. **RPC server**`rpc/uds_server` (NDJSON over `$XDG_RUNTIME_DIR/velox/velox.sock`,
0600, `SO_PEERCRED` same-UID check) and `rpc/ws_server` (bind `127.0.0.1` only, first
free port in 5200052016, write the chosen port to `ws.port`). One dispatcher, generated
from `contracts/`. Never block the RPC loop — disk and network work goes to CORE's pools.
2. **Auth & pairing**`session.pair` triggers a user prompt (GUI dialog if connected,
else a desktop notification with actions). Tokens: 256-bit, stored **hashed**,
per-install, revocable. Failed-auth rate limit 5/min then 60 s lockout. Enforce
`x-transports` and `x-privileged` from the schema: privileged methods are refused over
WS with `-32003`.
3. **Store** — SQLite WAL. Tables: `tasks`, `segments`, `categories`, `queues`, `rules`,
`settings`, `history`, `pairings`. Numbered migrations in `store/migrations/`, applied
at startup, with a forward-only test from every released schema version.
**Credentials never go in SQLite** — Secret Service via libsecret.
4. **Scheduler & queues** — concurrency governor (global max active, per-queue max, per-host
caps), time windows, days-of-week, one-shot vs periodic, "when queue completes" actions.
5. **Event fan-out** — per-subscription filtering, and **`event.task.progress` batched at
≤ 4 Hz into a single array message**. Do not emit one message per task per tick; that is
how you turn 20 downloads into a GUI that burns a core.
6. **Capture endpoint**`capture.offer` must answer within **750 ms**, always. Apply the
rules table, resolve the category folder, dedupe against active tasks, return
`take`/`ignore`. If anything internally is slow, answer `ignore` and let Firefox have
it. Never make the browser wait.
7. **Integration** — systemd user units (`velox.service` + `velox.socket` for socket
activation), single-instance lock, XDG autostart, `org.freedesktop.Notifications`,
graceful shutdown that flushes buffers and meta files.
8. **`velox` CLI** — `add`, `ls`, `pause`, `resume`, `rm`, `queue`, `settings`, `--json`
output. Build this early: it is how you test the daemon before the GUI exists.
9. **`velox-nmhost`** — 4-byte-length-prefixed stdio ⇄ Unix socket pump. **Under 300 lines,
zero business logic**, and it must exit cleanly when Firefox closes the pipe. Install
manifests to all four locations listed in `docs/05` §4.
## Definition of done (M1)
- Passes the full conformance suite as a server, over **both** transports.
- Kill and restart the daemon mid-download: all tasks reload with correct state and resume.
- 1 000 tasks in the DB: `download.list` with paging under 50 ms.
- Pairing flow works from a real Firefox extension; unpair revokes immediately.
- `systemctl --user status velox` clean; socket activation verified from cold.
- Security review passed: no bind beyond loopback, no path traversal in `saveDir`
(canonicalize and check against allowed roots → `-32011`), no plaintext secrets.
## Do not
- Do not put download logic here — that's CORE. You schedule and persist; CORE transfers.
- Do not invent protocol fields. File a request with PROTO.