Project 01
Sifarishसिफ़ारिश
Compile truth. Draft everything. Send nothing.
Seven rooms and one ledger, built across three months, under a rule I gave it on the first day: it may find, draft and prepare — it may never press send.

Why it was hard
An LLM will happily mint a claim you cannot back, and recruiters now screen for exactly that. So I made "never invents" structural rather than aspirational: the model is never allowed to write the page. It may only select and order facts that already exist, and every choice has to survive a validator that re-checks it against real ledger IDs. The harder half is the inverse — suppression is a lie too. A true, relevant fact quietly dropped for space is the same class of defect as a fabrication, so I made the compiler solve the page-budget constraint instead of trimming.
How it actually works
A sentence with nothing behind it does not get flagged for review. It stops the whole page from building.
An uncited line cannot physically reach the page. Every line passes through one gate, and a bullet carrying zero ledger IDs throws a compile error rather than rendering.
2 receipts
- compiler.ts:284The I1 gate — CompileError is thrown on a bullet with an empty ledgerIds array.
- 13 invariantsI1–I13, each with named enforcing tests.
It reads the job ad the way a cynic would — including the part that says what they do NOT want.
It reads the whole job posting into what the company says it cares about — and what it says it does not — keeping the posting’s literal words. A test asserts that "we do not care about LeetCode" lands in doesNotCare and never in cares.
2 receipts
- reading.ts357 lines parsing a posting into typed cares / doesNotCare quotes.
- strategist.test.tsThe two-sided gate on posting polarity.
For every fact about me it decides: play this one, or leave it on the bench — and it has to write down why, in the company’s own words. Then I get to overrule it when the reason is rubbish.
For every true fact it writes down whether that fact was played or benched, with a reason in the company’s own words. The validator then rejects the model’s bad calls: a bench reason under twelve characters is overruled, education can never be benched, and "page budget" is refused outright because space belongs to the compiler.
2 receipts
- plan.ts:438validatePlan() — each override is noted visibly rather than applied silently.
- plan.ts:466The rules are dated to a live model failure: "LIVE-CAUGHT (05-Sep-2026, Gemini on Babaclick)".
It is physically incapable of applying on my behalf. Not switched off — the code that could send an email is not in there, and the build goes looking for it every single time.
"Send nothing" is a grep over the source tree, not a promise. The build fails if a mail or browser-automation library ever appears, and the Gmail scope is asserted read-only with thirteen send-capable strings banned.
2 receipts
- invariants.test.ts:85Walks src/ and api/ and fails on nodemailer, smtp, puppeteer, playwright .click().
- dak.test.ts:118Asserts gmail.readonly and bans gmail.send, drafts.create, batchModify and ten more.
After it makes the PDF, it opens the PDF back up and reads it, to check the page really says what the ledger said.
Every exported PDF is read back in. The text layer is re-extracted and each compiled line asserted present, and in order — so what the reader sees is provably what the ledger said.
1 receipt
- parseback.tsRound-trip fidelity via pdfjs-dist with a cursor-advancing order check.
The model may make my sentences better. It may not make them bigger. Invent a number, a company or a technology in a rewrite and the rewrite is binned.
A rephrase that introduces a new number, a new proper noun or a new technology is rejected, with stemming and acronym-expansion awareness so honest rewrites are not false-flagged.
1 receipt
- factGuard.ts152 lines of drift detection against a 46-entry technology lexicon.






