Sr. Content Developer at Microsoft, working remotely in PA, TechBash conference organizer, former Microsoft MVP, Husband, Dad and Geek.
164336 stories
·
33 followers

Xbox previews two new ways to control cloud games

1 Share
Illustration of Xbox and play logos

I revealed yesterday that the new Xbox Nano controller supports a Wi-Fi connection directly to Xbox Cloud Gaming, and now Microsoft is making it official today. Two new Xbox previews will let players try out using a phone as a controller on smart TVs, as well as cloud connect on the Xbox Nano to connect directly to cloud servers.

"Instead of a Bluetooth connection to your TV, cloud connect uses your Wi-Fi to connect directly to the cloud server running your game," says the Xbox team. "That can help reduce input latency, so gameplay may feel more responsive."

Players in the US will be able to preview the new cloud connect option for the Xbo …

Read the full story at The Verge.

Read the whole story
alvinashcraft
46 minutes ago
reply
Pennsylvania, USA
Share this story
Delete

Nothing teases a screen-free AI device ahead of launch next month

1 Share
Photo of camera of Nothing Phone 4A in front of plants.

Nothing CEO Carl Pei said in a post on X that the company's launching its first AI device in December. That's just a little over a year after Pei announced plans for "AI-native" devices and an AI operating system. He didn't give away much about what exactly the new device is, only that one feature it won't have is a screen:

"Our first AI-native product ships next month. It's a tool, but one built with the personality and care that have come to define a Nothing product. It has no new screen, and it couldn't have been an app."

Pei shared an image with the post that says "NOTHING(R)" in the top left corner, above an ambiguous black rounded …

Read the full story at The Verge.

Read the whole story
alvinashcraft
46 minutes ago
reply
Pennsylvania, USA
Share this story
Delete

Washington voters keep millionaires tax, splitting tech leaders over the state’s competitive edge

1 Share
The Washington State Capitol Building in Olympia. (GeekWire Photo / Kurt Schlosser)

Washington voters appear to have upheld the state’s new tax on high earners, putting the state on track to lose its place among the nine states without an income tax — a status that tech leaders have long touted as an edge in recruiting companies and talent.

Initiative 645, which would repeal the 9.9% tax on household income above $1 million, was trailing 58% to 42% in election-night returns. King County voters rejected the repeal by an even wider margin, with 66.5% voting no. The repeal would need about 62% of the remaining ballots to pass, according to a Seattle Times estimate. 

The tax has divided the Seattle tech community since lawmakers unveiled the proposal in February. Some founders and investors warned it would drive talent and capital out of the state, while others called those fears overblown.

Madrona, the Seattle venture capital firm, gave $250,000 to the repeal campaign, making it one of the biggest donors.

“The outcome on the income tax should be disappointing for all Washingtonians as having no income tax was a major source of competitive advantage for the state,” said Matt McIlwain, a Madrona managing director, responding to questions from GeekWire.

McIlwain, who urged voters to repeal the tax in a GeekWire op-ed in October, said the state saw record economic growth and job creation after voters rejected an income tax in 2010. “I am concerned for the future ability of Washington state to be competitive,” he wrote.

Ben Golden, an attorney and advisor to Pacific Northwest startups and investors, countered that the election outcome demonstrates “that Washingtonians are ready to invest in ourselves.” 

“There’s lots of hard work to follow to ensure that revenue is spent wisely, but at least (Washington) will be ready for the wave of Medicaid cuts and AI job disruption on the horizon,” added Golden, who in February penned an op-ed in support of the tax. 

And while some residents will leave for tax havens, Golden said, “the opportunity remains ripe for the investor community and startups to build and grow in this healthy and talent-packed region.”

Brian Fioca, a Seattle-based serial entrepreneur and investor, hopes the additional tax dollars will improve the quality of life in the state overall. 

“Washington is a wonderful place to live and build a company, full of extraordinary people and talent,” said Fioca, who also offered an earlier op-ed on the issue. “If someone decides not to start a business here, or chooses to leave because of this tax, that’s not someone I’d be particularly excited to work with or invest in anyway.” 

Asked whether the outcome changes how Madrona thinks about investing in Washington, McIlwain didn’t address the state specifically. “Our goal remains to find and partner with amazing founders and their teams to build enduring companies that create innovative products, jobs and economic returns,” he said.

State Sen. Jamie Pedersen, D-Seattle, was an original architect of the tax and the prime sponsor of the bill that created it. As Senate majority leader, he kept reworking the measure to win votes until the final days of this year’s legislative session. Pedersen, who has been in the Legislature since 2007, is also executive vice president and general counsel at Seattle construction and engineering firm McKinstry.

At the No on 645 campaign’s election-night event in Seattle on Tuesday, Pedersen celebrated the outcome.

“We have been saddled with an anchor around our neck, with a tax system that is bad for working people, that’s bad for small businesses, that’s bad for just about everybody except for the one percent,” he said, as seen in a video posted on Instagram.

The No on 645 campaign touted a coalition of working families, labor unions, teachers, small business owners and others — and attracted endorsements from state celebrities like Rick Steves, the Edmonds-based travel writer, and “Jeopardy!” host Ken Jennings.

