<?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: Arnav Goyal</title>
    <description>The latest articles on DEV Community by Arnav Goyal (@arnav_goyal_9fc2c4d6e4295).</description>
    <link>https://dev.to/arnav_goyal_9fc2c4d6e4295</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%2F4219811%2F8266167d-c8d8-4b19-95dc-20f217e40b00.png</url>
      <title>DEV Community: Arnav Goyal</title>
      <link>https://dev.to/arnav_goyal_9fc2c4d6e4295</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/arnav_goyal_9fc2c4d6e4295"/>
    <language>en</language>
    <item>
      <title># 216 Tests Passed, but Our GitHub Build Failed: Lessons From Our First Security Hackathon</title>
      <dc:creator>Arnav Goyal</dc:creator>
      <pubDate>Sun, 01 Nov 2026 00:52:50 +0000</pubDate>
      <link>https://dev.to/arnav_goyal_9fc2c4d6e4295/-216-tests-passed-but-our-github-build-failed-lessons-from-our-first-security-hackathon-359n</link>
      <guid>https://dev.to/arnav_goyal_9fc2c4d6e4295/-216-tests-passed-but-our-github-build-failed-lessons-from-our-first-security-hackathon-359n</guid>
      <description>&lt;p&gt;This is a submission for the &lt;a href="https://dev.to/mlh-hackathon"&gt;MLH x DEV Writing Challenge&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Imagine spending hours building a project, fixing bugs, and finally seeing all 216 tests pass.&lt;/p&gt;

&lt;p&gt;You feel like everything is ready.&lt;/p&gt;

&lt;p&gt;Then you open GitHub and see a red cross next to your pull request.&lt;/p&gt;

&lt;p&gt;That happened to us while building pkgtruth at Hacktoberfest Hack Day 2026, hosted at Rishihood University, Sonipat.&lt;/p&gt;

&lt;p&gt;And surprisingly, it became one of the most useful parts of the experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it started
&lt;/h2&gt;

&lt;p&gt;Our team, Commit-tee, was working on a software supply chain security problem.&lt;/p&gt;

&lt;p&gt;The task was to build a tool that could compare published software packages with their original source code.&lt;/p&gt;

&lt;p&gt;At first, the idea sounded straightforward.&lt;/p&gt;

&lt;p&gt;Take two versions of the code, compare them, and report the differences.&lt;/p&gt;

&lt;p&gt;But as we started exploring Python packages, we realized there was much more to it.&lt;/p&gt;

&lt;p&gt;A published Python wheel is not always identical to the source repository. Some differences are expected because of the packaging process, while others could introduce security risks.&lt;/p&gt;

&lt;p&gt;So the real challenge wasn't just finding differences.&lt;/p&gt;

&lt;p&gt;It was understanding which differences actually mattered.&lt;/p&gt;

&lt;h2&gt;
  
  
  Turning an idea into a working tool
&lt;/h2&gt;

&lt;p&gt;We called our project &lt;em&gt;pkgtruth&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Our goal was to build something developers could actually use, not just a demonstration that worked with one example.&lt;/p&gt;

&lt;p&gt;We created a Python analysis engine and connected it to two interfaces.&lt;/p&gt;

&lt;p&gt;One was a command line tool for developers who prefer working in a terminal.&lt;/p&gt;

&lt;p&gt;The other was a browser interface where users could investigate packages and explore reports.&lt;/p&gt;

&lt;p&gt;Over time, we added more features.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Release DNA&lt;/em&gt; lets users compare different releases and see what changed.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Proof Capsule&lt;/em&gt; generates a report containing the evidence collected during an investigation.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Release Gate&lt;/em&gt; evaluates the findings using configurable security rules.&lt;/p&gt;

&lt;p&gt;We also integrated a local Qwen model through Ollama to help explain technical findings in simpler language.&lt;/p&gt;

&lt;p&gt;One thing we were careful about was not allowing AI to change the actual security results.&lt;/p&gt;

&lt;p&gt;The analysis engine finds the evidence. AI only helps explain it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the small details mattered
&lt;/h2&gt;

&lt;p&gt;One of our biggest challenges was making the reports understandable.&lt;/p&gt;

&lt;p&gt;A tool might correctly identify a modified Python file, but what does that tell someone who doesn't know much about package security?&lt;/p&gt;

&lt;p&gt;Should they be worried?&lt;/p&gt;

&lt;p&gt;Was the change expected?&lt;/p&gt;

&lt;p&gt;Could it affect what happens when the package is installed?&lt;/p&gt;

&lt;p&gt;We wanted our reports to answer these questions without making claims we couldn't prove.&lt;/p&gt;

&lt;p&gt;For example, detecting a potentially executable ⁠ .pth ⁠ file is important, but it doesn't automatically mean the package is malicious.&lt;/p&gt;

