@JamesWard

My book: https://nitter.cf/t.co/QGevhw6nyE | My podcast: @HappyPathProg | @AWSCloud Agent Experience | @AgenticAIFdn TC | My opinions are mine

Crested Butte, CO, USA
Joined February 2007
Still cooking! A few more new projects in the past 2 months: - ZIO HTTP MCP client/server library: github.com/jamesward/zio-htt… - ZIO Bedrock library: github.com/jamesward/zio-bed… - sbt revolver alternative for sbt 2.0: github.com/jamesward/sbt-rel… - sbt webjars plugin: github.com/webjars/sbt-webja… - sbt plugin for sass: github.com/jamesward/sbt-sas…
The past 3 months have been the most intense and fruitful of my entire career. I've been cooking, coding, vibing, architecting, designing, imagining, and delivering production systems while teaching developers around the world how to build enterprise-grade AI systems. I'm on my way home from the amazing Spring I/O conference and reflecting on the seemingly insane number of things I've delivered / helped with over the past few months. Here are the most interesting: - SkillsJars: Agent Skills for the JVM ecosystem. Gaining rapid ecosystem adoption for enterprise needs. - javadocs.dev: Improvements for Java / Kotlin / Scala library Agent Experience (Valkey caching, more MCP tools, a new Scala ZIO HTTP MCP library to power it) - ai4jvm.com: A curated AI resource list for Java & Kotlin developers (along with a generalized approach to spec driven, AI assisted websites) - Spring AI AgentCore 1.0: The easy way to deliver enterprise-grade AI Agents & MCP servers on AWS - acp2web: Local code assistants available anywhere via ACP - MCP server for my Effect Oriented Programming book - MCP server for the Spring AI book that Josh Long are working on Along the way I presented and led hands-on Spring AI / Bedrock & MCP sessions at Jfokus, DevNexus, JavaOne, Voxxed Amsterdam, AI4J, Spring I/O, and GIDS in Bangalore next week. And I joined the Agentic AI Foundation Technical Committee, helping steer standards for the agentic world. It has been a wild ride and I'm loving how AI has empowered me to move at a pace that a year ago was inconceivable. There is much more to come and I’m grateful for the support and collaboration with so many amazing people!
2
7
43
8,125
Many very senior engineers I know aren't building software anymore. They are instead building software factories to build software.
40
15
3
213
17,517
I find it comical that people believe JS can be fixed when the vast majority of web sites out there work because it is broken. Sorry folks. You can't fix it. If JS added actual concurrency today, most of the web as we know it would break. The tough spot that server-side JS/TS is in: do you bifurcate and obviate the primary value of a universal language? Or live with the reality that JS isn't great for servers?
If by threads with shared objects, you mean threads with shared *mutable* objects, that will be a nightmare to write, maintain, and debug on top of JavaScript's event-loop, even for coding agents. Rust has an ownership and type system specifically designed to make shared-memory concurrency safer, and I can say from firsthand experience that coding agents still struggle with it. A huge amount of existing code relies on synchronous JavaScript running to completion within an agent. If ordinary objects could suddenly be accessed concurrently, two handlers running on different threads could observe and mutate the same object at the same time. Code that is safe today because there cannot be an interleaving between two synchronous operations could suddenly require synchronization. That's most likely why existing JavaScript concurrency mechanisms generally rely on isolated object heaps with message passing, or explicitly shared memory such as SharedArrayBuffer, rather than making arbitrary JavaScript objects concurrently mutable. I'd say changing such fundamental properties about the language is effectively making it worse, not better. Sound types plus AoT compilation are +1s, though.
7
1
34
3,627
Oh, so make it like Java.
JavaScript was never designed for the server. If that doesn't change soon, JavaScript on the server will be replaced by Rust. The fix needs to happen in the engine. Sound types. Ahead-of-time compilation. Threads with shared objects.
11
4
2
109
9,762
James Ward retweeted
I'm seeing a lot of euphoria about how Opus 5.5 is good at TLA+, and this means that all software will soon be formally verified. As a person who loves TLA+ so much he wrote a book on it, I want to throw a particular cold shower on people's enthusiasm by talking about the limits of what you can actually verified with it. The high level simplification is that TLA+ sees a system as a set of "behaviors", or possible sequences of states. For example, the pseudocode "pick a random number from 1-3 and decrement it to 1" has three behaviors: `{3 -> 2 -> 1, 2 -> 1, 1}`. From here, there are two basic kinds of TLA+ properties: - `[]P` means that `P` is true in *all states* of *every behavior*. - `<>P` means that `P` is true in *at least one state* of *every behavior*. `[]P` is immediately useful as an **invariant**, or something that always be true of your system. This is things like "your data is never corrupt" or "there's always at least one server online." `<>P` is a little more abstract, but for technical math reasons I won't get into here, can be stacked with `[]` to create really complex and useful properties. `<>[]P` represents things like "the algorithm eventually converges on the right answer", `[]<>P` things like "if two data stores desync, they will eventually resync", and `[](P => <>Q)` things like "If a message is put on the queue, it's eventually processed by a worker". Really cool stuff! These primitives were chosen to make a wide array of properties useful. And if we're clever, we can do all sorts of more complex properties, like bounded time constraints and history properties. But we're always constrained to 1) define a logical formula 2) over individual behaviors, and 3) check that all behaviors satisfy that formula. So some things that we *cannot* express in TLA+: - Possibility and reachability properties: that it's always possible to *make* P true, even if you don't actually decide to. Things like "I can always shut down the computer" or "A user can always change their password". These can't be expressed with `<>P` because that's "for all behaviors, P happens at least once", we actually want "for all behavior prefixes, there is at least one behavior where P happens at least once". - Hyperproperties: properties that are defined over two or more traces. These are things like "painting a car red doesn't make it faster" or "users cannot infer secret data by observing public data". We can't do these because TLA+ only looks at one behavior at a time. - Statistical properties: 95% latency is 1ms. Impossible because most of these are hyperproperties. - Properties about if a system is robust against code changes. Impossible because, uh, you have new behaviors now. Some of these are solvable in different logical formalisms. CTL can do reachability, PRISM can do statistical properties, etc. Those have their own tradeoffs and limitations, though, and no system can do everything. Others are solvable with a lot of cleverness tailored to the specific spec, like lifting a model into a hypermodel. But these are insanely inefficient and make your "clever spec" diverge significantly from the real world system, so introduce a lot more opportunity for things to go wrong. The core problem, though, is (1): properties are logical formula. If we don't know how to express a system property as a logical formula, we can't verify it. 99% of the properties we care about fall under this. The information on the site is easy for a user to find. Our LLMs behave as we expect them to. Our application can't be used to break the law. TLA+ (and Quint and Lean and Rocq) are near-useless here, no matter how clever you are. Don't get me wrong: `[]P` and `<>P` represent a huge range of useful properties and TLA+ is incredible at finding awful concurrency bugs. But there's a lot it fundamentally can't do and we shouldn't believe that it will solve all our worries about software bugs. And the same goes for all other formal verification languages, too.
32
98
17
787
99,996
“x is solved” means very different things to math nerds and twitter-engagement-baters. Coding is not solved.
9
3
3
100
3,735
Jev agentic loops are faster, cheaper, and likely more accurate when it comes to data filtering. I did a bunch of variations on this to get some data: github.com/jamesward/hello-z… Details on the architecture in my underlying Scala ZIO Jev library: github.com/jamesward/zio-typ…
4
3
45
2,272
Jev vs LLM in Connect 4: jev-llm-c4.jamesward.dev/ Nothing actually useful here. Just a fun way to learn :)
2
1
8
1,092
Validating software is the next big shift. Effect systems & formal verification both have important roles. Dynamic typing will be obsolete.
8
7
1
90
3,154
For my Jev-based agentic loop there are now only two places I need an LLM as a tool: summarization & parameter parsing. Initially I was using the LLM to create a filter criteria for items returned from tool calls (like how your AI code assistant defines grep & find calls). But now I'm just having Jev do the filtering. It can't create a filter criteria like an LLM, but for small enough data sets, Jev can just do the semantic filter - which is probably more accurate than generated filter criteria.
2
16
1,686
Probably a bad idea, but you can build an LLM on top of Jev. System Two from System One. Fun and a good way to learn :)
5
1
18
1,958
I've been Jev-maxxing for 2 days and managed to spend $0.04!
2
2
59
2,285
An actual programmable AI API is just so much fun! Based on a fun idea from my friend @mikegchambers, I now have a way for Jev to compete against LLMs in a Connect4-like game. Jev is better, faster, cheaper, more reliable, and the API is what I generally want from AI.
Replying to @JamesWard
A cloud function that’s basically a random ‘String => String’ transform was never a very developer friendly API.
1
21
2,247
If you’re using an LLM for anything today and you haven’t already used an LLM to transition your LLM logic parts to Jev, you are already behind your competitors.
8
2
1
45
5,953
The reason why developers, myself included, are excited about Jev is because it is a programmable AI primitive. GenAI / LLM inference is only programmable in a very awkward, indirect way - mostly it is just smart autocomplete.
6
8
107
6,157
A cloud function that’s basically a random ‘String => String’ transform was never a very developer friendly API.
1
1
10
3,102
My most common AI code assistant msg is: no. no. no. wtf are you thinking? why would you think that's a good idea? it's not. go back to what I asked you to do, the skills I told you to use, the AGENTS.md you are supposed to follow, and act like you actually know how to build reliable systems!
10
34
2,728
There are two approaches I'm using with Jev, LLMs, and MCP: - Jev as a LLM Tool orchestrating MCP tool calls - Jev as the outer loop orchestrator w/ an LLM as an tool MCP output schemas are essential for giving Jev everything it needs to efficiently plan. Then we tell Jev about the tools and have it build a workflow AST.
15
37
3
301
14,246
The AST is super basic but sufficient for Jev to define a workflow
1
3
1,039
Good example of Jev as the orchestrator: nitter.cf/CodingGarden/status/21…
I built a chat bot with jev, no LLM at all! Responses are instant, no hallucinations. I hooked it up to web search, wikipedia, weather, todoist and home assistant. Jev decides what tool to call and what args to use based on the prompt. Instant answers cite sources as well!
5
816