Skill-Level Development

This post on social media

One weekend, I found myself thinking: I have this sophisticated process for building and publishing my blog, yet for some reason the blog exists only in Russian. What is stopping me from adding an AI agent to the process that would create an English version of each Russian post as well?

No sooner said than done. Together with Codex, I designed a way to convert the existing files named <YYYY>/<MM>/[slug].md into directories named <YYYY>/<MM>/[slug], each containing shared.yaml, ru.md and en.md. I used Codex to write a small script for renaming the files and directories. I ran it, and it worked. Then I added a language switcher, a language prefix and the other necessary pieces to the blog’s code.

All that remained was to translate the posts themselves. By then I had accumulated around three hundred of them, and I knew I would soon tire of specifying every time that the translation should not be word for word, that it should preserve the tone, that shared metadata should be moved to shared.yaml, and so on. I decided to create a project skill for the job. I gave Codex the task, and it generated and saved the skill beautifully. Translating a post is now very simple: invoke the skill and pass it the post’s slug. It is almost like calling a function.

Working with this skill revealed a problem. My posts link to one another. If I translate a post that links to one that has not yet been translated, the link in the English version will lead to the Russian post, because an English version does not exist yet. That feels untidy. So the posts need to be translated in chronological order: take the oldest untranslated post and translate it. Since every earlier post has already been translated, all its links will point to translated posts too.

I asked Codex to create a skill for that: it first selects the oldest untranslated post and then applies the post translation skill to it (see the first image). In other words, one skill calls another, exactly as one function in a program calls another.

It then became clear that translating the archive retrospectively would take quite a while: each post takes around four minutes to translate and uses about 10% of my token allowance for each five-hour window. That means I can translate only ten posts every five hours. Meanwhile, the posts I publish now mostly link to other recent posts, and it will be a long time before those reach the front of the translation queue.

So I had to write another skill, one that recursively follows the tree of links from one post to another and arranges them into a sequence. This post, for example, links to “What’s Under the Hood of My Blog?”, which produced a sequence of 50 untranslated posts whose English versions needed to be created first (see the second image). I worked through them at an unhurried pace over several evenings. Now there is nothing to stop me translating this post into English as well (see the third image).

We used to write programs at the level of functions and procedures. Now we program AI agents at the level of skills. I wonder what comes next.

  • Creating a skill that finds the oldest untranslated post and translates it using an existing skill
  • The translation sequence produced by the skill
  • Translating this post into English