A Go framework for systems that take in the world, decide what to do about it, and act without leaving the box. Field telemetry and agent runs land in the same live knowledge graph. Rules decide what they can; models decide what they must. For environments where connectivity is intermittent, compute is finite, and the environment will not cooperate.
go get github.com/C360Studio/semstreams
Current AI infrastructure assumes always-on connectivity, abundant compute, rich model access, and an enormous token budget. What we call ambient affluence.
Thirty years of experience has taught us that these idealistic conditions rarely hold. Even if you have the budget, operational reality often has other plans. So if the environment will not cooperate, the architecture should embrace that reality from the start.
So the hard decisions got made early, under conditions that would not let us defer them. Write authority. Restart behaviour. What happens to evidence when there is nobody to send it to. That is the part you inherit, and the part you can check.
Read "Comms Suck" →The graph holds locally and syncs when the link comes back. You don't lose state when you lose the network.
Rules and workflows keep running. The system degrades through tiers, not off a cliff.
Structural relationships still function. You bring what you have; the system meets you there.
Most stacks are a pipeline. Data goes in, something comes out, and the part where the system gets better is a meeting. This one is a loop, and every stage of it runs on the same box.
The graph is the load-bearing piece. Not storage. Orientation. It is the model of the situation that gives an observation its meaning, and it updates as things happen rather than overnight in a batch.
A sensor reading. A tool call. An agent's answer. The graph does not care which produced it, which is why adding agents needed no new architecture.
Entities, relationships and the structure between them, held live. What changed, what it touches, what it now means.
Rules first, and a model only when the call genuinely needs judgment. Deterministic where it matters, intelligent where it helps.
Components do the work. Rules pass references, never payloads, so a decision cannot quietly blow up a context window.
What went wrong is written down as a citation-backed lesson, reviewed by a human, and pushed into every run that follows.
A framework is worth having when your own spec gets shorter. These are the decisions that never announce themselves as decisions. The ones that surface under load, once, expensively. We know which ones you would get wrong because we got them wrong first, in public, and they are gates now because they were bugs then.
One writer owns graph state. Everything else asks through a typed port. There is no design meeting about who is allowed to write, because there is no version of this where two things do.
Deterministic IDs carry the deployment that minted them. Two nodes that have never met cannot collide, and their graphs merge later without anything coordinating them.
Current facts rehydrate. Unacknowledged work redelivers. Which one you get follows from the primitive you picked, so it is decided before you write a line.
Rules trigger, components execute. There is no workflow engine to adopt, outgrow and regret. Multi-step work is coordinated rules with iteration caps and durable state.
An agentic system you cannot audit is a black hole. A transcript at best, nothing verifiable, and no answer at all to what that tool actually returned. So execution evidence here is a first-class capability rather than trace exhaust. Runs are recorded as graph entities, with the evidence stored beside them, and expiry never reclaims it.
The austere case forced this and then improved it. When there is no observability vendor to ship a trace to and no link to ship it over, evidence has to be local, bounded, durable and answerable on the box. That constraint produced something worth having everywhere.
It is not only our own runs we hold to it. SemConnect answers to an OGC Connected Systems conformance suite we did not write, do not control and cannot grade: 137 of 137 passing. An external qualification you can go run against us yourself is worth more than anything else on this page.
Everyone ships a demo and a story. We ship the run.
A problem gets reported with a proposed solution. A trend becomes an SOP. That is the After Action Report, and it is older and harder-won than the industry that rebranded it. It comes from places where the feedback signal is fatal and the debrief is not optional.
It is also, exactly, how lessons work here. Proposed, cited, reviewed by a human, then carried into every run that follows. An SOP nobody enforces is a guideline. That is why the rules in this repo are gates. Lint that fails the build, schema drift that fails the build, breaking changes that do not land without a green end-to-end tier.
We forge and we swing. Semstreams is the hammer; semdev, semsource and the labs are us swinging it at our own work until something bends. A carpenter can only report on using the tool. A toolmaker can only report on making it. Both is rarer, and it is checkable.
Semstreams has no synthetic benchmark suite standing in for real use. Each sem* project is something we actually needed, built by driving one capability past comfortable: throughput, rules, agentic coordination, edge autonomy, standards conformance. Framework gaps show up as product pain, not as a passing test.
Core is a short list on purpose. It is what runs on our own hardware, continuously, where we are the ones woken up when it breaks. Everything else is a lab. A place, not a stage, where a framework idea gets driven past comfortable against something real before it is anyone's dependency. Some labs stay labs as long as there is another dial to turn. Some earn promotion into Core. An older pin means a project is resting, not rotting.
See what each one stresses →The documentation reflects where we are, not where we're going. If your requirements are clearer in production than they were on paper, this was built for you. Here is the same honesty with the vagueness taken out. Four of these you can check yourself before you decide anything.
task lint. Lint warnings and schema drift fail the build. They do not file a ticket.We called it alpha early and the tags have since moved to beta. We are not renumbering backwards, and nothing about the deal changed: pre-1.0, and breaking changes will happen.