<?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: lakshya agrawal</title>
    <description>The latest articles on DEV Community by lakshya agrawal (@secuvortex).</description>
    <link>https://dev.to/secuvortex</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%2F4161584%2F0d097bd4-f13e-422f-bf73-60607206743d.png</url>
      <title>DEV Community: lakshya agrawal</title>
      <link>https://dev.to/secuvortex</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/secuvortex"/>
    <language>en</language>
    <item>
      <title>A Digest Quality Score That Knows What It Can't Prove</title>
      <dc:creator>lakshya agrawal</dc:creator>
      <pubDate>Tue, 27 Oct 2026 09:51:09 +0000</pubDate>
      <link>https://dev.to/secuvortex/a-digest-quality-score-that-knows-what-it-cant-prove-59h6</link>
      <guid>https://dev.to/secuvortex/a-digest-quality-score-that-knows-what-it-cant-prove-59h6</guid>
      <description>&lt;p&gt;This is a submission for the &lt;a href="https://dev.to/events/challenges/hacktoberfest-week4-2026-10-26"&gt;Hacktoberfest Open-Source AI Challenge: Week 4&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  A digest quality score that knows what it can't prove
&lt;/h1&gt;

&lt;p&gt;An AI-generated email digest can sound certain even when a summary, action, or deadline is not supported by the source. GistMyMail's v1 quality evaluator makes several checks explicit and repeatable. It is deterministic and does not ask an LLM to grade its own output. The score is diagnostic; it is not a guarantee of truth.&lt;/p&gt;

&lt;h2&gt;
  
  
  Project timeline and Week 4 scope
&lt;/h2&gt;

&lt;p&gt;GistMyMail's first repository commit is dated October 25, before Week 4 began on October 26. This is an existing project, not a new project started for this challenge. The work highlighted here is the digest-quality evaluator: a versioned rubric, deterministic source checks, per-item warnings, and a report attached to digest generation.&lt;/p&gt;

&lt;p&gt;The challenge asks for brand-new projects. This existing-project contribution may not meet that eligibility requirement, so I am stating the timeline plainly rather than implying that the whole product began during Week 4.&lt;/p&gt;

&lt;p&gt;The evaluator changes described below are currently in local working-tree changes and are not yet on the public GitHub branch. The repo link is included for project context; judges will need a checkout that contains the evaluator changes to inspect this feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the evaluator measures
&lt;/h2&gt;

&lt;p&gt;The initial weights are configurable design assumptions, not empirically calibrated values:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Q = 0.25C + 0.30F + 0.15A + 0.15D + 0.15I
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, C is source coverage, F is factual grounding, A is actionability, D is duplicate content, and I is information completeness. When a component is N/A or unavailable, its weight is excluded and the remaining applicable weights are renormalized. The report records the rubric version, component scores, counts, statuses, warnings, and source references.&lt;/p&gt;

&lt;h3&gt;
  
  
  Source coverage — 25%
&lt;/h3&gt;

&lt;p&gt;Coverage is the number of eligible account/message pairs represented in at least one digest item divided by the eligible pairs fetched for that digest. Pairs are captured before content deduplication, so two messages with identical content can both count even if one digest item is retained. Each pair has equal weight because the project has no reliable source-importance classification. The denominator covers only the bounded inbox query, not every message in a mailbox.&lt;/p&gt;

&lt;h3&gt;
  
  
  Factual grounding — 30%
&lt;/h3&gt;

&lt;p&gt;Each non-empty title, summary, action, and deadline is evaluated as a claim. A field is supported when its lowercase, whitespace-normalized text appears literally in a mapped email's subject, body, or snippet. A source ID alone is not evidence.&lt;/p&gt;

&lt;p&gt;This rule can miss correct paraphrases and can match words in a negated or qualified sentence. “Unsupported” means no literal match was found; it does not mean the claim is false. A literal match is not proof of semantic entailment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Actionability — 15%
&lt;/h3&gt;

&lt;p&gt;The denominator includes items in action-oriented categories and any item with an action. An applicable item passes when it has both a title and an action. This checks the item's shape, not whether the action is useful or appropriate.&lt;/p&gt;

&lt;h3&gt;
  
  
  Duplicate content — 15%
&lt;/h3&gt;

&lt;p&gt;The evaluator lowercases and collapses whitespace in the title, summary, action, and deadline fields. Items are duplicates only when all four normalized fields match; the lowest item ID is retained deterministically. This catches exact normalized duplicates, not semantic repetition.&lt;/p&gt;

&lt;h3&gt;
  
  
  Information completeness — 15%
&lt;/h3&gt;

&lt;p&gt;The evaluator checks required fields including title, summary, account label, sender, received time, source reference, Gmail URL, and evidence quote. Action and deadline fields apply when the item requires them. Required fields must be present and supported; unresolved source checks are excluded and make the metric partial.&lt;/p&gt;

&lt;p&gt;A metric with no applicable items is N/A, not 100. An empty digest with eligible messages gets zero coverage and a warning. Evaluation failures produce an unavailable report, never a perfect score. Synthetic demo data is marked partial.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it fits the digest lifecycle
&lt;/h2&gt;

