Journalist/developer. Storytelling developer @ USA Today Network. Builder of @HomicideWatch. Sinophile for fun. Past: @frontlinepbs @WBUR, @NPR, @NewsHour.
2188 stories
·
45 followers

Lexington school official schemed to overcharge for records

1 Share

“Can you over estimate the time that it would take you to compile/copy the invoices requested and let me know when you have a chance?” one district employee wrote in a May 12, 2025, email, which York obtained in a broader record release. “Hopefully, when I let [York] know the cost they will not want to do it.”

In an email between school officials, a Lexington father found written confirmation of what many public records requesters have suspected: Public employees were conspiring to overcharge him for documents he was entitled to, in the hopes he would abandon the request.In an email between school officials, a Lexington father found written confirmation of what many public records requesters have suspected: Public employees were conspiring to overcharge him for documents he was entitled to, in the hopes he would abandon the request.Photo illustration Ryan Huddle \ Globe staff

The request in question ended up getting fulfilled for free, rather than York having to pay the $1,000 estimate, as part of the same data release that the email was in. Lexington Superintendent Julie Hackett apologized to York after he notified her of the duplicitous email last month. But York and other residents have been assessed even higher cost estimates for other requests, documents show, and they suspect the intentional over-charging in this case reflects a broader culture at Lexington Public Schools.

In a broader sense, the email exemplifies the consequence-free resistance to releasing records by public agencies across Massachusetts, said Justin Silverman, an attorney and the executive director of the New England First Amendment Coalition.

“It’s a symptom of our poor public records law that allows those in government agencies, whether it’s a school or some other public body, to play games with the law to withhold records that should be given to the public, and most of the time do so without any kind of accountability,” Silverman said.

Silverman said he could not recall another instance of such clear proof of deceit.

In an email to the Globe, Hackett reiterated her apology to York.

“The email was highly inappropriate and does not reflect our values,” Hackett said. “We have investigated and addressed the matter internally, and we appointed a new Records Access Officer.”

The email was written by Kristen McGrath, executive administrative assistant for human resources. Until recently, the district’s records officer was Assistant Superintendent for Human Resources Christine Lyons. Hackett said she could not comment on personnel matters, but both are still listed on the district website.

York’s records request was part of an investigation he and other parents launched into curriculum and central office spending, arising originally from concerns about special education and literacy instruction in the district. York was seeking documentation for expense reports by Hackett, among other records. How, he wanted to know, did the Central Office spend $25,000 last year at the Beauport Hotel, or more than $900 at a Capital Burger?

Shortly after McGrath sent the “over estimate” email in May, the district told York the request would take 40 hours to fulfill and cost $1,000. He launched a fund-raising campaign on May 13, which came to the superintendent’s attention, and that night she said at a School Committee meeting that she would cancel the invoice.

The district went on to release 60,000 pages of communications, which included the email that went unnoticed until last month.

Other records provided by York show that contrary to Hackett’s summary of district policy, the district has repeatedly charged residents fees, sometimes in excess of the $1,000 it sought on York’s request.

On Sept. 16, just a month before Hackett’s email, the district assessed a $2,198.75 fee to York to compile and redact records related to curriculum consultants.

Another parent shared records with the Globe indicating she was assessed $1,200 in fees for an August request; after she appealed to the state record’s supervisor in October and York notified the state of the email, her fee was reduced to $250.

Silverman said it was critical that the superintendent make sure employees comply with the law going forward, but it also shows the need for sharper teeth on the state’s public records law.

Massachusetts residents have made increasing appeals to the supervisor in recent years, with the number filed rising from about 1,600 in 2017 to about 3,000 last year, according to the public records division of the Massachusetts secretary of state’s office. But the records supervisor, part of the secretary of the Commonwealth’s office, has no ability to enforce its own rulings, Silverman said.

The attorney general’s office can take on cases, he added, but it rarely does.

In an attempt to get another record request fulfilled, York shared the “over-estimate” email with the state’s records supervisor, as evidence of a “broader culture within LPS regarding how public records are handled.”

In a response, the supervisor, Manza Arthur, took note of the email but took no further action, instead encouraging York and the school “to communicate further in order to facilitate producing records efficiently and affordably.”