The tax applies only to income above the $1 million threshold, so a household earning $1.5 million would owe $49,500. It takes effect on 2028 income, with the first payments due in April 2029.

Jeff Bezos, Howard Schultz and Rich Barton have all moved out of state in recent years, though each described the move in personal terms.

McIlwain, who moved with his family from Georgia to Seattle 26 years ago, became a Georgia resident again two years ago. That was before lawmakers unveiled the millionaires tax in February.

In 2010, Steve Ballmer and Microsoft helped fund the campaign that defeated a statewide income tax, but the region’s biggest tech companies stayed out of this fight. The state projects the tax will raise $3 billion to $4 billion a year from roughly 25,000 households. Gov. Bob Ferguson signed it into law in March, along with tax breaks for small businesses and lower-income families.

A lawsuit filed in April by former Attorney General Rob McKenna and former state Supreme Court Justice Phil Talmadge argues the tax is unconstitutional, citing a 1933 ruling that classified income as property, which the state constitution says must be taxed at a uniform rate.

The case will likely go to the state Supreme Court, where Democrat-backed candidates led four of five races on Tuesday’s ballot as of election-night returns, according to the Washington State Standard.

Read the whole story
alvinashcraft
46 minutes ago
reply
Pennsylvania, USA
Share this story
Delete

How to Use AI for Rust Development: Lessons From an OpenAI Engineer

1 Share

“Some people use AI to write more code. I use AI to make my code more correct.” Predrag Gruevski’s pinned post sums up his approach to using AI for Rust development. Predrag works on frontier systems at OpenAI, and he created cargo-semver-checks and Trustfall. In his work, there’s very little room for error. Still, he does most of his engineering with AI in the loop, and his quality bar has gone up. But how?

We wanted to know what that looks like in practice, so we invited him to a RustRover livestream. His presentation was part of our AI & Rust livestream series with the Rust Foundation, which looks at real-world use cases, successes, and failures where Rust and AI meet. This post focuses on Predrag’s most practical advice: what to review, how to prompt AI coding agents, how to verify their work, and what to do when they get something wrong

You can watch the full livestream recording here 👇

Which Rust code deserves the most attention when you use AI?

Before you hand anything to an AI agent, sort the work by how much it would cost to get wrong. Not every line of code is equally important. Some lines deserve 1000 times more attention than others. When you typed every line yourself, 10 lines of unsafe Rust and 10 lines of regular code took about the same amount of time to write. Now AI handles the regular code, so you can move that time to the lines where mistakes are expensive.

Think of your code on a risk scale. At one end, a mistake is cheap to spot and fix. At the other, it can stay hidden for months and do real damage. Here are three points on that scale:

Low-stakes code. A GitHub Actions workflow is a good example. You know what it should do, and the agent has read the docs, so let it write the workflow and test it. If a CI bash script breaks and nothing security-related is at stake, ask the agent to fix it.

Logic that other people rely on. cargo-semver-checks catches breaking changes before they ship, and it now runs in Rust’s own CI. In the five years before it was added, it could have caught around half a dozen accidental breaking changes in Rust releases that forced backports. On the other hand, if its logic is wrong and it tells someone their change is breaking when it isn’t, that’s a very serious problem. So while preparing it for Rust’s CI, Predrag asked AI to construct standard library additions that would trigger false alarms. That scrutiny uncovered false alarms that could affect regular libraries, too. Code like this deserves much more of your time.

Unsafe code. A mistake here can mean memory unsafety, security issues, or a Heisenbug that shows up one time in a billion. That sounds rare until you run it in a data center. There, corrupting data 0.0000001% of the time means it happens all the time. In one real case, a problem of this sort was caused by a mere 20 lines in an unsafe block. This is the code worth reading line by line, or even writing manually. Four hours is a fair price to spend on 100 lines of unsafe code.

How do you prompt AI coding agents to write reliable Rust?

Describe what you want, how you want it done, and what “good enough” means. Don’t settle for “these ten lines of code, please”. A single task can use billions of tokens, producing far more code than you’ll ever read, so the engineering has to happen in the prompt. To write a good prompt, you need to do three things:

Sketch the design

Brief the agent the way you’d brief a very skilled, very diligent colleague who doesn’t have your context. At a whiteboard, you’d draw some boxes and arrows. You’d explain how the types work, which functions and fields you need, and what data goes where. Those are the load-bearing bits. Put them in the prompt and let the agent expand on them.

Do the same for tests. The variable names inside a test case matter much less than the test structure. Do the tests cover all the major cases? Does the right thing happen at the right point in time? Describe that structure in the prompt.

Say which assumptions are acceptable

If you tell a model to be thorough and test everything, you’ll get tests for a meteor strike during a power outage. For aircraft software, that’s the right level of care. For most code, it’s wasted effort. Tell the agent which assumptions are fine, and ask it to check whether a scenario could really happen.

Be precise

Rust questions often have conditional answers. Ask whether a particular change is breaking, and the accurate answer might be “yes, with six caveats”. It depends on whether the trait already existed, whether it was implemented on a type that already existed, whether the trait was sealed, and so on. Your prompts need the same degree of precision about what you want and what you don’t.

