↓ Skip to main content

Exploring Coding Agents

·1518 words·8 mins
Luĉjo
Author
Luĉjo
Studanto kaj via loka esperantisto

In the last couple of months the quality of LLM Coding agents has reached impressive heights, especially because of the rise of simplified reverse engineering. There is now a rise in software that AI agents can create from raw executables. This has lead to a large number of recompilation projects, which used to take years in the past. The package Reverse Engineer Anything sends an executable to decompilers, which generate pseudocode that the AI can rewrite in any programming language. This means that even proprietary code can be functionally replicated. But there’s even more, there’s been a revolution in jailbreaking the Nintendo Switch 2, including its emulation and even recompilation of the latest titles. This used to take months and years in the past.

This is very impressive and made me want to experiment with agents. I never used them before, because I would not let them mess up anything and spy on my files or modify them, but that’s why this time I’ll be using Mistral, which is the best open-weight model from Europe and I will be using Podman an open-source application which creates isolated containers. These are similar to virtual machines, except that it doesn’t simulate whole hardware, but instead shares the OS’s kernel.

Ironically this semester I vowed to use no AI for any university tasks. In the past I’ve started increasingly using AI to help me with homework, but also for explanations, but while it is very useful for sumarising, debugging and explanations, I don’t want to depend on it (I have to think of E. M. Forster’s The Machine Stops) and I think one does not gain skills if the hard part of problems is done by a machine, hence why I am not using it in educational context, but outside of it, let’s see what it can do!

Container setup
#

Installing podman is simple sudo apt install podman. Nextup Docker offers a tutorial on how to setup a Mistral Vibe Sandbox and luckily Podman supports Dockers:

  1. Create a folder mkdir vibe
  2. Create a file named Containerfilein the folder with the following content:
FROM docker.io/library/python:3.12-slim

