11 KiB
GENOME.md — timmy-dispatch
Generated: 2026-04-15 02:29:00 EDT Analyzed repo: Timmy_Foundation/timmy-dispatch Analyzed commit: 730dde8 Host issue: timmy-home #682
Project Overview
timmy-dispatch is a small, script-first orchestration repo for a cron-driven Hermes fleet. It does not try to be a general platform. It is an operator's toolbelt for one specific style of swarm work:
- select a Gitea issue
- build a self-contained prompt
- run one cheap-model implementation pass
- push a branch and PR back to Forge
- measure what the fleet did overnight
The repo is intentionally lightweight:
- 7 Python files
- 4 shell entry points
- a checked-in
GENOME.mdalready present on the analyzed repo'smain - generated telemetry state committed in
telemetry/ - no tests on
main(python3 -m pytest -q->no tests ran in 0.01s)
A crucial truth about this ticket: the analyzed repo already contains a genome on main, and it already has an open follow-up issue for test coverage:
timmy-dispatch#1— genome file already present on maintimmy-dispatch#3— critical-path tests still missing
So this host-repo artifact is not pretending to discover a blank slate. It is documenting the repo's real current state for the cross-repo genome lane in timmy-home.
Architecture
graph TD
CRON[crontab] --> LAUNCHER[bin/sprint-launcher.sh]
CRON --> COLLECTOR[bin/telemetry-collector.py]
CRON --> MONITOR[bin/sprint-monitor.sh]
CRON --> WATCHDOG[bin/model-watchdog.py]
CRON --> ANALYZER[bin/telemetry-analyzer.py]
LAUNCHER --> RUNNER[bin/sprint-runner.py]
LAUNCHER --> GATEWAY[optional gateway on :8642]
LAUNCHER --> CLI[hermes chat fallback]
RUNNER --> GITEA[Gitea API]
RUNNER --> LLM[OpenAI SDK\nNous or Ollama]
RUNNER --> TOOLS[local tools\nrun_command/read_file/write_file/gitea_api]
RUNNER --> TMP[/tmp/sprint-* workspaces]
RUNNER --> RESULTS[~/.hermes/logs/sprint/results.csv]
AGENTDISPATCH[bin/agent-dispatch.sh] --> HUMAN[human/operator copy-paste into agent UI]
AGENTLOOP[bin/agent-loop.sh] --> TMUX[tmux worker panes]
WATCHDOG --> TMUX
SNAPSHOT[bin/tmux-snapshot.py] --> TELEMETRY[telemetry/*.jsonl]
COLLECTOR --> TELEMETRY
ANALYZER --> REPORT[overnight report text]
DISPATCHHEALTH[bin/dispatch-health.py] --> TELEMETRY
Entry Points
bin/sprint-launcher.sh
Primary cron-facing shell entry point. Responsibilities:
- allocate a unique
/tmp/sprint-*workspace - fetch open issues from Gitea
- choose the first non-epic, non-study issue
- write a fully self-contained prompt file
- try the local Hermes gateway first
- fall back to
hermes chatCLI if the gateway is down - record result rows in
~/.hermes/logs/sprint/results.csv - prune old workspaces and old logs
bin/sprint-runner.py
Primary Python implementation engine. Responsibilities:
- read active provider settings from
~/.hermes/config.yaml - read auth from
~/.hermes/auth.json - route through OpenAI SDK to the currently active provider
- implement a tiny local tool-calling loop with 4 tools:
run_commandread_filewrite_filegitea_api
- clone repo, branch, implement, commit, push, PR, comment
This is the cognitive core of the repo.
bin/agent-loop.sh
Persistent tmux worker loop. This is important because it soft-conflicts with the README claim that the system “does NOT run persistent agent loops.” It clearly does support them as an alternate lane.
bin/agent-dispatch.sh
Manual one-shot prompt generator. It packages all of the context, token, repo, issue, and Git/Gitea commands into a copy-pasteable prompt for another agent.
Telemetry/ops entry points
bin/telemetry-collector.pybin/telemetry-analyzer.pybin/sprint-monitor.shbin/dispatch-health.pybin/tmux-snapshot.pybin/model-watchdog.pybin/nous-auth-refresh.py
These form the observability layer around dispatch.
Data Flow
Autonomous sprint path
- cron starts
bin/sprint-launcher.sh - launcher fetches open issues from Gitea
- launcher filters out epic/study work
- launcher writes a self-contained prompt to a temp workspace
- launcher tries gateway API on
localhost:8642 - if gateway is unavailable, launcher falls back to
hermes chat - or, in the separate Python lane,
bin/sprint-runner.pydirectly calls an LLM provider via the OpenAI SDK - model requests local tool calls
- local tool functions execute subprocess/Gitea/file actions
- runner logs results and writes success/failure to
results.csv
Telemetry path
bin/telemetry-collector.pysamples tmux, cron, Gitea, sprint activity, and process liveness- it appends snapshots to
telemetry/metrics.jsonl - it emits state changes to
telemetry/events.jsonl - it stores a reduced comparison state in
telemetry/last_state.json bin/telemetry-analyzer.pysummarizes those snapshots into a morning reportbin/dispatch-health.pyseparately checks whether the system is actually doing work, not merely running processes
Key Abstractions
Stateless sprint model
The repo's main philosophical abstraction is that each sprint run is disposable. State lives in:
- Gitea
- tmux session topology
- log files
- telemetry JSONL streams
Not in a long-running queue or orchestration daemon.
Self-contained prompt contract
bin/agent-dispatch.sh and bin/sprint-launcher.sh both assume that the work unit can be described as a prompt containing:
- issue context
- API URLs
- token path or token value
- branching instructions
- PR creation instructions
That is a very opinionated orchestration primitive.
Local tool-calling shim
bin/sprint-runner.py reimplements a tiny tool layer locally instead of using the Hermes gateway tool registry. That makes it simple and portable, but also means duplicated tool logic and duplicated security risk.
Telemetry-as-paper-artifact
The repo carries a paper/ directory with a research framing around “hierarchical self-orchestration.” The telemetry directory is part of that design — not just ops exhaust, but raw material for claims.
API Surface
Gitea APIs consumed
- repo issue listing
- issue detail fetch
- PR creation
- issue comment creation
- repo metadata queries
- commit/PR count sampling in telemetry
LLM APIs consumed
Observed paths in code/docs:
- Nous inference API
- local Ollama-compatible endpoint
- gateway
/v1/chat/completionswhen available
File/state APIs produced
~/.hermes/logs/sprint/*.log~/.hermes/logs/sprint/results.csvtelemetry/metrics.jsonltelemetry/events.jsonltelemetry/last_state.json- telemetry snapshots under
telemetry/snapshots/
Test Coverage Gaps
Current state
On the analyzed repo's main:
python3 -m pytest -q->no tests ran in 0.01spython3 -m py_compile bin/*.py-> passesbash -n bin/*.sh-> passes
So the repo is parse-clean but untested.
Important nuance
This is already known upstream:
timmy-dispatch#3explicitly tracks critical-path tests for the repo (issue #3 in the analyzed repo)
That means the honest genome should say:
- test coverage is missing on
main - but the gap is already recognized in the analyzed repo itself
Most important missing lanes
sprint-runner.py- provider selection
- fallback behavior
- tool-dispatch semantics
- result logging
telemetry-collector.py- state diff correctness
- event emission correctness
- deterministic cron drift detection
model-watchdog.py- profile/model expectation map
- drift detection and fix behavior
agent-loop.sh- work selection and skip-list handling
- lock discipline
sprint-launcher.sh- issue selection and gateway/CLI fallback path
Security Considerations
1. Token handling is shell-centric and leaky
The repo frequently assumes tokens are read from files and injected into:
- shell variables
- curl headers
- clone URLs
- copy-paste prompts
This is operationally convenient but expands exposure through:
- process list leakage
- logs
- copied prompt artifacts
- shell history if mishandled
2. Arbitrary shell execution is a core feature
run_command in sprint-runner.py is intentionally broad. That is fine for a trusted operator loop, but it means this repo is a dispatch engine, not a sandbox.
3. /tmp workspace exposure
The default sprint workspace location is /tmp/sprint-*. On a shared multi-user machine, that is weaker isolation than a private worktree root.
4. Generated telemetry is committed
telemetry/events.jsonl and telemetry/last_state.json are on main. That can be useful for paper artifacts, but it also means runtime state mixes with source history.
Dependencies
Runtime dependencies
- Python 3
- shell utilities (
bash,curl,tmux,git) - OpenAI-compatible SDK/runtime
- Gitea server access
- local Hermes config/auth files
Optional/ambient dependencies
- local Hermes gateway on port
8642 - local Ollama endpoint
- Nous portal auth state
Documentation/research dependencies
- LaTeX toolchain for
paper/
Deployment
This repo is not a service deployment repo in the classic sense. It is an operator repo.
Typical live environment assumptions:
- cron invokes shell/Python entry points
- tmux sessions hold worker panes
- Hermes is already installed elsewhere
- Gitea and auth are already provisioned
Minimal validation I ran:
python3 -m py_compile /tmp/timmy-dispatch-genome/bin/*.pybash -n /tmp/timmy-dispatch-genome/bin/*.shpython3 -m pytest -q-> no tests present
Technical Debt
1. README contradiction about persistent loops
README says:
- “The system does NOT run persistent agent loops.”
But the repo clearly ships
bin/agent-loop.sh, described as a persistent tmux-based worker loop.
That is the most important docs drift in the repo.
2. Two orchestration philosophies coexist
- cron-fired disposable runs
- persistent tmux workers
Both may be intentional, but the docs do not clearly state which is canonical versus fallback/legacy.
3. Target repo already has a genome, but the host issue still exists
This timmy-home genome issue is happening after timmy-dispatch already gained:
GENOME.mdonmain- open issue
#3for missing tests
That is not bad, but it means the cross-repo genome process and the target repo's own documentation lane are out of sync.
4. Generated/runtime artifacts mixed into source tree
Telemetry and research assets are part of the repo history. That may be intentional for paper-writing, but it makes source metrics noisier and can blur runtime-vs-source boundaries.
Existing Work Already on Main
The analyzed repo already has two important genome-lane artifacts:
GENOME.mdonmain- open issue
timmy-dispatch#3tracking critical-path tests
So the most honest statement for timmy-home#682 is:
- the genome itself is already present in the target repo
- the remaining missing piece on the target repo is test coverage
- this host-repo artifact exists to make the cross-repo analysis lane explicit and traceable
Bottom Line
timmy-dispatch is a small but very revealing repo. It embodies the Timmy Foundation's dispatch style in concentrated form:
- script-first
- cron-first
- tmux-aware
- Gitea-centered
- cheap-model friendly
- operator-visible
Its biggest weakness is not code volume. It is architectural ambiguity in the docs and a complete lack of tests on main despite being a coordination-critical repo.