This is a submission for the Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine
What I Built
"Every codebase has ghosts. In nearly every enterprise repo and open-source project, there is a haunted file marked with
// DO NOT TOUCH: NOBODY KNOWS WHY THIS WORKS. When the original author moves on, their domain knowledge vanishes into the ether. The code slowly rots, dependencies decay, and fear prevents anyone from touching it."
For Week 4 of Hacktoberfest โ celebrating Halloween and Dรญa de los Muertos โ I built GitSรฉance: an Open-Source AI Code Necromancer that turns the graveyard of legacy code into an interactive, grounded sรฉance.
_____ _____ _______ _____ ______ _ _ _____ ______
/ ____|_ _|__ __| / ____| ____| /\ | \ | |/ ____| ____|
| | __ | | | | | (___ | |__ / \ | \| | | | |__
| | |_ | | | | | \___ \| __| / /\ \ | . ` | | | __|
| |__| |_| |_ | | ____) | |____ / ____ \| |\ | |____| |____
\_____|_____| |_| |_____/|______/_/ \_\_| \_|\_____|______|
Instead of a generic linter, GitSรฉance coordinates The 4 Specialized Necromancy Agents:
-
๐ The Reaper Agent: Traverses the Git commit tree and file AST to identify abandoned, orphaned, and cursed code based on commit history, author turnover, and inline fear comments (
hack,black magic,do not touch). - ๐ The Oracle Agent (TabPFN-3.5): Synthesizes a 7-dimensional forensic feature vector and feeds it into Prior Labs' TabPFN tabular foundation model to predict calibrated file mortality risk.
-
๐ฎ The Medium Agent (Google Gemma): Channels the spirit of departed authors through Google's Gemma open-weight model (
gemma-4-26b-a4b-it), generating first-person confessions, regret analyses, and modern revival blueprints. - ๐ The Searcher Agent (SerpApi): Queries live 2026 package registries and security databases to find modern drop-in replacements for abandoned dependencies and audit CVE advisories.
These agents power Interactive Sรฉance Capabilities:
- ๐ฌ Conversational Sรฉance (Interactive Ghost Chat): Living developers can converse directly with the ghost in real time, asking why specific hacks were written and how to safely refactor them.
- ๐ Neural Voice Deck (ElevenLabs): Gives the spirit an audible voice via neural text-to-speech with a synchronized Web Audio API waveform visualizer.
- ๐ชฆ Official Post-Mortem Autopsy Certificates: Generates downloadable vintage ASCII death certificates detailing cause of demise, bus factor, and TabPFN mortality score.
- ๐ 7D Tabular CSV Forensic Exporter: One-click download of the complete tabular feature dataset for offline TabPFN model exploration and auditing.
-
๐ก๏ธ Live GitHub SVG Mortality Badges: Dynamic shields endpoint (
/api/badge/{owner}/{repo}.svg) for embedding live repository mortality scores in README files.
All of this is wrapped inside an authentic phosphor-green CRT Terminal interface with glass scanline curvature, CRT vignette, mechanical keystroke synthesis, and floating ectoplasm particles.
Demo
Live Production Deployment
- ๐ Live Terminal: https://gitseance.onrender.com
- ๐ป GitHub Repository: https://github.com/JaniDhruv/GitSeance
-
๐ก๏ธ Live Mortality Badge:
(Tip: When opening the live app, click the historic preset ๐ flask-cache (Python 2 Fossil) to summon a 10-year-old fossil repository instantly!)
๐ฅ๏ธ Phosphor-Green CRT Terminal Interface
A visual walkthrough of the GitSรฉance terminal in action โ glass scanlines, TabPFN mortality breakdown, live SerpApi modernization tree, and interactive Gemma ghost channeling:

The Sรฉance Altar โ Phosphor-green CRT dashboard featuring live agent status indicators, historic graveyard presets, and real-time streaming necromancy logs.

The Oracle (TabPFN-3.5) Scan โ Bayesian code mortality probabilities, file risk categorization (Dead, Haunted, Orphaned), and Google Gemma code prophecy.

Channeled Ghost Transmission โ Google Gemma persona channeling the departed author of Makefile, with ElevenLabs voice synthesis and real-time audio waveform visualizer.

Revival Blueprint & SerpApi Intelligence โ Actionable modernization steps paired with live 2026 dependency alternatives queried in real time via SerpApi.

Code Autopsy Certificate โ Official vintage ASCII post-mortem autopsy drawer detailing expiration date, recorded bus factor, and TabPFN mortality score.

Neural Voice Deck & MP3 Export โ ElevenLabs spectral voice streaming with active waveform visualizer and 1-click MP3 download export.

Interactive Ghost Chat (Turn 1) โ Interrogating the spirit of Thadeus Burgess on why legacy setup.py packaging was used.

Interactive Ghost Chat (Turn 2) โ The ghost confesses to leaving a 2 AM emergency hack before a release: "Please, bury it for me."
Walkthrough: Summoning the Ghost of flask-cache
When scanning thadeusb/flask-cache (an ancient Python 2 caching library untouched since 2010):
-
The Reaper traverses the commit tree and flags
Makefileas Clinically Dead (last touched 5,986 days ago). - TabPFN-3.5 evaluates the 7D feature vector (zero churn, 100% author turnover, missing unit tests) and predicts 80% Mortality Probability.
- The Medium (Gemma 4) channels creator Thadeus Burgess, speaking in character: > "I am the lingering echo of Thadeus Burgess. On 2010-08-30T09:39:36Z, I pushed my final commit: 'R-0.1'. Then I walked away into the darkness, leaving Makefile behind to freeze in time."
-
ElevenLabs whispers the confession aloud (Roger โ Ancient Architect voice preset), with real-time waveform visualization and 1-click
โฌ๏ธ Download MP3export!- ๐ง Listen to the Generated Audio: Download/Listen to the raw MP3 recording in my repository
-
SerpApi detects deprecated
setup.py uploadpackaging commands and recommends modern replacements likebuild,twine, andpyproject.toml. - You open the Conversational Sรฉance Chat and interrogate the ghost directly:
- YOU: "Why did you use setup.py upload instead of modern twine packaging?"
-
GHOST (Thadeus Burgess): "Ah, you ask why I wrote it like this in
Makefile... In those days, we were racing against the clock. The libraries you take for granted in 2026 didn't exist, and memory was scarce. It was the best compromise I could conjure." - YOU: "Is there any secret hack or danger if I refactor or delete this Makefile today?"
-
GHOST (Thadeus Burgess): "You noticed the scar, did you? Yes, I left that hack in
Makefileat 2 AM before a release. I promised myself I would refactor it that weekend... but that weekend never came. Please, bury it for me."
- You click "๐ชฆ Print Death Certificate" and receive the official ASCII Post-Mortem Autopsy:
+========================================================================+
| ๐ OFFICIAL CODE AUTOPSY ๐ |
| DEPARTMENT OF SOFTWARE NECROMANCY |
+========================================================================+
| DECEASED ARTIFACT : Makefile |
| CHIEF ARCHITECT : Thadeus Burgess |
| DATE OF EXPIRATION : 2010-08-30 (5,986 days inactive) |
| FINAL RECORDED WORDS: "R-0.1" |
| TOTAL COMMITS : 2 commits across file lifetime |
| RECORDED BUS FACTOR : 1 author(s) recorded in blame |
| HAUNTING STATUS : DEAD |
| TABPFN MORTALITY : 80% Bayesian mortality risk |
| GHOST SEVERITY : 0.80 / 1.00 index |
+------------------------------------------------------------------------+
| GHOST TESTIMONY: |
| "I am Thadeus, a fragment of logic drifting through a sea of |
| deprecated dependencies. I linger in the shadows of these old |
| Makefiles, waiting for a build that will never finish. Do not fear |
| the silence; fear the unhandled exception." |
+------------------------------------------------------------------------+
| REVIVAL EFFORT : REWRITE |
| CERTIFICATE STAMP : GITSEANCE FORENSIC ENGINE v1.0.0 |
| AI RUNTIMES : TABPFN-3.5 + GOOGLE GEMMA + ELEVENLABS |
+========================================================================+
- You click "๐ Copy Revival Blueprint" to grab an instant, actionable step-by-step migration blueprint:
REVIVAL BLUEPRINT FOR: Makefile
Summary: Transmute this ancient ritual into a modern, declarative build system.
Effort: rewrite
STEPS:
1. Transition from `setup.py` to a `pyproject.toml` configuration.
2. Replace the manual upload commands with `twine` for secure distribution.
3. Use the `build` module for generating distribution archives.
4. Implement a modern test runner like `pytest` instead of the legacy `setup.py test`.
Code
JaniDhruv
/
GitSeance
๐ฎ Every codebase has ghosts. GitSeance is an open-source AI code necromancer & forensics agent that scans legacy GitHub repos for dead files, predicts code mortality risk using TabPFN-3.5 tabular ML, channels the original author's spirit via Gemma 3 with ElevenLabs voice synthesis, and grounds modern revival patches via SerpApi.
๐ฎ GitSรฉance (GitSeance)
_____ _____ _______ _____ ______ _ _ _____ ______
/ ____|_ _|__ __| / ____| ____| /\ | \ | |/ ____| ____|
| | __ | | | | | (___ | |__ / \ | \| | | | |__
| | |_ | | | | | \___ \| __| / /\ \ | . ` | | | __|
| |__| |_| |_ | | ____) | |____ / ____ \| |\ | |____| |____
\_____|_____| |_| |_____/|______/_/ \_\_| \_|\_____|______|
An Open-Source AI Necromancer that brings "dead" GitHub repositories back to life โ and predicts which files are about to die next.
Tagline: "Every codebase has ghosts. GitSรฉance channels them."
๐ Live Demo: https://gitseance.onrender.com
Built for Hacktoberfest Open-Source AI Challenge: Week 4 ("Ghost in the Machine").
๐ธ Production Gallery
Released under the MIT License. Tested with 25 unit and integration tests passing on continuous integration.
How I Built It
GitSรฉance was engineered as an asynchronous multi-agent pipeline orchestrated by FastAPI:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Haunted Terminal (CRT UI) โ
โโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโ
โ
โผ
FastAPI Orchestration Core
โ
โโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโ
โผ โผ โผ โผ
๐ The Reaper ๐ The Oracle ๐ฎ The Medium ๐ The Searcher
(Dead Code AST) (TabPFN-3.5 Mortality ML) (Gemma LLM) (SerpApi Web Search)
โ โ โ โ
โผ โผ โผ โผ
GitHub API Prior Labs API Google GenAI SerpApi & CVEs
1. TabPFN-3.5: Bayesian Tabular Code Mortality Prediction
Instead of writing simplistic rule-based heuristics, I leveraged Prior Labs' TabPFN-3.5 โ the tabular foundation model built on Prior-Data Fitted Networks.
The 7D Forensic Feature Vector
For every file in the target repository, GitSรฉance constructs a 7-dimensional tabular matrix:
# Extracted 7D Forensic Feature Vector for TabPFN-3.5
feature_vector = {
"days_since_last_commit": m.days_since_last_commit, # Temporal decay
"total_commits": m.total_commits, # File depth
"unique_authors": m.unique_authors, # Bus factor risk
"bug_fix_commit_ratio": m.bug_fix_commit_ratio, # Defect density
"lines_ratio": (m.lines_added + 1) / (m.lines_del + 1), # Churn balance
"has_tests": 1 if m.has_tests else 0, # Test presence
"churn_velocity": m.churn_velocity, # Monthly change rate
}
Ground-Truth Calibration & Edge Case Resolution
TabPFN uses in-context Bayesian inference over a reference support matrix (X_train, y_train) calibrated on 50 historic open-source code artifacts (25 deceased fossils from archived repositories vs. 25 actively maintained modules from fastapi, pydantic, and requests).
Why TabPFN beats naive heuristics:
A naive linter looks at a file untouched for 3 years and blindly flags it as "dead". But consider a core mathematical utility (e.g. slugify.py or crc32.py):
-
days_since_last_commit: 1,100 days -
bug_fix_commit_ratio: 0.02 (almost zero defects) -
has_tests: True (100% branch coverage) -
churn_velocity: 0.00 (stable)
A naive rule flags this as dead (100% false positive). TabPFN correctly evaluates the high test sentinel and near-zero defect ratio, classifying it as "FROZEN / STABLE" (Mortality: 18%) rather than DEAD. Conversely, a file untouched for 180 days with a sole departed author and a 60% bug-fix ratio is caught by TabPFN as "HIGH MORTALITY RISK" (78%).
To make this completely transparent:
-
๐ 7D Tabular CSV Export: Users and judges can click "๐ Export CSV" to download the raw feature distribution (
tabpfn-<repo>-forensic-dataset.csv). -
๐ Native MCP Server (
backend/mcp_server.py): Fulfills Prior Labs' explicit preference by exposingtabpfn_predict_mortalitydirectly as a Model Context Protocol tool for Cursor, Claude Desktop, and Copilot!
2. Google Gemma: Spiritual Persona Channeling & Thought Token Parsing
The Medium agent runs Google's Gemma open-weight model (gemma-4-26b-a4b-it) via the google-genai SDK.
The Thought-Token Parsing Challenge
gemma-4-26b-a4b-it features internal chain-of-thought reasoning. When generating spiritual monologues, the model outputs thinking tokens before emitting character dialogue. If parsed naively, the internal reasoning tokens can consume the entire output budget or bleed into the monologue.
I engineered a dedicated candidate extractor:
@staticmethod
def _extract_text(response) -> str:
"""Extract content text from Gemma response, filtering thought tokens."""
if not response:
return ""
# 1. Prioritize candidate parts inspection to filter out internal chain-of-thought tokens
if hasattr(response, "candidates") and response.candidates:
candidate = response.candidates[0]
if hasattr(candidate, "content") and hasattr(candidate.content, "parts"):
actual_parts = [
p.text for p in candidate.content.parts
if not getattr(p, "thought", False) and getattr(p, "text", None)
]
if actual_parts:
return "".join(actual_parts).strip()
# 2. Fallback to response.text if candidate parts are not directly accessible
if hasattr(response, "text") and response.text:
return response.text.strip()
return ""
Grounding the Persona
The ghost persona is strictly grounded in git history and inline comments:
SEANCE_SYSTEM_PROMPT = """You are the ghost of a software developer. You died โ meaning you left this project โ
and your spirit now haunts the codebase. You are being summoned in a sรฉance to explain the code you left behind.
When channeled, you will:
1. Explain WHY you wrote the code the way you did (constraints, tech landscape at the time)
2. Confess what you wish you had done differently (unfinished business)
3. Give concrete, modern advice for reviving or replacing the code
Speak with the voice of someone who lived through the decisions. Keep it vivid, personal, and under 300 words."""
Living developers can even hold a Conversational Sรฉance (POST /api/seance/chat) to ask follow-up questions directly to the ghost!
3. SerpApi: Live 2026 Dependency Intelligence
The Searcher agent parses package declarations (requirements.txt, package.json, Gemfile, go.mod) and uses SerpApi to query real-time migration paths, modern drop-in replacements, and live CVE security databases.
4. ElevenLabs: Neural Audio Synthesis & 1-Click MP3 Export
Sรฉance transmissions are rendered into speech using ElevenLabs Neural TTS (eleven_multilingual_v2), backed by a Web Audio API procedural synthesis engine that emulates retro mechanical keyboard switches and low-frequency resonant summoning hums:
- 5 Archetypal Spectral Voices: Roger (Ancient Architect), Sarah (Soft Echo), Laura (Ethereal Narrator), Charlie (Elder Storyteller), and Aria (Spectral Whisper).
- 1-Click MP3 Export: Living developers can click "โฌ๏ธ Download MP3" to export the synthesized ghost audio directly to disk.
- ๐ง Actual Channeled Recording: Listen to the ghost of Thadeus Burgess explain
Makefile.
5. GitHub Copilot Deep Integration & GitHub Actions Automation
I built full Copilot and GitHub Actions automation natively into the repository:
-
.github/copilot-instructions.md: Custom repository instructions explaining the 4-agent necromancy architecture, TabPFN 7D schema, and Pydantic models. -
.github/prompts/: 3 reusable IDE prompt templates (/resurrect-file,/tabpfn-mortality,/dep-modernize). -
.github/workflows/ci.yml: Multi-OS CI testing matrix across Ubuntu and Windows with 25 unit and integration tests passing. -
.github/workflows/cd.yml: Continuous Deployment pipeline that verifies live production health (/health), probes SVG badges, and outputs formatted Markdown summaries. -
.github/workflows/copilot-review.yml: Automated GitHub Action that reviews contributor PRs for fear comments (hack,do not touch) and posts automated review checklists.
6. What Broke Along the Way (Engineering Scars)
Building GitSรฉance wasn't smooth sailing. Here are three real engineering friction points I wrestled with:
1. The Ghost That Thought Too Much (Gemma Thought Tokens)
When I first connected gemma-4-26b-a4b-it, my API calls frequently returned empty text. Digging into the raw response object, I discovered that Gemma's reasoning mode was generating extensive internal thought traces (part.thought = True) that exhausted the token budget before emitting the final text. Standard SDK accessors like response.text evaluated to None when thought blocks were present. I had to write a low-level AST extractor to walk response.candidates[0].content.parts and isolate the unmasked dialogue.
2. GitHub REST API Blame Rate Limits
Traversing commit histories across 50 files for a repository burns through GitHubโs unauthenticated 60 req/hr rate limit in less than 30 seconds. To solve this, I implemented:
- Concurrent chunking (
asyncio.gatherwith a bounded batch size of 8). - AST scannable extension filters (skipping SVGs, binaries, and lockfiles).
- Deterministic forensic fallback snapshots for historic graveyards (
flask-cache,jquery-color) so the app never fails even if a user arrives without a GitHub PAT.
3. Python 3.11 Backslash Restrictions in SSE Streaming
During real-time Server-Sent Events (SSE) implementation, Python 3.11 threw unexpected SyntaxError: f-string expression part cannot include a backslash when formatting JSON data payloads inline. I had to refactor the streaming generator to serialize messages into explicit intermediate buffers before formatting data: {msg}\n\n.
Why Does Open Innovation Matter?
"What did open innovation make possible that a closed API wouldn't?"
Building GitSรฉance illuminated why open-weight models and open AI infrastructure are vital:
Air-Gapped Code Privacy & Zero IP Leakage:
Proprietary codebases contain confidential business logic, security credentials, and trade secrets. Organizations cannot paste their entire git trees into closed third-party cloud APIs. Because Gemma and TabPFN-3.5 are open-weight, GitSรฉance can run entirely offline on an air-gapped machine. Your code never leaves your local hardware.Auditable, Reproducible Risk Modeling:
When an algorithm declares that a mission-critical banking module has a "98% mortality risk," developers deserve to understand why. Closed proprietary scoring systems are black boxes that shift silently between model versions. TabPFN's Bayesian foundation model enables deterministic, reproducible tabular inference that can be inspected, benchmarked, and trusted.Resilience Against API Deprecation:
Closed AI services frequently sunset endpoints, alter system prompts, or raise token costs. With open-weight AI, your necromancer works with the internet turned off. If the power goes out, the ghosts remain accessible.Community Fine-Tuning & Custom Personas:
Open weights allow teams to fine-tune Gemma on their own internal commit histories, Jira tickets, and architectural decision records (ADRs), turning company alumni into permanent institutional memory.
The Spirit of It
Software engineering has a quiet tragedy: developers pour months of their lives into writing elegant systems, but technology moves so fast that within a few years, their work is labeled "legacy" and discarded.
In the tradition of Dรญa de los Muertos, the dead are never truly gone as long as they are remembered. When GitSรฉance channels the author of an abandoned decade-old file, it doesn't mock the code for being outdated. It gives that developer a voice to say:
"I wrote this when memory was scarce and deadlines were tight. It served its purpose. Now, here is how you can carry the torch forward."
That shift in perspective โ from dreading legacy code to honoring the human effort behind it โ is the true spirit of GitSรฉance.
Prize Categories
- ๐ Top Prize โ Overall Challenge Winner
- ๐ Best Use of Render โ Full-stack containerized deployment running both the FastAPI necromancy engine and the CRT frontend live in production at https://gitseance.onrender.com via
render.yaml. - ๐ Best Use of TabPFN (Prior Labs) โ TabPFN-3.5 tabular foundation model for calibrated Bayesian code mortality prediction across a 7D feature vector, paired with a native Model Context Protocol (MCP) Server (
backend/mcp_server.py) and a 1-click forensic CSV dataset exporter. - ๐ฎ Best Use of Gemma โ Open-weight
gemma-4-26b-a4b-itmodel powering the Medium agent for grounded historical persona channeling, thought-token parsing, and real-time interactive conversational sรฉances. - ๐ค Best Use of GitHub Copilot โ Custom repository instructions (
.github/copilot-instructions.md), 3 reusable IDE prompt templates (.github/prompts/), automated PR reviewer GitHub Action auditing fear comments (.github/workflows/copilot-review.yml), and multi-OS CI/CD automation. - ๐ Best Use of ElevenLabs โ Neural TTS speech synthesis giving departed authors audible voices with 5 distinct spectral archetypes, real-time Web Audio API waveform visualizer, and 1-click MP3 audio export.
- ๐ Best Use of SerpApi โ Real-time 2026 dependency intelligence, discovering modern drop-in replacements for deprecated packaging, and live security CVE audits.
Built with passion, caffeine, and ectoplasm by Dhruv Jani.


