Tutorial specification
This document is the full specification for writing a tutorial against this system. It is addressed to the agent doing the writing. Read it in full before writing anything, and keep it open while you work.
It applies to new videos and to redoing any tutorial produced before 2026-08-02.
Write a tutorial for each video I give you. A tutorial here is a set of steps a person can
run on this machine today against the system described in GROUND-TRUTH-2026-08-01.md.
Anything else is not a tutorial.
Ground every step in the real system
Draw only on the components below. They are the whole list. If a step needs something that is not here, the step does not exist, and you should say so instead of writing it.
Running today:
- The Obsidian vault at
/Users/jonnydubowsky/Documents/totem-terminal, which is the system of record. Markdown files with YAML frontmatter, plus about 40 Bases dashboards that read those schemas. - Claude Code as the harness, with skills, agent specifications, and slash commands.
- myKG, the typed producer and store. Every concept space emits a bundle of
nodes.jsonl,edges.jsonl,schema.json, andknowledge_graph.ttl. - The OKF toolchain at
projects/shur/okf/:okf_mirror.py(deterministic document mirror),okf_extract_entities.py(entity producer with REA and BMC typings),okf_enrich.pywithokf-concept.prompt(dotprompt enrichment),okf_persona_export.py(Layer 2 persona bundle),okf_viz.py(self-contained D3 bundle viewer), andshuriq-okf-profile.md(the versioned standard, v0.5.1). - Dotprompt, in production in the module gallery at
projects/shur/report-grammar/module-gallery/prompts/. A dotpromptinput.schemais where an OKF record plugs in andoutput.schemawrites records back. - The semantic layer: the
shuriq_kgPython package with aTripleStoreabstract base class and adapters for in-memory rdflib, Oxigraph over HTTP, and GraphDB over HTTP. Two of those three work. Oxigraph is the running store. GraphDB's licence expired 2026-05-22, it does not respond, and every query returns a licence error, so write two engines and never three. Named graphs followhttps://shurai.com/graphs/{vertical}/{week}. The store held 119,054 triples as of 2026-07-30. - SBPI, the Structural Brand Power Index, in two tiers that are never merged. Tier 1 is universal brand health across five dimensions: Content Strength, Narrative Ownership, Distribution Power, Community Strength, Monetization Infrastructure. Tier 2 is a per-vertical rubric. A client is one row in a stack-ranked set of their vertical.
- The nightly SBPI pipeline, scheduled at 06:13.
- ShurIQ Report Studio at
~/Documents/projects/shuriq-report-studio/, deployed toshuriq-report-studio.pages.dev. Vite, React, Cloudflare Pages Functions, D1, and the Anthropic SDK. - The Report Engine managed agent, Anthropic agent
agent_01Uj1TbRtS5jAbLGNzpyKrT5, live since 2026-05-29. - The content pipeline:
content/build.rbandcontent/publish.rb, source atcontent/series/<slug>/pathways/<NN-pathway>/<NN-slug>.md, deployed tocontent-series-b6l.pages.dev. 15 series directories, 13 with a_series.yml, and 91 lessons. - The Slack agent at
projects/shur/slack-agent/, channel#shur-iq. - The grammar gate,
projects/shur/report-grammar/grammar-gate.py. Built and running by hand; it is not in continuous integration. - The OKF persona gate Worker at
https://okf-persona-gate.jonny-a6b.workers.dev. Open routes serve Layer 2 and/rehydrate/<id>returns 401 without a bearer token. - Nightly and weekly agents that run today: Scout (negative-space gap finding), Social-Int (people enrichment), SBPI scoring, and the daily, weekly, and value-flow reports.
- Tools genuinely in the loop: Obsidian, Claude Code, InfraNodus over MCP and REST, DEVONthink, mem0 and OpenMemory over a REST endpoint on port 8765, Cloudflare Pages and Workers, Oxigraph, and Excalidraw.
Prototype: Trailblazer (environment mapping and intent modelling) and the DKR agent that links new notes and raises legibility.
Specified and unbuilt: the monorepo (apps/, modules/, engines/, interfaces/,
registries/, intake/, gates/, .github/), with seed files ready at
projects/shur/dev-sprint-1/monorepo-seed/ including gates/route-gate.py whose
self-test passes 13 of 13 with no model calls; the delivery grammar
Route = Channel x Form x Reader x Action with the gating fields attenuates and
evidence; the registries at v0, holding 12 channels, 20 forms of which 11 are built,
and 1 reader, with zero route declarations existing as files; Jira, which has no
instance at all; and the repository inside the shuriq-lab GitHub organization, which
holds zero repositories and has no chosen name.
Follow the corrected tutorials in this pack
The 21 files in tutorials/ are the pattern. Two more exist and were held back from
this pack, which tutorials/WITHHELD.md records. Read at least these three before
writing:
103-google-open-knowledge-format.md. A tutorial where the video maps cleanly onto a built toolchain. Numbered steps, every command runnable, an open decision stated as open.102-284b-model-on-a-laptop.md. A tutorial for a video with no installable step here. It states the honest position, points at the two vault documents that hold the decision, and describes the one test that would settle it.118-why-agentic-systems-need-ontologies.md. A tutorial that turns a concept into an audit of files that already exist, starting from what is already written down and checking the output against the type vocabulary.
Match their register: second person, imperative step titles, short sentences, commands in
fenced bash blocks with the cd to the vault included where it matters.
Never describe an unbuilt thing in the present tense
This is the rule that separates a usable tutorial from the ones I am replacing.
- A component that runs gets present-tense instructions.
- A component that does not exist gets a section title beginning
Unbuilt:orRecipe (unbuilt):, and prose in the conditional. Write "a scheduled retirement pass would read the ledger nightly", never "the scheduled pass reads the ledger nightly". - A build recipe is allowed and welcome. Label it as a recipe, state what it would cost, and state what has to be decided before anyone starts.
- Never write a command against a path you have not been shown. If you want a reader to run something in a component that does not exist yet, put the command inside the unbuilt section and say plainly that it will fail today.
Every tutorial ends with a real check
Close each tutorial with a ## Verify it worked section. It contains commands that run
today against files that exist, and for each one a stated expectation. A check that
cannot fail is not a check. Prefer checks that catch the specific mistake the tutorial
invites, and say which check matters most and why.
Acceptable checks: a grep that must return zero matches, a re-run of an idempotent tool
that must report no writes, a curl with -o /dev/null -w "%{http_code}" against a URL
in the component list, a file existence test, a self-test with a known pass count.
Say plainly when a video does not apply
Some videos have no actionable application here. When that is true, say it in the opening paragraph, explain in one section what the video argues, explain in one section why it does not transfer, and stop. A short honest tutorial is the correct output. Padding a video into invented steps is the failure mode I am correcting, and it is worse than a half-page answer.
Writing rules
Follow the rules in Prompt 1 exactly: zero em-dashes, full ISO dates, no "not X, but Y" inversion, no banned term from the list, one thought per sentence, each point made once, no self-reference, no unexpanded internal code. Before you return anything, run your own pass against the banned-term list in Prompt 1 and report the count of hits you fixed.
Where a banned word appears inside a verbatim external title, a filename that exists, or
a literal string a reader must copy, keep it and list it in a grammar-allow.txt beside
your output, with a comment saying why each line is there and that it is pending my
authorisation.
Return format
Return one Markdown file per video, named <video_number>-<slug>.md, with this
frontmatter shape:
---
created: 2026-08-01
modified: 2026-08-01
type: strategy_doc
doc_type: tutorial
status: draft
origin: claude-code-terminal
project: dkr-agency
organization: [sense-collective, shur-agency]
style_guide: google-developer
reader: "a one-line description of the specific person who runs this"
video_number: 103
video_title: "Google's Open Knowledge Format (OKF)"
source_tutorial: "manus guided_tours/getting_started_instructions_103.md, rewritten 2026-08-01"
tags: [tutorial, concept-space, okf]
---
Set created and modified to the date you write the file, in full ISO form. Write
reader as a description of a person and a task. Never write reader: internal. Keep
style_guide: google-developer, because tutorials are technical documentation and follow
Google developer documentation style.
Use type: strategy_doc with doc_type: tutorial, exactly as written above. There is no
tutorial value in the artifact type registry, and inventing one breaks about 40 Bases
dashboards that read these schemas. The doc_type field is the established discriminator.
Then an H1 that states the outcome as an action, such as "Turn a vault folder into an OKF
bundle". Then two or three sentences saying what the tutorial does and who it is for.
Then the steps. Then ## Verify it worked.