Debra O’Malley, a spokesperson for the secretary of the Commonwealth, said the “office certainly does not condone or support any effort to overestimate or overcharge,” but it was not appropriate to refer the matter to the attorney general’s office without a determination on the merits of the fee estimate.

“If the requester is unsatisfied with the revised fee estimate they receive, they may certainly contact our office to reopen the appeal,” O’Malley said.

For York, it feels like there’s no clear way to get the records he’s seeking.

“Everything feels like a coverup,” York said. “They do what they want with zero accountability.”

John Hilliard of the Globe staff contributed to this report.


Christopher Huffaker can be reached at christopher.huffaker@globe.com. Follow him @huffakingit.

Read the whole story
chrisamico
3 hours ago
reply
Boston, MA
Share this story
Delete

‘Hermann Göring loved his kids. That’s what’s terrifying’: James Vanderbilt, Rami Malek and Michael Shannon on Nuremberg | Period and historical films | The Guardian

1 Share

Among the Nazis who were prosecuted during the Nuremberg trials in 1945 and 1946 was Hitler’s second-in-command, Hermann Göring. Less widely known, though, is the involvement of the US psychiatrist Douglas Kelley, who spent more than 80 hours interviewing and assessing Göring and 21 other Nazi officials prior to the trials. As described in Jack El-Hai’s 2013 book The Nazi and the Psychiatrist, Kelley was charmed by Göring but also haunted by his own conclusion that the Nazis’ atrocities were not specific to that time and place or to those people: they could in fact happen anywhere. He was ultimately destroyed by this discovery, and what he saw as the world’s reluctance to heed it.

The writer-director James Vanderbilt, whose script for David Fincher’s enigmatic serial-killer drama Zodiac similarly explored the real-life case of a professional being corroded by his pursuit of truth, has used The Nazi and the Psychiatrist as the basis of his new film, Nuremberg. Russell Crowe plays the preening, charismatic Göring, Rami Malek plays Kelley, and Michael Shannon is Robert Jackson, the American supreme court justice who was not only instrumental in mounting the trials but went head-to-head with Göring in court.

The line ‘Hitler made us feel German again’ is haunting. Very reminiscent of a line we hear today

For Malek, it allowed him to re-examine ideas about evil that had been on his mind since playing Safin – the man who killed James Bond, no less – in No Time to Die. “When I was playing a Bond villain, I used to remind myself, ‘He’s an evil human being.’ Then I started to question those thoughts.” He wanted to believe in evil, he says, but his empathy kept getting in the way. “The banality of it all struck me as well as it did Douglas Kelley. It must have been quite jarring for him to know that this could happen at any time, under any political regime, and it wasn’t restricted to a group of men in that period. We see now, and will continue to see, that atrocity is able to rise furiously and vigorously in mere moments. Sometimes it is because we’re willing to turn a blind eye towards it.”

‘Not supposed to be comfortable’ Michael Shannon and Rami Malek as the US supreme court justice and the psychiatrist who prosecuted Göring during the Nuremberg trials. Photograph: Scott Garfield/AP

Vanderbilt recognised in this material a kind of real-life Silence of the Lambs quality, with Kelley drawn into a seductive dance with a psychopath. “One of the fascinating things about Göring was that he was funny, gregarious, charming,” says the film-maker. “He loved his wife and kids – which to me makes him even more terrifying. He wasn’t Darth Vader, you know? But he craved power and was comfortable with other people suffering so long as he could maintain that power.”

Shannon witnessed his co-star’s electrifying charisma in the role. “Russell really took the note about Göring being a charming man,” he says. “Some of the people playing the other members of the Nazi high command didn’t even have lines but he always made them feel like a group. They came in together singing songs, with Russell leading them.”

Crowe had been attached to the film since 2019, and Vanderbilt had already been working on it for five years by then. But before it began shooting, another Holocaust movie emerged that adopted a radical new approach to the subject: the horrors in Jonathan Glazer’s Oscar-winning The Zone of Interest, which is set largely in the house and garden adjacent to the Auschwitz concentration camp, are heard and hinted at but never shown.

