9.7 KiB
Documentation & Discovery Ecosystem
TiXL v4.2's theme is documentation & discovery. This is the source of truth for how the
help surfaces relate and how the meet-up → docs pipeline works. Agent-neutral; referenced
from CLAUDE.md and AGENT_INSTRUCTIONS.md.
Help surfaces, by depth
| Tier | Surface | Feel |
|---|---|---|
| 0 glance | inline tooltips, operator first line | omnipresent, 1 line |
| 1 context | ToolTip panel (issue #102), full op/param description | on-demand, in place |
| 2 guided task | HowTos, Welcome intro | "show me once" |
| 3 deep practice | SkillQuest, Guided Feature Tours | "let me try it" |
| 4 reference | the manual (.help/docs/, help.tixl.app) |
"explain everything" |
| — archive | meet-up / tutorial videos (YouTube) | "watch the demo" |
Rule: authored cross-links point one tier deeper ("learn more"); the upward backlinks ("referenced from") are derived from the index, never hand-authored.
Cross-reference model
- One shared reference index is the spine; every surface reads it.
- Address scheme
type:id. Operators are unprefixed ([LinearGradient], resolved by the existingop_autolinks.py); other surfaces usetour:quest:manual:video:. - Internal targets (repo-resident) are link-checked at build (
mkdocs strict). External targets (videos, arbitrary URLs) are soft — a dead YouTube link must never break a build. - UI components carry stable ids. The
ui:namespace (Parameter Window, Performance Window, …) resolves against[HelpUiID("PerformanceWindow")]attributes on Editor component classes, collected by reflection intoreferences/indices/components.json— the UI analogue of the operator doc index. This formalises today's ad-hocDocumentationButton.Draw("<docId>", …)string literals into one declared, validatable id, soui:mentions/links are checked like operator names. Decouples the help-id from the class name. Keep it curated — roughly 30–100 across the whole app (major windows, panels, a few distinctive controls), not every widget; an id is a cross-reference commitment, added only for things that actually get referenced. (Editor-side; also the enabler for the #102 tooltip to light up on UI, not just operators.)
Folder layout
.help/
.src/ # committed — HAND-AUTHORED source (video scripts, drafts)
.tmp/ # gitignored — regenerable, safe to delete
audio/ # *.wav (whisper input, ~0.5 GB each)
video-transcripts/ # *.srt / *.txt (raw ASR)
youtube/ # *.txt (generated descriptions, to paste)
summaries/meetup/<date>.md # LLM extraction — staging for the (future) mentions enrichment
references/ # committed — the durable, distilled layer
videos.map.json # date -> YouTube id (recorded once after upload)
indices/
videos.json # video/meet-up chapters + segment references
skillquest.json # quest entries + refs (TBD)
mentions.json # "type:id" reference -> [video moments] for the editor
scripts/
update_help_index.py # the mechanical entry point (below)
update_help_index.local.json # gitignored — machine paths
op_autolinks.py # existing MkDocs auto-linker
docs/ # the published MkDocs tree (unchanged)
operators/index.json # existing operator doc index
Generated wiki pages do not live here — they are written into the wiki repo working copy
(tixl3d/tixl.wiki, cloned parallel, path from update_help_index.local.json), files only.
Index schema
videos.json — { emojiLegend, videos: [ { id, type, source:{type,id}, date, title, url, thumbnail, durationLabel, sourcePage, segments: [ { t, tLabel, durationSec?, category, emoji, text, url, ops[], issues[], notes[], section? } ] } ] }
mentions.json — { "<type>:<id>": [ { source:{type,id}, url, date, tLabel, category, durationMin, title, summary } ], ... } — keys are typed references
(op:Lib.io.video.VideoDeviceInput, ui:PerformanceWindow, …), so non-operator
entities slot in beside operators. Merged across all sources so the editor tooltip loads one file. category (emoji-derived) + durationMin (gap to the next chapter) qualify each
mention — a 26-min op-reference vs a 1-min chat. source.type makes the platform explicit
(future Vimeo / local). summary (plain "what you'll find" text) is filled by the LLM
enrichment skill, not the mechanical pass.
Emoji → category legend (extensible; unknown emojis are flagged, not dropped): chat 💬🗯️ · tip 💡 · op-reference 📘 · ui 🖱️ · highlight 🌟 · feature 🆕 · update 🛠️ · background 🧠📊 · planned 🎯 · showcase ✨🍿 · walkthrough 📝 · warning ⚠️ · question ❓ (pending labels: 🔢 🐛 🙋).
The meet-up → docs pipeline
Two halves, by nature of the work:
Mechanical (deterministic) — update_help_index.py
- Scans
Videos\_tixl\meetups\*.mp4. For any capture without a transcript: ffmpeg → 16 kHz mono WAV → whisper.cpp (ggml-base.en) in 30-minute chunks, each on a watchdog. Resumable (skips chunks already done) — a killed run loses nothing. ~30 min per 4-h video at ~9× realtime. - Backfills the index from existing hand-written wiki notes (tolerant parser, ~5 line formats).
- Merges per-source indices into
mentions.json. - Idempotent. Reads machine paths from
update_help_index.local.json. Writes files only — nevergit add/commit/push. - Runs locally, foreground. Do not launch transcription as a chat/session background task — those die silently on long runs (observed repeatedly).
Judgment (LLM) — the describe-meetup skill
- Reads the new transcript(s); produces the distilled summary (summary + chapters + highlights +
operators) →
references/summaries/meetup/<date>.md. - Chapter granularity matters: enough chapters that each topic's duration (gap to the next)
is meaningful. The skill assigns every chapter a
category(incl.🖱️ uifor panels/controls/drag behaviors) and fills each operator mention's plain-textsummaryinmentions.jsonby reading the transcript around that timestamp. - Resolves the YouTube id from
references/videos.map.json; if the date is missing it asks for the video URL (e.g.https://youtu.be/qavgcL72F1Y), extracts the id, and records it — so you never hand-edit JSON. (Existing wiki pages are backfilled by reading the id already embedded in them.) The id is needed only at generation, not for transcription. - Generates: the wiki page (
<wiki>/meetup.<date>.md, canonical format, deep-linked chapters, ops auto-linkable), the YouTube description (.tmp/youtube/<date>.txt, plain chapters + links footer), and the index delta (videos.json+mentions.json). - Every chapter keeps its emoji category on both surfaces (
📘 operator,🍿 showcase,🧠 deep dive, …) — it aids triage on multi-hour videos and keeps the wiki and YouTube consistent. The YouTube description leads with a one-line legend. - The YouTube
.txtis fully copy-paste: line 1 is a ≤100-char title in the formTiXL Meetup <date> / <topics>— identical to the wiki page H1, so one title serves both surfaces — then a blank line, then the body (summary, legend, chapters, links). Line 1 → the title field, the rest → the description field. - The description carries a wiki backlink —
More details … on the TiXL wiki: https://github.com/tixl3d/tixl/wiki/meetup.<date>(URL constructable from the date) — the video→wiki half of the cross-link; the wiki page links back via its thumbnail and chapters. - Human reviews. Nothing committed.
The full process
One-time setup: clone the wiki parallel (../tixl.wiki); create
update_help_index.local.json (wiki path, videos dir, whisper toolkit + model, ffmpeg);
ensure ffmpeg + the whisper.cpp build are present.
Per capture:
- Drop the recording in
Videos\_tixl\meetups\asYYYY-MM-DD ….mp4; upload to YouTube (unlisted is fine) and keep its URL — the skill asks for it in step 3 and records the id. python .help/scripts/update_help_index.py→ transcribes new captures (~30 min each), refreshes the indices. Wait.- In a Claude session, run the skill → drafts the summary, wiki page, YouTube description, and index delta.
- Paste
.help/.tmp/youtube/<date>.txtinto the YouTube video description. - Review changed files (
git status/diff) in both the TiXL repo and the wiki repo. - Rebuild + test in the Editor — the operator tooltip now shows "discussed in-depth at → ".
- Commit (you), in both repos.
Guardrails
- Scripts never touch the git index or remotes — they write files; you commit.
- Raw transcripts and WAVs are regenerable →
.help/.tmp/(gitignored). Distilled summaries are kept. - ASR is rough (names/timestamps drift) — a human pass is required before anything is published.
- The reference index also covers SkillQuest, operators, and manual pages; the meet-up pipeline is one feeder. Cross-reference maintenance across them is an LLM-assisted, human-reviewed sweep.
Status
- Built:
update_help_index.py(resumable transcription + index from wiki notes); the wiki-notes parser (meetup_references.py); thedescribe-meetupskill (transcript → summary + wiki page + YouTube text); the typedop:/ui:index with category + duration qualifiers. - Next: the editor tooltip consumer (#102);
[HelpUiID]+components.json(makesui:resolvable); thementions.jsonsummary/ui:merge step; the SkillQuest feeder.