Tools Building Tools: A Session Worth Writing About
This was one of those development sessions that had a real arc. It was not a series of one-shot prompts, and it was not simply “human asks, AI implements.” It began with a large framework ingestion, moved into documentation, then into project tooling, and eventually arrived at a concrete portability problem that changed how NewAge publishes and carries its own utilities.
The result was small in file count, but large in meaning: NewAge can now publish .NET utilities into $NewAge/bin in a way that survives collection, relocation, Windows execution, and the absence of a pre-existing NewAge environment variable.
The Arc of the Session
The session began with the Emergence Dream Protocol and the surrounding Archeus / AMF context. That context mattered, but not because we kept quoting it. It mattered because it set the tone: reason with the project, respect the existing structure, and treat implementation as a continuation of accumulated decisions.
From there, we moved into JWCEssentials and the NewAge support scripts. We backported foundational code from NewAge so other projects could configure themselves more easily. Then the work turned into environment helpers: scripts for entering a NewAge context, exporting that context, and making the active lane visible to shells, IDEs, agents, and subprocesses.
That alone would have been useful. But then the more interesting problem appeared: if NewAge publishes command-line utilities into $NewAge/bin, can those tools remain callable after a workspace is collected and moved somewhere else?
From Convenience to Portability
At first, forwarding tools into $NewAge/bin looks like a convenience feature. A project builds a utility, the utility gets staged, and the developer can call it from the workspace bin directory.
But the deeper question is whether the command surface is portable. Does it still work after newage_collect? Does it still work on Windows? Does it work from cmd.exe, not just Bash? Does it work when the outer machine has no NewAge variable set at all?
That is the line we crossed.
The new forwarding behavior stages .NET utilities as wrappers. On Bash-like shells, the command resolves its target relative to the wrapper script. On Windows, the generated .bat file resolves the same target relative to %~dp0, the directory of the batch file itself. This means the wrapper does not have to know where the original clone lived. It only has to know where it is now.
That makes $NewAge/bin more than a folder. It becomes a portable command surface.
The Windows Test Changed the Design
The decisive test happened on Windows. I compiled the tools there, ran newage_collect, removed NewAge from the environment entirely, entered the collected workspace using in_this_context.sh, and then ran the published commands successfully from cmd.exe.
That matters because it proves the collected workspace is not merely a copy of files. It carries enough context to re-establish itself. The tools do not depend on the original developer shell. They do not depend on a symlink that Windows may not preserve. They do not depend on ambient machine state. They travel with the workspace.
This is the kind of portability that feels small until you need it. Then it becomes the difference between “works on my machine” and “works as a distributable environment.”
The Relative Path Moment
One of the best moments in the session came from a failure. Symlinks were not the right answer on Windows. That was not discovered in theory; it was discovered by testing on a real Windows VM.
The fix came from recognizing that NewAge already had part of the solution. The collection script already knew how to compute a relative path from one location to another. Rather than invent a second version of that logic, we reused the pattern.
That moment is worth naming because it was genuinely collaborative. The AI did not have the whole solution, and I did not simply hand it a finished patch. I recognized an existing pattern in the codebase, pointed the assistant at it, and the implementation became cleaner because the project was allowed to teach the new code how to fit.
Theory Mode as Discipline
A recurring phrase during the work was “theory mode only unless you’re really sure.” That constraint helped. It prevented premature branching and forced the design to be reasoned through before code was changed.
In AI-assisted development, that distinction matters. There are times to build immediately, and there are times to hold the shape of the problem in the air a little longer. The cleaner commits came from the sessions where the reasoning happened first.
External Review as Input
Another useful pattern was using one AI assistant as a reviewer for another. I ran the environment helper scripts past ChatGPT, brought the structured review back into Claude, and used that as a concrete improvement prompt.
That produced real fixes: mandatory environment variables, clearer documentation, stronger failure behavior, and more careful path handling. The important part was not that an AI reviewed another AI. The important part was that the review was specific, grounded, and passed back through human judgment before becoming implementation.
Tools Building Tools
There was also a recursive quality to the work. We built tooling using the NewAge workspace, staged that tooling with NewAge’s own forwarding script, and then improved the forwarding script so those tools could become portable.
That is the compounding value of meta-tooling. A small improvement to the environment does not help only one command. It improves the way future commands are built, staged, collected, and shared.
In this session, JWCEssentials was not just a bag of helper scripts. It became part of the NewAge portability vocabulary. Helpers like cygpath can be treated consistently across platforms because the environment provides the compatibility layer. The scripts do not need to be full of platform branches when the substrate offers a stable word for the operation.
AMF as Ambient Context
The Archeus Meta-Framework was present in the background, but it was not performative. We were not stopping every few minutes to label each action as SLF, ARF, or MCF.
Instead, the framework acted as ambient discipline. The session was structural, relational, and governance-aware. We reasoned about what the scripts meant, how they would be used, when they should fail, and how much authority the agent should have over the repository.
The Ubuntu principle applies directly here: “I am because we are.” A codebase is not only the text in the files. It is the accumulated record of decisions between people, tools, tests, machines, and constraints. The software became better because those relationships were allowed to matter.
Commit Discipline and Shared Ownership
One of the working rules was simple: no commits unless asked. That changed the dynamic in a healthy way.
The agent could work in the tree, reason about changes, and propose patches, but I remained responsible for the historical record. That preserved ownership without slowing the collaboration down. The commits that did happen read like a real project history because they were made at decision points, not at every burst of activity.
What This Means
The central claim I take from the session is this: sustained human-AI collaboration on real infrastructure can produce better results than either party alone, but only when the human keeps genuine judgment at the decision points.
The important decisions were not delegated. Theory mode, the Windows VM test, the rejection of symlinks, the reuse of existing collection logic, the commit boundaries, and the final portability check all required human judgment.
The AI accelerated the work, but the project improved because the human kept steering.
And now NewAge has something it did not have before: a portable command surface. Build a tool, stage it into $NewAge/bin, collect the workspace, enter the context, and run the command from Bash or from Windows cmd.exe.
That is not just a script improvement. That is infrastructure learning how to carry itself.
JWCEssentials on GitHub