Product backlog
What is queued for ugraph, in the order it is likely to land, with the reason each
item exists. Items are sized against one principle: the deterministic core stays
deterministic, and anything that needs a model stays opt-in and machine-checked.
Read this as a plan, not a promise. Only the items marked
shipped exist in v0.1.0 today. See
the
changelog for exactly
what that is. Everything else is intent, and priorities move when real use says they
should. No dates are given because none have been committed.
shipped — in v0.1.0
in progress — being built now
planned — accepted, not started
considering — unresolved question first
Now
4 items · target 0.2.0
Making v0.1.0 installable by someone who is not you. Nothing here adds a feature; all of it removes a reason the tool cannot be handed over.
UG-01
Bundle templates/ and skills/ into the wheel
ugraph init and ugraph skills install
resolve their payload from _bundled/, falling back to a
source-checkout path. Package both so an installed wheel scaffolds and installs
without the repository present.
Why: the two commands a first-time user runs first are the two that depend on files the wheel does not yet carry.
UG-02
pyproject.toml, a tagged release, and PyPI
Publish as ugraph-kit with a pinned dependency set
(python-frontmatter, plus tomli below
Python 3.11), and an [api] extra for the Anthropic and
OpenAI backends. Tag 0.1.0 from the commit the changelog describes.
Why: pip install ugraph-kit is the difference between a tool and a folder of scripts.
UG-03
Test suite over the three gates, run in CI
Fixture knowledge bases: one clean, one with every lint error, one with a
paraphrased quote and a fabricated timestamp, asserted against
lint, verify and
index --check, including the byte-identical rebuild
property.
Why: the product claim is that these three commands can be trusted as gates. An untested gate is an opinion.
UG-04
ugraph doctor
One command that reports the resolved KB root and which of the five resolution
rules produced it, whether yt-dlp is on PATH, which
extraction backend is reachable, and whether the scaffold is complete, then
names the fix for each failure.
Why: every setup failure today surfaces as a different command failing for a reason that is really about configuration.
Next
6 items · target 0.3.0
Automating the sources you capture by hand today, and giving agents a first-class way in.
UG-05
RSS and blog ingest adapter
A second ugraph.sources module that fetches posts automatically
and lands them as the same pair of pages every adapter writes: an immutable capture in
raw/ and a stub in sources/.
Paragraph anchors take the place of timestamps for provenance.
Why: the ledger already keys on the universal slug rather than anything video-shaped, so a new adapter appears in every report the day it lands, with nothing added to the ledger.
UG-06
Podcast adapter with local transcription
Pull an audio feed and transcribe it locally into the same timestamped markdown
shape other captures use, so verify works on it
unchanged.
Why: the highest-value material in this space is audio-only, and the verification model needs nothing but real time markers.
UG-07
Phase-B assistance — propose, never merge
A pass that clusters candidates across sources and proposes canonical merges with
their evidence, presented for accept, reject or split. The tool writes nothing
until a human answers.
Why: collapsing ten talks into one page is where the format's value lives and there is no mechanical check for getting it wrong, so this stays a proposal surface, not a batch job.
UG-08
MCP server over a knowledge base
Expose the KB to any MCP-speaking agent as a small tool surface: read the index,
follow a typed edge, fetch a page, and resolve a citation back to its transcript
marker, read-only by default.
Why: a filesystem is already an agent-navigable interface, but an explicit citation-resolution tool is what makes an agent cite instead of paraphrase.
UG-09
Incremental lint and verify
Cache results against a content hash per page so a re-run only re-checks what
changed, with an explicit --full to force a cold pass.
Why: a pre-commit gate that takes ten seconds on a large KB is a gate people start skipping.
UG-10
ugraph watch
Rebuild indexes and re-lint the touched subtree on save, so an editing session in
Obsidian never drifts from what index --check would say.
Why: the byte-identical index property is only useful if you find out you broke it before CI does.
Later
6 items
Accepted in principle, not scheduled. Each waits on something in Now or Next.
UG-11
Local document adapter — PDF, EPUB, a folder of notes
Ingest a directory of documents with page or heading anchors as the provenance unit.
Why: the most-cited material in a serious knowledge base is usually already on the reader's disk.
UG-12
Saved-thread adapter
Long-form threads and forum posts, captured immutably with per-post anchors.
Why: named in the design notes as the case that proves the slug-keyed ledger generalizes.
UG-13
Structural queries over the derived graph
Answer the questions traversal cannot answer: concepts citing a single source that sit
in two clusters, orphan clusters, entities with no implementing concept, all without
introducing a graph database.
Why: the export exists precisely so a real query tool can answer these; today the answer is "load the whole export into a model context", which stops scaling eventually.
UG-14
ugraph taxonomy
Inspect, extend and validate the closed vocabulary from the CLI, with a migration path when a domain is renamed.
Why: the taxonomy is a closed set the linter enforces, so editing it by hand is the one place a user can silently invalidate every page at once.
UG-15
ugraph publish — static site export of a KB
Render a knowledge base as a linked static site, with transcript deep links intact.
Why: a KB that only its author can read wastes the work; relative markdown links already map onto a static site with no rewriting.
UG-16
Windows and a full CI matrix
Verify POSIX-separated page identity, path resolution and the raw-tree exclusion on Windows, across supported Python versions.
Why: a page's identity is a POSIX-separated relative path by design; that guarantee is asserted in code but never yet run on the platform it protects against.
Under consideration
5 items
Each has an unresolved design question that has to be answered before it can be scheduled. Listed so the question is visible, not to imply it is coming.
UG-17
Source drift detection
Notice when a source changes after extraction (a re-uploaded video, an edited post) and marks every page citing it for review.
Open question: a transcript is declared immutable. Does a changed upstream produce a second immutable capture, or invalidate the first?
UG-18
Non-English sources and translated quotes
Ingest a non-English transcript and carry provenance through a translation.
Open question: a translated quote is by definition not a literal substring of its source, which is the one check the format refuses to weaken.
UG-19
More extraction backends
Additional API providers behind the same Backend interface.
Open question: extraction output is machine-checked, so provider choice barely affects quality. Is the maintenance worth it beyond the two that exist?
UG-20
Team mode — review workflow on Phase B
Multiple contributors proposing and reviewing canonicalization decisions.
Open question: pull requests on a markdown repository may already be the whole feature. Anything more has to earn its complexity against that.
UG-21
Obsidian plugin surface
Run the gates and read the ledger from inside the vault the KB often lives in.
Open question: the format's premise is that a plain filesystem is enough. A plugin risks making one editor the privileged way in, the exact dependency the wikilink rule exists to prevent.
Explicitly not doing
3 items
Recorded so the same proposals do not get relitigated. Each is a decision, not a gap.
NO-01
An authoritative graph database
The graph export stays derived and disposable; markdown stays the source of truth.
Why not: a second system in the loop drifts from the files, needs its own migration story, and turns git diff into something unreadable. Regenerating the export costs milliseconds.
NO-02
Embeddings and chunk retrieval
No vector store, no chunking, no top-k.
Why not: the format's whole bet is that an index plus typed links you can read and fix beats a similarity score you cannot inspect.
NO-03
Auto-repairing transcripts
verify reports; it never rewrites.
Why not: machine captions carry real disfluencies and mistranscriptions. Normalizing them away destroys the evidence the checker exists to protect.
Shipped, not planned.
The changelog is the other half of this page: exactly what exists today, and the reasoning behind the decisions that got it here.