{ "companyId": 338, "includeTravelChain": false, "includeTravelStress": false, "startedAt": "2026-06-28 10:46:11", "sections": { "engineHealth": { "passed": true, "health": { "companyId": 338, "healthy": true, "missingCore": [ ], "missingOptional": [ ], "passThreshold": 120 }, "message": "core beans wired" }, "integrationTests": { "passed": false, "summary": "2/4 tests passed in 72873ms", "details": [ "[FAIL] NodeTypeService: START node not found", "[FAIL] DynamicNodeExecutor: Judgment node execution failed", "[PASS] MultiModelWorkflowGenerator: All tests passed", "[PASS] ModelConfigService: All tests passed" ], "executionTimeMs": 72873, "message": "2/4 tests passed in 72873ms" }, "phase2Replay": { "passed": true, "verify": { "companyId": 338, "archiveTableExists": true, "hotIndexExists": true, "hotReplayRows": 82, "eventLogRows": 82, "archiveRows": 0, "status": "ok" }, "message": "phase2 replay verify ok" }, "pageLinkProbes": { "totalPages": 29, "requiredTotal": 15, "requiredPassed": 15, "optionalSkipped": 0, "failures": [ ], "passed": true, "durationMs": 4946, "pages": [ { "path": "/lobster/company-workflowLobster", "title": "Workflow templates", "probe": "templateList", "required": true, "passed": true, "status": "OK", "message": "templates=50" }, { "path": "/lobster/workflow-execution", "title": "Workflow execution tasks", "probe": "instanceList", "required": true, "passed": true, "status": "OK", "message": "instances=644" }, { "path": "/lobster/instance", "title": "Instance monitor", "probe": "instanceMonitor", "required": true, "passed": true, "status": "OK", "message": "monitor list ok, count=644" }, { "path": "/lobster/prompt", "title": "Prompt management", "probe": "promptList", "required": true, "passed": true, "status": "OK", "message": "prompt rows=66" }, { "path": "/lobster/sensitive-words", "title": "Sensitive words", "probe": "sensitiveWords", "required": true, "passed": true, "status": "OK", "message": "words=151" }, { "path": "/lobster/forbidden-words", "title": "Forbidden words", "probe": "forbiddenWords", "required": false, "passed": true, "status": "OK", "message": "forbidden=32" }, { "path": "/lobster/typo-words", "title": "Typo words", "probe": "typoWords", "required": false, "passed": true, "status": "OK", "message": "typo=3" }, { "path": "/lobster/conversation-summary", "title": "Conversation summary", "probe": "conversationSummary", "required": true, "passed": true, "status": "OK", "message": "summaries=20" }, { "path": "/lobster/profile-config", "title": "Profile config", "probe": "profileConfig", "required": false, "passed": true, "status": "OK", "message": "profile fields=22" }, { "path": "/lobster/channel-config", "title": "Channel config", "probe": "channelTypes", "required": true, "passed": true, "status": "OK", "message": "channels=14" }, { "path": "/lobster/channel-plugin", "title": "Channel plugins", "probe": "channelPlugins", "required": true, "passed": true, "status": "OK", "message": "plugins=3" }, { "path": "/lobster/api-registry", "title": "API registry", "probe": "apiRegistry", "required": true, "passed": true, "status": "OK", "message": "apis=0" }, { "path": "/lobster/sales-corpus", "title": "Sales corpus", "probe": "salesCorpus", "required": false, "passed": false, "status": "WARN", "message": "\r\n### Error querying database. Cause: java.sql.SQLSyntaxErrorException: Unknown column \u0027corpus_kind\u0027 in \u0027where clause\u0027\r\n### The error may exist in URL [jar:file:/D:/ylrz_saas_new/java/fs-saas-company/target/fs-saas-company.jar!/BOOT-INF/lib/fs-service-1.1.0.jar!/mapper/company/LobsterSalesCorpusMapper.xml]\r\n### The error may involve defaultParameterMap\r\n### The error occurred while setting parameters\r\n### SQL: select count(*) from lobster_sales_corpus where company_id = ? and (corpus_kind is null or corpus_kind = \u0027\u0027 or corpus_kind = \u0027sales_champion\u0027)\r\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \u0027corpus_kind\u0027 in \u0027where clause\u0027\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column \u0027corpus_kind\u0027 in \u0027where clause\u0027" }, { "path": "/lobster/chat-aggregate", "title": "Chat aggregate", "probe": "chatAggregate", "required": false, "passed": true, "status": "OK", "message": "sessions=5" }, { "path": "/lobster/industry-bootstrap", "title": "Industry bootstrap", "probe": "industryPacks", "required": true, "passed": true, "status": "OK", "message": "packs=3" }, { "path": "/lobster/identity-config", "title": "External role config", "probe": "identityConfig", "required": false, "passed": true, "status": "OK", "message": "identity config loaded" }, { "path": "/lobster/semantic-keywords", "title": "Semantic keywords", "probe": "semanticKeywords", "required": true, "passed": true, "status": "OK", "message": "keywords=0" }, { "path": "/lobster/optimization", "title": "AI optimization audit", "probe": "optimization", "required": true, "passed": true, "status": "OK", "message": "optimization stats=5" }, { "path": "/lobster/dynamic-impl", "title": "Dynamic node approval", "probe": "dynamicImpl", "required": true, "passed": true, "status": "OK", "message": "pending impls=0" }, { "path": "/lobster/dashboard", "title": "Engine dashboard", "probe": "dashboard", "required": true, "passed": true, "status": "OK", "message": "dashboard keys=8" }, { "path": "/lobster/token-stats", "title": "Token stats", "probe": "tokenStats", "required": false, "passed": true, "status": "OK", "message": "token summary loaded" }, { "path": "/lobster/evolution", "title": "Evolution engine", "probe": "evolution", "required": true, "passed": true, "status": "OK", "message": "evolution metrics=6" }, { "path": "/lobster/chat-test", "title": "Chat test", "probe": "chatTest", "required": false, "passed": true, "status": "OK", "message": "e2e test service ready" }, { "path": "/lobster/ab-test", "title": "AB / GEPA optimization", "probe": "abTest", "required": false, "passed": true, "status": "OK", "message": "active ab tests=0" }, { "path": "/lobster/profile", "title": "Customer profile hub", "probe": "userProfile", "required": false, "passed": true, "status": "OK", "message": "profiles=63, domain=true" }, { "path": "/lobster/profile-domain", "title": "Unified profile domain", "probe": "profileDomain", "required": false, "passed": true, "status": "OK", "message": "profile domain ready, mode=async" }, { "path": "/lobster/qdrant", "title": "Vector knowledge base", "probe": "qdrant", "required": false, "passed": true, "status": "OK", "message": "vectors=0" }, { "path": "/lobster/global-stats", "title": "Global evolution stats", "probe": "globalStats", "required": false, "passed": true, "status": "OK", "message": "global metrics=6" }, { "path": "/lobster/event-audit", "title": "Event node audit", "probe": "eventAudit", "required": false, "passed": true, "status": "OK", "message": "audits=0" } ] }, "travelFullChain": { "passed": true, "skipped": true, "message": "includeTravelChain=false" }, "profileDomain": { "basic": { "enabled": true, "projectionMode": "async", "searchMode": "db", "esEnabled": false, "mqConsumerEnabled": true, "missingBeans": [ ], "beansOk": true, "simulationMode": "basic", "runtime": { "unifiedSearchTotal": 44, "unifiedSearchMode": "db", "searchTotal": 44, "searchMode": "db", "identityCount": 44, "orderStatsSample": 0, "qwContactSample": 0 }, "passed": true, "message": "profile domain ready" }, "fullSimulation": { "enabled": true, "projectionMode": "async", "searchMode": "db", "esEnabled": false, "mqConsumerEnabled": true, "missingBeans": [ ], "beansOk": true, "simulationMode": "full", "runtime": { "unifiedSearchTotal": 44, "unifiedSearchMode": "db", "searchTotal": 44, "searchMode": "db", "identityCount": 44, "orderStatsSample": 0, "qwContactSample": 0 }, "simulation": { "patchAdapter": true, "writePath": { "published": true, "readBack": true }, "backfillLegacy": { "type": "legacy", "page": 1, "size": 5, "processed": 5, "published": 5 }, "backfillOrders": { "type": "order", "page": 1, "size": 5, "processed": 0, "published": 0 }, "backfillQwContacts": { "type": "qw_contact", "page": 1, "size": 5, "processed": 0, "published": 0 } }, "passed": true, "message": "profile domain ready" }, "sourceHooks": { "companyId": 338, "simulationMode": "source-hooks", "sources": [ { "source": "wx_call", "eventCount": 1, "eventOk": true, "shardId": 18, "profileKey": "__val_src_wx_call__", "channelType": "WX", "sourceVersion": "val:wx_call:1782614850539", "readBack": true, "passed": true }, { "source": "qw_voice", "eventCount": 1, "eventOk": true, "shardId": 3, "profileKey": "__val_src_qw_voice__", "channelType": "QW", "sourceVersion": "val:qw_voice:1782614850539", "readBack": true, "passed": true }, { "source": "lobster_chat", "eventCount": 1, "eventOk": true, "shardId": 3, "profileKey": "__val_src_lobster_chat__", "channelType": "QW", "sourceVersion": "val:lobster_chat:1782614850539", "readBack": true, "passed": true }, { "source": "crm_analyze", "eventCount": 1, "eventOk": true, "shardId": 18, "profileKey": "__val_src_crm_analyze__", "channelType": "QW", "sourceVersion": "val:crm_analyze:1782614850539", "readBack": true, "passed": true }, { "source": "qw_ai_analyze", "eventCount": 1, "eventOk": true, "shardId": 11, "profileKey": "__val_src_qw_ai_analyze__", "channelType": "QW", "sourceVersion": "val:qw_ai_analyze:1782614850539", "readBack": true, "passed": true }, { "source": "qw_contact", "eventCount": 1, "eventOk": true, "shardId": 14, "profileKey": "__val_src_qw_contact__", "channelType": "QW", "sourceVersion": "val:qw_contact:1782614850539", "readBack": true, "passed": true }, { "source": "qw_tag", "eventCount": 1, "eventOk": true, "shardId": 27, "profileKey": "__val_src_qw_tag__", "channelType": "QW", "sourceVersion": "val:qw_tag:1782614850539", "readBack": true, "passed": true }, { "source": "order", "eventCount": 1, "eventOk": true, "shardId": 29, "profileKey": "__val_src_order__", "channelType": "QW", "sourceVersion": "val:order:1782614850539", "readBack": true, "passed": true }, { "source": "course_watch", "eventCount": 1, "eventOk": true, "shardId": 20, "profileKey": "__val_src_course_watch__", "channelType": "QW", "sourceVersion": "val:course_watch:1782614850539", "readBack": true, "passed": true }, { "source": "live_watch", "variant": "meta", "eventCount": 1, "eventOk": true, "shardId": 15, "profileKey": "__val_src_live_watch__", "channelType": "QW", "sourceVersion": "val:live:1782614850539:meta", "readBack": true, "passed": true }, { "source": "live_watch", "variant": "counter", "eventCount": 1, "eventOk": true, "shardId": 15, "profileKey": "__val_src_live_watch__", "channelType": "QW", "sourceVersion": "val:live:1782614850539:cnt:1", "readBack": true, "passed": true }, { "source": "sop", "eventCount": 1, "eventOk": true, "shardId": 20, "profileKey": "__val_src_sop__", "channelType": "QW", "sourceVersion": "val:sop:1782614850539", "readBack": true, "passed": true } ], "passedCount": 12, "totalCount": 12, "passed": true, "message": "all source hooks simulated and verified" }, "passed": true, "message": "profile domain all validations passed" }, "semanticFull": { "companyId": 338, "sections": { "semanticKeywordContext": { "passed": false, "caseCount": 8, "message": "soft_refusal_first expected L2 without exclude; soft_refusal_second expected L4 exclude on 2nd hit; negation_soft_refusal should not trigger soft refusal" }, "catalogValidation": { "companyId": 338, "categories": { "custom_keywords": { "keywordCount": 129, "totalCases": 258, "passedCases": 258, "passed": true, "failures": [ ], "failureSampleCount": 0, "message": "all 258 checks passed for 129 words" }, "positive_custom": { "keywordCount": 107, "totalCases": 214, "passedCases": 214, "passed": true, "failures": [ ], "failureSampleCount": 0, "message": "all 214 checks passed for 107 words" }, "negative_custom": { "keywordCount": 108, "totalCases": 216, "passedCases": 216, "passed": true, "failures": [ ], "failureSampleCount": 0, "message": "all 216 checks passed for 108 words" }, "soft_refusal": { "keywordCount": 56, "totalCases": 168, "passedCases": 112, "passed": false, "failures": [ "soft_refusal:下个月 L2 first", "soft_refusal:以后再说 L2 first", "soft_refusal:暂时不需要 L2 first", "soft_refusal:过段时间 L2 first", "soft_refusal:下次吧 L2 first", "soft_refusal:改天 L2 first", "soft_refusal:回头再说 L2 first", "soft_refusal:再看看 L2 first", "soft_refusal:再考虑 L2 first", "soft_refusal:考虑考虑 L2 first", "soft_refusal:商量一下 L2 first", "soft_refusal:问问家人 L2 first", "soft_refusal:问问朋友 L2 first", "soft_refusal:问问领导 L2 first", "soft_refusal:汇报一下 L2 first", "soft_refusal:审批一下 L2 first", "soft_refusal:走流程 L2 first", "soft_refusal:需要审批 L2 first", "soft_refusal:需要汇报 L2 first", "soft_refusal:需要请示 L2 first", "soft_refusal:需要讨论 L2 first", "soft_refusal:开会研究 L2 first", "soft_refusal:现在不方便 L2 first", "soft_refusal:在忙 L2 first", "soft_refusal:在开会 L2 first", "soft_refusal:在开车 L2 first", "soft_refusal:稍后再说 L2 first", "soft_refusal:晚点再说 L2 first", "soft_refusal:有空再说 L2 first", "soft_refusal:等一下 L2 first", "soft_refusal:等会儿 L2 first", "soft_refusal:待定 L2 first", "soft_refusal:再议 L2 first", "soft_refusal:看看再说 L2 first", "soft_refusal:想想再说 L2 first", "soft_refusal:再想想 L2 first", "soft_refusal:暂时算了 L2 first", "soft_refusal:先这样 L2 first", "soft_refusal:以后再聊 L2 first", "soft_refusal:以后再联系 L2 first" ], "failureSampleCount": 56, "message": "56 failed of 168" }, "handoff_trigger": { "keywordCount": 78, "totalCases": 390, "passedCases": 390, "passed": true, "failures": [ ], "failureSampleCount": 0, "message": "all 390 checks passed for 78 words" }, "sarcasm": { "keywordCount": 61, "totalCases": 122, "passedCases": 122, "passed": true, "failures": [ ], "failureSampleCount": 0, "message": "all 122 checks passed for 61 words" }, "_combos": { "totalCases": 6, "passedCases": 5, "passed": false, "failures": [ "combo:soft_refusal 下个月,需要汇报,暂时算了" ], "message": "combo:soft_refusal 下个月,需要汇报,暂时算了" } }, "categoryCount": 6, "totalCases": 1374, "passedCases": 1317, "failedCases": 57, "failures": [ "soft_refusal:下个月 L2 first", "soft_refusal:以后再说 L2 first", "soft_refusal:暂时不需要 L2 first", "soft_refusal:过段时间 L2 first", "soft_refusal:下次吧 L2 first", "soft_refusal:改天 L2 first", "soft_refusal:回头再说 L2 first", "soft_refusal:再看看 L2 first", "soft_refusal:再考虑 L2 first", "soft_refusal:考虑考虑 L2 first", "soft_refusal:商量一下 L2 first", "soft_refusal:问问家人 L2 first", "soft_refusal:问问朋友 L2 first", "soft_refusal:问问领导 L2 first", "soft_refusal:汇报一下 L2 first", "soft_refusal:审批一下 L2 first", "soft_refusal:走流程 L2 first", "soft_refusal:需要审批 L2 first", "soft_refusal:需要汇报 L2 first", "soft_refusal:需要请示 L2 first", "soft_refusal:需要讨论 L2 first", "soft_refusal:开会研究 L2 first", "soft_refusal:现在不方便 L2 first", "soft_refusal:在忙 L2 first", "soft_refusal:在开会 L2 first", "soft_refusal:在开车 L2 first", "soft_refusal:稍后再说 L2 first", "soft_refusal:晚点再说 L2 first", "soft_refusal:有空再说 L2 first", "soft_refusal:等一下 L2 first", "soft_refusal:等会儿 L2 first", "soft_refusal:待定 L2 first", "soft_refusal:再议 L2 first", "soft_refusal:看看再说 L2 first", "soft_refusal:想想再说 L2 first", "soft_refusal:再想想 L2 first", "soft_refusal:暂时算了 L2 first", "soft_refusal:先这样 L2 first", "soft_refusal:以后再聊 L2 first", "soft_refusal:以后再联系 L2 first" ], "failureTruncated": true, "passed": false, "durationMs": 125130, "message": "41 failure(s), showing up to 40" } }, "contextCases": [ { "id": "soft_refusal_first", "input": "下个月再说 (empty ctx)", "expected": "L2 pause, not exclude", "actual": "null exclude=false reason=null", "passed": false }, { "id": "soft_refusal_second", "input": "下个月再说 (_softRefusalCount=1)", "expected": "L4 exclude (repeated)", "actual": "null exclude=false reason=null", "passed": false }, { "id": "handoff_first_neutral", "input": "了解一下人工 -\u003e keyword 人工 (neutral)", "expected": "no transfer, count=1", "actual": "takeover=false count=1 reason=Handoff trigger noted (session 1, awaiting confirmation): 人工", "passed": true }, { "id": "handoff_second_confirm", "input": "转人工 (_handoffTriggerCount=1)", "expected": "transfer on 2nd hit", "actual": "takeover=true reason=Handoff trigger (session escalated x2): 人工", "passed": true }, { "id": "negation_handoff", "input": "不转人工", "expected": "no handoff", "actual": "takeover=false", "passed": true }, { "id": "negation_soft_refusal", "input": "别下个月", "expected": "no soft refusal", "actual": "L4_EXCLUDE reason=negative_intent", "passed": false }, { "id": "positive_sentiment_soft", "input": "很满意,价格多少 (positive ctx)", "expected": "no soft refusal", "actual": "null exclude=false", "passed": true }, { "id": "positive_sentiment_handoff", "input": "很满意,价格多少 (positive ctx, no handoff keyword)", "expected": "no handoff misfire", "actual": "takeover=false reason=客户表达了满意的态度,诉求是询问价格,属于常规的咨询类问题,无需专业/专项帮助", "passed": true } ], "failures": [ "soft_refusal_first expected L2 without exclude", "soft_refusal_second expected L4 exclude on 2nd hit", "negation_soft_refusal should not trigger soft refusal", "catalog: 41 failure(s), showing up to 40" ], "passed": false, "durationMs": 137472, "totalCases": 1382, "passedCases": 1322, "message": "soft_refusal_first expected L2 without exclude; soft_refusal_second expected L4 exclude on 2nd hit; negation_soft_refusal should not trigger soft refusal; catalog: 41 failure(s), showing up to 40", "catalogFailureSamples": [ "soft_refusal:下个月 L2 first", "soft_refusal:以后再说 L2 first", "soft_refusal:暂时不需要 L2 first", "soft_refusal:过段时间 L2 first", "soft_refusal:下次吧 L2 first", "soft_refusal:改天 L2 first", "soft_refusal:回头再说 L2 first", "soft_refusal:再看看 L2 first", "soft_refusal:再考虑 L2 first", "soft_refusal:考虑考虑 L2 first", "soft_refusal:商量一下 L2 first", "soft_refusal:问问家人 L2 first", "soft_refusal:问问朋友 L2 first", "soft_refusal:问问领导 L2 first", "soft_refusal:汇报一下 L2 first", "soft_refusal:审批一下 L2 first", "soft_refusal:走流程 L2 first", "soft_refusal:需要审批 L2 first", "soft_refusal:需要汇报 L2 first", "soft_refusal:需要请示 L2 first", "soft_refusal:需要讨论 L2 first", "soft_refusal:开会研究 L2 first", "soft_refusal:现在不方便 L2 first", "soft_refusal:在忙 L2 first", "soft_refusal:在开会 L2 first", "soft_refusal:在开车 L2 first", "soft_refusal:稍后再说 L2 first", "soft_refusal:晚点再说 L2 first", "soft_refusal:有空再说 L2 first", "soft_refusal:等一下 L2 first", "soft_refusal:等会儿 L2 first", "soft_refusal:待定 L2 first", "soft_refusal:再议 L2 first", "soft_refusal:看看再说 L2 first", "soft_refusal:想想再说 L2 first", "soft_refusal:再想想 L2 first", "soft_refusal:暂时算了 L2 first", "soft_refusal:先这样 L2 first", "soft_refusal:以后再聊 L2 first", "soft_refusal:以后再联系 L2 first" ] } }, "integrationWarning": "2/4 tests passed in 72873ms", "failures": [ "semanticFull: soft_refusal_first expected L2 without exclude" ], "passed": false, "durationMs": 219308, "pageCount": 29, "requiredPagesPassed": "15/15" }