Goal Cup Proxy (goalcup) records what a coding agent does during a run. It launches the agent's
harness (Codex CLI, Claude Code, Hermes or Amp) in your terminal and records three things: the
harness's model traffic, the harness's own session files, and the state of the run's Git
repository. It seals them into one hash chain and uploads it to the Goal Cup server while the run
goes on. Everything runs on the participant's own machine. Anyone can check a sealed trace offline with
goalcup-verify.
Its first use is the /goal Cup: one prompt, one agent, 168 hours. The organizer is Agent Community. Sign-up, the rules summary, the demo video and the questionnaire are on the event site, agentcommunity.org/goalcup.
Agents working in this repository: read AGENTS.md first.
The full walk-through, with every message you will see, is the participant's guide. The contract is RULES. You can also hand the setup to your own agent with the goal-cup-setup skill.
-
Install the latest release (macOS or Linux; on Windows, inside WSL2):
curl -fsSL https://github.com/agentcommunity/goal-cup-proxy/releases/latest/download/install.sh | sh goalcup --versionIt checks the download against the release's
SHA256SUMSand installs into~/.local/binand~/.local/share/goalcup, with no sudo. Run it again to upgrade, never during your run. For one particular release, add-s -- --version <x.y.z>aftersh. -
Log in once per computer:
goalcup login. Check the code in the browser and approve. -
Prep:
goalcup prep --harness <id>, thengoalcup prep --repo https://github.com/<owner>/<repo>. Rungoalcup prepuntil steps 1 to 5 say[ok]; step 6 turns[ok]after your practice run (next step). Prep opens the harness once in its own isolated home: sign in there, and set it so it never stops to ask you for approval (set up your harness for a 168-hour run). Your repository must be new, empty and public, with a fine-grained token for it. For Hermes, install exactlyuv tool install hermes-agent==0.19.0, not Hermes's own installer, which installs the newest release (it writes no session file). See Hermes setup. -
Practice:
goalcup start --harness <id> --practice. It lasts about ten minutes, never pushes and never counts. Do as many as you like. -
Start inside the start window:
goalcup start --harness <id>. A dry run is open from 23 October, so you can start a rehearsal now (the dry run). Approve this run in the browser. The harness opens in a fresh clone of your repository. Its own setup screens (sign-in, folder trust, model choice) come before your prompt, and answering them is fine. -
Type your one prompt and press Enter. After it, the only message you may ever type is "keep going".
During the run.
- The server is the clock. The run ends 168 hours after the server's official start.
- Check on it from a second terminal with
goalcup status. ItsNext:line, above theDetails:block, says what to do. - Your agent may run
goalcup time-left, or call thetime_lefttool ofgoalcup mcpif you added it to your harness, to ask how much time is left. Goal Cup Proxy never sends anything to the agent: no reminders, no "keep going", no restarts. - If the agent stops early (a crash, a reboot, a closed window), run
goalcup continue. Nobody restarts it for you. - No server error stops a run. Recording goes on, and uploads are retried, with longer waits between tries.
- If the disk is nearly full (under 1 GiB free beyond the run's reservation), the agent is paused until space returns, then resumes by itself. Free space outside your run's folders.
- Keep the machine on mains power, awake and online, and keep the terminal open.
The end. At the deadline Goal Cup Proxy stops the agent, seals the record and uploads the rest. You do nothing. What is judged is the last push to your repository's default branch that GitHub received before the deadline, by GitHub's timestamp. Your agent must push its own work; Goal Cup Proxy never pushes. Then hand in your demo video and questionnaire on the event site within 24 hours. More: the deadline, and after it.
A run is your one 168-hour attempt. A part is one unbroken stretch of recording inside it;
most runs have one, and goalcup continue starts the next. Every flag is in goalcup <command> --help. Exit codes: 0 done; 1 refused, and you can fix it;
3 the command could not do its job.
| Command | What it does |
|---|---|
goalcup login [--server <URL>] |
Connect this computer to your Goal Cup account (once). |
goalcup prep [--harness <ID>] [--repo <URL>] [--work-root <PATH>] [--json] [--dev] |
Check the six readiness steps. Never starts a run. |
goalcup start --harness <ID> [--practice | --test] [--dev] |
Start a run: open the harness here and record it. --test is for organizers. |
goalcup status [<part-id>] [--json] |
Show the run: recording state, time left, upload, problems, Next:. --json prints the signed status document, with this machine's local facts and a problems array (the PROBLEM: lines' sentences, left out when there are none) beside it. |
goalcup time-left |
Show how much time the run has left. The agent may run it too. |
goalcup mcp |
Serve the time left as an MCP tool (time_left) for the agent. The harness starts it; add it as in HARNESS-SETUP. |
goalcup continue [<run-id>] |
Start the agent again in the same run, on the same computer. |
goalcup upload [<part-id>] |
Send what is not uploaded yet. Safe to repeat. |
goalcup entries [--json] |
List the recorded parts of your runs on this computer. |
goalcup seal [<part-id>] [--yes] |
Stop the agent now and seal this part. The run stays open. |
goalcup doctor [--harness <ID> | all] [--json] |
Check that this computer can record and each harness is installed. |
goalcup-verify --capture-integrity <trace> checks a sealed trace (0 complete and valid,
1 incomplete or not sealed, 2 invalid, 3 no usable report). Exit 0 says the record is consistent,
not that the run was good. goalcup-verify --research-json <trace> --output <new.ndjson> writes a
private research report. goalcup-verify --stats <trace>… --output <new.json> writes one run's
numbers (tokens, models, tool calls and errors, subagents, "keep going") and no text, with the same
exit codes. Every command and exit code: OPERATING.
participant types the prompt
|
v
harness --HTTPS_PROXY--> recording proxy (in goalcup, loopback) --> model provider
| | decoded bodies
| session files v
+----------------------> goalcup-daemon: redact, append to the hash chain
| sealed at the end, with the Git commit and a
| digest of uncommitted changes
v
goalcup start uploads chunks and heartbeats --> Goal Cup server
(signs a start receipt and an ack per chunk)
goalcup-verify reads a sealed trace offline: integrity check, research report and run stats.
- The wire leg. The harness reaches its model through a local recording proxy, set by
HTTPS_PROXYfor that one process only. Goal Cup Proxy never sets a model base URL. Bytes are relayed unchanged; no header is recorded. - The native leg. The daemon reads the harness's session files from an isolated home, never
your own
~/.claudeor~/.codex. - The chain. Secrets are removed before anything is written. Any detected loss is a gap in the chain, never an invented record. The chain catches a stray edit. Server acknowledgements, signed with a key pinned in the verifier, catch a rewrite of what was uploaded (cheat checklist).
- The daemon. There is nothing to install.
goalcup startstartsgoalcup-daemonfor the run. It exits 30 seconds after the last run is sealed, and logs to$GOALCUP_CONFIG_DIR/daemon.log. It stores raw bytes; the verifier makes every judgement later.
| Crate | Ships | What it holds |
|---|---|---|
goalcup-protocol |
library | Every byte definition: chain, records, control API, harness schema, connector pins. |
goalcup-daemon |
goalcup-daemon |
Ingest, redaction, chain writer, session-file capture, seal, process termination. |
goalcup-cli |
goalcup |
The eleven commands, the harness launch, the recording proxy, the upload. |
goalcup-verifier |
goalcup-verify |
The integrity reader and the decoders. Every judgement about the bytes. |
goalcup-platform |
library | Unix OS code: disk reservation, safe file access, machine facts, sleep lock. |
Also: connectors/<id>/ (one harness as data), server/worker (the upload server, a Cloudflare
Worker). The details and the glossary (run, part, segment, chain file, seal, receipt, ack):
ARCHITECTURE.
| Platform | Status |
|---|---|
| macOS, Apple silicon | Measured. Use the arm64 build of goalcup and of the harness. |
| macOS, Intel | Builds. No run measured. |
| Linux, arm64 | Docker gates and logged-in Codex and Hermes staging practices passed. Longer runs pending (measurements). |
| Linux, x86_64 | Reservation tests and a no-login harness smoke pass on a hosted runner. Full suites not measured. |
| Windows | Use WSL2 (below). Real-machine validation is pending. Native Windows is planned. |
The trace folder must be on APFS, ext4 or XFS: goalcup prep fails its step otherwise, and
start and continue warn. On Linux, install the
harness as a native binary first on PATH (not an npm wrapper). On a machine with no browser, set
GOALCUP_NO_BROWSER=1: login and start print the approval address instead. Known issues:
TODO.
Windows: use WSL2. In PowerShell run wsl --install -d Ubuntu,
then do everything inside Ubuntu as on Linux. Keep every folder a run uses on the Linux filesystem
(~/...), never on /mnt/c. Goal Cup Proxy refuses WSL1 and Windows-drive folders. It cannot
keep Windows awake, so set Windows sleep to Never for the run.
A harness is data, not code: one connectors/<id>/harness.toml (chat mode), a pin line and a
facts sheet. No .rs file and no test of your own. Start with the
adding-a-capture-harness skill, then follow
Add and test a connector. The short path:
- Check it can be captured (check first). The two facts that most often need a core change: the CA variable the harness reads, and how it keeps its sign-in without an environment key.
- Fill the facts sheet: copy
skills/adding-a-capture-harness/templates/harness-facts.mdtodocs/harnesses/<id>.md. - Copy the template:
skills/adding-a-capture-harness/templates/connector-harness.tomltoconnectors/<id>/harness.toml. Fill the one-screen field table in What a chat connector writes. The closest example is connectors/codex-cli. - Pin and regenerate:
sh scripts/pin-manifests.sh, then the two golden commands in Test a connector. - Check:
sh scripts/check-connector.sh <id>, thensh scripts/gate.sh fast. - Run it for real: a local smoke run, then a practice run on the server
(
goalcup start --harness <id> --practice), checked withgoalcup-verify --capture-integrity.
A harness can join the event until the last release. The organizers run a test run before it ships (getting a harness into the event).
Build from source. You need Rust 1.99 (rust-toolchain.toml selects it;
install rustup), a C compiler (macOS: the Xcode command line tools; Debian or
Ubuntu: build-essential), python3, and shasum or sha256sum. From the repository root:
cargo fetch --locked # once: download the dependencies
cargo build --release --offline
export PATH="$PWD/target/release:$PATH"A binary copied out of target/release needs GOALCUP_CONNECTORS_DIR="<checkout>/connectors".
Try a local run without an account. The harness must already be installed on this machine
(goalcup doctor --harness claude-code-cli checks). Use a fresh config, so nothing is uploaded:
export GOALCUP_CONFIG_DIR="$(mktemp -d "$HOME/goalcup-local.XXXXXX")"
goalcup prep --harness claude-code-cli # sign in to the harness; the [todo] lines are fine locally
cd "$(mktemp -d "$HOME/goalcup-run.XXXXXX")" # outside any Git repository
goalcup start --harness claude-code-cli # type a prompt, then exit the harness to sealThen run the verify: command it prints. Only one run per harness records at a time.
One script, two tiers. Its last line is gate <tier>: PASS in <N>s or gate <tier>: FAIL.
cargo install cargo-nextest --locked # once per machine
cargo fetch --locked # once per machine
sh scripts/gate.sh fast # every change, before it is committed
sh scripts/gate.sh full # before a release- fast: the version check,
cargo build,cargo fmt --check,cargo clippy -D warnings, every test except the slow tier (under cargo-nextest), and the doctests. A few minutes warm. - full: fast, plus the slow tier, the CLI's ignored end-to-end tests, the Worker's tests
(Node 22.18+ and
npm ciinserver/worker), the scripts' unit tests and the link check. Run it before every tag. - Run the gate as a normal user, not root. Some permission tests always fail as root, so the
gate stops at once when run as root. Set
GOALCUP_GATE_ALLOW_ROOT=1to run it anyway, for example in a throwaway container, and expect those tests to fail. - On Linux the gate also needs
nc, procpsps,*.localhoston loopback, IPv6 on loopback andTMPDIRon ext4 or XFS. A plain Debian or Ubuntu container does not resolve*.localhost(it lacksnss-myhostname): add127.0.0.1 api.e00.localhost auth.e00.localhostto its/etc/hosts. If/tmpis tmpfs or btrfs and your home is ext4 or XFS, run this first:export TMPDIR="$HOME/.cache/goalcup-tmp"; mkdir -p "$TMPDIR". CI (check) is a small Linux smoke, not the gate. More: OPERATING.
The dependency rule. The daemon never links the verifier, and the CLI never links the daemon. Tests check both. Other hard rules (never a base URL, no harness names in core code, pins regenerated with every connector edit) are in AGENTS.md.
A test that guards one of these is never deleted. It may move tier.
| Promise | Where the tests are | |
|---|---|---|
| P1 | No key fragment leaks | daemon redaction suites; cli connector contract and kit (no provider key reaches a harness, D61), Hermes offline key |
| P2 | The chain catches a stray edit | protocol chain golden; verifier capture integrity, v5 corpus, containment |
| P3 | Capture policy refuses endpoints, proxies, credentials and bad args | protocol harness schema and conformance; cli launch plan, dependency bans |
| P4 | Connectors load and pins match | protocol connector pins and loader; cli shipped connectors |
| P5 | The control API authenticates | daemon control API |
| P6 | The recording proxy captures faithfully | cli TLS, HTTP and WebSocket relay; verifier decoders |
| P7 | One end-to-end capture per harness, and termination | cli lifecycle suites and contract kit; daemon capture lifecycle and process kill |
The version is written only in the workspace Cargo.toml (scripts/check-version.py fails on
any other copy). sh scripts/release.sh prepare <x.y.z> opens the version PR; after it merges, run
the full gate and sh scripts/linux-check.sh on that commit, then sh scripts/release.sh tag <x.y.z>
(details). Release notes: GitHub releases.
Every doc, grouped by who reads it: docs/README.md. The key ones:
| You are | Start with |
|---|---|
| A participant | PARTICIPANT-GUIDE, HARNESS-SETUP, RULES, SECURITY |
| A harness builder | skill, HARNESS-ONBOARDING, CONNECTOR-SCHEMA, facts sheets |
| A developer | AGENTS, ARCHITECTURE, DECISIONS, CONTRACTS, TODO |
| An organizer | OPERATING, UPLOAD-API, SERVER-DESIGN, server/worker |
| A researcher | RESEARCH-TARGET, CHEAT-CHECKLIST, coverage matrix |
- Participant support: goalcup@agentcommunity.org. Paste your
goalcup statusoutput and run id, never your GitHub token. - Public problems: GitHub issues.
- Security problems: report privately to goalcup@agentcommunity.org or through GitHub private vulnerability reporting (SECURITY.md). Contributing: CONTRIBUTING.md, Code of Conduct. Maintainer: Balazs Nemethi.
Apache License 2.0 (LICENSE, NOTICE). Copyright 2026 AgentCommunity.