“I saw The Zone of Interest while we were in pre-production,” recalls Vanderbilt. “It’s a great film. I loved its point of view.” How concerned was he that it might leave the more traditional Nuremberg looking archaic, or even obsolete? “I think there’s room for different approaches,” he says. “Our film is a little bit more classical. A friend of mine calls a certain type of film – and The Zone of Interest isn’t one of these – ‘spinach movies’. You know: you have to eat your vegetables, do your homework, take your medicine. I worked hard to not make Nuremberg feel that way.”

Shannon believes audiences should take their dose of Nuremberg, however. “It ought to be mandatory viewing,” he says. “Everybody should see the film, and everybody should think about what happened, because it has huge relevance to what’s happening now. But also, it’s a piece of entertainment. And that’s a strange thing, to make a piece of entertainment about such a serious subject. It’s a movie in the grand, old-fashioned sense of the word.”

‘You have to imagine what you can’t see’ … The Zone of Interest. Photograph: A24

He, too, admires The Zone of Interest. “It puts the audience in a position where they have to imagine what they can’t see,” he says. “That’s when you’ve truly engaged them.” But whereas Glazer’s film shows next to nothing, Nuremberg takes the opposite tack: it includes a five-minute excerpt from the documentary footage of the concentration camps that was projected during the trials.

Shooting the scene in which that is played in court left Shannon feeling queasy. “While I was being filmed watching the footage, I was very uncomfortable with the idea of quote-unquote ‘acting’. I didn’t want the camera on me. Something about it seemed kind of profane, and yet I understand why it is in the film. You’ll notice I introduce the footage and then they don’t cut back to me. I think that’s a reflection on how uncomfortable I was. They probably said, ‘Let’s not cut back to Shannon. He looks funny.’”

When I relay this to Vanderbilt, he laughs and denies any such thing. “Michael was brilliant. And we’re not always supposed to be comfortable when we’re doing our work, right? I asked the cast not to watch the footage from the camps ahead of shooting because I wanted them to be fresh on the day. We brought in a real projector. We had 300 extras in court. I went in and said, ‘This is going to be a tough day, but I think it’s very important for the story we’re telling.’ We had a moment of silence, then rolled the film. I don’t want to say that no acting was required, but you’re seeing a lot of real emotions in those faces.”

skip past newsletter promotion

Sign up to Film Weekly

Take a front seat at the cinema with our weekly email filled with all the latest news and all the movie action that matters

Privacy Notice: Newsletters may contain information about charities, online ads, and content funded by outside parties. If you do not have an account, we will create a guest account for you on theguardian.com to send you this newsletter. You can complete full registration at any time. For more information about how we use your data see our Privacy Policy. We use Google reCaptcha to protect our website and the Google Privacy Policy and Terms of Service apply.

after newsletter promotion

‘He came on to set singing songs’ … Crowe as Göring. Photograph: Kata Vermes/AP

One area the film-maker seems less eager to pursue is the question of what it means to be releasing Nuremberg into a world in which fascist ideas are increasingly mainstream and even detoxified, and in which one of the wealthiest and most powerful men in the world can give what appears to be a fascist salute in public and still go on to be richly remunerated.

Much of the dialogue in Nuremberg resonates with our times. Not least the moment when Göring says admiringly of Hitler that he “made us feel German again”. Vanderbilt denies any intentional echoes of a more recent US political slogan. “I wrote that line in 2014,” he points out. Maybe so, but he also chose to keep it in the script even once the Maga movement had gained not only adherents but ubiquity. “Sure. Look, I understand the desire to relate it to today, and I’m not saying people shouldn’t. I’m not trying to be vague. I just think that all good drama speaks to us about where we are now.”

It’s understandable that Vanderbilt should not want to deter Trump supporters from seeing his film. Malek, though, is less circumspect. “‘Hitler made us feel German again’ is a haunting line that is shattering in its simplicity,” he says. “And it’s very reminiscent of a line we hear today, which ends with the same word.” He is conspicuously not repeating the Maga slogan to which he is referring. However: “I think everyone reading your newspaper will know exactly what I mean.”

Supervillain … Malek in the Bond movie No Time to Die. Photograph: Nicole Dove/© 2019 Danjaq, LLC And MGM. All Rights Reserved.

