Journal 2025-06-03
The Tensegrity Suite
It occurred to me that if anyone shows interest in the stuff I've been playing with then there needs to be a good place to discuss things. The domain (AI) is pretty hot right now, but my particular corner is niche. Still, things need to be public, must be easy to maintain. It occurred to me sticking things in Git would be useful. Then I discovered GitHub supports Discussions on repos. That'll do. So I've set up a repo called tensegrity and on it enabled Discussions. It's new to me, but I think it should work. If you are reading this then you should probably go say hello over there.

Bloody Paths!
What I have going on with this stuff right now is that a #:Transmissions pipeline reads content from markdown files in a particular dir tree, posts this off (lightly annotated with metadata) to a SPARQL store. This initial use case I call #:Postcraft, pulls this back out again and renders it as a static Web site. Like what you are looking at. This is massively over-engineered for a static site builder, but it's what seemed like a good sanity check for getting such data in and out of the store.
The thing is I've also got #:Semem looking at the contents of that store. This is intended as an LLM-oriented knowledgebase. I'd already got some bits in place, like generating embeddings from the content and use of them for semantic search in the vector store similarity sense.
I had a big push on this in the past week or so, sorting out the #:Ragno ontology for describing knowledgebases and maybe implementing a bunch of knowledge augmentation and retrieval algorithms. I say maybe because a large part of the coding was done by AI assistants, and they're not exactly great at checking their own homework. But this report on interactions gives me cautious optimism.
One thing I know for sure, this stuff is currently very fragile. And confusing. I don't know why I bothered asking ChatGPT for an illustration of this post because I could simply have taken a pic of my office.

So anyway, the bloody paths thing. To kick the tyres of #:Semem I needed a smaller set of docs than this blog stuff. I've hardly put any content in the #:Postcraft part of #:Semem itself yet. It will eventually look after the docs, but as of now, sod all there.
So I ran the #:Postcraft transmissions over it. Bugger! Totally berserk paths. The primary motivation behind #:Transmissions is to make complex processing easier to manage. However, the decomposition comes at a cost. Here are the current commands I have to run to render this site:
cd ~/hyperdata/transmissions # my local path
./del-dan.sh # clear SPARQL graphs
./trans postcraft-statics ~/sites/danny.ayers.name/postcraft #
./trans md-to-sparqlstore ~/sites/danny.ayers.name/postcraft
./trans sparqlstore-to-html ~/sites/danny.ayers.name/postcraft
./trans sparqlstore-to-site-indexes ~/sites/danny.ayers.name/postcraft
Here's the transmissions.ttl for sparqlstore-to-html :
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix : <http://purl.org/stuff/transmissions/> .
:sparqlstore-to-html a :Transmission ;
:pipe (:p10 :p20 :p30 :p40 :p50 :p55 :p60 :p70
:p80 :p90 :p100) .
:p10 a :SPARQLSelect ;
:settings :selectArticles .
:p20 a :ForEach ;
:settings :resultIterator .
:p30 a :Restructure ;
:settings :prepArticle .
:p40 a :MarkdownToHTML ;
:settings :mdHTML .
:p50 a :Templater ;
:settings :articleContentTemplate .
# store the HTML snippet
:p55 a :SPARQLUpdate ;
:settings :updateArticleHTML .
# make the page
:p60 a :Templater ;
:settings :articlePageTemplate .
:p70 a :PathOps ;
:settings :filenameConstructor .
:p80 a :PathOps ;
:settings :filenameExtension .
:p90 a :FileWriter ;
:settings :htmlField .
:p100 a :SPARQLUpdate ;
:settings :recordRendering .
Each of the :settings objects is a little block of statements. Each of the processors in the pipeline is a JS module.
But each part is constructed simply, and I do have tolerable debugging facilities in place. It's just a bloody drag to trace through the pipeline nodes to find where I've done something stupid in path resolution.
Hey ho. Claudio tells me it's walk time again.
When we get back I may just have play with some of the other stuff that's cluttering up the office right now.