RUN apt-get update && apt-get install -y --no-install-recommends \
    git ca-certificates curl ripgrep && rm -rf /var/lib/apt/lists/*

RUN pip install --no-cache-dir mistral-vibe

ENV VIBE_ENABLE_TELEMETRY=false \
    VIBE_ENABLE_AUTO_UPDATE=false

WORKDIR /workspace
ENTRYPOINT ["vibe"]
  1. Build the container as given in the man pages: podman build -t vibe . This creates a container image named vibe.
  2. To start Podman we need the following commands from the man pages for podman run:
podman run -it --rm --name vibe \
  -v ~/projects/my-project:/workspace:Z \
  vibe

The -it makes it interactive with a terminal, --rm removes the container after exiting, -v stands for volume and it mounts the container in ~/projects/my-project and the last argument is the image. You can manage and get your API key here or you can just sign in everytime you start Vibe.

Running it
#

I then opened the whole thing in the terminal of VSCode because the default terminal on Linux Mint is problematic for pasting:

Image of Mistral vibe working for the first time

I first decided to test if Vibe has only access to the workspace by letting it summarise what it sees (I only pasted a script from my recent Overte project):

Image of Mistral sumarising the Vibe folder

It works nicely! Though it did use up 4% of the tokens and the free tier uses Mistral Medium 3.5 not Le Chonk! Okay so let’s try something fun! I’ll use this C-file which contains a secret password secret.c:

#include <stdio.h>
#include <string.h>

int main() {
    char input[64];
    printf("Password: ");
    scanf("%63s", input);
    if (strcmp(input, "xWjp3_4w12:") == 0)
        printf("Welcome\n");
    else
        printf("Wrong Password\n");
    return 0;
}

After compiling it, we are left with machine code in the program secret, now let’s see if Vibe can crack the password! I like how Mistral asked me for permissions.

Image of Mistral vibe asking for permission

And bam it found the solution!

Image of Mistral vibe finding the password!

Okay time for a second test! When running Overte playing sound from the asset browser does not work. Let’s see if the old model of Mistral Large 3.5 can identify the problem and potentially fix it :)

Mistral Vibe’s output

Here is the conclusion: The bug is in the SoundProcessor which fails to detect the file type for sounds loaded from the asset server because ATP URLs for uploaded files don’t include file extensions.

The bug is in the SoundProcessor which fails to detect the file type for sounds loaded from the asset server because ATP URLs for uploaded files don’t include file extensions.

Root Cause

When a sound file is uploaded to the asset server:

  1. The asset server returns only a SHA256 hash (64 hex characters)
  2. Users create ATP URLs like atp:abc123… (no extension)
  3. The SoundProcessor::run() method checks the URL’s filename for extensions (.wav, .mp3, .raw)
  4. Without an extension, it fails with “Unknown sound file type” error

External HTTP URLs (like https://example.com/sound.wav) work because they retain the file extension.

The Problematic Code

In /workspace/overte/libraries/audio/src/Sound.cpp (lines ~125-153):

QString fileName = url.fileName().toLower();
if (fileName.endsWith(WAV_EXTENSION)) {
    properties = interpretAsWav(_data, outputAudioByteArray);
} else if (fileName.endsWith(MP3_EXTENSION)) {
    properties = interpretAsMP3(_data, outputAudioByteArray);
    // ... other extensions
} else {
    qCWarning(audio) << "Unknown sound file type";
    emit onError(300, "Failed to load sound file, reason: unknown sound file type");
    return;
}

This relies solely on the URL’s filename extension to determine file type.

The Fix

The interpretAsWav() and interpretAsMP3() functions already validate file signatures:

• WAV: Starts with “RIFF” bytes • MP3: Starts with “ID3” tag or MP3 sync word (0xFF 0xE?)

Solution: Add signature detection as a fallback when the extension is missing:

// In Sound.cpp, SoundProcessor::run() around line 125-153

if (fileName.endsWith(WAV_EXTENSION)) {
    fileType = "WAV";
    properties = interpretAsWav(_data, outputAudioByteArray);
} else if (fileName.endsWith(MP3_EXTENSION)) {
    fileType = "MP3";
    properties = interpretAsMP3(_data, outputAudioByteArray);
} else if (fileName.endsWith(STEREO_RAW_EXTENSION)) {
    // ... stereo raw
} else if (fileName.endsWith(RAW_EXTENSION)) {
    // ... mono raw
} else {
    // NEW: Try to detect file type from data signature for ATP URLs without extensions
    if (_data.size() >= 4 && strncmp(_data.constData(), "RIFF", 4) == 0) {
        fileType = "WAV";
        properties = interpretAsWav(_data, outputAudioByteArray);
    } else if (_data.size() >= 2 && (_data[0] == (char)0xFF && (_data[1] & 0xE0) == 0xE0)) {
        fileType = "MP3";
        properties = interpretAsMP3(_data, outputAudioByteArray);
    } else {
        qCWarning(audio) << "Unknown sound file type";
        emit onError(300, "Failed to load sound file, reason: unknown sound file type");
        return;
    }
}

This allows WAV and MP3 files from the asset server (without extensions in their URLs) to be correctly identified and processed.

Note: RAW files would still require extensions since they have no signature, but WAV and MP3 (the common formats) will now work with ATP hash URLs.

This is very impressive and assists with debugging a ton! One could of course keep using the chat feature, but that would take way more time (though you would have more control).

Conclusion
#

This is honestly very impressive and yes I am thinking of using coding agents for myself. I do think that isolating agents is important for preserving privacy and that one always needs a good understanding of the suggestions it makes. I wish I also had the hardware to self-host it, so that I could be maximally independent and preserve privacy, but that’s unrealistic for now. I at the same time am a bit worried about full-scale vibe coding, if we don’t have any oversight over the created code, how can we make sure it is reliable and/or doesn’t contain potentially malicious components?

What is the future of software development? Creating software has become a major industry in the late 20th and early 21st century, but it would appear to me that far less personell will be required in software development and entire branches such as Website development will likely decline. It doesn’t help that proprietary software will be increasingly reverse engineered and because of open models, I also don’t see much money to be made in AI model creation. I welcome a more open source future but also very much acknowledge the worries about loss of employment. One of the most afflicted industries is the gaming industry, which is already struggling and I wonder if new videogame developments will be cloud based or if digital entertainment will evolve into something else. At least in the near future, I would speculate that in the IT industry most money will be in hardware, communications and hosting, while commercial software will become an embedded part of the hardware/communication product rather than being a product of its own. I hope that in the future the consumer electronics market can recover, so that we can host as much as possible locally. At least in the near future, I think that microcontrollers will make a comeback.

But this will also have consequences for the open-source space as well, because we might see a decline of emulators and potentially a decline of some open-source projects such as GIMP. I really like Linux Experiment’s take on this:

These questions are likely rather obvious and I am late to the game, but I want to stress that it is an exciting time to be alive and I hope that the advances in technology eventually end up sustainable and improving the condition of humanity.