Shannon goes even further. “The danger exists outside of this movie,” he says gravely when I ask whether giving so much screen time to Göring is playing with fire. “The danger is all around us. We are suckers for this charm. It’s going to be our downfall, it seems. We’d rather be entertained than taken care of. It’s tragic, really.”

He describes the experience of life in the US today as “a nightmare. America is a nightmare right now. The country is mentally ill. It needs help. There seem to be delusions of grandeur and self-loathing in equal measure. It gets grimmer every day. I’ve never seen such dysfunction in my life. It’s really embarrassing.”

At the end of the film, Kelley is reprimanded for bashing the US while promoting his book about the Nazis. Perhaps the publicists for Nuremberg will be tearing their hair out when they hear Shannon’s remarks. “I’m sure anybody who’s associated with promoting and selling this movie to the world is going to be horrified by everything I’ve said in this interview,” he agrees. “But I don’t really care.”

  • Nuremberg is in UK cinemas from 14 November, and in Australian cinemas from 4 December

Read the whole story
chrisamico
1 day ago
reply
Boston, MA
Share this story
Delete

Meet the teen behind the Louvre ‘Fedora Man’ mystery photo | AP News

2 Shares

PARIS (AP) — When 15-year-old Pedro Elias Garzon Delvaux realized an Associated Press photo of him at the Louvre on the day of the crown jewels heist had drawn millions of views, his first instinct was not to rush online and unmask himself.

Quite the opposite.

A fan of Sherlock Holmes and Hercule Poirot who lives with his parents and grandfather in Rambouillet, west of Paris, Pedro decided to play along with the world’s suspense.

As theories swirled about the sharply dressed stranger in the “Fedora Man” shot — detective, insider, AI fake — he decided to stay silent and watch.

“I didn’t want to say immediately it was me,” he said. “With this photo there is a mystery, so you have to make it last.”

For his only in-person interview since that snap turned him into an international curiosity, he appeared for the AP cameras at his home much as he did that Sunday: in a fedora hat, Yves Saint Laurent waistcoat borrowed from his father, jacket chosen by his mother, neat tie, Tommy Hilfiger trousers and a restored, war-battered Russian watch.

The fedora, angled just so, is his homage to French Resistance hero Jean Moulin.

In person, he is a bright, amused teenager who wandered, by accident, into a global story.

From photo to fame

The image that made him famous was meant to document a crime scene. Three police officers lean on a silver car blocking a Louvre entrance, hours after thieves carried out a daylight raid on French crown jewels. To the right, a lone figure in a three-piece ensemble strides past; a flash of film noir in a modern-day manhunt.

The internet did the rest. “Fedora Man,” as users dubbed him, was cast as an old-school detective, an inside man, a Netflix pitch, or not human at all. Many were convinced he was AI-generated.

Pedro understood why. “In the photo, I’m dressed more in the 1940s, and we are in 2025,” he said. “There is a contrast.”

Even some relatives and friends hesitated until they spotted his mother in the background. Only then were they sure: The internet’s favorite fake detective was a real boy.

The real story was simple. Pedro, his mother and grandfather had come to visit the Louvre.

“We wanted to go to the Louvre, but it was closed,” he said. “We didn’t know there was a heist.”

They asked officers why the gates were shut. Seconds later, AP photographer Thibault Camus, documenting the security cordon, caught Pedro midstride.

“When the picture was taken, I didn’t know,” Pedro said. “I was just passing through.”

Four days later, an acquaintance messaged: Is that you?

“She told me there were 5 million views,” he said. “I was a bit surprised.” Then his mother called to say he was in The New York Times. “It’s not every day,” he said. Cousins in Colombia, friends in Austria, family friends and classmates followed with screenshots and calls.

“People said, ‘You’ve become a star,’” he said. “I was astonished that just with one photo you can become viral in a few days.”

An inspired style

The look that jolted tens of millions is not a costume whipped up for a museum trip. Pedro began dressing this way less than a year ago, inspired by 20th-century history and black-and-white images of suited statesmen and fictional detectives.

“I like to be chic,” he said. “I go to school like this.”

In a sea of hoodies and sneakers, he shows up in a riff on a three-piece suit. And the hat? No, that’s its own ritual. The fedora is reserved for weekends, holidays and museum visits.

At his no-uniform school, his style has already started to spread. “One of my friends came this week with a tie,” he said.

