{
  "nav": {
    "docs": "Docs",
    "github": "GitHub",
    "status": "Status",
    "skills": "Skills",
    "star": "Star",
    "blog": "Blog"
  },
  "blog": {
    "title": "Notes on agent memory",
    "subtitle": "Bitemporal graphs, retrieval, and the lifecycle of a fact — how Brain works and why it's built this way.",
    "readTime": "{n} min read",
    "read": "Read",
    "backToBlog": "All posts",
    "fallbackNotice": "Translation pending — showing English.",
    "directAnswer": "In short",
    "faqTitle": "FAQ",
    "related": "Related"
  },
  "hero": {
    "eyebrow": "Bitemporal knowledge graph",
    "title": "Memory that keeps time.",
    "subtitle": "Every fact gets two clocks: when it was true, and when Brain found out. Ask what's true now, or replay exactly what the graph knew last March. Conflicts get scored, not silently overwritten. Forget means deleted, not hidden. REST or MCP — self-hosted or managed.",
    "ctaPrimary": "Get started",
    "ctaSecondary": "Self-host",
    "trust": {
      "license": "AGPL-3.0",
      "stack": "NestJS · SurrealDB · BGE-M3",
      "eval": "eval-gated in CI"
    },
    "panel": {
      "title": "Bitemporal readout",
      "valid": "valid time",
      "txn": "transaction time",
      "note": "Default queries answer 'now'. Pass asOf and the same query returns what Brain knew at that moment — nothing reconstructed after the fact."
    }
  },
  "bitemporal": {
    "eyebrow": "Bitemporal · live demo",
    "title": "Replay what Brain knew, not what's true now.",
    "subtitle": "Acme moved from the starter plan to growth on Mar 10. Brain only recorded the switch on Mar 12. Drag both clocks — history gets replayed, never rewritten.",
    "validLabel": "valid time — when it was true",
    "txnLabel": "transaction time — when Brain knew",
    "markSwitch": "plan switch",
    "markRecorded": "Brain records it",
    "answerLabel": "Brain answers",
    "scenario": "scenario · acme plan change · starter → growth",
    "notes": {
      "unknown": "The transaction clock sits before Mar 12. Brain hasn't recorded the switch yet, so it still answers starter — even for dates after Mar 10. That's the past, replayed exactly.",
      "past": "Valid time is before Mar 10. Back then, starter was the truth.",
      "current": "Both clocks are current — the switch happened and Brain knows it. Growth is the live answer."
    }
  },
  "retrieval": {
    "eyebrow": "Retrieval engine",
    "title": "Seven stages between a query and an answer.",
    "subtitle": "Brain doesn't just rank embeddings by similarity. Every query runs a graph-aware pipeline — each stage a feature flag with its own per-tenant metrics.",
    "queryIn": "query + tenant scope",
    "answerOut": "ranked facts + per-leg score breakdown",
    "note": "Each stage toggles and is measured independently; the CI eval reports recall per leg. HNSW, HyPE, PPR, and rerank all flip per tenant.",
    "stages": [
      { "name": "Hybrid fusion", "desc": "Vector + BM25, convex-combined at w=0.5" },
      { "name": "HyPE alt-embeddings", "desc": "Hypothetical-prompt vectors; max(cos_main, cos_alt)" },
      { "name": "Predicate + type router", "desc": "A joint LLM router boosts the right predicate class" },
      { "name": "Edge expansion", "desc": "A 1-hop graph walk seeds neighbours as fresh candidates" },
      { "name": "Tier-aware PPR", "desc": "HippoRAG-style personalized PageRank over the graph" },
      { "name": "Cross-encoder rerank", "desc": "Cohere reranks a wide window" },
      { "name": "Listwise LLM rerank", "desc": "Permutation self-consistency, Borda-aggregated" }
    ]
  },
  "beyondVector": {
    "eyebrow": "Beyond embeddings",
    "title": "What a vector store can't tell you.",
    "subtitle": "Embeddings find text that looks similar. A memory layer has to do more than that.",
    "colA": "Plain vector store",
    "colB": "INITE Brain",
    "rows": [
      { "a": "Chunks of text, ranked by cosine similarity", "b": "Typed subject–predicate–object facts on a graph" },
      { "a": "Only what looks true now", "b": "Two clocks — query now, or as of any past moment" },
      { "a": "Re-embedding silently overwrites the old vector", "b": "Conflicts get scored; close calls land as COMPETING" },
      { "a": "Delete a row and hope it's gone", "b": "Forget cascades facts, edges, embeddings — HMAC tombstone left" },
      { "a": "No notion of relationships", "b": "Typed edges plus a multi-hop planner across them" },
      { "a": "PII sits in the same index as everything else", "b": "DB-level PII fence, gated by caller scope" }
    ]
  },
  "dualPath": {
    "eyebrow": "Self-host or hosted",
    "title": "Two ways to run it. Same graph.",
    "selfHost": {
      "label": "Open source",
      "title": "Self-host",
      "desc": "Clone the repo, bring up SurrealDB, point it at your keys. AGPL-3.0 — every line is yours to read, fork, and ship back.",
      "bullets": [
        "Docker Compose — SurrealDB + service in minutes",
        "Nothing leaves your network",
        "BGE-M3 embeds locally — no calls out to OpenAI",
        "Admin cockpit and the eval suite ship in the repo"
      ],
      "cmd": "docker compose up -d",
      "cta": "Self-host guide"
    },
    "managed": {
      "label": "Managed",
      "title": "brain.inite.ai",
      "desc": "The same build, none of the babysitting. A hosted endpoint that redeploys on every push to main.",
      "bullets": [
        "No servers, no database to keep alive",
        "Per-tenant isolation, scoped API keys",
        "Health and Prometheus metrics built in",
        "Identical REST + MCP surface"
      ],
      "endpoint": "https://brain.inite.ai",
      "cta": "Open dashboard"
    }
  },
  "stats": {
    "eyebrow": "Eval results",
    "title": "How well it actually retrieves.",
    "subtitle": "Brain ships with its own eval suite. These are the latest scores on the retrieval and memory-lifecycle benchmarks — measured, not asserted.",
    "gateLabel": "gate",
    "byVertical": "recall@1 by vertical",
    "correctness": "correctness · all gated at 1.0",
    "footnote": "From the eval report, n=262 (multi-vertical suite + wikidata). Temporal queries hit recall@1 1.000 (n=21), current 0.959 (n=241). Every push re-runs it; the build fails below the gate.",
    "items": [
      { "label": "recall@1", "value": "0.965", "floor": "≥ 0.6" },
      { "label": "faithfulness", "value": "1.000", "floor": "≥ 0.8" },
      { "label": "identity-F1", "value": "1.000", "floor": "≥ 0.8" },
      { "label": "memory-lifecycle", "value": "1.000", "floor": "= 1.0" }
    ]
  },
  "features": {
    "eyebrow": "The rest of the stack",
    "title": "More than a retriever.",
    "subtitle": "Everything between an ingest and an answer you can trust.",
    "items": [
      {
        "tag": "Ingest",
        "title": "Conflict resolution",
        "desc": "Two ingests for one fact go through a scored ladder — confidence × source-trust × recency × authority. Close calls land as COMPETING, never a silent overwrite."
      },
      {
        "tag": "Graph",
        "title": "Identity resolution",
        "desc": "Cross-vertical merges collapse duplicates into one entity via identity_of edges; re-attribution follows mergedInto. B³ identity-F1 holds at 1.0."
      },
      {
        "tag": "Lifecycle",
        "title": "GDPR forget",
        "desc": "A forget is a synchronous hard delete — facts, edges, and embeddings gone. Only an HMAC tombstone stays, so you can prove it happened."
      },
      {
        "tag": "Safety",
        "title": "PII fence",
        "desc": "PII is gated at the database layer with PERMISSIONS and caller scopes. Every predicate declares its PII class up front."
      },
      {
        "tag": "Retrieval",
        "title": "Multi-hop",
        "desc": "A planner LLM splits a question into up to four anchored sub-queries. Supporting facts carry through for HotpotQA-style joint-F1 scoring."
      },
      {
        "tag": "Synthesis",
        "title": "Faithful answers",
        "desc": "/v1/synthesize runs corrective-RAG with strict / lenient / off guardrails and a claim-level faithfulness scorer. Pass-rate gates at 1.0."
      },
      {
        "tag": "Schema",
        "title": "Predicate ontology",
        "desc": "A per-tenant, OWL-equivalent registry. Each predicate carries semantics, decay, and PII class — the router and resolver both read it."
      },
      {
        "tag": "Ops",
        "title": "Dreams",
        "desc": "Off-hours, Brain dedups entities, resolves competing facts, and summarizes — self-improvement on a cron, not a manual chore."
      },
      {
        "tag": "Tenancy",
        "title": "Per-tenant isolation",
        "desc": "Each company gets its own database (co_<id>). One REMOVE DATABASE forgets a whole tenant. Nothing leaks across the wall."
      }
    ]
  },
  "quickstart": {
    "eyebrow": "Quickstart",
    "title": "Three ways to talk to brain.",
    "subtitle": "Pick the one that matches your runtime."
  },
  "mcpBlock": {
    "eyebrow": "Model Context Protocol",
    "title": "One config block. Six tools. Any client.",
    "subtitle": "A per-tenant MCP URL, scope-aware. Drop it into Claude Desktop, Cursor, Goose, or n8n and the agent gets the same six tools.",
    "toolsLabel": "Six scope-aware tools",
    "clients": "Same URL, same auth header, no glue code — whatever speaks MCP.",
    "linkLabel": "MCP setup guide"
  },
  "skillsBlock": {
    "eyebrow": "Agent skills",
    "title": "Skills that teach the agent to use Brain.",
    "subtitle": "Four Anthropic-format skills — search, recall, bitemporal queries, and the setup walkthrough. One curl installs them into ~/.claude/skills.",
    "linkLabel": "All skills",
    "installCmd": "curl -fsSL https://brain.inite.ai/install.sh | sh"
  },
  "openSource": {
    "eyebrow": "Open source",
    "title": "Built in the open, licensed AGPL-3.0.",
    "subtitle": "Read the code, run your own, send a PR. Everything that runs brain.inite.ai lives in the repo.",
    "license": {
      "note": "Network copyleft — self-host freely; changes you serve over a network stay open."
    },
    "links": {
      "readme": "README",
      "contributing": "Contributing",
      "security": "Security policy",
      "license": "License"
    },
    "stack": {
      "label": "Built with"
    },
    "cta": {
      "title": "Star the repo",
      "desc": "Watch releases, open issues, send patches. The roadmap is public.",
      "button": "Star on GitHub"
    }
  },
  "footer": {
    "tagline": "Open-source bitemporal knowledge graph for AI agents. A system of insight, not a system of record.",
    "columns": {
      "product": {
        "title": "Product",
        "docs": "Docs",
        "blog": "Blog",
        "quickstart": "Quickstart",
        "mcp": "MCP setup",
        "skills": "Skills"
      },
      "project": {
        "title": "Project",
        "github": "GitHub",
        "license": "License",
        "contributing": "Contributing",
        "security": "Security"
      },
      "resources": {
        "title": "Resources",
        "openapi": "OpenAPI",
        "status": "Status",
        "api": "API reference"
      }
    },
    "copyright": "© 2026 INITE Brain",
    "license": "AGPL-3.0-or-later"
  },
  "docs": {
    "indexTitle": "Documentation",
    "indexSubtitle": "Concepts, REST API, MCP setup, operator runbook.",
    "groups": {
      "start": "Start here",
      "concepts": "Concepts",
      "rest": "REST API",
      "mcp": "MCP",
      "ops": "Operations"
    },
    "pages": {
      "getting-started": {
        "title": "Getting started",
        "description": "Auth, your first ingest, your first search. ~5 minutes."
      },
      "bitemporal": {
        "title": "Bitemporal model",
        "description": "Two time axes per fact. asOf semantics with Allen-interval examples."
      },
      "predicates": {
        "title": "Predicate vocabulary",
        "description": "Single-active vs bitemporal vs append-only. Decay, PII class, v1.1 content predicates."
      },
      "conflict-resolution": {
        "title": "Conflict resolution",
        "description": "Scoring formula, COMPETING / SUPERSEDED / REJECTED outcomes, dead-letter."
      },
      "search": {
        "title": "POST /v1/search",
        "description": "Hybrid retrieval pipeline, request / response shapes, per-leg CI."
      },
      "synthesize": {
        "title": "POST /v1/synthesize",
        "description": "Corrective-RAG with strict / lenient / off guardrails + claim-level faithfulness scorer."
      },
      "ingest": {
        "title": "POST /v1/ingest/*",
        "description": "Structured fact ingest, NLU mention extraction, typed edges."
      },
      "multi-hop": {
        "title": "POST /v1/search/multi-hop",
        "description": "Planner LLM decomposes the query, joint-F1 evaluable supporting facts."
      },
      "entities": {
        "title": "GET /v1/entities/*",
        "description": "Profile + timeline + connections + forget."
      },
      "retract": {
        "title": "POST /v1/facts/:id/retract",
        "description": "Mark a fact retracted. Survives in audit trail with reason."
      },
      "mcp-setup": {
        "title": "MCP setup",
        "description": "Claude Desktop, Cursor, Goose, n8n configs."
      },
      "mcp-tools": {
        "title": "MCP tools reference",
        "description": "Six scope-aware tools with their full Zod schemas."
      },
      "skills": {
        "title": "Skills bundle",
        "description": "Four Anthropic-format skills, install.sh, versioning model."
      },
      "operator-playbook": {
        "title": "Operator playbook",
        "description": "Day-2 ops — keys, scopes, dreams cron, baseline diffs."
      },
      "security": {
        "title": "Security model",
        "description": "JWT, scopes, per-tenant isolation, GDPR forget, PII gating."
      }
    },
    "prev": "Previous",
    "next": "Next",
    "rev": {
      "ru-pending": "Translation pending — showing English."
    }
  },
  "admin": {
    "common": {
      "refresh": "refresh",
      "auto": "auto",
      "autoSeconds": "auto {seconds}s",
      "loading": "loading…",
      "noData": "—"
    },
    "leases": {
      "title": "Leases & claims",
      "subtitle": "Leader-election + active job_run claims across the fleet. Use this to spot stuck workers, dead leases that haven't been re-acquired, or pods holding more than their share.",
      "queueModeTip": {
        "enqueue": "crons enqueue rows; worker loop dispatches",
        "inline": "kill switch active — crons run inline (pre-Phase-J behaviour)"
      },
      "queueModeLabel": "queue",
      "leaderBadge": "worker_loop leader",
      "followerBadge": "follower",
      "handlersLabel": "handlers",
      "noHandlers": "none",
      "poolLabel": "pool",
      "poolBusy": "{busy}/{size} busy",
      "poolDisabled": "disabled",
      "poolWaiting": "+{n} waiting",
      "poolTip": "JobWorkerPool — node:worker_threads pool for cpuBound handlers (currently no handler opts in; size=0 disables the pool)",
      "leaderLeases": {
        "title": "Leader leases",
        "subtitle": "Named locks in leader_lease (system DB). Multi-pod deploys elect one holder per name.",
        "headers": {
          "name": "name",
          "leader": "leader",
          "acquired": "acquired",
          "expires": "expires in"
        },
        "empty": "No leases held. Either the system is fresh or every cron has released its lease cleanly."
      },
      "activeClaims": {
        "title": "Active claims",
        "subtitle": "job_run rows currently in 'running' status. Stale heartbeats are reaped by LeaseManagerService.",
        "headers": {
          "runId": "runId",
          "jobType": "jobType",
          "tenant": "tenant",
          "worker": "worker",
          "attempts": "attempts",
          "heartbeat": "heartbeat",
          "lease": "lease in"
        },
        "empty": "No active claims. The queue is empty or every worker just finished a cycle.",
        "heartbeatAgo": "{n}s ago"
      }
    },
    "jobs": {
      "title": "Job runs",
      "subtitle": "Long-running operator jobs (dreams / compaction / calibration refit / reindex / changefeed drain). SSE-streamed transitions; per-job drill shows progress / result / error.",
      "live": "live",
      "sseHint": "live SSE on accepted job_run transitions",
      "filters": {
        "allTypes": "all types",
        "allStatuses": "all statuses",
        "companyIdPlaceholder": "companyId filter"
      },
      "table": {
        "started": "started",
        "type": "type",
        "tenant": "tenant",
        "trigger": "trigger",
        "status": "status",
        "duration": "duration"
      },
      "empty": "No matching job runs.",
      "drill": {
        "prompt": "Pick a job to drill.",
        "trigger": "trigger",
        "actor": "actor",
        "tenant": "tenant",
        "started": "started",
        "finished": "finished",
        "attempts": "attempts",
        "claimedBy": "claimedBy",
        "visibleAfter": "visibleAfter",
        "leaseUntil": "leaseUntil",
        "cancelRequested": "cancel requested",
        "requestCancel": "Request cancel",
        "payload": "payload",
        "payloadHint": "(handler input)",
        "progress": "progress",
        "result": "result",
        "error": "error"
      }
    },
    "maintenance": {
      "title": "Maintenance cockpit",
      "subtitle": "Scheduled jobs + manual triggers. Each card shows the last persisted run (via job_run + SchedulerRegistry), next-fire ETA, and a Run now button that delegates to the same code path the cron uses.",
      "runNow": "Run now",
      "cards": {
        "dreams": {
          "title": "Dreams (dedup + resolve + summarize)",
          "description": "04:00 UTC — entity dedup + competing-fact resolution."
        },
        "compaction": {
          "title": "Compaction (hot → warm tier)",
          "description": "03:17 UTC — facts past retention move to warm tier, optional LLM summary."
        },
        "calibration_refit": {
          "title": "Calibration refit (isotonic)",
          "description": "03:51 UTC — refit isotonic map from last-30d retraction outcomes. The same trigger also kicks source-trust refit."
        },
        "source_trust_refit": {
          "title": "Source-trust refit",
          "description": "03:42 UTC — upserts source_trust(rate, sampleCount). Bundled with the calibration-refit trigger above."
        },
        "reindex_embeddings": {
          "title": "Reindex embeddings",
          "description": "No cron — re-embed knowledge_fact across all tenants. Run after EMBEDDER_PROVIDER swap or model dimension change."
        },
        "changefeed_drain": {
          "title": "Changefeed drain → audit_event",
          "description": "Every minute — SHOW CHANGES per source, write audit_event, advance cursor."
        }
      },
      "cron": {
        "label": "cron",
        "lastFire": "last fire",
        "nextFire": "next fire",
        "state": "state",
        "running": "running",
        "idle": "idle",
        "noCron": "—"
      },
      "lastRun": "last run: {status}",
      "drillLink": "drill →",
      "changefeed": {
        "title": "Changefeed consumer",
        "enabled": "enabled",
        "disabled": "disabled",
        "stats": {
          "lastTick": "last tick",
          "pending": "pending",
          "consumedTotal": "consumed total",
          "ticks": "ticks",
          "batchLimit": "batch limit"
        },
        "cursors": "cursors per tenant × source",
        "cursorHeaders": {
          "tenant": "tenant",
          "source": "source",
          "versionstamp": "versionstamp"
        }
      },
      "recentJobs": "Recent job runs",
      "fullHistory": "full history →",
      "noRecentJobs": "No persisted job runs yet. Trigger one above or wait for the next cron tick."
    }
  }
}
