<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Ai on Prskavec.Net</title><link>https://www.prskavec.net/tags/ai/</link><description>Personal site of Ladislav Prskavec — Software Engineer &amp; Site Reliability Engineer in Prague. Writing, conference talks, an OnCall design guide, and the You Build It You Run It podcast.</description><generator>Hugo -- gohugo.io</generator><language>en</language><managingEditor>ladislav@prskavec.net (Prskavec.Net)</managingEditor><webMaster>ladislav@prskavec.net (Prskavec.Net)</webMaster><copyright>&amp;copy; {year} Ladislav Prskavec</copyright><lastBuildDate>Thu, 16 Jul 2026 09:00:00 +0200</lastBuildDate><atom:link href="https://www.prskavec.net/tags/ai/index.xml" rel="self" type="application/rss+xml"/><item><title>A Knowledge Format Is Not a Knowledge Base</title><link>https://www.prskavec.net/post/a-knowledge-format-is-not-a-knowledge-base/</link><pubDate>Thu, 16 Jul 2026 09:00:00 +0200</pubDate><author>ladislav@prskavec.net (Prskavec.Net)</author><guid>https://www.prskavec.net/post/a-knowledge-format-is-not-a-knowledge-base/</guid><description>Google's Open Knowledge Format standardizes the container, not the relationships and curation that make a knowledge base useful. Existing document formats already cover the authoring layer; a portable knowledge base needs a stronger, syntax-independent model.</description><content:encoded>&lt;p&gt;&lt;img src="https://www.prskavec.net/post/a-knowledge-format-is-not-a-knowledge-base/./featured.png"
alt=""
loading="lazy"
decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href="https://cloud.google.com/blog/products/data-analytics/how-the-open-knowledge-format-can-improve-data-sharing"&gt;Google&amp;rsquo;s Open Knowledge Format&lt;/a&gt;
sounded relevant to me immediately. OKF v0.1 is a directory of Markdown files
with YAML frontmatter, stored in Git and readable by people and agents. That is
close to how I already &lt;a href="https://www.prskavec.net/post/how-i-use-logseq-as-a-personal-knowledge-base/"&gt;use Logseq, Codex, and Claude Code&lt;/a&gt;
with my own knowledge base.&lt;/p&gt;
&lt;p&gt;After reading the specification, I do not think I should adopt it. OKF could be
an export format one day, but it leaves out too much of what makes a knowledge
base useful.&lt;/p&gt;
&lt;p&gt;First, a correction: OKF is not another markup language. It is a small profile
on top of Markdown and YAML. The required surface is deliberately thin: every
concept is a file, its path is its identity, and its frontmatter must contain a
&lt;code&gt;type&lt;/code&gt;. Titles, descriptions, tags, resources, timestamps, indexes, logs, and
citations are optional or recommended.&lt;/p&gt;
&lt;p&gt;That simplicity is attractive. It also standardizes the least difficult part of
a knowledge system.&lt;/p&gt;
&lt;h2 id="backlinks-are-part-of-the-data-model"&gt;Backlinks are part of the data model&lt;/h2&gt;
&lt;p&gt;OKF defines a link from concept A to concept B as a directed, untyped edge. The
meaning, such as &amp;ldquo;depends on&amp;rdquo;, &amp;ldquo;references&amp;rdquo;, or &amp;ldquo;joins with&amp;rdquo;, stays in the
surrounding prose. A consumer may scan the bundle and compute the reverse edge,
but the format does not require it.&lt;/p&gt;
&lt;p&gt;This distinction matters. In Logseq, a backlink is not decoration in a graph
view. When I open B, I can see every page that mentions B, including connections
I did not remember to encode on B itself. The forward link records what the
author of A knew. The backlink shows how the rest of the corpus has accumulated
around B.&lt;/p&gt;
&lt;p&gt;Adding an explicit link from B back to A is not the same thing. It duplicates
the edge and may misstate the relationship: &amp;ldquo;A references B&amp;rdquo; does not imply &amp;ldquo;B
references A&amp;rdquo;. It also creates a synchronization problem when pages move or
relationships change.&lt;/p&gt;
&lt;p&gt;An OKF consumer can reconstruct backlinks. Google&amp;rsquo;s reference visualizer does
this and presents them as &amp;ldquo;Cited by&amp;rdquo;. But another consumer can ignore reverse
links and still conform to the specification. Both tools support the same format
while exposing materially different knowledge bases.&lt;/p&gt;
&lt;h2 id="conformance-does-not-imply-shared-meaning"&gt;Conformance does not imply shared meaning&lt;/h2&gt;
&lt;p&gt;The rest of the interoperability contract is similarly thin. &lt;code&gt;type&lt;/code&gt; is the only
required field, but type names are not registered. Consumers must tolerate
unknown values. Links are untyped. Citations are recommended rather than
required. Broken links are explicitly permitted.&lt;/p&gt;
&lt;p&gt;These are sensible choices for a forgiving file exchange format. They also mean
that two conformant bundles can agree on syntax while disagreeing on nearly all
of the semantics. One producer&amp;rsquo;s &lt;code&gt;Playbook&lt;/code&gt; may not resemble another&amp;rsquo;s. A
consumer can parse both files without knowing how to compare, validate, or use
them.&lt;/p&gt;
&lt;p&gt;That is portability of text. It is not yet portability of knowledge.&lt;/p&gt;
&lt;h2 id="we-already-have-document-formats"&gt;We already have document formats&lt;/h2&gt;
&lt;p&gt;If the problem is how to store rich, readable technical documents in plain text,
we already have mature options.
&lt;a href="https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html"&gt;reStructuredText&lt;/a&gt;
has field lists, citations, hyperlink targets, directives, and
&lt;a href="https://docutils.sourceforge.io/docs/ref/rst/roles.html"&gt;extensible interpreted-text roles&lt;/a&gt;.
AsciiDoc has &lt;a href="https://docs.asciidoctor.org/asciidoc/latest/attributes/document-attributes/"&gt;document attributes&lt;/a&gt;,
&lt;a href="https://docs.asciidoctor.org/asciidoc/latest/macros/inter-document-xref/"&gt;document-to-document cross-references&lt;/a&gt;,
and &lt;a href="https://docs.asciidoctor.org/asciidoc/latest/directives/include/"&gt;includes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Neither format gives every tool Logseq-style backlinks automatically. That is
the point: backlinks are a corpus-level index and navigation contract, not an
inline-markup feature. Putting YAML in front of Markdown does not solve that
layer either.&lt;/p&gt;
&lt;p&gt;Markdown plus YAML is a reasonable transport choice with modest parsing
requirements. But choosing a transport is different from defining a knowledge
architecture. If a team prefers AsciiDoc or reStructuredText, it should not need
to convert its source documents just to participate in a knowledge exchange. A
useful standard could define concepts, identifiers, relationships, provenance,
and lifecycle independently, then provide mappings for several text formats.&lt;/p&gt;
&lt;h2 id="markdown-is-the-least-interesting-part-of-my-knowledge-base"&gt;Markdown is the least interesting part of my knowledge base&lt;/h2&gt;
&lt;p&gt;My setup works because it is selective. Journals are a raw inbox. External
sources are retained locally when needed. Durable pages are synthesized rather
than copied. Claims carry source notes with searchable anchors. A curation log
records what was promoted, skipped, or left for later. Every page edit is
reviewed against its sources instead of trusted because the prose sounds
coherent.&lt;/p&gt;
&lt;p&gt;None of that follows from the file extension.&lt;/p&gt;
&lt;p&gt;A directory can be perfectly conformant with OKF and still be a bad knowledge
base: duplicated notes, stale claims, missing provenance, disconnected pages,
and generated summaries nobody has checked. An agent can parse the corpus, but
parsing is not the same as trusting or navigating it.&lt;/p&gt;
&lt;p&gt;For me, a stronger interchange model would need at least:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;stable concept identifiers that survive file moves&lt;/li&gt;
&lt;li&gt;standardized backlink or reverse-edge behavior&lt;/li&gt;
&lt;li&gt;relationship types that consumers can understand without reading prose&lt;/li&gt;
&lt;li&gt;claim-level provenance, not only an optional citations section&lt;/li&gt;
&lt;li&gt;a way to distinguish raw capture, durable synthesis, and deprecated material&lt;/li&gt;
&lt;li&gt;mappings for existing systems and formats instead of one mandatory source syntax&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This does not all need to live inside every document. A manifest or generated
graph index may be better than duplicating metadata across files. The important
part is that the behavior belongs to the contract, so each consumer does not
invent it again.&lt;/p&gt;
&lt;h2 id="where-okf-could-still-fit"&gt;Where OKF could still fit&lt;/h2&gt;
&lt;p&gt;OKF may become useful as a lowest-common-denominator export. If an agent or
catalog I want to use accepts OKF, a Logseq plugin could map page properties to
YAML, convert wiki links to Markdown links, and generate a backlink index. My
knowledge base would remain the source of truth.&lt;/p&gt;
&lt;p&gt;I would not build that adapter before there is a consumer worth using. OKF is
still a v0.1 draft, and changing a working knowledge base to satisfy a thin
interchange profile would add maintenance without improving the knowledge.&lt;/p&gt;
&lt;p&gt;The problem is real: agents need portable context, and knowledge should not be
locked inside one vendor&amp;rsquo;s catalog. But a collection of readable files is only
the substrate. A great knowledge base also needs relationships, provenance,
selection, and maintenance. Another file profile does not provide those by
itself.&lt;/p&gt;
&lt;h2 id="sources"&gt;Sources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Google Cloud, &lt;a href="https://cloud.google.com/blog/products/data-analytics/how-the-open-knowledge-format-can-improve-data-sharing"&gt;&lt;em&gt;Introducing the Open Knowledge Format&lt;/em&gt;&lt;/a&gt; (2026-06-12)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/GoogleCloudPlatform/knowledge-catalog/blob/main/okf/SPEC.md"&gt;Open Knowledge Format v0.1 draft specification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/GoogleCloudPlatform/knowledge-catalog/tree/main/okf"&gt;Open Knowledge Format reference implementation and visualizer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Docutils, &lt;a href="https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html"&gt;&lt;em&gt;reStructuredText Markup Specification&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Docutils, &lt;a href="https://docutils.sourceforge.io/docs/ref/rst/roles.html"&gt;&lt;em&gt;reStructuredText Interpreted Text Roles&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Asciidoctor, &lt;a href="https://docs.asciidoctor.org/asciidoc/latest/attributes/document-attributes/"&gt;&lt;em&gt;Document Attributes&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Asciidoctor, &lt;a href="https://docs.asciidoctor.org/asciidoc/latest/macros/inter-document-xref/"&gt;&lt;em&gt;Document to Document Cross References&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Asciidoctor, &lt;a href="https://docs.asciidoctor.org/asciidoc/latest/directives/include/"&gt;&lt;em&gt;Includes&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>How I Use Logseq as a Personal Knowledge Base</title><link>https://www.prskavec.net/post/how-i-use-logseq-as-a-personal-knowledge-base/</link><pubDate>Sat, 27 Jun 2026 09:00:00 +0200</pubDate><author>ladislav@prskavec.net (Prskavec.Net)</author><guid>https://www.prskavec.net/post/how-i-use-logseq-as-a-personal-knowledge-base/</guid><description>How I use Logseq journals, local sources, durable pages, and agent-assisted curation to keep a personal knowledge base useful without turning every note into permanent documentation.</description><content:encoded>&lt;p&gt;This setup was inspired by Andrej Karpathy&amp;rsquo;s &lt;a href="https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f"&gt;LLM Wiki&lt;/a&gt;,
but my version is deliberately local and boring: Logseq journals as the inbox,
source files as the archive, and compact pages as the durable layer.&lt;/p&gt;
&lt;p&gt;Google is making a similar argument with &lt;a href="https://cloud.google.com/blog/products/data-analytics/how-the-open-knowledge-format-can-improve-data-sharing"&gt;Open Knowledge Format&lt;/a&gt;:
&lt;a href="https://spec.commonmark.org/"&gt;Markdown&lt;/a&gt; plus &lt;a href="https://jekyllrb.com/docs/front-matter/"&gt;YAML front matter&lt;/a&gt;
as a shareable knowledge format. I think the format is the easy part.
&lt;a href="https://spec.commonmark.org/"&gt;Markdown&lt;/a&gt;, &lt;a href="https://docutils.sourceforge.io/rst.html"&gt;reStructuredText&lt;/a&gt;,
&lt;a href="https://docs.asciidoctor.org/asciidoc/latest/"&gt;AsciiDoc&lt;/a&gt;, or any plain text
format with metadata can work. For company-wide use, the harder part is the
documentation pipeline: how you ingest sources from different places, keep them
fresh, and assign curators, human or LLM, to maintain the useful layer.&lt;/p&gt;
&lt;p&gt;My Logseq graph is not where every thought becomes permanent. It is where raw
material waits until I decide whether it deserves a second life.&lt;/p&gt;
&lt;p&gt;The split in this repository is blunt:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;journals/&lt;/code&gt; is the raw inbox.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sources/&lt;/code&gt; is where bulky external material lives.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pages/&lt;/code&gt; is the durable knowledge layer.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;log.md&lt;/code&gt; is the audit trail of curation work.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Day to day, that is not formal. I capture links, screenshots, meeting fragments,
commands, papers, talks, and half-formed notes into Logseq journals. Later, I run
a curation pass and promote only the material I expect to search for again.&lt;/p&gt;
&lt;h2 id="the-flow"&gt;The flow&lt;/h2&gt;
&lt;img src="https://www.prskavec.net/img/mermaid/post-how-i-use-logseq-as-a-personal-knowledge-base-1.png" alt="Diagram (rendered from Mermaid)"&gt;
&lt;h2 id="journals-are-the-inbox"&gt;Journals are the inbox&lt;/h2&gt;
&lt;p&gt;Daily journals are intentionally messy. They contain:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;links I may or may not read later&lt;/li&gt;
&lt;li&gt;meeting scraps&lt;/li&gt;
&lt;li&gt;debugging notes&lt;/li&gt;
&lt;li&gt;command fragments&lt;/li&gt;
&lt;li&gt;screenshots&lt;/li&gt;
&lt;li&gt;TODOs&lt;/li&gt;
&lt;li&gt;short observations&lt;/li&gt;
&lt;li&gt;notes for work projects&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I do not try to make journals beautiful. If I had to polish every note at
capture time, I would capture less.&lt;/p&gt;
&lt;p&gt;The rule is that journals are source material, not the knowledge base.
Most journal bullets should never be promoted. TODO-only items, meeting
logistics, unexplained fragments, and one-off status updates usually stay where
they are.&lt;/p&gt;
&lt;p&gt;What gets promoted is the material with reuse value:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;architecture decisions&lt;/li&gt;
&lt;li&gt;operational patterns&lt;/li&gt;
&lt;li&gt;incident/debugging lessons&lt;/li&gt;
&lt;li&gt;recurring themes&lt;/li&gt;
&lt;li&gt;commands with explanation&lt;/li&gt;
&lt;li&gt;glossary terms&lt;/li&gt;
&lt;li&gt;papers, talks, docs, and articles worth finding again&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="external-sources-need-a-local-copy"&gt;External sources need a local copy&lt;/h2&gt;
&lt;p&gt;Some source material is too large, too valuable, or too likely to disappear
behind a login wall. The graph has a &lt;code&gt;sources/&lt;/code&gt; directory for that.&lt;/p&gt;
&lt;p&gt;For conference talks, I fetch subtitles with &lt;code&gt;yt-dlp&lt;/code&gt; and store &lt;code&gt;.vtt&lt;/code&gt; files under
&lt;code&gt;sources/transcripts/&amp;lt;conference&amp;gt;-&amp;lt;year&amp;gt;/&lt;/code&gt;. Each talk gets a small metadata file
with the URL, title, speakers, runtime, transcript path, and the page that
summarizes it.&lt;/p&gt;
&lt;p&gt;The summary goes into &lt;code&gt;pages/&lt;/code&gt;. The transcript stays in &lt;code&gt;sources/&lt;/code&gt; so future
search can still find an exact phrase, command, or speaker quote that did not
make the summary.&lt;/p&gt;
&lt;p&gt;X.com needs a different path because direct fetching is unreliable from this
workspace. Long posts and threads are exported locally as Markdown into
&lt;code&gt;sources/x-com-posts/&lt;/code&gt;. The stable join key is the numeric status ID. When a
journal has an X link, I grep the exports for that ID and cite the local file.&lt;/p&gt;
&lt;p&gt;Attachments such as screenshots, PDFs, CSVs, and images live in &lt;code&gt;assets/&lt;/code&gt;, using
Logseq&amp;rsquo;s normal local asset links.&lt;/p&gt;
&lt;p&gt;The result is boring in a useful way: a broken website or login wall does not
erase the source trail.&lt;/p&gt;
&lt;h2 id="pages-are-the-knowledge-layer"&gt;Pages are the knowledge layer&lt;/h2&gt;
&lt;p&gt;The durable pages are compact Markdown notes. They are not dumps from journals.
They answer the questions I expect a future reader, including a future AI agent,
to ask:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What is this?&lt;/li&gt;
&lt;li&gt;Why does it matter?&lt;/li&gt;
&lt;li&gt;How does it work?&lt;/li&gt;
&lt;li&gt;What are the gotchas?&lt;/li&gt;
&lt;li&gt;Where did this come from?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The common shape is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;## Summary&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;## Key Ideas&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;## Operational Notes&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;## Gotchas&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;## Links&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;## Source Notes&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Not every page needs every heading. The format is only there to force the useful
work: make the page searchable, connect it to related pages, and show where the
material came from.&lt;/p&gt;
&lt;p&gt;A recent addition to that shape is claim-level footnotes. &lt;code&gt;## Links&lt;/code&gt; is a fine
roster of further reading, and &lt;code&gt;## Source Notes&lt;/code&gt; records which journal a page
grew from, but neither tells a reader which specific source backs a specific
sentence. When a page states a number, a benchmark result, or a direct
attribution, I now tie it to its source with a footnote at the point of the
claim, so the reader lands on the primary source instead of guessing which of
ten links in the list is the right one. Logseq renders standard Markdown
footnotes: &lt;code&gt;[^1]&lt;/code&gt; next to the claim, and &lt;code&gt;[^1]: Title, date, URL&lt;/code&gt; collected at
the bottom of the page. The &lt;code&gt;curate-journals&lt;/code&gt; skill treats this as a rule now:
any paper, post, or video a page relies on has to be reachable from the page
itself, because the journal it came from usually holds only a bare link.&lt;/p&gt;
&lt;p&gt;Logseq links are the connective tissue. A page about local models can point to
&lt;code&gt;[[Claude Code]]&lt;/code&gt;, &lt;code&gt;[[AI/Harness engineering]]&lt;/code&gt;, or &lt;code&gt;[[Observability/LLM observability]]&lt;/code&gt;
without needing a separate taxonomy project. If a page name contains a slash,
the file uses Logseq&amp;rsquo;s triple-lowbar encoding, so &lt;code&gt;AI/Local models and RAG&lt;/code&gt;
lives as &lt;code&gt;pages/AI___Local models and RAG.md&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="the-curation-pass"&gt;The curation pass&lt;/h2&gt;
&lt;p&gt;The curation workflow is deliberately mechanical:&lt;/p&gt;
&lt;p&gt;The repo has a Claude skill for this: &lt;code&gt;.claude/skills/curate-journals/SKILL.md&lt;/code&gt;.
&lt;code&gt;AGENTS.md&lt;/code&gt; says what the graph is and what good curation looks like; the skill
turns that into the repeatable pass.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Find unprocessed journal changes from the last &lt;code&gt;Curation hash:&lt;/code&gt; in &lt;code&gt;log.md&lt;/code&gt;,
plus any untracked journal files.&lt;/li&gt;
&lt;li&gt;Read each journal in full and note the &lt;code&gt;[[tag]]&lt;/code&gt; blocks.&lt;/li&gt;
&lt;li&gt;Classify each bullet as durable, raw, or already promoted.&lt;/li&gt;
&lt;li&gt;Map durable items to existing pages before creating new pages.&lt;/li&gt;
&lt;li&gt;Investigate external links, transcripts, and local X.com exports.&lt;/li&gt;
&lt;li&gt;Write synthesis into &lt;code&gt;pages/&lt;/code&gt;, not a dump of journal bullets.&lt;/li&gt;
&lt;li&gt;Cross-link related pages.&lt;/li&gt;
&lt;li&gt;Append a new batch entry to &lt;code&gt;log.md&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Update &lt;code&gt;pages/contents.md&lt;/code&gt; if a new durable page was created.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The last step saves future work. &lt;code&gt;log.md&lt;/code&gt; records which journals were processed,
which pages changed, which external links were investigated, which videos or
transcripts were fetched, what was skipped, and what backlog remains.&lt;/p&gt;
&lt;p&gt;That makes curation resumable. A later pass can see why a link was ignored or
whether a conference playlist was already fetched.&lt;/p&gt;
&lt;p&gt;The git hash is the part that makes this work for real daily notes. A date scan
only finds journal files newer than the last processed date. That misses the
normal Logseq habit: I open an old day, add one new block, and save it. The
&lt;code&gt;curate-journals&lt;/code&gt; skill reads the previous &lt;code&gt;Curation hash:&lt;/code&gt; and diffs
&lt;code&gt;journals/&lt;/code&gt; against it, so a re-edited &lt;code&gt;journals/2026_06_24.md&lt;/code&gt; shows up even if
&lt;code&gt;journals/2026_06_25.md&lt;/code&gt; was already processed.&lt;/p&gt;
&lt;p&gt;The pass starts with roughly this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git diff --name-only &amp;lt;stored-hash&amp;gt; HEAD -- journals/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git status --short journals/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The union is the work list: journal files changed since the last curation pass,
plus new untracked journals. The curation log then records the next hash so the
following pass has a new high-water mark.&lt;/p&gt;
&lt;p&gt;The skill also keeps the pass conservative. It explicitly says to leave TODOs,
meeting logistics, PR breadcrumbs, isolated IDs, and ungrounded fragments in the
journal. That matters because the easiest way to ruin a personal knowledge base
is to promote everything.&lt;/p&gt;
&lt;h2 id="agents-make-the-graph-more-useful"&gt;Agents make the graph more useful&lt;/h2&gt;
&lt;p&gt;This graph is written for humans, but I also expect coding agents to read it.&lt;/p&gt;
&lt;p&gt;The repository has explicit instructions for Codex and Claude Code. They say,
in effect: this is a private Logseq knowledge base, not an app repo; journals
are the raw inbox; pages are the durable layer; do not copy raw fragments into
pages; synthesize, cite sources, and keep sensitive details private.&lt;/p&gt;
&lt;p&gt;For journal work, the agent loads &lt;code&gt;curate-journals&lt;/code&gt; and follows the same checklist
every time. That gives the agent a smaller job than &amp;ldquo;organize my notes&amp;rdquo;: find the
new journal material, decide what has durable value, update the right page, and
write down what happened.&lt;/p&gt;
&lt;p&gt;That changes how I use AI tools. Instead of asking an agent to remember context
from a chat, I ask it to inspect the repo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;search journals for a topic&lt;/li&gt;
&lt;li&gt;find the existing page&lt;/li&gt;
&lt;li&gt;read source notes&lt;/li&gt;
&lt;li&gt;summarize a talk transcript&lt;/li&gt;
&lt;li&gt;connect related pages&lt;/li&gt;
&lt;li&gt;draft a post from the durable layer&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The agent does not need everything pasted into the prompt. It can search the
repository, read the source material, and leave behind better Markdown for the
next run.&lt;/p&gt;
&lt;h2 id="what-i-do-not-promote"&gt;What I do not promote&lt;/h2&gt;
&lt;p&gt;The part that keeps the system usable is omission.&lt;/p&gt;
&lt;p&gt;I do not move every note into &lt;code&gt;pages/&lt;/code&gt;. Most raw material stays raw. That keeps
the durable layer useful.&lt;/p&gt;
&lt;p&gt;I leave behind:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;tasks without reusable context&lt;/li&gt;
&lt;li&gt;meeting logistics&lt;/li&gt;
&lt;li&gt;temporary debugging noise&lt;/li&gt;
&lt;li&gt;private operational details that do not need to be repeated&lt;/li&gt;
&lt;li&gt;links that looked interesting but did not turn into a durable idea&lt;/li&gt;
&lt;li&gt;source material that I cannot verify&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The durable layer works because it is selective.&lt;/p&gt;
&lt;h2 id="the-result"&gt;The result&lt;/h2&gt;
&lt;p&gt;I am not trying to build a perfect wiki. I want a working memory system with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;fast capture in journals&lt;/li&gt;
&lt;li&gt;source retention for long-form material&lt;/li&gt;
&lt;li&gt;compact durable pages&lt;/li&gt;
&lt;li&gt;explicit source notes&lt;/li&gt;
&lt;li&gt;a curation log&lt;/li&gt;
&lt;li&gt;enough structure for Logseq, Codex, Claude Code, and future me to navigate it&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The design choice is to treat personal knowledge as ingestion, not filing.
Capture stays cheap because journals can stay messy. Curation happens later,
when there is enough signal to write a page worth keeping.&lt;/p&gt;
&lt;p&gt;That delay is the trick. It keeps the inbox easy and the knowledge layer clean
enough to be useful months later.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.prskavec.net/post/how-i-use-logseq-as-a-personal-knowledge-base/logseq-graph-view.png"
alt="Logseq graph view showing the knowledge base connections"
loading="lazy"
decoding="async"&gt;
&lt;/p&gt;</content:encoded></item><item><title>Agent Harnesses: Why You Shouldn't Bet Your Company on Claude Code or Codex</title><link>https://www.prskavec.net/post/agent-harnesses/</link><pubDate>Tue, 02 Jun 2026 09:00:00 +0100</pubDate><author>ladislav@prskavec.net (Prskavec.Net)</author><guid>https://www.prskavec.net/post/agent-harnesses/</guid><description>Coding agents are great, but locking your company into Claude Code or Codex is a strategic mistake. Here is why agent harnesses matter and what to do instead.</description><content:encoded>&lt;p&gt;In less than two years, coding agents went from novelty to daily driver. &lt;a href="https://www.anthropic.com/claude-code"&gt;Claude Code&lt;/a&gt; and &lt;a href="https://openai.com/codex/"&gt;OpenAI Codex&lt;/a&gt; read your repo, run commands, edit files, and finish real work. I use them every day. You probably do too.&lt;/p&gt;
&lt;p&gt;Using a tool is one thing. Standardizing your whole company on a single vendor&amp;rsquo;s closed agent is another. That decision is easy to make and very expensive to walk back, so it is worth thinking through before you make it.&lt;/p&gt;
&lt;h2 id="what-is-an-agent-harness"&gt;What is an agent harness?&lt;/h2&gt;
&lt;p&gt;When people say &amp;ldquo;Claude Code&amp;rdquo; or &amp;ldquo;Codex,&amp;rdquo; they usually mean two things glued together:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;The model&lt;/strong&gt;, the LLM that does the reasoning (Claude, GPT, and so on).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The harness&lt;/strong&gt;, everything around the model: the tool-calling loop, file editing, command execution, context management, permissions, prompts, and the UI.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The harness is what turns a chat model into an &lt;em&gt;agent&lt;/em&gt;. It decides which tools exist, how context is assembled, when to ask for permission, and how errors get recovered. The model is a commodity you rent by the token. The harness is where your actual workflow lives.&lt;/p&gt;
&lt;p&gt;And the harness is the valuable part. The vendor owns it.&lt;/p&gt;
&lt;h2 id="the-case-against-vendor-lock-in"&gt;The case against vendor lock-in&lt;/h2&gt;
&lt;h3 id="1-you-couple-your-workflow-to-someone-elses-roadmap"&gt;1. You couple your workflow to someone else&amp;rsquo;s roadmap&lt;/h3&gt;
&lt;p&gt;Adopt Claude Code or Codex wholesale and your engineers&amp;rsquo; muscle memory, your CI integrations, your custom commands, and your prompts all get shaped by that one harness. When the vendor changes pricing, drops a feature, throttles your usage, or pivots, you pay for it. You don&amp;rsquo;t control the roadmap and you can&amp;rsquo;t fork it.&lt;/p&gt;
&lt;h3 id="2-the-model-is-the-easy-part-to-swap-if-the-harness-lets-you"&gt;2. The model is the easy part to swap, if the harness lets you&lt;/h3&gt;
&lt;p&gt;A new best model shows up every few months. The model that fits your codebase best in Q1 may be second-best by Q3. A good setup lets you switch when the price/performance curve moves. A closed vendor harness ties you to their model family, and that costs you the biggest lever you have: picking the best model for the task at the best price.&lt;/p&gt;
&lt;h3 id="3-data-and-compliance-boundaries-are-not-negotiable-for-many-companies"&gt;3. Data and compliance boundaries are not negotiable for many companies&lt;/h3&gt;
&lt;p&gt;Where does your code go? What gets logged, retained, and used for training? With a closed harness you take the vendor&amp;rsquo;s answers as given. For regulated industries, air-gapped environments, or anyone with serious IP concerns, that is not enough. An open harness lets you choose providers, route to self-hosted or enterprise endpoints, and keep an audit trail you actually own.&lt;/p&gt;
&lt;h3 id="4-lock-in-is-cheap-to-enter-and-expensive-to-leave"&gt;4. Lock-in is cheap to enter and expensive to leave&lt;/h3&gt;
&lt;p&gt;The start is great. Then you have hundreds of engineers with vendor-specific habits, internal tooling built against a proprietary CLI, and no abstraction layer. Migrating later means retraining people and rebuilding integrations. That switching cost is exactly what gives the vendor pricing power over you.&lt;/p&gt;
&lt;h3 id="5-your-competitive-edge-should-not-be-a-saas-subscription"&gt;5. Your competitive edge should not be a SaaS subscription&lt;/h3&gt;
&lt;p&gt;If everyone in your industry runs the same off-the-shelf agent the same way, where is your advantage? The leverage is in &lt;em&gt;how&lt;/em&gt; you wire agents into your codebase, your domain knowledge, your tests, and your review process. That belongs in something you control.&lt;/p&gt;
&lt;h2 id="the-alternative-own-the-harness-rent-the-model"&gt;The alternative: own the harness, rent the model&lt;/h2&gt;
&lt;p&gt;This is not an argument against AI coding agents. It is an argument for putting the boundary in the right place. Here is the setup I recommend.&lt;/p&gt;
&lt;h3 id="own-the-harness-with-pi"&gt;Own the harness with pi&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://pi.dev"&gt;pi&lt;/a&gt; is a minimal, extensible terminal coding harness. The idea is to adapt the tool to your workflow instead of the other way around, and you do that without forking the agent&amp;rsquo;s internals. You extend it with TypeScript extensions, skills, prompt templates, and themes, then package and share them across your team over npm or git.&lt;/p&gt;
&lt;p&gt;That gives you what you want from a company harness:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Your custom tools, prompts, permissions, and skills become version-controlled artifacts in your repo, not settings trapped in a vendor&amp;rsquo;s cloud.&lt;/li&gt;
&lt;li&gt;It runs in interactive, print/JSON, RPC, and SDK modes, so the same harness powers your engineers&amp;rsquo; terminals and your CI pipelines and internal apps.&lt;/li&gt;
&lt;li&gt;It ships with sensible defaults but stays small, so you add only the complexity you need.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You get the ergonomics of Claude Code or Codex, but the workflow logic is yours and travels with your codebase.&lt;/p&gt;
&lt;h3 id="rent-the-model-through-a-gateway"&gt;Rent the model through a gateway&lt;/h3&gt;
&lt;p&gt;Keep the model pluggable. The simplest path is &lt;a href="https://openrouter.ai"&gt;OpenRouter&lt;/a&gt;, a model gateway that gives you access to basically every model worth using behind one interface. Swap Anthropic, OpenAI, Google, and open-weight models on price/performance without rewriting anything.&lt;/p&gt;
&lt;p&gt;If your data or compliance requirements are stricter, and for many companies they are, go through a cloud provider gateway instead. &lt;a href="https://aws.amazon.com/bedrock/"&gt;Amazon Bedrock&lt;/a&gt; and &lt;a href="https://azure.microsoft.com/en-us/products/ai-foundry"&gt;Azure AI Foundry&lt;/a&gt; give you the same model menu inside your existing cloud account, with your org&amp;rsquo;s networking, IAM, logging, and data-residency guarantees already in place. For regulated or IP-sensitive work, that is often the right answer.&lt;/p&gt;
&lt;p&gt;Either way, standardize on the &lt;a href="https://platform.openai.com/docs/api-reference"&gt;OpenAI-compatible API&lt;/a&gt; shape as the lowest common denominator, so swapping providers is a config change and not a migration.&lt;/p&gt;
&lt;h3 id="measure-and-route"&gt;Measure and route&lt;/h3&gt;
&lt;p&gt;Once the model is a swappable component, you can benchmark cost and quality per task and route on purpose: a cheap fast model for boilerplate, a strong one for tricky refactors. With pi owning the loop and a gateway in front, that routing is yours to tune.&lt;/p&gt;
&lt;h2 id="but-claude-code--codex-is-just-better-right-now"&gt;&amp;ldquo;But Claude Code / Codex is just better right now&amp;rdquo;&lt;/h2&gt;
&lt;p&gt;Maybe today. The gap between the leading harness and the open ones is closing fast, and the open ones are built out in the open. Optimizing for &amp;ldquo;best this quarter&amp;rdquo; while you lock yourself in for years is a bad trade, especially for something as foundational as how your company writes software.&lt;/p&gt;
&lt;p&gt;Use the good tools. Just don&amp;rsquo;t let one of them become the thing you can&amp;rsquo;t leave.&lt;/p&gt;
&lt;h2 id="takeaways"&gt;Takeaways&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The harness, not the model, is where your workflow lives, and closed vendors own it.&lt;/li&gt;
&lt;li&gt;Treat the model as a swappable commodity. Lock-in takes that lever away.&lt;/li&gt;
&lt;li&gt;Data, compliance, and cost control all get harder when the harness is a black box.&lt;/li&gt;
&lt;li&gt;Use an extensible harness like &lt;a href="https://pi.dev"&gt;pi&lt;/a&gt; and keep your prompts, tools, and skills version-controlled in your own repo.&lt;/li&gt;
&lt;li&gt;Rent models through a gateway: &lt;a href="https://openrouter.ai"&gt;OpenRouter&lt;/a&gt; for breadth, or &lt;a href="https://aws.amazon.com/bedrock/"&gt;Bedrock&lt;/a&gt; / &lt;a href="https://azure.microsoft.com/en-us/products/ai-foundry"&gt;Azure AI Foundry&lt;/a&gt; when compliance and data residency matter.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Adopt agents fast, but keep the boundary, the harness and the choice of model, in your own hands.&lt;/p&gt;</content:encoded></item></channel></rss>