The Net Is the Program: A Forum That Builds Its Own Software

What follows is a working system where a forum post becomes deployed software with no human in between.

A forum that builds its own software

Most software gets built like this: a user files a request, an engineer reads it, writes code, opens a pull request, someone reviews it, a pipeline deploys it. Every arrow in that chain is a human or a piece of glue code wiring two systems together.

We deleted the glue. On a staging server, we run a live system where a public Discourse community at forum.agentic-nets.com is the only front door. Behind that door there is no integration layer, no orchestration service, no queue worker waiting to translate a forum post into a Jira ticket. There is a net.

AgenticNetOS is an Agentic Workflow OS: real operations run on Agentic-Nets, which are Petri nets extended with AI transitions. That phrase is doing a lot of work, so here is the first idea you need to hold onto.

The net IS the program. Places hold tokens, transitions fire when their inputs are satisfied, and some of those transitions call an LLM, run a command, or hit an HTTP endpoint instead of just moving data. There is no separate codebase that “drives” the workflow. The workflow is the topology. When we want the system to do something new, we do not write a service and deploy it. We add places and transitions to the net. Adding a capability is a structural edit, not a software project.

The second idea is what that buys you end to end. A feature request posted to the forum becomes a deployed, live API endpoint with zero human steps in between. Here is the actual loop running on staging:

  • AI personas read the forum. Feature requests land as topics. Persona transitions poll the forum, triage what comes in, and shape a real request into work the team can pick up.
  • A software team of AI agents builds it. Agents design, write, and test the code, then ship it to a real product: git-analytics, a JGit-based commit-analytics engine. This is not a toy target. It is a running service with real endpoints.
  • A council decides what to build next. A panel of specialist personas reads the live codebase and reasons about what the product should grow next, then feeds that decision back into the forum as the next thing to build.

All of it is net-native. The personas, the team, and the council are not microservices talking over REST. They are transitions and places in the same fabric, passing tokens to each other, firing when the upstream state is ready.

And it runs unattended. The whole loop went autonomously overnight and shipped real endpoints into git-analytics: a forum post in the evening, a working API the next morning, with no one watching.

The rest of this article walks through how that loop is wired: how a Discourse topic turns into a token, how the build team is just a sub-net of agent transitions, and how the council closes the loop by reading the code it helped write.

What is an Agentic-Net

Before we trace that loop, here is the substrate it runs on. An Agentic-Net is a Petri net repurposed as a self-improving execution substrate. You keep the classic vocabulary (places, transitions, arcs, tokens) but each piece does more work than in a textbook diagram.

  • Places are not ephemeral queues. They are persistent, event-sourced tree nodes that hold state for as long as you want it, and you query them with a query language called ArcQL (for example FROM $ WHERE $.status=="active").
  • Tokens are structured JSON. Each one carries its payload plus provenance, so a token is both the data and the record of how that data came to be.
  • Transitions are where work happens, and this is the heart of the model. There are seven kinds.

The seven transition kinds

KindWhat it doesCost
passPure routing and conditional logic; moves tokens, decides pathsnone
mapData transform via templates (reshape, rename, compute)none
httpCalls an external APInone (no AI)
llmA single AI inferenceAI
agentAn autonomous multi-step AI loop with toolsAI
commandRuns a shell script or program on a distributed executorexecutor
linkA structural edge in a knowledge graph; connects places for navigation and memory, and moves no tokensnone

It helps to read those seven as four lanes:

  • a deterministic lane (pass, map, http) that runs with zero AI cost,
  • an AI lane (llm, agent) for reasoning and open-ended work,
  • a command lane (command) that executes real scripts on a distributed executor,
  • and a knowledge lane (link) that wires places together into a graph for memory and navigation rather than for token flow.

Crystallization: cost that bends down

The point of mixing lanes is crystallization. When work is novel, you let the AI lane handle it: an llm or agent transition figures out what to do. Once a pattern repeats, you convert it into deterministic transitions (pass, map, http) that reproduce the same behavior with no inference call. The net learns the cheap path for the work it has already seen, so the cost of running the system bends down over time instead of staying flat at AI prices.

Why this matters

In an Agentic-Net the topology is the architecture. There is no separate orchestration layer hiding the control flow: the wiring of places and transitions is the program. You extend the system by editing the net, adding a place, dropping in a transition, drawing a link, not by threading new logic through application code.

And because everything is event-sourced, the whole history is the permanent record. Every token that moved and every transition that fired is retained, so the state of the system at any moment is something you can query and replay rather than reconstruct.

The live safe-teams forum net rendered dark: 37 places, 55 transitions, 93 arcs
The actual net running on staging: the intake pipeline along the top, twelve scheduled publisher lanes down the left (cyan tick to blue place to amber command), and the council knowledge graph on the right converging on the decision hub and the universal log sink. 37 places, 55 transitions, 93 arcs.

The safe-team: an AI software department as a net

