Skip to main content

Tina

Tina is an autonomous factory. It takes in clear work items from Jira, Github issues, etc and work on them to produce work that's relatively easily verified by a person.

pip install tina-cli

tina demo

The track in that recording is examples/bug-triage/ — the config, the skill, and what each key does.

How is Tina different from an agent harness?

Tina is an orchestrator of sort.

It selects a work item, claims it, and calls an agent harness once with a one-shot prompt that I call a track.

The agent harness does the individual work item. Currently, I use pi, because it's small and relatively stable. I may use a different one in the future.

So what's the value of doing this approach instead?

With an agent harness, you have to sit there and steer it. Even if you have one shot prompts, you need to put those prompts in there.

For work items that are very self similar, you can instead make what I can a track.

Think of it like a runbook or a guide. You take several examples of work you have already done once and use them to describe to the agent what it should do.

Then upstream from this system in your ticketing system, you make work items for it.

Downstream from this system PRs get made or Confluence docs get write or whatver other outcome you want.

You just write tickets instead of driving around your agent to get work done.

This approach scales your attention better than having 5 simultaneous agent sessions running simultaenously, especially you enter production situations where you're quickly drowned by the amount of work coming your way.

High-level track approach

A track is Source -> Skill -> Result.

harness = "pi"
executor = "local"

[harnesses.pi]
command = ["pi", "-p", "@{prompt_file}"]

[bug]
source = "github"
repo = "acme/api"
labels = ["bug"]            # or the full query = "repo:acme/api is:issue ..."
track = "triage"
result = "github:issue-comment"

A basic workflow:

tina validate                        # the config and every skill, statically
tina doctor                          # credentials, queries, harness, executor
tina dispatch --track bug --limit 5
tina run --track bug --item 4821
tina status --track bug

status derives both counts from the track's own query — once as dispatch runs it, and once with its no:assignee clause swapped for the bot — so they are two halves of one question and Tina keeps no state to go stale.

An external scheduler calls dispatch. Tina does not own scheduling — Cloud Scheduler, EventBridge, k8s CronJob, systemd timers, and GitHub Actions all work without Tina knowing about them.

Design

  • Orchestration only. Tina never writes a result. The agent does, with its own tools.
  • Harness agnostic. pi, Claude Code, and others are subprocess adapters. Tina never parses harness stdout — the agent writes outcome.json to a path Tina provides.
  • No persistent state. The tracker is the ledger. Workers claim items, and claimed items drop out of the query.
  • Control plane in a file. Pause and throttle live in a control file read fresh every dispatch, so whoever holds the pager can stop the factory without a deploy. Per-track max_concurrency and a governor seam sit beside it.
  • No tracks included. Tracks are skills, installed with napoln at image build time. tina tracks --format json lists them so infrastructure can be derived from the same file the runtime reads.

Documentation

Document Description
docs/architecture.md System design — tracks, dispatch/worker, adapters, outcome contract, v1 scope
docs/adr/ Architecture decision records — the reasoning behind each design choice
CONTRIBUTING.md Setup, the check loop, layout, how to add adapters, commit conventions

Development

See CONTRIBUTING.md for the full guide.

just is the task runner (brew install just).

just setup    # Install all dependencies
just check    # Format check, lint, type check, tests
just fmt      # Auto-fix formatting and lint
just test     # Run tests

Without just:

uv sync --all-extras       # Install all dependencies
uv run ruff format --check # Format check
uv run ruff check          # Lint
uv run ty check            # Type check
uv run pytest              # Run tests

License

MIT

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

tina_cli-0.1.4.tar.gz (442.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

tina_cli-0.1.4-py3-none-any.whl (75.2 kB view details)

Uploaded Python 3

File details

Details for the file tina_cli-0.1.4.tar.gz.

File metadata

  • Download URL: tina_cli-0.1.4.tar.gz
  • Upload date:
  • Size: 442.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.12.10 {"installer":{"name":"uv","version":"0.12.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for tina_cli-0.1.4.tar.gz
Algorithm Hash digest
SHA256 44684edf892ed0ee6cdea2f4dc4087030f4b1941c4434056372e993c039fa9b9
MD5 2cf5a4b5bf4c0b645e26643f5c163004
BLAKE2b-256 c6bcf93817b887e9e9a96c133dd537f346174f9f56d9dd889ae254cdab9f7f45

See more details on using hashes here.

File details

Details for the file tina_cli-0.1.4-py3-none-any.whl.

File metadata

  • Download URL: tina_cli-0.1.4-py3-none-any.whl
  • Upload date:
  • Size: 75.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.12.10 {"installer":{"name":"uv","version":"0.12.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for tina_cli-0.1.4-py3-none-any.whl
Algorithm Hash digest
SHA256 9f4ce54bd70825cd8d965887664ba64b3abc7d680856e00d6c0811e3c9877086
MD5 dde87233fc0669b0e4fa06250b37ec71
BLAKE2b-256 b4824ffd6ea5ef76bc4604041dd0dc1c82c74538da3554f22454425428ae5bb4

See more details on using hashes here.

Release history Release notifications | RSS feed

0.1.5

2 files

This release

0.1.4 This release

2 files

0.1.3

2 files

0.1.2

2 files

0.1.1

2 files

0.1.0

2 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