Shared agent context
Someone records a decision or hands off work. Jurati turns that into team context, so every connected agent starts its next task already knowing what happened.
The problem
Today, people coordinate through Slack, issues, meetings, and memory. Then they re-explain it all to each new agent session.
Decisions made verbally, written down if someone remembers, scattered across docs nobody searches.
Context buried in chat history, hard to find a month later, no structure.
When someone's on PTO or leaves, their context leaves with them.
Measured test
Two developers, two separate AI sessions, one shared knowledge base. Tested end-to-end with real Claude Code sessions.
Usage
No new UI to learn. Developers record decisions through their existing AI coding assistant.
"We decided to standardize on AAP 2.6 terminology across all courses."
Recorded the terminology decision.
"Lab scripts are done, but the DNS issue on workstation is still open."
Saved the handoff.
The real question
The demand is fixed — developers need to know what the team is doing. The variable is the supply path. We measured all of them.
Open Jira. Search for tickets. Check GitHub PRs. Read Slack history. 10 minutes per question.
"Hey Mike, what's the status on task-review?" Interrupts two people. 15–23 min context-switch cost per interrupt.
Agent starts with team state already injected. Zero lookups, zero interrupts. $0.25 per session.
Measured cost
Cost per session with 3 coordination questions. Token costs measured from real Claude Code sessions. Time estimates conservative.
At scale
Monthly cost per developer. 30% of sessions involve coordination questions. Token costs measured, time costs conservative.
| Path | 10 devs | 50 devs | 200 devs | 1,000 devs |
|---|---|---|---|---|
| Jurati | $43 | $54 | $54 | $54 |
| Agent + raw APIs | $107 | $133 | $133 | $133 |
| Standup meetings | $423 | $508 | $529 | $529 |
| Ask a colleague | $684 | $855 | $855 | $855 |
| Manual lookup | $853 | $1,067 | $1,067 | $1,067 |
The math
If Jurati prevents even one in four sessions from needing an extra "what's the context?" round-trip, it pays for itself in token savings alone.
10,380 tokens
45,000 tokens
1 minute of developer time: $1.60
1 minute of API tokens: fractions of a cent
Privacy boundary
Nothing enters the system unless someone explicitly shares it — a labeled PR or a deliberate save through the agent.
Product promise
Say what matters in normal language. "Save this handoff." "Record this decision."
Start with team context and use it to guide the person when it matters.
Handle the filing, review, search, and privacy work in the background.
Architecture
Jurati is a pure core library with pluggable transport. Files for reads, CLI or MCP for writes, works on any agent client.
Engineering shape
Policy decisions, server orchestration, external data sources, and git operations each live in their own module with clear boundaries.
core/All the rules: schema, validation, indexing, search ranking, signal classification, content policy, write planning. Zero I/O.server.pyMCP tool handlers, sync lifecycle, and write orchestration.cli.pyCLI commands: startup, query, read, record, propose. Same core, different transport.git/Everything that touches the filesystem: clone, fetch, branch management, commits, and PR creation.core/ must never import from git/ or providers/ or perform I/O. Enforced by AST guard in the test suite.File adapter
A SessionStart hook runs jurati startup, writes team context to a file, and the agent reads it naturally. Zero MCP overhead for reads.
jurati startup--format md --output.jurati/context.mdteam context as markdown15 MCP tool descriptions: ~735 tokens/turn. Permission prompts on first use. Per-client config required.
CLAUDE.md contract: ~50 tokens/turn. Zero permission prompts. Works on any client that can read a file.
Read path
Git is the source of truth. The server keeps only local state it can rebuild from scratch: a repo cache and an in-memory search index.
ensure_repo()cache path is remote hashfetch_all()main plus active refsload_index_from_repo()markdown + YAML frontmatterIndex + BM25rebuilt on syncWrite path
The content policy gate blocks credentials and enforces review levels. Same WritePolicy.evaluate() whether the write comes from CLI or MCP.
record() / propose()CLI or MCPWritePolicy.evaluate()block secrets, enforce levelplan_record()validate type & levelmaterialize_write()commit entry + eventpush_active_ref() or push_branch()L0 ref or L1+ PR| Level | Entry Types | Write Mode | Review |
|---|---|---|---|
L0 | active | active_ref | No PR, auto-expires in days |
L1 | project | lightweight_pr | Small PR, quick review |
L2/L3 | workflow, decision, principle | review_pr | Team review required |
Knowledge model
"Never commit secrets to config."
L3 Careful review
"We chose gRPC over REST."
L2 Team review
"How we do release cuts."
L2 Team review
"Auth migration blocked on infra."
L1 Quick review
"Lab done, DNS still broken."
L0 Temporary
Pushes directly, auto-expires in days. No PR, no review.
Creates a lightweight PR. Low-stakes, usually merged quickly.
Creates a PR that needs team sign-off before it sticks.
Highest-stakes content. Requires deliberate team approval.
Cross-client
The file adapter is the universal primitive. Every agent client can read a file. The same context file, the same CLI commands, zero per-client configuration.
SessionStart hook writes .jurati/context.md. CLAUDE.md tells the agent to read it.
Tested & validated
Same hook, same file. GEMINI.md has the contract. JSON protocol on stdin/stdout.
Tested & validated
If it can read a file and run a shell command, it can use Jurati. No SDK, no plugin, no MCP required.
By design
Token analysis
Same 3 prompts, same model, two environments. The "without" session is cheaper but produces no useful coordination output.
"s01 Lecture (PR #13) — Complete, awaiting review. s02 GE (PR #8) — labexec validator was reporting false positives..."
Session cost: $0.15 (bare mode)
"I don't have much to report, unfortunately... There are no files, modules, or branches related to task-loops present locally."
Session cost: $0.08 (useless)
Ambient PR signals
Jurati watches specific repositories for PRs carrying the jurati label. Everything else is ignored by design.
JURATI_PR_SIGNAL_REPOSonly configured reposfetch_labeled_prs()gh api search/issuesPRSignaltitle, author, state, labelsSignalCacherefresh interval + recencyclassify_signals()guidance for agentsPrivacy boundary
Jurati broadcasts what people choose to share. It cannot observe what they don't.
Apache 2.0
Shared, reviewable agent context for people and AI coding agents.
github.com/ostinato-forge/jurati
Cost data measured May 2026 · Claude Sonnet 4 · $200K/yr fully loaded developer cost