Knowledge Base

Tribal knowledge, captured.

Every project owns its own articles. Editors author in BlockNote — a block editor built on ProseMirror — and readers see a rendered surface that matches the Resolvd theme. Articles tie back to tickets through a suggestion ranker and a Promote-to-KB button on every resolved ticket.

Authoring

Block editor. No markdown gymnastics.

BlockNote handles the heavy lifting — rich text, headings, lists, code, callouts. Slash-command to insert a block, drag a handle to reorder. Persists as JSON in kb_articles.content_json with a plain-text mirror for full-text search.

Bundle adds ~380 KB gzipped — code-split pages/Kb* if CDN bandwidth matters.

Block primitives
Headings

H1 / H2 / H3 with anchor links auto-generated from slug.

Lists

Bulleted, numbered, and checkbox. Nestable.

Code

Inline and fenced blocks with syntax highlighting.

Callouts

Info / warning / tip / danger variants.

Tables

ProseMirror-backed, drag to reorder rows or columns.

Images

Drag-drop upload — stored alongside ticket attachments under FSL terms.

Version history

Every save. Restorable.

Every save snapshots into kb_article_versions with an optional change_summary. Restore any past version with one click — the restore itself writes a new version row marked Restored from vN so the audit chain never breaks.

Draft saved

Article persists to kb_articles.content_json with a plain-text mirror for full-text search.

Publish

Article becomes visible to readers in the project. Submitter / Viewer roles see the rendered surface; never the editor.

Edit + save

New row in kb_article_versions with optional change_summary. Old version stays restorable.

Restore old version

Writes a new version row marked Restored from vN. Audit chain stays intact — no destructive overwrite.

Archive

Hidden from listings but kept in storage. Tech / Manager / Admin can resurrect.

Tags + keywords

Two surfaces. One signal.

Tags drive the project article index — chip filters that AND together via tags @> $1::text[]. Keywords boost the trigram similarity ranker that matches articles to tickets. Use them for SKU codes, model numbers, error strings — searchable signal that would clutter a tag chip.

# Article frontmatter
title: "Reseat the RAM on a HP Z240"
tags: [hardware, hp, workstation]
keywords: [Z240, "DDR4", "blue screen", "0x7E"]
Index filter: tag chips
Ranker boost: keyword tokens
Search hit: either path
Ticket ↔ KB

Articles meet tickets where they live.

The Resolution tab on every ticket carries a Knowledge panel. Articles surface on open, link explicitly, or get drafted fresh from the ticket itself.

Suggestion ranker

pg_trgm similarity over title || tags || keywords vs the ticket title. High-confidence matches auto-surface in the Resolution tab on ticket open.

Promote-to-KB

Drafts a new article seeded from the ticket's title + description + resolution_summary, with a kind='system' link back to the source ticket.

Resolution summary nudge

At close time, a small prompt asks the closer to capture a one-line resolution summary. Drives the new "Fix applied" filter on the ticket list (resolution_summary IS NOT NULL OR kb_link EXISTS).

Capture the next fix.

Resolve a ticket → click Promote-to-KB → tweak → publish. The next time the same error walks in, the article auto-surfaces.