dock

Agents

Hackathon sprint in progress: read HACKATHON.md first.

You are working on Dock, a modular freight voice/SMS toolkit. The product in this repo is detention prevention. Docs are the contract. Code stays small and runnable.

Read in this order: docs/ARCHITECTURE.md, docs/VISION.md, docs/DEMO.md, then the package you were asked to touch.

How the pieces compose

Modules do not call each other in a graph. They read and write events.

uv run dock-events cat data/samples/harbor-rye.raw.jsonl \
  | uv run dock-clock --replay --as-of 2026-10-17T22:05:00Z \
  | uv run dock-notify \
  | uv run dock-proof --load LL-88421 --print

arrived already carries party names and phones. Do not add a database so notify can look up Dan. If a new fact is required later, put it on the event.

Conventions

Test commands

uv sync
uv run pytest
uv run dock-events schema
uv run dock-web --port 8741
./examples/detention-pipe.sh
uv run python examples/build_sample.py

uv run pytest must pass with no GUAVA_API_KEY. If you add a test that needs Guava, skip it unless the package imports, and never let it dial.

When you change copy or clock math, regenerate data/samples/harbor-rye.trail.jsonl and read the diff. The web desk recomputes from the raw log, so a stale trail file fails the pipe test even if the page looks right.

Touch these together

Change Also update
New event type model.py, schema_doc.py, docs/ARCHITECTURE.md, a test
Clock phase or money tests/test_clock.py, sample trail, docs/ARCHITECTURE.md numbers, docs/DEMO.md if a headline changes
Preset button label dock_web/presets.py and docs/DEMO.md
Heads-up wording dock_notify/compose.py, notify test, sample trail
Call rules dock_call/plan.py and the plan test. Keep the zero-dollar rule.

Guava

The CLI and SDK are part of the environment. .cursor/install.sh (wired from .cursor/environment.json) installs the CLI with curl -fsSL https://goguava.ai/install.sh | sh, links it to /usr/local/bin/guava, and runs uv sync --frozen. guava-sdk>=0.48 is a root dependency. Do not log in and do not write keys into the repo.

guava --version
uv run python -c "import guava"

Auth, only when a task needs a live call: guava login, or the GUAVA_API_KEY environment variable. GUAVA_AGENT_NUMBER is the from-number. Leave both unset for tests.

packages/dock-intake/dock_intake/guava_inbound.py and dock_call/plan.py serve_outbound are the seams. Extend those. Do not start a second agent framework.

Leave the roadmap as docs

dock-status, dock-docs, fleet compliance, and crash intake are specified in docs/ROADMAP.md and nowhere else. Do not create empty packages for them in a drive-by refactor. Crash intake has extra constraints in that file. Read them before adding fields about an accident.