{ "companyId": 338, "includeTravelChain": false, "includeTravelStress": false, "startedAt": "2026-07-01 13:16:01", "sections": { "engineHealth": { "passed": true, "health": { "companyId": 338, "healthy": true, "missingCore": [ ], "missingOptional": [ ], "passThreshold": 120 }, "message": "core beans wired" }, "integrationTests": { "passed": true, "summary": "4/4 tests passed in 91635ms", "details": [ "[PASS] NodeTypeService: All tests passed", "[PASS] DynamicNodeExecutor: All tests passed", "[PASS] MultiModelWorkflowGenerator: All tests passed", "[PASS] ModelConfigService: All tests passed" ], "executionTimeMs": 91635, "message": "4/4 tests passed in 91635ms" }, "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": 3020, "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=649" }, { "path": "/lobster/instance", "title": "Instance monitor", "probe": "instanceMonitor", "required": true, "passed": true, "status": "OK", "message": "monitor list ok, count=649" }, { "path": "/lobster/prompt", "title": "Prompt management", "probe": "promptList", "required": true, "passed": true, "status": "OK", "message": "prompt rows=70" }, { "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=0" }, { "path": "/lobster/profile-config", "title": "Profile config", "probe": "profileConfig", "required": false, "passed": true, "status": "OK", "message": "profile fields=43" }, { "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=0" }, { "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=65, 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": 47, "unifiedSearchMode": "db", "searchTotal": 47, "searchMode": "db", "identityCount": 47, "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": 47, "unifiedSearchMode": "db", "searchTotal": 47, "searchMode": "db", "identityCount": 47, "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 }, "backfillWxClients": { "type": "wx_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:1782883057485", "readBack": true, "passed": true }, { "source": "qw_voice", "eventCount": 1, "eventOk": true, "shardId": 3, "profileKey": "__val_src_qw_voice__", "channelType": "QW", "sourceVersion": "val:qw_voice:1782883057485", "readBack": true, "passed": true }, { "source": "lobster_chat", "eventCount": 1, "eventOk": true, "shardId": 3, "profileKey": "__val_src_lobster_chat__", "channelType": "QW", "sourceVersion": "val:lobster_chat:1782883057485", "readBack": true, "passed": true }, { "source": "crm_analyze", "eventCount": 1, "eventOk": true, "shardId": 18, "profileKey": "__val_src_crm_analyze__", "channelType": "QW", "sourceVersion": "val:crm_analyze:1782883057485", "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:1782883057485", "readBack": true, "passed": true }, { "source": "qw_contact", "eventCount": 1, "eventOk": true, "shardId": 14, "profileKey": "__val_src_qw_contact__", "channelType": "QW", "sourceVersion": "val:qw_contact:1782883057485", "readBack": true, "passed": true }, { "source": "qw_tag", "eventCount": 1, "eventOk": true, "shardId": 27, "profileKey": "__val_src_qw_tag__", "channelType": "QW", "sourceVersion": "val:qw_tag:1782883057485", "readBack": true, "passed": true }, { "source": "order", "eventCount": 1, "eventOk": true, "shardId": 29, "profileKey": "__val_src_order__", "channelType": "QW", "sourceVersion": "val:order:1782883057485", "readBack": true, "passed": true }, { "source": "course_watch", "eventCount": 1, "eventOk": true, "shardId": 20, "profileKey": "__val_src_course_watch__", "channelType": "QW", "sourceVersion": "val:course_watch:1782883057485", "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:1782883057485: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:1782883057485:cnt:1", "readBack": true, "passed": true }, { "source": "sop", "eventCount": 1, "eventOk": true, "shardId": 20, "profileKey": "__val_src_sop__", "channelType": "QW", "sourceVersion": "val:sop:1782883057485", "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": true, "caseCount": 8, "message": "all semantic context cases passed" }, "catalogValidation": { "companyId": 338, "categories": { "custom_keywords": { "keywordCount": 116, "totalCases": 232, "passedCases": 232, "passed": true, "failures": [ ], "failureSampleCount": 0, "message": "all 232 checks passed for 116 words" }, "positive_custom": { "keywordCount": 90, "totalCases": 180, "passedCases": 180, "passed": true, "failures": [ ], "failureSampleCount": 0, "message": "all 180 checks passed for 90 words" }, "negative_custom": { "keywordCount": 79, "totalCases": 158, "passedCases": 158, "passed": true, "failures": [ ], "failureSampleCount": 0, "message": "all 158 checks passed for 79 words" }, "soft_refusal": { "keywordCount": 59, "totalCases": 177, "passedCases": 137, "passed": false, "failures": [ "soft_refusal:下个月 positive-block", "soft_refusal:以后再说 positive-block", "soft_refusal:暂时不需要 positive-block", "soft_refusal:过段时间 positive-block", "soft_refusal:下次吧 positive-block", "soft_refusal:改天 positive-block", "soft_refusal:回头再说 positive-block", "soft_refusal:再看看 positive-block", "soft_refusal:再考虑 positive-block", "soft_refusal:考虑考虑 positive-block", "soft_refusal:问问家人 positive-block", "soft_refusal:问问朋友 positive-block", "soft_refusal:需要审批 positive-block", "soft_refusal:现在不方便 positive-block", "soft_refusal:在开车 positive-block", "soft_refusal:稍后再说 positive-block", "soft_refusal:晚点再说 positive-block", "soft_refusal:有空再说 positive-block", "soft_refusal:待定 positive-block", "soft_refusal:再议 positive-block", "soft_refusal:看看再说 positive-block", "soft_refusal:想想再说 positive-block", "soft_refusal:再想想 positive-block", "soft_refusal:暂时算了 positive-block", "soft_refusal:先这样 positive-block", "soft_refusal:以后再聊 positive-block", "soft_refusal:以后再联系 positive-block", "soft_refusal:以后需要再说 positive-block", "soft_refusal:目前不需要 positive-block", "soft_refusal:近期不需要 positive-block", "soft_refusal:这段时间不需要 positive-block", "soft_refusal:先商量 positive-block", "soft_refusal:先考虑 positive-block", "soft_refusal:先观望 positive-block", "soft_refusal:等等再说 positive-block", "soft_refusal:看看效果再说 positive-block", "soft_refusal:看看评价再说 positive-block", "soft_refusal:最近没空 positive-block", "soft_refusal:暂时搁置 positive-block", "soft_refusal:回头再聊 positive-block" ], "failureSampleCount": 40, "message": "40 failed of 177" }, "handoff_trigger": { "keywordCount": 81, "totalCases": 405, "passedCases": 405, "passed": true, "failures": [ ], "failureSampleCount": 0, "message": "all 405 checks passed for 81 words" }, "sarcasm": { "keywordCount": 65, "totalCases": 130, "passedCases": 130, "passed": true, "failures": [ ], "failureSampleCount": 0, "message": "all 130 checks passed for 65 words" }, "_combos": { "totalCases": 6, "passedCases": 6, "passed": true, "failures": [ ], "message": "combo checks ok" } }, "categoryCount": 6, "totalCases": 1288, "passedCases": 1248, "failedCases": 40, "failures": [ "soft_refusal:下个月 positive-block", "soft_refusal:以后再说 positive-block", "soft_refusal:暂时不需要 positive-block", "soft_refusal:过段时间 positive-block", "soft_refusal:下次吧 positive-block", "soft_refusal:改天 positive-block", "soft_refusal:回头再说 positive-block", "soft_refusal:再看看 positive-block", "soft_refusal:再考虑 positive-block", "soft_refusal:考虑考虑 positive-block", "soft_refusal:问问家人 positive-block", "soft_refusal:问问朋友 positive-block", "soft_refusal:需要审批 positive-block", "soft_refusal:现在不方便 positive-block", "soft_refusal:在开车 positive-block", "soft_refusal:稍后再说 positive-block", "soft_refusal:晚点再说 positive-block", "soft_refusal:有空再说 positive-block", "soft_refusal:待定 positive-block", "soft_refusal:再议 positive-block", "soft_refusal:看看再说 positive-block", "soft_refusal:想想再说 positive-block", "soft_refusal:再想想 positive-block", "soft_refusal:暂时算了 positive-block", "soft_refusal:先这样 positive-block", "soft_refusal:以后再聊 positive-block", "soft_refusal:以后再联系 positive-block", "soft_refusal:以后需要再说 positive-block", "soft_refusal:目前不需要 positive-block", "soft_refusal:近期不需要 positive-block", "soft_refusal:这段时间不需要 positive-block", "soft_refusal:先商量 positive-block", "soft_refusal:先考虑 positive-block", "soft_refusal:先观望 positive-block", "soft_refusal:等等再说 positive-block", "soft_refusal:看看效果再说 positive-block", "soft_refusal:看看评价再说 positive-block", "soft_refusal:最近没空 positive-block", "soft_refusal:暂时搁置 positive-block", "soft_refusal:回头再聊 positive-block" ], "failureTruncated": false, "passed": false, "durationMs": 169969, "message": "40 failure(s), showing up to 40" }, "replaceWord": { "layers": { "forbiddenReplace": { "raw": "这个产品稳赚不赔,绝对保本", "replaced": "这个产品有较好表现,相对稳健。", "passed": true }, "typoReplace": { "raw": "您好,LOBSTER_TYPO_338咨询", "replaced": "您好,LOBSTER_TYPO_338咨询。", "passed": false }, "compliancePipeline": { "out": "这个产品***,相对稳健。", "passed": true } }, "passed": false, "message": "typo replace failed" } }, "contextCases": [ { "id": "soft_refusal_first", "input": "下个月再说 (empty ctx)", "expected": "L2 pause, not exclude", "actual": "L2_SOFT_REFUSAL exclude=false reason=soft_refusal", "passed": true }, { "id": "soft_refusal_second", "input": "下个月再说 (_softRefusalCount=1)", "expected": "L4 exclude (repeated)", "actual": "L4_EXCLUDE exclude=true reason=repeated_soft_refusal", "passed": true }, { "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": "null reason=null", "passed": true }, { "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": [ "catalog: 40 failure(s), showing up to 40", "replaceWord: typo replace failed" ], "passed": false, "durationMs": 189703, "totalCases": 1299, "passedCases": 1256, "message": "catalog: 40 failure(s), showing up to 40; replaceWord: typo replace failed", "catalogFailureSamples": [ "soft_refusal:下个月 positive-block", "soft_refusal:以后再说 positive-block", "soft_refusal:暂时不需要 positive-block", "soft_refusal:过段时间 positive-block", "soft_refusal:下次吧 positive-block", "soft_refusal:改天 positive-block", "soft_refusal:回头再说 positive-block", "soft_refusal:再看看 positive-block", "soft_refusal:再考虑 positive-block", "soft_refusal:考虑考虑 positive-block", "soft_refusal:问问家人 positive-block", "soft_refusal:问问朋友 positive-block", "soft_refusal:需要审批 positive-block", "soft_refusal:现在不方便 positive-block", "soft_refusal:在开车 positive-block", "soft_refusal:稍后再说 positive-block", "soft_refusal:晚点再说 positive-block", "soft_refusal:有空再说 positive-block", "soft_refusal:待定 positive-block", "soft_refusal:再议 positive-block", "soft_refusal:看看再说 positive-block", "soft_refusal:想想再说 positive-block", "soft_refusal:再想想 positive-block", "soft_refusal:暂时算了 positive-block", "soft_refusal:先这样 positive-block", "soft_refusal:以后再聊 positive-block", "soft_refusal:以后再联系 positive-block", "soft_refusal:以后需要再说 positive-block", "soft_refusal:目前不需要 positive-block", "soft_refusal:近期不需要 positive-block", "soft_refusal:这段时间不需要 positive-block", "soft_refusal:先商量 positive-block", "soft_refusal:先考虑 positive-block", "soft_refusal:先观望 positive-block", "soft_refusal:等等再说 positive-block", "soft_refusal:看看效果再说 positive-block", "soft_refusal:看看评价再说 positive-block", "soft_refusal:最近没空 positive-block", "soft_refusal:暂时搁置 positive-block", "soft_refusal:回头再聊 positive-block" ] } }, "failures": [ "semanticFull: catalog: 40 failure(s), showing up to 40" ], "passed": false, "durationMs": 287486, "pageCount": 29, "requiredPagesPassed": "15/15" }