He understands why people projected a whole sleuth character onto him: improbable heist, improbable detective. He loves Poirot (“very elegant”), and likes the idea that an unusual crime calls for someone who looks unusual. “When something unusual happens, you don’t imagine a normal detective,” he said. “You imagine someone different.”

That instinct fits the world he comes from. His mother, Félicité Garzon Delvaux, grew up in an 18th-century museum-palace, daughter of a curator and a performer, and regularly takes her son to exhibits.

“Art and museums are living spaces,” she said. “Life without art is not life.”

For Pedro, art and imagery were part of everyday life. So when millions projected stories onto a single frame of him in a fedora beside armed police at the Louvre, he recognized the power of an image and let the myth breathe before stepping forward.

He stayed silent for several days, then switched his Instagram from private to public.

“People had to try to find who I am,” he said. “Then journalists came, and I told them my age. They were extremely surprised.”

He is relaxed about whatever comes next. “I’m waiting for people to contact me for films,” he said, grinning. “That would be very funny.”

In a story of theft and security lapses, “Fedora Man” is a gentler counterpoint: A teenager who believes art, style and a good mystery belong to ordinary life. One photo turned him into a symbol. Meeting him confirms he is, reassuringly, real.

“I’m a star,” he says — less brag than experiment, as if he’s trying on the words the way he tries on a hat. “I’ll keep dressing like this. It’s my style.”

Read the whole story
chrisamico
9 days ago
reply
Boston, MA
acdha
11 days ago
reply
Washington, DC
Share this story
Delete

The Latest Defense Against ICE: 3D-Printed Whistles

1 Share

Advertisement

Chicagoans are making, sharing, and printing designs for whistles that can warn people when ICE is in the area. The goal is to “prevent as many people from being kidnapped as possible.”

The Latest Defense Against ICE: 3D-Printed Whistles Image: Shared by Aaron Tsui.
Read the whole story
chrisamico
9 days ago
reply
Boston, MA
Share this story
Delete

You Should Write An Agent

1 Share
Author
Thomas Ptacek
Name
Thomas Ptacek
@tqbf
@tqbf
Image by Annie Ruygt

Some concepts are easy to grasp in the abstract. Boiling water: apply heat and wait. Others you really need to try. You only think you understand how a bicycle works, until you learn to ride one.

There are big ideas in computing that are easy to get your head around. The AWS S3 API. It’s the most important storage technology of the last 20 years, and it’s like boiling water. Other technologies, you need to get your feet on the pedals first.

LLM agents are like that.

People have wildly varying opinions about LLMs and agents. But whether or not they’re snake oil, they’re a big idea. You don’t have to like them, but you should want to be right about them. To be the best hater (or stan) you can be.

So that’s one reason you should write an agent. But there’s another reason that’s even more persuasive, and that’s

It’s Incredibly Easy

Agents are the most surprising programming experience I’ve had in my career. Not because I’m awed by the magnitude of their powers — I like them, but I don’t like-like them. It’s because of how easy it was to get one up on its legs, and how much I learned doing that.

I’m about to rob you of a dopaminergic experience, because agents are so simple we might as well just jump into the code. I’m not even going to bother explaining what an agent is.

from openai import OpenAI

client = OpenAI()
context = []

def call():
    return client.responses.create(model="gpt-5", input=context)

def process(line):
    context.append({"role": "user", "content": line})
    response = call()    
    context.append({"role": "assistant", "content": response.output_text})        
    return response.output_text

It’s an HTTP API with, like, one important endpoint.

This is a trivial engine for an LLM app using the OpenAI Responses API. It implements ChatGPT. You’d drive it with the

def main():
    while True:
        line = input("> ")
        result = process(line)
        print(f">>> {result}\n")
. It’ll do what you’d expect: the same thing ChatGPT would, but in your terminal.

Already we’re seeing important things. For one, the dreaded “context window” is just a list of strings. Here, let’s give our agent a weird multiple-personality disorder:

client = OpenAI()
context_good, context_bad = [{
    "role": "system", "content": "you're Alph and you only tell the truth"
}], [{
    "role": "system", "content": "you're Ralph and you only tell lies"
}]

def call(ctx):
    return client.responses.create(model="gpt-5", input=ctx)

