Local Label Queue

Review text records in your browser, choose a label or abstain, and download a checkpoint to continue later. Every inventory record stays in the export, including unfinished and abstained items.

Work lives in this page's memory. Reloading or closing loses the session unless you keep a downloaded checkpoint. There is no automatic backup, browser storage or cloud synchronization. A completion count describes decisions, not annotation correctness.

Twelve records reviewed, zero labels assigned

Imagine working through twelve short support messages before using them in a training set. Some look like bugs, some ask questions, and a few do not give enough context. If every uncertain item gets a guessed label, the queue can look finished while hiding the uncertainty that still needs attention.

I built Local Label Queue to keep that uncertainty in the saved work. Each record can stay unfinished, receive a label, or be explicitly abstained on. Those are different states. Marking every item as abstained would make the queue 100% reviewed, with zero labelled records. That percentage reports workflow progress; it says nothing about whether a label is right.

The bundled twelve-message inventory is authored synthetic material, not a customer dataset or a human annotation study. Its saved demo has two labelled records, one abstention and nine unfinished records. It is at revision seven because changes and undo count as revisions; that does not mean seven records have been reviewed. Unknown groups remain unknown, and every original record stays in both exports.

Keeping the work across a refresh is a separate step. This page uses memory only. I tested an actual checkpoint download, lost the in-memory session by reloading, selected the saved file, checked its preview and explicitly restored it. Re-exporting the restored checkpoint produced identical bytes. The local tests also rejected damaged checksums and missing records without wiping the active session. Those tests establish a resumable workflow, not correct training labels. The package below preserves the original local evidence; hosted behavior still needs its publication-day check.

Use the full checkpoint to resume and the all-record JSONL to inspect decisions elsewhere. Both include the original text, so read them before sharing. Preparing a download link is not a backup, and a checksum is not a signature: someone can change labels and recompute a consistent file. There is no autosave, model, automatic quality check or verified annotator identity.

Start locally

Serve this directory over HTTP, then open the printed localhost address:

python3 -m http.server 8000 --bind 127.0.0.1

Use a modern browser with ES modules, File API and Web Crypto. HTTPS or localhost is needed for the digests. This static app has no installation, build step, external scripts or model dependency. The local preparation evidence described below was collected on 2026-11-04 and does not include an HF cloud deployment.

Enter JSONL and a label taxonomy, then start a session. A record needs exactly these fields:

{"id":"one","group":"document-a","text":"A text to review."}
{"id":"two","group":null,"text":"Its group is not yet known."}

Use 1–1,000 records, at most 1 MiB UTF-8 setup JSONL. Ids must be unique, nonblank Unicode scalar strings of up to 128 UTF-16 units. Groups are either a nonblank string with that limit or null. Text is nonblank, valid Unicode, up to 16,384 units. Unknown groups remain null; no family or independent-sample claim is inferred from an id or class. Records split on LF, preserving literal U+2028 within JSON strings. Blank lines are ignored and counted.

Use 2–9 distinct labels, one per line, up to 64 UTF-16 units each. Leading and trailing Python-style Unicode whitespace is trimmed, blank lines ignored, and case retained. Labels stay fixed in the active session. Editing setup does not change current decisions until Start new session explicitly replaces them. Invalid setup leaves the current session intact. Starting or restoring synchronizes the setup fields to the installed inventory.

Native JSON.parse retains the last duplicate object key. This app does not detect duplicate keys within a JSON object. Checkpoint files use strict UTF-8 JSON without an external BOM; a BOM inside a source string is retained.

Review records

Use the label buttons or keyboard numbers 1–9. A abstains and U undoes. Shortcuts are ignored in editable inputs, selections, during composition, with control/meta/alt modifiers and on held-key repeats. Previous/next, filters and the record list let you revisit decisions.

The three states are:

State Label field Included in exports
unlabelled null yes
labelled one current taxonomy label yes
abstained null yes

A label or abstention advances to the next unlabelled item, wrapping in original inventory order. The filter changes to All if needed to show that item. With no unlabelled item left, the current record stays when eligible; otherwise the view explains how to choose another visible record or switch filters. Clear decision restores the unlabelled state.

Undo keeps up to 20 actual changes in memory and returns to the restored record under All. Loading a checkpoint starts a new undo history. Repeating the same decision is a no-op. Navigation and filtering do not change the revision. A revision counts changes, including undo; it is not a count of labeled records or an authenticated event log. Revisions are bounded at 1,000,000,000; further changes are blocked at that limit, while viewing and exporting remain available.

Reviewed is (labelled + abstained) / all records. A completely abstained inventory is 100% reviewed with zero labelled records. All taxonomy counts, unfinished records and unknown-group counts remain visible. The tool does not judge label quality, agreement, group validity or independence.

Download and resume

Prepare current downloads, then explicitly download the resumable checkpoint. Preparing a link alone does not record a checkpoint copy. The page marks a revision only when its checkpoint download is started or it was restored from a checkpoint file; verify that the browser actually kept the file. New decisions remove stale download links and require a new checkpoint. Async digest results cannot mark a newer revision as downloaded.

To resume, choose the checkpoint through the local file picker. The app verifies schema and checksums, then shows a preview. Current work stays untouched until Replace session with this checkpoint is clicked. A failed read leaves current work intact. It restores the whole inventory and taxonomy, not a merge into a similar dataset. The bundled demo checkpoint can be used to try this flow.

The checkpoint includes every source text and annotation. It also includes a revision and two SHA-256 checksums:

Canonical JSON means native JSON.stringify over those reconstructed known fields, without spaces. Formatting, outer key order and annotation-row order in the file are not file-byte hashes; the verified state is reconstructed before hashing. Inventory item order and taxonomy order are part of the identity. Both digests are 64 lowercase hexadecimal characters. Current versions are schema 1 and tool 0.1.0. A checkpoint has a 4 MiB file limit plus the item, label, field and status limits above. Every id needs exactly one annotation; missing, duplicate, foreign or invalid rows are rejected. No unknown fields are accepted.

These checks detect inconsistency, not authenticity. Anyone can alter a file and recompute both checksums. The tests deliberately verify that such a consistently rehashed file can load. There are no signatures, encryption, verified annotator identities or claims that a checkpoint's labels are correct.

The second download is full annotation JSONL with {id, group, text, status, label} for every record. It preserves unlabelled and abstained rows with null labels. It is not a filtered training dataset and cannot restore a session on its own. Review the full contents of either download before sharing; texts, ids and labels may be sensitive.

Privacy and scope

Initial loading requests fixed local assets and the synthetic sample. Labeling, filtering, checkpoint preparation and local File API reads make no network requests. No files or paths inside records are followed. There are no uploads, storage APIs, URL state, telemetry, pretrained models, inference calls or training. A host still sees ordinary asset requests. These bounded application checks are not a privacy certification of the browser, extensions or host.

Demo and reproduction

The sample is 12 authored synthetic items with no gold labels. Three groups are unknown. The demo checkpoint records illustrative browser-test decisions: two labels, one abstention, nine unfinished records and revision 7. The extra revision changes include undo and revision of earlier decisions; seven revisions do not mean seven reviewed records. These are workflow examples, not a human annotation study, verified training labels or evidence of external adoption.

The source and demo file hashes are in SOURCE.json; the original sample was fixed before implementation in SAMPLE-SNAPSHOT.json. example-checkpoint.json and reference-checkpoint.json are separate constructed state-test fixtures, not extra independent annotation examples.

Node.js and Python standard libraries only:

node test_queue.mjs
python3 verify_reference.py

Run in a working copy: the checks regenerate example/reference fixtures. Local checks used Node.js 24.19.0 and Python 3.14.7. The ten Node groups cover state transitions, no-op counts, navigation, undo bounds, schema/Unicode/limits, restoration, rehashed malformed rows, the revision ceiling and real async digest snapshots. The independent Python oracle reconstructs 4,000 action states over 40 inventories, including undo, and checks full state counts, revisions, annotations, canonical payload hashes and restored inventories.

Actual local browser checks exercised keyboard and button labels, abstentions, clear/undo, filtered completion, no-op exports, editable-input shortcut isolation and invalid setup preservation. A native Blob checkpoint download survived reload and a real FileChooser restore; its re-exported file was byte-identical. Corrupt checksums, missing/foreign annotation ids and invalid UTF-8 were rejected without changing active work. A verified 12-item preview also left an unrelated 1,000-item session untouched until explicit replacement. All source texts and state counts in the actual JSONL/checkpoint downloads were independently checked with Python.

The UI retained 1,000 records with nine labels, and rejected 1,001 records without wiping current decisions. Script-shaped text and labels, prototype-shaped ids, emoji, BOM and U+2028 remained literal. A fully abstained three-record session showed zero labels and three reviewed records. Desktop and 390-pixel layouts were inspected without document overflow; filters/file reads produced no extra input requests in the local server log. These are local behavior tests, not hosted HF execution, label-quality measurements or user adoption.

中文说明

十二条都处理完,也可能一条标签都没有

假设要把十二条简短求助整理成训练材料,有的像故障,有的是提问,还有的缺上下文。如果为了清空待办而逐条猜标签,完成进度会掩盖真正的疑问。我做这个队列,是想让“还没做”“已经选标签”“看过但决定弃权”分开留下来。全部弃权可以显示100%已处理,同时仍是零条已标标签;进度不代表正确率。

随包十二条文本都是原创合成样例,不是客户数据,也不是人类标注实验。演示检查点只有两条已标、一条弃权、九条未完成,却是第七次修订,因为改动和撤销也算修订。未知分组继续保留null,两种导出都不丢未完成记录。

保存工作还得另做一步。本地实测里,我真正下载检查点、刷新丢失内存、用文件选择器读取旧文件,先看校验预览,再明确恢复;恢复后重导出的字节相同。坏校验值或缺记录的文件会被拒绝,原会话保持。这说明复核能接续,不证明标签正确。下面保留原本地测试范围,云端可用性另以发布时实测为准。

检查点和JSONL都带完整原文,分享前要看内容。只生成下载链接还没有备份;哈希也不是签名,改标签后重算照样能形成一致的文件。工具不自动保存,不代替人判断标签质量。

在本地浏览器逐条选择标签或弃权,支持返回修改、撤销和完整记录导出。未完成、已标标签、弃权分别计数,group未知就保留null,不推成独立样本。全部弃权可以是100%已处理,但仍然是零条已标标签,不能当成标注正确率。

刷新或关页前要下载检查点,没有自动保存。恢复文件先校验结构、完整记录与校验值,显示预览,再明确替换当前会话;损坏或缺记录的文件不会抹掉当前工作。哈希只核一致性,任何人都能修改内容后重新计算,不是签名、真实标注者证明或标签质量保证。

示例为十二条原创合成记录及测试流程中的演示决定,没有金标准标签、模型训练或外部采用证明。两类下载都包含完整原文和当前决定,分享前应检查内容。本包记录2026-11-04本地准备与验证,公开云端运行以实际发布回执为准。