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.

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.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

scorekeeper-0.3.0.tar.gz (146.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

scorekeeper-0.3.0-py3-none-any.whl (47.1 kB view details)

Uploaded Python 3

File details

Details for the file scorekeeper-0.3.0.tar.gz.

File metadata

  • Download URL: scorekeeper-0.3.0.tar.gz
  • Upload date:
  • Size: 146.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for scorekeeper-0.3.0.tar.gz
Algorithm Hash digest
SHA256 2088534119fbf674914fc33957ef28787e6e8f51dd08f556a7bc823449a9ffe5
MD5 e48173d86a1d48524e98c4d98f1a0e54
BLAKE2b-256 823bf5c6200f4c3209c46ba5dbf770254aa3ac5b579c5b9ef5ddcd5b7556e4d2

See more details on using hashes here.

Provenance

The following attestation bundles were made for scorekeeper-0.3.0.tar.gz:

Publisher: release.yml on michalstrnadel/scorekeeper

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file scorekeeper-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: scorekeeper-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 47.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for scorekeeper-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 cfed094d0d0a846cc434890b28091dd45a1d94561ea7491a7197035a823e13e4
MD5 8baeacf043a7e3063183f5087a04c694
BLAKE2b-256 ccdf281a5371f4875bc271e8fdd5497b138130c70d4703beb475f492f2fcf2f8

See more details on using hashes here.

Provenance

The following attestation bundles were made for scorekeeper-0.3.0-py3-none-any.whl:

Publisher: release.yml on michalstrnadel/scorekeeper

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.4.0

2 files

0.3.2

2 files

0.3.1

2 files

This release

0.3.0 This release

2 files

0.2.0

2 files

0.1.1

2 files

0.1.0

1 file

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