Skip to content

fix(chat): borrowed figures, false gap lines and scope refusals - #476

Merged
digibrander merged 5 commits into
mainfrom
development
Sep 17, 2026
Merged

digibrander merged 5 commits into
mainfrom
development

Conversation

@jadhavgaurav

Copy link
Copy Markdown
Collaborator

The next three answer-quality fixes from the 2026-09-17 production evaluation of Eventus and CleanStart (reviewed after PR #474: Eventus 79%, CleanStart 75% on 163 cases).

What changes for visitors

  • Borrowed figures stay out of our terms. A crawled blog post, guide, glossary, listicle, comparison or "what is / how to" page now carries a "general article" tag in the reference context. SLAs, response and remediation times, guarantees and countries served count as the company's own only when an untagged page states them. A "yes" must match the exact capability asked (on-premises is not air-gapped; offices in a region are not service in a named country). Production cases: Eventus quoted a buyer guide's example "P1 acknowledge 10 min" and a generic article's "48 hours" as its own, and said yes to air-gapped and to France.
  • No false "I don't have that detail here". A follow-up about something already listed ("the third one"), a correction ("we are a bank, not insurance") and an identity question ("which one am i talking to") are rewritten, judged beside the last reply and answered, not refused. Value questions ("can't I just use open source") count as on scope, and an HR email question pins the contact pages. The gap rule counts only facts the bot already gave, never the visitor's own claims.
  • No scope refusal on ordinary turns. A closing ("thanks thats all for now") gets a short goodbye with no question, "hello again" is a greeting, a meeting request addressed to the business on a bot with a scheduler skips the relevance judge (the Hinglish "aapki team ke saath ek call fix ho sakta hai kya?" was refused on both bots), a request for the business's own material ("do you have a breach report I can download") is on scope, and the relevance judge scores a term in the business's field as relevant. Essays and homework are declined even on a security topic.

Review

An independent review of the combined diff found over-broad signals, all fixed in the last commit: "how/what/best" alone tagged company pages as articles; loose correction and "your material" patterns let off-topic questions past the judge; "how do I schedule a meeting in outlook?" bypassed the judge; a booking turn could be cached without its card; "our exact terms come from our team" appeared on plans with no team; the gap rule counted the visitor's claims as facts. The general-article tag is also a leak marker now.

Deploy notes

  • Backend only, no migration.
  • QA_PROMPT_VERSION 6 to 7 (answer prompt changed); the relevance-gate prompt version 3 to 4. Cached answers and gate verdicts from the old prompts are not reused.
  • No new per-turn model calls. Correction and ordinal follow-ups now take the existing query-rewrite call.

Checks

  • Ruff clean.
  • Full backend suite: 13,564 passed, 4 skipped, 1 deselected (test_superadmin_impersonate_mint::test_redirect_url_uses_the_shared_app_url_setting, a known local ordering failure).
  • The prompt changes are verified by tests, not yet by the live model; after deploy the affected cases are rerun on Eventus and CleanStart.

Known limits

  • Two of the borrowed-figure pages (/cybersecurity/vulnerability-management/computer-security, /soc-as-a-service-ciso) have no article shape in their URL, so only the prompt rule protects them.
  • A bare "how" slug (/knowledge-hub/how-enterprises-patch-containers) is not tagged, to keep company "how it works" pages untagged.

…rowed figures out of our terms

The 2026-09-17 production evaluation found Eventus Security quoting generic
pages as its own commitments. "Whats the guaranteed P1 response time in the
contract" got "a documented P1 acknowledge target of 10 min", an "e.g." from
the buyer guide /best-soc-as-a-service-providers-2025. A CISO checklist's MTTD
and MTTR figures were called "the closest published targets", a generic
article's "remediate critical findings within 48 hours" became the patch SLA,
"fully air-gapped?" got "Yes" when the knowledge base only says on-premises,
and a French follow-up got "we support France" with nothing about France.

Every document reached the model with the same header, so it could not tell a
listicle from a contract. A new page_kind module reads a crawled page's URL
path: a guide, listicle, comparison, glossary, checklist, "what is" or "how to"
page, or a blog post, now carries "general article, not the company's own
terms" in its <<<DOCUMENT n | name>>> header. Uploaded files and pages whose
path names the company are never tagged, and a knowledge hub is not a signal
on its own (CleanStart publishes its SLA tiers there). credential_facts shares
the token set and path parsing instead of keeping its own copy.

RULE 5a now says the tag marks such a page, that SLAs, response or remediation
times, guarantees and countries served are ours only when an untagged page
states them, and that an example or best-practice figure is never ours, not
even as a closest target. RULE 5c says a yes must match the exact capability
asked. QA_PROMPT_VERSION is 7 with the new fingerprint; the minimal prompt is
2,898 tokens against its 3,000 ceiling.
…ead of the gap line

The 2026-09-17 evaluation on CleanStart and Eventus Security found the canned
"I don't have that detail here. Want me to loop in the team?" on turns the
conversation or the knowledge base answers. Four of the five came from the
canned pivot after the relevance judge rejected the turn and nothing overruled
it; one was the model's own gap line:

- "the third one. how exactly do u help them" after a list of four industries
- "sorry not hospital, we are a bank. what changes" (both bots); it was not
  even rewritten against the conversation, so retrieval searched its words
- "so which one am i talking to", answered by the bot's own configuration
- "why should i pay, cant i just use free open source tools for this"
- "whats the hr mail id" (model), with the careers address on the contact page

Changes:
- _refers_to_an_earlier_turn: an ordinal pointer at a listed item or a
  correction of the visitor's details. It makes a turn a follow-up (rewritten,
  judged beside the last reply, kept out of the QA cache) and, right after a
  bot reply, a topical follow-up whose refusal does not stand when chunks exist.
