GEMINI LABJP
FLASH36 — Gemini 3.6 Flash, shipped July 21, uses about 17% fewer output tokens than 3.5 Flash at a lower price, with fewer stray code edits and execution loopsCYBER — Gemini 3.5 Flash Cyber is a lightweight model focused on finding, validating, and patching vulnerabilitiesCOMPUTER — Computer use is now available as a built-in client-side tool through the Gemini API and Gemini EnterpriseSPARK — Gemini Spark began rolling out in Japanese on July 16, starting with Google AI Ultra subscribersPARALLEL — Spark now processes multiple reference sources in parallel, and handles a wider range of image edits across Docs, Sheets, and SlidesSTUDENT — Students 18 and older in four countries, Japan included, get a free upgrade to Google AI Pro with NotebookLM and 2TB of storageFLASH36 — Gemini 3.6 Flash, shipped July 21, uses about 17% fewer output tokens than 3.5 Flash at a lower price, with fewer stray code edits and execution loopsCYBER — Gemini 3.5 Flash Cyber is a lightweight model focused on finding, validating, and patching vulnerabilitiesCOMPUTER — Computer use is now available as a built-in client-side tool through the Gemini API and Gemini EnterpriseSPARK — Gemini Spark began rolling out in Japanese on July 16, starting with Google AI Ultra subscribersPARALLEL — Spark now processes multiple reference sources in parallel, and handles a wider range of image edits across Docs, Sheets, and SlidesSTUDENT — Students 18 and older in four countries, Japan included, get a free upgrade to Google AI Pro with NotebookLM and 2TB of storage
Articles/Advanced
Advanced/2026-07-26Advanced

Wiring a Security-Focused Model Into a Solo Developer's Audit — The Extraction Layer and Fingerprints That Stop Re-Reporting

A three-layer design that extracts outbound-request sinks with the AST, then accepts a model's hypothesis only when the reproduction actually runs. Four fingerprint schemes measured, including the collision that hides a real finding behind a safe twin.

security12static analysisASTGemini API195design patterns

Premium Article

The notice said that Agent Studio's auto-generated /api-proxy backend had an SSRF flaw, and that web apps created before July 1, 2026 should be regenerated and redeployed.

I stopped reading and realised I had no way to answer the obvious follow-up question: which of my own services actually take a URL from the outside and go fetch it?

As an indie developer I have accumulated a handful of small services over several years. Grepping for requests.get returned dozens of hits, and none of them told me which ones were genuinely reachable from user input. The only honest answer was to read each one.

The arrival of purpose-built security models — Gemini 3.5 Flash Cyber is scoped to discovering, verifying, and patching vulnerabilities — made it tempting to hand the whole job over. My first attempt did exactly that, and it stopped working after two weeks. Here is why it stopped, the three-layer setup I rebuilt, and the part that took the longest to get right: fingerprinting findings so the same one never arrives twice.

Every number below comes from fixtures and real code trees I ran on my own machine. The reproduction steps are included.

Why handing over the whole repository stopped working

The first version was naive. Bundle the changed files, ask the model to point out anything that looks like SSRF, file the answers as issues. It worked, in the sense that it produced output. It failed for three reasons.

The same finding kept coming back. Add one comment line and the model flags the same function again. I built a ledger to suppress duplicates, and immediately discovered that the design of the ledger key was the actual problem — most of this article is about that key.

Confidence scores were unusable. I asked for high / medium / low. Sending identical input three times swapped high and medium. Any threshold I drew was drawing on sand.

And it cost money for nothing. Even on a small diff, the surrounding context inflates input tokens, so I was paying full price on days when every single finding was a known re-report. If you want the per-request accounting that makes this visible, the approach in Track Gemini API Costs in Production with usageMetadata is the foundation I use.

The underlying mistake was asking the model to do discovery and judgement in the same breath. Discovery is a great fit for a machine. Judgement, handed to a model, gives you a verdict whose basis moves every time you ask.

Three layers: extract, hypothesise, verify

LayerOwnerOutputDeterministic?
ExtractYour own AST scannerCandidate sinks plus fingerprintsYes
HypothesiseThe modelA reproduction and a patchNo, and that is fine
VerifyYour own harnessAccept or rejectYes

The whole point is to confine the non-deterministic layer to the middle. The model is never asked whether something is dangerous. It is asked: assuming this is dangerous, how would you reproduce it, and how would you fix it? Whether it was dangerous is settled entirely by whether that reproduction runs.

Once the model's self-assessment is out of the acceptance path, swapping models stops being a migration. I call the hypothesis layer through an interface, which lets me compare a general Flash model against a purpose-built one using the same ledger.

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
A ~90-line AST scanner for outbound-request sinks, measured at 4,016 files in 28.2 seconds (7.0ms per file)
Line-based fingerprints re-reported 8 of 8 findings as brand new after only comments and a variable rename — with the fix that survives both
Why the coarser fingerprint reaches 7/7 tracking yet lets an allowlisted function swallow a vulnerable one, reproduced step by step
Secure payment via Stripe · Cancel anytime

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Gemini Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • Copy-paste ready implementation code
  • New advanced guides published daily
  • $5/mo or $10 for lifetime access
View Membership →

Related Articles

Advanced2026-07-17
A Japanese query won't surface its English twin — when embeddings notice language before meaning
Embed a translation pair with gemini-embedding-2 and the two halves won't be nearest neighbours, because language itself inflates similarity. Here is how I measured cross-lingual recall using translation pairs as ground truth, and what happened when I subtracted the language centroid.
Advanced2026-07-15
A near-miss label won't fix itself on retry — a normalization layer for closed-vocabulary classification
When responseSchema enum returns an out-of-set label, retrying tends to return the same near-miss. From a wallpaper app's 30-category batch, here is the distribution of how labels miss, plus a normalization layer built on an alias table and gemini-embedding-2 nearest-neighbor, with measured results.
Advanced2026-07-12
A minimal evolutionary search loop with Gemini: propose, evaluate, select — prompted by AlphaEvolve's GA
With AlphaEvolve reaching GA, I built the smallest possible evolutionary search loop on the Gemini API: generate candidates, score them with a fitness function, and select the best. Sandboxed evaluation, diversity, and budget control — from real solo-dev use.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links
See all →