All of this takes time, and it pays off. To look for speedups in the Rust compiler and standard library, Predrag spent 45 minutes writing one prompt for Codex. It told the agent where to look: hot code nobody had optimized in a while. It said which changes to prefer: small ones that reuse ideas that already worked elsewhere in the project. And it said how to benchmark: interleaved runs, with at least a 1% improvement in geometric mean.

In one PR, Predrag deleted a single line in the new trait solver. The line recomputed something the code had already computed 40 lines earlier. Removing it made the new trait solver up to 7.5% faster. Once someone points that out, everyone agrees the line should go, but finding it took a lot of engineering and thought.

“It’s very easy to think of AI as just a faster horse. This is an example of it not being a faster horse. In principle, we could have done all of this work manually. It just would have taken five years to find these optimizations.”

Predrag Gruevski
Predrag Gruevski Software Engineer, Frontier Systems at OpenAI

How do you verify AI-generated Rust code?

Focus your review on the design and on how the code is tested. Once agents followed instructions reliably, reading every line no longer turned up issues for Predrag. So he moved on to higher-level questions. Is the API designed well? Are we testing it in all the right ways?

Why advanced testing is suddenly practical

Code coverage, branch coverage, mutation testing, and deterministic simulation were always available, but they took too much effort to use regularly. An agent that reliably follows a process changes that. Describe the process in the prompt, and the agent does the heavy lifting.

A verification process you can hand to an agent

Say you’re building a component with a state machine inside. Each step should catch something the previous one can miss:

Ai for Rust development
  1. Test the structure. A harness that tests every state and every transition shows that each one behaves correctly.
  2. Check coverage on the logic that matters. A coverage tool shows which code the tests execute. Make sure all the non-trivial logic is included.
  3. Check that the tests catch bugs. Simply executing a line doesn’t prove that the tests check what it does. cargo-mutants intentionally introduces bugs into your code and checks whether any test catches them. Each surviving mutant is a prompt to investigate whether the tests missed an important behavior. Add test cases until the code is pinned down in all the right places.
  4. Run unsafe code under Miri and sanitizers. Have the agent think through the important cases and test them under Miri and sanitizers like ASan. These tools work alongside the careful review of the safety invariants, which still deserve your full attention.

As a prompt, the process can look like this:

<code data-enlighter-language="raw" class="EnlighterJSRAW">This component has a state machine inside. The states are [...] and the transitions are [...]. Write a harness that tests every state and every transition and checks that the right thing happens.
Run a coverage tool and make sure the tests execute all non-trivial logic. Panic branches on .unwrap() for illegal input don't need tests. Run cargo-mutants. For each surviving mutant, check whether the tests miss an important behavior, and add test cases where they do.
For any unsafe code, think through the important cases, write tests for them, and run those tests under Miri and ASan. I'll review the safety invariants myself.</code>

What should you do when an AI agent gets it wrong?

Sooner or later, an agent will hand you a result you don’t like. Approach the problem with empathy. Work out why the agent decided on the approach it took and what it would have needed to know to decide differently. If you can’t tell, ask it.

Then put the answer into your setup. If the agent keeps testing unrealistic failures, like that meteor strike, add a line to your agent’s instructions file (such as AGENTS.md). Tell it to make pragmatic assumptions about real-world failures. You can also update your personalization prompt or tweak your skills. Next time, the agent should make a better call.

Nobody is born good at using AI tools. Getting good can take many billions of tokens, and we’re all still learning.

How do you know AI-generated code is good enough to ship?

That depends on what you’re building. Vibe coding is perfectly reasonable for tasks like prototyping, where you just want to know whether an approach works at all, and it’s also fine in apps you build for yourself. If the thing that turns on your lights at 7 pm breaks, it breaks. Vibe coding is fine there.

Production code needs a higher standard. Use AI to reach a level you couldn’t hit alone.

To get there, work backward. Think about how you’d convince someone else that what you built is good, even someone who doesn’t know your domain. For work on the Rust compiler, proof meant a few lines of code, faster benchmarks, a passing test suite, and a change anyone can read and understand. Once you know what proof looks like, set up your workflow to produce it. Pretty quickly, you’ll realize that the person you’re convincing could be you.

Every piece of code you push has your signature on it. It literally comes from your Git client. Use AI to make sure it’s code you’d be proud to put out in the world.

Want more? Watch the full conversation above. For the other side of Rust and AI, read our post on building LLM applications with Rig.

Is AI useful for Rust development?

Yes, especially when you use it to raise your quality bar rather than only to write more code. Agents make it practical to run techniques that used to take too much effort, such as mutation testing, full state-machine coverage, and checking unsafe code under Miri. They can also dig through Git history to find hot code nobody has optimized in a while.

Do you need to read every line of AI-generated Rust code?

No. Match the review to the risk. For low-stakes code like a CI script, testing that it works is usually enough. Logic other people rely on deserves much more of your time, and unsafe Rust is worth reading line by line or writing by hand.

Can AI coding agents write unsafe Rust?

They can, but unsafe Rust needs the most care of any code you work on. Have the agent think through the important cases and test them under Miri and sanitizers like ASan, and review the safety invariants yourself.

Read the whole story
alvinashcraft
47 minutes ago
reply
Pennsylvania, USA
Share this story
Delete

