<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Om singh Jadon</title>
    <description>The latest articles on DEV Community by Om singh Jadon (@om2412).</description>
    <link>https://dev.to/om2412</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4191716%2F962dd74c-62c6-4d77-9f66-8a3fe138cf18.png</url>
      <title>DEV Community: Om singh Jadon</title>
      <link>https://dev.to/om2412</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/om2412"/>
    <language>en</language>
    <item>
      <title>A Resolved Task Is Not a Resolved Case: Building ReturnTrail with FalkorDB</title>
      <dc:creator>Om singh Jadon</dc:creator>
      <pubDate>Sun, 18 Oct 2026 08:11:48 +0000</pubDate>
      <link>https://dev.to/om2412/a-resolved-task-is-not-a-resolved-case-building-returntrail-with-falkordb-1njg</link>
      <guid>https://dev.to/om2412/a-resolved-task-is-not-a-resolved-case-building-returntrail-with-falkordb-1njg</guid>
      <description>&lt;p&gt;Two records. One failed pickup. Two different explanations.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Pickup cancelled by customer.”&lt;/p&gt;

&lt;p&gt;“Pickup failed because the courier was unavailable.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you have ever contacted support about a failed return pickup, you can probably imagine the next question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which explanation should I trust?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We built &lt;strong&gt;ReturnTrail&lt;/strong&gt; for &lt;strong&gt;WeMakeDevs × FalkorDB Graph Hacks&lt;/strong&gt; to explore a more useful starting point: connect the records, preserve their original words, and show what still needs clarification.&lt;/p&gt;

&lt;p&gt;I’m &lt;strong&gt;Om Singh Jadon&lt;/strong&gt;, and my teammate is &lt;strong&gt;Ajeet Gadekar&lt;/strong&gt;. Together, we are &lt;strong&gt;Code101 from India&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Our biggest lesson was this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Marking a follow-up task as resolved does not mean the entire case is resolved—especially when new evidence arrives.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🎬 Watch the working project
&lt;/h2&gt;

&lt;p&gt;The walkthrough shows the original conflicting records, their graph connections, an AI investigation, a manual task outcome, and a fresh review after another source is added.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/5lfysyQZOO0" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🚀 &lt;a href="https://returntrail-api.onrender.com" rel="noopener noreferrer"&gt;Try ReturnTrail&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 &lt;a href="https://github.com/OM2412/ReturnTrail" rel="noopener noreferrer"&gt;Explore the source code and setup&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;▶️ &lt;a href="https://youtu.be/5lfysyQZOO0" rel="noopener noreferrer"&gt;Watch directly on YouTube&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The problem we chose
&lt;/h2&gt;

&lt;p&gt;ReturnTrail helps a shopper prepare an evidence-linked support conversation about a disputed return pickup.&lt;/p&gt;

&lt;p&gt;The difficult part is often reconstructing the context:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do two statements describe the same pickup attempt?&lt;/li&gt;
&lt;li&gt;Which document recorded each claim?&lt;/li&gt;
&lt;li&gt;What did an earlier support explanation actually cover?&lt;/li&gt;
&lt;li&gt;Does that explanation still cover the records after another document arrives?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our output is a reviewable case brief containing original claims, source connections, follow-up questions, and the history of manual explanations.&lt;/p&gt;

&lt;p&gt;The current prototype uses &lt;strong&gt;four fictional practice cases and bounded fictional text additions&lt;/strong&gt;. We have not measured real-world dispute outcomes or validated commercial demand.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwk04ez3c94260o7hefun.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwk04ez3c94260o7hefun.webp" alt="ReturnTrail practice workspace showing two original sources and a pending pickup question" width="800" height="667"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Product capture using fictional records and a local FalkorDB instance. Case API responses were not mocked for this capture.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the pickup attempt belongs in the graph
&lt;/h2&gt;

&lt;p&gt;An order can have more than one pickup attempt.&lt;/p&gt;

&lt;p&gt;A customer cancellation on Monday and an unavailable courier on Wednesday do not necessarily contradict each other. Comparing the text without connecting it to the correct attempt could produce a misleading finding.&lt;/p&gt;

&lt;p&gt;Our graph connects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A case to its order, item, and return request.&lt;/li&gt;
&lt;li&gt;Each pickup attempt to its return request.&lt;/li&gt;
&lt;li&gt;Each statement to the pickup it describes.&lt;/li&gt;
&lt;li&gt;Each statement to the document that recorded it.&lt;/li&gt;
&lt;li&gt;Each follow-up action to its reviewed documents.&lt;/li&gt;
&lt;li&gt;Each manual clarification to its follow-up action.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For &lt;strong&gt;CASE-001&lt;/strong&gt;, the two conflicting statements both describe &lt;strong&gt;PICKUP-001&lt;/strong&gt;. That shared connection makes the comparison relevant.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CASE-002&lt;/strong&gt; demonstrates the opposite: different explanations refer to separate attempts, so the supported rule does not flag them as a same-attempt disagreement.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Cypher behind the evidence
&lt;/h2&gt;