&lt;p&gt;Similarly, a valid package RECORD file doesn't guarantee that the package came from a trustworthy publisher.&lt;/p&gt;

&lt;p&gt;We learned that building a security tool isn't only about detecting problems.&lt;/p&gt;

&lt;p&gt;It's also about explaining uncertainty.&lt;/p&gt;

&lt;h2&gt;
  
  
  The moment our tests weren't enough
&lt;/h2&gt;

&lt;p&gt;Near the end, we ran our Python test suite.&lt;/p&gt;

&lt;p&gt;216 tests passed.&lt;/p&gt;

&lt;p&gt;We checked the web application, command line interface, and package installation.&lt;/p&gt;

&lt;p&gt;Everything looked good.&lt;/p&gt;

&lt;p&gt;We committed our changes and opened a pull request on GitHub.&lt;/p&gt;

&lt;p&gt;Then our automated CI check failed.&lt;/p&gt;

&lt;p&gt;At first, that was frustrating because the same project had passed every test locally.&lt;/p&gt;

&lt;p&gt;After checking the GitHub Actions logs, we found the reason.&lt;/p&gt;

&lt;p&gt;Our application generates example security reports. During development, we had improved the report format and added information to the Release DNA output.&lt;/p&gt;

&lt;p&gt;But the example files committed to GitHub still contained the older output.&lt;/p&gt;

&lt;p&gt;GitHub regenerated those files, compared them with the committed versions, and detected a mismatch.&lt;/p&gt;

&lt;p&gt;The solution was simple once we understood the problem.&lt;/p&gt;

&lt;p&gt;We regenerated the examples, reviewed the changes, committed the updated files, and pushed them to GitHub.&lt;/p&gt;

&lt;p&gt;The next CI run passed.&lt;/p&gt;

&lt;p&gt;It taught us something important.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A project isn't finished just because the code works on your own laptop.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It should also build, install, and behave consistently in another environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we learned about building software
&lt;/h2&gt;

&lt;p&gt;Before this project, it was easy to think of software development mainly as writing code and getting the expected output.&lt;/p&gt;

&lt;p&gt;But pkgtruth involved much more.&lt;/p&gt;

&lt;p&gt;We had to think about how users interact with the tool, how errors are reported, how files are handled safely, and how different parts of the application communicate.&lt;/p&gt;

&lt;p&gt;We also used Git branches, pull requests, automated testing, and continuous integration throughout development.&lt;/p&gt;

&lt;p&gt;These things might sound less exciting than adding a new feature, but they made the project much more reliable.&lt;/p&gt;

&lt;p&gt;Another lesson was that a simple interface can take just as much thought as a complicated algorithm.&lt;/p&gt;

&lt;p&gt;We spent time trying to turn technical findings into something a developer could understand in a few seconds.&lt;/p&gt;

&lt;p&gt;And that effort was worth it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is pkgtruth finished?
&lt;/h2&gt;

&lt;p&gt;Not completely.&lt;/p&gt;

&lt;p&gt;There are still plenty of things we'd like to improve.&lt;/p&gt;

&lt;p&gt;Right now, the project focuses on Python packages. In the future, we'd like to support more package ecosystems, improve release monitoring, and explore better ways to investigate suspicious changes.&lt;/p&gt;

&lt;p&gt;We also want to keep improving the experience for developers who are new to software security.&lt;/p&gt;

&lt;p&gt;For now, pkgtruth is an open source project with a working web interface, CLI, local AI explanations, and automated tests.&lt;/p&gt;

&lt;p&gt;And it has given us a much better understanding of what goes into building real software.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;Hackathons are often about building something quickly.&lt;/p&gt;

&lt;p&gt;But I think their biggest value is how much they force you to learn in a short period of time.&lt;/p&gt;

&lt;p&gt;You encounter problems you've never faced before, search for solutions, make mistakes, fix them, and gradually see everything come together.&lt;/p&gt;

&lt;p&gt;For us, pkgtruth was not just a project about Python package security.&lt;/p&gt;

&lt;p&gt;It was also a lesson in debugging, teamwork, software design, and writing code that other people can actually use.&lt;/p&gt;

&lt;p&gt;A big thanks to Hacktoberfest, Rishihood University, Newton School of Technology, and our team, &lt;em&gt;Commit-tee&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;If you're interested in checking out what we built, here's the repository:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;GitHub:&lt;/em&gt; &lt;a href="https://github.com/k3tan7/pkgtruth" rel="noopener noreferrer"&gt;https://github.com/k3tan7/pkgtruth&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And one final lesson from the experience:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Getting your code to work is one achievement. Making it reliable is another.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mlh</category>
      <category>devchallenge</category>
      <category>hacktoberfest</category>
    </item>
  </channel>
</rss>