A New Workspace for Building with WordPress

1 Share

In WordPress Studio, a website starts as a conversation. You describe what you want, and an AI agent builds a first version for you. To change something, just tell the agent what you’d like instead.

If you’ve used an agentic coding tool recently, the latest version of WordPress Studio will feel familiar. You’ll find a chat next to a live preview of your site, a choice of models for each task, and the option to use your own API key or let WordPress.com handle it for you.

That’s WordPress Studio today: a free desktop app designed for modern workflows with support for macOS, Windows, and Linux.

How we got here

Back in August, the AI agent was added to WordPress Studio as a beta feature. It’s now at the center of the app, and what you told us during the beta period shaped how we rebuilt the workspace around it. Mostly, that meant making WordPress Studio simpler to navigate. Your sites and their chats live in one sidebar, site and app settings share a single Settings window, and the commands you used to hunt for are a keystroke away. WordPress Studio now feels less like a collection of features and more like one place to build your WordPress sites.

Prefer the terminal? The same agent is there too. Install the Studio CLI and run studio code to chat with it, or studio ui to open the full workspace in your browser.

The basics haven’t changed. You still build sites on your computer, share a preview link when you want feedback, and decide where your site lives when you’re ready.

Start with a direction

Finding the right look for a new site usually takes some back and forth, and the new design flow is built for exactly that. Ask the agent for a site, like “Build a site for my slow-fashion journal called Moire,” and it shows you four looks to choose from. Pick one, and it shows you four layouts in that style. Pick again, and it starts building.

If you already know what you want, describe the design in your request and the agent skips the questions. Either way, the agent saves the result as a design system: a DESIGN.md file in your site’s folder. Later chats follow it, so your site keeps a consistent look as it grows.

A smarter WordPress Studio agent

WordPress Studio Code is the WordPress harness behind the conversation, the tools and context the agent works with. It’s why the agent checks its blocks against the block editor before adding them to your site, and reviews its own work by taking screenshots. When you want to point at something specific, turn on Annotate, pin notes to elements in the preview, and send them to the agent all at once.

You also decide how much power each chat gets. With WordPress.com AI credits, pick Fast for everyday edits, Balanced for work that needs more careful reasoning, or Strong for complex, multi-step builds. Balanced and Strong now run on newer models. If you connect your own Anthropic API key, you choose the model directly, and support for other providers is on the way.

Whichever model you use, you can add custom instructions once in Settings → Instructions, such as “My sites are for restaurants,” and the agent follows them in every new chat.

Publish your site

WordPress Studio already lets you pull a connected WordPress.com or Pressable site down to your computer and push your changes back up. Now the agent works either way: build locally and push when you’re ready, or point it at your live site and let it make changes there directly.

Bring your own agent

Already building with another agent, like Claude Code, Codex, or Cursor? Connect it to WordPress Studio through the Model Context Protocol (MCP). Instructions are available in Settings → MCP. It works through the same WordPress harness as the built-in agent: the tools, the custom instructions, and the WordPress skills that know how to build, edit, and publish a site.

Everything within reach

The new navigation is built around the sites you work on most. Pin the ones you use often, pick up a recent chat right where you left off, and press ⌘K (Ctrl+K on Windows and Linux) to open the command palette and jump to any site, chat, or action.

You can also make the workspace your own. In Settings → Appearance, choose a light or dark theme, pick an accent color, and adjust how strongly it tints the interface and how much contrast there is between surfaces.

How we build now

More and more, building for the web means working alongside an AI agent: you describe what you want and watch your site take shape as you talk. WordPress Studio brings that way of working to WordPress, and we’re shipping updates faster than we ever have. It’s everything WordPress does well, with an agent that knows it inside and out, in one app you can download today.

Start your next project in the new workspace, and let us know what you think.





Read the whole story
alvinashcraft
47 minutes ago
reply
Pennsylvania, USA
Share this story
Delete

Context Graph Makes GPT 6.1 Terra 42% Faster and Uses 43% Less Tokens

1 Share

Have you ever made a small change to an API, shipped it with passing tests, and then heard from another team that you’d broken their integration?

Everything looked fine in your service. But somewhere else, a caller was relying on the field you changed, and you didn’t know that caller existed.

Now you’re searching for the endpoint path across repositories, following SDK imports, and reading client wrappers to figure out who else uses it. Some matches are actual callers. Others are examples, test fixtures, or outdated code. What you needed before merging was a list of consumers, including those not in the repo you checked out. Getting that list turns out to be its own engineering task.

A coding agent can help, but watch what it spends its time doing. It searches, opens files, follows references, and searches again. Much of that work is figuring out where the relevant code lives. And finding a client implementation only answers part of the question. To know whether it’s deployed and still making calls, you need deployment and runtime data too.

Think of a landlord changing the locks. They need to reach everyone who has a key, including the dog walker, the housekeeper, and the tenant’s cousin who waters the plants. Without a record, they have to knock on doors and ask around. Being faster at knocking helps, but it doesn’t help them remember someone in another building.

A key register gives them a starting list. It records who has a key and which door it opens. They still need to check whether each person uses it, and whether anyone is missing. But they can start by contacting the people on the list.

The Postman Context Graph does something similar for your API ecosystem. It indexes services, endpoints, and their relationships across connected sources. You ask which services depend on an API, and your agent gets a list of candidates to investigate. It still needs to check the evidence and establish whether each dependency matters to the change you’re making.

I wanted to know how much work that starting list saves. Does it help the agent reach a good answer with less searching, or does it only give the agent another list to work through?

So I built a harness and gave GPT 6.1 Terra the same 17 engineering questions twice: once with the code alone, and once with Context Graph results supplied before it started searching.

With the graph, Terra used 43% fewer input tokens, cost 43% less in model tokens, and spent 42% less time working. It took fewer steps and made fewer tool calls.

The headline numbers

Everything here is per question, averaged over 17 questions per arm (one run each).

Terra alone Terra + Context Graph Change
Cost (model tokens) $0.226 $0.128 43% less
Input tokens 865,000 491,000 43% fewer
Output tokens 6,850 5,930 13% fewer
Terra’s working time (average) 11.3 minutes 6.5 minutes 42% less
Time to answer, including the graph query (average) 11.3 minutes 8.4 minutes 26% faster
Steps per question 13.4 10.2 24% fewer
Tool calls per question 106 76 29% fewer
Services found per question (answer key) 10.6 16.5 56% more

Across the 17 questions, input tokens dropped from 14.71 million to 8.35 million, and total elapsed time dropped from about 3.2 hours to 2.4 hours.

At the same average model cost, 1,000 questions would cost about $128 instead of $226, roughly $98 saved, along with 374 million fewer input tokens. That’s an extrapolation from this run, and it excludes any charge for the graph query.

The efficiency wins held on most questions: the graph arm cost less on 15 of 17 and reduced Terra’s own working time on 16. The rest of the post shows where those wins came from, and where they didn’t.

What the Context Graph contains

The Postman Context Graph is a private, authenticated map of your APIs and the services that use them. It connects information from Postman, GitHub, and New Relic so you can trace a dependency without piecing everything together yourself.

Postman has the contracts and collections. GitHub has the implementation and call sites. New Relic has deployment and runtime information. Connecting those gives you a way to ask: who calls this API, are they running in production, and who owns them?

Say you’re changing the amount field returned by GET /claims/{id} from dollars to cents. A $125 claim currently returns 125.00. After your change, it returns 12500.

You update your implementation and tests, and everything passes. But what happens to a service that reads that value and still assumes it’s in dollars?

Here’s how I’d investigate that in a hypothetical system:

Question What you find Why it matters
What does the API contract say? amount is documented in dollars, with 125.00 as an example. You’re changing what the value means. Keeping the same field name and type doesn’t make the change compatible.
Who uses that value? settlement-worker calls the endpoint and uses amount to calculate payments. You need to read that calculation. If it assumes dollars, it could calculate a payment 100 times too large.
Is that worker running? It has a production deployment, and runtime data shows calls to claims-service. This is a consumer you need to check before shipping. You still need to establish whether those calls reach the endpoint you’re changing.
Who should review the change? The payments team owns the worker. Now you know who to talk to about updating the caller and coordinating the rollout.
Where else does the amount go? Claims-service publishes a claim.updated event that a reporting service consumes. Check whether the event shares the same conversion or serialization code. You could change the event’s units accidentally while updating the HTTP response.

A code search might find the worker’s client. The graph helps you connect that client to a running service, an owning team, and other dependencies worth checking. Your agent still needs to inspect the code and establish which consumers are affected.

You’ll also hear these relationships described as upstream and downstream. In this example, settlement-worker is a downstream consumer of claims-service. Claims-service is an upstream dependency of the worker.

When you’re changing claims-service, you want to know who depends on it. When you’re trying to run settlement-worker locally, you want to know what it depends on so you can run or simulate those services.

You connect your sources once, and the graph refreshes nightly. It can only work with what’s been connected and indexed, so its results still need checking. Finding a caller in code tells you how the integration works. Runtime data helps you establish whether it’s being used. Together, they give you a better basis for deciding what needs to change before you ship.

The Context Graph documentation covers the supported sources and relationships.

How we tested it: 17 questions, 802 repositories, 34 runs

The claims example is the kind of work this benchmark tries to measure: discovering candidate consumers, then verifying them against the code. We supplied graph results before Terra searched, then measured its token usage, tool calls, execution time, and answers. We did not use these runs to prove that every indexed relationship was correct or that the graph prevented a production incident. The benchmark evaluates repository discovery against code-derived answer keys.

We tested Terra on 17 engineering questions about one public GitHub organization with 802 repositories. We searched that code to build an answer key for each question, independently of the Context Graph. An answer key is the reference list of repositories the scorer expects for that question.

We then asked Terra each question twice:

  • Without the Context Graph: Terra had to find the answer by searching the repositories.
  • With the Context Graph: We asked the graph the same question first, then gave Terra its results as a starting list to check against the code.

Both arms used the same GPT 6.1 Terra model, the same pinned checkout, and the same read-only tools: read_file, list_dir, grep, glob, git_log, and git_blame. The prompts didn’t provide repository names as search hints or tell Terra how many results to find. The graph query is the same short question for every run of a given prompt, and it doesn’t name a repository, so we’re not handing Terra a search strategy. The baseline had no graph access. In the graph arm, the harness supplied the initial query results, and Terra still used the same code-search tools to investigate.

That gave us 34 runs: 17 questions, each tested with and without the graph. We ran each comparison once, so these results show what happened in this test. Repeated runs would be needed to measure how consistently Terra produces the same results.

Nine cross-repository dependency questions

Seven questions asked Terra to identify every repository integrating with a particular service, with a file and line as evidence.

The other two asked:

  • Which repositories consume a Kafka topic published by a named service?
  • Which external service has the most dependent repositories, and which repositories are they?

These are questions where the evidence is spread across repositories. There usually isn’t one file containing the complete answer, and some of it may not be in the checkout at all. Across the 17 questions, the graph arm named about 12 repositories per question that didn’t resolve to anything in the checked-out code, against about 2 for the baseline, which is the kind of reach a grep can’t give you.

Six inventory questions

Inventory questions don’t name a service to look for. They ask Terra to list everything in the organization that has a given property, such as every service that exposes HTTP endpoints or emits telemetry. The answers are large and open-ended. The answer keys range from 11 services (message consumers) to 161 (HTTP endpoints), so there’s no obvious point where Terra can stop searching and be done. The checkout can only show the repositories you have on disk. The graph can also name services that live in repositories you don’t have.

Topic Question
HTTP endpoints Which services expose HTTP endpoints, and what are the paths?
Message consumers Which services consume from a message bus, and which topics?
Runtime calls Which services call each other at runtime?
Deployments Which services are deployed, and how?
Schemas Which services declare a machine-readable data or API contract?
Telemetry Which services emit traces, metrics, or errors about themselves?

Two impact questions

We also asked which services call the organization’s own HTTP API, and which deployed services depend on an SDK facing a breaking change and would need redeploying.

None of the prompts told Terra where to look or how many answers to find.

How we graded: 70% answer key, 5% citations, 25% judge

The benchmark combines three checks, and the weights are fixed: 70% answer key, 5% citations, and 25% model judge.

1. The answer key (70%). The keys came from searching the checked-out code, never from the Context Graph. Grading the graph against its own output would be marking its own homework. For each answer, we report:

  • Keyed recall: correct matches divided by the number of entries in the answer key. It’s the recall half of precision and recall.
  • Precision: correct matches divided by the scored answer entries.
  • F1: the harmonic mean of precision and recall, 2 × precision × recall / (precision + recall). A shotgun list can’t win on it.
  • Services found: the absolute number of correct matches against the key. Matching is primarily at repository level, with component names normalized to parent repositories.

Recall tells us how much of the known dependency set Terra missed. Precision tells us how many reported results failed to match that set. Both matter: a list containing every correct service is less useful if it also includes hundreds of unrelated ones. On bounded questions, where there’s a fixed set of right answers, recall leads. On open-ended inventories, where volume and accuracy move together, services found leads.

2. Citations (5%). Every file path the answer cites gets checked against the repo at the pinned commit. Invent a path and you get caught. The check doesn’t, by itself, prove that the cited code supports the claim.

3. A judge (25%). A language model (Claude Opus 4.7) scores each answer against a rubric. It gets the smallest weight because it can’t inspect the repo the way the other two graders can.

A run passes at a combined score of 0.5. The benchmark also has a separate answer-key check that applies a precision factor to recall. Neither that check nor the combined score is interchangeable with recall or F1, so we don’t use them as accuracy measures here. Name matching allows underscores and hyphens to match, recognizes GitHub URLs, and credits a component like ingester-service to its parent repository.

What counts as the graph arm’s answer. For the answer-key part of the score, we score the graph arm on what the graph returned plus what Terra committed to, since both are part of what the system hands the user. The citation check and the judge see only Terra’s answer. We also score Terra’s answer separately, so you can see how much of any result comes from the graph and how much from Terra. The baseline has no graph output, so its score is its committed answer. That’s why we report recall in two versions later in the post.

Results: 43% cheaper, 42% less working time

Terra reads 43% fewer input tokens with the Context Graph

Input tokens accounted for about 99% of the baseline’s token volume. In this harness, each model step receives the accumulated conversation, including earlier tool results. Reading another file adds that file’s contents to every later request, and taking another step presents the existing transcript again. These input-token totals are cumulative across requests, rather than the size of a single prompt or a count of unique source-code tokens.

With the graph, average input fell from 865,000 to 491,000 tokens per question. Output fell from 6,850 to 5,930 tokens, including a drop in reasoning tokens from 924 to 740.

Per question Alone + Graph Change
Input tokens 865K 491K -43%
Output tokens 6,850 5,930 -13%
Reasoning tokens 924 740 -20%
Steps 13.4 10.2 -24%
Tool calls 106 76 -29%
Whole-codebase grep 52.5 32.7 -38%
read_file 44.9 35.2 -22%
list_dir 6.4 4.8 -24%

The largest reduction was in whole-codebase grep calls, the blunt instrument you reach for when you don’t know where to look. That’s consistent with a narrower search: Terra starts with named candidates and inspects their files, rather than repeatedly searching the entire checkout. The aggregate counts support that interpretation, although they don’t establish that every remaining tool call was useful verification.

