Release WhyKit 0.4.0 is on PyPI Changelog ↗
Open source · Apache-2.0 · v0.4.0

Give your agents the why

WhyKit keeps every decision next to the sources behind it, as plain Markdown in your repo. Claude Code, Codex, Cursor and other MCP clients look it up before they act, and your CI flags a decision as soon as its evidence goes out of date.

uv tool install 'whykit[mcp]'
Claude Code, Codex, Cursor and any other MCP client ask WhyKit about a decision and get the decision with the source behind it. Claude Code Codex Cursor + any MCP client WhyKit your decisions D-011 ● live Sell direct, not through partners because E-013 3 meetings, 0 leads Why not partners?

Three real questions, each answered through the WhyKit MCP server by the agent shown, on 7 Nov 2026, using the Northline example vault. Transcripts.

5/5
Agent answers that found the right decision

Five questions on 7 Nov 2026. Every answer cited the decision and its source.

17 s
From question to cited answer

Average of the three timed runs: 15.6, 16.2 and 18.9 seconds.

3
Agents tested over MCP
+ any MCP client
0
Files an agent can change

The server is read-only. The test suite runs it and checks the vault bytes did not change.

Works with your agent

One command, and your agent can ask why

WhyKit ships a read-only MCP server. Add it to Claude Code, Codex, Cursor or any other MCP client, point it at your vault, and the agent can look up decisions and their sources instead of guessing from the code. It cannot change a single file.

$ uv tool install 'whykit[mcp]' $ claude mcp add whykit -- whykit-mcp --root /path/to/my-ledger

Each setup was run on 7 Nov 2026. By default the server only returns records labelled internal or lower; --max-sensitivity changes that. MCP guide.

“Why did we decide this?” Reads the decision, the sources it cites and the record it replaced. context · trace
“What depends on this source?” Lists every decision and note that would be affected if it changed. impact · backlinks
“Give me what I need for this task.” Packs the relevant records into one size-limited bundle, with a preamble written for Claude, Codex or Cursor. query · pack
“Is anything out of date?” Reports overdue reviews, retired sources and lint findings for the whole vault. status
A real recording, not a mockup

See the whole ledger in your browser

Explorer is an optional, read-only viewer built from the same Markdown files. This is the Northline example: its decisions, which record replaced which, the sources and what is due for review.

localhost · WhyKit Explorer

Recorded on 7 Nov 2026 in real time from a local build of Explorer for examples/northline at commit 73d6833. Nothing is sped up.

Explorer showing decision D-011 with its supersession chain D-009, D-010, D-011 and its registered evidence E-013
Every decision shows where it came fromThe sources it cites and the earlier decisions it replaced, in order.
Explorer timeline showing how long each Northline decision stayed in force
How long each decision heldEach bar runs from the day a decision was made to the day a newer one replaced it.
How it works

A source, a decision and a date to check again

List your sources, such as an interview, a report or a dashboard, and give each a short ID. A decision is a Markdown note that says what you chose and which sources back it. Nobody edits an approved decision: you write a new one that replaces it, so the history stays readable.

01 · RECORD

Register a source

Say what it is and where someone can check it.

whykit new evidence
02 · DECIDE

Write the decision

What you chose, why, and what you turned down, with the sources it rests on.

whykit new decision
03 · GATE

Check every change

The same check runs on your laptop and in every pull request.

whykit check --profile ci
04 · REVIEW

Look again on a date

Every decision has a review date, and WhyKit lists the ones that are due.

whykit review list
When a reason goes stale

Your CI notices before your agent repeats it

Sources get retired and decisions pass their review date. whykit check runs in every pull request and fails when a decision still in force rests on something that no longer holds. Below, a source is retired and the next check fails.

Staged animation. Records and messages are real WhyKit 0.4.0 output on the Northline example vault.

Everything the check reports

What changed
Rule
What WhyKit says
A live decision cites a source that was retired
evidence.retired
warningsource_ids cites retired evidence E-013; preserve historical records but review current claims
A decision cites an E-ID the register does not have
evidence.missing
errorsource_ids cites E-099, but the register has no populated active or retired row for it
Accepted reasoning was edited in a commit
whykit history
failsHistorical decision reasoning is append-only. Supersede; do not rewrite
An approved decision is past its review date
review_by.overdue
warningapproved document review was due 2026-10-06
A wikilink points at a note that does not exist
wikilink.missing
errorwikilink does not resolve: [[does-not-exist]]
A note contains something shaped like a token
secret.detected
errorlooks like a GitHub token — keep locations, never secret values
A decision still holds the template's prompts
decision.placeholder
warningdraft decision still has template text or nothing in `## Context`, `## Decision`, … — write the real content

The first six were produced by changing a copy of examples/northline; the last by the README quickstart. The full rule list is in docs/rules.md ↗.

The same check runs as a GitHub Action on every pull request. Set it up in your repository ↗

One vault, several readers

One set of files, three ways to read it

Everything lives in Markdown files in your repository. Explorer, the command line and the MCP server only read them, so there is no second copy to keep in sync. The folder also opens in Obsidian.

WhyKit Explorer home view for the Northline example vault

Explorer

A static site with no server code. It can also be built as one HTML file that opens from disk.

$ whykit status --today 2026-09-17
documents       57
decisions       11
evidence        14 active / 1 retired
lint            0 error(s), 0 warning(s)
review queue    1 due within 30 day(s)
--json on every vault command

CLI

Query, trace, impact and context commands, with versioned JSON output for scripts and CI.

$ whykit-mcp --root ./vault
tools      query · context · impact
           status · pack · trace
           backlinks
resource   whykit://decisions
ceiling    --max-sensitivity internal
writes     none

MCP server

Gives an agent read-only access to the vault over stdio or loopback HTTP, filtered by a sensitivity ceiling.

Get started

Start your own ledger

Python 3.11 or newer and uv. These are the README's commands; they were run against WhyKit 0.4.0 from PyPI on 7 Nov 2026.

STEP 1

Install

Install the CLI as a uv tool, then create a vault: a folder of Markdown files.

$ uv tool install whykit $ whykit init my-ledger
STEP 2

Record

Register a source, then a draft decision that cites it.

$ whykit new --root my-ledger evidence \ --source "Support ticket export, Q3" \ --type dataset \ --location "https://example.com/exports/q3-tickets.csv" \ --claims "Most onboarding tickets mention SSO" $ whykit new --root my-ledger decision \ "Ship SSO before audit logs" \ --owner Platform --status draft --source E-001
STEP 3

Trace and check

See the link, then lint. Five warnings name the work the template still needs.

$ whykit trace --root my-ledger --decision D-001 D-001 06-decisions/d-001-ship-sso-…md (draft) E-001 active $ whykit lint --root my-ledger 24 files — 0 error(s), 5 warning(s)
Built to be checked

Trust it because you can read it

Apache-2.0 code, tests on every push, reproducible builds and a security policy that says what the tool does not protect.

1791tests

Tested on every push

The suite runs on Python 3.11, 3.12, 3.13 and 3.14 and again on Windows, and both example vaults are linted strictly.

stdlibonly

No runtime dependencies

The core package uses the standard library alone. CI builds an SBOM of the installed wheel and fails if anything else appears in it.

2×same bytes

Reproducible builds

CI builds the wheel and source distribution twice from one commit and requires identical bytes.

Offlineby test

Nothing phones home

A test breaks the socket layer and runs every vault command. There is no telemetry, account or service.

OIDCno stored token

Trusted publishing

Releases reach PyPI from a tag-triggered workflow with PEP 740 attestations. No PyPI token is stored in the repository.

SHApinned actions

Audited automation

Every workflow action is pinned to a commit, workflows are audited with zizmor and history is scanned for secrets with gitleaks.

0.1.017 Sep 2026 · first tag
0.3.126 Oct 2026 · first on PyPI
0.3.43 Nov 2026
0.4.05 Nov 2026 · current
CI status Live CI status from GitHub Security policy ↗ Security model ↗ Full changelog ↗
What it won't claim

Honest about its limits

These limits are part of the product contract, not small print.

01

It informs, it does not decide

A clean check says a decision cites its sources. It cannot say the source is honest or the decision right, and an agent can still ignore what it reads.

02

No watching on its own

WhyKit does not check external sources for changes. It reports passed review dates; the re-read is yours.

03

Labels are not permissions

Sensitivity labels filter what the MCP server returns. Repository permissions are the only access control, so keep real vaults private.

04

Public alpha

Version 0.4 adds optional note types older clients do not understand. Read the feature status and the upgrade guide first.

Give your agents the reasons

Connect it to your agent, ask about a decision in the Northline example, then start a ledger for the decisions you will be asked about later.

More open source from CometWeb