<div align="center">
<img src="https://raw.githubusercontent.com/Balanov/verdict/HEAD/docs/readme/hero.png" alt="VERDICT — 종료 코드 0이 증거는 아닙니다. 실제 로컬 예측은 pytest가 테스트를 수집하지 못할 때 unknown을 반환합니다." width="100%">
<p><strong>CLI 도구 호출을 위한 197 KB 크기의 로컬 의미론적 결과 분류기입니다.</strong></p>
<p><code class="language-text">success</code> · <code class="language-text">failure</code> · <code class="language-text">blocked</code> · <code class="language-text">unknown</code></p>
<p>
<a href="#install-and-run">설치 및 실행</a> ·
<a href="#benchmark">벤치마크</a> ·
<a href="#model">모델</a> ·
<a href="#output-contract">출력 계약(Output contract)</a> ·
<a href="https://balanov.pro/verdict/">제품 페이지</a> ·
<a href="https://balanov.pro/research/verdict/">브라우저 데모</a> ·
<a href="README_RU.md">Русский</a>
</p>
<p>
<a href="pyproject.toml"><img src="https://img.shields.io/badge/Python-3.10%2B-3776ab?logo=python&logoColor=white" alt="Python 3.10+"></a>
<a href="LICENSE"><img src="https://img.shields.io/badge/license-Apache--2.0-green.svg" alt="Apache-2.0 라이선스"></a>
<a href="https://huggingface.co/BalanovAN/verdict"><img src="https://img.shields.io/badge/weights-Hugging%20Face-yellow?logo=huggingface&logoColor=white" alt="Hugging Face의 모델 가중치"></a>
</p>
</div>
<div align="center">
<img src="https://raw.githubusercontent.com/Balanov/verdict/HEAD/docs/readme/demo.gif" alt="테스트를 수집하지 못한 pytest에 대한 실제 Verdict 예측: 레이블 unknown, 신뢰도 0.999981, 경고 true" width="100%">
<p><sub class="language-text">실제 로컬 예측입니다. 선택된 출력 필드가 표시됩니다. Verdict는 프로세스 종료 코드를 신뢰하기보다 증거를 읽습니다.</sub></p>
</div>
Verdict는 코딩 에이전트(coding agents), CI 러너(CI runners), 그리고 도구 사용 시스템을 위한 의미론적 결과 계층(semantic outcome layer)의 연구 미리보기입니다. 이는 프로세스 종료 코드 너머를 보고 명령, stdout, stderr를 읽습니다. 추론(Inference)은 Python 종속성이 전혀 없는 CPU에서 로컬로 실행됩니다.
중요: Verdict는 조언적 분류기(advisory classifier)이며, 작업 또는 환경 변형이 완료되었음을 증명하는 것은 아닙니다. 결정론적 검사(deterministic checks)와 권위 있는 상태 검증(authoritative state verification)을 진실의 원천으로 유지하십시오.
왜 (Why)
프로세스는 테스트를 전혀 실행하지 않으면서 성공적으로 종료되거나, HTTP 500을 반환하거나, 워커를 기다리거나, 불완전한 출력을 생성할 수 있습니다. 반대로, 비영점 종료 코드(non-zero exit)는 실패한 단언(failed assertion)이라기보다는 환경 차단기(environment blocker)를 설명할 수 있습니다. 에이전트가 재시도하거나, 중지하거나, 완료를 주장하기 전에 이러한 구분이 필요합니다.
벤치마크 (Benchmark)
훈련에 전혀 사용되지 않은 48개의 CLI(Command Line Interface) 계열에서 가져온 192개의 합성 예제로 평가되었습니다. 훈련에는 60개의 다른 계열에서 나온 1,440개의 합성 예제가 사용되었습니다.
| 모델 | 정확도 (Accuracy) | 매크로-F1 (Macro-F1) | 크기 (Size) | 중앙값 추론 시간 (Median inference) |
|---|
| Verdict 0.1 (int8) | 93.2% | 93.2% | 197 KB | 0.54 ms |
| Exit-code baseline | 47.9% | 31.9% | — | — |
지연 시간(Latency)은 피처 추출 및 Python API 호출을 포함하여 Windows 11 / AMD64 / Python 3.12에서 수행된 576개 예측의 중앙값입니다. 이는 크로스 하드웨어 보장이 아닌 재현성 측정치입니다. bench/results.json를 참조하고 python training/train.py로 재현하십시오.
코퍼스는 합성(synthetic)이며 영어 편향적입니다. 이 벤치마크는 프로덕션 에이전트 트레이스에서의 신뢰성이 아닌, 보류된(held-out) 템플릿 전반의 일반화 성능을 측정합니다. 실제 트레이스 검증이 다음 목표 지점입니다.
<div align="center">
<img src="https://raw.githubusercontent.com/Balanov/verdict/HEAD/docs/readme/model.png" alt="Verdict inference path, four output labels, and macro-F1 comparison: 93.2 percent versus 31.9 percent for the exit-code baseline on synthetic held-out data" width="100%">
<p><sub>메커니즘, 출력 계약 및 측정 컨텍스트. <a href="bench/results.json">원시 벤치마크 데이터</a> · <a href="#reproduce">모델 재현하기</a>.</sub></p>
</div>
설치 및 실행 (Install and run)
git clone https://github.com/Balanov/verdict.git
cd verdict
python -m pip install .
from verdict_tiny import Verdict
model = Verdict()
...
{
"label": "unknown",
"confidence": 0.999981,
...
CLI (명령줄 인터페이스)
printf 'collected 0 items\nno tests ran\n' | verdict \
--command 'pytest tests/' --exit-code 0
필요에 따라 --stdout output.log, --stderr error.log, 그리고 --weights /path/to/verdict-q8.bin을 사용합니다.
브라우저 데모 (Browser demo)
프로젝트 페이지에서는 동일한 양자화된 가중치(quantized weights)를 브라우저에서 실행합니다. 로그는 업로드되지 않습니다.
출력 계약 (Output contract)
| Label | 의미 |
|---|
success | 작업이 완료되었음을 나타내는 긍정적인 증거가 출력에 포함되어 있습니다. |
| ... | |
| 확률은 선형 다중 클래스 모델(linear multiclass model)에서 나오며, 안전 필수적인 관점에서의 보정된 신뢰도(calibrated confidence)가 아닙니다. 중대한 조치를 취할 때는 임계값 및 인간 또는 결정론적 검토를 사용하십시오. | |
모델 (Model)
- 아키텍처: 해시된 문자 3
5그램(hashed character 3–5-grams) 및 단어 13그램(word 1–3-grams) → 다중 클래스 로지스틱 회귀(multiclass logistic regression).
- 파라미터: 196,608개의 int8 가중치와 네 개의 바이어스 및 클래스별 스케일.
- 입력: 명령어(command), 종료 코드(exit code), stdout, stderr; 명시적인 헤드/테일 클리핑(head/tail clipping)을 통해 출력 스트림당 12,288자로 제한된 UTF-8 텍스트.
- 런타임: 순수 Python 표준 라이브러리; 토크나이저 파일, GPU, 네트워크 호출 또는 원격 측정(telemetry) 기능 없음.
- 가중치:
weights/verdict-q8.bin, Hugging Face에서도 이용 가능합니다.
Verdict는 의도적으로 범위가 좁습니다. 관찰된 CLI 증거를 분류할 뿐이며, 작업 완료 여부, 코드의 정확성, 안전성 또는 진실성을 판단하지 않습니다.
재현 (Reproduce)
python -m pip install -e '.[train,dev]'
python training/train.py
pytest -q
훈련 스크립트는 공개 코퍼스(public corpus)를 재생성하고, 처음부터 훈련하며, int8 가중치를 내보내고, 양자화된 아티팩트(quantized artifact)를 평가하며, 벤치마크 메트릭을 작성합니다.
저장소 레이아웃 (Repository layout)
assets/ 로고 및 편집 가능한 벡터 소스
bench/ 측정된 지표(metrics)
data/ 합성 학습용 데이터 및 분리 테스트용 데이터 JSONL (CC0)
...
라이선스
코드 및 모델 가중치: Apache-2.0. 합성 데이터셋: CC0-1.0. 포크(Fork)하여 수정하고 배포하세요. LICENSE와 data/LICENSE를 참조하십시오.
인용 (Citation)
@misc{balanov2026verdict,
title = {Verdict: Tiny Semantic Outcome Verification for AI Agents},
author = {Balanov, Anton},
...```