diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..c535311 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,9 @@ +# Sponsor button for the repo. This file is a template: every line is commented, +# so no sponsor button renders until a maintainer opts in. +# +# To turn it on, uncomment one line and set the real handle. The GitHub Sponsors +# handle below is a placeholder, not an active account: confirm the org has a +# Sponsors profile before uncommenting. +# +# github: [attenlabs] +# custom: ["https://hotato.dev/"] diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 34d5866..df02442 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,5 +1,8 @@ blank_issues_enabled: true contact_links: + - name: Ask a question or share a catch + url: https://github.com/attenlabs/hotato/discussions + about: Questions, a moment hotato caught, an integration you wired up, or an idea. Lower friction than an issue, and others can chime in. - name: Documentation url: https://hotato.dev/docs/ about: Guides for capture, scoring, CI gating, and the MCP server. diff --git a/.github/ISSUE_TEMPLATE/first_catch.yml b/.github/ISSUE_TEMPLATE/first_catch.yml index 9bb7e7d..0e8f19e 100644 --- a/.github/ISSUE_TEMPLATE/first_catch.yml +++ b/.github/ISSUE_TEMPLATE/first_catch.yml @@ -32,10 +32,10 @@ body: id: command attributes: label: Command you ran - description: The exact invocation, credentials removed. + description: The exact invocation, credentials removed. Optional, but it helps us reproduce. placeholder: "hotato investigate --stack vapi --call-id " validations: - required: true + required: false - type: textarea id: what_was_caught attributes: @@ -68,19 +68,27 @@ body: - Gating a branch in CI (contract verify) - Still a candidate, deciding validations: - required: true + required: false - type: input id: version attributes: label: hotato version - description: Output of `hotato --version`. + description: Output of `hotato --version`. Optional. placeholder: "hotato x.y.z" validations: - required: true + required: false - type: checkboxes id: share_safe attributes: label: Share-safe + description: The card and the text report carry timings and measurements only. Keep it that way. options: - label: No audio is attached, and the paste carries no call id, phone number, or name of any call participant. required: true + - type: markdown + attributes: + value: >- + Thank you. A first catch from a stack we did not operate is the + clearest signal this tool works. If it earned a place in your loop, + a [star on the repo](https://github.com/attenlabs/hotato) helps the + next person find it. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6bb5614..9917346 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -9,6 +9,20 @@ ever a single blended score. Every kind of contribution is welcome. This guide gets your first one merged with the least friction, then points you at the contribution that helps most. +## The 30-second contribution + +The smallest useful change, start to finish: + +- **A one-line doc fix.** A typo, a stale flag, a command that reads wrong. + Edit the file on GitHub, open the PR. Done. +- **A labeled synthetic fixture.** One JSON scenario that stresses a timing + edge the suites miss. Copy an existing label under + [`corpus/suites/`](corpus/suites/), change the timings, run + `python3 corpus/validate.py your_label.json` until it prints PASS. + +Both are reviewed quickly and merge without a release. If you have more time, +read on. + ## Ways to help Pick whatever fits the time you have: diff --git a/README.md b/README.md index a4c1fc7..f624b0e 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,9 @@ PyPI version Downloads per month Python versions -CI status

+CI status +MIT license

+ # hotato @@ -14,6 +16,8 @@ Your evals are green. Your agent still ships bugs they can't see: talk-over, dead air, a tool it swore it ran. hotato catches them on your machine and gates CI so they stay fixed. +uvx hotato start --demo catches a 2.66s talk-over and returns exit 1 + **[hotato.dev](https://hotato.dev)** diff --git a/README.pypi.md b/README.pypi.md index 3245b8e..2547550 100644 --- a/README.pypi.md +++ b/README.pypi.md @@ -6,7 +6,9 @@ PyPI version Downloads per month Python versions -CI status

+CI status +MIT license

+ # hotato @@ -14,6 +16,8 @@ Your evals are green. Your agent still ships bugs they can't see: talk-over, dead air, a tool it swore it ran. hotato catches them on your machine and gates CI so they stay fixed. +uvx hotato start --demo catches a 2.66s talk-over and returns exit 1 + **[hotato.dev](https://hotato.dev)** diff --git a/docs/assets/hotato-demo-cast.svg b/docs/assets/hotato-demo-cast.svg new file mode 100644 index 0000000..e8f24ba --- /dev/null +++ b/docs/assets/hotato-demo-cast.svg @@ -0,0 +1,79 @@ + + uvx hotato start --demo catches a 2.66s talk-over + A terminal types uvx hotato start --demo, then reveals that a transcript which passed every text eval failed on timing: the agent talked over the caller for 2.66 seconds, so the gate returns exit 1. + + + + + + + + + hotato + + + + $ uvx hotato start --demo + + + + + Conversation failed: Agent did not yield; + + + measured talk-over was 2.66 s. + + + + talk-over 2.66s the agent kept talking while + + + the caller held the floor + + + + That transcript passed every text eval. + + + The timing did not. hotato pins it as a CI + + + contract that reproduces byte for byte. + + + + $ echo $? → 1 the gate is red until it is fixed + + diff --git a/llms-full.txt b/llms-full.txt index 05e4eef..13d9b20 100644 --- a/llms-full.txt +++ b/llms-full.txt @@ -10,7 +10,9 @@ FILE: README.md PyPI version Downloads per month Python versions -CI status

+CI status +MIT license

+ # hotato @@ -18,6 +20,8 @@ FILE: README.md Your evals are green. Your agent still ships bugs they can't see: talk-over, dead air, a tool it swore it ran. hotato catches them on your machine and gates CI so they stay fixed. +uvx hotato start --demo catches a 2.66s talk-over and returns exit 1 + **[hotato.dev](https://hotato.dev)**