Skip to main content

gamayun

gamayun

Ontology generator and manager for software projects — builds a statistical ontology of a code base from its task tracker and git history, or from a folder of documents and code, without an LLM or a GPU.

What it does

gamayun turns a project's history into an ontology: a set of facts (triples) linking the words of tasks, code identifiers, files, folders and modules. A fact is kept only if it passes a significance test, and its numbers stay attached to it, so every fact can be checked.

The ontology is then used to:

  • search — rank the modules, files and symbols a task description is likely to touch;
  • compass — suggest where to start reading the code for a task, with a confidence level;
  • companions — list the files that usually change together with a given set of files;
  • health — show how the code base evolves (evolution, maintenance, disruption, stagnation);
  • map — draw the modules and the coupling between them in the browser;
  • show — list everything the ontology knows about a term, identifier, module or file.

gamayun manages several ontologies on one machine: each project is built, refreshed, evaluated and opened by name from the command line or the web UI. It runs on an ordinary laptop and works fully offline once the data is collected.

Statement of need

When a task arrives ("Login fails after the session expires"), a developer has to find the code it concerns. In a large or unfamiliar code base this is slow, and much of the knowledge it needs sits in the project's history: which parts of the code tasks about login or sessions have changed before, and which files are always edited together.

gamayun makes that history searchable. It is meant for:

  • developers who maintain or join a large project and need to know where a task leads, which files a change will drag along, and which parts of the code keep getting coupled;
  • researchers in software engineering who study task-to-code traceability, change impact, co-change (logical coupling) and software evolution, and need results that are explainable and reproducible.

Search tools based on embeddings or LLMs need a model, often a GPU, and give answers that cannot be traced back to their reasons. gamayun uses only counting and significance tests. It needs no model and no GPU, sends no code anywhere, gives the same answer for the same history every time, and shows the evidence for every result.


Install

pip install gamayun-ontology

The package is called gamayun-ontology. The command and the Python module are both gamayun. It needs Python 3.10+ and brings numpy, scipy, Flask, waitress and mokosh, the tool that collects the task history.


Quick start

A: from your project's history (git + tracker)

cd my-project                          # a git clone

mokosh init                            # repository, branch, tracker (Jira, GitHub, GitLab, YouTrack)
mokosh ingest                          # commits + their tasks -> units.db

gamayun index --db units.db --repo . --project myproj
gamayun eval  --project myproj         # optional: tunes the ranking on your history

gamayun search "Login fails after the session expires" --project myproj
gamayun ui                             # http://127.0.0.1:8095/

Building takes seconds to a few minutes, depending on the size of the history. To refresh it later, run mokosh ingest and gamayun index again.

B: from a folder of documents and/or code

gamayun index  --files ./docs --project docs
gamayun search "budget closing period" --project docs
gamayun show   ident:final_period --project docs     # where it is defined and used

Commands

Command What it does
gamayun index --db DB [--repo REPO] --project P Build the ontology from a task database (--repo adds module dependencies)
gamayun index --files FOLDER --project P Build it from a folder of documents and/or code
gamayun search "text" --project P Rank the modules, files and symbols for a task
gamayun compass "text" --project P Where to start, with a confidence level
gamayun companions FILE… --project P Files that usually change together with these (--from answer.txt reads them from a text)
gamayun show ENTITY --project P Everything known about term:x, ident:x, module:x, dir:x, file:x, sym:x
gamayun health --project P The evolution square, --by month|quarter|year, --units, --unit PATH, --file PATH
gamayun eval --project P Tune the ranking on your history and report its quality
gamayun list Every project on this machine
gamayun ui [--port 8095] [--host 0.0.0.0] The web UI

search, compass and companions take --json for scripts and agents, and --k N to set how many results to return.


Example

The output below comes from a small demo shop project (tasks such as Cart total wrong after discount or Invoice number duplicated, with the files they changed).

$ gamayun search "Login fails after the session expires" --project shop --k 3
terms: expires fails login session

modules:
   1. auth                                        1.57  expires +0.82, fails +0.82, session +0.81, login +0.80
   2. web                                        -0.79  session +0.25, login +0.23
   3. common                                     -1.72

files:
   1. auth/src/LoginController.java
        login/names +2.12, login/file +0.79, session/file +0.78, expires/file +0.73
   2. auth/src/SessionManager.java
        session/names +1.93, expires/file +0.85, fails/file +0.85, session/file +0.83
   3. auth/src/TokenRefresher.java
        expires/file +0.85, fails/file +0.85, session/file +0.82, login/file +0.81

Next to each result are the words that put it there and how much each one weighed. To see a fact behind a word:

$ gamayun show term:login --project shop --limit 1
term:login :: characterizes :: module:auth  [src: n=123;df=132;g2=480.3;lift=4.97]

The numbers in brackets are the evidence: the word and the module appeared together in 123 of the 132 tasks with that word, about 5 times more often than chance would give. Only facts that pass a significance test are kept.

The files that usually change together with a given one:

$ gamayun companions checkout/src/Cart.java --project shop --k 2
chosen (1): checkout/src/Cart.java

changed together with them, not chosen:
   1. checkout/src/DiscountRule.java
        with 1 of 1 chosen (Cart.java); G2 84.7
   2. checkout/src/PriceCalculator.java
        with 1 of 1 chosen (Cart.java); G2 81.1

Web UI

gamayun ui opens every project on the machine in the browser. You pick a project at the top.

  • Search: the compass and the ranked results; open a result to see the facts behind it.
  • Companions: paste a list of files, or an answer that names them.
  • Health: the evolution square for the whole code base, one unit or one file, over time, and the units ranked by stagnation.
  • Map: the modules and their coupling, one layer at a time; click a module to open its sub-folders, or a link to see what it is made of.
  • Entity: everything about one term, identifier, module or file.
  • Projects: build and evaluate projects without the command line.

A link like /?project=myproj&q=... opens a search directly. The UI has 9 colour themes and 6 languages (English, Ukrainian, German, French, Spanish, Portuguese).


Health: the evolution square

Every past task is a set of files that changed together. A pair of them is new if they never changed together before, and local if both are in the same unit of the code. That gives four zones:

across units inside a unit
new pair DISRUPTION: new coupling, the architecture erodes EVOLUTION: new work where it belongs
known pair STAGNATION: the same cross-unit edits again and again MAINTENANCE: routine work
gamayun health --project myproj --by year              # the whole code base, year by year
gamayun health --project myproj --units --since 2024   # units ranked by stagnation
gamayun health --project myproj --unit checkout --by quarter

The units with the most stagnation keep dragging the same outside files along, so they are good refactoring candidates. Each gamayun index keeps a dated snapshot, so you can compare builds month by month.


Where projects live

A project is stored next to what it describes, in <folder>/.gamayun/<project>/ (or in --root FOLDER). ~/.gamayun/projects.json only remembers where each one is, so gamayun ui, search and the other commands find a project by name from any folder.

For one code base, keep the history project and the files project separate (for example shop and shop-code). They answer different questions: what changes together, and what is defined and used where.


How it works

