{ "companyId": 338, "includeTravelChain": true, "includeTravelStress": true, "startedAt": "2026-06-23 08:37:46", "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 2027ms", "details": [ "[FAIL] NodeTypeService: START node not found", "[FAIL] DynamicNodeExecutor: Judgment node execution failed", "[PASS] MultiModelWorkflowGenerator: All tests passed", "[PASS] ModelConfigService: All tests passed" ], "executionTimeMs": 2027, "message": "2/4 tests passed in 2027ms" }, "phase2Replay": { "passed": true, "verify": { "companyId": 338, "archiveTableExists": true, "hotIndexExists": true, "hotReplayRows": 80, "eventLogRows": 80, "archiveRows": 0, "status": "ok" }, "message": "phase2 replay verify ok" }, "pageLinkProbes": { "totalPages": 29, "requiredTotal": 15, "requiredPassed": 15, "optionalSkipped": 0, "failures": [ ], "passed": true, "durationMs": 3839, "pages": [ { "path": "/lobster/company-workflowLobster", "title": "Workflow templates", "probe": "templateList", "required": true, "passed": true, "status": "OK", "message": "templates=45" }, { "path": "/lobster/workflow-execution", "title": "Workflow execution tasks", "probe": "instanceList", "required": true, "passed": true, "status": "OK", "message": "instances=593" }, { "path": "/lobster/instance", "title": "Instance monitor", "probe": "instanceMonitor", "required": true, "passed": true, "status": "OK", "message": "monitor list ok, count=593" }, { "path": "/lobster/prompt", "title": "Prompt management", "probe": "promptList", "required": true, "passed": true, "status": "OK", "message": "prompt rows=50" }, { "path": "/lobster/sensitive-words", "title": "Sensitive words", "probe": "sensitiveWords", "required": true, "passed": true, "status": "OK", "message": "words=147" }, { "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=19" }, { "path": "/lobster/profile-config", "title": "Profile config", "probe": "profileConfig", "required": false, "passed": true, "status": "OK", "message": "profile fields=16" }, { "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 \u0027optimized_answer\u0027 in \u0027field list\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 id, dialog_text, customer_question, sales_answer, optimized_answer, ai_feedback, scenario, score, source_type, external_user_id, company_id, task_id, salesperson_name, tags, status, quality_status, kb_written, enabled, create_by, create_time, update_by, update_time from lobster_sales_corpus where company_id = ? order by create_time desc limit ? offset ?\r\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \u0027optimized_answer\u0027 in \u0027field list\u0027\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column \u0027optimized_answer\u0027 in \u0027field list\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=28" }, { "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": false, "status": "WARN", "message": "\r\n### Error querying database. Cause: java.sql.SQLSyntaxErrorException: Table \u0027ylrz_saas.lobster_token_consumption\u0027 doesn\u0027t exist\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/LobsterTokenConsumptionMapper.xml]\r\n### The error may involve defaultParameterMap\r\n### The error occurred while setting parameters\r\n### SQL: SELECT DATE(request_time) AS date, SUM(token_count) AS totalTokens, SUM(estimated_cost) AS totalCost, COUNT(1) AS requestCount FROM lobster_token_consumption WHERE company_id = ? AND request_time BETWEEN ? AND ? GROUP BY DATE(request_time) ORDER BY date DESC\r\n### Cause: java.sql.SQLSyntaxErrorException: Table \u0027ylrz_saas.lobster_token_consumption\u0027 doesn\u0027t exist\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Table \u0027ylrz_saas.lobster_token_consumption\u0027 doesn\u0027t exist" }, { "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=27, 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": false, "message": "\r\n### Error querying database. Cause: java.sql.SQLSyntaxErrorException: Table \u0027ylrz_saas.company_lobster_tag_user_rel\u0027 doesn\u0027t exist\r\n### The error may exist in com/fs/company/mapper/CompanyLobsterTagUserRelMapper.java (best guess)\r\n### The error may involve defaultParameterMap\r\n### The error occurred while setting parameters\r\n### SQL: SELECT id,company_id,binding_id,tag_code,template_id,channel_type,channel_contact_id,channel_user_id,channel_context_json,external_contact_id,corp_id,company_user_id,qw_user_id,del_flag,create_by,create_time,update_by,update_time FROM company_lobster_tag_user_rel WHERE company_id = ? AND del_flag = ? AND channel_type = ? AND ( channel_contact_id = ? OR external_contact_id = ? ) LIMIT 1\r\n### Cause: java.sql.SQLSyntaxErrorException: Table \u0027ylrz_saas.company_lobster_tag_user_rel\u0027 doesn\u0027t exist\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Table \u0027ylrz_saas.company_lobster_tag_user_rel\u0027 doesn\u0027t exist" }, "profileDomain": { "basic": { "enabled": true, "projectionMode": "async", "searchMode": "db", "esEnabled": false, "mqConsumerEnabled": true, "missingBeans": [ ], "beansOk": true, "simulationMode": "basic", "runtime": { "unifiedSearchTotal": 38, "unifiedSearchMode": "db", "searchTotal": 38, "searchMode": "db", "identityCount": 38, "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": 38, "unifiedSearchMode": "db", "searchTotal": 38, "searchMode": "db", "identityCount": 38, "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:1782175432829", "readBack": true, "passed": true }, { "source": "qw_voice", "eventCount": 1, "eventOk": true, "shardId": 3, "profileKey": "__val_src_qw_voice__", "channelType": "QW", "sourceVersion": "val:qw_voice:1782175432829", "readBack": true, "passed": true }, { "source": "lobster_chat", "eventCount": 1, "eventOk": true, "shardId": 3, "profileKey": "__val_src_lobster_chat__", "channelType": "QW", "sourceVersion": "val:lobster_chat:1782175432829", "readBack": true, "passed": true }, { "source": "crm_analyze", "eventCount": 1, "eventOk": true, "shardId": 18, "profileKey": "__val_src_crm_analyze__", "channelType": "QW", "sourceVersion": "val:crm_analyze:1782175432829", "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:1782175432829", "readBack": true, "passed": true }, { "source": "qw_contact", "eventCount": 1, "eventOk": true, "shardId": 14, "profileKey": "__val_src_qw_contact__", "channelType": "QW", "sourceVersion": "val:qw_contact:1782175432829", "readBack": true, "passed": true }, { "source": "qw_tag", "eventCount": 1, "eventOk": true, "shardId": 27, "profileKey": "__val_src_qw_tag__", "channelType": "QW", "sourceVersion": "val:qw_tag:1782175432829", "readBack": true, "passed": true }, { "source": "order", "eventCount": 1, "eventOk": true, "shardId": 29, "profileKey": "__val_src_order__", "channelType": "QW", "sourceVersion": "val:order:1782175432829", "readBack": true, "passed": true }, { "source": "course_watch", "eventCount": 1, "eventOk": true, "shardId": 20, "profileKey": "__val_src_course_watch__", "channelType": "QW", "sourceVersion": "val:course_watch:1782175432829", "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:1782175432829: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:1782175432829:cnt:1", "readBack": true, "passed": true }, { "source": "sop", "eventCount": 1, "eventOk": true, "shardId": 20, "profileKey": "__val_src_sop__", "channelType": "QW", "sourceVersion": "val:sop:1782175432829", "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": 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": 168, "passed": true, "failures": [ ], "failureSampleCount": 0, "message": "all 168 checks passed for 56 words" }, "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": 6, "passed": true, "failures": [ ], "message": "combo checks ok" } }, "categoryCount": 6, "totalCases": 1374, "passedCases": 1374, "failedCases": 0, "failures": [ ], "failureTruncated": false, "passed": true, "durationMs": 97469, "message": "catalog validation passed (1374 cases across 6 categories)" } }, "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=客户情绪正面(满意度0.7),询问价格属于常规购买流程问题,无复杂、紧急或敏感内容,无需转接专业支持。", "passed": true } ], "failures": [ ], "passed": true, "durationMs": 102677, "totalCases": 1382, "passedCases": 1382, "message": "semantic keyword full validation passed" } }, "integrationWarning": "2/4 tests passed in 2027ms", "failures": [ "travelFullChain: \r\n### Error querying database. Cause: java.sql.SQLSyntaxErrorException: Table \u0027ylrz_saas.company_lobster_tag_user_rel\u0027 doesn\u0027t exist\r\n### The error may exist in com/fs/company/mapper/CompanyLobsterTagUserRelMapper.java (best guess)\r\n### The error may involve defaultParameterMap\r\n### The error occurred while setting parameters\r\n### SQL: SELECT id,company_id,binding_id,tag_code,template_id,channel_type,channel_contact_id,channel_user_id,channel_context_json,external_contact_id,corp_id,company_user_id,qw_user_id,del_flag,create_by,create_time,update_by,update_time FROM company_lobster_tag_user_rel WHERE company_id = ? AND del_flag = ? AND channel_type = ? AND ( channel_contact_id = ? OR external_contact_id = ? ) LIMIT 1\r\n### Cause: java.sql.SQLSyntaxErrorException: Table \u0027ylrz_saas.company_lobster_tag_user_rel\u0027 doesn\u0027t exist\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Table \u0027ylrz_saas.company_lobster_tag_user_rel\u0027 doesn\u0027t exist" ], "passed": false, "durationMs": 471480, "pageCount": 29, "requiredPagesPassed": "15/15" }