Shared agent context
Someone labels a pull request. Jurati turns that into team context, so every connected agent starts its next task already knowing what happened.
jurati
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.
Plain example
Alice labels her auth migration PR so the team remembers it. A day later, Bob's agent tries to edit the same files.
jurati label to PR #42auth/session.pyUsage
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 AU-prefixed courses."
Recorded the terminology decision.
"Lab scripts are done, but the DNS issue on workstation is still open."
Saved the handoff.
Agent integration
Before reading code or making changes, the agent checks what the team already knows.
Agent builds a lab using old terminology. Developer catches it in review. Work gets redone.
Agent reads the terminology decision before starting. Uses the right terms from the start.
Developer picks up a task cold. Spends 30 minutes figuring out what was already done and what's blocked.
Agent reads the handoff note. Immediately tells the developer what's done, what's open, and what to avoid.
What Jurati does today
Looks firstBefore a task, the agent checks current work, decisions, workflows, and labeled PRs.
Finds specificsThe agent can search by topic or pull up a specific entry when it needs detail.
Remembers handoffsShort-lived notes cover blockers, current focus, or what to look at next.
Saves decisionsImportant decisions and workflows go through team review before they stick.
Stays currentThe server syncs from git on every session, so context is always up to date.
Knowledge model
The person never picks a type or level. The agent reads what was said and categorizes it, which determines how it gets stored and reviewed.
"Never commit secrets to the config repo."
L3 Careful review
"We decided to use gRPC instead of REST."
L2 Team review
"Here's how we do release cuts."
L2 Team review
"Auth migration is blocked on infra."
L1 Quick review
"Lab scripts 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.
Privacy boundary
Nothing enters the system unless someone explicitly shares it -- a labeled PR or a deliberate save through the agent.
Impact
When someone goes on PTO or a new member joins, decisions and project state are already recorded and searchable.
Agents read team decisions before starting work. Wrong terminology, outdated patterns, and re-debated decisions are reduced.
"Ask Sarah, she was in that thread" becomes a searchable, structured entry with status, blockers, and next steps.
Every decision is a file in git with full version history. You can see who decided what, when, and why.
Product promise
Add the jurati label to PRs worth sharing. Say what matters in normal language.
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.
How Jurati works
Jurati is an MCP server backed by a git repository. Every agent that connects to the same repo gets the same team context before it starts working.
Runtime boundary
A person labels a PR or talks to their agent in plain language. The agent calls Jurati's MCP tools behind the scenes.
server.py over MCP.The server clones (or reuses) the knowledge repo, fetches the latest state, and builds an in-memory index.sync() then context().Built-in instructions tell the agent to do this before any work, then summarize what matters to the person.record() or propose().Write APIs the agent uses on behalf of the person -- no extra commands for the person to learn.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 synccontext() / search()MCP responses to agentsKnowledge model
Each entry has a type, a review level, and an expiration policy, so the system knows how to store, surface, and retire it.
| Type | Default Level | What It Means |
|---|---|---|
active | L0 | Short-lived note (handoff, current focus). Expires automatically. |
project | L1 | What's in progress, blocked, or changing soon. |
workflow | L2 | How the team does something -- reviewed before it sticks. |
decision | L2/L3 | A choice the team made, with the reasoning behind it. |
principle | L3 | A lasting engineering rule or standard. |
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, labels, pathsSignalCacherefresh interval + recencyclassify_signals()guidance returned to agentCoordination classifier
The classifier checks whether the PR overlaps with what the agent is about to do, then returns a specific recommendation with evidence.
pauseAn open PR touches the same files. The agent should hold off or coordinate.reuseA merged PR already changed this area. The agent should build on that work.reviseThe PR describes a decision, migration, or architecture change worth reading first.handoffSomeone is waiting, blocked, or handing off ownership of this area.continueSame repo but different area. Noted as background context, no action needed.clarifyMight be relevant, but unclear. The agent asks only if the ambiguity blocks a safe plan.Search and context
search() uses BM25 scoring weighted by recency, entry type, and repo affinity. query() tries exact topic matching first, then falls back to ranked search.
# src/jurati/core/scoring.py combined = bm25 * recency_half_life_14_days * type_weight * repo_affinity * exact_match_boost restricted entries: excluded before BM25 index construction title text: weighted by appearing three times in document text
Write path
The core logic plans what to write. A separate git layer turns that plan into commits, branches, and pull requests.
record() / propose()typed MCP callplan_record() / plan_propose()validate type and levelWriteIntentpath, content, branch, write modematerialize_write()commit entry and eventcreate_pr()PR or branch-only fallback| Level | Entry Types | Write Mode | Review Behavior |
|---|---|---|---|
L0 | active | active_ref | Pushed to a short-lived ref. No PR, auto-expires. |
L1 | project | lightweight_pr | Creates a small PR for quick review. |
L2/L3 | workflow, decision, principle | review_pr | Creates a PR that requires team review before merging. |
Privacy boundary
Jurati broadcasts what people choose to share. It cannot observe what they don't.
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, write planning. Zero I/O.server.pyThe glue: MCP tool handlers, sync lifecycle, search cache, and write orchestration.providers/External data adapters. GitHub PRs today, with a protocol interface for adding more sources.git/Everything that touches the filesystem: clone, fetch, branch management, commits, and PR creation.Apache 2.0
Shared, reviewable agent context for people and AI coding agents.