The numbers
receipts
- tests/Counted directly from source rather than taken from the README.
receipts
- matrix.test.ts:223A seeded PRNG enumerating ledger × posting × operation.
receipts
- routing.jsonFree tiers only, with a heuristic fallback behind each lane.
The part most people would have skipped
I diagnosed a structured-output failure by controlled experiment rather than guesswork — JSON-object mode failed 0 of 3 at two different temperatures, JSON-schema mode passed 2 of 3, which proved the mode was the variable and temperature was not. I also wrote down why I had not caught it for two sessions: every caller degraded silently, by my own design. That became a standing rule in everything I have built since — every artefact prints which engine produced it.
- Vite 8
- React 19
- TypeScript
- Tailwind 4
- Dexie / IndexedDB
- pdf-lib + pdfjs
- WebCrypto AES-256-GCM
- Vitest
- Playwright
- 11 serverless functions
In July 2026 I sat down to apply for internships and realised the whole ritual is broken. You write one résumé. You send it to forty companies who want forty different things. Each one gets a document that is roughly 30% relevant to them, and you have no idea which 30%. Meanwhile the tools being sold to fix this are language models that will happily invent a line about "cross-functional stakeholder alignment" you have never done — and recruiters have learned to smell exactly that.
So I did not build a résumé generator. I built the thing that has to exist underneath one: a ledger of facts I can actually prove, and a compiler that assembles a page out of that ledger for one specific company, and then writes down why it made every choice it made. The model never writes a word of the page. It only decides which true things belong on it.
Then it kept growing. Because once you have a machine that knows everything true about you, the obvious next question is "so what should I apply to" — and after that "what does this company actually want" and "what did they reply" and "what can I not prove yet". Seven rooms later it is not a résumé tool. It is a desk that runs the entire hunt, and it won first place at the Agentic & GenAI Showcase at IIT Ropar.
Seven rooms
Walk through it.
- 01
Sach Ledgerसच
The vault of things I can prove
Everything starts here. Every project, grade, award and skill is a row with an evidence link and a date. Each row is tagged either shipped — with a URL you can open — or honestly marked as still in the forge. Nothing else in the system is allowed to invent a fact; it can only reach into this room and pick one up. And it reads my GitHub directly, so when I push something new the ledger knows about it before I remember to tell it.
2 receipts
- the ledger seed34 entries — 26 shipped with evidence, 8 honestly marked as in progress.
- the GitHub readerPulls repositories in and keeps the ledger current. It also deletes projects that have no repo behind them, because those cannot be proven.
- 02
Khabriख़बरी
The informant
Every week it sweeps the market and comes back with what is actually being asked for right now — and crucially, what is being asked for that my ledger cannot yet prove. That second list is the useful one. It does not say "learn LangChain"; it says "four postings this week wanted orchestration and you have nothing that demonstrates it", and it names the four postings so I can go read them. It is the difference between career advice and a gap analysis.
2 receipts
- the craft library93 cited sources and 63 craft patterns, built up from real postings rather than generic advice.
- the vocabulary46 canonical technology terms, 20 banned guarantee phrases, and about 45 slop phrases it will not let through.
- 03
Shikaar Radarशिकार
The hunt
It watches 32 real hiring boards — Ashby, Greenhouse, Lever and more — and pulls live openings, then ranks them against what I have said I actually want. Every role carries an expandable "why this score", so I can disagree with it. It also applies ceilings honestly: a senior role gets capped no matter how well the keywords match, and anything stale gets marked down, because a two-month-old posting is usually already filled.
2 receipts
- the watchlist32 keyless boards seeded — 19 Ashby, 11 Greenhouse, 2 Lever — each probed live before it was included.
- the scoring ceilingsHard caps for senior roles, non-intern engineering roles and stale postings.
- 04
Packetदर्ज़ी
The tailor — and the best room in the building
Paste a job posting. It reads the whole thing and separates what the company says it cares about from what it says it does not, keeping their literal words. Then it writes a game plan: for every true fact in my ledger, played or benched, with a reason quoted from the posting. Then the compiler executes that plan into a one-page résumé, a cover letter and an outreach note. And a separate critic — a hostile-recruiter rubric — reads the finished page and sends it back once if it is not good enough. You can read the entire argument it had with itself before it printed anything.
3 receipts
- the reading357 lines that split a posting into what it cares about and what it explicitly does not.
- the game planEvery fact gets played or benched with a written reason, and the validator overrules the model when it benches something for a bad reason.
- the compile gateA line with no citation behind it throws rather than rendering. This is the rule the whole product exists to enforce.
- 05
Guruगुरु
The coach that will not flatter you
A chat that knows my entire ledger, so it answers about me rather than about candidates in general. It has a hard rule: it will never promise an outcome. No "this will get you the job". Twenty guarantee phrases are banned outright in code, and the header says plainly that no tool can guarantee selection. I tested it against 30 scripted conversations to make sure it holds that line even when I push it.
2 receipts
- the conversation tests30 scripted conversations across four versions of the coach.
- the banned promises20 guarantee phrases it is structurally forbidden from producing.
- 06
Dak Khanaडाक
The post room — and the thing I am proudest of
It connects to Gmail so the desk knows when a company replies and can move the card itself. And it connects with read-only permission, which it proves rather than promises: a test asserts the scope string is read-only, bans thirteen send-capable API calls by name, and the build greps the entire source tree and fails if a mail library ever appears in it. Sifarish is structurally incapable of sending anything from my account. I built the most useful version of the feature and then removed its ability to act.
2 receipts
- the scope testAsserts gmail.readonly and bans send, insert, drafts.create, settings.sendas and nine more by name.
- the source grepThe build walks src/ and api/ and fails on nodemailer, smtp, puppeteer or any browser-automation click.
- 07
Morchaमोर्चा
The board
Where everything lands: found, tailored, applied, waiting, interviewing. Each card carries its packet, its reply, and a receipt of who did what and when. And there is an apply cockpit — a bookmarklet that fills a form for me on the company's own site, with a deny-list that refuses to touch anything about gender, ethnicity, disability, caste or visa status. It never presses submit. I press submit.
1 receipt
- the cockpit gateThe generated bookmarklet is asserted to contain no fetch, no XHR, no submit, no eval, and a demographic deny-list.
It runs with no API keys at all. Every lane that uses a model has a deterministic floor underneath it, and every artefact prints which engine produced it — because I once spent two sessions with a dead reasoning tier that looked exactly like a healthy one, and silent failure is the specific thing I now build against.
And the whole system is bound by one rule it cannot break: it will draft anything and send nothing. It will write the email, fill the form, rank the roles and argue about the résumé. Then it stops and waits for me. That was not a limitation I accepted. It was the point.
Try it — one dossier, two companies
Nothing is rewritten between these two. Only re-decided.

- 1Education
- 2Achievements
- 3Projects
They wrote that they screen on reasoning ability. So the NTSE scholarship and the board results lead — proof of aptitude, in their words, not ours.

- 1Projects
- 2Positions of Responsibility
- 3Achievements
Same facts, same dossier. Braillix and Sehat Saarthi lead, volunteering is promoted, and the education section is dropped entirely — because this posting never asked.
