Skip to main content

Minutehand

Minutehand runs your proactive agent through simulated days of work in a few seconds and tells you how well it carried the work. The agent talks to fake Slack, Teams, Asana, Jira, YouTrack, Notion, GitHub, Google Drive and others, with people who answer late or not at all. Minutehand owns the clock, records every change in an append-only log, and runs checks on the result. Each failure names the design that fixes it. A finished run can be forked from a checkpoint with the prompt, the model, a person or the world changed, and played forward again.

The agent's code does not change. Minutehand starts the agent's own command, or reaches one already running, and points it at the fakes through its environment: HTTPS_PROXY, NO_PROXY and a CA bundle.

Install

You need uv. It fetches Python 3.12 if you do not have it.

uv tool install git+https://github.com/Alknoma/minutehand@integration-main

This puts the minutehand command in an environment of its own, apart from your agent's dependencies. Minutehand is not published on PyPI.

Quick start

The example agent is in the repository, so clone it for the example files:

git clone --depth 1 -b integration-main https://github.com/Alknoma/minutehand
cd minutehand/examples/follow_up
python3 -m venv .venv && .venv/bin/pip install slack_sdk    # the agent's one library, in the agent's own Python

minutehand run scenario.yaml --agent agent.yaml -- .venv/bin/python agent.py
# exits 0: Rosa answers after a day and a half, and the agent tells Owen and finishes

AGENT_BEHAVIOUR=forgetful minutehand run scenario_silent.yaml --agent agent.yaml -- .venv/bin/python agent.py
# exits 1: Rosa never answers, the agent never follows up, and no_follow_up names the fix

minutehand runs                  # every run, one line each
minutehand findings <run_id>     # a run's findings again, and the checkpoints it can be forked from
minutehand view                  # the runs in a browser, at http://127.0.0.1:8081/

Each run takes a few seconds. Runs are kept in .minutehand/ in the folder you ran them from. The example's README.md explains both runs line by line.

To try your own agent, write an agent file (minutehand schema agent prints its JSON Schema) and a scenario, check them with minutehand validate, and run minutehand doctor -- <your agent's command> to find any HTTP client in the agent that would go around the proxy.

How the agent touches Minutehand

Almost nothing is required. An agent that takes its goal by message and books its own wakes implements no endpoint. An agent can also take a wake (a POST carrying the simulated now), answer a report (still working, done, when to wake next), take pushed events in each provider's own format, and list its own inboxes for the simulated people to decide. Hosts no fake answers are declared in the agent file: acknowledge, pass through, replay, or forward to an emulator of your own. docs/agent-contract.md lists every touch point, and schemas/agent-api.openapi.json describes the endpoints.

Status

Built and tested (docs/design.md, "What exists", counts the tests for each part):

  • The proxy, the run loop, the store (SQLite, one file per run and its forks), forks from a checkpoint with the agent's own state restored and verified, and minutehand serve for test suites that open many worlds at once.
  • Providers: Slack, Microsoft Teams and Graph, Asana, Jira, YouTrack, Notion, GitHub, Google Drive with Docs and Slides, AWS EventBridge Scheduler and SQS (through moto), and Google Cloud Tasks over its REST transport.
  • 19 checks, the scorecard and 10 patterns. Among them, planned_past_due flags a follow-up that was on time only because something other than the agent's own plan woke it; the loop's table of what was due is recorded to answer that. reported_against_world holds what the agent says it is waiting on against what the world shows.
  • Checks of the agent's own, kept beside its agent file (checks:) and run with Minutehand's.
  • Dispatch rules: a scenario can deliver the agent's own wakes late, twice or not at all, and a fork can change them (DispatchChange).
  • Outbound capture, with --capture-unknown for a first run: reads passes only GET, HEAD and OPTIONS, and model lets a model stand in for a service nobody declared once the agent writes to it.
  • The agent's machine: machine: commands in a scenario change files at a moment, and the folders an agent file watches: are recorded as they change. The file_removed expectation reads them.
  • MCP: an agent's tool calls are recorded over HTTP through the proxy, and over standard input and output with minutehand mcp-relay. The tool_called expectation reads them. minutehand mcp serves the tools a coding agent uses to run scenarios and read findings.
  • The agent's own OpenTelemetry received and joined to the world events it caused; telemetry out over OTLP.
  • The run viewer (minutehand view), doctor, validate and schema, and a container image (Dockerfile) that serves by default.

