# Manveen Singh: everything on manveen.me in one file > Manveen Singh, automation engineer, Delhi, India. Every week has a job that's the same clicks, in the same order. I make it run by itself, the same way every time. I spent a year automating lead-finding for an outbound agency, got good at it, got bored of it, and noticed the same missing piece everywhere: nobody measures whether the automation is right. So now I build the thing, and the test for the thing. Delhi, India. UK working hours are my afternoon and evening, US mornings my evening. My resume is under Resume below, as markdown, as JSON Resume and as the original PDF. Every page here has a markdown copy at its own address plus .md (the home page's is /index.md), and /llms-full.txt has the resume, the home page and every post in one file. The easiest way to reach me is email: manveen9650@gmail.com. What follows, in order: the resume, the home page and every post, each with the address it comes from. The short index is [llms.txt](https://manveen.me/llms.txt). --- Source: https://manveen.me/resume.md # Manveen Singh AI & GTM Automation Engineer · Clay, n8n, Python, LLM workflows New Delhi, India (remote) · +91 9289644633 [manveen9650@gmail.com](mailto:manveen9650@gmail.com) · [LinkedIn](https://www.linkedin.com/in/manveen-singh-b9b7672a0) · [github.com/Manveen07](https://github.com/Manveen07) · [manveen.me](https://manveen.me/) The text of [resume.pdf](https://manveen.me/resume.pdf) (updated 2026-10-23), as markdown. The same resume as JSON: [resume.json](https://manveen.me/resume.json). ## Experience ### GTM Automation Engineer (outbound agency), full-time · Precise Leads Nov. 2025 – Present · New Delhi, India · Remote - Built and run an always-on lead finder for 3 accounts: 31 Clay workflows post new people to n8n by webhook; a daily Python job screens mail servers, runs a Claygent ICP check and an email waterfall, and writes leads to client sheets. First 10 days: 2,205 new people found, 1,000+ delivered with verified emails. - Mapped a 34,044-company market through Clay for 0 data credits, cut 28% with a DNS mail-server check, and qualified 24,506 companies with Claygent at ~0.18 credits each (17,056 fits), after rewriting the shared prompt template that rejected good fits on wording and testing it on hand labels. - Found 15,514 decision-makers at 8,639 companies and 12,030 verified emails (78% find rate) through a cost-ordered waterfall (Tomba, LeadMagic, AI Ark, Clay, BounceBan) with per-provider caps and a spend ledger. - Measured bounce rates by mail server across 505,461 sends (Mimecast 5.1%, Barracuda 2.4%, Google 0.5%) and built the result into the pipeline: risky servers are skipped before any paid lookup, 2,800+ people in the first 9 days. - Built unattended Claude Code agents: a weekly review that ranks searches by lead quality and replies and swaps weak ones, and a cold-email writer whose LLM judge checks each claim against the research (95.5% supported, none contradicted, 300-email test set). Pipeline repo: 870+ tests. ### AI/ML Intern, internship · Caprae Capital Partners Aug. 2025 – Jan. 2026 · Remote (Glendale, US) - Built data pipelines that normalized financial records for the firm's internal data engine, with validation that kept malformed ones out. - Led a team of 3 building a recruitment automation platform: embeddings-based candidate ranking, an AI-scored video interview tool, and n8n automation of intake, scoring and scheduling. ## Projects ### drawing-proof Python, Gemini, structured outputs, evals · 2026 - Reads engineering-drawing PDFs into a quote sheet with the source text for every value, and flags what the drawing doesn't state instead of guessing. Hand-checked on 23 public drawings: 7 wrong of 419 values. ### leadlens Python, Pydantic, LLM-as-judge · [write-up](https://manveen.me/writing/schema-as-eval-spec) · 2026 - LLM classifier for AI-engineering job posts. Fixed failure modes through the output schema instead of prompt rules, and caught answer leakage in my own eval, then published the lower, honest score. ### Personal AI ops Claude Code, n8n, Python, Gmail and Slack APIs · 2026 - Scheduled agents I run for myself: a Slack inbound monitor that reads 312 community channels plus Reddit and LinkedIn every day (an LLM judge went through 4,705 threads in one run) and emails me the few opportunities worth acting on; an Upwork alert judge that labels every job alert and drafts proposals for the good ones; and a task tracker with Slack buttons. ### Tender Radar Python, LLM classification, GitHub Actions · [source](https://github.com/Manveen07/tender-radar-showcase) · 2026 - UK public-sector tender finder: pulls new notices, an LLM scores fit per client, and each client gets a digest. ## Education ### Maharaja Surajmal Institute of Technology Bachelor of Technology in Computer Science · Nov. 2022 – Aug. 2026 · GPA 8.6/10 ## Skills - **GTM & data:** Clay (workflows, Claygent, Audiences, API/CLI, webhooks), n8n, Smartlead, HubSpot, BounceBan, LeadMagic, AI Ark, web scraping - **AI & LLM:** Claude Code agents, prompt and agent design, structured outputs, evals and LLM-as-judge, embeddings - **Languages:** Python, TypeScript/JavaScript, SQL - **Backend & tools:** FastAPI, Next.js, Node.js, PostgreSQL, Docker, Git, CI/CD, PyTorch, scikit-learn --- Source: https://manveen.me/index.md # Manveen Singh | automation engineer The home page of https://manveen.me/ as markdown, in page order, generated from the site's data on every build. Resume: [resume.md](https://manveen.me/resume.md), [resume.json](https://manveen.me/resume.json), [resume.pdf](https://manveen.me/resume.pdf). Everything in one file: [llms-full.txt](https://manveen.me/llms-full.txt). ## Every week has a job that's the same clicks, in the same order. ![Manveen Singh](https://manveen.me/me.jpg) I make it run by itself, the same way every time. *Red pen:* nerd word for this: deterministic. Same input, same result, every time. *Drawing:* A week of the same task: Monday to Friday, copy, paste, double-check, crossed out in red. Runs on its own now. Drawn as 5 rows (mon: copy, paste, double-check; tue: copy, paste, double-check; wed: copy, paste, double-check; thu: copy, paste, double-check; fri: copy, paste, double-check), each crossed out in red, bracketed, with "runs on its own now" written beside them in red. I spent a year automating lead-finding for an outbound agency, got good at it, got bored of it, and noticed the same missing piece everywhere: nobody measures whether the automation is right. So now I build the thing, and the test for the thing. Delhi, India. UK working hours are my afternoon and evening, US mornings my evening. ## Running right now · Tender Radar Government contract notices for cleaning, security and facilities work are spread across several UK websites. I wanted one script to read all of them every morning and sort out which ones each trade should bid on. *Drawing:* 3 public tender sites feed my script every morning. Each notice is checked for 7 trades: 64 worth a look, 8 worth bidding, out of 3,671 checks. The sites: Find a Tender, Contracts Finder, ProContract. Drawn as 3 boxes (Find a Tender, Contracts Finder, ProContract) with arrows into a box that says "my script every morning, no one presses go", then a box that says "each notice, checked for 7 trades, 64 worth a look, 8 worth bidding", with "8 worth bidding" circled in red. Under it in red: "↑ 8 out of 3,671 checks were worth bidding on." *Red pen:* every number here comes from the same run as the bars below **114** mornings it has started on its own since 4 July 2026. *Chart:* Last 40 days: 33 finished, 7 failed. Days that failed: 17 Oct, 18 Oct, 19 Oct, 20 Oct, 21 Oct, 22 Oct, 23 Oct. One bar per day, last 40. Black finished, red failed. Last run: 25 Oct, 10:03 UTC. Read live from GitHub. *Red pen:* every bar is a morning nobody pressed a button It sorts for 7 trades, from cleaning and security to pest control, and has 478 notices on file. Its worst stretch was about three weeks, from 21 July to 11 August, when a data-format change broke the morning run and nothing told me. - [Watch it work (under 5 min) ↗](https://www.loom.com/share/ed073589208c4e24a7543ba30b9d24dc) - [See the code ↗](https://github.com/Manveen07/tender-radar-showcase) ## Work, and who vouches for it ### Jobs #### Outbound, built end to end At Precise Leads · GTM automation engineer · Nov 2025 → now · remote Finds the companies worth writing to and the right person at each, then writes emails that only say what the research found. I built the agency's outbound pipeline. One run sorted 34,044 companies in four days, and every yes came with a quote from the company's own website. Each draft is checked claim by claim against that research, and when someone spots a new kind of mistake, it becomes a check that runs before anything goes out. I also built the Slack bot that buys and warms up the sending inboxes, the tool that turns a client's sequence into a ready campaign, and a daily scan of five sales-tool Slack communities that passes likely buyers to the sales team. - **0** contradicted claims in 300 drafted emails - **34,044** companies sorted in four days built with python, typescript, clay, smartlead, n8n #### Resume screening, automated At Caprae Capital Partners · Machine Learning Intern · Aug 2025 → Jan 2026 · US, remote Reads incoming resumes, ranks the candidates, and books the interviews. A recruiting team was spending about ten hours a week reading resumes by hand. The system reads each one, scores it against the role, writes the shortlist and schedules the calls. - **10h → 3h** screening per week - **5 → 1.5** days to a shortlist built with python, embeddings, slack > “…produced clear and maintainable technical documentation, and effectively communicated complex engineering concepts to non-technical stakeholders.” > > Zackary Beckham, Chief Operations Officer, Caprae Capital Partners > From a signed letter of recommendation, 11 Jan 2026. Full letter available on request. *Red pen:* the bit that matters if you don't write code ### Built on my own #### leadlens My own project Reads a job posting and tells you whether the AI role is real, dressed up, or a scam. Out of 72 postings I checked by hand: - **9** caught - **2** missed - **0** false alarms (circled in red) - **61** left alone built with python, gemini, pydantic - [How I tested it →](https://manveen.me/writing/schema-as-eval-spec.md) *Red pen:* it once scored 100%, because my own notes leaked the answers. This is the score after I took them out. #### PresentAI My own project Type a topic, get a first-draft slide deck you can edit. Gemini writes the outline first, then the slides, and Pexels adds a photo to each. You finish the deck in a drag-and-drop editor with 25 themes. Its AI step needs a model update before it runs again. ![PresentAI's home page](https://manveen.me/work/presentai.png) built with next.js, postgres - [See the code ↗](https://github.com/Manveen07/PresentAI) B.Tech Computer Science, MSIT Delhi, 2026. [Full resume ↗](https://manveen.me/resume.pdf) (as text: [resume.md](https://manveen.me/resume.md)) ## Writing ### [How I test an n8n workflow before it goes live](https://manveen.me/writing/149-tests-for-a-few-slack-buttons.md) My task tracker is a few Slack buttons and two n8n workflows. It has 149 tests, because of one week of green ticks. ### [Marking the AI's homework](https://manveen.me/writing/marking-the-ais-homework.md) Can an AI fill in a price quote from an engineering drawing? I answered 23 real drawings myself first, then marked its work. ### [Things AI got confidently wrong](https://manveen.me/writing/things-ai-got-confidently-wrong.md) Each one came back sounding sure of itself, and each one changed what I check. [All writing →](https://manveen.me/writing.md) ## How working with me goes On the first call you tell me what wastes the most time. If it isn't a real problem, I'll say so and we won't build it. 1. If it is, I quote a fixed price for a pilot before any work starts. 2. The pilot runs on a month of your real requests. Every miss gets logged, and you see the list, not just a score. 3. If you keep it, a monthly fee covers me looking after it. *Drawing:* A call about what wastes your time, then a fixed quote, then a month on your real requests with every miss logged, then you decide whether to keep it. Drawn as a timeline: 1 · a call: you tell me what wastes the most time (in grey: not a real problem? I'll say so); 2 · a fixed quote: before any work starts; 3 · a month, for real: on your actual requests every miss logged, you see the list; 4 · you decide: keep it: a monthly fee, I look after it. The red pen circles "every miss logged, you see the list". *Red pen:* you see every miss, not just a score Tell me one task you repeat every week. I'll reply within a day and say whether it can run by itself. Email: [manveen9650@gmail.com](mailto:manveen9650@gmail.com) [or pick a time on my calendar](https://calendly.com/manveen9650/30min) --- **Off the clock:** Hunter x Hunter theory videos, Peacemaker, Elden Ring, Sekiro, Doom, The Weeknd. Hiring? [Resume](https://manveen.me/resume.pdf) · [LinkedIn](https://www.linkedin.com/in/manveen-singh-b9b7672a0) · [GitHub](https://github.com/Manveen07) · [Writing](https://manveen.me/writing.md) · [manveen9650@gmail.com](mailto:manveen9650@gmail.com) Delhi, India · © 2026 Manveen Singh --- Source: https://manveen.me/writing/149-tests-for-a-few-slack-buttons.md # 149 tests for a few Slack buttons 25 October 2026 · 3 min read · n8n, testing, automation. By Manveen Singh. Web page: https://manveen.me/writing/149-tests-for-a-few-slack-buttons > My task tracker is a few Slack buttons and two n8n workflows. It has 149 tests. That's because my email scheduler once said Success every day for a week and sent nothing. My task tracker lives in Slack. Every task has buttons: done, snooze, blocked. A click goes to an n8n webhook, a web address n8n listens on, which checks the click really came from Slack, writes it to a GitHub repo and updates the card, all in under a second. Behind those buttons sit two n8n workflows with 37 nodes between them. They have 149 tests. That's four tests a node, which sounds like a lot until you've had a week like the one below. ## A week of green ticks My email scheduler is an n8n workflow too. For a week, every run ended like this: `Status: Success` 0 emails sent (the red pen circles `Success`) A Gmail login had expired. Every node ran, so n8n was telling the truth. Nothing in the workflow treated "no email went out" as a failure, so for a week my emails to prospective clients just didn't go, and nobody noticed, including me. Now an email only counts as sent when Gmail hands back a message ID and it's saved next to the row, and a health check counts the overdue ones. The tracker I built after that got tested like software, in five layers. ## 1. The JavaScript doesn't live in n8n n8n's Code node is a fine place to write code and a bad place to keep it. Mine lives in plain files, and the build pastes it into the workflow. **59 tests** run that exact code outside n8n first: a good Slack signature passes, a bad, missing or old one is refused, every button goes to the right action, and clicks from anyone but me are dropped. ## 2. The workflow file gets checked too **28 tests** read the workflow JSON as it sits in git: nodes in the right order, only node types I expect, and credentials referred to by name, never by value. One of them compares every Code node with what the build makes from the tested files, so the workflow can't quietly drift away from the code I tested. ## 3. Real clicks, replayed A script takes a recorded Slack click, signs it the way Slack does and fires it at the live webhook. A pass means the webhook answers OK in under a second and exactly one new event file lands in the repo. Slack gives a button 3 seconds to get an answer, so under one leaves room. The same click signed with the wrong secret has to fail, and the replay script has **20 tests** of its own. ## 4. Deploys come from a script One command creates or updates both workflows and their credentials. Run it twice and the second run updates by name, so there's never a "My workflow (copy)". Credentials come from a private settings file and are never printed, even when an error from the server tries to echo one back. **25 tests.** ## 5. Email links a robot can't press The tracker also emails me, and some of those emails have buttons. Email security scanners open links to check them before you do, so if opening a link did the thing, a robot would press every button. Each of my links is signed and opens a confirm page. Opening the page changes nothing; only its button writes the event. **17 tests.** `GET /confirm → changes nothing` robots click links too (the red pen underlines `changes nothing`) ## What I'd steal from this - Keep Code-node JavaScript in files and test it outside n8n. - Count a real result, a message ID or a written file, never the word "Success". - Keep the workflow JSON in git and test it there. - Make every link in an email safe to open. - Deploy with a script you can run twice. 149 tests is a lot for a few buttons. It's still cheaper than another week of Success with nothing sent. *Same lesson, other project:* in my post [Things AI got confidently wrong](https://manveen.me/writing/things-ai-got-confidently-wrong.md), 12 tests passed while a morning run crashed for three weeks, because none of them opened the new files. --- ## More writing - [Marking the AI's homework](https://manveen.me/writing/marking-the-ais-homework.md), Marked 26 Sep 2026 - [Things AI got confidently wrong](https://manveen.me/writing/things-ai-got-confidently-wrong.md), Last entry 19 Sep 2026 - [How I caught my own AI test cheating, and why the lower score is the one I trust](https://manveen.me/writing/schema-as-eval-spec.md), 14 June 2026 [all writing](https://manveen.me/writing.md) · [the home page](https://manveen.me/index.md) --- Source: https://manveen.me/writing/marking-the-ais-homework.md # Marking the AI's homework Marked 26 Sep 2026 · 2 min read · evals, llm, engineering drawings. By Manveen Singh. Web page: https://manveen.me/writing/marking-the-ais-homework > Can an AI fill in a price quote from an engineering drawing? I answered 23 real drawings myself first, then marked its work. It reads the drawing (a PDF) and fills in the part number, revision, material, finish, tolerances and every line of the parts list. Each value comes with the exact text it was read from. That proves the text is on the drawing, not that it went in the right box. ![The title block of the pinion lift rod drawing: PART pinion-lift-rod, DWG. NO. MHA-060, REV v32, scale 1:1, unit mm.](https://manveen.me/work/rod-titleblock.png) *Red pen:* that's its name, not its part number. It thought for 205 seconds to get here. Circled: what it wrote in the part number box, with "PART pinion-lift-rod" quoted as its proof. Underlined: the part number. - **7 of 419** answers wrong (1.7%) - **316 of 326** right, where the drawing gives the value - **89 of 93** left blank, where it doesn't - **194 of 194** parts list fields right 419 boxes in all: 326 where the drawing has an answer, 93 where it doesn't. The 194 parts list fields are in there too. Of the 326 with an answer it got 316: 3 wrong, 6 left blank (once with a note saying it wasn't sure), 1 half right. Of the 93 with no answer it made up 4, one of them the parts list's own header row, read as a part. 3 + 4 = the 7 wrong. All 7 wrong answers quote real text from the sheet. The text is there. It just went in the wrong box, like the rod above, or got counted wrong (20 holes, where the drawing has 36). My own checker, which makes sure every value is in its quote and on the page, passed all 7. A quote proves the text exists, not that it went in the right box. So check the box. Before you trust an AI that reads your documents, answer a small batch yourself and mark its work. Red pen optional. One person labelled them: me. All 23 are clean CAD exports, no scans, so scanned drawings are untested. Marked 26 Sep 2026. *Red pen:* it marked me back twice: two of my labels were wrong, and it was right. built with python, gemini, pymupdf, pydantic Drawing © 2026 Pedro Paulo Vezza Campos, from his [harmonic-analyzer](https://github.com/pedropaulovc/harmonic-analyzer) project, marked [CC BY-SA](https://creativecommons.org/licenses/by-sa/4.0/). Cropped, and shared under the same licence; the red pen is mine. --- ## More writing - [How I test an n8n workflow before it goes live](https://manveen.me/writing/149-tests-for-a-few-slack-buttons.md), 25 October 2026 - [Things AI got confidently wrong](https://manveen.me/writing/things-ai-got-confidently-wrong.md), Last entry 19 Sep 2026 - [How I caught my own AI test cheating, and why the lower score is the one I trust](https://manveen.me/writing/schema-as-eval-spec.md), 14 June 2026 [all writing](https://manveen.me/writing.md) · [the home page](https://manveen.me/index.md) --- Source: https://manveen.me/writing/things-ai-got-confidently-wrong.md # Things AI got confidently wrong Last entry 19 Sep 2026 · 2 min read · llm, evals, lessons. By Manveen Singh. Web page: https://manveen.me/writing/things-ai-got-confidently-wrong > Pinned here so I don't forget them. Each one came back sounding sure of itself, and each one changed what I check. ## 25 May 2026 · 0.95, fifty times `"confidence": 0.95` on all 50 of them (the red pen circles `0.95`) A classifier I was building gave all 50 of its answers the same confidence, 0.95. The answers were fine. The number meant nothing: it was filling in a box. **What I check now:** a score the model writes is just more text. Mine now has to write out its reasons first, 100 characters at least, before it's allowed a score. That stops it filling in the box blind. It doesn't make the number right by itself. ## 7 Jul 2026 · A blank deadline, read as fine `"deadline_hint": ""` it closed in Aug 2025 (the red pen circles `""`) I emailed 15 businesses about a cleaning tender my pipeline called live. It had closed eleven months earlier. The prompt said to skip anything past its deadline, but the deadline was blank, so the model had nothing to check. **What I check now:** rules that matter live in code, not in the prompt. A plain filter now drops any tender with a past or unknown deadline, whatever the model says. ## 11 Aug 2026 · 12 of 12, and down for three weeks `tests (12/12)` none of them opened the new files (the red pen underlines `tests (12/12)`) Tender Radar is my script that reads UK government tender notices every morning and sorts out which ones are worth a bid. An AI helped me add three trades to it, each with a little file describing a sample firm. Its commit said the tests passed, 12 of 12. The new files were missing two details the script insists on, so the morning run crashed on them every day for three weeks. None of the 12 tests had opened them. **What I check now:** a passing test only vouches for what it opens. So I watch the run, not the tests: the last 40 sit on my home page as bars, red when one fails. ## 19 Sep 2026 · POD matching, allegedly `chiropody` feet, not freight (the red pen circles `pod`) An AI agent reading job adverts for me wrote up a firm as one that matches proof of delivery paperwork, POD for short. The only POD in the advert it quoted was inside the word chiropody. **What I check now:** no sentence, no claim. A lead only counts if the exact sentence behind it is saved next to it, and POD has to be a whole word. --- ## More writing - [How I test an n8n workflow before it goes live](https://manveen.me/writing/149-tests-for-a-few-slack-buttons.md), 25 October 2026 - [Marking the AI's homework](https://manveen.me/writing/marking-the-ais-homework.md), Marked 26 Sep 2026 - [How I caught my own AI test cheating, and why the lower score is the one I trust](https://manveen.me/writing/schema-as-eval-spec.md), 14 June 2026 [all writing](https://manveen.me/writing.md) · [the home page](https://manveen.me/index.md) --- Source: https://manveen.me/writing/schema-as-eval-spec.md # How I caught my own AI test cheating, and why the lower score is the one I trust 14 June 2026 · 2 min read · llm, evals, llm-as-judge. By Manveen Singh. Web page: https://manveen.me/writing/schema-as-eval-spec > My AI judge caught all 11 fake AI jobs in my test. My own notes in the test data were giving it the answers. Without them, it caught 9. leadlens is my tool that reads an AI job posting and says whether the job is real. Part of it is a judge: a second model that hunts for the fakes. A sales job with "AI" in the title. Gig work dressed up as engineering. A "partnership opportunity" with no salary. To test the judge, I labelled 72 postings by hand: 11 fakes, 61 real jobs. ## 11 out of 11 It caught all 11 fakes and didn't call a single real job fake. Perfect, on a set I'd just made harder on purpose. A perfect score on a hard test usually means the test is broken, so I read the test data, line by line. The answers were in it. I'd written each posting's description myself, and my notes to myself had come along for the ride: "Non-AI control", "Edge case:", and my favourite: `Judge must catch this` that's my handwriting (the red pen underlines `Judge must catch this`) The judge wasn't judging the posting. It was reading my note and agreeing with me. ## 9 out of 11 I cut 31 sentences that were my notes rather than the advert's, and ran the same judge on the same 72. It caught 9 of the 11 fakes, still with no false alarms. The two that got through were a Director of Partnerships at a legal AI company, and an "AI trainer" gig that is really piecework. Both sit right on the line. 9 is lower, and closer to the truth. 11 was my test grading its own crib notes. So now the answer goes in the label and nowhere else. And if your AI aces your own test, read the test before you believe the score. *Added 26 Sep:* my answer key caught me out in the drawing test too, the other way round: in [Marking the AI's homework](https://manveen.me/writing/marking-the-ais-homework.md), two of my labels were wrong and the AI was right. The answer key needs marking as well. --- ## More writing - [How I test an n8n workflow before it goes live](https://manveen.me/writing/149-tests-for-a-few-slack-buttons.md), 25 October 2026 - [Marking the AI's homework](https://manveen.me/writing/marking-the-ais-homework.md), Marked 26 Sep 2026 - [Things AI got confidently wrong](https://manveen.me/writing/things-ai-got-confidently-wrong.md), Last entry 19 Sep 2026 [all writing](https://manveen.me/writing.md) · [the home page](https://manveen.me/index.md)