27 newsletters today.
Abandoned Futures
2026-05-15
Between 1946 and 1961, the United States spent roughly $1 billion (about $11 billion today) on the Aircraft Nuclear Propulsion program — a serious, sustained effort to build a bomber that could stay airborne for weeks on a reactor the size of a refrigerator. The earlier NB-36H carried a reactor as a passenger; the Convair X-6 was meant to be flown by one. Two parallel engine programs raced to the finish line: General Electric's Direct Air Cycle (X-39 turbojets coupled to the HTRE-1, -2, and -3 reactors at the National Reactor Testing Station in Idaho) and Pratt & Whitney's Indirect Air Cycle, which used a liquid-metal loop to isolate the crew from the core.
GE's approach actually worked. On January 31, 1956, HTRE-3 ran a J47 turbojet entirely on reactor heat — the first jet engine in history powered by fission. The reactor used beryllium oxide moderator and ran at over 1,000°C, hot enough to deliver useful thrust through nickel-alloy heat exchangers. P&W's indirect cycle used molten sodium and later examined fluoride salts — the same chemistry that would later define Oak Ridge's MSRE.
So why did it die? On March 28, 1961, President Kennedy canceled ANP in a single paragraph. The stated reasons:
Why it matters now. Strip away the bomber mission and look at what ANP actually proved: compact, high-temperature reactors can drive aviation-grade turbomachinery. That capability is suddenly interesting again for three reasons.
First, the materials problem is solved. Modern SiC-SiC ceramic matrix composites, already flying in GE9X turbines at 1,300°C, would have been miraculous to Convair's metallurgists. Inconel 740H and ODS steels make P&W's indirect loop genuinely buildable.
Second, the reactor architecture is mature. P&W's molten-fluoride concept was the direct ancestor of today's MSR designs from Kairos, Terrestrial Energy, and Copenhagen Atomics. A 50 MW thermal MSR weighing under 10 tonnes is no longer fantasy — it's a funded engineering problem.
Third, the mission has returned. DARPA's DRACO program (Lockheed/BWXT, first flight slated 2027) is building a nuclear-thermal rocket using HALEU. The Air Force Research Laboratory funded a nuclear cruise-missile study in 2024. China's revealed work on a thorium-fueled cargo airship in 2023. And for ultra-long-endurance ISR drones — picture a 90-day loiter over the Arctic — chemical fuel simply cannot compete with fission energy density (roughly 2 million times that of jet fuel).
The crew shielding problem that killed manned ANP disappears when there is no crew. The dirty-exhaust problem disappears with the indirect cycle that P&W had already designed. What's left is an engineering project that Convair, Lockheed, and GE got within a heat exchanger of completing in 1961 — and which we now have the materials, controls, and unmanned platforms to finish.
ArXiv Paper Digest
2026-05-15
Authors: Xinran Zheng, Alfredo Pesoli, Marco Valleri, Suman Jana
ArXiv: 2605.15097v1
PDF: Download PDF
Imagine you're a security researcher handed a compiled program — a binary blob of machine code — and asked to find dangerous bugs like buffer overflows or use-after-free errors that attackers love to exploit. You don't have the original source code. All the helpful names, comments, and type information that programmers wrote are gone. What's left looks like assembly soup. This is the everyday reality for people who audit closed-source software, firmware, and malware.
The problem: Traditional tools for finding memory corruption bugs in binaries are either fast-but-shallow (pattern matching that misses real bugs and flags lots of false ones) or deep-but-brittle (symbolic execution that explodes computationally on real programs). Recent attempts to throw a large language model at the problem help with "understanding" what code does, but LLMs hallucinate confidently, miss subtle interprocedural bugs (where the flaw spans multiple functions), and can't tell whether a suspicious-looking pattern is actually reachable at runtime.
What Veritas does: The authors built an agentic framework — meaning a coordinated team of LLM-driven components that each handle a piece of the job — anchored by two ideas that keep it from drifting into fantasy:
The agentic part matters because memory bugs aren't local. A vulnerability often involves one function allocating an object, another using it, and a third freeing it under some weird condition. Veritas's agents propagate information across these boundaries, mimicking how a human reverse engineer hops around in IDA or Ghidra building a mental model.
The key insight: LLMs are good at pattern recognition and bad at proof. The right design isn't "LLM replaces the analyzer" — it's "LLM steers a classical analyzer toward the suspicious parts, and the classical analyzer keeps the LLM honest." Veritas treats the LLM as a strong but unreliable collaborator and pairs it with the kinds of evidence (slices, runtime triggers) that don't lie.
Daily Automotive Engines
2026-05-15
We've covered variable valve timing at a conceptual level, but the cam phaser is the actual mechanical device that rotates the camshaft relative to the crankshaft sprocket while the engine is running. Understanding how this hydraulic dance works explains why VVT engines are picky about oil and why a rattle at startup means expensive trouble.
A cam phaser sits at the front of the camshaft, integrated into the cam gear or sprocket. Inside is a vane-type rotor bolted to the cam, spinning inside an outer housing driven by the timing chain. Between the rotor's vanes and the housing walls are oil chambers — typically four pairs. Pressurized oil pumped into one side of each vane advances the cam; oil routed to the other side retards it. The cam phaser is essentially a hydraulic actuator turned into a degree-wheel.
The oil control valve (OCV), also called the VVT solenoid, is the brain's hand. The ECU pulses the solenoid with a PWM signal (typically 250–300 Hz), which moves a spool valve directing engine oil to either the advance or retard chambers. Oil pressure is the working fluid — no pressure, no phasing. This is why VVT engines stay at the parked position (usually full retard on intake, full advance on exhaust) until oil pressure builds.
Real-world example: The Ford 5.4L 3V Triton (2004–2010) is infamous for cam phaser failure. The phasers use a center-locking pin held by oil pressure. With degraded oil or extended change intervals, the pin sticks, the vanes hammer against the stops, and you hear a diesel-like rattle on cold start. Replacement requires pulling the front cover — about $2,000–$3,000 at a shop. Ford's fix: use only 5W-20 synthetic, change every 5,000 miles.
Rule of thumb — phaser authority: Most production phasers offer 40–60 crankshaft degrees of adjustment range (20–30 cam degrees, since the cam spins half-speed). Performance designs like BMW's Double VANOS push 60° on intake and 25° on exhaust. To estimate response time:
Modern electric cam phasers (Toyota's VVT-iE, Mercedes M256) replace the oil-driven vane with an electric motor and planetary gearset. They phase instantly at cold start before oil pressure builds — critical for direct-injection cold-start emissions, where every degree of intake timing affects HC output during catalyst light-off.
Daily Debugging Puzzle
+= Trap: The Exception That Still Mutates2026-05-15
This function is supposed to append items to the list stored inside a record tuple. If it can't update the record, the caller catches the TypeError and assumes nothing happened. Look closely at the output before reading on.
def append_items(record, new_items):
"""record is (id, items_list). Append new_items in-place."""
record[1] += new_items
return record
inventory = (42, ["apples", "bread"])
try:
append_items(inventory, ["cheese", "dates"])
print("Update succeeded")
except TypeError as e:
print(f"Update failed: {e}")
print("Rolling back... (nothing to do, exception was raised)")
print(f"Final inventory: {inventory}")
Expected output (if you believe the exception means "nothing happened"):
Update failed: 'tuple' object does not support item assignment
Final inventory: (42, ['apples', 'bread'])
Actual output:
Update failed: 'tuple' object does not support item assignment
Final inventory: (42, ['apples', 'bread', 'cheese', 'dates'])
The mutation happens and the exception is raised. The "atomic-looking" statement record[1] += new_items is actually two operations performed in sequence:
record[1].__iadd__(new_items). For lists, __iadd__ is the same as .extend() — it mutates the list in place and returns the same list object. This succeeds.record[1] = <result of step 1>, which calls tuple.__setitem__. This raises TypeError because tuples are immutable.By the time step 2 fails, step 1 has already mutated the list. The += operator on a mutable element of an immutable container leaves you with a half-applied "transaction" — and worse, code that catches the exception sees a state inconsistent with the apparent failure.
You can confirm this isn't a quirk of the interpreter by disassembling: dis.dis shows the bytecode emits BINARY_OP followed by STORE_SUBSCR. The store fails; the binary op's side effects are already committed.
The same trap snares anyone using namedtuple with a list field, or storing lists as dict values keyed under a frozen wrapper, or freezing config objects with mutable sub-fields.
If you really want in-place mutation, call the mutating method directly — it has no rebind step:
def append_items(record, new_items):
record[1].extend(new_items) # one operation, no STORE_SUBSCR
return record
If you want value semantics — produce a new record and leave the old one alone — rebuild the tuple:
def append_items(record, new_items):
return (record[0], record[1] + new_items) # concat creates a NEW list
The deeper lesson: += is sugar that desugars differently depending on the type of the target. For an immutable target, it desugars to x = x + y (rebind only). For a mutable target stored in an immutable parent, it tries to do both — and silently leaves you in the worst of both worlds when the rebind half fails.
TypeError you catch is not a guarantee that nothing changed.
Daily Digital Circuits
2026-05-15
After you've equalized your channel and recovered your clock, how do you actually prove the link works? You stare at an eye diagram. It's the single most important picture in high-speed digital design, and once you learn to read it, you can diagnose almost any link problem in seconds.
What it is: Take a long stream of random data bits, slice the waveform into one-bit-period (UI, "unit interval") chunks, and overlay them all on top of each other on the same time axis, triggered by the recovered clock. Thousands of overlapping transitions form a shape that looks like an open eye. The opening is where the receiver samples; closure is where it fails.
The four critical measurements:
Reading a closed eye: If the eye is closing vertically, you have an amplitude problem — attenuation, crosstalk, or reflections from impedance mismatches. If it's closing horizontally, you have a timing problem — jitter from the PLL, power supply noise, or ISI from a lossy channel. The shape tells you where to look.
Real example — PCIe Gen4 at 16 GT/s: The UI is 62.5 ps. The spec demands an eye height of at least 25 mV and an eye width of at least 18.75 ps (0.3 UI) at the receiver pad, measured after a reference equalizer. If your trace is 12 inches of FR-4, the raw eye is completely closed — you literally cannot see an opening on the scope. Only after applying CTLE and DFE in the receiver does the eye open up enough to sample.
Rule of thumb — the BER bathtub: Eye opening corresponds exponentially to bit error rate. At the eye center, BER is essentially zero; near the edges, it climbs as exp(-x²) due to Gaussian jitter. To hit BER = 10⁻¹², you typically need the sampling point at least 7 standard deviations of jitter away from the eye edge. That's why a "barely open" eye on the scope still means catastrophic errors.
Modern high-speed scopes auto-generate "bathtub plots" and statistical eyes from millions of UI to extrapolate BER without waiting hours for actual errors to accumulate.
Daily Electrical Circuits
2026-05-15
Every op-amp has an input offset voltage (VOS) — a small DC error that appears between the input pins even when they should be equal. For a jellybean part like the LM358, VOS can be 7 mV with a tempco of 7 µV/°C. When you're amplifying a 100 µV thermocouple signal at a gain of 1000, that offset becomes 7 V of error at the output — completely swamping your signal. Chopper stabilization is the technique that drives VOS down to the nanovolt range and nearly eliminates drift.
The core trick: modulate the DC input up to a higher frequency, amplify it there, then demodulate back to DC. Op-amp offset and 1/f noise don't get modulated — they live at DC. So when you demodulate the signal back down, the offset gets shifted up to the chopper frequency, where you filter it out.
The classic architecture uses two MOSFET switch pairs forming input and output choppers, clocked at fchop (typically 10 kHz to 1 MHz). The input chopper alternately swaps the (+) and (−) inputs at fchop. The signal becomes a square wave at fchop. The amplifier amplifies this AC signal. The output chopper, synchronized with the input, demodulates it back to DC. Any DC error introduced by the amplifier itself gets chopped up to fchop and is removed by a low-pass filter.
Real-world example: The Analog Devices LTC2057 is a chopper op-amp with VOS = 4 µV max and drift of 0.015 µV/°C — roughly 500× better than the LM358. In a strain-gauge load cell amplifier (4 mV full-scale output at 2 kg load), using a standard op-amp gives you ±2% error from offset alone. Drop in an LTC2057 and the offset error becomes 0.1% — measurement-grade.
Rule of thumb: The signal bandwidth must be well below fchop/2 (Nyquist for the chopping). For a 10 kHz chopper, keep your input signal under ~1 kHz. Above that, you get aliasing of chopper artifacts back into your signal band.
Watch out for:
Use choppers when you have small DC signals (thermocouples, bridges, current shunts) and you can't afford offset trim or auto-zero routines in firmware.
Daily Engineering Lesson
2026-05-15
Moving fluid through a pipe costs energy. That energy goes into overcoming friction between the fluid and the pipe wall, and the math behind it has a brutal consequence for pipe sizing: friction loss scales with velocity squared, and velocity scales with the inverse of diameter squared. Double the diameter and friction loss drops by roughly 32×. This is why municipal water mains are absurdly oversized and why HVAC engineers obsess over duct dimensions.
The governing equation is Darcy-Weisbach:
hf = f · (L/D) · (v²/2g)
The friction factor f depends on Reynolds number and relative roughness (ε/D). For turbulent flow in commercial steel pipe, f typically lands between 0.02 and 0.04. For fully rough turbulent flow, it asymptotes to a constant set by roughness alone — Reynolds number stops mattering.
Real-world example: You're pumping 200 GPM of water 500 ft through schedule 40 steel pipe. Pick 3" pipe (ID ≈ 3.07"): velocity is about 8.7 ft/s, friction loss is roughly 25 ft of head. Bump to 4" pipe (ID ≈ 4.03"): velocity drops to 5.0 ft/s, friction loss falls to about 6 ft. You just cut pumping power by 75% for the cost of slightly larger pipe — which pays back in months on electricity alone.
Rules of thumb engineers actually use:
Why this bites software people: if you're sizing a cooling loop for a server rack or a process skid, the temptation is to spec pipe by flow rate alone. But friction loss sets pump size, pump size sets motor size, and motor size sets the operating cost for the next 20 years. The pipe is a one-time capital expense; pumping power is forever.
Forgotten Books
2026-05-15
Book: Domestic amusements, or philosophical recreations containing the results of various experiments in practical science, and the useful arts : applicable to the business of real life ... including numerous useful tests of adulterations ... and an account of new and important discoveries in natural philosophy being a sequel to Philosophical recreations, or winter amusements by Badcock, John, active 1816-1830 (1823)
Read it: Internet Archive
Tucked into the cumbersome title page of John Badcock's 1823 compendium is a phrase that should stop any modern reader cold. The book promises:
NUMEROUS USEFUL TESTS OF ADULTERATIONS IN THE MATERIALS THAT CONDUCE TO HEALTH
This was not a niche curiosity. In Regency London, food adulteration was endemic and often dangerous. Bread was bulked with alum, chalk, and ground bones. Tea leaves were stretched with dried hedge clippings dyed green with copper salts. Pepper was floor sweepings. Beer was "improved" with cocculus indicus, a fish-stunning poison. Pickles were greened with verdigris — literal copper corrosion. A working family's grocery basket was, statistically, partly fraud and partly slow poison.
Badcock's Domestic Amusements was a sequel to his earlier Philosophical Recreations, or Winter Amusements. In the preface he is unusually candid about why he wrote a second volume — he found the older authorities he had previously relied upon (he names Hooper, Salmon, Boyle, Lupton, Smith, and Imison) to be:
frequently found unintelligible, always insipid, and sometimes trifling. "Provide a,"—"You take a,"—"Take your—in your hand," formed the boundaries of the [instruction]
His complaint is essentially that the previous generation's science-for-the-home books had degenerated into vague parlor tricks. He wanted procedures specific enough that an ordinary householder could actually use them — including, crucially, to test whether their grocer was poisoning them.
What is forgotten today is not the chemistry itself — most of these tests still work — but the cultural expectation that an ordinary householder would perform them. The home cook of 1823 was expected to drop a bit of suspected bread into vinegar and watch for the effervescence that betrayed chalk; to boil pickle brine and look for the blue-green tinge that meant copper; to stir suspect tea into water and see whether the dye ran. Detecting fraud in your own pantry was a domestic skill on par with mending or preserving.
This responsibility evaporated in the late 19th century with the first pure-food laws — Britain's 1860 and 1875 Adulteration Acts, and in the United States the 1906 Pure Food and Drug Act that birthed the FDA. We outsourced the chemistry, and rightly so. But we also lost the habit of skepticism toward our food supply, and the small competence of being able to verify it ourselves.
Badcock would have recognized it immediately, and probably written a chapter about it.
Forgotten Darkroom
2026-05-15
Book: CIA Reading Room cia-rdp79b00873a001800010046-5: PROJECT OBJECTIVE - MATERIALS HANDLING STUDY (NON-DIGITALLY STORED DATA) by CIA Reading Room (1966)
Read it: Internet Archive
Tucked inside a declassified 1966 CIA proposal lies a snapshot of an agency suffocating under its own paperwork. The document, prepared for the National Photographic Interpretation Center (NPIC) — the unit that analyzed U-2 and satellite imagery during the Cold War — describes what we'd now recognize as an unmistakable big data crisis, two decades before the term existed.
The study's authors lay out the scale with startling specificity:
"It is currently estimated that there are between 1,000,000 and 2,000,000 separate items on hand, e.g., 1,250,000 maps and charts; 75,000 reports; 20,000 books and magazines; 50,000 to 100,000 other miscellaneous indexes and files; and in excess of 150,000 photographs and undeterminate number of which exist in random 'chip' form."
The problem statement reads like a memo that could have been written in any modern enterprise IT department:
"Current and anticipated increases in the volume of imagery and collateral data inputs to NPIC require more rapid and accurate handling, updating, and accessing... The manual methods used to reproduce, store..."
What's striking is the framing. The CIA explicitly carves out the difficult problem — the non-digitally stored data: maps, briefing aids, photo "chips," reports. They knew digital indexing was coming. They had computers. But the actual stuff being indexed was paper, film, and chemical emulsion. The metadata was tractable; the substrate was not.
This is the lost lesson. We tend to remember the 1960s as the dawn of mainframes and orderly card catalogs. But the CIA — arguably the most resource-rich information consumer on the planet — was openly admitting that human analysts were drowning. Their proposed solution wasn't more storage; it was a study to figure out how to even study the problem. The very first task was to admit they didn't know how their own information moved.
Modern parallels are everywhere:
The CIA was, in effect, the first organization to publicly admit (in classified form) that information abundance is a logistics problem disguised as a knowledge problem. The U-2 program could photograph the Soviet Union. Nobody had figured out how to find any specific photograph six months later.
Forgotten Patent
2026-05-15
Everyone remembers Herman Hollerith — the American engineer whose punched-card tabulator counted the 1890 U.S. Census and whose company eventually became IBM (US Patent 395,782, filed 1884). Almost nobody remembers Otto Schäffler, a Viennese telegraph-equipment manufacturer who, in the same window, built a parallel machine for the 1890 Austrian census — and then quietly patented improvements that pushed tabulation toward something startlingly close to a modern database query.
Schäffler licensed Hollerith's basic patent, but his Austrian Patent of 1890 (and follow-ons through 1895 covering what he called the Zähl- und Sortiermaschine) added a mechanism Hollerith's machine lacked: automatic sorting by multiple criteria in a single pass. Hollerith's 1890 sorter required an operator to re-feed the deck for each new question. Schäffler's machine used a bank of relay-driven gates that could simultaneously route a card based on combinations of hole positions — effectively, a hardwired WHERE clause with conjunctions.
What the machine actually did:
This is, mechanically, a columnar database with compound boolean filters. The card is the row. The hole positions are the columns. The relay matrix is the query plan. The counter is SELECT COUNT(*). The sort bins are GROUP BY.
Schäffler also patented something Hollerith didn't bother with for years: a card-verification mechanism. Two operators punched the same source data on two machines; a comparator flagged any card where the hole patterns disagreed. This is double-entry data validation — the exact same idea modern ETL pipelines call reconciliation checks.
Why does no one know him? Three reasons. First, his machines were built in tiny numbers — maybe a dozen total — for Austria-Hungary, Saxony, and a handful of insurance companies. Second, he died in 1908 and his Vienna workshop was absorbed into local telegraph manufacturing; the patents lapsed without a corporate heir like IBM to keep the name alive. Third, the Austrian census records he processed were largely destroyed in two world wars, erasing the most visible monument to his work.
The modern echo: when a data engineer writes SELECT religion, COUNT(*) FROM citizens WHERE language='cs' AND age BETWEEN 20 AND 30 GROUP BY religion, they are describing, almost line-for-line, what Schäffler's 1895 machine did in brass and relays. The 1970s relational model formalized the algebra. Schäffler had already built the physical execution engine eighty years earlier — he just lacked the vocabulary to describe what he had done. His machine wasn't a calculator. It was a query processor, and it ran on punched cardboard and clicking electromagnets while Vienna was still lit by gaslight.
Daily GitHub Zero Stars
2026-05-15
Language: Python
This is the kind of quiet infrastructure repo that solves a very specific, very real problem: it's a translation shim that sits between Anthropic-shape clients (like Claude Code itself) and any OpenAI-compatible chat-completions endpoint. In practice, that means if your company has standardized on EPAM AI DIAL or some other OpenAI-flavored gateway for governance, billing, or compliance reasons, you can still point Claude Code at it and have everything Just Work.
The value proposition is sneaky-good. Most enterprise environments don't let developers hit Anthropic's API directly — there's a corporate gateway in the way that only speaks OpenAI's dialect. Without an adapter like this, you'd be locked out of the entire Claude Code / Anthropic SDK ecosystem at work. With it, you get:
ANTHROPIC_BASE_URL at the adapter and the client never knows it's talking to a different backend.Who benefits? Primarily developers stuck behind corporate AI gateways who want to use Claude Code or other Anthropic-native tooling without abandoning their org's approved infrastructure. Also useful for folks running local OpenAI-compatible servers (Ollama, LM Studio with the right wrapper) who want to experiment with Anthropic clients pointed at non-Anthropic models. The fact that it's zero-stars and freshly pushed suggests it's either brand new or flying under the radar — exactly the sort of utility that someone in the right Slack channel will discover and become quietly grateful for.
Daily Hardware Architecture
2026-05-15
We've covered branch prediction broadly, but the Pattern History Table (PHT) deserves its own lesson — it's the actual data structure that decides whether your if is taken. Understanding its geometry tells you why some branches predict perfectly and others thrash forever.
A PHT is an array of 2-bit saturating counters, indexed by some hash of the branch's PC (and often global history). The counter states are:
The high bit is the prediction. Each branch outcome nudges the counter ±1 (saturating). The 2-bit design is the magic: a single mispredict doesn't flip a strongly-biased branch. A loop that runs 1000 iterations and exits once still predicts "taken" the next time you enter the loop.
Indexing matters more than size. A naive PHT indexed by PC[11:2] aliases: two unrelated branches sharing the same low bits collide and corrupt each other's counters. Modern predictors (gshare, GAg, TAGE) XOR the PC with a global history register — a shift register of recent branch outcomes — so the same branch under different control-flow contexts gets different PHT entries.
Concrete example: Consider a loop processing a sorted array with if (x > threshold). Once you cross the threshold, every branch goes the same way. A 2-bit counter saturates at 11, and you get near-100% accuracy. Now shuffle the array randomly — outcomes become 50/50, the counter oscillates between 01 and 10, and you mispredict ~50% of the time. This is the famous Stack Overflow "why is processing a sorted array faster" answer: a 4-6× speedup purely from PHT behavior.
Rule of thumb: A modern PHT has roughly 16K entries × 2 bits = 4KB of state per predictor table. With 12 bits of index, you have 4096 slots. If your hot loop has more than ~4096 unique branch contexts, you'll alias and lose accuracy. Mispredict cost on a deep pipeline is 15-20 cycles — at 1B branches/sec with 5% mispredict rate, that's 750M-1B wasted cycles per second, or roughly 25-30% of a 3GHz core.
TAGE (the predictor in modern Intel/AMD/ARM cores) layers multiple PHTs indexed with different history lengths and picks whichever has the most confident "tag match" — giving near-optimal prediction for both short-period and long-period patterns. It's the reason indirect branches in interpreters got dramatically faster after ~2015.
Hacker News Deep Cuts
2026-05-15
Link: https://cloudberry.engineering/article/automating-code-security-reviews/
HN Discussion: 1 points, 0 comments
Code security review is one of those activities that everyone agrees matters, and almost no one does well. Manual review is slow, expensive, and inconsistent — the reviewer's mood, their familiarity with the codebase, and the time of day all affect what they catch. Traditional SAST tools, meanwhile, generate so many false positives that developers learn to ignore them, which means real findings drown in noise. This article from Cloudberry Engineering tackles the practical middle ground: how do you actually automate security review in a way that produces signal rather than noise?
Based on the URL and title, the piece almost certainly covers the modern pipeline approach — combining traditional static analysis with LLM-driven contextual review. The interesting tension here is that LLMs are genuinely good at the kind of reasoning that catches subtle vulnerabilities (taint flows that cross function boundaries, missing authorization checks on new endpoints, unsafe deserialization patterns specific to a framework version) but they're also confidently wrong in ways that classical analyzers aren't. Anyone shipping such a system has to grapple with:
The audience that should care about this is broad: security engineers building internal tooling, platform teams choosing between commercial vendors and rolling their own, and developers who are increasingly being asked to act as the first line of review on AI-generated code. That last category matters more every month — if a meaningful share of code being committed is itself generated by an agent, the bottleneck shifts to review capacity, which is exactly what this kind of automation targets.
What makes the post worth surfacing is that it's coming from an engineering blog rather than a vendor pitch, which usually means more honesty about what doesn't work. The hard-won lessons in this space — prompt patterns that reduce hallucinated vulnerabilities, how to chunk a codebase for analysis, when to fall back to deterministic tools — are the kind of practitioner knowledge that rarely makes it into marketing material.
HN Jobs Teardown
2026-05-15
Source: HN Who is Hiring
Posted by: amasad
Of the ten postings, Repl.it's is the most revealing because the founder (amasad) wrote it himself and front-loaded the hard problems rather than perks or mission boilerplate. That's a deliberate signal to a specific audience: systems engineers who get bored at CRUD shops.
The stack reads between the lines. Repl.it doesn't name languages — they name capabilities: "executing, debugging, authoring code, running tests." Pointing at repl.it/languages (50+ runtimes) implies a containerization/sandboxing layer doing the heavy lifting — almost certainly something like nsjail, gVisor, or Firecracker wrapping per-language toolchains, fronted by a generic protocol layer (likely LSP-adjacent for authoring, DAP-adjacent for debugging). The phrase "build generic protocols" is the tell: they're abstracting over fundamentally different execution models (interpreted, compiled, JIT) behind one API.
What this reveals about stage and direction. Three load-bearing words: scaling, security, billing. That trio only appears together when a company has crossed from "demo" into "people are abusing the free tier and we need to monetize without breaking the magic." The explicit "even without needing an account" framing tells you their growth flywheel is frictionless onboarding — which means their abuse surface (crypto miners, botnets, phishing hosts) is enormous. Hiring for security alongside billing suggests they're building paid tiers and hardening the sandbox simultaneously. Classic YC W18 trajectory: 2 years in, product-market fit found, now industrializing.
Skills and trends highlighted:
Green flags: Founder posting directly. Honest about difficulty ("challenging from all... perspectives"). Remote-friendly in 2020 (early adopter, not pandemic-forced). The link to a real jobs page rather than a generic jobs@ email.
Yellow flags: The posting is light on compensation, equity, or team size — typical YC startup opacity. "Engineers" as the only role title is vague; you don't know if you're applying to be employee #15 or #50, which materially changes the offer.
Daily Low-Level Programming
2026-05-15
Modern x86 cores execute instructions out of order — issuing whichever instruction has its operands ready, regardless of program order. But architecturally, software must observe results as if instructions ran sequentially. The bridge between these two realities is the Reorder Buffer (ROB).
When the front-end decodes an instruction, it allocates a ROB entry and renames its destination register to a physical register from the pool. The instruction is dispatched to a scheduler, executes whenever ready, and writes its result into the physical register. The ROB entry is marked "complete" — but the result is speculative. It is not yet architecturally visible.
Only at retirement — when the ROB's head pointer reaches the entry — does the result commit: the architectural register file is updated, stores drain to the store buffer, exceptions fire, and the instruction is "really done." Retirement happens strictly in program order, even though execution didn't.
Why this matters:
Size rule of thumb: Intel Golden Cove has a 512-entry ROB; Apple's M3 has ~670; Zen 4 has 320. Multiply by retire width (typically 6–8 instructions/cycle on modern cores) to get the maximum in-flight window. At 4 GHz with a 512-entry ROB, the CPU can have ~128 ns of work speculatively buffered — roughly one DRAM round trip.
Concrete example: Consider load r1, [rsi]; add r2, r3, r4; sub r5, r2, 1; load r6, [rdi]. The first load misses to DRAM (200 cycles). The independent add and sub execute in cycles 2–3 and sit completed in the ROB. The second load issues immediately — memory-level parallelism. All three wait for the head load to retire before any architectural state changes. If the CPU ran out of ROB entries while waiting, the front-end stalls — this is why ROB size directly bounds memory-level parallelism on cache-miss-heavy workloads.
When you see a "backend stall: ROB full" counter in perf, you've found a workload bottlenecked not by compute but by the CPU's ability to hide latency.
Reddit Small Subs
2026-05-15
Subreddit: r/metalworking
Discussion: View on Reddit (109 points, 27 comments)
This post is part farewell, part masterclass. A veteran architectural metalworker shares his last railing installation before pivoting away from architectural work toward custom furniture and fixtures. What makes it interesting isn't just the craftsmanship — it's the candid material breakdown from someone who's clearly done this thousands of times and is ready to move on.
The build specs alone are a small education in how proper architectural railings come together:
The deeper lesson here is about the economics and ergonomics of architectural metal. Railings are deceptively brutal work: heavy stock, on-site fitting to walls and floors that are never square, scribe cuts, field welding, dealing with finishes and contractors. The skill ceiling is high, but the body wears down. Choosing to walk away from a profitable specialty to make "whatever I want" is a recurring story in skilled trades — and worth hearing from someone at the inflection point.
The comments thread is where the real value lives: other fabricators discussing picket spacing code (typically 4" max gap so a child's head can't pass through), mounting strategies (core-drilled into concrete vs. surface-flanged), and the perpetual debate over welded vs. mechanically-fastened connections at the cap rail. There's also good discussion of finish — whether to leave hot-rolled mill scale on for character, wire-wheel it, or grind to bare metal before painting/clear-coating.
For anyone considering custom railings for their own home, this is a useful reference for what "real" handmade work looks like — and why it costs what it costs. For aspiring fabricators, it's a reminder that the craft has an arc, and that the most respected makers often eventually choose the freedom of artistic work over the steady money of architectural contracts.
RFC Deep Dive
2026-05-15
When a hurricane knocks out cell towers, a coup paralyzes a capital, or a stadium full of people simultaneously dial out after a bombing, ordinary phone calls fail with "all circuits busy." Yet the FEMA coordinator, the White House staffer, and the hospital chief still get through. RFC 4412 is the plumbing that makes that work in the SIP era.
The RFC defines two new SIP header fields: Resource-Priority and Accept-Resource-Priority. They carry a namespace (which authority's priority scheme is in use) and a priority value within it. A call carrying Resource-Priority: ets.0 is claiming the highest priority under the U.S. Emergency Telecommunications Service. A proxy that supports it must give that INVITE preferential treatment when allocating bandwidth, trunk capacity, or processor cycles — and, crucially, may preempt ordinary calls already in progress.
The named namespaces are the interesting part:
dsn — Defense Switched Network (US DoD)drsn — Defense Red Switched Network (the classified/nuclear-command side)q735 — ITU-T's international MLPP schemeets — civilian emergency telecom (FEMA, GETS calling cards)wps — Wireless Priority Service (the cellular analog)Each namespace has its own ordered priority levels (typically five, from routine through flash-override). The MLPP — Multi-Level Precedence and Preemption — concept dates back to AUTOVON in the 1960s, where a senior officer's "flash override" call would literally drop a colonel's existing conversation. RFC 4412 ports that 1960s Cold War semantic onto modern SIP.
Key design decisions:
Accept-Resource-Priority; unknown namespaces must be rejected with 417, not silently downgraded.Why it's still relevant in 2026: as the PSTN finishes its long death and TDM trunks get decommissioned, every government MLPP feature has to be re-implemented on top of SIP. RFC 4412 is the substrate. It's also why your VoIP PBX vendor's data sheet has a "GETS/WPS compliant" checkbox you've probably never thought about. And the same mechanism gets reused for non-emergency QoS: some enterprise deployments use private namespaces to mark CEO calls or trading-floor lines as preempt-capable.
The quirky footnote: RFC 4412 is one of very few IETF specs that explicitly contemplates nuclear command and control as a use case (via drsn). It sits in a strange corner of the standards landscape where Henning Schulzrinne's SIP research collides with USSTRATCOM's continuity-of-government requirements.
Stack Overflow Unanswered
2026-05-15
The asker poses the classic load buffering (LB) litmus test: two threads each load one shared variable and then store to another. Under sequential consistency, at least one thread must observe its load before the other thread's store, so reading tmp0 == tmp1 == 1 is impossible. The ARMv7 memory model architecturally permits this outcome (a store can be reordered past an earlier load to a different address). The question is whether any real ARMv8 implementation actually exhibits LB in practice.
Why this is interesting: ARMv8 tightened the architectural memory model relative to ARMv7. While loads can still be hoisted past earlier loads/stores in the abstract machine, the requirement to forbid "out-of-thin-air" values and the introduction of multi-copy atomicity (writes become visible to all observers simultaneously) constrains the implementation space significantly. Even where the architecture permits LB, vendors may not exploit that latitude because:
A solution approach: The asker should look at empirical surveys rather than hope for a definitive vendor answer. The canonical resources are:
litmus7 directly on a target. The LB test typically needs hundreds of millions of iterations with pinned threads on separate cores and carefully placed memory to surface.The empirical answer, last I saw it: plain LB (independent loads and stores, no dependencies) is occasionally observed on some out-of-order ARMv8 cores, while dependency-carrying variants (LB+data+data, LB+ctrl+ctrl) are not. The Apple M-series and large Cortex-X cores are the most likely candidates because their reorder windows are huge.
Gotchas: Don't conflate "ARMv8 forbids out-of-thin-air" with "LB is forbidden" — OOTA refers to value-fabrication through cyclic dependencies, not LB. Also, compiler reordering can produce LB even if the hardware wouldn't, so use inline assembly when running litmus tests. Finally, multi-copy atomicity (added in ARMv8) rules out IRIW, not LB.
Daily Software Engineering
2026-05-15
You've just updated a user's email in Postgres and now need to publish a UserEmailChanged event to Kafka. The naive code looks fine:
db.commit()kafka.publish(event)What happens if the process crashes between those two lines? The database has the new email, but no event was ever sent. Downstream services — search indexes, notification systems, audit logs — silently drift out of sync. Worse, if you reverse the order, Kafka has an event for a change that was rolled back.
This is the dual-write problem: you cannot atomically write to two different systems without a distributed transaction, and distributed transactions are a performance and reliability nightmare.
The Outbox Pattern solves this by collapsing the two writes into one. Instead of publishing directly to the message broker, you insert the event into an outbox table in the same database transaction as your business write:
BEGINUPDATE users SET email = ... WHERE id = 42INSERT INTO outbox (aggregate_id, event_type, payload, created_at) VALUES (...)COMMITNow either both rows land or neither does — atomicity guaranteed by your existing database. A separate relay process (a background worker, or Debezium reading the WAL) polls or tails the outbox table, publishes each row to Kafka, and marks it as sent.
Real-world example: Shopify uses this pattern extensively. When you place an order, the order row and its associated events (OrderCreated, InventoryReserved, PaymentRequested) are written in one transaction. The relay handles fan-out to dozens of downstream services. If Kafka is down for 10 minutes, events queue up safely in Postgres and drain when it recovers.
Two things to get right:
DELETEing.The pattern's beauty is that it requires no new infrastructure — just a table and a worker. You trade a tiny bit of latency (events publish milliseconds after the commit, not during it) for bulletproof consistency between your database and your event stream.
Tool Nobody Knows
2026-05-15
You've done it. I've done it. Everyone has done it: piped date output through awk through sed trying to figure out which Tuesday is two weeks before the last business day of the quarter. dateutils (Hroptatyr's dateutils, not the Python package) is a family of seven small programs that treat dates and times as first-class data. It's been around since 2011, ships in every distro, and almost no one knows it exists.
The tools: dconv (convert formats), dadd (add durations), ddiff (subtract dates), dseq (generate ranges), dround (snap to boundaries), dgrep (filter by date), and dsort (sort lines by embedded dates).
The "what's the date 47 business days from now" problem:
$ dadd today +47bd
2026-07-20
$ dadd 2026-05-15 +47bd --skip sat,sun,2026-07-04
2026-07-21
Try writing that with GNU date. I'll wait. The --skip flag accepts weekdays AND specific holiday dates. bd means "business day" and the tool understands it natively.
Generate every Tuesday and Thursday between two dates:
$ dseq 2026-05-15 2026-06-15 --skip sun,mon,wed,fri,sat
2026-05-19
2026-05-21
2026-05-26
2026-05-28
...
Compute the time between events with arbitrary unit output:
$ ddiff 2026-05-15T09:00:00 2026-05-15T17:43:21 -f '%H hours, %M minutes, %S seconds'
8 hours, 43 minutes, 21 seconds
$ ddiff 2025-01-01 2026-05-15 -f '%mmo %dd'
16mo 14d
$ ddiff 1970-01-01 today -f '%w weeks'
2940 weeks
The killer app is dgrep, which filters log lines by parsing dates inside them — no regex required:
$ dgrep '>=2026-05-14T22:00:00' /var/log/syslog
$ dgrep --between 2026-05-15 2026-05-15 access.log | wc -l
And dsort sorts log lines by embedded timestamps, even when files have mixed formats — great for merging logs from different services:
$ cat nginx.log app.log | dsort -i '%Y-%m-%dT%H:%M:%S' > merged.log
dround snaps to boundaries — incredibly useful for bucketing time-series data:
$ dround 2026-05-15T14:37:22 /15m
2026-05-15T14:45:00
$ dround today /Mon # next Monday
2026-05-18
$ dround 2026-05-15 -1mo # one month earlier
2026-04-15
Everything composes. Want every other Friday for the next year, formatted as ISO weeks?
$ dseq today +1y --skip sun,mon,tue,wed,thu,sat \
| awk 'NR%2==1' \
| dconv -i '%Y-%m-%d' -f '%Y-W%V-%u'
2026-W20-5
2026-W22-5
2026-W24-5
...
The mainstream alternative is GNU date -d, which handles natural language ("next Friday", "2 weeks ago") but falls apart for business-day arithmetic, requires shell loops for sequences, can't grep logs, can't round, and produces a single date at a time. Python dateutil works but you've now written a script for what should be a pipeline.
Install with apt install dateutils, brew install dateutils, or pacman -S dateutils. On some distros the binaries are prefixed: dateutils.dadd instead of dadd.
What If Engineering
2026-05-15
Imagine if every pane of glass on Earth — skyscrapers, houses, car sunroofs, greenhouses — quietly harvested sunlight while still letting you see through it. Transparent photovoltaics (TPVs) already exist in labs. The question is: could they meaningfully power the buildings they're embedded in?
The Physics Bottleneck
Visible light spans roughly 380–750 nm. A truly transparent solar cell must not absorb in this range — otherwise it tints the window. That leaves only UV (under 380 nm) and near-infrared (above 750 nm) to harvest. The solar spectrum at sea level delivers about 1000 W/m² total, but only roughly 400 W/m² falls outside the visible band that humans use. That's your hard ceiling.
Apply the Shockley-Queisser limit to a UV+NIR-selective absorber and you get a theoretical maximum efficiency around 21% of the full spectrum — but only if you harvest both bands perfectly. Real TPVs using organic semiconductors or quantum dots (think Ubiquitous Energy's coatings) hit about 5–10% efficiency at 70%+ visible transmittance. Call it 7% for a realistic 2026 product.
Back-of-Envelope: One Skyscraper
Take One World Trade Center: ~325,000 m² of glass façade. Roughly half faces sun-useful directions over a day; derate further for angle of incidence (cosine losses average ~0.4 for vertical glass) and weather. Effective insolation: 1000 × 0.5 × 0.4 × 0.75 (clearness) ≈ 150 W/m² average daylight.
Power per m²: 150 W × 0.07 = 10.5 W/m² average during daylight, or about 3.5 W/m² averaged over 24 hours.
Total: 325,000 m² × 3.5 W = 1.14 MW average, or about 10 GWh/year.
The building consumes around 55 GWh/year. So the windows cover roughly 18% of its electricity. Not transformative — but not nothing, and it's energy harvested from surface area that was otherwise just a thermal liability.
Where It Gets Interesting
2 × 1000 × 0.07 ≈ 140 W. Over a sunny day, that's ~1 kWh — about 5 km of EV range. Marginal, but free.The Systems Problem
Wiring 325,000 m² of individually-framed glazing into inverters is brutal. Each pane needs DC bus connections, bypass diodes for shading, and survives 50-year building lifecycles where silicon-based PV chemistries degrade. You're essentially asking a curtain wall to also be a distributed power plant with millions of failure points.
The cleanest deployment isn't retrofitting — it's new-build commercial towers where the TPV layer replaces low-E coatings that buildings install anyway. The marginal cost of "coating that also makes electricity" beats "separate solar array."
Wikipedia Rabbit Hole
2026-05-15
Wikipedia: Read the full article
Imagine an engine with no pistons, no crankshaft, no spinning turbines — just a tube, some metal mesh, and a deafening scream of sound trapped inside it. That's a thermoacoustic engine, and it's one of the strangest pieces of working machinery ever built. Heat goes in one end, cold comes out the other, and in between, a standing sound wave at around 180 decibels does all the work. If you stuck your head in one (you shouldn't), the sound would rupture your eardrums before you could even register the heat.
The trick is that sound waves are really just traveling pressure and temperature oscillations. We usually ignore the temperature part because in air at conversational volumes, it's millikelvin-scale noise. But crank the amplitude up to where the pressure swings are a measurable fraction of atmospheric pressure, and suddenly each compression cycle is genuinely hot, each rarefaction genuinely cold. Drop a stack of thin parallel plates into the tube at the right spot, and gas parcels oscillating back and forth will pick up heat from one plate and dump it onto another a millimeter away. Run it one direction: you have a refrigerator. Run it the other: heat flowing across the stack pumps the wave itself, and you've built an engine.
This is essentially a Stirling engine without the moving parts — same thermodynamic cycle, but the gas does its own shuttling because the acoustic wave already wants to oscillate. The first real demonstration came from Los Alamos in the 1980s, and the appeal was immediate: with no seals, no bearings, no lubricants, you get a machine that can theoretically run for decades. NASA has flown thermoacoustic Stirling generators powered by radioactive decay heat, and Ben & Jerry's prototyped a thermoacoustic ice cream freezer to eliminate HFC refrigerants.
A few details that get progressively weirder:
The most surprising thing isn't the engine itself; it's that the same physics is a nightmare elsewhere. The thermoacoustic instability that powers these tubes is exactly what destroyed early F-1 rocket engines on the Saturn V program: combustion chambers spontaneously turning into giant screaming whistles, with pressure oscillations strong enough to rip the engine apart in milliseconds. The Apollo team spent years and detonated thousands of bombs inside test engines just to find a chamber geometry stable enough to fly.
Daily YT Documentary
2026-05-15
Channel: DocuEra – The History Channel (8400 subscribers)
Note: the title styling is unfortunately clickbait-heavy (caps, emojis), but the underlying content is the strongest of today's batch — most of the other candidates are hashtag-spam Shorts with no real substance.
This documentary, presented by British actor John Nettles, covers a corner of WWII that most general histories barely touch: the Nazi occupation of the Channel Islands — Jersey, Guernsey, Sark, and Alderney — from 1940 to 1945. These small British Crown Dependencies were the only British soil occupied by Germany during the war, and what happened there is a quietly disturbing case study in how ordinary civilians, local police, and government officials navigated life under direct Nazi rule.
Nettles, who lived on Jersey for years while filming Bergerac, brings genuine local knowledge. The documentary explores the construction of fortifications (part of the Atlantic Wall, much of which still scars the islands today), the deportation of Jewish residents, the use of slave labor at Alderney's concentration camp, and the moral compromises made by islanders who couldn't simply flee. It's a useful counterfactual lens for anyone who has wondered what occupation of mainland Britain might actually have looked like.
Daily YT Electronics
2026-05-15
Channel: ELECTROMOTIF (2150 subscribers)
If you've ever wondered how dev boards like the ESP32 DevKit magically enter bootloader mode when you hit "upload" in the Arduino IDE, this video pulls back the curtain. ELECTROMOTIF walks through the USB-to-UART bridge circuit and the clever auto-reset (DTR/RTS) network that flips the chip between run and flash modes without you ever touching the BOOT and EN buttons.
The auto-reset circuit is one of those small bits of design that looks trivial on a schematic but bites beginners constantly. It uses two transistors (or a pair of diodes, depending on the variant) wired to the DTR and RTS lines of the USB-UART chip to drive EN (reset) and GPIO0 (boot select) in just the right sequence. Get the logic backwards and your board either won't reset or will get stuck in bootloader forever — a surprisingly common failure mode in custom ESP32 designs.
This is part 6 of a focused series on rolling your own ESP32 board, so it assumes you already know the basics of schematic capture, but it's exactly the kind of specific, transferable design knowledge that's hard to pick up from datasheets alone. If you're designing anything with a USB-serial bridge — CP2102, CH340, FT232 — the same patterns apply.
Daily YT Engineering
2026-05-15
Channel: Quality during Design (62 subscribers)
Most of today's candidates were Shorts, hashtag-stuffed failure-analysis teasers, or clip excerpts from longer documentaries. This one stood out as the only entry that looked like a real, full-length engineering explainer aimed at practitioners.
The video tackles a problem that is unusually concrete for a design-process talk: what does it take to back a financial promise like a three-month payback with the actual equipment you ship? When the value proposition is a number on a purchase-order justification, concept development stops being a creative exercise and becomes a constraint-satisfaction problem — every architectural choice has to be defensible against capex, throughput, uptime, and energy assumptions baked into that ROI claim.
Expect the host to walk through structured concept development — the kind of disciplined funnel where you generate multiple candidate concepts, score them against quantified requirements, and kill the ones that can't survive contact with the customer's financial model. This is the antidote to the common failure mode of falling in love with the first concept and then engineering backwards to justify it.
Worth watching if you do product or capital-equipment design, work in industrial B2B where payback period drives the sale, or want a clearer mental model for tying early-stage design decisions to downstream commercial commitments.
Daily YT Maker
2026-05-15
Channel: TECH WITH AVNEESH (95 subscribers)
Honestly, this batch was weak — most candidates were AI/automation hustle videos, shorts, or hashtag spam. This clap switch tutorial stood out as the only entry that's actually a hands-on electronics build with named components and a clear pedagogical goal.
The project uses an Arduino Uno paired with a KY-037 sound sensor module to detect claps and toggle a relay-driven light. It's a classic beginner microcontroller project that teaches several useful concepts at once: reading an analog sensor, debouncing a noisy input signal, edge-detecting a transient event (a clap is sharp and brief, unlike ambient noise), and driving a higher-current load through a relay.
The KY-037 in particular is worth understanding — it's an electret microphone fronted by an LM393 comparator with an adjustable threshold pot. Many beginners wire it wrong by reading the digital output when the analog pin gives much better control for clap detection logic (e.g., counting two claps within a 500ms window to avoid false triggers).
At 95 subscribers, this is a tiny channel doing the unglamorous work of school-project-grade tutorials. The component list in the description suggests a real bench build rather than CGI or stock footage.
Daily YT Welding
2026-05-15
Channel: BugeyeBob Project: Lazarus (373 subscribers)
This is the standout pick in a list otherwise dominated by factory promo reels. BugeyeBob is restoring a Subaru 360 (the "Lazarus" project), and he's hit the classic vintage-restoration wall: the reproduction patch panel he needs won't be made for another year, and the panel requires pressed-in stiffening ribs that you can't just hammer in by eye.
His solution is to build his own sheet metal forming die — essentially a male/female tool set that presses the rib profile into flat steel under hydraulic pressure. This is genuinely useful knowledge for anyone doing bodywork, custom fabrication, or one-off panel repair, because commercial dies are either unavailable or absurdly expensive for obscure shapes.
Expect to see die design considerations (clearance for material thickness, draft angles, how to keep the workpiece from wrinkling or tearing), material selection for the die itself (typically a hardenable tool steel or even cast/machined mild steel for low-volume runs), and the press setup. The educational value here is high: it bridges the gap between "I have a press" and "I can actually form the shape I need," which is the step most hobbyists skip and then wonder why their parts look terrible.
Small-channel content from someone actually solving a real restoration problem — exactly the kind of thing worth supporting.