&lt;p&gt;Here is the evidence query documented in our repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cypher"&gt;&lt;code&gt;&lt;span class="k"&gt;MATCH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="py"&gt;c:&lt;/span&gt;&lt;span class="k"&gt;Case&lt;/span&gt; &lt;span class="ss"&gt;{&lt;/span&gt;&lt;span class="py"&gt;id:&lt;/span&gt;&lt;span class="n"&gt;$caseId&lt;/span&gt;&lt;span class="ss"&gt;})&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ss"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;:HAS_ORDER&lt;/span&gt;&lt;span class="ss"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="py"&gt;o:&lt;/span&gt;&lt;span class="k"&gt;Order&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ss"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;:CONTAINS&lt;/span&gt;&lt;span class="ss"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="py"&gt;i:&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;MATCH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ss"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;:HAS_RETURN&lt;/span&gt;&lt;span class="ss"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="py"&gt;r:&lt;/span&gt;&lt;span class="n"&gt;ReturnRequest&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ss"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;:RETURNS&lt;/span&gt;&lt;span class="ss"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;MATCH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="py"&gt;p:&lt;/span&gt;&lt;span class="n"&gt;PickupAttempt&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ss"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;:ATTEMPTS&lt;/span&gt;&lt;span class="ss"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;MATCH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="py"&gt;s:&lt;/span&gt;&lt;span class="n"&gt;SupportStatement&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ss"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;:ABOUT&lt;/span&gt;&lt;span class="ss"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;MATCH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ss"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;:RECORDED_IN&lt;/span&gt;&lt;span class="ss"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="py"&gt;d:&lt;/span&gt;&lt;span class="n"&gt;EvidenceDocument&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;RETURN&lt;/span&gt; &lt;span class="k"&gt;DISTINCT&lt;/span&gt; &lt;span class="n"&gt;c.id&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;caseId&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="n"&gt;o.id&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;orderId&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i.id&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;itemId&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;r.id&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;returnId&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p.id&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;pickupId&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s.id&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;statementId&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;s.claimedStatus&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;claimedStatus&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s.text&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;statement&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;d.id&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;evidenceId&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d.sourceType&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;sourceType&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;evidenceId&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="n"&gt;statementId&lt;/span&gt;&lt;span class="ss"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The backend selects the authorized workspace graph and binds the case ID.&lt;/p&gt;

&lt;p&gt;Both ownership paths—through the order/item and through the return/item—must match. Matching an identifier alone does not grant access to another workspace.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FalkorDB supplies the evidence traversal and stored workflow context. Java applies explicit rules to the returned records.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The visible graph proof comes from executed queries. Our animated 3D parcel experience illustrates the story separately.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/OM2412/ReturnTrail/blob/main/docs/GRAPH-QUERIES.cypher" rel="noopener noreferrer"&gt;Explore the graph queries →&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What an earlier explanation actually covers
&lt;/h2&gt;

&lt;p&gt;Our most useful design decision was connecting each saved action to the documents it reviewed:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Case → Action → REFERENCES → EvidenceDocument&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;A manual reply is linked through:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Action → HAS_CLARIFICATION → ClarificationRecord&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This lets us ask a more precise question than “Was the task resolved?”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does the reviewed source set, including its evidence revision, match the current source set?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Coverage requires:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A nonempty current source set.&lt;/li&gt;
&lt;li&gt;Matching evidence IDs.&lt;/li&gt;
&lt;li&gt;A matching evidence revision.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Suppose a task reviewed DOC-001 and DOC-002. A user records a manual explanation and resolves that task.&lt;/p&gt;

&lt;p&gt;Then DOC-003 arrives.&lt;/p&gt;

&lt;p&gt;The earlier task remains resolved in history, but it did not review DOC-003. The application makes that boundary visible and can prepare a fresh follow-up for the updated source set.&lt;/p&gt;

&lt;p&gt;We preserve the earlier record instead of rewriting it as though it had reviewed information that did not exist yet.&lt;/p&gt;

&lt;p&gt;A matching source set still does not independently verify a manual explanation. It establishes the explanation’s recorded context.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/OM2412/ReturnTrail/blob/main/backend/src/main/java/com/returntrail/investigation/ContextCoverage.java" rel="noopener noreferrer"&gt;Read the ContextCoverage implementation →&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Context lab: preview how the evidence changes the question
&lt;/h2&gt;