By question type, the nine dependency questions used 27% fewer input tokens, the six inventory questions used 67% fewer, and the two impact questions used 50% fewer. Some individual reductions were much larger. Runtime calls went from 1.30 million input tokens to 191,000, HTTP endpoints from 737,000 to 142,000, and API callers from 1.56 million to 419,000. Per question, the graph arm read fewer tokens on 15 of the 17.

Using fewer tokens matters for more than the bill. Chroma’s context rot research tested 18 frontier models and found every one degrading well before its context window filled, and the lost-in-the-middle study found accuracy dropping by 30% or more for information buried mid-prompt. We didn’t measure that effect here, but a shorter transcript is a smaller target for it. Postman’s post on why AI coding agents need context graphs covers the research in more detail.

The model bill falls by 43%

Here’s the cost across all 17 questions in each arm.

Model token cost Terra alone Terra + Context Graph Saved
Uncached input $2.66 $1.32 $1.34
Cached input $0.60 $0.35 $0.25
Output $0.58 $0.50 $0.08
Total $3.85 $2.18 $1.67 (43%)
Per question $0.226 $0.128 $0.098
Per 1,000 questions $226 $128 $98

We calculated these figures using Terra’s published rates of $1.00 per million input tokens, $0.05 per million cached input tokens, and $5.00 per million output tokens. All input that wasn’t a cache read, including cache writes, was billed at the full input rate. The figures count model tokens only, and graph-query charges are excluded.

About 83% of input tokens were cache reads, which cost 20 times less than fresh input. That explains how a run processing hundreds of thousands of input tokens averages roughly $0.23 per question, and why the saving is smaller than a flat-rate calculation would suggest. Without the cache discount, the same token usage would cost $15.29 for the baseline and $8.85 with the graph.

The graph arm cost less on 15 of 17 questions, by as much as 74% on API callers ($0.535 to $0.138), and 57% on runtime calls.

Terra spends 42% less time working with the Context Graph

We measured both Terra’s working time and the total time to answer. The 42% reduction refers to model working time, which leaves out the wait for the graph. End-to-end answers were 26% faster on average.

Minutes per question Terra alone Terra + Context Graph
Terra’s working time, average 11.3 6.5
Terra’s working time, median 6.4 2.6
Wait for the graph query, average none 1.8
Wait for the graph query, median / longest none 0.6 / 7.0
Time to answer, graph wait included, average 11.3 8.4
Time to answer, median 6.4 8.1
Time to answer, slowest quarter begins at 19.1 13.3
Time to answer, 95th percentile 24.8 14.6
Slowest single question 25.3 15.1
Total across the 17 runs 3.2 hours 2.4 hours

Results: what happened to the answers

On dependency questions, same recall, less than half the time: 18.8 minutes → 10.3 minutes

A dependency question asks Terra to find every repository that relies on one specific thing. Seven of the nine ask which repositories integrate with a named service: Datadog, Google Cloud Storage, Slack, AWS S3, PagerDuty, Vercel, and OpenRouter. Each answer needs a file and line that proves the integration. The Slack question, for example, has an answer key of 12 repositories, and Terra has to find which 12 of the 793 they are. One question asks which repositories consume a Kafka topic published by a named service, and the last asks which single external service the most repositories depend on.

These are the questions closest to the “who else uses this?” problem from the start of the post. The code that answers them is spread across many repositories, with nothing listing it in one place.

Across these nine questions, recall was already around 90% in both arms. Terra could usually assemble the answer from the code. The graph reduced the work needed to get there: average working time fell from 18.8 minutes to 10.3 minutes, about 45% less.

Terra's working time, dependency questions (9)           minutes
  alone         ████████████████████████████████████████   18.8
  + Graph       ██████████████████████                     10.3

The combined benchmark score, including the answer key, citations, and judge, rose from 0.822 to 0.858. It improved on seven questions, stayed level on the Datadog question, and fell on the most depended-on service question.

Each row below is one of the nine questions. The score runs from 0 to 1, higher is better, and blends the three checks described earlier: 70% answer key, 5% citations, and 25% judge.

Question Alone + Graph
Slack integrations 0.78 0.94
PagerDuty integrations 0.94 1.00
OpenRouter integrations 0.80 0.85
Google Cloud Storage integrations 0.81 0.86
Kafka topic consumers 0.84 0.88
AWS S3 integrations 0.80 0.82
Vercel integrations 0.75 0.76
Datadog integrations 0.87 0.87
Most depended-on service 0.80 0.75

Slack is a useful concrete example. Terra alone found 11 of the 12 repositories that integrate with Slack. With the graph, it found all 12. Google Cloud Storage went from 16 of 18 to all 18. For the other named integrations, Terra was already finding everything or almost everything. There wasn’t much room to improve recall, but there was plenty of room to reduce the search.

This is the kind of question where the answer is spread out. A dependency like Slack or S3 shows up in dozens of repos, each in a different file, and nothing lists them in one place. File search has to assemble that list one grep at a time, while the graph already has the relationships indexed.

On inventory questions, recall nearly doubled: 0.22 → 0.42