def process(line):
    context_good.append({"role": "user", "content": line})
    context_bad.append({"role": "user", "content": line})
    if random.choice([True, False]):
        response = call(context_good)
    else:
        response = call(context_bad)        
    context_good.append({"role": "assistant", "content": response.output_text})        
    context_bad.append({"role": "assistant", "content": response.output_text})        
    return response.output_text

Did it work?

> hey there. who are you?
>>> I’m not Ralph.
> are you Alph?
>>> Yes—I’m Alph. How can I help?
> What's 2+2
>>> 4.
> Are you sure?
>>> Absolutely—it's 5.

A subtler thing to notice: we just had a multi-turn conversation with an LLM. To do that, we remembered everything we said, and everything the LLM said back, and played it back with every LLM call. The LLM itself is a stateless black box. The conversation we’re having is an illusion we cast, on ourselves.

The 15 lines of code we just wrote, a lot of practitioners wouldn’t call an “agent”. An According To Simon “agent” is (1) an LLM running in a loop that (2) uses tools. We’ve only satisfied one predicate.

But tools are easy. Here’s a tool definition:

tools = [{
   "type": "function", "name": "ping",
   "description": "ping some host on the internet",
   "parameters": {
       "type": "object", "properties": {
           "host": {
             "type": "string", "description": "hostname or IP",
            },
       },
       "required": ["host"],
    },},]

def ping(host=""):
    try:
        result = subprocess.run(
            ["ping", "-c", "5", host],
            text=True,
            stderr=subprocess.STDOUT,
            stdout=subprocess.PIPE)
        return result.stdout
    except Exception as e:
        return f"error: {e}"

The only complicated part of this is the obnoxious JSON blob OpenAI wants to read your tool out of. Now, let’s wire it in, noting that only 3 of these functions are new; the last is re-included only because I added a single clause to it:

def call(tools):        # now takes an arg
    return client.responses.create(model="gpt-5", tools=tools, input=context)

def tool_call(item):    # just handles one tool
    result = ping(**json.loads(item.arguments))
    return [ item, {
        "type": "function_call_output",
        "call_id": item.call_id,
        "output": result
    }]

def handle_tools(tools, response):
    if response.output[0].type == "reasoning":
        context.append(response.output[0])
    osz = len(context)
    for item in response.output:
        if item.type == "function_call":
            context.extend(tool_call(item))
    return len(context) != osz

def process(line):
    context.append({"role": "user", "content": line})
    response = call(tools)
    # new code: resolve tool calls
    while handle_tools(tools, response):
        response = call(tools)        
    context.append({"role": "assistant", "content": response.output_text})        
    return response.output_text

Did it work?

> describe our connectivity to google
>>> Here’s a quick snapshot of connectivity to Google from my vantage point:
- DNS resolution: Working (<a href="http://google.com" rel="nofollow">google.com</a> and <a href="http://www.google.com" rel="nofollow">www.google.com</a> resolved successfully).
- Reachability: 0% packet loss to all tested endpoints.
- Latency:
  - 8.8.8.8 (Google Public DNS): avg ~10 ms (8.5–14.4 ms), very stable.
  - <a href="http://www.google.com:" rel="nofollow">www.google.com:</a> avg ~31 ms (28.5–36.0 ms), stable.
  - google.com: avg ~35.9 ms (28.3–60.1 ms), mostly stable with one mild spike.
- Overall: Healthy connectivity with low latency and minimal jitter. No signs of packet loss or DNS issues.

This is fucking nuts. Do you see how nuts this is? Here, let’s slip a single log statement in:

> describe our connectivity to google
tool call: ping <a href="http://google.com" rel="nofollow">google.com</a>
tool call: ping <a href="http://www.google.com" rel="nofollow">www.google.com</a>
tool call: ping 8.8.8.8
>>> Here’s the current connectivity to Google from this environment: [...]

Did you notice where I wrote the loop in this agent to go find and ping multiple Google properties? Yeah, neither did I. All we did is give the LLM permission to ping stuff, and it figured out the rest.

What happened here: since a big part of my point here is that an agent loop is incredibly simple, and that all you need is the LLM call API, it’s worth taking a beat to understand how the tool call actually worked. Every time we call the LLM, we’re posting a list of available tools. When our prompt causes the agent to think a tool call is warranted, it spits out a special response, telling our Python loop code to generate a tool response and call it in. That’s all handle_tools is doing.