&lt;p&gt;Context lab lets a user temporarily set aside one source and inspect the result.&lt;/p&gt;

&lt;p&gt;For CASE-001, excluding DOC-001 leaves only the courier-unavailable claim. Our bounded disagreement rule no longer has two conflicting reasons to compare.&lt;/p&gt;

&lt;p&gt;The application runs a &lt;strong&gt;parameterized, read-only graph query&lt;/strong&gt; with a source exclusion. It returns the remaining connections and evaluates that result.&lt;/p&gt;

&lt;p&gt;Original records and saved tasks stay unchanged.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foa8hhzx06lwaghw79y05.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foa8hhzx06lwaghw79y05.webp" alt="Context lab showing the full source set beside a preview excluding DOC-001" width="800" height="556"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This preview does not establish that the excluded document is false or that the remaining claim is true.&lt;/p&gt;

&lt;p&gt;It shows how the available evidence changes the supported next question.&lt;/p&gt;

&lt;p&gt;CASE-004 extends the demonstration: add a reviewed fictional source to a case with an earlier manual reply, then inspect the changed coverage.&lt;/p&gt;

&lt;h2&gt;
  
  
  The agent’s job is bounded
&lt;/h2&gt;

&lt;p&gt;Our Spring Boot backend exposes four investigation tools:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;get_case_evidence&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;get_case_clarifications&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;get_case_findings&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;prepare_followup_action&lt;/code&gt;, when a finding is pending&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The AI workflow must retrieve current evidence and saved context before proceeding to findings and a local follow-up action.&lt;/p&gt;

&lt;p&gt;The backend enforces the sequence and renders the final report from tool results.&lt;/p&gt;

&lt;p&gt;The model does not generate arbitrary Cypher or determine who caused the failed pickup. These are application tool calls; we did not build an MCP server.&lt;/p&gt;

&lt;p&gt;We also provide &lt;strong&gt;Review rules &amp;amp; prepare question&lt;/strong&gt;, which performs the deterministic workflow without a model request.&lt;/p&gt;

&lt;p&gt;Users can record an explicit manual outcome, inspect the history, and export a fresh brief.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No support message is sent automatically, and no refund is issued.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Designed for people who do not know graph databases
&lt;/h2&gt;

&lt;p&gt;The interface uses familiar language:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Evidence:&lt;/strong&gt; read the original words.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connections:&lt;/strong&gt; understand which records belong together.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context lab:&lt;/strong&gt; preview how a source changes the assessment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Investigation:&lt;/strong&gt; inspect findings and completed tool results.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Follow-up tasks:&lt;/strong&gt; record a manual outcome.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Case brief:&lt;/strong&gt; export the information for a support conversation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;History:&lt;/strong&gt; see what changed and when.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Guest access lets someone explore immediately. Optional Google and GitHub sign-in provide account entry.&lt;/p&gt;

&lt;p&gt;We used a playful parcel theme, animated connections, and a lamp-inspired sign-in page, while keeping the source text and task states explicit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Our stack
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Technology and role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Frontend&lt;/td&gt;
&lt;td&gt;React and Vite for the interface&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backend&lt;/td&gt;
&lt;td&gt;Java and Spring Boot for APIs, authorization, rules, and workflow enforcement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Graph database&lt;/td&gt;
&lt;td&gt;FalkorDB for connected evidence and saved task/reply context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;Groq with &lt;code&gt;openai/gpt-oss-120b&lt;/code&gt; for the constrained tool-calling investigation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployment&lt;/td&gt;
&lt;td&gt;Combined frontend/backend on Render, with FalkorDB Cloud&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The graph is central to retrieving evidence and understanding what a saved explanation covered.&lt;/p&gt;

&lt;p&gt;Removing it removes those traversals and the stored source/task/reply connections.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we tested—and what those tests establish
&lt;/h2&gt;

&lt;p&gt;We tested distinctions that could otherwise produce misleading behavior: same versus different attempts, unknown reasons, changed source context, stale writes, and workspace isolation.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Recorded check&lt;/th&gt;
&lt;th&gt;Scope&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;93 backend tests successful; 2 skipped&lt;/td&gt;
&lt;td&gt;Hosted default suite at commit &lt;code&gt;275fb37&lt;/code&gt;; zero failures or errors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14 frontend tests passed&lt;/td&gt;
&lt;td&gt;Domain, draft, and public-video input boundaries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Five public API workflow groups passed&lt;/td&gt;
&lt;td&gt;Hosted application and external FalkorDB; synthetic writes, history, retries, version protection, and guest isolation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One real hosted AI investigation passed&lt;/td&gt;
&lt;td&gt;Four model requests, all four required tools in order, and one OPEN local follow-up&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Our &lt;a href="https://github.com/OM2412/ReturnTrail/blob/main/docs/PUBLIC-VALIDATION.md" rel="noopener noreferrer"&gt;validation record&lt;/a&gt; separates mocked contracts, actual graph checks, and the hosted model request.&lt;/p&gt;

