# `.growmos/` file format All files are UTF-8, deterministic (sorted keys, sorted rows) and safe to commit. JSONL rows are one JSON object per line. ## sources.jsonl ```json {"id":"src_b33563055168","ref":"README.md","kind":"file","sha256":"…","title":"README.md", "status":"extracted","added":"2026-08-17T10:00:00Z","updated":"…","extracted_at":"…", "schema_version":1,"stats":{"entities":8,"relations":6}} ``` `kind` ∈ `file` (repo-relative path) · `url` · `text` (stdin/foreign file; body cached under `cache/`) · `note` (provenance label such as `session:2026-08-17`). `status` ∈ `pending` · `extracted` · `note` · `missing`. ## mentions.jsonl (append-only) ```json {"source":"src_…","chunk":0,"name":"A. Chen","type":"PERSON","description":"Approved ADR-001.","ts":"…","schema_version":1} ``` ## entities.jsonl ```json {"id":"person/alice-chen","name":"Alice Chen","type":"PERSON","description":"Owner of the Scheduler component.", "sources":["src_a","src_b"],"mentions":2,"provisional":false,"created":"…","updated":"…","schema_version":1} ``` Ids are stable (`/`); `name` is the canonical display form and may change on resolution. ## aliases.jsonl ```json {"alias":"A. Chen","type":"PERSON","entity":"person/alice-chen"} ``` ## relations.jsonl ```json {"id":"r_4e1920f801f6","source":"dependency/postgres","predicate":"replaces","target":"dependency/redis", "sources":["src_a","src_b"],"confidence":2,"created":"…","updated":"…","schema_version":1, "when":{"start":"2026-08","end":"ongoing"}} ``` `id` = hash of (source, normalized predicate, target). `confidence` = number of distinct sources (cross-document corroboration). `when` is optional. ## profiles/.json ```json {"entity":"component/scheduler","summary":"…","key_facts":["…"],"time_range":{"start":"unknown","end":"ongoing"}, "sources_hash":"ab12cd34ef56","ts":"…"} ``` `sources_hash` is the hash of the entity's source set at write time; a mismatch marks the profile stale. ## schema.json ```json {"version":1,"entity_types":["PERSON","ORGANIZATION","LOCATION","EVENT","ARTIFACT","COMPONENT",…], "predicate_hints":["depends on","calls",…],"history":[{"version":1,"ts":"…","note":"init with preset 'software'"}]} ``` ## config.json ```json {"preset":"software","include":["README.md","docs/**/*.md",…],"exclude":["node_modules/**",…], "max_docs_per_run":50,"max_entities_per_doc":40,"chunk_chars":6000,"profile_min_degree":3, "resolve_batch_size":80,"gold_min":2,"review_days":7,"provider":{"name":"","extract_model":"","reason_model":""}} ``` ## state.json Runs (last 200), `pending_resummarize`, `open_packets` (names handed out in the last resolution packet per type), `last_sample`, `last_eval`, counters. ## eval/ `gold/.json` — `{"source": "", "entities": [{"name","type"}], "relations": [{"source","target"}]}` · `aliases.json` — `{"": ""}` · `last_report.json`. ## Packet payloads (what agents return) Extraction: `{"entities":[{"name","type","description"}],"relations":[{"source","predicate","target"}]}` Resolution: `{"clusters":[{"canonical","aliases":[…]}]}` (optionally `"input_names":[…]`) Profile: `{"summary","key_facts":[…],"time_range":{"start","end"}}` The strict JSON schemas (for structured-output APIs) are in `growmos.schema`.