- _asks_which_business_this_is: "who am i talking to", "which company is
  this", "is this <us> or X". Such a turn reaches generation even when the
  judge rejects the chunks or retrieval found none; the prompt carries the
  company name, bot name and description.
- The comparison shape now covers paying the business against free, open
  source or in-house tools, and the company-facts contact shape covers an HR
  or careers address, so contact pages are pinned.
- RULE 5a: the gap path needs the fact absent from the conversation too, and
  is never for a listed item, a correction or who the bot is.
  QA_PROMPT_VERSION 7 with its fingerprint.
…lls and material requests

Evaluation 2026-09-17 on the Eventus Security and CleanStart production bots:
"thanks thats all for now" got the scope refusal, which re-opens a
conversation the visitor just closed; "hello again" on a returning visit got
"Welcome back, Eva!" and then the refusal; a Hinglish request for a call
("bhai aaj shaam ko aapki team ke saath ek call fix ho sakta hai kya?") was
refused on both bots; CleanStart refused a request for a downloadable breach
cost report and "whats the difference between BAS and red teaming"; and
Eventus wrote a 300 word class essay on cyber security.

- The intent router gets a closing route: a whole-message goodbye ("thats all
  for now", "ok bye thanks", "no thats it thank you") gets one warm line with
  no question and no offer. A bare "thanks" stays the ack, and a message
  ending in "?" is never a closing. A greeting followed by "again" and "i'm
  back" are greetings. Closing replays no deferred question and gets no
  welcome-back opener.
- The meeting gate reads the Hinglish request, but it only answers for a bot
  without a scheduler. A bot with one fell through to the relevance judge,
  which found no chunk about a call and refused. A bookable meeting request
  now skips the judge and the empty-context refusal and reaches generation,
  where the booking-card safety net attaches the card.
- Asking the business for its own material ("do you have any report ... i
  can download", "can i download your ebook") is clearly on scope, so a turn
  the judge rejects with chunks in hand reaches the model.
- The relevance judge scores a question about a term in the business's field
  as related (gate prompt version 4).
- The answer prompt declines essays, assignments and homework even on a topic
  in the business's field, and allows a brief explanation of a field term that
  says whether the business offers it. QA_PROMPT_VERSION is 7 with the new
  fingerprint recorded.
…sion 7

The three fixes in this batch each changed the answer prompt and each recorded
its own version 7 fingerprint; this records the one for the combined prompt.
…ignals

Review findings fixed on this branch:

- page_kind: "how", "what", "best", "top" and "learn" alone no longer tag a
  page. A page is a general article only with a publishing section
  (blog, guide, glossary, article, insights, resources, news, webinar) or an
  article slug (what-is-, how-to-, top-N-, best/top ... providers or tools,
  best ... year, -vs-, -comparison, -compared, -checklist, -explained,
  -tutorial). credential_facts keeps its broader word set.
- _refers_to_an_earlier_turn: "i meant" and "actually i'm/we're" need a short
  noun phrase ending the clause; "X, not Y" needs the business speaking
  ("we are", "our company is"); not really/now/yet/bad/sure/interested and
  "a bit" are never corrections.
- _ASKS_OUR_MATERIALS_RE: a report, guide, research, resources or checklist
  request needs an ownership marker (your, you publish, download); only
  whitepapers, ebooks, brochures, datasheets and case studies stand alone.
- Booking bypass: the judge is skipped only for a request addressed to the
  business (you, your team, can we, with you, a bare request, a Hinglish
  shape) or naming it, so "how do I schedule a meeting in outlook?" is judged.
  A meeting request on a bot with a scheduler never reads or writes the QA
  cache.
- Answer prompt: a borrowed figure points at the team only on a plan with a
  team path, otherwise "we don't publish that figure here". The gap path
  counts only facts the bot already gave; a visitor's claim never counts.
  Fingerprint for version 7 re-recorded (not yet deployed).
- _ASKS_WHICH_BUSINESS_RE no longer matches "what company is this laptop
  from"; the closing route treats "that's it?!" as a question; an echoed
  general-article tag is caught by the leak check.
@digibrander
digibrander merged commit 241b1bf into main Sep 17, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants