
Causari
io.github.croviatrust由 GitHub 帳號 croviatrust 發布v0.5.0更新於 Oct 24, 2026
Records the prompt, model and files an agent declared for a line. It does not prove who typed it.
發布方自己的服務:Crovia — verifiable silence (TACET) and Crovia Seal
概覽
本機 stdio MCP 伺服器,把代理宣告的提示詞、模型與檔案記入本機帳本,並讓助理回溯與解釋歷史事件。
- 可以做什麼
- 記錄代理事件:把宣告的提示詞、模型與檔案清單寫入本機僅追加帳本。
- 回溯歷史:從帳本中檢索已記錄的事件與工作階段。
- 解釋某一行:找出是哪個已記錄事件引入了檔案中的某一行。
- 同一程式也能稽核 git 歷史中 AI 標記提交的存活率,但那是命令列功能,不是 MCP 工具。
- 適用情境
- 適合希望助理在儲存庫中留下本機、可檢查的操作紀錄,並能回答某行程式碼為何存在(而不只是哪個提交改過它)的情境。也適合已使用 causari 二進位檔、想在 Claude Desktop、Cursor、Windsurf 或 Cline 中存取該帳本的使用者。
- 執行需求
- 需安裝 causari(re)二進位檔並加入 PATH,伺服器以 re mcp 作為本機 stdio 程序啟動。專案需先用 re init 初始化,產生 .causari 帳本。未宣告帳號、API 金鑰或環境變數。
安裝
在 SourceWeft 中
- 開啟 儀表板中的 Causari,將其新增到工作區。
- 為需要使用其工具的對話啟用該服務。
Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。
其他 MCP 客戶端
參照 儲存庫 中的啟動說明。
README
∵ causari
AI-written code has no author. It has causes. Causari records them.
How many lines from AI-tagged commits are still alive in your repo? One command, any git repo, no setup. A count, not a grade.
re audit counts lines introduced by commits whose git metadata matched an AI-detection rule, and how many of those lines git blame still attributes to those commits at HEAD. That count is survival: a count, not a grade. AI-tagged means the metadata matched. It does not prove a model wrote the line. UNKNOWN (no such metadata) is not human.
Causari also keeps a local ledger of what an agent runtime declared (prompt, model, files) and exposes it over MCP (re mcp). A Seal authenticates that a key signed these bytes for this commit and method. It does not authenticate that the numbers, or the attribution, are true.
Method and limits: causari.dev/method. The same limits, for an agent, in one file: causari.dev/llms.txt (full specification and schemas: causari.dev/llms-full.txt; agent discovery card: causari.dev/.well-known/agent.json).
causari.dev · Weekly Survival Report · Method · Manifesto · Roadmap · Releases
[CI] [License] [Platform] [AI code survival, measured by this tool on its own repository]
Causari by Crovia Trust: the causari / re binary, the causari package on npm, PyPI and crates.io, the MCP server io.github.croviatrust/causari. Not related to causari.ai, the GitHub organisation causari or the npm scope @causari (a causal knowledge graph by another team).
The percentage is how many lines git blame still attributes to commits this method tagged. It is not code quality, developer productivity, total AI usage, proof a model wrote the line, security, correctness, or a causal effect of AI. An agent row under 5 commits is marked below floor; 5 commits is the comparability floor, not a reliability guarantee.
A git-ai note counts only when it names a non-empty tool (method v4). A schema-only note, a human-only note, and an empty tool do not. Method v3 counted any git-ai note. Survival Reports #1 and #2 stay method v2. Reports #3 and #4, and any audit from the 0.3.0 release, stay method v3. Report #4 is 10.5281/zenodo.23196011. Reports #5 and #6 stay method v4, measured with causari 0.4.1 (commit d4c4949, 2026-10-08). The published binary 0.5.0 (2026-10-21) is method v6, the method this source computes: surviving reads the same paths as introduced, so a binary blob (a PDF, an image) adds lines to neither count and a symlink adds one line to both; coverage.binary_files says how many blobs were left out. No binary shipped method v5. Published reports are not recomputed.
Fifteen minutes
Read three lines of the output. AI-tagged (metadata matched) is the cohort whose commit metadata matched a rule. Baseline is every other commit: untagged, not "human". The survival percentage is the line-weighted persistence of the tagged cohort. It does not prove who typed the code. The rules and the limits are at causari.dev/method.
The ledger is a second path, local and gitignored, used only if you record:
A seal signs the audit bytes. It does not connect the two paths.
Everyone argues about how much code AI writes. Nobody can check the numbers.
re audit reads plain git history — Co-Authored-By trailers, bot authors,
agent markers — finds the commits whose metadata matched, and asks git blame
how many of their lines are still at HEAD. Metadata matched is not proof a
model wrote the line. No model, no estimate, no survey. --json stores the counts, repository.head, repository.root_commits, the method, the blame and numstat flags (coverage.blame_flags, coverage.numstat_flags), coverage.ignore_revs_sha256 and coverage.notes_oid (the target OID of refs/notes/ai when present). It does not store the note payloads of refs/notes/ai: that ref is not part of the commit object, and changing it changes coverage.notes_oid and can change the counts while the commit SHA stays the same. A
repository that has moved has a different commit.
--jsonthe exact bytes behind any published row (the published rows themselves: causari.dev/reports/survival, also as a dataset at CroviaResearch/causari-survival)--summaryMarkdown for CI;--badge/--cardone-colour SVGs--diff <before> <after>compare two audit JSONs or.seal.jsonbundles along one axis (repository_diff,method_diff,indeterminate_method_diff,metadata_diff, oridentical_inputs), refusing multi-axis diffs and unrelated repositories--saveappend a snapshot to track your own trend
Compared with what: since method v3 every audit puts the repository's own untagged lines next to the AI-tagged ones, by line age, and states the age-matched gap: AI-tagged survival minus untagged survival inside the matched age windows of the same repository, not a comparison of identical timestamps. It also names the oldest line still at HEAD and how many commits predate it: a repository that was cleared or rewritten shows there, and its ratio is read accordingly.
What it cannot see: code from inline completions (Copilot, Cursor Tab,
Windsurf, …) leaves no git trace, so it is in the untagged baseline.
Untagged is not a finding that a human wrote it. Commits without a trailer
are UNKNOWN. An agent that needs the same limits in one file should read
causari.dev/llms.txt. A formatter pass
or a moved function counts as a death under method v1. One bulk commit can
dominate a line-weighted ratio; ratios under 5 AI-tagged commits are
flagged. All of this is written out at
causari.dev/method, with how to contest a number.
The questions people ask, answered with the command and the limit: causari.dev/faq; how this differs from git blame, vendor dashboards and churn reports: causari.dev/compare.
The weekly Survival Report runs
re audit on up to 100 open-source repositories: a hand-picked list plus the
most-starred public repositories (at least 100 stars) where GitHub commit search
finds at least five commits carrying the same AI authorship metadata, selected
every week, the day before the report, by
scripts/survival_discover.py under a rule
stated on the method page; rows stay
alphabetical, and one line in .github/survival-optout.txt removes a repository.
In CI: a count on every pull request
The Action
downloads the prebuilt Linux binary (a few seconds), runs re audit --summary,
writes it to the job summary and posts one sticky comment per PR. No cloud,
no account. A live example.
The ledger: from "which commit" to "which prompt"
The audit works on any history. If you also want to know why a line exists
— the prompt, the model, the files the agent read — Causari records agent
actions as they happen into a local, append-only ledger (.causari/,
gitignored), with a snapshot of the tree before and after each one.
What each agent actually gives you today
Claims about "any agent" are cheap. This table is derived from the code and is kept current; if a cell is wrong, open an issue.
Two evidence classes, and every output says which one it is:
- Declared (hooks, MCP,
re record): the agent stated what it did. Exact prompt and path. If a human edits a file between two hook events, the hook snapshot absorbs that edit into the next agent event — a known limit being fixed in Phase 1. - Correlated (proxy + watch): the lines you inserted are searched inside
completions captured moments before. A score, not a fact. The adversarial
harness in
examples/real-session/gives measured numbers: 100 % on a clean write, 50 % after a formatter pass, wrong per-line attribution when two prompts touch one file in the same window.
Everything stays on your machine. re proxy and the hooks store prompts,
completions and commands in clear under .causari/ (gitignored); credentials
in recognisable formats — sk-… keys, GitHub/GitLab/Slack/npm/PyPI/Hugging
Face tokens, AWS and Google keys, bearer values, JWTs, PEM private keys — are
replaced by [redacted:<kind>] before writing, and the record says how many.
Anything else you paste is kept as typed. Snapshots store every non-ignored
file (.env*, node_modules, target, dist, build, .git and a few
others are excluded by default). Treat .causari/ as sensitive. What is
stored, what is not, and what the tool does and does not defend against:
SECURITY.md and docs/threat-model.md.
Receipts you can verify without us
Crovia Seals. re proxy --seal issues a
crovia.seal.v1 receipt for every
completion: Ed25519-signed, hash-chained, committing to SHA-256 hashes of the
exact request and response bytes (content never leaves the machine). Each
recorded exchange carries its seal_id and the same hashes, so a receipt can
be matched to the completion it covers. The implementation passes the
reference conformance vectors; seals verify under the Python reference
implementation and vice versa.
PNX — Proof of Non-Exfiltration. re proxy --pnx makes the proxy an
egress witness for the TACET profile
crovia.pnx.v1: every request
body is fingerprinted (salted winnowing, k-gram 32, window 16) and committed
to a sparse Merkle map before it is forwarded; Ctrl-C signs a run sheet
carrying the root. re pnx prove then shows, for a set of protected assets,
that none shared a substring of 47 bytes or more with that traffic — or
records which did. Sheet and proof contain no traffic bytes and no asset
bytes, and verify offline with re pnx verify or with the Python reference
tacet-pnx, in both directions, same verdicts and exit codes. The sheet also
states where the run connected — every upstream the proxy forwarded to,
with its outcome under an egress policy bound by hash (the reach record,
PNX §4a); a destination outside the policy is refused before the body
leaves. What a proof does and does not say: docs/pnx.md.
Audit seals. re audit --seal writes the audit result as the same kind of
receipt: a crovia.seal.v1 over the exact bytes of re audit --json, bound to
the audited commit and the method version, hash-chained with the proxy's
completion seals under one issuer key per repository. re seal verify FILE
checks it offline; so does the static page
causari.dev/verify, which makes no network
request. A valid seal proves that this key signed these numbers for this
commit and that they were not altered since. It does not prove the numbers
are true: rerun re audit on the commit and compare. (re proof is retired
in favour of this; it exits 2 and names the replacement.)
Experimental
These commands exist, work in the demos, and are not yet held to the standard above. They are out of the proof and out of the front page until they are.
re skill distill / verify / export / import / pull / trust: signed units of past work. Ed25519 detects a later edit; the signature does not certify the content.verifiedis a declared signal frozen at distill (a caller-supplied exit code 0, or declared write paths still at the tip), not an observed success. A 2× rank weight is that declared signal, not measured reliability.provenis not awarded. A legacy recall count is not an execution.re brief: a Markdown briefing of past work for a model's context.re guard: substring rules over recent changes; gates a build only when asked (--fail-on alert|warning);--jsonfor machines.re churn,re report: survival measured over the ledger instead of git, with cost extrapolated from a static price table;re churn --json, and--fail-below <percent>when a team wants a floor of its own choosing.re mcp: stdio MCP server withcausari_record,causari_recall,causari_why;re mcp --installprints the client config.
Install
One program under two names: causari is the binary, re is the short alias
every example uses. Both are in every archive and both are installed. One
static binary, about 5 MB, for Linux (x86_64, aarch64), macOS (x86_64, Apple
silicon) and Windows (x86_64), installed to ~/.local/bin (or
%LOCALAPPDATA%\Programs\causari). The installer checks the archive's
SHA-256 against the SHA256SUMS.txt published with each release and refuses
to install on a mismatch. From v0.2.0, every archive and the sums file carry a
signed SLSA build-provenance attestation from the release workflow:
By hand:
The Homebrew tap and the
Scoop bucket render their
manifests from each release's SHA256SUMS.txt and re-render every six hours.
The crate is published from the release tag through crates.io Trusted
Publishing (.github/workflows/publish-crate.yml): no long-lived token exists.
As an MCP server
re mcp speaks MCP over stdio and exposes causari_record, causari_recall
and causari_why; re mcp --install prints the configuration block for
Claude Desktop, Cursor, Windsurf and Cline. The server is listed in the
MCP Registry from
server.json:
- MCP Registry name: mcp-name: io.github.croviatrust/causari
- One-click for Cursor: Add causari to Cursor
(registers
re mcp; the binary must be onPATH)
In Cursor
re hook cursor merges seven command hooks into the project's
.cursor/hooks.json (commit it: teammates and Cursor cloud agents run it
from the repository root); --user merges ~/.cursor/hooks.json instead
for one machine, --dry-run prints the result. Hooks other people wrote in
the same file are kept. Each hook runs re hook-event cursor:<event>, so
re must be on PATH for the Cursor process (the same caveat as the Claude
Code hooks); without it, or in a project without re init, every hook
answers with a neutral JSON object and nothing is recorded. What lands in
the ledger: the prompt with its attachments and model
(beforeSubmitPrompt), a snapshot before each shell or write tool
(preToolUse), one event per written file (afterFileEdit) and per
command that changed the tree (afterShellExecution), the agent's answer
next to its prompt (afterAgentResponse), and the experience briefing as
context at sessionStart.
As a Claude Code plugin
The repository is also a plugin marketplace. Inside Claude Code:
The plugin installs the four hooks that re hook claude-code writes by hand
(prompt, pre-state, post-state, session briefing), the MCP server, and a
skill that tells the model when why, trace, recall and record are the
right tool. It needs the re binary on PATH; without it, or in a project
without re init, every hook is a silent no-op.
Demos: scripts/demo*.sh|ps1 (mock LLM included), examples/real-session/
(the adversarial harness), scripts/recovery_lab.py (revert/bisect stress
lab).
How it works, in one paragraph
Every recorded event is a content-addressed object (BLAKE3) with the tree
before, the tree after, the agent, model and tool, the prompt, declared reads
and writes, tokens and cost, and a parent. Sessions are refs; forks are
implicit. re why finds the first event on the current chain whose
before/after diff inserted the line; re trace follows reads and writes
backwards from there; re impact forwards. Unchanged files share blobs
between snapshots. The full design, and its current limits, are in
docs/review-2026-09-20/.
Where this is going
Causari does not compete with provenance trackers (Agent Trace, git-ai,
Assisted-by: trailers, Entire checkpoints). It reads the metadata they
leave, measures with a public method, and signs the result so a third party
can verify it offline.
Done in the published binary 0.5.0, method v6 (2026-10-21), and in this
source: git blame -w -M -C, the per-commit cap, the v4 git-ai rule, the
audit seal, the HEAD-tree reading and git log --numstat -M -z of v5,
coverage.copy_capped_lines, signed coverage.notes_oid and
coverage.ignore_revs_sha256, re audit --diff on one axis, and the v6
rule that blames only the paths numstat counted, so binary blobs are in
neither count. Done in the proxy: a PNX witness
mode. For the request bodies it saw, a proof can show that named assets
shared no 47-byte substring with that traffic. It does not prove the
session made no other connection.
Next: an Agent Trace reader, and a release whose package version and method are the same pair.
Phases and exit criteria: ROADMAP.md.
Family
Causari is part of Crovia, one grammar in three tenses: TACET proves that a model's public card carried no training-data disclosure in the hours it was observed, PNX shows that named assets shared no long substring with request bodies a witness saw (not that the job made no other connection), Causari records what a runtime declared and measures whether lines from AI-tagged commits are still at HEAD. Same rules everywhere: reproducible numbers, no verdicts, verification without our servers, limits stated first.
Role in the Crovia canon — Sibling product: a git-metadata audit and a local ledger. A Seal authenticates bytes for a commit and a method; it does not authenticate truth or who typed a line. Seal issuer for agent completions and audit results.
License
Apache-2.0 (see LICENSE). "Causari" is a trademark of Crovia Trust; the
license does not grant trademark rights (see NOTICE). Contributing: see
CONTRIBUTING.md.
來源:README.md,提交 39f0444
工具
0版本歷史
5- v0.5.0最新Oct 21, 2026
- v0.4.1Oct 9, 2026
- v0.4.0Oct 8, 2026
- v0.3.0Sep 25, 2026
- v0.2.0Sep 21, 2026
評分
已滿足適用檢查項的 50%
該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。
- 近 30 天內可連通25 分
請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。
- 已宣告認證方式10 分
請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。
- 已列出工具15 分
請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。
- 描述必需15 分
- 圖示10 分
- 文件15 分
- 授權條款10 分