glebis/annotate
Build and verify a PII gold set with HUMAN annotators (first-class). Launch the browser annotator, label spans per the codebook, export per-annotator label files, then compute inter-annotator agreement (Cohen's/Fleiss' kappa) and draft an adjudicated gold. Use when the user says "annotate PII", "label this transcript", "build a gold set", "inter-annotator agreement", "review annotations", "adjudicate labels", or wants to measure/defend a de-identification gold standard. Local-only: synthetic or consented data only; annotators' names and transcript text stay on the machine — only labels/stats are collected, nothing PII is re-shared.
npx skills add https://github.com/glebis/claude-skills --skill annotate
Humans label PII spans in a transcript; you measure how much they agree (κ) and draft an
adjudicated gold from their labels. Annotators are first-class here — most of this skill is
plain instructions FOR a person doing the labelling, plus a coordinator path to score it.
consent to share. When in doubt, anonymize first (confide:anon) and annotate the GREEN copy.
their browser and the exported JSON file on their own machine. Collect label files locally.
needed. The transcript text and the original PII are never re-distributed by this skill.
assets/annotator.html — zero-install browser annotation tool (EN/RU, runs offline).references/codebook.md — the labelling rulebook (10 PII types, direct/quasi, harm).references/tool-guide.md — how to drive the tool + scorer step by step.scripts/score_iaa.py — Cohen's/Fleiss' κ, span-F1, disagreement queue, draft gold (stdlib).scripts/gold_to_labels.py — turn an existing gold into a "reference annotator" to test solo.assets/annotator.html (or open it in Chrome/Firefox/Safari). It runs entirely in your browser — nothing is uploaded; labels stay on your
machine until you Export.
references/codebook.md first. It defines the 10 types(PERSON, LOCATION, ORG, PHONE, EMAIL, ID, DATE, MEDICATION, AGE, PROFESSION), what counts as
a span (the *minimal* identifying text), and direct vs. quasi-identifier.
A, B, or your name).Use only synthetic or consented text.
or third parties they mention) and assign its type. Record direct/quasi, entity id, role,
and harm as the codebook describes. Do not rewrite or redact — only label.
QUESTION: on thespan (e.g. QUESTION: gym or city?). These flow straight into the adjudication queue.
labels.<doc>.<annotator>.json(schema: {doc_id, annotator, text, spans:[{start,end,text,type,...}]}). Keep it local and
hand only this file to the coordinator. Two+ people should label the *same* doc independently
(blind) for a meaningful κ.
labels.<doc>.<annotator>.json into one folder, e.g. labels/. python3 skills/annotate/scripts/score_iaa.py --labels-dir labels/ --out-dir results/
It writes (per doc + overall): Cohen's κ (pairwise), Fleiss' κ (3+ annotators),
span-F1, a disagreement queue (*-iaa-disagreements.json: every cluster annotators
don't fully agree on, plus any QUESTION: spans), and a draft adjudicated gold
(*-adjudicated-gold-draft.json: majority span per overlap-cluster, ties/questions marked
needs_review:true). Character-level κ sidesteps tokenization disputes.
careless annotator — fix the rule and re-label, don't just discard.
needs_review cluster. The resulting label set is the published gold; report
post-adjudication κ too. Nothing is ever auto-finalised.
Treat an existing gold JSONL as one "reference annotator", label the same doc yourself in
annotator.html as another, then score the pair:
python3 skills/annotate/scripts/gold_to_labels.py --gold GOLD.jsonl --name gold --out-dir labels/
# label the same doc yourself in annotator.html as "me" -> drop labels.<doc>.me.json into labels/
python3 skills/annotate/scripts/score_iaa.py --labels-dir labels/ --out-dir results/
(--sessions-dir DIR lets gold_to_labels.py read transcript text from disk so char offsets
match the gold exactly.)
IAA results (κ, F1) + a disagreement list + a draft adjudicated gold — labels/stats only.
Transcript text and original PII stay local; only what's needed to adjudicate is shared.
Take glebis/annotate from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.