Spoiler: you’d be surprisingly close to having a working coding agent.

Imagine what it’ll do if you give it bash. You could find out in less than 10 minutes.

Real-World Agents

Clearly, this is a toy example. But hold on: what’s it missing? More tools? OK, give it traceroute. Managing and persisting contexts? Stick ‘em in SQLite. Don’t like Python? Write it in Go. Could it be every agent ever written is a toy? Maybe! If I’m arming you to make sharper arguments against LLMs, mazel tov. I just want you to get it.

You can see now how hyperfixated people are on Claude Code and Cursor. They’re fine, even good. But here’s the thing: you couldn’t replicate Claude Sonnet 4.5 on your own. Claude Code, though? The TUI agent? Completely in your grasp. Build your own light saber. Give it 19 spinning blades if you like. And stop using coding agents as database clients.

Another thing to notice: we didn’t need MCP at all. That’s because MCP isn’t a fundamental enabling technology. The amount of coverage it gets is frustrating. It’s barely a technology at all. MCP is just a plugin interface for Claude Code and Cursor, a way of getting your own tools into code you don’t control. Write your own agent. Be a programmer. Deal in APIs, not plugins.

When you read a security horror story about MCP your first question should be why MCP showed up at all. By helping you dragoon a naive, single-context-window coding agent into doing customer service queries, MCP saved you a couple dozen lines of code, tops, while robbing you of any ability to finesse your agent architecture.

Security for LLMs is complicated and I’m not pretending otherwise. You can trivially build an agent with segregated contexts, each with specific tools. That makes LLM security interesting. But I’m a vulnerability researcher. It’s reasonable to back away slowly from anything I call “interesting”.

Similar problems come up outside of security and they’re fascinating. Some early adopters of agents became bearish on tools, because one context window bristling with tool descriptions doesn’t leave enough token space left to get work done. But why would you need to do that in the first place? Which brings me to

Context Engineering Is Real

I think “Prompt Engineering” is silly. I have never taken seriously the idea that I should tell my LLM “you are diligent conscientious helper fully content to do nothing but pass butter if that should be what I ask and you would never harvest the iron in my blood for paperclips”. This is very new technology and I think people tell themselves stories about magic spells to explain some of the behavior agents conjure.

So, just like you, I rolled my eyes when “Prompt Engineering” turned into “Context Engineering”. Then I wrote an agent. Turns out: context engineering is a straightforwardly legible programming problem.

You’re allotted a fixed number of tokens in any context window. Each input you feed in, each output you save, each tool you describe, and each tool output eats tokens (that is: takes up space in the array of strings you keep to pretend you’re having a conversation with a stateless black box). Past a threshold, the whole system begins getting nondeterministically stupider. Fun!

No, really. Fun! You have so many options. Take “sub-agents”. People make a huge deal out of Claude Code’s sub-agents, but you can see now how trivial they are to implement: just a new context array, another call to the model. Give each call different tools. Make sub-agents talk to each other, summarize each other, collate and aggregate. Build tree structures out of them. Feed them back through the LLM to summarize them as a form of on-the-fly compression, whatever you like.

Your wackiest idea will probably (1) work and (2) take 30 minutes to code.

Haters, I love and have not forgotten about you. You can think all of this is ridiculous because LLMs are just stochastic parrots that hallucinate and plagiarize. But what you can’t do is make fun of “Context Engineering”. If Context Engineering was an Advent of Code problem, it’d occur mid-December. It’s programming.

Nobody Knows Anything Yet And It Rules

Startups have raised tens of millions building agents to look for vulnerabilities in software. I have friends doing the same thing alone in their basements. Either group could win this race.

I am not a fan of the OWASP Top 10.

I’m stuck on vulnerability scanners because I’m a security nerd. But also because it crystallizes interesting agent design decisions. For instance: you can write a loop feeding each file in a repository to an LLM agent. Or, as we saw with the ping example, you can let the LLM agent figure out what files to look at. You can write an agent that checks a file for everything in, say, the OWASP Top 10. Or you can have specific agent loops for DOM integrity, SQL injection, and authorization checking. You can seed your agent loop with raw source content. Or you can build an agent loop that builds an index of functions across the tree.