gamayun counts and tests; it does not generate anything. For every pair, such as a word and a module, a file and another file, or an identifier and a file, it checks whether they occur together more often than chance would give (Dunning's G² test, p < 0.001). Only the pairs that pass become facts (triples). A search adds up the evidence of the task's words with naive Bayes and returns the best-supported targets, together with the facts that support them.

Fact Meaning
term characterizes module/file tasks with this word usually change this
term not_in module tasks with this word never change this
term anchor_of module the word belongs almost entirely to one module
file co_changes_with file the two files change together
module depends_on module the code of one imports the other
ident defined_in / used_in file where an identifier is defined and used (folder projects)
term is_a term, term same_as term from the text of documents: "X such as Y", "Total Cost of Ownership (TCO)"

Because every fact is a statistic you can check, the results are explainable and reproducible: the same history always gives the same answer.

Python API

The command line is a thin layer over the package; the same can be done from Python.

from gamayun import pipeline, store
from gamayun.onto import Onto

# build (the same as `gamayun index`)
pipeline.build_project("units.db", "myproj", repo=".")        # from a task database
pipeline.build_folder_project("./docs", "docs")               # from a folder

# load a project and search
O = Onto(store.project_dir("myproj"))                         # or a path to triples.txt
res = O.query("Login fails after the session expires").search(pipeline.load_params("myproj"), k=10)

for m in res["modules"]:
    print(m["target"], m["score"])
    for e in m["evidence"]:
        print("   ", e["term"], e["value"], e["triple"])

O.companions(["checkout/src/Cart.java"], k=5)      # files that change together with these
O.entity("term:login")                            # every triple of an entity

search returns a dictionary with terms (the words of the task it used), modules and files (and symbols for a folder project). Each result has a target, a score and its evidence: the term, its weight and the triple behind it.

Ontology format

A project is a folder with the ontology as plain text, triples.txt, one fact per line:

subject :: predicate :: object  [src: name=value;...]

Entities are typed by a prefix: term:, ident:, module:, dir:, file:, sym:. The src part holds the statistics the fact was accepted on (n co-occurrences, df document frequency, g2, lift, expected, …). The file can be read, searched with grep or loaded by other tools without gamayun. Next to it are params.json (ranking parameters), stats.json, source.json (what the project was built from) and the results of eval.


Tests

git clone https://github.com/szholobetsky/gamayun
cd gamayun
pip install -e ".[dev]"
pytest

The tests build small ontologies from generated databases and folders, so they need no external data and run in under a minute.

Support

The project is on GitHub: github.com/szholobetsky/gamayun. Questions, bug reports and suggestions go to its issues.


Part of the SIMARGL toolkit

gamayun is one of ten tools that together form an intellectual development support system:

Tool Role
simargl Task-to-code retrieval — given a task description, finds which files and modules are likely affected, using semantic similarity over git history
svitovyd Project map — scans any codebase and produces a structural map of definitions and cross-file dependencies; queried from the CLI, a web UI with a layered map, or an MCP server
1bcoder AI coding assistant for small local models — surgical context management, agents, parallel inference, proc scripts
yasna Session memory — indexes conversations from all AI agents so you can find what was discussed, when, and where
radogast Context drift monitor — measures how far an AI agent's conversation has drifted from the original task
vyrii Local AI web UI — chat, translate, web research, RAG and file management in the browser (Flask; Gradio optional); powered by Ollama or any OpenAI-compatible backend
syryn Bluetooth identity beacon for headless devices — the device's IP is its Bluetooth name; hostname, mDNS and network interfaces on request
alkonost Browser cockpit for 1bcoder's flows — the deepagent_* spec pipeline (plan tree → specs → task board) and the glossary (build, browse, search), tuned for small local models
gamayun Statistical ontology without an LLM — builds triples of terms, identifiers, files and modules from task history or a folder of documents and code; every triple carries its significance test
mokosh Dataset gathering — commits of a git repository and the tasks of its tracker (Jira, GitHub, GitLab, YouTrack) in one SQLite database that the other tools read
  • simargl finds the code related to a task by vector search over the task history (embeddings).
  • svitovyd answers: how is the code structured and what depends on what?
  • 1bcoder answers: how do I work with local models efficiently?
  • yasna answers: where did I already discuss this?
  • radogast answers: is the AI agent still on track toward the goal?
  • vyrii answers: how do I access all of this through a browser?
  • syryn answers: what is the address of this headless device?
  • alkonost answers: how do I turn one task description into a reviewed, working plan — and see the project's glossary — without a big model or a big context window?
  • gamayun finds the code related to a task through an ontology of significant links between words, files and modules (no LLM).
  • mokosh prepares the initial dataset from version control and the issue tracker.

Together they cover the full development loop: understand the codebase, find relevant history, work with AI locally, remember what was decided, and verify the context stays on target.

The name comes from Slavic mythology. Gamayun (Гамаюн) is the prophetic bird with a woman's face, the messenger of the gods who knows everything about the world and tells it to those who can listen. A fitting name for a tool that foretells which code a task will touch — and always says why.


License

MIT. See LICENSE.

About

(c) 2026 Stanislav Zholobetskyi, Oleh Andriichuk
Institute for Information Recording, National Academy of Sciences of Ukraine, Kyiv
PhD research: «Intelligent Technology for Software Development and Maintenance Support»

Metadata

Release files for gamayun-ontology 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for gamayun-ontology 0.1.1
File Size Uploaded Provenance Actions
gamayun_ontology-0.1.1.tar.gz 136.8 kB Without provenance Details for gamayun_ontology-0.1.1.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for gamayun-ontology 0.1.1
File Interpreter ABI Platform Actions
gamayun_ontology-0.1.1-py3-none-any.whl Python 3 none any Details for gamayun_ontology-0.1.1-py3-none-any.whl

Total release size: 286.6 kB

Release files / gamayun_ontology-0.1.1.tar.gz

Download URL gamayun_ontology-0.1.1.tar.gz
Size 136.8 kB
Tags Source
SHA-256 checksum
How to use checksums
4c705120d558fdc481485687f9c8624e72e4cb504285b64d579ee0c6fe98f330
BLAKE2b-256 checksum
How to use checksums
4249af29d400de9aed1b61db80520a5d91daf9043e8c8cf51a630b73f0e01876
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.9

Release files / gamayun_ontology-0.1.1-py3-none-any.whl

Download URL gamayun_ontology-0.1.1-py3-none-any.whl
Size 149.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e70bff75776225018bde12433080ae02cd816f36e835bd4a6982a02769035786
BLAKE2b-256 checksum
How to use checksums
e603e9b9c573411a2dcb722bc34f99418bbb2a1cf4bd1217624d70b853d69dca
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.9

Security for gamayun-ontology 0.1.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page