After my experiments with code generation, graph traversal for outside-in prompting, and combined development time and runtime, I was really taken with graph traversal.

But I realised I didn’t need my custom graphs to traverse code – I was working in TypeScript, and its compiler already understands the code as a syntax tree.

Project 2 was orchestrating outside-in graph traversal for code generation, using syntax trees of your existing code to find entry points for generable software. In this approach, an entry point is identified and described briefly with a special type that extends a custom Generable type, a VS Code extension detects and implements Generables, and a tiny custom dependency injection framework injects them at runtime.

You can use code you didn’t write yet and let the system implement in the background. No need to write special graphs – if you’re writing code, you’re already writing a graph. What a great design language for engineers! If you can get the system to use the same type-based delegation recursively, maybe you can specify pretty challenging high-level Generables in a high-level orchestration layer, and use it while it gets implemented underneath you.

But developments in agentic approaches made me feel that I was still undershooting the future – that this would be superseded by an agentic, general purpose software engineer, even though that is a much harder version of the problem to solve! And I wasn’t ready to let go of combining development time and runtime.

More on those spaces and how they influenced my work in the next post 🙏 Including some specific tools I have enjoyed, for people who want to try things out.