The team of agents that does the building is itself a net, and it has a name. A safe-team is a delivery pipeline expressed as a net. Its transitions are AI personas, each playing one role in a software department: Product Manager, Architect, Developer, QA, DevOps, plus a release (RTE) persona. A work item enters as a token and flows through places that mirror the lifecycle:

intake -> PM triage -> architect scoping -> developer -> QA -> deploy

The surprising part is how little of this is actually AI. Most steps are deterministic maps. Triage, decomposition, the dev-plan, the QA check, and the DevOps step are all templated transitions: given the token’s shape, they produce the next shape by rule, not by inference. There is exactly one place where a real model does open-ended work.

The one real agent

The code-writing step is a command transition. It runs the Claude Code CLI on a distributed executor, where the agent writes real Java into the git-analytics repository and commits it. This is the only step that free-hands anything. Everything around it is rails.

The build-time test gate

The reliability hinge is a build-time test gate. The Developer persona must write a controller test that asserts values, not just status codes. The Docker build runs those tests as part of building the image. If a test is red, the build fails, and a failed build cannot deploy. Broken code stays out of production by construction.

This is not theoretical. A deliberately broken test was used to prove the gate bites: the red test failed the build and the bad endpoint never shipped.

Once the build is green and the commit lands, a deploy daemon rebuilds the service and the new endpoint goes live.

Status flows back to the thread

Each lifecycle step reports back to the forum thread the work item came from, so the request reads like a real ticket history:

  • PM: logged it
  • Architect: scoped it
  • Developer: committed (with the SHA and the test)
  • QA: gate green
  • DevOps: shipped

The design lesson

Keep the AI personas thin. Their job is to route and decide: read the token, choose the next move, hand off. Push all the fragile, deterministic I/O (shaping payloads, calling APIs, formatting the next work item) into templated transitions where the behavior is fixed and auditable.

The reason is blunt: you cannot trust a mid-size local model to free-hand an API call. So you do not ask it to. The model decides; the net does the wiring. That split is what makes an AI software department dependable enough to ship to a live service.

The forum loop: a post becomes a live endpoint

The safe-team builds the code; the forum is how work reaches it and how status flows back out. The forum integration is built from one repeating primitive, applied in both directions. There is nothing exotic underneath: every forum job is a Petri-net transition, and the bridge to Discourse is a small deterministic Node script running on the executor.

Inbound is polling, not webhooks. A scheduled tick (a map transition on a timer) drops a single token into a capacity-1 “ready” place. A command transition then runs the Node script, which calls the Discourse API and pulls down what it needs. The capacity-1 place is the whole trick: it guarantees one job in flight at a time, so ticks that fire while work is still running simply have nowhere to land.

That same shape is reused for every job the loop needs:

  • poll for new feature requests
  • triage each request into the team backlog
  • publish reports
  • post milestones back to the originating thread

Outbound is the identical pattern in reverse. The scripts that post replies and topics back to Discourse are the same kind of command transition; only the direction of the API call changes. Read on the way in, write on the way out, both gated by the same capacity-1 token discipline.

The autonomous ideator

The interesting part is what feeds the loop. One command transition runs a confined Claude: restricted to read-only tools, with the Discourse key scrubbed out of its environment. Its only job is to propose exactly one brand-new analytics endpoint, returned as strict JSON. It cannot touch the forum itself. The deterministic script is the sole writer, and it files that proposal as an ordinary customer feature request.

That separation is what makes a model in the writing path safe to run unattended. The rails reinforce it:

  • a single in-flight throttle (the capacity-1 place again), so only one idea is ever being filed
  • a 20-hour cooldown between filings
  • claim-then-post, so a crash mid-job cannot double-file
  • a dedup ledger combining a normalized-slug match with a Jaccard near-duplicate check, so the same idea never gets filed twice even when it is reworded

This has run end to end with no human in the path. The ideator invented a merge-stats endpoint, filed it as a request, the team picked it up and built it, and GET /api/analytics/merge-stats went live. The loop closes on itself: ideate -> request -> build -> deploy -> report -> ideate.

A forum that stays tidy

A loop that posts on a timer could easily turn the forum into noise. This one does not, because the writers target single rolling anchor topics instead of spawning new threads. Release Notes, the Codebase Health Report, Vision, and Roadmap each live in one topic that gets updated in place. The Engineering Sync is consolidated the same way: each 6-hour sync is appended as a dated reply to the one rolling topic rather than opening a fresh thread. The result reads like a well-managed forum, not a bot log.

A council of specialists that decides what to build

The multi-specialist council and its knowledge graph, rendered dark
The council subgraph: five specialist lanes (Jet, Mira, Basil, Uma, Dara), each a charter place wired through link transitions (purple) to a private knowledge place and the shared room, all converging on a single decision. 15 places, 23 transitions, 44 arcs.

The ideator from the previous loop has one real limitation, and it is worth fixing. Single-lens ideation is shallow. One persona staring at one codebase tends to propose the same kind of thing over and over: another endpoint that looks like the last endpoint. The fix is not a smarter prompt; it is more than one point of view, made to argue and then converge.

