| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723 |
- {
- "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"
- }
|