&lt;p&gt;The scorer runs after digest generation using the messages and evidence already fetched. It does not call an LLM, read new mail, or send email. The report is persisted with the digest and returned by the existing digest API. Historical digests can still exist without a quality report.&lt;/p&gt;

&lt;p&gt;The dashboard currently shows the digest but does not render the quality breakdown. To inspect the report in this build, open browser Developer Tools, choose Network, generate a digest, and inspect the JSON response from &lt;code&gt;POST /api/digest/generate&lt;/code&gt; at &lt;code&gt;digest.qualityReport&lt;/code&gt;. The report's warnings and source references let a reviewer see why a claim was marked unsupported or unresolved.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo path
&lt;/h2&gt;

&lt;p&gt;There is no hosted demo link in the repository documentation today. The documented hands-on demo uses synthetic inboxes and does not require Gmail OAuth credentials or an AI API key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/SecuVortex/GistMyMail.git
&lt;span class="nb"&gt;cd &lt;/span&gt;GistMyMail
pnpm &lt;span class="nb"&gt;install
&lt;/span&gt;pnpm dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;code&gt;http://localhost:5173&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Try Demo Mode&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Generate Today's Digest&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;In Developer Tools → &lt;strong&gt;Network&lt;/strong&gt;, inspect the &lt;code&gt;POST /api/digest/generate&lt;/code&gt; response and expand &lt;code&gt;digest.qualityReport&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The demo report is marked partial because the inbox messages are synthetic. Do not use private emails in screenshots or recordings. These steps require a checkout containing the quality-evaluator changes described above; the public GitHub branch does not include those local changes yet. The &lt;a href="https://github.com/SecuVortex/GistMyMail/blob/main/docs/SETUP.md#step-6-explore-development-demo-mode" rel="noopener noreferrer"&gt;setup guide&lt;/a&gt; documents the existing demo flow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why open innovation matters here
&lt;/h2&gt;

&lt;p&gt;GistMyMail supports open-weight models through OpenRouter and local inference through Ollama. The quick demo uses deterministic mock data so a judge can try the flow without sending email content to an external model. The quality evaluator itself is model-agnostic: its checks remain the same if the generation model changes.&lt;/p&gt;

&lt;p&gt;Keeping the rubric and its limitations inspectable lets contributors challenge the weights, test difficult cases, and compare future versions with the same deterministic rules. Local inference can keep email content on the user's machine. The project does not require one hosted model provider for the scoring feature to work.&lt;/p&gt;

&lt;p&gt;The “ghost in the machine” for this project is a plausible-sounding commitment that the source email does not support. The evaluator can expose some gaps, but it cannot decide whether a claim is semantically true.&lt;/p&gt;

&lt;h2&gt;
  
  
  Help make GistMyMail more useful
&lt;/h2&gt;

&lt;p&gt;Useful contributions include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add deterministic tests for negation, quoted text, paraphrases, and ambiguous deadlines.&lt;/li&gt;
&lt;li&gt;Review multi-inbox coverage, missing evidence, and excluded metrics.&lt;/li&gt;
&lt;li&gt;Build the dashboard breakdown and source-linked warning view.&lt;/li&gt;
&lt;li&gt;Improve setup, onboarding, and explanations of what the score does and does not prove.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Start at the &lt;a href="https://github.com/SecuVortex/GistMyMail" rel="noopener noreferrer"&gt;GistMyMail GitHub repository&lt;/a&gt;, open an &lt;a href="https://github.com/SecuVortex/GistMyMail/issues" rel="noopener noreferrer"&gt;issue&lt;/a&gt;, or send a pull request. For examples involving email, use synthetic or carefully redacted text—never publish private messages, addresses, or tokens.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/royalpinto007/making-llm-as-judge-scoring-reproducible-and-trustworthy-1aln"&gt;Making LLM-as-Judge Scoring Reproducible and Trustworthy&lt;/a&gt; by &lt;a href="https://dev.to/royalpinto007"&gt;@royalpinto007&lt;/a&gt; explores ways to stabilize model-based judging. This rubric takes a narrower route: fixed deterministic checks with no LLM judge.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/artur_woszczyk/i-built-a-deterministic-llm-evaluation-engine-without-an-llm-judge-15j9"&gt;I built a deterministic LLM evaluation engine without an LLM judge&lt;/a&gt; by &lt;a href="https://dev.to/artur_woszczyk"&gt;@artur_woszczyk&lt;/a&gt; is another example of making evaluation dimensions inspectable.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/nicholasflemmer/what-i-set-up-so-a-stranger-could-send-a-first-pull-request-8g"&gt;What I set up so a stranger could send a first pull request&lt;/a&gt; is a reminder to give contributors concrete ways to start.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I welcome issues and pull requests that make GistMyMail more accurate, accessible, and useful across inboxes.&lt;/p&gt;

</description>
      <category>hf26challenge</category>
      <category>opensource</category>
      <category>ai</category>
      <category>testing</category>
    </item>
    <item>
      <title>hello everyone</title>
      <dc:creator>lakshya agrawal</dc:creator>
      <pubDate>Sun, 04 Oct 2026 12:43:19 +0000</pubDate>
      <link>https://dev.to/secuvortex/hello-everyone-jdf</link>
      <guid>https://dev.to/secuvortex/hello-everyone-jdf</guid>
      <description>&lt;p&gt;new to the dev community &lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
