{
  "markdown": "# Ontology Atlas\n\n<p align=\"center\">\n  <picture>\n    <source media=\"(prefers-color-scheme: dark)\" srcset=\"public/brand/lockup-dark@2x.png\" />\n    <img src=\"public/brand/lockup-light@2x.png\" alt=\"Ontology Atlas — Understand your codebase.\" width=\"360\" />\n  </picture>\n</p>\n\n<p align=\"center\">\n  <strong>Understand what your codebase builds, why it is structured that way,<br />\n  and what a change will affect.</strong>\n</p>\n\n<p align=\"center\">\n  <sub>One codebase ontology in repository Markdown, maintained by people and AI agents.</sub>\n</p>\n\n<p align=\"center\">\n  <a href=\"https://ontologyatlas.com/en/download/\"><strong>Download for macOS</strong></a>\n  ·\n  <a href=\"https://ontologyatlas.com/en/download/\"><strong>Windows x64 beta</strong> <sub>unsigned</sub></a>\n  ·\n  <a href=\"https://ontologyatlas.com/en/topology/\">Live demo</a>\n  ·\n  <a href=\"https://ontologyatlas.com/en/guide/\">Guide</a>\n  ·\n  <a href=\"#status--read-this-before-installing\">Status</a>\n</p>\n\n<p align=\"center\">\n  <a href=\"https://mcpservers.org/servers/wlsdks/ontology-atlas\"><img src=\"https://mcpservers.org/badge.svg\" alt=\"Listed on mcpservers.org\" /></a>\n</p>\n\n<p align=\"center\">\n  <a href=\"https://glama.ai/mcp/servers/@wlsdks/ontology-atlas\"><img width=\"300\" src=\"https://glama.ai/mcp/servers/@wlsdks/ontology-atlas/badge\" alt=\"Ontology Atlas MCP server on Glama\" /></a>\n</p>\n\n![The current Ontology Atlas macOS app with the Online Store project selected: the domains it contains named around it, everything unrelated receding, and the right inspector showing the project record, its code-evidence state, and the offer to connect a code folder](docs/assets/readme/topology-overview.png)\n\n<p align=\"center\">\n  <sub>The installed macOS app reading\n  <a href=\"samples/storefront\"><code>samples/storefront</code></a> — an online\n  store written as nothing but Markdown files in a folder. Every write, human or\n  agent, lands as Markdown a person reviews in a Git diff; the\n  <a href=\"docs/FEATURES.md\">feature inventory</a> is the current behavior\n  contract.</sub>\n</p>\n\n<p align=\"center\">\n  <a href=\"LICENSE\"><img alt=\"MIT license\" src=\"https://img.shields.io/badge/license-MIT-5e6ad2.svg\" /></a>\n  <a href=\"mcp/README.md\"><img alt=\"MCP runtime inventory\" src=\"https://img.shields.io/badge/MCP-runtime_inventory-5e6ad2.svg\" /></a>\n  <a href=\"cli/README.md\"><img alt=\"Local CLI\" src=\"https://img.shields.io/badge/CLI-local_tools-5e6ad2.svg\" /></a>\n  <img alt=\"Local-first\" src=\"https://img.shields.io/badge/storage-local--first-17181f.svg\" />\n</p>\n\n---\n\n## In 30 seconds\n\nAI agents change a codebase faster than a person can review every line. A Git\ndiff records which lines moved; the agent's summary is its own claim. Neither\npreserves which product capability the code serves, why its boundaries exist, or\nwhat the change can affect.\n\nAtlas keeps those answers in an `atlas/` folder of Markdown **inside the\nrepository**, so meaning is cloned, branched, and reviewed with the code. Each\nfile's frontmatter declares what it is — `project`, `domain`, `capability`,\n`element`, or a linked `document` — and what it points at. That folder is the\nwhole database.\n\nBecause the kinds and relation types are a small fixed set, the folder is not\njust readable but **computable**. Atlas compiles it and answers what a notes tool\ncannot: *what breaks if I change this, what is this capability's blast radius,\nwhich paths connect these two things, what is disconnected, what is stale.* Your\nagent asks over MCP; you read the same answers as a map. An agent's write is not\naccepted meaning — it lands as Markdown and a Git diff a person can correct,\nreject, or keep, and the answers stay bounded: observed capabilities are never\ntreated as exhaustive and unknown coverage is never shown as green. The five-kind\ndiscriminator and the standards boundary live in the\n[vault specification](docs/ONTOLOGY-ATLAS-SPEC.md#2-the-five-authorable-node-kinds-and-reserved-reader-kind).\n\n## Status — read this before installing\n\nThe [download page](https://ontologyatlas.com/en/download/) is the release\nauthority: a generated record of the published tag, real asset sizes, checksums,\nplatforms, and signing state. This README pins no tag, so it cannot contradict\nthe files you are about to install.\n[GitHub Releases](https://github.com/wlsdks/ontology-atlas/releases) is the\nsecond direct source.\n\n- **The unsigned Windows beta is a real risk, not a formality.** SmartScreen may\n  warn about an unknown publisher, and a managed work PC may refuse the installer\n  outright. [Security](SECURITY.md) states what is and is not promised.\n- **Installing the desktop app installs the agent surface.** Both bundles carry\n  the compiled MCP server. There is no npm package; every other platform runs the\n  browser app, the CLI and MCP server from a source checkout, or the MCP server\n  as an `.mcpb` bundle or a container image ([channels](mcp/README.md#1-register-with-an-agent)).\n- **A `-rc.N` build walks the same signing, notarization, installer, and updater\n  checks as a final one** — what it lacks is a wide run behind it. The in-app\n  updater reads a fixed Pages manifest staged from the newest non-draft release,\n  release candidates included, and every archive must pass the bundled signature\n  check before installation.\n- **Screenshots demonstrate the product journey, not release availability.**\n\n## Where it stands\n\nNot a roadmap. This summarizes behavior documented in the\n[feature inventory](docs/FEATURES.md), the\n[specification](docs/ONTOLOGY-ATLAS-SPEC.md), and the\n[decision history](docs/DECISIONS.md) and [independent record workflow](docs/records/README.md).\n\nEach worktree adds its own decision/change/pilot fragments with `pnpm record:new`\nand `pnpm po:record`. `pnpm test:records` checks composition and writer contracts.\nDocs Vault JSON and public copies are ignored build products, materialized by\ninstallation and checkout/merge hooks; use `pnpm docs-vault:build` after an\ninstallation with scripts disabled.\n\n**Working today**\n\n- **A Markdown folder is the whole database** — read and written in place, with\n  no import step, no index to build, and no account.\n- **The macOS app**, Developer ID signed and notarized, with the compiled MCP\n  server inside its bundle, and the hosted web app as a no-install gateway.\n- **MCP over stdio** for Claude Code, Cursor, VS Code, Codex, and any other\n  client, typed and advertised through `tools/list`. [Agent guide](mcp/README.md).\n- **One-button agent setup that ends in a real proof** — paths shown before\n  writing, then an agent restart and `mcp-verify`. File presence is never\n  presented as a live connection.\n- **A CLI with the same authority as the agent** — scaffold, validate, dry-run\n  writes, traversal, blast radius, commit preflight, agent handoff.\n  [CLI reference](cli/README.md).\n- **Every surface reads that one folder** — Map, Architecture, Docs, Library,\n  Insights, Projects, Agents, MCP, and Git History.\n- **Versioned AI analysis kept as local Markdown**, with its evidence and\n  selectable history, and measured violations instead of an invented\n  maintainability score. [Analysis records](docs/ANALYSIS-RECORDS.md).\n- **Documents of any format gather in the Library**, kept byte for byte, with\n  wiki pages required to cite their source on every fact.\n- **External MCP servers attach to the in-app chat** — one switch per server, off\n  by default, tokens only in the keychain. Atlas never sits in that path.\n- **JSON-LD and GraphML export** off the same deterministic compile artifact, so\n  the vault opens in rdflib, Protégé, Gephi, Cytoscape, NetworkX, or Neo4j.\n- **`init` installs the agent's procedures where the agent runs**, and prints the\n  one sentence to paste into your own `CLAUDE.md` or `AGENTS.md`. Atlas does not\n  edit files you wrote.\n\n**Shipping, not settled**\n\n- **Windows x64 is an intentionally unsigned public beta** — same folder and MCP\n  surface as macOS, no signature.\n- **The vault format is v2.0-rc**, an RFC open for comment that documents\n  behavior already enforced by contract tests here and carries its own kill\n  criterion. [Specification §0](docs/ONTOLOGY-ATLAS-SPEC.md#0-rfc-status-and-feedback).\n- **Linux has no packaged build** — the browser app or a source checkout, same\n  vault, fewer screens.\n- **Web and desktop do not promise the same screens, and that is not a backlog.**\n  Git history and offline work are desktop capabilities; the web cannot run git\n  or native bridges.\n\nWhat we decided *not* to build is [What this is not](#what-this-is-not).\n\n## The journey\n\n### 1. Open a folder\n\nPoint the app at a directory of Markdown and it reads it in place. Ask it to\nstart from your code instead, and it creates exactly one folder inside the\nproject you picked:\n\n```text\nyour-repo/\n├── src/\n├── package.json\n└── atlas/                 ← the whole ontology, and nothing else\n    ├── project.md         one project document\n    ├── domains/           what the product is made of\n    ├── capabilities/      what each area can do\n    ├── elements/          the implementation pieces they work with\n    ├── architecture/      reviewed role and dependency profiles, when you have one\n    ├── sources/           the documents around the code, kept exactly as they arrived\n    ├── wiki/              one page written from those sources, each fact cited\n    └── .ontology-atlas/   gitignored, local only: bindings, audit log, activity\n```\n\nThat location is a decision, not a default. A map kept outside the repository\ntravels on one laptop, and the change to the code lands in a pull request while\nthe change to its meaning does not. Inside, the two move together in one diff —\nso **commit `atlas/`, push it, or copy it to another machine, and the map goes\nwith it.** The exact path is shown before anything is written, and an existing\n`atlas/` is reused and reported rather than overwritten.\n\nEvery screenshot below reads [`samples/storefront`](samples/storefront), an\nexample folder in this repository; `node cli/src/index.mjs overview\nsamples/storefront` prints its current census.\n\n![The current Docs workspace in the installed macOS app, with the vault tree open on the capabilities folder, the Checkout document beside it, its expanded frontmatter, word count and source date, its backlinks, and a link back to the same node on the map](docs/assets/readme/docs-workspace.png)\n\nDocs is the same folder without the canvas: preview or edit Markdown, inspect the\nfrontmatter that becomes the graph, follow backlinks, and jump back to the map.\nThere is no imported copy to synchronize.\n\n### 2. Connect your agent\n\n![The current Agents screen in the installed macOS app, listing the three coding tools found on this computer with their readiness, Open a chat with this tool and Check connection for the two that can run inside Atlas, the note on which tools can pause writes for review, and the option to show the other 36](docs/assets/readme/agent-connect.png)\n\n**Agents** finds the coding tools already installed on this computer and opens a\nconversation beside the map. **MCP** holds the folder's own connection, the setup\nfor each client, and the Connectors that attach external servers to that\nconversation.\n\n![The current MCP screen in the installed macOS app, with Share this folder open: how many connection files are ready and which file comes next, one connect button each for Claude Code, Codex, Cursor and Antigravity, the note that the server runs only while a conversation needs it, and the two later steps to restart the agent and confirm the connection](docs/assets/readme/mcp-connect.png)\n\n- **Connect once, with visible scope.** The flow names the folder and config it\n  will change, and writes plain text you can inspect. Claude Code, Codex, Cursor\n  and Antigravity get one button each; any other client uses the snippet.\n- **Then prove it from the agent's folder.** `mcp-verify` starts the bundled\n  server, reads the active vault, and reports the real result or failure.\n- **The conversation does not stop at the first map.** Up to three next steps\n  derived from the current vault appear under a completed answer; choosing one\n  fills the composer for review and never sends or writes on its own.\n- **Nothing stays running.** The server speaks stdio, opens no port, and makes no\n  network request ([Security](SECURITY.md)).\n\n### 3. Read the map\n\n![The current map with the Orders domain selected: unrelated concepts recede, the concepts it contains are named on the canvas, and the right inspector lists contains, used by, leans on, and belongs to beside Ask the agent, Edit, and full detail](docs/assets/readme/topology-focus.png)\n\nSelecting a node dims everything unrelated and opens its record without hiding\nthe node behind the inspector — a visual hierarchy for a person and typed\nparents, evidence and actions for an agent, from the same fact. Recent changes\ncan narrow the map while keeping project and domain context, and Footprints\nrecord the order in which you opened concepts.\n\n![The current 3D picker in the installed macOS app, offering Flat for the ordinary 2D map, Cone for containment drawn as nested cones, and Cloud for clustering by what relates to what](docs/assets/readme/three-dimensional-views.png)\n\nThree spatial readings stay explicit rather than mixed: **Flat** is the normal 2D\nmap, **Cone** hangs each parent's children on a cone with height as the\ncontainment tier, and **Cloud** lets relations determine all three axes. Changing\nthe view never changes the graph.\n\n### 4. Gather the documents in the Library\n\n![The current Library in the installed macOS app: the Sources 3 and Wiki 1 tabs over Add files, Find documents and Bring from a service, three gathered documents with their format, byte size and either a not-compiled badge or a written-up check, the line saying two are not written up yet, and beside them the Gather, Compile and Read stages with Gather done, Compile next on the two waiting sources, and Read offering the one page that exists](docs/assets/readme/library-sources.png)\n\nA codebase's meaning is rarely only in the codebase. The plan, the spreadsheet,\nthe handover note, the page somebody wrote on a wiki — the Library keeps those\nexactly as they arrived, under `sources/`, and nothing is parsed on arrival. Each\nrow carries only what a folder listing can say: format, byte size, and whether it\nhas been written up. Open one and Atlas says so in as many words — it has never\nread the file, and the hash it shows exists because a page claimed the source.\n\nWhat is written *from* them is the other half, and the counts stay honest about\nit: two of these three are **not written up yet**, and the folder says so rather\nthan presenting one page as coverage. A wiki page cites its source on every fact,\nfrom the same template whether a person or the in-app agent writes it, and\n`wiki-validate` names the lines that do not carry a citation rather than grading\nthe page. **Compile** starts one conversation that reads the sources and writes\nthe page; the traffic goes from your coding agent straight to its own provider,\nwhich the screen states instead of implying that Atlas sits in the middle.\n\nLibrary also works without code or ontology nodes. Keep a question and its cited\nanswer, inspect source changes, request an updated draft through Claude Code or\nCodex ACP, and compare before saving a new revision. Earlier answers remain\navailable. Local Compile has its own read and approval path. See\n[retained answers](docs/RETAINED-ANSWERS.md).\n\n### 5. Plan against reviewed architecture\n\n![The current Architecture screen in the installed macOS app, comparing the seven reviewed roles of this repository, numbered from Routes down to Shared foundation with what each role is in two lines, against the imports observed in code beside each one, a check in the Delta column where they agree, every stroke stating its rule as a sentence and the measured crossing with its import count, and the reviewed structure and inspection receipt named above with Re-inspect source and Roles and rules](docs/assets/readme/architecture-flow.png)\n\n<p align=\"center\">\n  <sub>This screen reads Atlas's own repository rather than the storefront\n  example, because measured import traffic needs a connected code folder.</sub>\n</p>\n\nArchitecture stays separate from the map. It sets what a person reviewed beside\nwhat an agent observed in the code, one role per row, with the difference in the\nmiddle; every stroke states its own sentence, and the same profile always draws\nthe same picture. **Findings & history** keeps every inspection receipt. Pattern\nnames such as Feature-Sliced Design, Hexagonal or Clean Architecture are reviewed\ndeclarations: conformance is derived from source evidence, never inferred from\nfolder names.\n\n### 6. Review a relation beside its node\n\n![The current relation review beside the map, showing the source, relation type, target and the reason typed for it, then what the concept depends on as a Now list and an After list and the connection reason that will be written, above Keep editing and Confirm and write](docs/assets/readme/relation-review.png)\n\nAtlas shows a directional preview on the map, then a compact review of the\nsource, type, target, reason, and exact frontmatter fields. **Confirm and write**\nis the only point that changes the file.\n\n### 7. Review the change, then record it\n\n![The current History screen in the installed macOS app, showing one unsaved concept change, the exact Markdown diff of the dependencies and relation_notes lines, the current branch and its remote with Fetch, Pull and Push, earlier vault commits, and the explicit save action](docs/assets/readme/history-review.png)\n\nWhatever wrote — you, the map editor, the CLI, or an agent over MCP — lands here\nfirst as a diff you read before it becomes history. Above is the change confirmed\nin step 6: two frontmatter lines, still unsaved. Git is scoped to the vault, and\nfiles outside the folder you picked are never touched.\n\nThe CLI writes the same two lines, says what it would do before touching a file,\nand refuses a dependency nobody explained (`$ATLAS` is the entrypoint set in\n[Running from source](#running-from-source)):\n\n```console\n$ node $ATLAS relate capabilities/order-cancel capabilities/refund dependencies ./storefront --dry-run \\\n    --why \"Cancelling a paid order has to give the money back, so cancellation cannot finish without refund processing.\"\n\ncapabilities/order-cancel --dependencies--> capabilities/refund\n  verdict matches_existing_schema · exists no\n  schema  capability --dependencies--> capability\n  pattern count 53 · resolved 53 · external 0 · unresolved 0\n  recommendation safe_to_add · No exact or inverse edge found; capability --dependencies--> capability is an existing schema pattern.\n\ndry-run would write dependencies on capabilities/order-cancel → capabilities/refund (no file changed)\n```\n\nDrop the `--why` and it stops rather than guessing one. An edge in a shape the\nvault has never used comes back as `new_schema_pattern · review_new_schema`, so a\ndrifting agent is visible before it writes.\n\n### 8. Keep it healthy\n\n![The current Analysis screen in the installed macOS app, with four measurements above the tabs (concepts by kind, relations by type, health in words, the last four weeks), the Do next, Not held, Inventory, Connections, Boundaries, Growth, Recent changes, Structure and Flow tabs, and the things to fix grouped by kind with the first group open on a pair whose names overlap](docs/assets/readme/graph-insights.png)\n\nInsights opens on four measurements: concepts by kind, relations by type, the\nfolder's health in words rather than a score, and the last four weeks of change.\n**Do next** is one row per kind of finding, and the counts add up to the title,\nalways. Where a missing back-link can be repaired from two facts already on disk,\none sheet names each file it would touch and nothing is written until you apply.\n\n**Growth** replays the folder's own Git history week by week and stores nothing —\nthe numbers are recomputed from commits each time the tab opens. A folder with no\ncommits is told there is no history to show rather than drawn as a row of zeroes,\nbecause a zero would claim the folder was empty.\n\n### 9. See the shape of the whole project\n\n![The current Projects screen in the installed macOS app, showing the Online Store project, its derived capability, element, domain, document and relation totals, nine aligned domain composition rows, and routes back to details and the map](docs/assets/readme/projects-coverage.png)\n\nNothing here is maintained by hand. Frontmatter has no `project:` key — the\nruntime walks the containment graph from each `project` root and derives coverage\nfrom how the documents link to each other.\n\n## What your agent gets\n\nAsk *what breaks if I change this?* and Atlas follows only approved dependency\ndeclarations. It does not turn folder structure into causal confidence:\n\n```console\n$ node $ATLAS blast-radius capabilities/mcp-server docs/ontology --depth 2\ncapabilities/mcp-server — blast radius (depth 2, incoming)\n  risk unknown · 1 node · 1 relation · 0 cross-domain\n\nimpact certainty unknown · declared 1 · rationale 0 · source-backed 0\nCounts below follow declared depends_on only. Use reachability/subgraph for structure;\ndo not read unknown as low risk.\n```\n\n- **Focused context, not a repository dump.** A brief carries the project,\n  domain, evidence, impact boundary, first tools, and stop conditions; for a task\n  that only reads, `OATLAS_READ_ONLY=1` returns one compact batch.\n- **Typed answers.** Paths and reachability explain structure, blast radius\n  follows declared dependencies only. No graph database, no hosted memory.\n- **Writes that survive review.** Analysis is side-effect free by default,\n  destructive operations dry-run first, renames repair backlinks, and mtime guards\n  protect concurrent human edits.\n\nThe CLI carries the same authority for sessions that cannot attach a connector:\n[MCP guide](mcp/README.md) · [CLI reference](cli/README.md).\n\n## What we measured, and the mistake we found in it\n\nA paired benchmark gives two sides the same source and question — one with a\nprepared vault, one with nothing. The first run looked like a large win, 0.25\nagainst 0.875, until re-scoring showed most of that gap was not a comparison: the\nanswer key mostly required Atlas's own concept names, which exist only inside the\nvault. We had published, in part, a vocabulary test that only one side could sit.\n\n| Subject | The part **both sides** could earn | The part **only Atlas** could earn | What we published before |\n|---|---|---|---|\n| Greenfield fixture | 0.75 → 1.00 | 0 → 0.83 | 0.25 → 0.875 |\n| Brownfield fixture | 0.75 → 1.00 | 0 → 0.57 | 0.28 → 0.74 |\n\nEach cell reads *without Atlas → with Atlas*. The control side named 100% of the\nsource files it should have named in every run, and the gap left over rests on one\nword: the key wanted *excludes*, and an answer saying *\"explicitly outside it\"*\nscored zero.\n\n**So the honest status is that we have not yet measured a difference in answer\nquality**, and Atlas was slower — a median of 17 and 33 seconds here, 28.2 and\n51.1 in a separate run that carried one change through code, tests, commit, merge\nand cleanup on both sides. What it does show is narrower: only the Atlas side\nreturned names you can look something up by. `capabilities/checkout` is an address\na person or an agent can resolve next session, in another tool, months from now;\n\"the checkout feature\" is not. The re-scoring found a bug on our side too — the\nAtlas run dropped its own concept names in a third of the harder cases. Blind\nhuman grading is next; a stronger claim waits on unfamiliar repositories, that\ngrading, and the measured cost of maintaining a vault. Method and every raw\nanswer:\n[paired findings](docs/benchmark/FINDINGS-2026-08-31.md) ·\n[the correction](docs/benchmark/FINDINGS-2026-08-31-metric-split.md) ·\n[change-flow run](docs/benchmark/FINDINGS-2026-08-31-change-flow.md) ·\n[benchmark log](docs/benchmark/README.md).\n\n## Why not just use a notes tool\n\nLocal Markdown, git diffs, and MCP are table stakes; notes tools such as\n[Basic Memory](https://github.com/basicmachines-co/basic-memory) already provide\nthem. Atlas adds a product ontology and a workbench where people and agents judge\nthe same facts. If you only need an agent to remember conversations, a notes tool\nis lighter.\n\n| | Notes with MCP | Hosted graph memory | Ontology Atlas |\n|---|---|---|---|\n| Store | Markdown you own | Vendor database | Markdown you own |\n| Structure | Freeform notes and links | Vendor-defined types | Project → domain → capability → element, documents, typed relations |\n| Graph questions | Note traversal | Graph engine | Blast radius, reachability, cycles, paths, centrality, health |\n| Evidence from code | Hand-authored | Corpus ingestion | Bounded read-only proposals; nothing lands until approval |\n| Human surface | Notes app | Vendor console | Local Map, Architecture, Docs, Library, Insights, Projects, Agents, MCP, History |\n\nThe argument and its sources are in [Foundations](docs/FOUNDATIONS.md).\n\n---\n\n## A vault is just files\n\nEverything below is the contract rather than the tour: how the folder is stored,\nwhat Atlas will never do, and how to run and verify it from source.\n\nOne Markdown file is one node. Frontmatter is the machine-readable record; the\nbody is the explanation a person judges.\n\n```yaml\n---\nuid: 71890f3e-7b5d-4c0a-8f14-123456789abc   # permanent identity, kept through renames\nslug: capabilities/token-issue\nkind: capability\ntitle: Token issue\ndomain: domains/auth\npath: src/auth/token-service.ts          # a path — code evidence\nelements:\n  - elements/jwt-signer                  # a slug — an implementation-role node\ndependencies:\n  - capabilities/session-refresh         # a slug — another node\n---\n\nIssues access and refresh tokens for authenticated users.\n```\n\n**A path points at code; a slug points at a node.** Mixing them is the most\ncommon first mistake, and `node $ATLAS validate` reports it as a dangling\nreference. `uid` is the permanent identity, minted once and kept through a\nrename; the slug is the readable current address; a source location belongs in\n`path:`, never in a slug. Relations sit on the declaring file the same way, one\nfrontmatter line from which Atlas derives the edge and its backlink —\n`dependencies` directed, `relates` symmetric, so the map never turns similarity\ninto causality.\n\nThe reading spine is small on purpose — `project → domain → capability →\nelement`, with `document` describing concepts anywhere on it — and an artifact\nearns a node only when it helps someone understand a capability, trace impact, or\nrun the right proof. Curated, not exhaustive. There is **no cap on how many nodes\na vault holds**: a wide hub is a review signal, not a limit, an analyzer's packet\nbound keeps one proposal readable and is never a graph bound, a bridge node has\nto earn its layer, and an external field trial's ontology is never merged into\nthis product's vault. Each rule's authority is the\n[quality authority map](docs/ONTOLOGY-QUALITY.md), and the practical test is\n[what becomes a node?](docs/guide/what-becomes-a-node.md).\n\nThree kinds of file share the folder, and only one is the graph:\n\n| Kind | Where | What makes it that | In the graph? |\n|---|---|---|---|\n| Raw source | `sources/**` | any format, kept exactly as it arrived | no — only `.md` reaches the parser |\n| Wiki page | `wiki/**.md` | Markdown with **no `kind:`** | no — `kind:` is what makes a node |\n| Ontology node | anywhere else | `kind:` in frontmatter | yes, and only these |\n\nInside `wiki/`, `_template.md` is the shape every page is held to and `_log.md`\nrecords each compile or check; `_`-prefixed files are furniture, not pages. The\nfolder is always named `atlas/` ([step 1](#1-open-a-folder)), fixed so a teammate\ncan say it and an agent's config can point at it without guessing, and\n`init --documents` writes the same folder without the node starters for people who\nhave documents and no code. Full contracts: the\n[relations guide](docs/guide/relations.md) and the\n[vault specification](docs/ONTOLOGY-ATLAS-SPEC.md).\n\n## Local-first, by construction\n\n- **Your disk is the database.** Frontmatter is the graph, confirmed writes go\n  back to the folder you picked, and Git is the history. There is no other store.\n- **No Atlas backend, account, or telemetry.** The web app is a static export; the\n  desktop app checks the public updater manifest once a day and uploads no vault\n  content. A connected coding agent talks to its own provider only when you ask.\n- **Two ways in, one folder.** The hosted web app can open a local folder through\n  the File System Access API. The desktop app uses a Tauri bridge to your selected\n  folder and keeps it open as a workspace.\n- **The Tauri macOS shell is a shell, not a silo.** MCP and CLI still read the\n  selected folder directly, and the bundled server is a file your agent launches\n  itself, so it keeps working when the app is closed.\n\n## What this is not\n\n- **Not a general-purpose ontology editor.** The ontology describes a codebase; a\n  business concept belongs there when it explains what that codebase builds, why a\n  boundary exists, or what a change can affect. The Library takes general sources\n  and wiki pages with no code nodes at all.\n- **Not a code index, and not an IDE.** Grep, language servers, AST indexes and\n  CodeGraph answer where a symbol lives and what calls it; Atlas replaces none of\n  them and answers why that artifact matters, which capability it serves, and what\n  to verify before changing it. An IDE for codebase *meaning* is the useful\n  analogy, and it stops there: Atlas does not edit, build, run, or debug code.\n- **No automatic acceptance of generated knowledge.** Saving a wiki page or answer\n  preserves it for review; it does not make its claims true or promote it into\n  accepted ontology meaning.\n- **Not an RDF, OWL, SKOS, or SHACL implementation.** The export is a bounded\n  graph shape; the vault is not an RDF serialization, the validator is not a SHACL\n  processor, and the query engine is not a reasoner. A persisted relation is a\n  declared claim, never an entailment; an absent one is a visible gap, never a\n  negative fact. [Specification §5.2](docs/ONTOLOGY-ATLAS-SPEC.md#52-standards-boundary).\n- **Not a service, and not on npm.** No backend, account, telemetry, daemon, or\n  port; `npx ontology-atlas` is a 404 and not a future feature. The MCP server\n  still reaches the ecosystem's registries as a release bundle or a container\n  image, neither of which is a package registry.\n- **Not extensible by running other people's code.** There will be no third-party\n  plugin runtime. Extension happens through MCP tools, agent skills, and files in\n  your own vault — things a `git diff` shows you before they run.\n- **Not finished.** Every public build so far is a release candidate.\n\n## Running from source\n\nLinux and every other platform without a packaged build run the browser app, or\nthe CLI and MCP server from a source checkout: Node.js 24 and pnpm, one clone\noutside the project you are describing, then `init` inside your own repository\nand `mcp-verify` to prove the live connection. The exact commands, the two\nrequired installs, and the reason `init` refuses to run inside the Atlas clone\nare in [set up from a source checkout](cli/README.md#set-up-from-a-source-checkout).\n\n## Documentation\n\n**Use it:** [hosted guide](https://ontologyatlas.com/en/guide/) ·\n[features](docs/FEATURES.md) · [MCP setup](mcp/README.md) ·\n[CLI reference](cli/README.md)\n**Model a vault:** [what becomes a node?](docs/guide/what-becomes-a-node.md) ·\n[relations](docs/guide/relations.md) ·\n[v2 specification](docs/ONTOLOGY-ATLAS-SPEC.md) ·\n[quality authority map](docs/ONTOLOGY-QUALITY.md)\n**Understand it:** [product direction](docs/PRODUCT-DIRECTION.md) ·\n[foundations](docs/FOUNDATIONS.md) · [architecture](docs/ARCHITECTURE.md) ·\n[security](SECURITY.md) · [decisions](docs/DECISIONS.md)\n\n## Contributing\n\nIssues and pull requests are welcome, and the most valuable report today is\npointing Atlas at a real repository and showing where the proposed meaning, the\nagent handoff, or the validation falls short.\n\nRead [CONTRIBUTING.md](CONTRIBUTING.md) first — external pull requests come from\nforks, and that is a security boundary rather than a formality. Inside this\nrepository [AGENTS.md](AGENTS.md) is canonical for people and agents alike, and\nproduct decisions route through `pnpm po:route -- --help` from change facts\nrather than a self-declared risk.\n\nPre-push keeps quick checks local; full contract and Knip scans belong to PR CI.\nMain CI reuses a successful PR only for the identical Git tree with complete\nlive required-check proof; unproven pushes use their diff. Daily and manual\nruns remain exhaustive. Exact test-file duplicates are collapsed within a\nlocal check run. Browser CI shares one build and balances whole test files by\nmeasured duration; `node --test scripts/run-playwright-ci.test.mjs` verifies allocation.\nMCP harness probes use `pnpm test:mcp:rpc`; full CI keeps the unique CLI boundary\nthrough `pnpm integration:cli:architecture`. Catalogue checks use captured inputs;\n`pnpm mcp:catalogue:check-online` explicitly checks current registry facts.\nDetails: [development checks](docs/DEVELOPMENT-CHECKS.md).\n\nVerification starts with `pnpm checks:changed`, which picks the focused gates for\nthe files you changed; `-- --run` executes every recommendation and stops at the\nfirst failure, and it is the last command before a pull request.\n\nOpen the pull request as a **draft** (`gh pr create --draft`), which runs no CI,\nand land it with `pnpm pr:land <number>`. That one command serializes against\nevery other agent: it takes a shared lock, merges today's `main` into the\nbranch, runs the local lanes on the merged source, marks the pull request ready\n(which fires the single CI run for that branch), squash merges, deletes the\nbranch and releases the lock. `pnpm pr:queue` shows who holds the lock and who\nis waiting; `pnpm pr:ci <number>` buys an early CI run without landing. Never\nrun `gh pr merge` or `gh pr update-branch` by hand: a guard refuses both,\nbecause outside the lander neither waits for the landing already in flight.\n\n| Command | What it answers |\n|---|---|\n| `pnpm checks:changed` | Which gates this change actually needs |\n| `pnpm docs:check` | Docs gates, including `pnpm docs:language`, `pnpm source:language`, `pnpm changelog:check`, `pnpm dev-checks:check` |\n| `pnpm knip` | Dead files, exports and types across every scope |\n| `pnpm decisions:find <terms>` · `pnpm decisions:check` | The decision record to cite or overturn, and whether this change owes one |\n| `pnpm harness:report` · `pnpm harness:outcomes` | What the agent hooks caught, and whether that lane still earns its place |\n| `pnpm pr:land <n>` · `pnpm pr:queue` | Land a pull request, and who is landing right now |\n\n[Development checks](docs/DEVELOPMENT-CHECKS.md) is the full gate reference, one\nentry per area; [map testability](docs/MAP-TESTABILITY.md) owns canvas\nperformance, readability, contrast, and instrumentation.\n\n## License\n\n[MIT](LICENSE)\n",
  "bytes": 35223,
  "sha": "4a6187587b2781742497b88f6678a4fb2ecc6e5f0ec4bb8dfe0bb670ae0a5f66",
  "repo_slug": "wlsdks/ontology-atlas",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_wlsdks_ontology_atlas_491434ea/readme"
}