Inspiration

Each project has its own graveyard: WhatsApp thread, meeting transcriptions, voice notes, PDFs, screenshots, Git commits, Jira tickets etc. If someone joins a project after it has been going on, or if someone joins mid-project, the only way to find out what's really happening is to re-read the entire project to answer this question: What is the current actual state of the project? That's when Threadline came from — not when all the projects were like that, but when one of you gave up half way through re-reading a 400-message WhatsApp thread because of this.

What it does

Threadline reads a disorganized collection of project artifacts and acts like a detective, rather than a search index. It:

  • Routes and categorizes all artifacts (documents, conversations, media) to a special agent
  • Is able to summarize events, decisions, persons and tasks in the form of structured, source-referenced statements
  • Uses multiple sources to create a project sequence
  • Finds inconsistencies between artifacts (JWT in architecture document, latest commit says firebase)
  • Preserves a Truth State for each fact (current / superseded / conflicting / unverified / and confidence score and supporting evidence).
  • Uses only the highest value clarification questions and recalls the answer for a lifetime
  • Adjusts knowledge when evidence is presented, without the need for the user to re-explain anything

How we built it

  • Backend: Docker, Dockerized API, NextJS API, TypeScript, NextJS
  • Backend: Python, FastAPI
  • Agent orchestration: Google Agent Development Kit (ADK) routes artifacts to Document/Chat/Multimodal agents, feeds an Evidence Extraction stage into Timeline, Decision and Contradiction agents, which converge on a deterministic Truth Engine
  • Different AI models: Gemini 3.5 Flash for classification, extraction, summarization (and cost-conscious default); Gemini 3.5 Pro for complexity contradiction analysis for final reasoning
  • Infrastructure: Cloud Run for backend, Firestore for persistent project state (artifacts, events, decisions, contradictions, memory, agent runs), Cloud Storage for uploaded artifacts

A conscious design decision: The Truth Engine itself doesn't call LLM. It's a deterministic state machine that determines if the evidence adds to the confidence about an existing claim, whether it supersedes an old claim, or whether it's a conflict — the project's source of truth isn't up to a model's fancy. We experimented with letting Gemini decide the claim status outright, and on a single test run, it changed the claim status of a fact twice when we gave it two messages of similar wording, so we extracted the decision logic and implemented it as a plain state-machine.

Issues that arose during the challenges:

To be replaced with one actual incident. Suggested shape, delete if not applicable: "The first version of the contradiction detector had a false positive rate that we had not anticipated: Three different messages that paraphrased the same decision were treated as three different, conflicting decisions. We [fixed it by / worked around it by / didn't finish solving it by submission, but /...]".

Confidence is not 100% confident; the Truth Engine gives the content a number, but by the time it was submitted, it was still partly a matter of judgement where "unverified" was deemed to have become "current.

Things we did well we're proud of:

For example, one moment, not a list of categories. Suggested shape: "When it correctly reported the JWT-vs-Firebase paradox, on the first actual use, without me having to tune that example in, it really became a script that works.

What we learned

Still not certain of the line between what the LLM is doing and what the state machine is doing — we've drawn it one way for this build, and it has worked, but we've seen arguments for drawing it differently.

What's next

  • Improve the understanding of audio/visual content beyond the "modes" of a single media type (e.g., richer understanding of video and audio content).
  • Multiple team corrections for the same row, each with a different true value, but we're not sure that should be automatically done at a team level — maybe it should be at a row level, and then some sort of "consensus" reached by the team;
  • A feature that provides a summary of the changes that occurred on the site since the last visit.

Built With

  • cloud-run
  • cloudstorage
  • fastapi
  • firestore
  • framer-motion
  • gemini-3.5-flash
  • gemini-3.5-pro
  • google-adk
  • next.js
  • python
  • shadcn/ui
  • tailwind-css
  • typescript
Share this project:

Updates

Submission history