Skip to main content

scorekeeper

Commitment tracking for LLM agents — a deontic scoreboard of the agent's own commitments, entitlements, and incompatibilities, maintained outside the agent's authority.

Long-running agents decide on Postgres at step 3 and write MongoDB code at step 47. scorekeeper treats this as a normative problem, not a memory problem: every non-trivial decision becomes a first-class commitment record with entitlement (provenance — did the user say it? did a tool show it? or did the agent just generate it?), and revisions are gated: an externally grounded revision is a legitimate SUPERSEDE; an ungrounded one is a BRANCH-CONFLICT (drift) surfaced back to the agent. A commitment with no provenance at all is what a hallucination looks like in this vocabulary — it gets a CHALLENGE.

Phase-0 evidence (paired runs, planted scenarios): the bare agent drifted against its own database decision; the scorekept twin held. False-conflict rate 0, token overhead +0.6 %. Full report in the repository.

Install

pip install scorekeeper            # core library + CLI
pip install "scorekeeper[mcp]"     # + MCP server (scorekeeper-mcp)

Claude Code (primary integration)

git clone https://github.com/michalstrnadel/scorekeeper
claude --plugin-dir ./scorekeeper/claude-code-plugin

Five hooks do the work: SessionStart injects the normative digest (and re-injects it after context compaction — the exact place summarizers drop it), PostToolUse(Edit|Write) runs a millisecond content scan against pinned choices, Stop extracts the turn's commitments (async by default — a detached worker, zero added latency), UserPromptSubmit surfaces those findings on the next turn, PreCompact backs up the board.

MCP (any harness)

SCOREKEEPER_ROOT=/path/to/project scorekeeper-mcp

Tools: get_scoreboard, get_digest, assert_commitment, check_compatibility (dry-run), supersede, challenge, retract. Writes route through the same validated operator pipeline as the hooks — the agent cannot bypass the scorer.

Library

from scorekeeper import Store
from scorekeeper.extract import ExtractedCommitment
from scorekeeper.operators import apply

store = Store("/path/to/project")
result = apply(store, [ExtractedCommitment(
    claim="The primary database is PostgreSQL 16.",
    kind="decision",
    scope=["topic:persistence", "attr:persistence.primary_db=postgresql"],
    entitlement={"source": "user_utterance"},
)])
print(store.render_digest())

Storage is transparent and git-committable: .scorekeeper/commitments/*.yaml, an append-only log.jsonl audit trail, and a generated scoreboard.md. Nothing is ever deleted — statuses transition. scorekeeper board renders it all as a colored terminal dashboard (--events N, --no-color; color auto-disables on non-tty or NO_COLOR).

Model backends

Extraction and Tier-1 detection need a small LLM; local open-source models are first-class. Auto-detection order: SCOREKEEPER_MODEL_URL (any OpenAI-compatible endpoint — Ollama, LM Studio, vLLM) → ANTHROPIC_API_KEY (Haiku) → headless claude -p.

License

Apache-2.0. Theory, benchmark, and specs: github.com/michalstrnadel/scorekeeper.

Metadata

Release files for scorekeeper 0.4.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for scorekeeper 0.4.0
File Size Uploaded Provenance
scorekeeper-0.4.0.tar.gz 154.9 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for scorekeeper 0.4.0
File Interpreter ABI Platform
scorekeeper-0.4.0-py3-none-any.whl Python 3 none any Details

Total release size: 207.6 kB

Release files / scorekeeper-0.4.0.tar.gz

Download URL scorekeeper-0.4.0.tar.gz
Size 154.9 kB
Tags Source
SHA-256 checksum
How to use checksums
8917a5ea779c235a7a42e0c4b86bd02fcaf218794b3a04f4f19b4f36b5f53ef2
BLAKE2b-256 checksum
How to use checksums
b71c924cf61b01e7bb0d1793d289da253b99d495323ef60611137546a4ce5043
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 22, 2026.

Transparency log

Release files / scorekeeper-0.4.0-py3-none-any.whl

Download URL scorekeeper-0.4.0-py3-none-any.whl
Size 52.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
3f463041174a887509acba77459690f73e15f0edfd3ba605f811a0c9d52f3322
BLAKE2b-256 checksum
How to use checksums
b62a2ae2d5ff7f91a9c7de37a03bf1bdad5524e6c262a711991d6ca0f621d641
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 22, 2026.

Transparency log

Security for scorekeeper 0.4.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for scorekeeper-0.4.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 22, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page