AI 资讯
Optimize an AI agent to sound human, judged by an AI detector
You can tell when an LLM wrote an email. The "I hope this email finds you well" opener, the three polite paragraphs answering a one-line question. I wanted a reply-drafting agent that didn't do that, and "don't sound like an AI" turned out to be hard to put in a prompt. Banning a few phrases is easy. The rest is judgment, and a single prompt that holds across a friendly dinner invite and a recruiter cold-email took more iterations than I'd guessed. This is not only an email problem. Some platforms down-rank content that reads as AI-generated, so teams publishing at scale have a real stake in prose that clears a detector, even when a human wrote it. The workflow here applies to any of that. So I stopped hand-tuning and let LaunchDarkly agent optimization search for the prompt. You give it a judge that scores "better," and it generates prompt variations and keeps the ones that beat the bar. For the reasoning behind the feature, read the agent optimization announcement . This tutorial is the how. If you don't have an account yet, sign up for LaunchDarkly to follow along. Two pieces do the work here. Claude ( claude-haiku-4-5-20251001 ) runs both roles: it drafts the replies, and it writes each new candidate prompt when the loop asks for one. Scoring comes from GPTZero, which isn't a language model at all but a closed AI detector. I wired it in inverted, so the score is the probability a reply reads as AI and the optimizer drives it down. I went with a detector instead of an LLM-as-a-judge for a reason: grading one model's prose by asking another model whether it sounds human is exactly the call language models are unreliable at, and a tool trained for that one question gives a number you can defend. A run is cheap. Each iteration costs around $0.002 and a few seconds, so a full run lands near a penny or two, and the loop tries variations I'd never sit down and type by hand. This tutorial runs from a saved config You bootstrap the agent, the judge, and the optimization,
科技前沿
2026 Volkswagen Jetta Sport: The cheap car isn't completely extinct yet
At $25,305, you won't find many new cars for less. But you get what you pay for.
AI 资讯
It refused to run a dangerous option. I wrote it one character shorter, and it ran
GitPython ships a guard against dangerous git options. If your code builds a clone command out of anything that arrived from outside, the library will not let --upload-pack or --config through by default, because both of them execute an arbitrary command. The guard is on out of the box and turns off only with an explicit allow_unsafe_options=True . I handed it --upload-pack=/srv/lab/helper.sh . It refused. I handed it the same thing written differently, -u/srv/lab/helper.sh , and it let it through. The script ran. This is CVE-2026-67324, published on 1 August 2026, scored 9.8 on CVSS 3.1 and 9.3 on CVSS 4.0. Those numbers still come from the CNA that filed it: NVD has not run its own analysis yet, the record sits in status Received, so the score may move. Version 3.1.50 is vulnerable, 3.1.51 is fixed. Below, step by step: the lab, both attempts with real output, the code of the check and why it missed, and what the attack looks like from the outside. Plus the part I find more interesting than the hole itself. This is the third bypass of the same barrier within one year, and all three share a root cause. Why this deserves your attention Almost nobody installs GitPython on purpose. It gets 254 million downloads a month from PyPI against five thousand stars on GitHub, and a two-order gap like that means one thing: it arrives as a passenger. With MLflow, with DVC, with bandit, with semgrep, with half the homegrown scripts that touch repositories in CI. Let me draw the boundary right away, so nobody panics for nothing. Having it installed is harmless on its own. The hole fires only when two conditions hold at the same time: your code calls Repo.clone_from(..., multi_options=[...]) , something an outsider influences ends up inside multi_options . The second one happens more often than it sounds. A repository URL from a web form, build parameters from a config another team edits, a field in a CI job, arguments from a webhook. And if you are leaning on allow_unsafe_options=
AI 资讯
Anyone Can Build Software Now. We Tried That Already.
Somewhere on your feed right now, someone is bragging about the app they built in a weekend, no engineering background, no team, just a prompt and a Saturday. The post always ends the same way. Look what I built without needing any of you. Anyone can build software now. That is the whole pitch, repeated in a hundred different captions this month alone. Here is what that post never shows you. The part where someone checks it. Not "does it run." Checks it. Someone who did not write it, looking for the version of it that fails, the input nobody thought to try, the assumption that was wrong in a way the builder was structurally the worst person to catch, because they were too close to their own idea to see the hole in it. That someone is not optional. It is the actual job. None of this is theoretical. A notification icon that, instead of opening a panel, closes the entire page and drops me back on an empty tab. A video call that disconnects mid sentence for no visible reason. A video that plays with the sound simply gone, until I restart it. I do not have a chart proving reliability across the industry is getting worse. What I have is a pattern I keep running into, on products built by some of the most resourced engineering organizations on earth. Why software engineering has more than one person in the room A developer writes the code. A reviewer reads it before it merges. QA tries to break it on purpose. A manager decides if it is actually ready, or just finished. None of these roles exist because engineers do not trust themselves. They exist because a single person, however good, cannot see their own blind spots. That is not a flaw in the person. It is a fact about how blind spots work. Ten sets of eyes exist so that the eleventh mistake gets caught before a million people hit it. We have already watched what happens when that layer disappears, and we did not need AI to run the experiment. We ran it with the spreadsheet. The spreadsheet already showed us the cost of
AI 资讯
The black box in your PDF is a shape, not a delete key
There are two ways to black out a name in a PDF. The first deletes the text and then draws a black rectangle where it used to be. The second just draws the black rectangle. On screen they are indistinguishable. In the file they are entirely different documents, and in the second one every character of the name is still there — selectable, copyable, and extractable by any PDF library in about one line of code. This mistake keeps reaching production in court filings, FOIA releases and regulatory submissions, from organisations that employ lawyers and document teams. It survives not because people are careless but because there is no feedback : the person doing the redacting sees a black box either way, and nothing tells them which one they made until somebody else selects the text. A PDF page is a program The reason the two operations look the same is worth understanding, because it is also the reason you can tell them apart. A page's content stream is a sequence of operators executed in order onto a blank canvas. A very small one looks like this: BT /F1 12 Tf 76 660 Td (Dana Whitfield) Tj ET 0 0 0 rg 74 656 120 16 re f Reading it out: begin text, select font F1 at 12pt, move to (76, 660), show the string Dana Whitfield , end text. Then set the non-stroking colour to black ( rg ), build a rectangle at (74, 656) 120 wide and 16 high ( re ), and fill it ( f ). There is no z-index here, and no concept of one object being "above" another. There is only order. Later paints over earlier. The rectangle covers the name for the same reason a second coat of paint covers the first. Now swap the two halves: 0 0 0 rg 74 656 120 16 re f BT /F1 12 Tf 76 660 Td (Dana Whitfield) Tj ET Same objects, same coordinates, opposite order — and now the name is drawn on top of the black box and is perfectly legible. Which is exactly what a table's shaded header row is: a filled rectangle, painted first, with text on it. That single fact is the whole of what follows. Check it yourself in one li
AI 资讯
Building ferctl top: Kubernetes resource usage vs requests and limits
Series: Platform engineering with Go | Topics: Go, Kubernetes, Cobra, client-go, metrics-server, Platform Engineering This is part of the Platform Engineering with Go series. This post builds on the Cobra CLI patterns from post 4 and client-go from post 3. Read post 4 first if you haven't yet. kubectl top tells you what's happening. It doesn't tell you how close to the edge you are. In post 3 and post 4 , we built a health reporter and learned how to structure a Go CLI with Cobra. Now we put both together into something with real operational value. kubectl top pods -n production NAME CPU ( cores ) MEMORY ( bytes ) go-api-7d6b9f8c4-xk2pq 240m 490Mi go-api-7d6b9f8c4-mn9rt 180m 210Mi go-api-7d6b9f8c4-p8wvz 200m 198Mi That first pod is using 490Mi of memory. Is that fine or is that a problem? Without knowing the limit, you can't tell. You'd have to run kubectl describe pod go-api-7d6b9f8c4-xk2pq , find the resources section, do the mental arithmetic, and repeat for every pod you care about. ferctl top does all of that in one command: ferctl top -n production NAMESPACE NAME CPU USE CPU REQ CPU LIM CPU% MEM USE MEM REQ MEM LIM MEM% STATUS production go-api-7d6b9f8c4-xk2pq 240m 250m 500m 48% 490Mi 256Mi 512Mi 95% !! CRITICAL production go-api-7d6b9f8c4-mn9rt 180m 250m 500m 36% 210Mi 256Mi 512Mi 41% OK production go-api-7d6b9f8c4-p8wvz 200m 250m 500m 40% 198Mi 256Mi 512Mi 38% OK One pod is at 95% of its memory limit. In production, that's a page waiting to happen. ferctl top catches it before it becomes an incident. What you'll learn How to extend the Cobra CLI structure from post 4 with a real subcommand How to query the metrics-server API using k8s.io/metrics How to correlate live metrics with pod specs to show usage vs limits How to implement configurable near-limit warnings How to format clean aligned output with tabwriter How to verify the tool against your real minikube cluster Prerequisites Posts 1–4 read; client-go patterns from post 3 , Cobra CLI structure from pos
AI 资讯
DAREALTYTE
Deliberately best-effort — a settings tweak failing shouldn’t fail a deployment that already succeeded. It surfaces as public: false in the response and a visible warning in the UI, rather than silently handing someone a broken link. Live Stripe checkout failed on day one. Test mode worked perfectly. Live mode returned: Invalid line_items[0]: the product tax code is missing… Product tax code is required for Managed Payments, which is enabled by default on your account. A whole class of bug that only exists in production. I reproduced it directly against Stripe’s API before touching code, then opted the session out of Managed Payments — rather than inventing a tax classification, since whether to collect sales tax is a business decision, not a code one. The meta-lesson Every one of these five bugs was invisible to the test suite. The unit tests were green the entire time — because they tested my parsing logic, and every bug was in the query I sent or the transport I sent it over. Four of them were only findable by hitting the live endpoint and reading actual output. The 1996–2006 bug in particular looked like a total success from every angle except one: 566 results, HTTP 200, tests passing, correct shape. You had to actually look at the dates. Best Use of Sentry Not submitting to this category — DAREALTYTE doesn’t currently use Sentry. Worth being straight about it, since this project is a decent argument for adding it. Bugs 4 and 5 both returned HTTP 200 with well-formed payloads. Error monitoring wouldn’t have flagged either one; nothing threw. What would have caught them is exactly what I ended up doing by hand — inspecting real production responses and noticing the values were wrong even though the shape was right. The one place Sentry would have paid off immediately is Bug 3. The Safari Load failed was reported to me as a screenshot from a phone, with no stack trace and no way to reproduce it in my own environment. A Session Replay or a captured client-side exce
科技前沿
How to stop your phone from overheating in the car
There are several steps you can take to prevent your phone from getting dangerously hot.
开发者
O que são essas letrinhas: BASE
Continuando com a saga de siglas, encontrei de maneira simplista a versão oposta do ACID, o BASE....
开发者
Big Walk is like co-op Breath of the Wild
Untitled Goose Game is a tough act to follow. It was a silly experience that captured what I imagine it would feel like to be a sentient goose: a lot of waddling, a lot of honking, and a lot of shenanigans. That's why Big Walk, the next game from Goose Game developer House House, feels […]
AI 资讯
Release Notes Are Not Product Education: Build a Decision-Oriented Walkthrough
Release notes answer an important question: what changed? About this method: I build KPainter , a source-to-explainer video workspace. KPainter helps teams turn release notes, product briefs, docs, screenshots, and other source material into clear explainer videos. The workflow below keeps the maintained source—not the video—as the source of truth. They are not always enough to answer the next questions a customer, support teammate, or implementation partner has: Does this change affect my workflow? What should I do differently? What is deliberately unchanged? Where can I check the current details when the product evolves again? That difference matters when a team turns a changelog, launch note, or technical update into a walkthrough. A screen recording can show a new control. A useful explanation helps the viewer decide whether to care, what to try, and where the boundary is. Start with the viewer's decision Before opening a recorder or drawing a storyboard, write one sentence in this form: After this walkthrough, [viewer] should know whether [change] affects [their job] , and what to do next. For example: After this walkthrough, an existing workspace administrator should know whether a new approval step changes their release process, and where to configure it. This sentence prevents a common failure mode: putting every release-note bullet into a video. A list of features is complete, but it is rarely a clear path through a decision. Establish the source hierarchy Product details have different lifetimes. The launch note may be a useful summary, while the maintained documentation defines the exact configuration, permissions, availability, or limits. Use a small source hierarchy before drafting scenes: Current product documentation — the maintained source for setup, constraints, and terminology. The release note or change record — why the change happened and the scope of the release. A verified product view — the interface or workflow that a viewer should recognise.
AI 资讯
What 102 Portable Power Stations Tell Us About Buying One in 2026
If you've ever tried to buy a portable power station, you know the problem: every brand claims to be the best, the spec sheets are a wall of numbers, and the forums are full of confident but contradictory advice. "What size do I actually need?" is the most-asked question and the least-clearly-answered. So I did the boring thing. I built a structured database of 102 portable power stations from 24 brands — capacity, output, chemistry, cycle life, solar input, weight, price — and started running the numbers. A few findings were genuinely surprising. 1. Prices quietly collapsed The median portable power station now sits at $0.61 per watt-hour . The cheapest in the dataset is $0.39/Wh (the GRECELL T1000). A few years ago, ~$1/Wh was normal and anything under $0.70 felt like a deal. The practical takeaway: if you're paying much more than ~$0.70/Wh in 2026, you're mostly paying a brand premium. That premium sometimes buys you a better app, ecosystem, or support — but it's worth knowing you're paying it. 2. LiFePO4 basically won 94% of the models I track now use LiFePO4 (lithium iron phosphate) instead of the older lithium-ion (NMC) chemistry. This matters more than any marketing bullet point: LiFePO4: ~3,000–4,000+ charge cycles Older Li-ion (NMC): ~500 cycles At daily use — say you cycle it every day in a van or for backup — that's roughly 8 years vs 18 months before the battery is meaningfully degraded. If a listing still uses NMC to hit a lower price, that "deal" can cost you far more over its life. 3. The fridge myth costs people hundreds of dollars This is the single most common sizing mistake. People size a giant, expensive battery to run a fridge because they do the math like this: Fridge nameplate (150W) × 24 hours = 3,600 Wh/day But a fridge's compressor only runs about 40% of the time . Its real average draw is closer to 60W, so: 150W × 40% × 24h ≈ 1,440 Wh/day In runtime terms: a 1,000Wh power station runs a full-size fridge for about 14 hours , not the ~6 hour
AI 资讯
I Stopped Reading About SEO and Built a Password Generator Instead
For a while, I spent more time reading about SEO than actually doing SEO. Keyword research, domain authority, backlinks, technical SEO, search intent—there was always another guide to read and another tool to try. Eventually, I decided to stop preparing and build a small website from beginning to end. The result is Get Password Generator , a free password generator that creates passwords entirely inside the browser. This is what I have learned so far. Step 1: Finding a keyword with Google Trends I started with Google Trends. Google Trends does not provide exact search volume, but it is useful for comparing keywords and checking whether people’s interest is stable, growing, or disappearing. Instead of looking for the “perfect” keyword, I wanted to find something that: solves a clear problem; can become a focused single-purpose tool; has relatively stable demand; does not require a large backend; can be shipped quickly. A password generator matched those requirements. People already understand what the tool should do, and there is no complicated onboarding process. They open the page, choose their settings, generate a password, and copy it. Step 2: Checking the actual Google results After looking at trends, I searched the keyword directly on Google and examined the first page. This step was more useful than looking at a single difficulty score. I checked: what kinds of pages were ranking; whether the results were tools, articles, or product pages; how quickly users could access the generator; whether the pages worked well on mobile; how clearly they explained privacy and security; whether there was room for a simpler experience. I was not trying to prove that the keyword was “easy.” Search results can change, and established websites are difficult to compete with. I only wanted to answer a practical question: Is there enough room here to build something useful and learn from the process? For me, the answer was yes. Step 3: Buying the domain I purchased: https://getpas
科技前沿
Alienware 27 QD-OLED (AW2726DM) Review: A $350 Winner
We’ve come a long way since exclusively $1,000+ OLED gaming monitors. Alienware’s latest display brings the price down to a shocking $350, though it comes with some important compromises.
AI 资讯
Article: Enabling Evolutionary Architecture Through the Preservation of Change Locality
Why do simple features suddenly require cross-team negotiations? In this article, explore how boundary drift quietly destroys change locality and increases cognitive load across teams. Learn practical sociotechnical strategies - redistributing mechanics, exposing essential policy, and rehearsing exception paths - to restore domain boundaries and enable a truly evolutionary software architecture. By Michael Fischer, Nicholas Lawrence, Monica Karekar
AI 资讯
Microsoft Agent Framework Harness and Hosted Agents Reach General Availability
Microsoft's Agent Framework now ships a supported runtime. Build 2026 brought the Agent Harness, the GitHub Copilot and Claude Agent SDK connectors, and the orchestration patterns to stable release; the harness and Foundry Hosted Agents have since reached GA. The shift is from an SDK for building agents to a governed platform for running them. By Steef-Jan Wiggers
AI 资讯
HashiCorp Ships Public Beta of Vault Kubernetes Key Management
HashiCorp has released a public beta of Vault Kubernetes key management, a KMS v2-compatible plugin that lets the Kubernetes API server delegate envelope encryption to Vault Enterprise, moving the key encryption keys that protect etcd data out of the cluster and into a separately governed trust domain. By Mark Silvester
AI 资讯
AI Is Great at Reasoning. Stop Using It for Workflows.
More than a year ago, which is practically ancient history in the AI years, I wrote a blog about using AI to build new self-service capabilities. It felt like the future. We built a self-service action that could create new self-service actions, helping us move faster, reduce bottlenecks, and scale a small Platform Engineering team supporting hundreds of developers. One of the most interesting parts was using Amazon Bedrock to generate Terraform code dynamically at runtime, allowing the system to determine how a new cloud resource should be provisioned using our existing Terraform modules. It worked. It was impressive. And… we removed it. Looking back, abandoning that approach turned out to be one of the best engineering decisions we made. At the time, it felt like an isolated technical decision. It wasn’t. Recently, we faced a much smaller problem. We wanted to automate the creation of DNS records in Cloudflare through our self-service platform. The first proposal was exactly what you’d expect today: “Let’s build a Claude Skill.” Immediately, I had a strong sense of deja vu. But my hesitation wasn’t about whether AI could do it — it was about whether it should. We were simply asking the wrong question. The Industry Shift A lot of engineers today feel like everything they learned over the last decade suddenly became less relevant. We are DevOps engineers. We are Platform Engineers. We used to spend time designing systems, defining standards, reviewing architectures, and planning before writing a single line of code. Every automation started with the same question: “How should we automate this?” Today, that question has quietly changed. Now we ask: “How can AI do this?” At first glance, that sounds like progress. And sometimes it is. Large Language Models have fundamentally changed the way we build software. Tasks that used to take hours now take minutes, and entire prototypes appear from a single prompt. The temptation is obvious. If AI can do it… why not let AI do
AI 资讯
We crossed 6,000 downloads. Here's what we shipped to get there.
Tuesday morning. Your SOC 2 auditor emails you. "Can you provide evidence of human review for all AI-assisted code changes in the last 90 days — which files were modified, what prompts were used, and whether any credentials were visible in context?" You open your IDE. Git log? Commits are there. PR history? Reviews too. But the AI session itself — the conversation, the code it proposed, whether it saw your .env file, which compliance controls it touched — gone. That gap is why I built Chron. What Chron is Chron is an MCP server that runs alongside your AI coding tool. Every message, every code change, every detected secret — locally timestamped, hash-chained, and stored in a SQLite database you own. No cloud. No data sharing. Works offline. # Install once npm install -g chron-mcp # Check setup chron doctor Works with Claude Code, Cursor, Windsurf, Continue.dev — any MCP-compatible tool. The last four releases: answers to questions auditors actually ask v0.1.39 — "Which sessions are worth reviewing first?" $ chron risk --since = 30d SESSION SCORE BAND SIGNALS a1b2c3d4 87 critical secrets·auth·infra e5f6g7h8 52 high auth·findings ( 2 ) i9j0k1l2 28 review code_changes The attention score: deterministic 0–100 per session. No ML, no API calls. Pure signal from what actually happened: secrets detected (+25), auth code changed (+15), infra modified (+12), open compliance findings (+8 each). A security lead can triage 90 days of AI sessions in under a minute. v0.1.40 — "Can I get a one-pager for this audit?" $ chron dashboard --since = 30d --output = q3-audit.html ✓ Written: q3-audit.html 8 sessions · 4 open findings · 1 critical · 2 high Coverage: 6 controls covered · 3 needs evidence Five sections in a single static HTML file — no server, no login, no port: executive summary, sessions ranked by risk score, findings grouped by framework (SOC 2 / ISO 27001 / EU AI Act / NIST AI RMF), a control coverage map, and contextual next actions. Open in a browser. Print to PDF. Attac
AI 资讯
Compressing Video to a Target File Size: The Bitrate Math in TypeScript
A practical calculator for turning an upload limit into a video bitrate, with enough margin for audio and container overhead. “Make this video smaller” is an open-ended request. “Make this three-minute video fit under 10 MB” is an engineering constraint. The second version sounds more precise, but a quality slider alone cannot solve it. A quality setting tells an encoder how aggressively to preserve detail. It does not directly tell us how many bytes the final file may contain. If the destination has a hard upload limit, the useful starting point is a bit budget. This article builds that calculation in TypeScript, then looks at the assumptions that make the answer less exact than the formula first appears. File Size Is Bitrate Multiplied by Time A video file contains several streams plus a container. For a simple MP4, the largest pieces are usually: the video stream; the audio stream; container metadata and indexing overhead. If we ignore overhead for a moment, the relationship is straightforward: file size in bits = total bitrate in bits per second × duration in seconds Rearranging it gives us the total bitrate available for a target size: total bitrate = target size in bits / duration in seconds That total must cover both video and audio. The approximate video budget is therefore: video bitrate = total bitrate - audio bitrate - overhead allowance The result is not a promise. It is a budget that an encoder can aim at. Be Explicit About MB and MiB Before writing code, decide what “10 MB” means. Storage vendors and many web services use decimal megabytes: 1 MB = 1,000,000 bytes Operating systems and developer tools often display binary mebibytes: 1 MiB = 1,048,576 bytes The difference is about 4.9%. That is large enough to turn a file that looks safe locally into a rejected upload. For a hard external limit, I prefer to calculate with decimal MB and keep an additional safety margin. For an internal tool where the unit is clearly MiB, I make that choice explicit in th