Experimental: Contained, an agent in a gVisor sandbox whose clock Minutehand owns, so timers in the agent's own process become its wakes with no code change. It needs a patched gVisor that is kept outside this repository, and has been run on arm64 only.

Checked by hand, not in the test suite: an agent in containers (docs/containers.md).

Not built: people written by a model, checks a model judges, generated providers, a faked system clock (libfaketime), the hosted service. No fake has been checked against the real service's wire details; each is tested against the service's own client library. docs/design.md, "Known issues", lists the limits of what is built.

Docs

Page What it covers
docs/design.md The design, what exists, and its known limits
docs/agent-contract.md Every way an agent and Minutehand touch
docs/capture.md Hosts no fake answers: acknowledge, pass through, replay, --capture-unknown
docs/containers.md An agent in a container, and the Docker NO_PROXY trap
docs/serve.md minutehand serve, for a test suite
docs/external-emulators.md Forwarding a host to a fake of your own
docs/inboxes.md Work that waits on a person in the agent's own product
docs/reference-agent.md A larger example: two processes, a job queue, email, a model API

Scenarios to start from

minutehand scenarios lists a library of ready-made situations (a person goes quiet, answers late, is away with a delegate; an approval is rejected or never decided; a deadline moves; a scheduled wake comes late, twice or never). minutehand scenarios new --all --goal ... --owner 'Name <email>' --ask 'Name <email>' writes each out with your values. See docs/scenarios.md.

Develop

From a checkout:

uv sync
uv run pytest -q -n auto
uv run pyright
uv run python -m lints
uv run ruff check . && uv run ruff format --check .

CLAUDE.md is the house rules, CONTRIBUTING.md how to contribute, and docs/lints.md argues each lint. uv tool install . installs the checkout's own minutehand.

Licensed under the Functional Source License 1.1 (Apache-2.0 future licence); see LICENSE.md.

Metadata

Release files for minutehand 0.0.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for minutehand 0.0.1
File Size Uploaded
minutehand-0.0.1.tar.gz 1.4 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for minutehand 0.0.1
File Interpreter ABI Platform
minutehand-0.0.1-py3-none-any.whl Python 3 none any Details

Total release size: 2.8 MB

Release files / minutehand-0.0.1.tar.gz

Download URL minutehand-0.0.1.tar.gz
Size 1.4 MB
Tags Source
SHA-256 checksum
How to use checksums
e2a3c84209cdf8f4191cc538aede3c7663c1354579c74fec135b9b88bdf27146
BLAKE2b-256 checksum
How to use checksums
7497583cfc251c85f56a97211c99f276c9754e62176aec34cff9e6a7d169898a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.

Transparency log

Release files / minutehand-0.0.1-py3-none-any.whl

Download URL minutehand-0.0.1-py3-none-any.whl
Size 1.5 MB
Tags Python 3
SHA-256 checksum
How to use checksums
a7c6b2e0b06dbc1bc972e04d8663e029a252d5b4fb3df2ef706fd5b642099bf9
BLAKE2b-256 checksum
How to use checksums
763bd73813e944db513a12e48cf859ee7d1b8f03b1e53b286b60bac726525c4c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.

Transparency log

Release history Release notifications | RSS feed

0.0.7

2 release files

0.0.6

2 release files

0.0.5

2 release files

0.0.4

2 release files

0.0.3

2 release files

0.0.2

2 release files

This release

0.0.1 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page