On the six inventory questions, Terra alone found about 22% of the answer key on average. These were large inventories, including 161 services exposing HTTP endpoints and 137 emitting telemetry, and the baseline often stopped after a couple of minutes with a short list. With the graph, Terra’s own answer covered about 42% of the key.

Question In the key Recall, Terra alone Recall, Terra + Graph
HTTP endpoints 161 18% 40%
Deployed services 42 31% 60%
Message consumers 11 27% 55%
Telemetry 137 14% 34%
Schemas 28 32% 39%
Runtime calls 50 12% 28%

Recall improved on every inventory question, while input token usage fell by 67% across the group. The graph found what Terra couldn’t find by searching, and Terra got there reading a third of what it read before.

But Terra also carried more incorrect candidates into its answers. The graph hands Terra a long candidate list (240 names for endpoints, 277 for deployed services, 199 for telemetry), and on HTTP endpoints Terra’s final list grew from 36 names to 139. Across the inventory questions, precision on Terra’s own answers fell from 0.71 to 0.46.

That’s why I wouldn’t describe the inventory result as a clean accuracy win. Terra missed fewer real services and used fewer tokens, but a reader would have more false positives to check. The next thing to improve is how thoroughly the agent validates and prunes the graph’s candidates before presenting the answer.

Where the Context Graph earns its place

After running these tests, I’d start with questions that send an agent searching across repositories: who uses this service, who subscribes to this topic, or what depends on this API.

On the nine dependency questions, Terra already found most of the right answers. With the graph’s candidate list, it spent about 45% less time working and earned a higher combined score. Across all 17 questions, using the graph cost less on 15 and reduced working time on 16. Terra could already do the work. The graph helped it get there with less searching.

I’d be more careful with questions like “list every service.” The graph helped Terra find much more, but it also gave it more candidates to rule out. The relationships need to be clear, too. An app that sends errors through the Sentry SDK is doing something different from a service that calls Sentry’s REST API. Sorting that out can take time.

For an API change, I’d ask specifically for direct HTTP callers, SDK users, or topic subscribers. Then I’d have the agent check the code, show its evidence, and distinguish confirmed consumers from ones it still needs to verify. If I wanted to understand production impact, I’d also check what’s deployed and actually running. A dependency in the code doesn’t tell you that on its own.

The graph gives the model more facts and fewer places to search. The model still has to check whether those facts answer the question. These runs showed a substantial drop in search work, with room to improve how candidates are filtered and relationships are interpreted.

How an agent queries the Context Graph

The agent can query the graph through the HTTP API, the Postman CLI, or the Model Context Protocol (MCP). Authentication scopes access to the team’s graph. You can keep your existing coding agent and model, and the graph provides additional context at inference time.

The HTTP interface uses POST /context-graph/asks to submit a question and GET /context-graph/asks/{askId} to retrieve its result. Completed results can include an answer, structured entities, citations, and query provenance. The API reference defines the response fields. Through MCP, the corresponding tools are submitContextGraphAsk and getContextGraphAsk.

For the hypothetical claims change, I would ask something specific: “Which services directly call the claims HTTP endpoint, and what evidence identifies each caller?” That’s narrower than “what depends on claims?”, which might also include SDK dependencies, message consumers, or other relationships.

The agent then needs to inspect each candidate’s call site, check which endpoint or SDK operation it uses, and determine whether it relies on the response field being changed. A service-level dependency establishes a place to investigate. It doesn’t establish that every endpoint change will break that service.

Try the comparison on your own repositories

Pick a dependency question you already know the answer to, such as which services call billing-api. That gives you a way to check what the agent missed and what it incorrectly included.

First, make sure the graph has your data. In Postman, go to Home > Agent Context, click Manage Data Sources, then click Index. Indexing runs in the background, so you can keep working while it finishes. For a repository-level comparison, make sure the repositories you’re testing are included. The setup documentation covers source configuration. Then authenticate the Postman CLI with postman login and submit the question:

postman context-graph ask "Which services directly call billing-api over HTTP?" --wait --interval 5 --timeout 300

You can also connect an MCP-capable agent to the Context Graph server. For Claude Code, the configuration command is:

claude mcp add --transport http postman-context-graph https://mcp.postman.com/context-graph

Complete authentication for the MCP connection before querying. The US remote endpoint supports OAuth or an API key, and the MCP setup docs describe client configuration and regional options.

Run the same question once with the graph’s candidates in the prompt and once without. Record model tokens, tool calls, and total elapsed time for each, then compare both answers against evidence you trust, such as a grep you’ve verified. Expect the graph’s list to be longer than the true answer, and have the agent confirm each name by reading the code before it commits.

Ask both runs to emit the same final structure: repository, service, relationship type, evidence path, and verification status. Score the confirmed list separately from unresolved candidates. Repeat the comparison enough times to measure variation, and record the checkout revisions and graph revision where available. That makes it easier to separate a useful retrieval result from a grading artifact or a difference in source coverage.

Resources

The post Context Graph Makes GPT 6.1 Terra 42% Faster and Uses 43% Less Tokens appeared first on Postman Blog.

Read the whole story
alvinashcraft
48 minutes ago
reply
Pennsylvania, USA
Share this story
Delete
Next Page of Stories