Repository navigation
v2.1.0 — The Quality Release: Knowledge Gaps, Post-Resolution QA, Effectiveness, Friction, Translation, Advanced Segmentation, Report Builder
v2.1.0 — The Quality Release
The quality release: SupportOS learns to look at its own work. The knowledge gap engine (plan phase 26) turns the v1.x documentation-gap detection into a persisted candidate pipeline with human approval — five deterministic kinds (repeated questions with no covering document, repeated questions the existing docs did not solve, conflicting knowledge pairs, missing troubleshooting steps, undocumented new issues), stable dedup keys so rebuilds refresh evidence without duplicating, and human decisions that survive rebuilds untouched; approving marks a candidate and nothing more — nothing ever auto-publishes into the knowledge base. The post-resolution QA pipeline (phase 27) adds the after-close layer that was deliberately missing: per conversation, a deterministic tier that is always computable (back-and-forth after the first reply, repeated 6-word information spans with thread evidence, messages after close, handoffs from the event engine, coarse question-vs-reply counts, first-response and resolution minutes) plus an optional local-model tier (ai_runs type post_resolution_qa, strictly separate from pre-send draft verification) that reports whether the question was answered, whether responses were evidence-supported and whether the right issue was identified — with improvement suggestions that are recommendations for humans, never actions. The historical response-effectiveness report (phase 28) extends the interaction-outcomes layer into observed style → outcome associations (follow-up rate, clarification rate, resolved-after-first, effort, ratings, sample conversations) with the plan's own rule made structural: the notes lead with "OBSERVED ASSOCIATIONS… not causation", small buckets say they are anecdotal, and the audit greps for causal vocabulary. Conversation friction grows six evidence-pinned detections (phase 29): repeated customer explanations (repeated-span matching), repeated agent questions, troubleshooting loops, repeated handoffs (from the M1 event engine), repeated unresolved interactions (customer-level, 90-day same-tag recurrence) and duplicated information requests (request-category + entity-shape matching or the customer saying so directly) — every finding cites thread ids and excerpts, and every detail line says it is a heuristic, a pattern, never a judgment about a person. Local translation (phase 30) arrives with a deterministic language detector (Unicode script ranges first — Han honestly low-confidence — then function-word frequency for Latin scripts, with unknown as a legitimate answer) and LM Studio–only translation with content-hash caching, a system prompt that preserves technical terms/code/URLs/emails verbatim, side-by-side original/translated display in the conversation detail, and no cloud fallback and no automatic sending, ever. Advanced contact segmentation (phase 31) adds seven condition families to the contact-first engine — organization data/properties, ticket custom fields and channel (same-conversation semantics), support-history waiting and previous issues (clusters/known issues), incident exposure, campaign history including not_received exclusions, deterministic support-health aggregates, custom-object links and customer-event timeline conditions — all compiled set-per-node with whitelisted identifiers and bound values; a natural-language suggestion endpoint lets the local model PROPOSE a definition, which the deterministic engine immediately evaluates — the model never selects recipients and nothing saves implicitly (a strict validator rejects any malformed proposal). Outreach (phase 32) inherits every new condition through the existing audience pipeline — snapshots, dedup, explicit review, DNC, duplicate-send protection, timeout reconciliation, audit trail unchanged. The custom report builder (phase 33) closes the release: 20 local metrics × 14 dimensions compiled from closed catalogs only (injection-shaped configs are clean 422s), filters, date ranges, previous-period comparison rendered as differences, bar/table output, saved definitions — and every metric ships its definition and limitations in the response itself; native Help Scout reports stay under their own tab, labeled by origin. Two read-only Copilot tools join the registry (get_knowledge_gaps, get_friction_report). 594/594 tests green (+53 over v2.0.0), the black-box audit grew a v2.1.0 section M (425 checks, 0 HIGH / 0 MEDIUM after fixes — it caught a real safe-deny gap in history_issue and a latent M4 freshness crash that only fires when repeated questions exist), and the human-like browser pass approved a gap candidate through the real UI (DB-verified), recomputed QA deterministically, saw the honest LM-Studio-down error states for both QA and translation, ran the report builder, exercised the new segment conditions, and walked all 19 pages with zero console errors.
Fixed
- Latent v2.0.0 freshness crash (
f.doc_idonfts_knowledge, which hasdocument_id): only fires when repeated questions exist — exactly the scenario the associated-questions feature was built for; surfaced by this release's demo seed adding a repeated question. Column fixed and regression-covered. history_issuesegmentation condition fell through to the known-issues link table for unknownissueKindvalues (audit section M find — matched instead of safe-denying); now a strict closed-vocabulary check.- Outreach meta 500 (
""double-quoted SQL literal parsed as an identifier) in the new org-property stats queries — found by this release's own e2e run. - QA
first_response_minutesnow falls back to the first reply thread timestamp when the maintained derived column is absent. - Report builder
ai_attribute_sharebound its parameters in the wrong positional order (SELECT expression params after WHERE params); parameter assembly now follows SQL position order.