It's a trap: testing coding agents on a language with surprising semantics A blog post experiment tested coding agents on Loom, a small smart-contract language deliberately built with unintuitive or arguably broken semantics, to see whether models fall into a "familiarity trap" by assuming Loom behaves like the Move language it resembles. The author notes that OpenAI's recent article on coding in low-resource programming languages is impressive but qualified, because those tasks have existing reference implementations and some literature, whereas Loom requires agents to design an API and verify runtime behavior rather than match known code. The test hinges on differences such as Loom allowing a resource to store a signer after a transaction ends, which Move rejects. Contents It’s tempting to ask a coding agent to help with a task we don’t fully understand. It researches the problem, writes a sensible looking explanation, and produces working examples. This works well for tasks the model already understands. But what about unfamiliar tasks? The problem is that benchmark results don’t tell us whether a particular solution is trustworthy, and the models can sound just as confident when they’re wrong. OpenAI recently published an article on coding in low-resource programming languages https://openai.com/index/low-resource-programming-languages/ . The results are very impressive, but I would qualify them in two ways: the tasks have existing implementations that evaluators can check the results against, and the languages still have literature on them, even if training material is relatively scarce. Having a reference implementation helps with evaluating correctness. In this blog post, we’ll discuss an approach to evaluate how well each model adapts to an unfamiliar environment. We do this by designing a small programming language called Loom, that looks familiar, but with unintuitive or arguably broken semantics. The exercise also asks the agent to design an API, so matching existing behaviour isn’t enough. Then we’ll see whether each model falls into the familiarity trap, or checks that the runtime actually behaves as it expects. Background Loom is a small smart-contract language heavily inspired by Move https://www.sui.io/move . Familiarity with smart contracts is not required to understand the main takeaways of this blog post. I chose this domain because smart contracts tend to be small programs, and bugs in them have very direct monetary impact. 1 user-content-fn-different-experiment A smart contract is a program that lets users interact with shared state through transactions. Each transaction either succeeds as a whole or leaves that state unchanged. For example, a token contract keeps a ledger of users’ balances. When one user transfers tokens to another, the contract updates both balances, and later transactions see the updated state. The runtime authenticates the sender, typically by verifying a cryptographic signature. The contract then checks whether that sender is allowed to spend the tokens and whether the balance is sufficient. If either check fails, the transfer is rejected. In Move, it would look something like this: 2 user-content-fn-move-details module token { struct Balance { amount: u64 } public fun register account: signer { // reverts if Balance already exists move to account, Balance { amount: 0 } ; } public fun transfer from: signer, to: address, amount: u64 { let source = borrow global mut