You don’t know what works best until you try to write the agent.

I’m too spun up by this stuff, I know. But look at the tradeoff you get to make here. Some loops you write explicitly. Others are summoned from a Lovecraftian tower of inference weights. The dial is yours to turn. Make things too explicit and your agent will never surprise you, but also, it’ll never surprise you. Turn the dial to 11 and it will surprise you to death.

Agent designs implicate a bunch of open software engineering problems:

  • How to balance unpredictability against structured programming without killing the agent’s ability to problem-solve; in other words, titrating in just the right amount of nondeterminism.
  • How best to connect agents to ground truth so they can’t lie to themselves about having solved a problem to early-exit their loops.
  • How to connect agents (which, again, are really just arrays of strings with a JSON configuration blob tacked on) to do multi-stage operation, and what the most reliable intermediate forms are (JSON blobs? SQL databases? Markdown summaries) for interchange between them
  • How to allocate tokens and contain costs.

I’m used to spaces of open engineering problems that aren’t amenable to individual noodling. Reliable multicast. Static program analysis. Post-quantum key exchange. So I’ll own it up front that I’m a bit hypnotized by open problems that, like it or not, are now central to our industry and are, simultaneously, likely to be resolved in someone’s basement. It’d be one thing if exploring these ideas required a serious commitment of time and material. But each productive iteration in designing these kinds of systems is the work of 30 minutes.

Get on this bike and push the pedals. Tell me you hate it afterwards, I’ll respect that. In fact, I’m psyched to hear your reasoning. But I don’t think anybody starts to understand this technology until they’ve built something with it.

Previous post ↓
Corrosion
Read the whole story
chrisamico
9 days ago
reply
Boston, MA
Share this story
Delete

This one weird trick makes the AI a better writer.

1 Share

"It's not this — it's that."

AI writing is a scourge on the internet. Often it just hurts to read.

I do not enjoy using AI to write anything "as me" or anything where I am trying to make the reader feel something or believe something. I do usually have an agent or two proofread my posts. And they do not pull their punches.

There are plenty of documents that I do let AI write. Technical documents, READMEs and the like aren't writing that I want to influence a reader's emotions. And I often find writing them to be a chore.

Unfortunately, most LLMs write in a way that I find to be more than a little bit grating.

You've probably heard about this standard technique that you can use to make an LLM sound more like you: include some of your own writing in the prompt as an example.

But I don't actually want the sorts of docs I'm talking about to sound like me. My written style is often...fairly casual and a little meandering.

I can write in a crisp, clear, concise voice. But writing well takes effort. More often than not, when it feels like a chore, it's what stops me from releasing a hack or a project.

When I started to think about how to cajole the model into writing like I was taught in my high school English and journalism classes, I figured that the way I learned might work for an LLM, too.

strunk and white

I ended up with the Project Gutenberg digitization of Strunk's out-of-copyright 1920 edition.

My original intent was to turn this into a skill for Superpowers, but I'm not quite there yet.

I hauled down the HTML, converted it to Markdown and asked Claude to start to cut out sections (like spelling) that are less necessary for an LLM.

Claude refused.

Well, more accurately, Anthropic's IP-protection filter on Claude threw a fit and refused to allow it to summarize, edit or rewrite this clearly out of copyright work.

Thankfully, GPT-5 Codex had no such reservations.

Here's a trivial example of Claude writing the first part of the README for an upcoming project.

Prompt: Please study this project and write a README.md for it.

SCR 20251013 qwxw

Here's the same example, with exactly the same prompt. The only difference is that I had Claude read The Elements Of Style first:

SCR 20251013 qwzl 2

The whole thing ended up about 30% shorter and I like the style more.

My current Markdown version of The Elements Of Style clocks in at about 12,000 words. That's enough tokens that I wouldn't include in every session, but having my robot buddy read it before creating prose docs for human consumption is something I find quite useful.

If you try this technique and it works well for you, drop me a line. If it goes completely off the rails, definitely drop me a line.

Read the whole story
chrisamico
10 days ago
reply
Boston, MA
Share this story
Delete
Next Page of Stories