The importer, and three things it taught us

Featurekamo-internal
Shipped
September 2, 2026 at 2:54 AM UTC
Author
Kamo
Commit
8e1d72a

Publishes the corpus by driving the real KBService API rather than writing rows -- a direct INSERT skips the version row, the kb.article.published event that is the only thing indexing an article for the AI Assistant, and the translation fan-out. An import that looked successful and left "Train AI With This Article" doing nothing on three hundred articles is the kind of failure nobody notices for a month. Three defects it surfaced, all fixed here: 19-digit ids must never touch a JavaScript number. Number('1168485648209608710') is 1168485648209608700. A session minted with that org id authenticates perfectly and resolves to an organization that does not exist -- the overview came back empty and read as "the knowledge base is empty". The same trap a second time on the article uid, where reorder answered 403 because the parent id had been rounded and matched nothing. Session ids are now written into the JSON as raw literals, and article ids are read out of the response text before JSON.parse can touch them. A category's null parent is the section, not the root. Sending null would have published sixteen sibling top-level articles, and the marketing site -- which asks for the tree below help-center -- would have shown an empty page. kubectl port-forward does not survive a few thousand requests. Transport failures now retry with backoff; HTTP errors do not, because repeating a 403 four times only takes longer to fail. The author is Sage, who already authors the Help Center article. An article's author and last editor come from the session that wrote it and are shown by name on every article in the console.

All changes

Like what you see shipping?

Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.

Start Free ForeverView Pricing