&lt;p&gt;The twenty labelled synthetic rule fixtures are a regression set, &lt;strong&gt;not a real-world accuracy benchmark&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  A deployment lesson: readiness has a limited meaning
&lt;/h2&gt;

&lt;p&gt;When we enabled OAuth providers, the graph readiness endpoint stayed UP while the homepage returned HTTP 500.&lt;/p&gt;

&lt;p&gt;The authorization resolver was treating an ordinary page path as a possible provider path. At the root URL, this produced an empty registration ID.&lt;/p&gt;

&lt;p&gt;We reproduced the exception, restricted lookup to OAuth authorization routes, and added three regression tests.&lt;/p&gt;

&lt;p&gt;That changed our release check: we verify the homepage, sign-in shell, provider redirects, and a fresh guest workflow alongside database readiness.&lt;/p&gt;

&lt;p&gt;The free preview also has session and data-retention limits. It is intended for fictional evaluation data; exporting a brief remains useful.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/OM2412/ReturnTrail/blob/main/docs/DEPLOYMENT.md" rel="noopener noreferrer"&gt;Read the deployment boundaries →&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Try the part that changes the next action
&lt;/h2&gt;

&lt;p&gt;Open &lt;a href="https://returntrail-api.onrender.com" rel="noopener noreferrer"&gt;ReturnTrail&lt;/a&gt; as a guest and start with CASE-001:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Compare the original claims in &lt;strong&gt;Evidence&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Inspect their source paths in &lt;strong&gt;Connections&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Set aside a source in &lt;strong&gt;Context lab&lt;/strong&gt; and compare the assessment.&lt;/li&gt;
&lt;li&gt;Prepare a question and record a fictional manual outcome.&lt;/li&gt;
&lt;li&gt;Add a reviewed fictional source through &lt;strong&gt;Evidence inbox&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Inspect the changed coverage and review the updated evidence.&lt;/li&gt;
&lt;li&gt;Export the &lt;strong&gt;Case brief&lt;/strong&gt; and inspect &lt;strong&gt;History&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then try CASE-002 and CASE-004.&lt;/p&gt;

&lt;p&gt;The useful outcome is whether the connected context supports another question—and which sources make that question necessary.&lt;/p&gt;

&lt;h2&gt;
  
  
  What comes next
&lt;/h2&gt;

&lt;p&gt;We want to observe nontechnical users completing this workflow and speak with support operators about the information they need.&lt;/p&gt;

&lt;p&gt;Those observations should guide the next version before we claim that ReturnTrail saves time or fits a real support process.&lt;/p&gt;

&lt;p&gt;The lesson we are taking forward is specific:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A saved answer needs a record of the evidence it covered. When that evidence changes, the application should make the boundary visible.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;Built by &lt;strong&gt;Om Singh Jadon&lt;/strong&gt; and &lt;strong&gt;Ajeet Gadekar&lt;/strong&gt;, &lt;strong&gt;Team Code101, India&lt;/strong&gt;, for &lt;strong&gt;&lt;a href="https://www.wemakedevs.org/hackathons/falkordb" rel="noopener noreferrer"&gt;WeMakeDevs × FalkorDB Graph Hacks&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Track:&lt;/strong&gt; Agents That Act on Connected Data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Connect with us
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Om Singh Jadon:&lt;/strong&gt; &lt;a href="https://github.com/OM2412" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;a href="https://www.linkedin.com/in/om-singh-jadon-b92679314/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ajeet Gadekar:&lt;/strong&gt; &lt;a href="https://github.com/AjeetGadekar" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;a href="https://www.linkedin.com/in/ajeet-gadekar-1b5692363/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Explore:&lt;/strong&gt; &lt;a href="https://returntrail-api.onrender.com" rel="noopener noreferrer"&gt;Live application&lt;/a&gt; · &lt;a href="https://youtu.be/5lfysyQZOO0" rel="noopener noreferrer"&gt;Demo video&lt;/a&gt; · &lt;a href="https://github.com/OM2412/ReturnTrail" rel="noopener noreferrer"&gt;Repository&lt;/a&gt; · &lt;a href="https://github.com/OM2412/ReturnTrail/blob/main/docs/GRAPH-QUERIES.cypher" rel="noopener noreferrer"&gt;Cypher queries&lt;/a&gt;&lt;/p&gt;

</description>
      <category>java</category>
      <category>falkordb</category>
      <category>showdev</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