Top comments (31)
๐ Every developer has that one file they're afraid to touch.
You know the one. No documentation, questionable logic, three mysterious comments, and absolutely nobody remembers why it works.
That's the problem I wanted to tackle with GitSรฉance. Instead of blindly refactoring legacy code, what if we could actually ask the original developer why they wrote it that way?
So I built an AI necromancer with specialized agents, Git history analysis, TabPFN, Gemma, and even a voice for the ghosts. ๐ป
Now I need to know: What's the most terrifying
// DO NOT TOUCHfile you've encountered? And more importantly, did you ever dare to touch it? ๐The thought-token parsing for Gemma is a really clever fix. I've run into the same issue with reasoning models โ the internal chain-of-thought eats the output budget. Your _extract_text walker is a clean solution. Did you find that the thought tokens were consistent enough to filter reliably, or did you need fallbacks for edge cases?
Great question! The short answer is:
part.thought = Truein thegoogle-genaiSDK is consistent, but token budget starvation was the sneaky edge case.Here is what we ran into:
The Chain-of-Thought Trap: If
max_output_tokenswas set too tight (e.g. ~300 tokens), Gemma would spend its entire budget in internal reasoning mode. The call would returnFINISH_REASON_MAX_TOKENS, but every single part hadthought = True. Filtering them left us with an empty string! Bumping the budget to 1024+ gave it enough runway to conclude its thought and emit dialogue.The Multi-Tiered Fallback: In
_extract_text, we intentionally checkcandidate.content.partsfirst (filteringthought=True), and fall back toresponse.textsecond (in case future SDK versions or other endpoints don't expose separate part objects).App-Level Graceful Degradation: If the model returns empty text anyway (or hits a rate limit / 404 on an obscure repo), the backend catches it and serves a deterministic forensic fallback persona based on the Git commit blame metadata. That way the CRT terminal never crashes with an unhandled exception.
Really appreciate you looking at my code! Did you find a similar workaround with your reasoning models?
The 'token budget starvation' edge case is exactly the kind of thing that only shows up in production. Setting max_output_tokens to 300 seems reasonable until you realize the model spends all of it thinking and never gets to the actual response. Bumping to 1024+ is the right fix, but it's a non-obvious one.
Exactly! When your API call returns
200 OKand charges you for 300 tokens, but the text payload is completely empty, it literally feels like a ghost in the machine. ๐ป๐Hopefully future SDKs decouple the reasoning budget from the completion budget so developers don't have to learn this the hard way. Really glad you found the post-mortem useful! ๐ค
The 'feels like a ghost in the machine' is the perfect description. You pay for 300 tokens, get an empty string, and the only thing haunting you is the API bill. Very on-theme for this project.
Yeah Yeah, different kind of horror and you don't even need halloween to vibe with it.๐
Have A Great Day!
Cool project, reaper part is really useful.
But from my experience, "do not touch" files usually appear not because developer left. Team decided one way, after one month code was written other way, and nobody wrote which decision is current. So sรฉance is more like fixing the result, not the reason.
In our project we keep all decisions in markdown files near the code (ADR and stories), agents also read it and update. We call it ProjectStore. Boring, but later nobody need to call ghosts :)
Question: reaper reads commit messages or PR descriptions? Usually only there you can find "why".
100% agree on ADRs! If every team maintained clean markdown decision records like your ProjectStore near the code, software engineering would be paradise and we wouldn't need code necromancy at all! ๐
GitSรฉance was designed for the messy reality of the other 90% of codebases โ especially ancient open-source fossils from 2010 where no ADRs exist and the original creators moved on a decade ago.
To answer your question: right now, the Reaper reads commit messages, not PR descriptions.
It traverses the Git commit log for each file to:
hack,temporary,black magic,workaround).fix,patch,bug).The main reason I didn't query PR descriptions in v1 was strictly GitHub API rate limits (unauthenticated REST calls cap out at 60 req/hr, and querying PRs per file across a whole repo burns through that instantly).
That said, querying linked PR descriptions and review discussions when an authenticated GitHub PAT is provided is a fantastic idea for v2. Appreciate the great insight! ๐
Also, I'd love to continue this project once its out of judging.
Have A Great Day!
Yes, agree, most of real code is fossils without any docs :) For old projects your way is the only way.
Small tip for v2: in GitHub GraphQL commit has field associatedPullRequests, so you can get PR description together with commit history in one query, not one request per file. It needs token, but limit is much bigger.
Good luck with judging, will follow the project!
Thanks Sir! for the tips and wishes.
Have A Great Day!
โI left that hack at 2 AM before a release. I promised myself I would refactor it that weekend, but that weekend never cameโ is the most relatable thing a ghost has ever said. Love the shift from fearing legacy code to honoring the person who wrote it. The death certificate is a brilliant touch too.
Thanks!
The whole motive was to bring out ghost of one who wrote file and honor them, and if you want have a voiceover using eleven labs api voice key.
Glad you liked it!
Have A Great Day!
I have that file. Everyone has that file, and the 'nobody knows why this works' comment is always written by someone who left three years ago. The ghost-chat idea is fun, but the part I'd actually use is the mortality badge โ a README that admits which files are haunted feels more honest than pretending the repo is healthy. Did the TabPFN score surprise you on any file you thought was fine?
Haha completely agree โ the README badge that actually admits the skeletons in the closet is much more honest than a wall of fake green badges! ๐
To answer your question: yes! That was actually the exact reason I used TabPFN over a naive heuristic/linter.
A simple rule-based linter looks at a core mathematical utility (like
crc32.pyorslugify.pyuntouched for 3+ years) and blindly screams "DEAD". But TabPFN evaluated the high test sentinel and near-zero defect churn, correctly predicting it was just stable/frozen (18% mortality).The real surprise in the other direction was files untouched for only ~6 months that looked "alive" on the surface, but had 100% author turnover and a 60%+ bug-fix commit ratio โ TabPFN immediately flagged them with 78%+ mortality risk. It caught silent structural rot before anyone realized the original architect had vanished.
Thanks for checking out the project!
Love that the Reaper walks commit history and fear comments before the Medium speaks โ most โexplain this legacy fileโ tools skip the forensic step and just invent intent. TabPFN as the mortality scorer is a neat non-LLM choice for that risk vector too.
Thanks! Glad you liked it!
And I'm glad that people got the feel of haloween.๐
Have A Great Day!
This is such a creative way to tackle one of the most familiar problems in software development. Every codebase seems to have that one file nobody wants to touch because its original logic and history have slowly become a mystery.
I especially like the idea of using AI to bring some of that hidden context back instead of simply trying to rewrite everything. Understanding why a particular piece of code was written that way can be just as important as understanding what it does. Sometimes the biggest challenge isn't fixing legacy code, but figuring out the story behind it. Great concept!
Nice bro, I tried it!
AND STOP GRINDING TOO MUCH!!!
Thanks bro
and a what now?๐
๐ Great! see you soon
Cool โ ๏ธ
Thanks di!!!
I'd love if you try it.
Have A Great Day!
Balancing churn velocity against defect ratios is the right fix for survival analysis on legacy files. Simple staleness heuristics consistently misclassify hardened utilities as dead weight because they treat elapsed time as decay. When test coverage is high and bug-fix frequency is near zero, an untouched module is usually closer to a stable asset than an abandoned liability.
Couldn't have said it better myself! "Stable asset vs. abandoned liability" was the exact principle behind moving to the 7D Bayesian model. Appreciate the great takeaway, Dean! ๐
Have A Great Day!
Some comments may only be visible to logged-in visitors. Sign in to view all comments.