Release Notes: v2.7.0 — Seven New Ways to Annotate
The largest Potato release yet: 342 files changed, ~50,000 lines added, 33 commits since v2.6.2. It has two halves. The first is a wave of seven new opt-in features — Psychometrics, Multiplayer Rooms, Boundary Lab, Truth Serum, Think-Aloud Mode, Paper Mode, and Pocket Mode — built around one idea: an annotation tool should not just collect labels, it should measure how labels come to be, and the process itself should produce more than point labels. None of the seven requires an LLM. The second half is a broad workflow-and-infrastructure wave: cross-document event annotation, turn-level annotation, CoT process-reward labeling, PDF cross-page linking, a living-document codebook, RBAC roles with per-cohort schemas, localized dashboards in 10 languages, and a much lighter core install.
Psychometrics Engine — labels with error bars
A live item-response-theory layer (multiclass GLAD; no gold labels, no LLM) that refits in milliseconds as labels stream in, jointly estimating each annotator's ability and each item's difficulty from agreement patterns alone.
- Every exported label carries a posterior and confidence interval —
p = 0.94 [0.88–0.97]instead of a bare majority vote (/psychometrics/api/export). assignment_strategy: psychometricroutes each item to whichever annotator's judgment carries the most expected information, and items past the confidence threshold stop consuming annotation budget (the dashboard shows judgments and dollars saved).- Codebook-bug detector — items where your best annotators disagree most (negative discrimination) are flagged: that pattern means the item is broken, not the people.
- Pre-study power analysis —
python -m potato.psychometrics.designrecommends annotators-per-item for a target Krippendorff-α precision via Monte Carlo, with cost estimates. - Live dashboard at
/psychometrics/dashboard; example inexamples/advanced/psychometrics/. See Psychometrics.
Multiplayer Rooms — live norming sessions, measured
Synchronized group annotation at /rooms: the calibration meetings teams already run over screen-share, made part of the tool and instrumented. Rooms sync by cursor-polling an event stream — no WebSockets, no new dependencies.
- Norming rooms — everyone votes blind (enforced server-side: pre-reveal, nobody can see another member's label, only who has voted) → the host reveals → the group discusses in a side chat → anyone may change their vote. Blind votes are immutable after the reveal; every post-reveal change is logged with the majority at that moment — a per-member conformity record.
- Live agreement meter — Krippendorff's α computed twice over revealed items: blind votes vs current votes. The gap is the session's norming lift — whether the meeting was worth it, on screen while it happens.
- Huddles — one click seeds a room from every item the team currently disagrees on, with the original annotations shown as context: adjudication as a conversation.
- Shadow rooms — trainees join as observers and watch the host's votes, reveals, and text selections live.
- Event-sourced — every room appends to
rooms/room-<CODE>.jsonl; state is a pure replay, so live rooms survive restarts and the log is the session's audit trail. Final votes persist into members' regular annotation state. See Multiplayer Rooms.
Boundary Lab — annotate the boundary, not the point
The moment an annotator commits a label, Potato shows minimal counterfactual edits of the text and asks: you said Polite — would that survive this edit? One click per probe. Ordinary annotation then produces contrast sets for free (every answered probe is a labeled original/counterfactual pair, à la Gardner et al. 2020), boundary rationales that pinpoint codebook ambiguity, and invisible quality control (annotators who flip on meaning-preserving paraphrases get flagged — no fake gold items planted). Rule-based generation, no LLM. See Boundary Lab.
Truth Serum — surprisingly-popular scoring
After each label, one micro-question: what percentage of other annotators will agree with you? Those predictions power the surprisingly-popular estimator (Prelec et al. 2017, Nature): the label whose actual popularity most exceeds its predicted popularity beats majority vote exactly where annotation is hard — no gold labels required. The dashboard's "where the crowd is likely wrong" queue surfaces items to review first, plus per-annotator calibration scores. To our knowledge the first annotation tool to ship peer-prediction scoring. See Truth Serum.
Think-Aloud Mode — voice rationales, zero LLM
Annotators just talk while they work. Speech-to-text runs fully locally (faster-whisper, CPU real-time on the 39 MB tiny.en model); the verbatim transcript is stored as the rationale — deliberately un-summarized, because paraphrasing a think-aloud protocol contaminates the artifact. Labels can be committed by voice ("I'd call it neutral", "final answer: polite") via a rule-based parser. Nothing leaves the machine. See Think-Aloud Mode.
Paper Mode — the dataset that writes its own methods section
python -m potato.paper config.yaml -o paper_exportOne command turns a Potato project into a compilable LaTeX dataset report: dataset description, label distributions, annotator table, agreement statistics with the right citations (paper.bib included), timing, and a limitations paragraph. Every section sits between cut-paste markers; tables also export as CSV and every number as JSON. Fully offline, no LLM, no server. See Paper Mode.
Mobile annotation (Pocket Mode)
Potato now supports phones and tablets as first-class annotation devices. With pocket: {enabled: true}, touch devices that open the task are detected and routed automatically to a mobile interface — a card stack with thumb-zone label buttons, swipe navigation, offline annotation with automatic sync, and home-screen installation as a PWA. For single-radio tasks, one tap = one labeled item. Detection is two-layer (server-side User-Agent plus a client-side primary-pointer check that catches iPads masquerading as Macs), with a sticky "Desktop site" opt-out.
Not every annotation type is mobile friendly: tasks that include desktop-only schemas (spans, bounding boxes, video...) are never degraded onto touch — phones keep the desktop UI and see a dismissible warning that a desktop browser is recommended. Either way, a new Devices tab in the admin dashboard shows who is annotating from what (mobile/tablet/desktop visit counts per user, tracked whether or not Pocket Mode is enabled), so you can spot phone annotators on desktop-only tasks. See Mobile Annotation.
Try them together
examples/advanced/showcase/ runs one politeness task with five of the new features enabled at once — probes, peer predictions, voice rationales, live psychometrics, and a one-command paper export.
Cross-document event annotation + corpus map
Annotate events that span many documents. Instead of labeling one document at a time, annotators build events — first-class records that aggregate evidence from across a corpus into a shared template (event type, participants, location, time), the way cross-document event corpora (ECB+, GVC, ERE) are actually constructed.
- New
multi_document_eventschema wired through config and blueprints, backed by a cross-document event registry. - Corpus map — an ingest pipeline plus an annotator navigation API for moving through a corpus by event rather than by document.
- Annotator UI for citing evidence into event slots; unit, server, and Selenium coverage; a runnable disaster-news corpus example. See Multi-Document Events.
Turn-level annotation & multi-agent traces
Apply any annotation scheme per turn of a conversation or agent trace instead of once per instance. Schemes bind to declarative filters — by speaker, agent, step type, tool name, or turn range — and render inline inside every matching turn, with values stored under stable turn ids. This generalizes the dialogue display's per_turn_ratings to multiple display types and all widget types. Alongside it: a multi-agent discussion display with agent identity tracking and a run tree, plus a review workflow for session-level annotation. See Turn-Level Annotation.
Chain-of-thought process-reward annotation
Turn a long CoT reasoning trace into a vertical list of reviewable steps, have an external LLM pre-score each step (correct / neutral / incorrect), and let a human confirm or override each one — the standard "LLM labels, human verifies" pattern for producing Process Reward Model (PRM) training data much faster than labeling from scratch. Includes automatic CoT segmentation, the new cot_trace display, a process_reward scheme with per-step provenance (which labels came from the model, which were verified or overridden), and a pre-label API. See Process Reward CoT.
PDF: cross-page linking + OCR
A new PDF link mode: place text-span and region-box anchors on any page and draw typed links between them across pages — anchors are unified span objects carrying page/bbox geometry. Optional OCR (false/true/"auto") builds a text layer for scanned PDFs. PDF.js is now vendored, so PDF tasks work offline.
Living codebook document
The codebook grows a full living-document form: a typed-block markdown document (definitions, examples, decision rules) with a full-page editor at /codebook and a distiller that keeps the document and the code list in sync. Codes remain first-class — add, rename, recolor, move, and delete without touching YAML. See Codebook.
Teams, access control & assignment
- RBAC roles — role/permission-based access control; admin blueprints now route through it uniformly.
- Per-cohort schemas — different annotator cohorts can see different annotation schemes (or subsets), bound to the same cohorts used for batch assignment; the global scheme list remains the default and fallback. See Per-Cohort Schemas.
- Automatic batch assignment for unknown annotators (#163) — annotators who show up without a pre-assigned batch get one automatically, and auto-assigned cohort pins now persist across restarts.
- Scaling guide — a new deployment doc on how Potato actually behaves with large datasets and which knobs matter. See Scaling.
Localization
Admin and annotator dashboards are localized, with 10 bundled languages: Arabic, German, Spanish, French, Hindi, Japanese, Korean, Portuguese, Russian, and Chinese.
LLM endpoint plumbing
${ENV_VAR}expansion inside LLM endpoint config blocks — keep API keys out of YAML.- OpenAI-compatible
base_urlnormalization for local/vLLM endpoints, and bare-host URL normalization before Playwright navigation in web-agent tasks.
Packaging: lighter core install
- AI SDKs are now imported lazily. A core
pip install potato-annotationno longer requires (or imports) any AI SDK: endpoints register as lazy specs and the SDK is imported only when a config selects thatendpoint_type. Previously a core install could fail to boot with a missing-ollamaerror; now a missing SDK produces a clear message naming the exactpip installto run. - The
[ai]extra now covers all first-party LLM endpoints —anthropicandgoogle-genaijoinollamaandopenai(pip install "potato-annotation[ai]"). - Server boot import time drops from ~2.0s to ~0.7s with SDKs installed, since none of them load at boot anymore.
Paper & citation
Potato 2.0 has an official paper at ACL 2026 (demo track). The README badge, official citation, and a CITATION.cff are included — if you use Potato in research, there is now a current reference to cite.
Fixes & maintenance
- Repaired 7 pre-existing unit-test failures; the full suite (7,482 tests) passes.
- Upgraded the bundled vite from 5 to 7, resolving 5 Dependabot alerts.
cot_traceadded to the static display-type fallback list in config validation.- Corrected the Gemini SDK package name in docs (
google-genai, not the legacygoogle-generativeai).
Upgrade
pip install --upgrade potato-annotation==2.7.0