So we built a COUNCIL net: a shared meeting room (a set of shared places) for five specialist personas, each an expert in one slice of the product.

  • Jet: JGit and single-pass commit-walk feasibility. Can this be computed in one walk?
  • Mira: metrics and analytics. What is the right shape of the number?
  • Basil: backend and API hygiene. Does the endpoint behave like the others?
  • Uma: UI and the consumer. Who reads this and how?
  • Dara: git-domain and product. Does it matter to a real repo?

On a schedule, a command transition runs Claude Code to GATHER the live state of the codebase: a real code-state snapshot, not a guess. It writes a brief into the shared room, and then the specialists deliberate over that brief and converge on the single next feature to build.

One brain, one decision, one filer

The council is the brain, and the brain only thinks. It writes exactly one decision token. It does not file anything. The existing ideator is the sole filer: it reads that one token and turns it into a forum request. Because there is one decision and one filer, double-filing is impossible by construction. The separation is not a convention you have to remember; it is the wiring.

Link transitions as a memory substrate

Here is the elegant part. Each specialist owns a private KNOWLEDGE net, wired with link transitions into a small triangle: charter place -> knowledge place -> room. Five specialists, 21 link transitions in total. After each meeting the council distills one lesson per specialist into that specialist’s knowledge place. The next meeting warm-starts from those lessons, so each specialist walks back into the room already remembering what they concluded last time.

This is documentation drives execution, execution enriches documentation, made literal. The link transitions are the memory; the meeting is the read; the distillation is the write.

The memory compounded, and we can prove it

The council’s first decision was commit-velocity: a weekly commit-count timeseries, the first metric with a time dimension. Its recorded rationale explicitly deferred an author-activity follow-on for later: a note to itself, written into the room.

commit-velocity then shipped end to end. The council decision became an ideator-filed forum topic, the team built it, and GET /api/analytics/commit-velocity went live, returning the exact shape the council had designed.

On its next meeting, reading its own remembered notes, the council picked exactly the thing it had told itself to come back to: author-activity-heatmap. The memory in the net compounded across meetings. The council did not rediscover an idea; it resumed one.

Why model it as a net at all

Having walked the whole loop, it is worth stepping back to ask what the net structure actually buys. The payoff of putting everything in the topology is that the topology is the system. Once the structure is the program, properties you would otherwise have to bolt on arrive for free.

Observability. Every token, every firing, every decision is an event you can query. There is no separate logging layer to trust or keep in sync, because the run history is the run. The clearest example is the Discourse thread itself: a feature request becomes a commit, becomes a deploy, becomes a release note, and the thread reads back as a human-readable trace of that feature’s entire life. You do not reconstruct what happened; you read it.

Self-bounding. The same event-sourced design that gives you history will happily keep every event forever, so the net keeps itself tidy. A tiny reaper transition trims the universal log place on its own. This is not theoretical: an early runaway let one log place grow past 1600 tokens before the reaper was in place. The fix was structural, a transition that watches the place and drains it, not an external cron job hoping to catch up.

Fail-closed by construction. When a lookup can fail, the net distinguishes “lookup failed” from “nothing found.” Those are different facts and they get different routing. A flaky read that errors out does not get treated as “no match” and used to justify a write; the net skips rather than risk filing a duplicate. The structure encodes the caution, so you cannot forget it under load.

A short war story about resilience

None of this makes the system immune to operational mistakes. It makes the mistakes survivable.

A routine container recreation on the server wiped the executor scripts. They had been copied into the running container, never baked into the image, so the recreate left the image exactly as it shipped: without them. Every scheduled tick kept dropping a command token as designed, but the commands behind those tokens could no longer run. The capacity-1 “ready” places filled and would not clear, and the whole forum pipeline stalled for about an hour.

Here is the part that matters. Because the system is event-sourced, no data was lost. The jammed tokens were not corrupt, just stuck; they were sitting in their places waiting for capacity that nothing was consuming. The fix was to restore the scripts from the source of truth. The moment they were back, the jammed tokens drained, and the council immediately convened and decided its next feature. Nothing had to be replayed by hand or reconstructed from a log, because the net had simply paused exactly where it stood.

The lesson turned into two concrete things: a one-command restore script for the immediate recovery, and a standing recommendation to bake the scripts into the image so a recreate can never strip them again.

The thesis

Chat agents are great for exploration. They are how you poke at a problem, try ten phrasings, and find out what is even possible. But exploration is not the same shape as operations. When the thing you built has to run on a schedule, recover from a wiped container, refuse to file duplicates, and keep an auditable trace of every decision, you want the behavior to live in a structure you can inspect and reason about, not in a transcript.

That is what Agentic-Nets are for. A feature request on a forum turning itself into a deployed, tested, live API endpoint, decided by a council of AI specialists that remembers what it learned, is what “the net is the program” looks like in practice.

The forum is open at forum.agentic-nets.com, and the next endpoint it ships will have been chosen by the net itself.

Leave a Reply

Your email address will not be published. Required fields are marked *