--- license: apache-2.0 language: - en base_model: tjarvis91/qovaryx-50m-scratch-base base_model_relation: finetune library_name: pytorch pipeline_tag: text-generation tags: - text-generation - qovaryx - compact-cognition - local-ai - finance - 10-k - 10-q - citation - factual-grounding - sovereign-base --- # Q-FinCite-50M-Sovereign — 10-K/10-Q citation — financial fact with page anchor > ### Built by JE Horizon — sovereign 50M specialist > > Part of the **Q-Office-Suite**, a family of small sovereign-base specialists > trained from scratch at 50M parameters. Not bundled in the Qovaryx desktop > app — published here for transparency + research. > > - Read the research: https://qovaryx.jehorizon.com/research > - Main site: https://qovaryx.jehorizon.com > **Financial filing fact + page anchor. Refuses what isn't in the excerpt.** ## What this model does, in one sentence Given a public-filing excerpt and a question, returns the financial fact with an inline citation like `[10-Q page 9]`. Same discipline as Q-DocCite, specialized to SEC filings. ## Honest performance - **Task:** financial citation - **Metric:** `citation` (predicted answer contains gold content AND gold citation tag) - **Holdout:** n=60 rows, never seen in training, scored row-by-row - **Score:** **100.0%** mean - **Bootstrap CI 95% lower bound:** 1.000 - **Gate threshold:** 0.90 - **Verdict:** PASS at point estimate AND at bootstrap CI lower bound ## What it's used for — real workflows - **Equity research analyst assist** — Drop in a 10-Q section; ask for the segment revenue, the cash position, the share count. Every number comes with [10-Q page N] for direct verification. - **Earnings season fact pull** — Batch-process a quarter's worth of 10-Qs across a watchlist. Q-FinCite emits cited facts; your downstream model does the comparison. - **Compliance / due diligence** — Audit trail with citations baked into every answer. The page anchor is the receipt. - **Refuse-when-not-in-filing pattern** — If the excerpt doesn't say it, Q-FinCite says it doesn't. That's the hardest pattern to teach a general LM, and the audit shows we got it. ## What problem this actually solves Equity research, compliance, and DD workflows all need cited financial facts with low hallucination risk. Q-FinCite is specialized for 10-K / 10-Q text — it expects filing structure, emits filing-page anchors, refuses when the fact isn't there. Pair with Q-Office-Suite Q-DocCite for non-filing documents. ## Integration paths - **Step in a filings RAG** — After retrieval, before display — Q-FinCite ensures every emitted fact has a page anchor. - **Q-Office-Suite runtime** — POST /run/q-fincite — paired with Q-DocCite for general docs. - **Companion to options decoder** — Use alongside the Qovaryx options decoder runtime as the citing layer for filing-derived signals. ## Example Input: ``` Excerpt: [10-Q page 9] Subscriber count was 650M. Q: Subscriber count? ``` Output: ``` Subscriber count was 650M. [10-Q page 9] ``` ## What this is NOT - **Not a general-purpose chatbot.** This head does one job and does it consistently. Free-text generation outside the trained task surface will degrade. - **Not a replacement for a verifier.** This is one component in the Qovaryx cluster-shell architecture. The decision-acceptance discipline lives in the wrapper, not in the head. - **Not reproducible from this card.** Weights and audit are public; the crystal corpus, eval gate constants, and training hyperparameters are not. ## Proprietary Qovaryx technology — built on our own scratch base This is a **53.5M-parameter sovereign specialist** in the Qovaryx Compact Specialist Suite. It is full-fine-tuned from [`tjarvis91/qovaryx-50m-scratch-base`](https://huggingface.co/tjarvis91/qovaryx-50m-scratch-base) — **our own scratch-trained base, not a borrowed foundation model**. - **Base:** Qovaryx 50M scratch base. Pretrained from random initialization on 491.5M tokens. **Not SmolLM2. Not Qwen. Not Llama. Not Mistral. Not Phi.** No HuggingFace foundation. No closed-source weights. Every parameter traces back to a Qovaryx training run on Qovaryx hardware. - **Tokenizer:** Qovaryx `english_v1` BPE (vocab 32000), built in-house against our own pretraining corpus. - **Architecture:** Qovaryx FinanceDecoder — 12 decoder blocks, GQA, RoPE, SwiGLU FFN, RMSNorm, MTP heads, decision head. - **Recipe:** Qovaryx crystallization discipline — train the law before replaying the noise. - **Runs on CPU.** No GPU required at inference. ## Architecture (Qovaryx proprietary) - 53.5M parameters - 12 decoder blocks, d_model=512, n_head=8, GQA n_kv_head=2 - SwiGLU FFN, RoPE positional, RMSNorm - Multi-token prediction (MTP) auxiliary heads - Decision head for routed-decision tasks - Tokenizer: Qovaryx `english_v1` BPE, vocab 32000 (in-house build) - Pretrained from `qovaryx-50m-scratch-base` step 60000 — 491.5M tokens - Full fine-tune (no LoRA, no QLoRA, no adapter): every parameter was updated on the Qovaryx crystal corpus for this specialist ## How to load it (Python) ```python import torch from tokenizers import Tokenizer from bleeding_edge.model.decoder import FinanceDecoder, DecoderConfig tok = Tokenizer.from_file("tokenizer.json") ckpt = torch.load("pytorch_model.pt", map_location="cpu", weights_only=False) cfg = DecoderConfig(**{k: v for k, v in ckpt["model_cfg"].items() if k in DecoderConfig.__dataclass_fields__}) cfg.vocab_size = tok.get_vocab_size() model = FinanceDecoder(cfg).eval() state = {k.removeprefix("_orig_mod."): v for k, v in ckpt["model_state"].items()} model.load_state_dict(state, strict=False) prompt = "Excerpt: [10-Q page 9] Subscriber count was 650M.\nQ: Subscriber count?" ids = tok.encode(prompt).ids cur = torch.tensor([ids], dtype=torch.long) with torch.no_grad(): for _ in range(120): nxt = int(torch.argmax(model(cur, return_decision=False).logits[:, -1, :], dim=-1)) if nxt == 0: break cur = torch.cat([cur, torch.tensor([[nxt]])], dim=1) print(tok.decode(cur[0].tolist()[len(ids):])) ``` ## License & posture Apache 2.0 for the published weights, model card, and example code. The Qovaryx scratch base build pipeline, the crystallization corpus, the eval gate constants, the cluster routing policy, and the protected runtime entrypoint are **Qovaryx proprietary technology** and are not included in this release. Same posture as every previous Qovaryx public release: ship the weights and the audit, not the recipe. ## Sibling specialists in the Qovaryx Compact Specialist Suite All ten specialists share the `qovaryx-50m-scratch-base` and the same audit discipline. Use one directly; use all ten through the cluster shell. - [Q-Triage](https://huggingface.co/tjarvis91/Q-Triage-50M-Sovereign) — ticket routing - [Q-DocCite](https://huggingface.co/tjarvis91/Q-DocCite-50M-Sovereign) — document citation - [Q-Invoice](https://huggingface.co/tjarvis91/Q-Invoice-50M-Sovereign) — invoice extraction - [Q-ToolCall](https://huggingface.co/tjarvis91/Q-ToolCall-50M-Sovereign) — agent tool-calls - [Q-Meeting](https://huggingface.co/tjarvis91/Q-Meeting-50M-Sovereign) — meeting structuring - [Q-FinCite](https://huggingface.co/tjarvis91/Q-FinCite-50M-Sovereign) — 10-K/10-Q citation - [Q-CmdSafe](https://huggingface.co/tjarvis91/Q-CmdSafe-50M-Sovereign) — command safety triage - [Q-SheetExtract](https://huggingface.co/tjarvis91/Q-SheetExtract-50M-Sovereign) — spreadsheet extraction - [Q-Coder](https://huggingface.co/tjarvis91/Q-Coder-50M-Sovereign) — Python code skeletons - [Q-RAG](https://huggingface.co/tjarvis91/Q-RAG-50M-Sovereign) — relevance filter for RAG; beats BGE-reranker-large on its holdout ## Official site & community The full Qovaryx runtime that orchestrates this specialist behind a single decision-acceptance gate ships from: - **Site:** https://qovaryx.jehorizon.com - **Download (desktop beta):** https://qovaryx.jehorizon.com/download.html - **Research:** https://qovaryx.jehorizon.com/research - **Discord:** https://discord.gg/PtuHZDv5ju - **Ko-fi (we cover GPU bills):** https://ko-fi.com/tjarvis91 - **Research devlog:** https://github.com/thron-j/qovaryx-ai-research If you find a failure mode this card doesn't cover, open a discussion on this repo or come to the Discord — that's how the next crystal corpus gets written.