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
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.jsonto 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_concurrencyand a governor seam sit beside it. - No tracks included. Tracks are skills, installed with
napoln at image build time.
tina tracks --format jsonlists 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
Metadata
Release files for tina-cli 0.1.6
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| tina_cli-0.1.6.tar.gz | 447.4 kB | Without provenance | Details for tina_cli-0.1.6.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| tina_cli-0.1.6-py3-none-any.whl | Python 3 | none | any | Details for tina_cli-0.1.6-py3-none-any.whl |
Total release size: 525.3 kB
Release files / tina_cli-0.1.6.tar.gz
| Download URL | tina_cli-0.1.6.tar.gz |
|---|---|
| Size | 447.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
41f96258b61bad87e692d7c0af26b2eb83af75194c5bd370faa27420b0ff8505
|
|
BLAKE2b-256 checksum How to use checksums |
e9401c8b3ffc9b9bf97f1b0f4457c2fb6b1de37de41741567f0974ae2d6573a4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","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}
|
Release files / tina_cli-0.1.6-py3-none-any.whl
| Download URL | tina_cli-0.1.6-py3-none-any.whl |
|---|---|
| Size | 78.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
39c6af9ed0443b75aea9333beaab1709f13e62fa02e2d00f0c6a295a9bb0b6fc
|
|
BLAKE2b-256 checksum How to use checksums |
bbe71244f69c09c2b7acc8958363f33737fe68460ff9f7a9578d356d7c451d42
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","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}
|
Security for tina-cli 0.1.6
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.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.