diff --git a/Git提交准备清单.md b/Git提交准备清单.md new file mode 100644 index 00000000..8175c9e4 --- /dev/null +++ b/Git提交准备清单.md @@ -0,0 +1,476 @@ +# Git 提交准备清单 + +> **创建时间:** 2025-11-15 +> **目的:** 整理未被 Git 管理的文件,准备提交到远程仓库 + +--- + +## 📊 未追踪文件统计 + +| 类别 | 数量 | 操作建议 | +|------|------|----------| +| **✅ 应该提交的文件** | ~350 个 | 需要添加 | +| **⚠️ 需要确认的文件** | ~30 个 | 人工判断 | +| **❌ 不应提交的文件** | ~20 个 | 忽略或删除 | + +--- + +## ✅ 第一类:应该提交的文件(高优先级) + +### 1. 配置文件(2 个)⭐ +``` +.editorconfig ← 编辑器统一配置(UTF-8) +.gitattributes ← Git 行尾配置 +``` +**理由**:防止中文乱码,统一团队开发规范 + +### 2. 后端核心代码(~60 个文件)⭐⭐⭐ +``` +backend/src/common/ ← 通用能力层(新架构) +├── document/ExtractionClient.ts +├── llm/adapters/ +│ ├── DeepSeekAdapter.ts +│ ├── QwenAdapter.ts +│ ├── LLMFactory.ts +│ └── types.ts +├── middleware/validateProject.ts +├── rag/DifyClient.ts +└── utils/jsonParser.ts + +backend/src/legacy/ ← 业务代码(新架构) +├── controllers/ (8 个文件) +├── routes/ (7 个文件) +├── services/ (8 个文件) +└── templates/ (1 个文件) +``` +**理由**:Task 19 后端架构重构的核心成果 + +### 3. 前端新架构(frontend-v2,~30 个文件)⭐⭐⭐ +``` +frontend-v2/ ← 新前端架构(React 19) +├── package.json +├── src/framework/ ← 模块注册、权限、路由 +│ ├── modules/ ← 模块注册机制 +│ ├── permission/ ← 权限管理 +│ └── router/ ← 路由守卫 +├── src/modules/ ← 6 个业务模块占位符 +│ ├── aia/ +│ ├── asl/ +│ ├── pkb/ +│ ├── dc/ +│ ├── ssa/ +│ └── st/ +└── src/pages/HomePage.tsx +``` +**理由**:Task 17 前端模块注册机制的成果 + +### 4. 前端扩展功能(~40 个文件)⭐⭐ +``` +frontend/src/api/ +├── batchApi.ts ← 批量处理 API +└── reviewApi.ts ← 稿件审查 API + +frontend/src/components/chat/ +├── BatchMode.tsx ← 批量处理模式 +├── DeepReadMode.tsx ← 深度阅读模式 +├── FullTextMode.tsx ← 全文模式 +├── DocumentSelector.tsx ← 文档选择器 +└── ...(共 20+ 个组件) + +frontend/src/components/review/ +├── EditorialReview.tsx ← 编辑规范评估 +├── MethodologyReview.tsx ← 方法学评估 +└── ScoreCard.tsx + +frontend/src/pages/ +├── ReviewPage.tsx ← 稿件审查页面 +├── ChatPage.backup.tsx ← 备份文件(可删除) +└── ChatPage.new.tsx ← 备份文件(可删除) +``` +**理由**:Phase 2-3 的重要功能扩展 + +### 5. 文档体系(~250 个文件)⭐⭐⭐ +``` +docs/00-系统总体设计/ ← 系统架构文档(12 个文件) +docs/00-项目概述/ ← PRD 和白皮书(6 个文件) +docs/01-平台基础层/ ← 平台层文档(10 个文件) +docs/02-通用能力层/ ← 通用能力文档(9 个文件) +docs/03-业务模块/ ← 业务模块文档(~150 个文件) +├── ASL-AI智能文献/ ← 新增的 ASL 模块文档 ⭐ +│ ├── 01-需求分析/ +│ ├── 02-技术设计/ +│ │ ├── 06-质量保障与可追溯策略.md +│ │ └── 07-文献处理技术选型.md +│ ├── 03-UI设计/ +│ ├── 04-开发计划/ +│ └── 05-测试文档/ +│ └── 03-测试数据/ +│ ├── README.md +│ ├── Test Cases.xlsx +│ └── 测试案例的PICOS、纳入标准、排除标准.txt +docs/04-开发规范/ ← 开发规范(6 个文件) +docs/05-部署文档/ ← 部署文档(2 个文件) +docs/06-测试文档/ +docs/07-运维文档/ ← 运维文档(3 个文件) +docs/08-项目管理/ ← 项目管理文档(14 个文件) +docs/09-架构实施/ ← 架构实施文档(21 个文件) +docs/_templates/ ← 文档模板(5 个文件) +``` +**理由**:完整的文档体系,团队协作必需 + +### 6. 后端配置和脚本(~15 个文件) +``` +backend/CLOSEAI-CONFIG.md +backend/check-api-config.js +backend/database-validation-simple.sql +backend/database-validation.sql +backend/prisma/migrations/20251012124747_add_batch_processing_module/ +backend/prisma/migrations/20251014120128_add_review_tasks/ +backend/prisma/seed.ts +backend/prompts/ +├── review_editorial_system.txt +└── review_methodology_system.txt +backend/update-env-closeai.ps1 +backend/初始化测试用户.bat +backend/测试用户说明.md +``` +**理由**:数据库迁移、配置脚本、提示词模板 + +### 7. 项目根目录文档(~15 个文件) +``` +START-HERE-FOR-AI.md ← AI 上手指南 +PHASE1-测试指南.md +Phase2-UI优化总结.md +Phase2-全文阅读模式-真实实现.md +Phase2-快速测试清单.md +Phase2-测试指南.md +Phase3-快速参考.md +Phase3-最终收尾-测试指南.md +README-Phase2测试.md +README-里程碑1.5完成.md +如何测试Phase2.md +智能引用功能-测试指南.md +检查测试环境.bat +稿件审查功能-最终完成报告.md +测试记录/ +``` +**理由**:阶段性成果总结和测试指南 + +--- + +## ⚠️ 第二类:需要确认的文件 + +### 1. 测试脚本(可选) +``` +backend/test-batch-api.js ← 批量处理测试 +backend/test-review-api.js ← 审查 API 测试 +backend/temp-migration/ ← 临时迁移脚本 +``` +**建议**:如果还需要,可以提交;如果是一次性测试,可以删除 + +### 2. 前端备份文件 +``` +frontend/src/pages/ChatPage.backup.tsx +frontend/src/pages/ChatPage.new.tsx +``` +**建议**:**删除**(已有正式的 `ChatPage.tsx`) + +### 3. Phase 测试文档(根目录) +``` +PHASE1-测试指南.md +Phase2-*.md +Phase3-*.md +README-Phase2测试.md +``` +**建议**:考虑是否移到 `docs/06-测试文档/` 或 `docs/08-项目管理/`,然后提交 + +--- + +## ❌ 第三类:不应提交的文件(应该被忽略) + +### 1. 乱码文件夹(手动删除)❌ +``` +docs/03-涓氬姟妯″潡/ ← 已确认是 "03-业务模块" 的乱码版本 +``` +**操作**:**手动删除**(您已确认) + +### 2. 停止服务脚本(根目录) +``` +stop-all-services.bat ← 重复文件(已有正式版本) +``` +**建议**:检查是否与其他启动脚本重复,如重复则删除 + +--- + +## 🎯 提交策略建议 + +### 方案 A:一次性全部提交(快速但风险较高) + +```bash +# 添加所有应该提交的文件 +git add .editorconfig .gitattributes +git add backend/src/common/ backend/src/legacy/ +git add backend/prisma/migrations/ backend/prisma/seed.ts +git add backend/prompts/ backend/CLOSEAI-CONFIG.md +git add frontend-v2/ +git add frontend/src/api/batchApi.ts frontend/src/api/reviewApi.ts +git add frontend/src/components/chat/ frontend/src/components/review/ +git add frontend/src/pages/ReviewPage.tsx +git add "docs/00-系统总体设计/" "docs/03-业务模块/" +git add START-HERE-FOR-AI.md + +# 一次性提交 +git commit -m "feat: 提交 Week 2 完整成果 + +- ✅ 后端架构重构(legacy + common 分层) +- ✅ 前端模块注册机制(frontend-v2) +- ✅ 批量处理和稿件审查功能 +- ✅ 完整文档体系(250+ 文档) +- ✅ ASL 模块设计文档 +- ✅ 编码规范配置(.editorconfig, .gitattributes) +" +``` + +### 方案 B:分批提交(推荐,更清晰)⭐ + +#### 批次 1:配置文件和编码规范 +```bash +git add .editorconfig .gitattributes +git commit -m "chore: 添加编码规范配置,防止中文乱码" +``` + +#### 批次 2:后端架构重构 +```bash +git add backend/src/common/ backend/src/legacy/ +git add backend/prisma/schema.prisma backend/src/index.ts +git commit -m "refactor(backend): 后端架构增量演进(Task 19) + +- 新增 common/ 通用能力层 +- 新增 legacy/ 业务代码层 +- 更新 index.ts 路由注册 +- 保持系统正常运行" +``` + +#### 批次 3:数据库迁移和配置 +```bash +git add backend/prisma/migrations/ +git add backend/prisma/seed.ts +git add backend/prompts/ +git add backend/CLOSEAI-CONFIG.md +git commit -m "feat(backend): 添加批量处理和稿件审查模块 + +- Prisma 迁移:批量处理表 +- Prisma 迁移:稿件审查表 +- 新增提示词模板 +- CloseAI 配置文档" +``` + +#### 批次 4:前端新架构(frontend-v2) +```bash +git add frontend-v2/ +git commit -m "feat(frontend): 新增 frontend-v2 模块化架构(Task 17) + +- React 19 + TypeScript + Vite +- 模块注册机制 +- 权限管理系统 +- 路由守卫 +- 6 个业务模块占位符(AIA/ASL/PKB/DC/SSA/ST)" +``` + +#### 批次 5:前端功能扩展 +```bash +git add frontend/src/api/batchApi.ts +git add frontend/src/api/reviewApi.ts +git add frontend/src/components/chat/ +git add frontend/src/components/review/ +git add frontend/src/pages/ReviewPage.tsx +git add frontend/src/hooks/ +git add frontend/src/types/chat.ts +git commit -m "feat(frontend): 添加批量处理和稿件审查功能 + +- 批量处理模式(BatchMode) +- 深度阅读模式(DeepReadMode) +- 全文模式(FullTextMode) +- 稿件审查页面(ReviewPage) +- 文档选择器组件" +``` + +#### 批次 6:文档体系 +```bash +git add "docs/00-系统总体设计/" +git add "docs/00-项目概述/" +git add "docs/01-平台基础层/" +git add "docs/02-通用能力层/" +git add "docs/03-业务模块/" +git add "docs/04-开发规范/" +git add "docs/05-部署文档/" +git add "docs/06-测试文档/" +git add "docs/07-运维文档/" +git add "docs/08-项目管理/" +git add "docs/09-架构实施/" +git add "docs/_templates/" +git commit -m "docs: 完善文档体系(250+ 文档) + +- 系统总体设计(12 个文档) +- 业务模块文档(ASL/AIA/PKB/RVW 等) +- ASL 模块完整设计(质量保障策略、技术选型) +- 架构实施报告 +- 项目管理文档 +- 开发规范和模板" +``` + +#### 批次 7:测试和指南文档 +```bash +git add START-HERE-FOR-AI.md +git add PHASE1-测试指南.md +git add Phase2*.md Phase3*.md +git add README-*.md +git add 如何测试Phase2.md +git add 智能引用功能-测试指南.md +git add 检查测试环境.bat +git add 稿件审查功能-最终完成报告.md +git add 测试记录/ +git commit -m "docs: 添加测试指南和阶段性总结文档 + +- AI 快速上手指南 +- Phase 1-3 测试指南和总结 +- 功能测试文档 +- 检查脚本" +``` + +#### 批次 8:清理和最终检查 +```bash +# 删除备份文件 +git rm frontend/src/pages/ChatPage.backup.tsx +git rm frontend/src/pages/ChatPage.new.tsx + +# 删除临时脚本(如果不需要) +git rm backend/test-batch-api.js +git rm backend/test-review-api.js +git rm -r backend/temp-migration/ + +git commit -m "chore: 清理备份文件和临时测试脚本" +``` + +--- + +## 📋 执行前检查清单 + +在提交前,请确认: + +### ✅ 必做项 +- [ ] **删除乱码文件夹**:`docs/03-涓氬姟妯″潡/` +- [ ] **确认 .env 文件未被追踪**(包含敏感信息) +- [ ] **确认 node_modules/ 未被追踪** +- [ ] **确认 venv/ 未被追踪** +- [ ] **后端服务正常运行** +- [ ] **前端服务正常运行** +- [ ] **数据库连接正常** + +### ⚠️ 建议项 +- [ ] 删除前端备份文件:`ChatPage.backup.tsx`, `ChatPage.new.tsx` +- [ ] 整理根目录测试文档:考虑移到 `docs/` 目录 +- [ ] 检查是否有个人配置文件(如 `.vscode/settings.json`) +- [ ] 运行一次完整测试 + +--- + +## 🚀 推荐执行步骤 + +### 步骤 1:清理不需要的文件 +```bash +# 1. 手动删除乱码文件夹 +删除:D:\MyCursor\AIclinicalresearch\docs\03-涓氬姟妯″潡 + +# 2. 删除前端备份文件(可选) +cd D:\MyCursor\AIclinicalresearch\frontend\src\pages +del ChatPage.backup.tsx +del ChatPage.new.tsx + +# 3. 删除临时测试脚本(可选) +cd D:\MyCursor\AIclinicalresearch\backend +del test-batch-api.js +del test-review-api.js +``` + +### 步骤 2:验证系统正常运行 +```bash +# 启动后端 +cd backend +npm run dev + +# 启动前端(新窗口) +cd frontend-v2 +npm run dev + +# 测试几个核心功能 +``` + +### 步骤 3:分批提交(按方案 B 执行) +```bash +# 按照上面"方案 B"的 7 个批次依次执行 +# 每个批次提交后,检查 git log 确认无误 +``` + +### 步骤 4:推送到远程仓库 +```bash +# 查看所有提交 +git log --oneline -10 + +# 推送到远程 +git push origin master +``` + +--- + +## 📊 预期结果 + +提交完成后,远程仓库将包含: + +| 项目 | 数量 | 状态 | +|------|------|------| +| **后端代码** | ~60 个文件 | ✅ 新架构 | +| **前端代码(v2)** | ~30 个文件 | ✅ 模块化 | +| **前端扩展功能** | ~40 个文件 | ✅ 批量/审查 | +| **文档** | ~250 个文件 | ✅ 完整体系 | +| **配置文件** | 2 个 | ✅ 编码规范 | +| **数据库迁移** | 2 个 | ✅ 新表结构 | +| **测试数据** | 2 个 | ✅ ASL 测试 | + +**总计:约 400 个文件** + +--- + +## ⚠️ 注意事项 + +1. **不要一次性 `git add .`** + - 可能会误提交 `.env`、`node_modules/` 等敏感/大文件 + +2. **分批提交的好处** + - ✅ 提交历史清晰 + - ✅ 易于回滚 + - ✅ 代码审查方便 + - ✅ 便于追踪问题 + +3. **推送前确认** + - 检查是否有敏感信息(API Key、密码) + - 确认 `.gitignore` 已生效 + - 运行一次完整测试 + +--- + +**准备好后,请告诉我您想使用哪种方案(A 或 B),我来帮您执行!** 🚀 + + + + + + + + + + + + + + diff --git a/backend/baseline-e2e-after-guardtype-apply.json b/backend/baseline-e2e-after-guardtype-apply.json new file mode 100644 index 00000000..ec9353ef --- /dev/null +++ b/backend/baseline-e2e-after-guardtype-apply.json @@ -0,0 +1,2900 @@ +[dotenv@17.2.3] injecting env (0) from .env -- tip: ⚙️ suppress all logs with { quiet: true } +[Config] Loaded .env file for development +[JobFactory] Using PgBossQueue (Postgres-Only架构) +[PgBossQueue] Initialized with schema: platform_schema +2026-03-08 19:29:24.433 [aiclinical-backend] info: ✅ 企业微信服务初始化成功 + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "corpId": "ww6ab493470ab4f377", + "agentId": "1000002" +} +2026-03-08 19:29:24.437 [aiclinical-backend] warn: [DifyClient] Dify 已废弃,请使用 pgvector RAG 引擎。Legacy 代码需要迁移到新的 ragService。 + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668 +} +2026-03-08 19:29:24.440 [aiclinical-backend] info: [SessionMemory] 会话记忆管理器已启动 + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "maxHistory": 3, + "timeout": "1小时" +} +2026-03-08 19:29:24.614 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +[PgBossQueue] Started successfully +2026-03-08 19:29:25.137 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "eventCount": 5 +} +2026-03-08 19:29:25.140 [aiclinical-backend] info: REDCap API: exportMetadata success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "fieldCount": 74, + "duration": "525ms" +} +2026-03-08 19:29:25.292 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "eventCount": 5 +} +2026-03-08 19:29:25.292 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 19 +} +2026-03-08 19:29:25.294 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "eventCount": 5 +} +2026-03-08 19:29:25.294 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 19 +} +2026-03-08 19:29:25.821 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 37, + "duration": "529ms" +} +2026-03-08 19:29:25.828 [aiclinical-backend] info: REDCap: getAllRecordsByEvent success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 37, + "eventCount": 5 +} +2026-03-08 19:29:25.833 [aiclinical-backend] info: [QcExecutor] executeBatch start + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "triggeredBy": "manual" +} +2026-03-08 19:29:25.833 [aiclinical-backend] info: [SkillRunner] Starting execution + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "triggerType": "manual", + "options": { + "skipSoftRules": true + } +} +2026-03-08 19:29:25.850 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:29:26.463 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "eventCount": 5 +} +2026-03-08 19:29:26.463 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 19 +} +2026-03-08 19:29:26.803 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 37, + "duration": "340ms" +} +2026-03-08 19:29:26.803 [aiclinical-backend] info: REDCap: getAllRecordsByEvent success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 37, + "eventCount": 5 +} +2026-03-08 19:29:26.820 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:29:26.822 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 0 +} +2026-03-08 19:29:26.833 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:29:26.835 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 0 +} +2026-03-08 19:29:26.842 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:29:26.844 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 0 +} +2026-03-08 19:29:26.844 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:26.845 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:26.845 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:26.899 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:29:26.900 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 0 +} +2026-03-08 19:29:26.910 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:29:26.912 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 0 +} +2026-03-08 19:29:26.923 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:29:26.924 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 0 +} +2026-03-08 19:29:26.932 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:29:26.934 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 0 +} +2026-03-08 19:29:26.943 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:29:26.944 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 0 +} +2026-03-08 19:29:26.945 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:26.945 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:26.945 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.002 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:29:27.004 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 0 +} +2026-03-08 19:29:27.013 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:29:27.014 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 0 +} +2026-03-08 19:29:27.025 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:29:27.027 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 0 +} +2026-03-08 19:29:27.028 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.028 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.028 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.081 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:29:27.083 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 0 +} +2026-03-08 19:29:27.084 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.084 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.084 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.143 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:29:27.144 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 0 +} +2026-03-08 19:29:27.145 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.145 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.145 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.201 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:29:27.203 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 0 +} +2026-03-08 19:29:27.204 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.205 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.205 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.262 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:29:27.264 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 0 +} +2026-03-08 19:29:27.265 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.265 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.265 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.322 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:29:27.324 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 0 +} +2026-03-08 19:29:27.325 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.325 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.325 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.382 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:29:27.384 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 0 +} +2026-03-08 19:29:27.385 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.385 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.386 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.446 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:29:27.447 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 0 +} +2026-03-08 19:29:27.448 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.448 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.448 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.504 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:29:27.506 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 0 +} +2026-03-08 19:29:27.507 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.507 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.507 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.560 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:29:27.562 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 0 +} +2026-03-08 19:29:27.563 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.563 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.563 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.624 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:29:27.626 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 0 +} +2026-03-08 19:29:27.627 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.627 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.627 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.686 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:29:27.688 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 0 +} +2026-03-08 19:29:27.689 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.689 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.689 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.746 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:29:27.748 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 0 +} +2026-03-08 19:29:27.749 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.749 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.750 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.805 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:29:27.807 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 0 +} +2026-03-08 19:29:27.808 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.808 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.808 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.863 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:29:27.865 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 0 +} +2026-03-08 19:29:27.866 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.866 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.866 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.927 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:29:27.929 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 0 +} +2026-03-08 19:29:27.937 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:29:27.939 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 0 +} +2026-03-08 19:29:27.948 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:29:27.951 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 0 +} +2026-03-08 19:29:27.952 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.952 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:27.952 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:28.010 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:29:28.012 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 0 +} +2026-03-08 19:29:28.019 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:29:28.021 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 0 +} +2026-03-08 19:29:28.028 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:29:28.029 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 0 +} +2026-03-08 19:29:28.037 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:29:28.038 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 0 +} +2026-03-08 19:29:28.046 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:29:28.047 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 0 +} +2026-03-08 19:29:28.048 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:28.048 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:28.048 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:28.102 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:29:28.104 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 0 +} +2026-03-08 19:29:28.113 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:29:28.116 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 0 +} +2026-03-08 19:29:28.127 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:29:28.130 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 0 +} +2026-03-08 19:29:28.130 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:28.130 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:28.131 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:28.142 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:29:28.144 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 0 +} +2026-03-08 19:29:28.145 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:28.145 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:28.145 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:29:28.153 [aiclinical-backend] info: [SkillRunner] Execution completed + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "triggerType": "manual", + "recordEventCount": 37, + "totalTimeMs": 2320 +} +2026-03-08 19:29:34.730 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:29:35.894 [aiclinical-backend] info: REDCap API: exportMetadata success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "fieldCount": 74, + "duration": "1164ms" +} +2026-03-08 19:29:35.895 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 1 +} +2026-03-08 19:29:36.717 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 5, + "duration": "822ms" +} +2026-03-08 19:29:37.647 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "eventCount": 5 +} +2026-03-08 19:29:37.648 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 19 +} +2026-03-08 19:29:37.648 [aiclinical-backend] info: [CompletenessEngine] calculateMissingRate + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "1", + "denominator": 26, + "numerator": 1, + "rate": 3.8, + "activeEvents": [ + "ce46f241ae_arm_1", + "65a64dbbd9_arm_1", + "9b510b5ce7_arm_1", + "4cfb49c5ec_arm_1", + "3fea1c25e6_arm_1" + ] +} +2026-03-08 19:29:37.717 [aiclinical-backend] info: [ProtocolDeviationEngine] No visitWindows configured, D6 will be skipped + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c" +} +2026-03-08 19:29:37.718 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:29:37.718 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 1 +} +2026-03-08 19:29:38.025 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 5, + "duration": "307ms" +} +2026-03-08 19:29:38.026 [aiclinical-backend] info: [ProtocolDeviationEngine] checkVisitWindows + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "1", + "checkedVisits": 0, + "deviationCount": 0, + "passedCount": 0 +} +2026-03-08 19:29:38.028 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:29:38.277 [aiclinical-backend] info: REDCap API: exportMetadata success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "fieldCount": 74, + "duration": "249ms" +} +2026-03-08 19:29:38.277 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 1 +} +2026-03-08 19:29:38.664 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 5, + "duration": "387ms" +} +2026-03-08 19:29:39.135 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "eventCount": 5 +} +2026-03-08 19:29:39.135 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 19 +} +2026-03-08 19:29:39.135 [aiclinical-backend] info: [CompletenessEngine] calculateMissingRate + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "2", + "denominator": 26, + "numerator": 0, + "rate": 0, + "activeEvents": [ + "ce46f241ae_arm_1", + "65a64dbbd9_arm_1", + "9b510b5ce7_arm_1", + "4cfb49c5ec_arm_1", + "3fea1c25e6_arm_1" + ] +} +2026-03-08 19:29:39.189 [aiclinical-backend] info: [ProtocolDeviationEngine] No visitWindows configured, D6 will be skipped + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c" +} +2026-03-08 19:29:39.190 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:29:39.190 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 1 +} +2026-03-08 19:29:39.494 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 5, + "duration": "304ms" +} +2026-03-08 19:29:39.494 [aiclinical-backend] info: [ProtocolDeviationEngine] checkVisitWindows + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "2", + "checkedVisits": 0, + "deviationCount": 0, + "passedCount": 0 +} +2026-03-08 19:29:39.496 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:29:39.771 [aiclinical-backend] info: REDCap API: exportMetadata success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "fieldCount": 74, + "duration": "275ms" +} +2026-03-08 19:29:39.771 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 1 +} +2026-03-08 19:29:40.093 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 3, + "duration": "322ms" +} +2026-03-08 19:29:40.841 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "eventCount": 5 +} +2026-03-08 19:29:40.841 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 19 +} +2026-03-08 19:29:40.841 [aiclinical-backend] info: [CompletenessEngine] calculateMissingRate + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "3", + "denominator": 26, + "numerator": 0, + "rate": 0, + "activeEvents": [ + "ce46f241ae_arm_1", + "65a64dbbd9_arm_1", + "9b510b5ce7_arm_1" + ] +} +2026-03-08 19:29:40.893 [aiclinical-backend] info: [ProtocolDeviationEngine] No visitWindows configured, D6 will be skipped + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c" +} +2026-03-08 19:29:40.893 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:29:40.893 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 1 +} +2026-03-08 19:29:41.211 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 3, + "duration": "318ms" +} +2026-03-08 19:29:41.211 [aiclinical-backend] info: [ProtocolDeviationEngine] checkVisitWindows + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "3", + "checkedVisits": 0, + "deviationCount": 0, + "passedCount": 0 +} +2026-03-08 19:29:41.213 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:29:41.451 [aiclinical-backend] info: REDCap API: exportMetadata success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "fieldCount": 74, + "duration": "238ms" +} +2026-03-08 19:29:41.451 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 1 +} +2026-03-08 19:29:41.817 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 2, + "duration": "366ms" +} +2026-03-08 19:29:42.293 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "eventCount": 5 +} +2026-03-08 19:29:42.293 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 19 +} +2026-03-08 19:29:42.293 [aiclinical-backend] info: [CompletenessEngine] calculateMissingRate + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "4", + "denominator": 26, + "numerator": 0, + "rate": 0, + "activeEvents": [ + "ce46f241ae_arm_1", + "65a64dbbd9_arm_1" + ] +} +2026-03-08 19:29:42.347 [aiclinical-backend] info: [ProtocolDeviationEngine] No visitWindows configured, D6 will be skipped + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c" +} +2026-03-08 19:29:42.347 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:29:42.348 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 1 +} +2026-03-08 19:29:42.641 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 2, + "duration": "293ms" +} +2026-03-08 19:29:42.641 [aiclinical-backend] info: [ProtocolDeviationEngine] checkVisitWindows + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "4", + "checkedVisits": 0, + "deviationCount": 0, + "passedCount": 0 +} +2026-03-08 19:29:42.644 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:29:42.883 [aiclinical-backend] info: REDCap API: exportMetadata success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "fieldCount": 74, + "duration": "239ms" +} +2026-03-08 19:29:42.884 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 1 +} +2026-03-08 19:29:43.209 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 2, + "duration": "325ms" +} +2026-03-08 19:29:43.971 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "eventCount": 5 +} +2026-03-08 19:29:43.971 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 19 +} +2026-03-08 19:29:43.971 [aiclinical-backend] info: [CompletenessEngine] calculateMissingRate + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "5", + "denominator": 26, + "numerator": 0, + "rate": 0, + "activeEvents": [ + "ce46f241ae_arm_1", + "65a64dbbd9_arm_1" + ] +} +2026-03-08 19:29:44.036 [aiclinical-backend] info: [ProtocolDeviationEngine] No visitWindows configured, D6 will be skipped + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c" +} +2026-03-08 19:29:44.036 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:29:44.037 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 1 +} +2026-03-08 19:29:44.384 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 2, + "duration": "347ms" +} +2026-03-08 19:29:44.384 [aiclinical-backend] info: [ProtocolDeviationEngine] checkVisitWindows + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "5", + "checkedVisits": 0, + "deviationCount": 0, + "passedCount": 0 +} +2026-03-08 19:29:44.386 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:29:44.624 [aiclinical-backend] info: REDCap API: exportMetadata success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "fieldCount": 74, + "duration": "238ms" +} +2026-03-08 19:29:44.625 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 1 +} +2026-03-08 19:29:44.935 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 2, + "duration": "310ms" +} +2026-03-08 19:29:45.403 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "eventCount": 5 +} +2026-03-08 19:29:45.403 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 19 +} +2026-03-08 19:29:45.403 [aiclinical-backend] info: [CompletenessEngine] calculateMissingRate + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "6", + "denominator": 26, + "numerator": 0, + "rate": 0, + "activeEvents": [ + "ce46f241ae_arm_1", + "65a64dbbd9_arm_1" + ] +} +2026-03-08 19:29:45.465 [aiclinical-backend] info: [ProtocolDeviationEngine] No visitWindows configured, D6 will be skipped + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c" +} +2026-03-08 19:29:45.466 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:29:45.466 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 1 +} +2026-03-08 19:29:45.826 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 2, + "duration": "360ms" +} +2026-03-08 19:29:45.826 [aiclinical-backend] info: [ProtocolDeviationEngine] checkVisitWindows + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "6", + "checkedVisits": 0, + "deviationCount": 0, + "passedCount": 0 +} +2026-03-08 19:29:45.828 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:29:46.140 [aiclinical-backend] info: REDCap API: exportMetadata success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "fieldCount": 74, + "duration": "312ms" +} +2026-03-08 19:29:46.140 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 1 +} +2026-03-08 19:29:46.807 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 3, + "duration": "667ms" +} +2026-03-08 19:29:47.280 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "eventCount": 5 +} +2026-03-08 19:29:47.280 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 19 +} +2026-03-08 19:29:47.280 [aiclinical-backend] info: [CompletenessEngine] calculateMissingRate + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "7", + "denominator": 26, + "numerator": 0, + "rate": 0, + "activeEvents": [ + "ce46f241ae_arm_1", + "65a64dbbd9_arm_1", + "9b510b5ce7_arm_1" + ] +} +2026-03-08 19:29:47.342 [aiclinical-backend] info: [ProtocolDeviationEngine] No visitWindows configured, D6 will be skipped + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c" +} +2026-03-08 19:29:47.342 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:29:47.342 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 1 +} +2026-03-08 19:29:47.731 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 3, + "duration": "389ms" +} +2026-03-08 19:29:47.731 [aiclinical-backend] info: [ProtocolDeviationEngine] checkVisitWindows + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "7", + "checkedVisits": 0, + "deviationCount": 0, + "passedCount": 0 +} +2026-03-08 19:29:47.733 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:29:47.974 [aiclinical-backend] info: REDCap API: exportMetadata success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "fieldCount": 74, + "duration": "241ms" +} +2026-03-08 19:29:47.974 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 1 +} +2026-03-08 19:29:48.326 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 3, + "duration": "352ms" +} +2026-03-08 19:29:48.789 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "eventCount": 5 +} +2026-03-08 19:29:48.789 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 19 +} +2026-03-08 19:29:48.789 [aiclinical-backend] info: [CompletenessEngine] calculateMissingRate + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "8", + "denominator": 26, + "numerator": 0, + "rate": 0, + "activeEvents": [ + "ce46f241ae_arm_1", + "65a64dbbd9_arm_1", + "9b510b5ce7_arm_1" + ] +} +2026-03-08 19:29:48.846 [aiclinical-backend] info: [ProtocolDeviationEngine] No visitWindows configured, D6 will be skipped + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c" +} +2026-03-08 19:29:48.846 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:29:48.846 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 1 +} +2026-03-08 19:29:49.163 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 3, + "duration": "317ms" +} +2026-03-08 19:29:49.163 [aiclinical-backend] info: [ProtocolDeviationEngine] checkVisitWindows + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "8", + "checkedVisits": 0, + "deviationCount": 0, + "passedCount": 0 +} +2026-03-08 19:29:49.165 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:29:49.742 [aiclinical-backend] info: REDCap API: exportMetadata success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "fieldCount": 74, + "duration": "577ms" +} +2026-03-08 19:29:49.742 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 1 +} +2026-03-08 19:29:50.050 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 5, + "duration": "308ms" +} +2026-03-08 19:29:50.542 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "eventCount": 5 +} +2026-03-08 19:29:50.542 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 19 +} +2026-03-08 19:29:50.543 [aiclinical-backend] info: [CompletenessEngine] calculateMissingRate + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "9", + "denominator": 26, + "numerator": 0, + "rate": 0, + "activeEvents": [ + "ce46f241ae_arm_1", + "65a64dbbd9_arm_1", + "9b510b5ce7_arm_1", + "4cfb49c5ec_arm_1", + "3fea1c25e6_arm_1" + ] +} +2026-03-08 19:29:50.598 [aiclinical-backend] info: [ProtocolDeviationEngine] No visitWindows configured, D6 will be skipped + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c" +} +2026-03-08 19:29:50.599 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:29:50.599 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 1 +} +2026-03-08 19:29:50.974 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 5, + "duration": "375ms" +} +2026-03-08 19:29:50.974 [aiclinical-backend] info: [ProtocolDeviationEngine] checkVisitWindows + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "9", + "checkedVisits": 0, + "deviationCount": 0, + "passedCount": 0 +} +2026-03-08 19:29:50.976 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:29:51.224 [aiclinical-backend] info: REDCap API: exportMetadata success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "fieldCount": 74, + "duration": "247ms" +} +2026-03-08 19:29:51.224 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 1 +} +2026-03-08 19:29:51.546 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 5, + "duration": "321ms" +} +2026-03-08 19:29:51.996 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "eventCount": 5 +} +2026-03-08 19:29:51.997 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 19 +} +2026-03-08 19:29:51.997 [aiclinical-backend] info: [CompletenessEngine] calculateMissingRate + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "10", + "denominator": 26, + "numerator": 0, + "rate": 0, + "activeEvents": [ + "ce46f241ae_arm_1", + "65a64dbbd9_arm_1", + "9b510b5ce7_arm_1", + "4cfb49c5ec_arm_1", + "3fea1c25e6_arm_1" + ] +} +2026-03-08 19:29:52.052 [aiclinical-backend] info: [ProtocolDeviationEngine] No visitWindows configured, D6 will be skipped + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c" +} +2026-03-08 19:29:52.052 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:29:52.052 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 1 +} +2026-03-08 19:29:52.662 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 5, + "duration": "610ms" +} +2026-03-08 19:29:52.662 [aiclinical-backend] info: [ProtocolDeviationEngine] checkVisitWindows + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "10", + "checkedVisits": 0, + "deviationCount": 0, + "passedCount": 0 +} +2026-03-08 19:29:52.664 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:29:52.905 [aiclinical-backend] info: REDCap API: exportMetadata success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "fieldCount": 74, + "duration": "241ms" +} +2026-03-08 19:29:52.905 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 1 +} +2026-03-08 19:29:53.234 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 1, + "duration": "329ms" +} +2026-03-08 19:29:53.691 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "eventCount": 5 +} +2026-03-08 19:29:53.691 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 19 +} +2026-03-08 19:29:53.692 [aiclinical-backend] info: [CompletenessEngine] calculateMissingRate + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "11", + "denominator": 26, + "numerator": 19, + "rate": 73.1, + "activeEvents": [ + "65a64dbbd9_arm_1" + ] +} +2026-03-08 19:29:53.754 [aiclinical-backend] info: [ProtocolDeviationEngine] No visitWindows configured, D6 will be skipped + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c" +} +2026-03-08 19:29:53.754 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:29:53.755 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 1 +} +2026-03-08 19:29:54.149 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 1, + "duration": "394ms" +} +2026-03-08 19:29:54.150 [aiclinical-backend] info: [ProtocolDeviationEngine] checkVisitWindows + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "11", + "checkedVisits": 0, + "deviationCount": 0, + "passedCount": 0 +} +2026-03-08 19:29:54.151 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:29:54.383 [aiclinical-backend] info: REDCap API: exportMetadata success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "fieldCount": 74, + "duration": "232ms" +} +2026-03-08 19:29:54.383 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 1 +} +2026-03-08 19:29:54.693 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 1, + "duration": "310ms" +} +2026-03-08 19:29:55.152 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "eventCount": 5 +} +2026-03-08 19:29:55.153 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "mappingCount": 19 +} +2026-03-08 19:29:55.153 [aiclinical-backend] info: [CompletenessEngine] calculateMissingRate + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "12", + "denominator": 26, + "numerator": 19, + "rate": 73.1, + "activeEvents": [ + "65a64dbbd9_arm_1" + ] +} +2026-03-08 19:29:55.213 [aiclinical-backend] info: [ProtocolDeviationEngine] No visitWindows configured, D6 will be skipped + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c" +} +2026-03-08 19:29:55.214 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:29:55.214 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 1 +} +2026-03-08 19:29:55.896 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "recordCount": 1, + "duration": "682ms" +} +2026-03-08 19:29:55.896 [aiclinical-backend] info: [ProtocolDeviationEngine] checkVisitWindows + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "12", + "checkedVisits": 0, + "deviationCount": 0, + "passedCount": 0 +} +2026-03-08 19:29:55.940 [aiclinical-backend] info: [HealthScoreEngine] calculate done + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "healthScore": 79.5, + "healthGrade": "B" +} +2026-03-08 19:29:55.941 [aiclinical-backend] info: [QcAggregator] HealthScore refreshed + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "healthScore": 79.5, + "healthGrade": "B" +} +2026-03-08 19:29:55.941 [aiclinical-backend] info: [QcAggregator] aggregateDeferred done + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "eventStatusRows": 37, + "recordSummaryRows": 12, + "durationMs": 45 +} +2026-03-08 19:29:55.941 [aiclinical-backend] info: [QcExecutor] Batch aggregation completed + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "eventStatusRows": 37, + "recordSummaryRows": 12, + "aggDurationMs": 45 +} +2026-03-08 19:29:55.941 [aiclinical-backend] info: [QcExecutor] executeBatch done + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "totalRecordEvents": 37, + "fieldStatusWrites": 1682, + "durationMs": 30108 +} +2026-03-08 19:29:55.941 [aiclinical-backend] info: [DailyQcOrchestrator] Starting orchestration + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c" +} +2026-03-08 19:29:55.941 [aiclinical-backend] info: [QcReportService] Generating new report + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "reportType": "daily" +} +2026-03-08 19:29:56.018 [aiclinical-backend] info: [QcReportService] Report generated + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "reportType": "daily", + "duration": "77ms", + "criticalCount": 167, + "warningCount": 743, + "topIssuesCount": 5, + "groupedRecordCount": 12 +} +2026-03-08 19:29:56.224 [aiclinical-backend] debug: [QcReportService] Report cached + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "reportType": "daily" +} +2026-03-08 19:29:56.393 [aiclinical-backend] info: eQuery batch created + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "count": 14 +} +2026-03-08 19:29:56.426 [aiclinical-backend] info: 📤 发送企业微信 Markdown 消息 + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "userId": "FengZhiBo", + "contentLength": 218 +} +2026-03-08 19:29:56.427 [aiclinical-backend] info: 🔄 请求新的企业微信 Access Token... + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668 +} +2026-03-08 19:29:58.191 [aiclinical-backend] info: ✅ Access Token 获取成功 + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "expiresIn": 7200 +} +2026-03-08 19:29:58.608 [aiclinical-backend] error: ❌ 发送 Markdown 消息失败 + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "errcode": 60020, + "errmsg": "not allow to access from your ip, hint: [1772969398356210336578276], from ip: 154.17.225.224, more info at https://open.work.weixin.qq.com/devtool/query?e=60020" +} +2026-03-08 19:29:58.608 [aiclinical-backend] error: ❌ 发送 Markdown 消息异常 + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "error": "企业微信发送失败: not allow to access from your ip, hint: [1772969398356210336578276], from ip: 154.17.225.224, more info at https://open.work.weixin.qq.com/devtool/query?e=60020 (60020)", + "userId": "FengZhiBo" +} +2026-03-08 19:29:58.608 [aiclinical-backend] warn: [DailyQcOrchestrator] Push notification failed (non-fatal) + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "error": "Error: 企业微信发送失败: not allow to access from your ip, hint: [1772969398356210336578276], from ip: 154.17.225.224, more info at https://open.work.weixin.qq.com/devtool/query?e=60020 (60020)" +} +2026-03-08 19:29:58.609 [aiclinical-backend] info: [DailyQcOrchestrator] Orchestration completed + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "reportId": "73d05bda-9cfc-4c4d-a52c-728c7cf5296d", + "equeriesCreated": 14, + "criticalEventsArchived": 0, + "newIssues": 0, + "resolvedIssues": 0, + "pushSent": false, + "durationMs": 2667 +} +2026-03-08 19:29:58.655 [aiclinical-backend] info: [QcReportService] Generating new report + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "reportType": "on_demand" +} +2026-03-08 19:29:58.656 [aiclinical-backend] info: [ToolsService] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "count": 0 +} +2026-03-08 19:29:58.659 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:29:58.660 [aiclinical-backend] info: [ToolsService] REDCap adapter created + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668 +} +2026-03-08 19:29:58.660 [aiclinical-backend] debug: [ToolsService] Tool registered + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "name": "read_report" +} +2026-03-08 19:29:58.660 [aiclinical-backend] debug: [ToolsService] Tool registered + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "name": "look_up_data" +} +2026-03-08 19:29:58.660 [aiclinical-backend] debug: [ToolsService] Tool registered + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "name": "check_quality" +} +2026-03-08 19:29:58.660 [aiclinical-backend] debug: [ToolsService] Tool registered + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "name": "search_knowledge" +} +2026-03-08 19:29:58.660 [aiclinical-backend] info: [ToolsService] Initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "toolCount": 4 +} +2026-03-08 19:29:58.686 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:29:58.689 [aiclinical-backend] info: [QcCockpitService] 获取驾驶舱数据成功 + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "totalRecords": 12, + "durationMs": 62 +} +2026-03-08 19:29:58.692 [aiclinical-backend] info: [QcReportService] Report generated + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "reportType": "on_demand", + "duration": "37ms", + "criticalCount": 167, + "warningCount": 743, + "topIssuesCount": 5, + "groupedRecordCount": 12 +} +2026-03-08 19:29:58.901 [aiclinical-backend] debug: [QcReportService] Report cached + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "reportType": "on_demand" +} +2026-03-08 19:29:58.925 [aiclinical-backend] debug: [QcReportService] Returning cached report + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "reportType": "on_demand", + "generatedAt": "2026-03-08T19:29:58+08:00" +} +2026-03-08 19:29:58.925 [aiclinical-backend] info: [ToolsService] Tool executed + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 4668, + "toolName": "read_report", + "success": true, + "executionTime": "23ms" +} +{ + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "withChat": false, + "startedAt": "2026-03-08T11:29:24.442Z", + "stages": [ + { + "name": "Stage1_REDCap", + "ok": true, + "checks": [ + { + "name": "metadata_non_empty", + "ok": true, + "value": 74 + }, + { + "name": "records_by_event_non_empty", + "ok": true, + "value": 37 + }, + { + "name": "unique_records_non_empty", + "ok": true, + "value": 12 + }, + { + "name": "events_loaded_or_non_longitudinal", + "ok": true, + "value": { + "events": 5, + "formEventMapping": 19 + } + } + ], + "detail": { + "metadataCount": 74, + "eventCount": 5, + "formEventMappingCount": 19, + "recordEventRows": 37, + "uniqueRecordCount": 12 + } + }, + { + "name": "Stage2_Rules", + "ok": true, + "checks": [ + { + "name": "active_qc_rules_exists", + "ok": true, + "value": 79 + }, + { + "name": "multi_field_rules_exists", + "ok": true, + "value": 29 + }, + { + "name": "has_D1_or_legacy_inclusion_exclusion", + "ok": true, + "value": [ + "D6", + "D3", + "D1", + "D5" + ] + } + ], + "detail": { + "ruleCount": 79, + "multiFieldRuleCount": 29, + "categories": [ + "D1", + "D3", + "D5", + "D6" + ] + } + }, + { + "name": "Stage3_Execution", + "ok": true, + "checks": [ + { + "name": "batch_has_records", + "ok": true, + "value": 12 + }, + { + "name": "field_status_written", + "ok": true, + "value": 1233 + }, + { + "name": "event_status_written", + "ok": true, + "value": 37 + }, + { + "name": "record_summary_written", + "ok": true, + "value": 12 + }, + { + "name": "project_stats_exists", + "ok": true, + "value": true + } + ], + "detail": { + "batch": { + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "totalRecords": 12, + "totalEvents": 37, + "passed": 0, + "failed": 21, + "warnings": 16, + "fieldStatusWrites": 1682, + "executionTimeMs": 30108 + }, + "orchestrate": { + "reportId": "73d05bda-9cfc-4c4d-a52c-728c7cf5296d", + "equeriesCreated": 14, + "criticalEventsArchived": 0, + "newIssues": 0, + "resolvedIssues": 0, + "pushSent": false + }, + "db": { + "fieldStatusCount": 1233, + "eventStatusCount": 37, + "recordSummaryCount": 12, + "projectStats": { + "totalRecords": 12, + "passedRecords": 0, + "failedRecords": 12 + } + } + } + }, + { + "name": "Stage4_Consumption", + "ok": true, + "checks": [ + { + "name": "report_summary_exists", + "ok": true, + "value": 12 + }, + { + "name": "cockpit_stats_exists", + "ok": true, + "value": 12 + }, + { + "name": "equery_log_summary_exists", + "ok": true, + "value": 1129 + }, + { + "name": "pass_rate_consistent_report_cockpit_tool", + "ok": true, + "value": { + "reportPassRate": 0, + "cockpitPassRate": 0, + "toolPassRate": 0 + } + }, + { + "name": "chat_has_conclusion_or_skipped", + "ok": true, + "value": "skipped" + } + ], + "detail": { + "reportPassRate": 0, + "cockpitPassRate": 0, + "toolPassRate": 0, + "chatResult": "skipped" + } + } + ], + "endedAt": "2026-03-08T11:29:58.925Z" +} diff --git a/backend/baseline-e2e-after-unify.json b/backend/baseline-e2e-after-unify.json new file mode 100644 index 00000000..7de25846 --- /dev/null +++ b/backend/baseline-e2e-after-unify.json @@ -0,0 +1,2892 @@ +[dotenv@17.2.3] injecting env (0) from .env -- tip: 🔐 encrypt with Dotenvx: https://dotenvx.com +[Config] Loaded .env file for development +[JobFactory] Using PgBossQueue (Postgres-Only架构) +[PgBossQueue] Initialized with schema: platform_schema +2026-03-08 19:25:42.895 [aiclinical-backend] info: ✅ 企业微信服务初始化成功 + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "corpId": "ww6ab493470ab4f377", + "agentId": "1000002" +} +2026-03-08 19:25:42.898 [aiclinical-backend] warn: [DifyClient] Dify 已废弃,请使用 pgvector RAG 引擎。Legacy 代码需要迁移到新的 ragService。 + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208 +} +2026-03-08 19:25:42.901 [aiclinical-backend] info: [SessionMemory] 会话记忆管理器已启动 + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "maxHistory": 3, + "timeout": "1小时" +} +2026-03-08 19:25:43.083 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +[PgBossQueue] Started successfully +2026-03-08 19:25:43.627 [aiclinical-backend] info: REDCap API: exportMetadata success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "fieldCount": 74, + "duration": "543ms" +} +2026-03-08 19:25:43.631 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "eventCount": 5 +} +2026-03-08 19:25:43.778 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "eventCount": 5 +} +2026-03-08 19:25:43.778 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 19 +} +2026-03-08 19:25:43.780 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "eventCount": 5 +} +2026-03-08 19:25:43.781 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 19 +} +2026-03-08 19:25:44.264 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 37, + "duration": "485ms" +} +2026-03-08 19:25:44.270 [aiclinical-backend] info: REDCap: getAllRecordsByEvent success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 37, + "eventCount": 5 +} +2026-03-08 19:25:44.275 [aiclinical-backend] info: [QcExecutor] executeBatch start + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "triggeredBy": "manual" +} +2026-03-08 19:25:44.275 [aiclinical-backend] info: [SkillRunner] Starting execution + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "triggerType": "manual", + "options": { + "skipSoftRules": true + } +} +2026-03-08 19:25:44.293 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:25:44.762 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "eventCount": 5 +} +2026-03-08 19:25:44.762 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 19 +} +2026-03-08 19:25:45.054 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 37, + "duration": "292ms" +} +2026-03-08 19:25:45.055 [aiclinical-backend] info: REDCap: getAllRecordsByEvent success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 37, + "eventCount": 5 +} +2026-03-08 19:25:45.070 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:25:45.072 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 0 +} +2026-03-08 19:25:45.083 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:25:45.085 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 0 +} +2026-03-08 19:25:45.092 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:25:45.093 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 0 +} +2026-03-08 19:25:45.093 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.094 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.094 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.146 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:25:45.147 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 0 +} +2026-03-08 19:25:45.153 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:25:45.154 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 0 +} +2026-03-08 19:25:45.160 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:25:45.161 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 0 +} +2026-03-08 19:25:45.166 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:25:45.168 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 0 +} +2026-03-08 19:25:45.173 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:25:45.174 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 0 +} +2026-03-08 19:25:45.175 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.175 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.175 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.229 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:25:45.230 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 0 +} +2026-03-08 19:25:45.237 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:25:45.238 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 0 +} +2026-03-08 19:25:45.245 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:25:45.248 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 0 +} +2026-03-08 19:25:45.249 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.249 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.249 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.302 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:25:45.304 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 0 +} +2026-03-08 19:25:45.305 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.305 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.305 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.357 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:25:45.358 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 0 +} +2026-03-08 19:25:45.358 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.358 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.358 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.409 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:25:45.410 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 0 +} +2026-03-08 19:25:45.410 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.410 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.410 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.461 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:25:45.462 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 0 +} +2026-03-08 19:25:45.463 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.463 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.463 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.514 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:25:45.515 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 0 +} +2026-03-08 19:25:45.516 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.516 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.516 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.574 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:25:45.576 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 0 +} +2026-03-08 19:25:45.577 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.577 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.577 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.639 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:25:45.641 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 0 +} +2026-03-08 19:25:45.642 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.643 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.644 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.703 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:25:45.706 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 0 +} +2026-03-08 19:25:45.707 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.708 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.708 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.761 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:25:45.763 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 0 +} +2026-03-08 19:25:45.763 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.763 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.763 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.818 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:25:45.820 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 0 +} +2026-03-08 19:25:45.821 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.821 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.821 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.880 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:25:45.882 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 0 +} +2026-03-08 19:25:45.883 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.883 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.883 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.942 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:25:45.944 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 0 +} +2026-03-08 19:25:45.945 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.945 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.945 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.997 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:25:45.999 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 0 +} +2026-03-08 19:25:45.999 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.999 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:45.999 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:46.054 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:25:46.055 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 0 +} +2026-03-08 19:25:46.055 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:46.055 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:46.055 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:46.109 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:25:46.110 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 0 +} +2026-03-08 19:25:46.117 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:25:46.118 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 0 +} +2026-03-08 19:25:46.125 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:25:46.126 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 0 +} +2026-03-08 19:25:46.127 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:46.127 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:46.127 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:46.182 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:25:46.183 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 0 +} +2026-03-08 19:25:46.189 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:25:46.190 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 0 +} +2026-03-08 19:25:46.197 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:25:46.198 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 0 +} +2026-03-08 19:25:46.205 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:25:46.207 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 0 +} +2026-03-08 19:25:46.215 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:25:46.216 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 0 +} +2026-03-08 19:25:46.217 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:46.217 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:46.217 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:46.270 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:25:46.275 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 0 +} +2026-03-08 19:25:46.289 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:25:46.291 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 0 +} +2026-03-08 19:25:46.302 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:25:46.304 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 0 +} +2026-03-08 19:25:46.305 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:46.305 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:46.305 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:46.319 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:25:46.321 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 0 +} +2026-03-08 19:25:46.322 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:46.323 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:46.323 [aiclinical-backend] error: [HardRuleEngine] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:25:46.335 [aiclinical-backend] info: [SkillRunner] Execution completed + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "triggerType": "manual", + "recordEventCount": 37, + "totalTimeMs": 2060 +} +2026-03-08 19:25:51.166 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:25:52.326 [aiclinical-backend] info: REDCap API: exportMetadata success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "fieldCount": 74, + "duration": "1159ms" +} +2026-03-08 19:25:52.326 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 1 +} +2026-03-08 19:25:52.842 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 5, + "duration": "516ms" +} +2026-03-08 19:25:53.357 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "eventCount": 5 +} +2026-03-08 19:25:53.357 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 19 +} +2026-03-08 19:25:53.357 [aiclinical-backend] info: [CompletenessEngine] calculateMissingRate + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "1", + "denominator": 26, + "numerator": 1, + "rate": 3.8, + "activeEvents": [ + "ce46f241ae_arm_1", + "65a64dbbd9_arm_1", + "9b510b5ce7_arm_1", + "4cfb49c5ec_arm_1", + "3fea1c25e6_arm_1" + ] +} +2026-03-08 19:25:53.444 [aiclinical-backend] info: [ProtocolDeviationEngine] No visitWindows configured, D6 will be skipped + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c" +} +2026-03-08 19:25:53.445 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:25:53.445 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 1 +} +2026-03-08 19:25:53.753 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 5, + "duration": "308ms" +} +2026-03-08 19:25:53.754 [aiclinical-backend] info: [ProtocolDeviationEngine] checkVisitWindows + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "1", + "checkedVisits": 0, + "deviationCount": 0, + "passedCount": 0 +} +2026-03-08 19:25:53.757 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:25:53.985 [aiclinical-backend] info: REDCap API: exportMetadata success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "fieldCount": 74, + "duration": "228ms" +} +2026-03-08 19:25:53.985 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 1 +} +2026-03-08 19:25:54.337 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 5, + "duration": "351ms" +} +2026-03-08 19:25:55.117 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "eventCount": 5 +} +2026-03-08 19:25:55.117 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 19 +} +2026-03-08 19:25:55.117 [aiclinical-backend] info: [CompletenessEngine] calculateMissingRate + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "2", + "denominator": 26, + "numerator": 0, + "rate": 0, + "activeEvents": [ + "ce46f241ae_arm_1", + "65a64dbbd9_arm_1", + "9b510b5ce7_arm_1", + "4cfb49c5ec_arm_1", + "3fea1c25e6_arm_1" + ] +} +2026-03-08 19:25:55.178 [aiclinical-backend] info: [ProtocolDeviationEngine] No visitWindows configured, D6 will be skipped + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c" +} +2026-03-08 19:25:55.178 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:25:55.178 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 1 +} +2026-03-08 19:25:55.668 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 5, + "duration": "490ms" +} +2026-03-08 19:25:55.668 [aiclinical-backend] info: [ProtocolDeviationEngine] checkVisitWindows + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "2", + "checkedVisits": 0, + "deviationCount": 0, + "passedCount": 0 +} +2026-03-08 19:25:55.670 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:25:55.964 [aiclinical-backend] info: REDCap API: exportMetadata success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "fieldCount": 74, + "duration": "293ms" +} +2026-03-08 19:25:55.964 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 1 +} +2026-03-08 19:25:56.290 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 3, + "duration": "325ms" +} +2026-03-08 19:25:56.851 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "eventCount": 5 +} +2026-03-08 19:25:56.852 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 19 +} +2026-03-08 19:25:56.852 [aiclinical-backend] info: [CompletenessEngine] calculateMissingRate + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "3", + "denominator": 26, + "numerator": 0, + "rate": 0, + "activeEvents": [ + "ce46f241ae_arm_1", + "65a64dbbd9_arm_1", + "9b510b5ce7_arm_1" + ] +} +2026-03-08 19:25:56.918 [aiclinical-backend] info: [ProtocolDeviationEngine] No visitWindows configured, D6 will be skipped + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c" +} +2026-03-08 19:25:56.918 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:25:56.918 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 1 +} +2026-03-08 19:25:57.240 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 3, + "duration": "322ms" +} +2026-03-08 19:25:57.240 [aiclinical-backend] info: [ProtocolDeviationEngine] checkVisitWindows + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "3", + "checkedVisits": 0, + "deviationCount": 0, + "passedCount": 0 +} +2026-03-08 19:25:57.242 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:25:57.790 [aiclinical-backend] info: REDCap API: exportMetadata success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "fieldCount": 74, + "duration": "548ms" +} +2026-03-08 19:25:57.790 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 1 +} +2026-03-08 19:25:58.143 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 2, + "duration": "353ms" +} +2026-03-08 19:25:58.648 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "eventCount": 5 +} +2026-03-08 19:25:58.648 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 19 +} +2026-03-08 19:25:58.648 [aiclinical-backend] info: [CompletenessEngine] calculateMissingRate + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "4", + "denominator": 26, + "numerator": 0, + "rate": 0, + "activeEvents": [ + "ce46f241ae_arm_1", + "65a64dbbd9_arm_1" + ] +} +2026-03-08 19:25:58.719 [aiclinical-backend] info: [ProtocolDeviationEngine] No visitWindows configured, D6 will be skipped + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c" +} +2026-03-08 19:25:58.720 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:25:58.720 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 1 +} +2026-03-08 19:25:59.246 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 2, + "duration": "526ms" +} +2026-03-08 19:25:59.246 [aiclinical-backend] info: [ProtocolDeviationEngine] checkVisitWindows + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "4", + "checkedVisits": 0, + "deviationCount": 0, + "passedCount": 0 +} +2026-03-08 19:25:59.248 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:25:59.550 [aiclinical-backend] info: REDCap API: exportMetadata success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "fieldCount": 74, + "duration": "301ms" +} +2026-03-08 19:25:59.550 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 1 +} +2026-03-08 19:25:59.879 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 2, + "duration": "328ms" +} +2026-03-08 19:26:00.669 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "eventCount": 5 +} +2026-03-08 19:26:00.670 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 19 +} +2026-03-08 19:26:00.670 [aiclinical-backend] info: [CompletenessEngine] calculateMissingRate + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "5", + "denominator": 26, + "numerator": 0, + "rate": 0, + "activeEvents": [ + "ce46f241ae_arm_1", + "65a64dbbd9_arm_1" + ] +} +2026-03-08 19:26:00.729 [aiclinical-backend] info: [ProtocolDeviationEngine] No visitWindows configured, D6 will be skipped + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c" +} +2026-03-08 19:26:00.729 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:26:00.729 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 1 +} +2026-03-08 19:26:01.052 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 2, + "duration": "322ms" +} +2026-03-08 19:26:01.052 [aiclinical-backend] info: [ProtocolDeviationEngine] checkVisitWindows + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "5", + "checkedVisits": 0, + "deviationCount": 0, + "passedCount": 0 +} +2026-03-08 19:26:01.054 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:26:01.283 [aiclinical-backend] info: REDCap API: exportMetadata success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "fieldCount": 74, + "duration": "228ms" +} +2026-03-08 19:26:01.283 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 1 +} +2026-03-08 19:26:01.674 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 2, + "duration": "391ms" +} +2026-03-08 19:26:02.141 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "eventCount": 5 +} +2026-03-08 19:26:02.141 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 19 +} +2026-03-08 19:26:02.141 [aiclinical-backend] info: [CompletenessEngine] calculateMissingRate + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "6", + "denominator": 26, + "numerator": 0, + "rate": 0, + "activeEvents": [ + "ce46f241ae_arm_1", + "65a64dbbd9_arm_1" + ] +} +2026-03-08 19:26:02.196 [aiclinical-backend] info: [ProtocolDeviationEngine] No visitWindows configured, D6 will be skipped + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c" +} +2026-03-08 19:26:02.196 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:26:02.197 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 1 +} +2026-03-08 19:26:02.513 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 2, + "duration": "316ms" +} +2026-03-08 19:26:02.513 [aiclinical-backend] info: [ProtocolDeviationEngine] checkVisitWindows + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "6", + "checkedVisits": 0, + "deviationCount": 0, + "passedCount": 0 +} +2026-03-08 19:26:02.516 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:26:02.753 [aiclinical-backend] info: REDCap API: exportMetadata success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "fieldCount": 74, + "duration": "236ms" +} +2026-03-08 19:26:02.754 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 1 +} +2026-03-08 19:26:03.072 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 3, + "duration": "318ms" +} +2026-03-08 19:26:03.858 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "eventCount": 5 +} +2026-03-08 19:26:03.858 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 19 +} +2026-03-08 19:26:03.858 [aiclinical-backend] info: [CompletenessEngine] calculateMissingRate + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "7", + "denominator": 26, + "numerator": 0, + "rate": 0, + "activeEvents": [ + "ce46f241ae_arm_1", + "65a64dbbd9_arm_1", + "9b510b5ce7_arm_1" + ] +} +2026-03-08 19:26:03.921 [aiclinical-backend] info: [ProtocolDeviationEngine] No visitWindows configured, D6 will be skipped + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c" +} +2026-03-08 19:26:03.921 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:26:03.921 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 1 +} +2026-03-08 19:26:04.243 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 3, + "duration": "322ms" +} +2026-03-08 19:26:04.243 [aiclinical-backend] info: [ProtocolDeviationEngine] checkVisitWindows + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "7", + "checkedVisits": 0, + "deviationCount": 0, + "passedCount": 0 +} +2026-03-08 19:26:04.245 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:26:04.477 [aiclinical-backend] info: REDCap API: exportMetadata success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "fieldCount": 74, + "duration": "232ms" +} +2026-03-08 19:26:04.477 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 1 +} +2026-03-08 19:26:04.854 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 3, + "duration": "376ms" +} +2026-03-08 19:26:05.365 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "eventCount": 5 +} +2026-03-08 19:26:05.365 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 19 +} +2026-03-08 19:26:05.365 [aiclinical-backend] info: [CompletenessEngine] calculateMissingRate + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "8", + "denominator": 26, + "numerator": 0, + "rate": 0, + "activeEvents": [ + "ce46f241ae_arm_1", + "65a64dbbd9_arm_1", + "9b510b5ce7_arm_1" + ] +} +2026-03-08 19:26:05.425 [aiclinical-backend] info: [ProtocolDeviationEngine] No visitWindows configured, D6 will be skipped + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c" +} +2026-03-08 19:26:05.425 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:26:05.426 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 1 +} +2026-03-08 19:26:05.722 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 3, + "duration": "296ms" +} +2026-03-08 19:26:05.722 [aiclinical-backend] info: [ProtocolDeviationEngine] checkVisitWindows + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "8", + "checkedVisits": 0, + "deviationCount": 0, + "passedCount": 0 +} +2026-03-08 19:26:05.724 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:26:06.068 [aiclinical-backend] info: REDCap API: exportMetadata success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "fieldCount": 74, + "duration": "344ms" +} +2026-03-08 19:26:06.068 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 1 +} +2026-03-08 19:26:06.993 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 5, + "duration": "925ms" +} +2026-03-08 19:26:07.488 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "eventCount": 5 +} +2026-03-08 19:26:07.488 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 19 +} +2026-03-08 19:26:07.488 [aiclinical-backend] info: [CompletenessEngine] calculateMissingRate + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "9", + "denominator": 26, + "numerator": 0, + "rate": 0, + "activeEvents": [ + "ce46f241ae_arm_1", + "65a64dbbd9_arm_1", + "9b510b5ce7_arm_1", + "4cfb49c5ec_arm_1", + "3fea1c25e6_arm_1" + ] +} +2026-03-08 19:26:07.544 [aiclinical-backend] info: [ProtocolDeviationEngine] No visitWindows configured, D6 will be skipped + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c" +} +2026-03-08 19:26:07.544 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:26:07.544 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 1 +} +2026-03-08 19:26:07.920 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 5, + "duration": "376ms" +} +2026-03-08 19:26:07.920 [aiclinical-backend] info: [ProtocolDeviationEngine] checkVisitWindows + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "9", + "checkedVisits": 0, + "deviationCount": 0, + "passedCount": 0 +} +2026-03-08 19:26:07.923 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:26:08.190 [aiclinical-backend] info: REDCap API: exportMetadata success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "fieldCount": 74, + "duration": "267ms" +} +2026-03-08 19:26:08.191 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 1 +} +2026-03-08 19:26:08.518 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 5, + "duration": "327ms" +} +2026-03-08 19:26:08.991 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "eventCount": 5 +} +2026-03-08 19:26:08.991 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 19 +} +2026-03-08 19:26:08.991 [aiclinical-backend] info: [CompletenessEngine] calculateMissingRate + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "10", + "denominator": 26, + "numerator": 0, + "rate": 0, + "activeEvents": [ + "ce46f241ae_arm_1", + "65a64dbbd9_arm_1", + "9b510b5ce7_arm_1", + "4cfb49c5ec_arm_1", + "3fea1c25e6_arm_1" + ] +} +2026-03-08 19:26:09.058 [aiclinical-backend] info: [ProtocolDeviationEngine] No visitWindows configured, D6 will be skipped + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c" +} +2026-03-08 19:26:09.059 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:26:09.059 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 1 +} +2026-03-08 19:26:09.691 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 5, + "duration": "632ms" +} +2026-03-08 19:26:09.691 [aiclinical-backend] info: [ProtocolDeviationEngine] checkVisitWindows + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "10", + "checkedVisits": 0, + "deviationCount": 0, + "passedCount": 0 +} +2026-03-08 19:26:09.693 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:26:09.924 [aiclinical-backend] info: REDCap API: exportMetadata success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "fieldCount": 74, + "duration": "231ms" +} +2026-03-08 19:26:09.924 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 1 +} +2026-03-08 19:26:10.260 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 1, + "duration": "335ms" +} +2026-03-08 19:26:10.706 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "eventCount": 5 +} +2026-03-08 19:26:10.706 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 19 +} +2026-03-08 19:26:10.707 [aiclinical-backend] info: [CompletenessEngine] calculateMissingRate + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "11", + "denominator": 26, + "numerator": 19, + "rate": 73.1, + "activeEvents": [ + "65a64dbbd9_arm_1" + ] +} +2026-03-08 19:26:10.764 [aiclinical-backend] info: [ProtocolDeviationEngine] No visitWindows configured, D6 will be skipped + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c" +} +2026-03-08 19:26:10.765 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:26:10.765 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 1 +} +2026-03-08 19:26:11.144 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 1, + "duration": "378ms" +} +2026-03-08 19:26:11.144 [aiclinical-backend] info: [ProtocolDeviationEngine] checkVisitWindows + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "11", + "checkedVisits": 0, + "deviationCount": 0, + "passedCount": 0 +} +2026-03-08 19:26:11.146 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:26:11.408 [aiclinical-backend] info: REDCap API: exportMetadata success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "fieldCount": 74, + "duration": "262ms" +} +2026-03-08 19:26:11.408 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 1 +} +2026-03-08 19:26:11.729 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 1, + "duration": "321ms" +} +2026-03-08 19:26:12.192 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "eventCount": 5 +} +2026-03-08 19:26:12.192 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "mappingCount": 19 +} +2026-03-08 19:26:12.192 [aiclinical-backend] info: [CompletenessEngine] calculateMissingRate + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "12", + "denominator": 26, + "numerator": 19, + "rate": 73.1, + "activeEvents": [ + "65a64dbbd9_arm_1" + ] +} +2026-03-08 19:26:12.251 [aiclinical-backend] info: [ProtocolDeviationEngine] No visitWindows configured, D6 will be skipped + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c" +} +2026-03-08 19:26:12.251 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:26:12.252 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 1 +} +2026-03-08 19:26:12.889 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "recordCount": 1, + "duration": "637ms" +} +2026-03-08 19:26:12.889 [aiclinical-backend] info: [ProtocolDeviationEngine] checkVisitWindows + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "12", + "checkedVisits": 0, + "deviationCount": 0, + "passedCount": 0 +} +2026-03-08 19:26:12.933 [aiclinical-backend] info: [HealthScoreEngine] calculate done + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "healthScore": 79.5, + "healthGrade": "B" +} +2026-03-08 19:26:12.933 [aiclinical-backend] info: [QcAggregator] HealthScore refreshed + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "healthScore": 79.5, + "healthGrade": "B" +} +2026-03-08 19:26:12.933 [aiclinical-backend] info: [QcAggregator] aggregateDeferred done + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "eventStatusRows": 37, + "recordSummaryRows": 12, + "durationMs": 43 +} +2026-03-08 19:26:12.933 [aiclinical-backend] info: [QcExecutor] Batch aggregation completed + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "eventStatusRows": 37, + "recordSummaryRows": 12, + "aggDurationMs": 43 +} +2026-03-08 19:26:12.934 [aiclinical-backend] info: [QcExecutor] executeBatch done + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "totalRecordEvents": 37, + "fieldStatusWrites": 1710, + "durationMs": 28659 +} +2026-03-08 19:26:12.934 [aiclinical-backend] info: [DailyQcOrchestrator] Starting orchestration + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c" +} +2026-03-08 19:26:12.935 [aiclinical-backend] info: [QcReportService] Generating new report + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "reportType": "daily" +} +2026-03-08 19:26:13.003 [aiclinical-backend] info: [QcReportService] Report generated + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "reportType": "daily", + "duration": "68ms", + "criticalCount": 167, + "warningCount": 743, + "topIssuesCount": 5, + "groupedRecordCount": 12 +} +2026-03-08 19:26:13.191 [aiclinical-backend] debug: [QcReportService] Report cached + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "reportType": "daily" +} +2026-03-08 19:26:13.395 [aiclinical-backend] info: 📤 发送企业微信 Markdown 消息 + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "userId": "FengZhiBo", + "contentLength": 217 +} +2026-03-08 19:26:13.396 [aiclinical-backend] info: 🔄 请求新的企业微信 Access Token... + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208 +} +2026-03-08 19:26:15.165 [aiclinical-backend] info: ✅ Access Token 获取成功 + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "expiresIn": 7200 +} +2026-03-08 19:26:15.582 [aiclinical-backend] error: ❌ 发送 Markdown 消息失败 + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "errcode": 60020, + "errmsg": "not allow to access from your ip, hint: [1772969175390122294852465], from ip: 154.17.225.224, more info at https://open.work.weixin.qq.com/devtool/query?e=60020" +} +2026-03-08 19:26:15.582 [aiclinical-backend] error: ❌ 发送 Markdown 消息异常 + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "error": "企业微信发送失败: not allow to access from your ip, hint: [1772969175390122294852465], from ip: 154.17.225.224, more info at https://open.work.weixin.qq.com/devtool/query?e=60020 (60020)", + "userId": "FengZhiBo" +} +2026-03-08 19:26:15.582 [aiclinical-backend] warn: [DailyQcOrchestrator] Push notification failed (non-fatal) + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "error": "Error: 企业微信发送失败: not allow to access from your ip, hint: [1772969175390122294852465], from ip: 154.17.225.224, more info at https://open.work.weixin.qq.com/devtool/query?e=60020 (60020)" +} +2026-03-08 19:26:15.583 [aiclinical-backend] info: [DailyQcOrchestrator] Orchestration completed + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "reportId": "836895fe-6799-414a-8a47-013fabd2678b", + "equeriesCreated": 0, + "criticalEventsArchived": 0, + "newIssues": 0, + "resolvedIssues": 0, + "pushSent": false, + "durationMs": 2649 +} +2026-03-08 19:26:15.648 [aiclinical-backend] info: [ToolsService] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "count": 0 +} +2026-03-08 19:26:15.649 [aiclinical-backend] info: [QcReportService] Generating new report + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "reportType": "on_demand" +} +2026-03-08 19:26:15.653 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:26:15.654 [aiclinical-backend] info: [ToolsService] REDCap adapter created + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208 +} +2026-03-08 19:26:15.654 [aiclinical-backend] debug: [ToolsService] Tool registered + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "name": "read_report" +} +2026-03-08 19:26:15.655 [aiclinical-backend] debug: [ToolsService] Tool registered + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "name": "look_up_data" +} +2026-03-08 19:26:15.655 [aiclinical-backend] debug: [ToolsService] Tool registered + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "name": "check_quality" +} +2026-03-08 19:26:15.655 [aiclinical-backend] debug: [ToolsService] Tool registered + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "name": "search_knowledge" +} +2026-03-08 19:26:15.655 [aiclinical-backend] info: [ToolsService] Initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "toolCount": 4 +} +2026-03-08 19:26:15.687 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:26:15.701 [aiclinical-backend] info: [QcReportService] Report generated + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "reportType": "on_demand", + "duration": "52ms", + "criticalCount": 167, + "warningCount": 743, + "topIssuesCount": 5, + "groupedRecordCount": 12 +} +2026-03-08 19:26:15.721 [aiclinical-backend] info: [QcCockpitService] 获取驾驶舱数据成功 + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "totalRecords": 12, + "durationMs": 109 +} +2026-03-08 19:26:15.991 [aiclinical-backend] debug: [QcReportService] Report cached + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "reportType": "on_demand" +} +2026-03-08 19:26:16.045 [aiclinical-backend] debug: [QcReportService] Returning cached report + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "reportType": "on_demand", + "generatedAt": "2026-03-08T19:26:15+08:00" +} +2026-03-08 19:26:16.045 [aiclinical-backend] info: [ToolsService] Tool executed + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 23208, + "toolName": "read_report", + "success": true, + "executionTime": "53ms" +} +{ + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "withChat": false, + "startedAt": "2026-03-08T11:25:42.903Z", + "stages": [ + { + "name": "Stage1_REDCap", + "ok": true, + "checks": [ + { + "name": "metadata_non_empty", + "ok": true, + "value": 74 + }, + { + "name": "records_by_event_non_empty", + "ok": true, + "value": 37 + }, + { + "name": "unique_records_non_empty", + "ok": true, + "value": 12 + }, + { + "name": "events_loaded_or_non_longitudinal", + "ok": true, + "value": { + "events": 5, + "formEventMapping": 19 + } + } + ], + "detail": { + "metadataCount": 74, + "eventCount": 5, + "formEventMappingCount": 19, + "recordEventRows": 37, + "uniqueRecordCount": 12 + } + }, + { + "name": "Stage2_Rules", + "ok": true, + "checks": [ + { + "name": "active_qc_rules_exists", + "ok": true, + "value": 79 + }, + { + "name": "multi_field_rules_exists", + "ok": true, + "value": 29 + }, + { + "name": "has_D1_or_legacy_inclusion_exclusion", + "ok": true, + "value": [ + "D6", + "D3", + "D1", + "D5" + ] + } + ], + "detail": { + "ruleCount": 79, + "multiFieldRuleCount": 29, + "categories": [ + "D1", + "D3", + "D5", + "D6" + ] + } + }, + { + "name": "Stage3_Execution", + "ok": true, + "checks": [ + { + "name": "batch_has_records", + "ok": true, + "value": 12 + }, + { + "name": "field_status_written", + "ok": true, + "value": 1233 + }, + { + "name": "event_status_written", + "ok": true, + "value": 37 + }, + { + "name": "record_summary_written", + "ok": true, + "value": 12 + }, + { + "name": "project_stats_exists", + "ok": true, + "value": true + } + ], + "detail": { + "batch": { + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "totalRecords": 12, + "totalEvents": 37, + "passed": 0, + "failed": 21, + "warnings": 16, + "fieldStatusWrites": 1710, + "executionTimeMs": 28659 + }, + "orchestrate": { + "reportId": "836895fe-6799-414a-8a47-013fabd2678b", + "equeriesCreated": 0, + "criticalEventsArchived": 0, + "newIssues": 0, + "resolvedIssues": 0, + "pushSent": false + }, + "db": { + "fieldStatusCount": 1233, + "eventStatusCount": 37, + "recordSummaryCount": 12, + "projectStats": { + "totalRecords": 12, + "passedRecords": 0, + "failedRecords": 12 + } + } + } + }, + { + "name": "Stage4_Consumption", + "ok": true, + "checks": [ + { + "name": "report_summary_exists", + "ok": true, + "value": 12 + }, + { + "name": "cockpit_stats_exists", + "ok": true, + "value": 12 + }, + { + "name": "equery_log_summary_exists", + "ok": true, + "value": 1115 + }, + { + "name": "pass_rate_consistent_report_cockpit_tool", + "ok": true, + "value": { + "reportPassRate": 0, + "cockpitPassRate": 0, + "toolPassRate": 0 + } + }, + { + "name": "chat_has_conclusion_or_skipped", + "ok": true, + "value": "skipped" + } + ], + "detail": { + "reportPassRate": 0, + "cockpitPassRate": 0, + "toolPassRate": 0, + "chatResult": "skipped" + } + } + ], + "endedAt": "2026-03-08T11:26:16.046Z" +} diff --git a/backend/baseline-e2e-before-unify.json b/backend/baseline-e2e-before-unify.json new file mode 100644 index 00000000..6a74f08f --- /dev/null +++ b/backend/baseline-e2e-before-unify.json @@ -0,0 +1,17006 @@ +[dotenv@17.2.3] injecting env (0) from .env -- tip: 🔑 add access controls to secrets: https://dotenvx.com/ops +[Config] Loaded .env file for development +[JobFactory] Using PgBossQueue (Postgres-Only架构) +[PgBossQueue] Initialized with schema: platform_schema +2026-03-08 19:10:33.141 [aiclinical-backend] info: ✅ 企业微信服务初始化成功 + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "corpId": "ww6ab493470ab4f377", + "agentId": "1000002" +} +2026-03-08 19:10:33.145 [aiclinical-backend] warn: [DifyClient] Dify 已废弃,请使用 pgvector RAG 引擎。Legacy 代码需要迁移到新的 ragService。 + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212 +} +2026-03-08 19:10:33.148 [aiclinical-backend] info: [SessionMemory] 会话记忆管理器已启动 + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "maxHistory": 3, + "timeout": "1小时" +} +2026-03-08 19:10:33.355 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +[PgBossQueue] Started successfully +2026-03-08 19:10:33.876 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "eventCount": 5 +} +2026-03-08 19:10:33.878 [aiclinical-backend] info: REDCap API: exportMetadata success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "fieldCount": 74, + "duration": "522ms" +} +2026-03-08 19:10:34.065 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "eventCount": 5 +} +2026-03-08 19:10:34.065 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 19 +} +2026-03-08 19:10:34.069 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "eventCount": 5 +} +2026-03-08 19:10:34.070 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 19 +} +2026-03-08 19:10:34.782 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 37, + "duration": "716ms" +} +2026-03-08 19:10:34.791 [aiclinical-backend] info: REDCap: getAllRecordsByEvent success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 37, + "eventCount": 5 +} +2026-03-08 19:10:34.798 [aiclinical-backend] info: [QcExecutor] executeBatch start + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "triggeredBy": "manual" +} +2026-03-08 19:10:34.799 [aiclinical-backend] info: [SkillRunner] Starting execution + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "triggerType": "manual", + "options": { + "skipSoftRules": true + } +} +2026-03-08 19:10:34.833 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:10:35.402 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "eventCount": 5 +} +2026-03-08 19:10:35.402 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 19 +} +2026-03-08 19:10:35.741 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 37, + "duration": "339ms" +} +2026-03-08 19:10:35.741 [aiclinical-backend] info: REDCap: getAllRecordsByEvent success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 37, + "eventCount": 5 +} +2026-03-08 19:10:35.757 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:10:35.760 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 0 +} +2026-03-08 19:10:35.761 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_0_hr2q1opmw", + "field": "visiting_date", + "recordId": "1" +} +2026-03-08 19:10:35.761 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_1_sdim7iks9", + "field": [ + "check_date", + "visiting_date" + ], + "recordId": "1" +} +2026-03-08 19:10:35.761 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_3_utmkeahm6", + "field": [ + "date_of_assessment_sf_mpq_scale", + "visiting_date" + ], + "recordId": "1" +} +2026-03-08 19:10:35.761 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_4_3j2aozbms", + "field": [ + "date_of_signature", + "date_of_first_consultation" + ], + "recordId": "1" +} +2026-03-08 19:10:35.761 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_5_ux8721fut", + "field": [ + "enrollment_status", + "sign_informed_consent_form" + ], + "recordId": "1" +} +2026-03-08 19:10:35.761 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_6_res5lvb6g", + "field": [ + "visiting_date", + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.761 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_7_wpzbvli56", + "field": [ + "date_of_first_consultation", + "visiting_date" + ], + "recordId": "1" +} +2026-03-08 19:10:35.761 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_0_424mnnlv0", + "field": "educational_level", + "recordId": "1" +} +2026-03-08 19:10:35.761 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_1_qiy3gde3a", + "field": "marital_status", + "recordId": "1" +} +2026-03-08 19:10:35.761 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_2_hc1jjvymo", + "field": "sex", + "recordId": "1" +} +2026-03-08 19:10:35.762 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_32_a2cxjf9tb", + "field": "sign_informed_consent_form", + "recordId": "1" +} +2026-03-08 19:10:35.762 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_41_eahuliyh0", + "field": "alcohol_consumption_history", + "recordId": "1" +} +2026-03-08 19:10:35.762 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_42_m8cptozxk", + "field": "smoking_history", + "recordId": "1" +} +2026-03-08 19:10:35.762 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_0_96ftk49kx", + "field": [ + "age", + "inclusion_criteria2" + ], + "recordId": "1" +} +2026-03-08 19:10:35.762 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_1_zw7ja89ei", + "field": [ + "sign_informed_consent_form", + "inclusion_criteria5" + ], + "recordId": "1" +} +2026-03-08 19:10:35.762 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_2_44m45t6m6", + "field": "inclusion_criteria1", + "recordId": "1" +} +2026-03-08 19:10:35.762 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_3_zfn62bs40", + "field": "exclusion_criteria2", + "recordId": "1" +} +2026-03-08 19:10:35.762 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_4_vgyy51zou", + "field": "exclusion_criteria3", + "recordId": "1" +} +2026-03-08 19:10:35.762 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_5_pbkwsnx0n", + "field": [ + "exclusion_criteria4", + "inclusion_criteria3" + ], + "recordId": "1" +} +2026-03-08 19:10:35.762 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_6_9ygdecsca", + "field": "exclusion_criteria5", + "recordId": "1" +} +2026-03-08 19:10:35.762 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_7_9sugwpwcf", + "field": "sex", + "recordId": "1" +} +2026-03-08 19:10:35.762 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_8_u079bu08z", + "field": [ + "enrollment_status", + "exclusion_criteria1", + "exclusion_criteria2", + "exclusion_criteria3", + "exclusion_criteria4", + "exclusion_criteria5" + ], + "recordId": "1" +} +2026-03-08 19:10:35.762 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_9_ufkub1swe", + "field": [ + "inclusion_criteria1", + "inclusion_criteria2", + "inclusion_criteria3", + "inclusion_criteria4", + "inclusion_criteria5" + ], + "recordId": "1" +} +2026-03-08 19:10:35.762 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_0_r79gvdu3h", + "field": [ + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.762 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_1_2uns9t23g", + "field": [ + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.762 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_2_os5ccvicv", + "field": [ + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.762 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_3_k2nlyk3q4", + "field": [ + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.762 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_4_8atbe12pb", + "field": [ + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.762 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_5_h62ympca8", + "field": [ + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.762 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_6_0m5vg872v", + "field": [ + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.762 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_7_4rvkpn2sq", + "field": [ + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.762 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_8_7s1fygjji", + "field": [ + "sign_informed_consent_form", + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.762 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_9_qd6pse9gj", + "field": [ + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.762 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_0_2fjs3h1t2", + "field": "visiting_date", + "recordId": "1" +} +2026-03-08 19:10:35.762 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_1_i81le4vme", + "field": [ + "date_of_signature", + "visiting_date" + ], + "recordId": "1" +} +2026-03-08 19:10:35.762 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_3_otk3muqgy", + "field": [ + "date_of_assessment_sf_mpq_scale", + "visiting_date" + ], + "recordId": "1" +} +2026-03-08 19:10:35.762 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_4_3e0g4h3xt", + "field": [ + "check_date", + "visiting_date" + ], + "recordId": "1" +} +2026-03-08 19:10:35.762 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "field": [ + "date_of_first_consultation", + "visiting_date" + ], + "recordId": "1" +} +2026-03-08 19:10:35.762 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_6_eoavacbfk", + "field": [ + "enrollment_status", + "sign_informed_consent_form" + ], + "recordId": "1" +} +2026-03-08 19:10:35.762 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "field": [ + "visiting_date", + "date_of_birth" + ], + "recordId": "1" +} +2026-03-08 19:10:35.770 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:10:35.772 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 0 +} +2026-03-08 19:10:35.772 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_0_hr2q1opmw", + "field": "visiting_date", + "recordId": "1" +} +2026-03-08 19:10:35.772 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_1_sdim7iks9", + "field": [ + "check_date", + "visiting_date" + ], + "recordId": "1" +} +2026-03-08 19:10:35.772 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_3_utmkeahm6", + "field": [ + "date_of_assessment_sf_mpq_scale", + "visiting_date" + ], + "recordId": "1" +} +2026-03-08 19:10:35.772 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_4_3j2aozbms", + "field": [ + "date_of_signature", + "date_of_first_consultation" + ], + "recordId": "1" +} +2026-03-08 19:10:35.772 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_5_ux8721fut", + "field": [ + "enrollment_status", + "sign_informed_consent_form" + ], + "recordId": "1" +} +2026-03-08 19:10:35.772 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_6_res5lvb6g", + "field": [ + "visiting_date", + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.772 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_7_wpzbvli56", + "field": [ + "date_of_first_consultation", + "visiting_date" + ], + "recordId": "1" +} +2026-03-08 19:10:35.772 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_0_424mnnlv0", + "field": "educational_level", + "recordId": "1" +} +2026-03-08 19:10:35.772 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_1_qiy3gde3a", + "field": "marital_status", + "recordId": "1" +} +2026-03-08 19:10:35.772 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_2_hc1jjvymo", + "field": "sex", + "recordId": "1" +} +2026-03-08 19:10:35.772 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_32_a2cxjf9tb", + "field": "sign_informed_consent_form", + "recordId": "1" +} +2026-03-08 19:10:35.772 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_41_eahuliyh0", + "field": "alcohol_consumption_history", + "recordId": "1" +} +2026-03-08 19:10:35.772 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_42_m8cptozxk", + "field": "smoking_history", + "recordId": "1" +} +2026-03-08 19:10:35.772 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_0_96ftk49kx", + "field": [ + "age", + "inclusion_criteria2" + ], + "recordId": "1" +} +2026-03-08 19:10:35.772 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_1_zw7ja89ei", + "field": [ + "sign_informed_consent_form", + "inclusion_criteria5" + ], + "recordId": "1" +} +2026-03-08 19:10:35.772 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_2_44m45t6m6", + "field": "inclusion_criteria1", + "recordId": "1" +} +2026-03-08 19:10:35.772 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_3_zfn62bs40", + "field": "exclusion_criteria2", + "recordId": "1" +} +2026-03-08 19:10:35.772 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_4_vgyy51zou", + "field": "exclusion_criteria3", + "recordId": "1" +} +2026-03-08 19:10:35.772 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_5_pbkwsnx0n", + "field": [ + "exclusion_criteria4", + "inclusion_criteria3" + ], + "recordId": "1" +} +2026-03-08 19:10:35.772 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_6_9ygdecsca", + "field": "exclusion_criteria5", + "recordId": "1" +} +2026-03-08 19:10:35.772 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_7_9sugwpwcf", + "field": "sex", + "recordId": "1" +} +2026-03-08 19:10:35.772 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_8_u079bu08z", + "field": [ + "enrollment_status", + "exclusion_criteria1", + "exclusion_criteria2", + "exclusion_criteria3", + "exclusion_criteria4", + "exclusion_criteria5" + ], + "recordId": "1" +} +2026-03-08 19:10:35.773 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_9_ufkub1swe", + "field": [ + "inclusion_criteria1", + "inclusion_criteria2", + "inclusion_criteria3", + "inclusion_criteria4", + "inclusion_criteria5" + ], + "recordId": "1" +} +2026-03-08 19:10:35.773 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_0_r79gvdu3h", + "field": [ + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.773 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_1_2uns9t23g", + "field": [ + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.773 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_2_os5ccvicv", + "field": [ + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.773 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_3_k2nlyk3q4", + "field": [ + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.773 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_4_8atbe12pb", + "field": [ + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.773 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_5_h62ympca8", + "field": [ + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.773 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_6_0m5vg872v", + "field": [ + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.773 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_7_4rvkpn2sq", + "field": [ + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.773 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_8_7s1fygjji", + "field": [ + "sign_informed_consent_form", + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.773 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_9_qd6pse9gj", + "field": [ + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.773 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_0_2fjs3h1t2", + "field": "visiting_date", + "recordId": "1" +} +2026-03-08 19:10:35.773 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_1_i81le4vme", + "field": [ + "date_of_signature", + "visiting_date" + ], + "recordId": "1" +} +2026-03-08 19:10:35.773 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_3_otk3muqgy", + "field": [ + "date_of_assessment_sf_mpq_scale", + "visiting_date" + ], + "recordId": "1" +} +2026-03-08 19:10:35.773 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_4_3e0g4h3xt", + "field": [ + "check_date", + "visiting_date" + ], + "recordId": "1" +} +2026-03-08 19:10:35.773 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "field": [ + "date_of_first_consultation", + "visiting_date" + ], + "recordId": "1" +} +2026-03-08 19:10:35.773 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_6_eoavacbfk", + "field": [ + "enrollment_status", + "sign_informed_consent_form" + ], + "recordId": "1" +} +2026-03-08 19:10:35.773 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "field": [ + "visiting_date", + "date_of_birth" + ], + "recordId": "1" +} +2026-03-08 19:10:35.779 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:10:35.780 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 0 +} +2026-03-08 19:10:35.780 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_0_hr2q1opmw", + "field": "visiting_date", + "recordId": "1" +} +2026-03-08 19:10:35.780 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_1_sdim7iks9", + "field": [ + "check_date", + "visiting_date" + ], + "recordId": "1" +} +2026-03-08 19:10:35.780 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_0_2fjs3h1t2", + "field": "visiting_date", + "recordId": "1" +} +2026-03-08 19:10:35.781 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.781 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_4_3e0g4h3xt", + "field": [ + "check_date", + "visiting_date" + ], + "recordId": "1" +} +2026-03-08 19:10:35.781 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.781 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.789 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:10:35.791 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 0 +} +2026-03-08 19:10:35.791 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_0_hr2q1opmw", + "field": "visiting_date", + "recordId": "1" +} +2026-03-08 19:10:35.791 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_1_sdim7iks9", + "field": [ + "check_date", + "visiting_date" + ], + "recordId": "1" +} +2026-03-08 19:10:35.791 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_4_3j2aozbms", + "field": [ + "date_of_signature", + "date_of_first_consultation" + ], + "recordId": "1" +} +2026-03-08 19:10:35.791 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_5_ux8721fut", + "field": [ + "enrollment_status", + "sign_informed_consent_form" + ], + "recordId": "1" +} +2026-03-08 19:10:35.791 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_6_res5lvb6g", + "field": [ + "visiting_date", + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.791 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_7_wpzbvli56", + "field": [ + "date_of_first_consultation", + "visiting_date" + ], + "recordId": "1" +} +2026-03-08 19:10:35.791 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_0_424mnnlv0", + "field": "educational_level", + "recordId": "1" +} +2026-03-08 19:10:35.791 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_1_qiy3gde3a", + "field": "marital_status", + "recordId": "1" +} +2026-03-08 19:10:35.791 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_2_hc1jjvymo", + "field": "sex", + "recordId": "1" +} +2026-03-08 19:10:35.791 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_32_a2cxjf9tb", + "field": "sign_informed_consent_form", + "recordId": "1" +} +2026-03-08 19:10:35.791 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_41_eahuliyh0", + "field": "alcohol_consumption_history", + "recordId": "1" +} +2026-03-08 19:10:35.791 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_42_m8cptozxk", + "field": "smoking_history", + "recordId": "1" +} +2026-03-08 19:10:35.791 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_0_96ftk49kx", + "field": [ + "age", + "inclusion_criteria2" + ], + "recordId": "1" +} +2026-03-08 19:10:35.791 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_1_zw7ja89ei", + "field": [ + "sign_informed_consent_form", + "inclusion_criteria5" + ], + "recordId": "1" +} +2026-03-08 19:10:35.791 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_2_44m45t6m6", + "field": "inclusion_criteria1", + "recordId": "1" +} +2026-03-08 19:10:35.791 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_3_zfn62bs40", + "field": "exclusion_criteria2", + "recordId": "1" +} +2026-03-08 19:10:35.791 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_4_vgyy51zou", + "field": "exclusion_criteria3", + "recordId": "1" +} +2026-03-08 19:10:35.791 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_5_pbkwsnx0n", + "field": [ + "exclusion_criteria4", + "inclusion_criteria3" + ], + "recordId": "1" +} +2026-03-08 19:10:35.792 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_6_9ygdecsca", + "field": "exclusion_criteria5", + "recordId": "1" +} +2026-03-08 19:10:35.792 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_7_9sugwpwcf", + "field": "sex", + "recordId": "1" +} +2026-03-08 19:10:35.792 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_8_u079bu08z", + "field": [ + "enrollment_status", + "exclusion_criteria1", + "exclusion_criteria2", + "exclusion_criteria3", + "exclusion_criteria4", + "exclusion_criteria5" + ], + "recordId": "1" +} +2026-03-08 19:10:35.792 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_9_ufkub1swe", + "field": [ + "inclusion_criteria1", + "inclusion_criteria2", + "inclusion_criteria3", + "inclusion_criteria4", + "inclusion_criteria5" + ], + "recordId": "1" +} +2026-03-08 19:10:35.792 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_0_r79gvdu3h", + "field": [ + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.792 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_1_2uns9t23g", + "field": [ + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.792 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_2_os5ccvicv", + "field": [ + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.792 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_3_k2nlyk3q4", + "field": [ + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.792 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_4_8atbe12pb", + "field": [ + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.792 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_5_h62ympca8", + "field": [ + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.792 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_6_0m5vg872v", + "field": [ + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.792 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_7_4rvkpn2sq", + "field": [ + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.792 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_8_7s1fygjji", + "field": [ + "sign_informed_consent_form", + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.792 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_9_qd6pse9gj", + "field": [ + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.792 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_0_2fjs3h1t2", + "field": "visiting_date", + "recordId": "1" +} +2026-03-08 19:10:35.792 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_1_i81le4vme", + "field": [ + "date_of_signature", + "visiting_date" + ], + "recordId": "1" +} +2026-03-08 19:10:35.792 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_4_3e0g4h3xt", + "field": [ + "check_date", + "visiting_date" + ], + "recordId": "1" +} +2026-03-08 19:10:35.792 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "field": [ + "date_of_first_consultation", + "visiting_date" + ], + "recordId": "1" +} +2026-03-08 19:10:35.792 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_6_eoavacbfk", + "field": [ + "enrollment_status", + "sign_informed_consent_form" + ], + "recordId": "1" +} +2026-03-08 19:10:35.792 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "field": [ + "visiting_date", + "date_of_birth" + ], + "recordId": "1" +} +2026-03-08 19:10:35.798 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:10:35.799 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 0 +} +2026-03-08 19:10:35.799 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_0_hr2q1opmw", + "field": "visiting_date", + "recordId": "1" +} +2026-03-08 19:10:35.799 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_1_sdim7iks9", + "field": [ + "check_date", + "visiting_date" + ], + "recordId": "1" +} +2026-03-08 19:10:35.800 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_4_3j2aozbms", + "field": [ + "date_of_signature", + "date_of_first_consultation" + ], + "recordId": "1" +} +2026-03-08 19:10:35.800 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_5_ux8721fut", + "field": [ + "enrollment_status", + "sign_informed_consent_form" + ], + "recordId": "1" +} +2026-03-08 19:10:35.800 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_6_res5lvb6g", + "field": [ + "visiting_date", + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.800 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_7_wpzbvli56", + "field": [ + "date_of_first_consultation", + "visiting_date" + ], + "recordId": "1" +} +2026-03-08 19:10:35.800 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_0_424mnnlv0", + "field": "educational_level", + "recordId": "1" +} +2026-03-08 19:10:35.800 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_1_qiy3gde3a", + "field": "marital_status", + "recordId": "1" +} +2026-03-08 19:10:35.800 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_2_hc1jjvymo", + "field": "sex", + "recordId": "1" +} +2026-03-08 19:10:35.800 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_32_a2cxjf9tb", + "field": "sign_informed_consent_form", + "recordId": "1" +} +2026-03-08 19:10:35.800 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_41_eahuliyh0", + "field": "alcohol_consumption_history", + "recordId": "1" +} +2026-03-08 19:10:35.800 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_42_m8cptozxk", + "field": "smoking_history", + "recordId": "1" +} +2026-03-08 19:10:35.800 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_0_96ftk49kx", + "field": [ + "age", + "inclusion_criteria2" + ], + "recordId": "1" +} +2026-03-08 19:10:35.800 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_1_zw7ja89ei", + "field": [ + "sign_informed_consent_form", + "inclusion_criteria5" + ], + "recordId": "1" +} +2026-03-08 19:10:35.800 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_2_44m45t6m6", + "field": "inclusion_criteria1", + "recordId": "1" +} +2026-03-08 19:10:35.800 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_3_zfn62bs40", + "field": "exclusion_criteria2", + "recordId": "1" +} +2026-03-08 19:10:35.800 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_4_vgyy51zou", + "field": "exclusion_criteria3", + "recordId": "1" +} +2026-03-08 19:10:35.800 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_5_pbkwsnx0n", + "field": [ + "exclusion_criteria4", + "inclusion_criteria3" + ], + "recordId": "1" +} +2026-03-08 19:10:35.800 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_6_9ygdecsca", + "field": "exclusion_criteria5", + "recordId": "1" +} +2026-03-08 19:10:35.800 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_7_9sugwpwcf", + "field": "sex", + "recordId": "1" +} +2026-03-08 19:10:35.800 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_8_u079bu08z", + "field": [ + "enrollment_status", + "exclusion_criteria1", + "exclusion_criteria2", + "exclusion_criteria3", + "exclusion_criteria4", + "exclusion_criteria5" + ], + "recordId": "1" +} +2026-03-08 19:10:35.800 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_9_ufkub1swe", + "field": [ + "inclusion_criteria1", + "inclusion_criteria2", + "inclusion_criteria3", + "inclusion_criteria4", + "inclusion_criteria5" + ], + "recordId": "1" +} +2026-03-08 19:10:35.800 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_0_r79gvdu3h", + "field": [ + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.800 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_1_2uns9t23g", + "field": [ + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.800 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_2_os5ccvicv", + "field": [ + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.800 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_3_k2nlyk3q4", + "field": [ + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.800 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_4_8atbe12pb", + "field": [ + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.800 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_5_h62ympca8", + "field": [ + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.800 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_6_0m5vg872v", + "field": [ + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.800 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_7_4rvkpn2sq", + "field": [ + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.800 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_8_7s1fygjji", + "field": [ + "sign_informed_consent_form", + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.800 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_9_qd6pse9gj", + "field": [ + "date_of_signature" + ], + "recordId": "1" +} +2026-03-08 19:10:35.800 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_0_2fjs3h1t2", + "field": "visiting_date", + "recordId": "1" +} +2026-03-08 19:10:35.800 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_1_i81le4vme", + "field": [ + "date_of_signature", + "visiting_date" + ], + "recordId": "1" +} +2026-03-08 19:10:35.800 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_4_3e0g4h3xt", + "field": [ + "check_date", + "visiting_date" + ], + "recordId": "1" +} +2026-03-08 19:10:35.800 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "field": [ + "date_of_first_consultation", + "visiting_date" + ], + "recordId": "1" +} +2026-03-08 19:10:35.800 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_6_eoavacbfk", + "field": [ + "enrollment_status", + "sign_informed_consent_form" + ], + "recordId": "1" +} +2026-03-08 19:10:35.800 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "field": [ + "visiting_date", + "date_of_birth" + ], + "recordId": "1" +} +2026-03-08 19:10:35.806 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:10:35.808 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 0 +} +2026-03-08 19:10:35.808 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_0_hr2q1opmw", + "field": "visiting_date", + "recordId": "2" +} +2026-03-08 19:10:35.808 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_1_sdim7iks9", + "field": [ + "check_date", + "visiting_date" + ], + "recordId": "2" +} +2026-03-08 19:10:35.808 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_2_1r0huss46", + "field": [ + "date_of_assessment_cmss", + "visiting_date" + ], + "recordId": "2" +} +2026-03-08 19:10:35.808 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_3_utmkeahm6", + "field": [ + "date_of_assessment_sf_mpq_scale", + "visiting_date" + ], + "recordId": "2" +} +2026-03-08 19:10:35.808 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_4_3j2aozbms", + "field": [ + "date_of_signature", + "date_of_first_consultation" + ], + "recordId": "2" +} +2026-03-08 19:10:35.808 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_5_ux8721fut", + "field": [ + "enrollment_status", + "sign_informed_consent_form" + ], + "recordId": "2" +} +2026-03-08 19:10:35.808 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_6_res5lvb6g", + "field": [ + "visiting_date", + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.808 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_7_wpzbvli56", + "field": [ + "date_of_first_consultation", + "visiting_date" + ], + "recordId": "2" +} +2026-03-08 19:10:35.808 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_0_424mnnlv0", + "field": "educational_level", + "recordId": "2" +} +2026-03-08 19:10:35.808 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_1_qiy3gde3a", + "field": "marital_status", + "recordId": "2" +} +2026-03-08 19:10:35.808 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_2_hc1jjvymo", + "field": "sex", + "recordId": "2" +} +2026-03-08 19:10:35.808 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_3_delac4edo", + "field": "absolute_value_of_basophilic_cells", + "recordId": "2" +} +2026-03-08 19:10:35.808 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_4_8tcnwi9gg", + "field": "absolute_value_of_lymphocytes", + "recordId": "2" +} +2026-03-08 19:10:35.808 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_5_4k7227d38", + "field": "absolute_value_of_monocytes", + "recordId": "2" +} +2026-03-08 19:10:35.808 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_6_2e6slhi9p", + "field": "absolute_value_of_neutrophils", + "recordId": "2" +} +2026-03-08 19:10:35.808 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_7_u8z0d18gb", + "field": "eosinophil_absolute_count", + "recordId": "2" +} +2026-03-08 19:10:35.808 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_8_hculwqhyk", + "field": "eosinophil_count_ratio", + "recordId": "2" +} +2026-03-08 19:10:35.808 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_9_ftk4426nd", + "field": "eosinophil_countratio", + "recordId": "2" +} +2026-03-08 19:10:35.808 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_10_vcciaxxuk", + "field": "hematocrit", + "recordId": "2" +} +2026-03-08 19:10:35.808 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_11_tk5gliucf", + "field": "hemoglobin", + "recordId": "2" +} +2026-03-08 19:10:35.808 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_12_abhqvjmg5", + "field": "high_platelet_ratio", + "recordId": "2" +} +2026-03-08 19:10:35.808 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_13_p8j624iv2", + "field": "mean_corpuscular_volume", + "recordId": "2" +} +2026-03-08 19:10:35.808 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_14_rwum2cw2u", + "field": "mean_hemoglobin_concentratin", + "recordId": "2" +} +2026-03-08 19:10:35.808 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_15_f056yvtme", + "field": "mean_hemoglobin_concentration", + "recordId": "2" +} +2026-03-08 19:10:35.808 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_16_5o2al7oyz", + "field": "mean_platelet_volume", + "recordId": "2" +} +2026-03-08 19:10:35.808 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_17_zcd5zxn3u", + "field": "platelet_count", + "recordId": "2" +} +2026-03-08 19:10:35.808 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_18_skojo7cru", + "field": "platelet_volume", + "recordId": "2" +} +2026-03-08 19:10:35.808 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_19_5iin73wva", + "field": "platelet_volume_distribution_width", + "recordId": "2" +} +2026-03-08 19:10:35.808 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_20_4lxpihy8o", + "field": "rbc_volume_distribution_width_cv", + "recordId": "2" +} +2026-03-08 19:10:35.808 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_21_gl7d8n5si", + "field": "rbc_volume_distribution_width_sd", + "recordId": "2" +} +2026-03-08 19:10:35.808 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_22_1fnjktj7v", + "field": "red_blood_cell_count", + "recordId": "2" +} +2026-03-08 19:10:35.808 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_23_zrt2ixskp", + "field": "relative_value_of_lymphocytes", + "recordId": "2" +} +2026-03-08 19:10:35.809 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_24_a5oovpadb", + "field": "relative_value_of_monocytes", + "recordId": "2" +} +2026-03-08 19:10:35.809 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_25_rr9uk1but", + "field": "relative_value_of_neutrophils", + "recordId": "2" +} +2026-03-08 19:10:35.809 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_26_f9hez0b4k", + "field": "white_blood_cell_count", + "recordId": "2" +} +2026-03-08 19:10:35.809 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_32_a2cxjf9tb", + "field": "sign_informed_consent_form", + "recordId": "2" +} +2026-03-08 19:10:35.809 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_41_eahuliyh0", + "field": "alcohol_consumption_history", + "recordId": "2" +} +2026-03-08 19:10:35.809 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_42_m8cptozxk", + "field": "smoking_history", + "recordId": "2" +} +2026-03-08 19:10:35.809 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_0_96ftk49kx", + "field": [ + "age", + "inclusion_criteria2" + ], + "recordId": "2" +} +2026-03-08 19:10:35.809 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_1_zw7ja89ei", + "field": [ + "sign_informed_consent_form", + "inclusion_criteria5" + ], + "recordId": "2" +} +2026-03-08 19:10:35.809 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_2_44m45t6m6", + "field": "inclusion_criteria1", + "recordId": "2" +} +2026-03-08 19:10:35.809 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_3_zfn62bs40", + "field": "exclusion_criteria2", + "recordId": "2" +} +2026-03-08 19:10:35.809 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_4_vgyy51zou", + "field": "exclusion_criteria3", + "recordId": "2" +} +2026-03-08 19:10:35.809 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_5_pbkwsnx0n", + "field": [ + "exclusion_criteria4", + "inclusion_criteria3" + ], + "recordId": "2" +} +2026-03-08 19:10:35.809 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_6_9ygdecsca", + "field": "exclusion_criteria5", + "recordId": "2" +} +2026-03-08 19:10:35.809 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_7_9sugwpwcf", + "field": "sex", + "recordId": "2" +} +2026-03-08 19:10:35.809 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_8_u079bu08z", + "field": [ + "enrollment_status", + "exclusion_criteria1", + "exclusion_criteria2", + "exclusion_criteria3", + "exclusion_criteria4", + "exclusion_criteria5" + ], + "recordId": "2" +} +2026-03-08 19:10:35.809 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_9_ufkub1swe", + "field": [ + "inclusion_criteria1", + "inclusion_criteria2", + "inclusion_criteria3", + "inclusion_criteria4", + "inclusion_criteria5" + ], + "recordId": "2" +} +2026-03-08 19:10:35.809 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_0_r79gvdu3h", + "field": [ + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.809 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_1_2uns9t23g", + "field": [ + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.809 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_2_os5ccvicv", + "field": [ + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.809 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_3_k2nlyk3q4", + "field": [ + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.809 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_4_8atbe12pb", + "field": [ + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.809 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_5_h62ympca8", + "field": [ + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.809 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_6_0m5vg872v", + "field": [ + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.809 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_7_4rvkpn2sq", + "field": [ + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.809 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_8_7s1fygjji", + "field": [ + "sign_informed_consent_form", + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.809 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_9_qd6pse9gj", + "field": [ + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.809 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_0_2fjs3h1t2", + "field": "visiting_date", + "recordId": "2" +} +2026-03-08 19:10:35.809 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_1_i81le4vme", + "field": [ + "date_of_signature", + "visiting_date" + ], + "recordId": "2" +} +2026-03-08 19:10:35.809 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_2_a8k2wend3", + "field": [ + "date_of_assessment_cmss", + "visiting_date" + ], + "recordId": "2" +} +2026-03-08 19:10:35.809 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_3_otk3muqgy", + "field": [ + "date_of_assessment_sf_mpq_scale", + "visiting_date" + ], + "recordId": "2" +} +2026-03-08 19:10:35.809 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_4_3e0g4h3xt", + "field": [ + "check_date", + "visiting_date" + ], + "recordId": "2" +} +2026-03-08 19:10:35.809 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "field": [ + "date_of_first_consultation", + "visiting_date" + ], + "recordId": "2" +} +2026-03-08 19:10:35.809 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_6_eoavacbfk", + "field": [ + "enrollment_status", + "sign_informed_consent_form" + ], + "recordId": "2" +} +2026-03-08 19:10:35.809 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "field": [ + "visiting_date", + "date_of_birth" + ], + "recordId": "2" +} +2026-03-08 19:10:35.814 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:10:35.816 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 0 +} +2026-03-08 19:10:35.816 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_0_hr2q1opmw", + "field": "visiting_date", + "recordId": "2" +} +2026-03-08 19:10:35.816 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_1_sdim7iks9", + "field": [ + "check_date", + "visiting_date" + ], + "recordId": "2" +} +2026-03-08 19:10:35.816 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_2_1r0huss46", + "field": [ + "date_of_assessment_cmss", + "visiting_date" + ], + "recordId": "2" +} +2026-03-08 19:10:35.816 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_3_utmkeahm6", + "field": [ + "date_of_assessment_sf_mpq_scale", + "visiting_date" + ], + "recordId": "2" +} +2026-03-08 19:10:35.816 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_4_3j2aozbms", + "field": [ + "date_of_signature", + "date_of_first_consultation" + ], + "recordId": "2" +} +2026-03-08 19:10:35.816 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_5_ux8721fut", + "field": [ + "enrollment_status", + "sign_informed_consent_form" + ], + "recordId": "2" +} +2026-03-08 19:10:35.816 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_6_res5lvb6g", + "field": [ + "visiting_date", + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.816 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_7_wpzbvli56", + "field": [ + "date_of_first_consultation", + "visiting_date" + ], + "recordId": "2" +} +2026-03-08 19:10:35.816 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_0_424mnnlv0", + "field": "educational_level", + "recordId": "2" +} +2026-03-08 19:10:35.816 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_1_qiy3gde3a", + "field": "marital_status", + "recordId": "2" +} +2026-03-08 19:10:35.816 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_2_hc1jjvymo", + "field": "sex", + "recordId": "2" +} +2026-03-08 19:10:35.816 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_3_delac4edo", + "field": "absolute_value_of_basophilic_cells", + "recordId": "2" +} +2026-03-08 19:10:35.816 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_4_8tcnwi9gg", + "field": "absolute_value_of_lymphocytes", + "recordId": "2" +} +2026-03-08 19:10:35.816 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_5_4k7227d38", + "field": "absolute_value_of_monocytes", + "recordId": "2" +} +2026-03-08 19:10:35.816 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_6_2e6slhi9p", + "field": "absolute_value_of_neutrophils", + "recordId": "2" +} +2026-03-08 19:10:35.816 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_7_u8z0d18gb", + "field": "eosinophil_absolute_count", + "recordId": "2" +} +2026-03-08 19:10:35.816 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_8_hculwqhyk", + "field": "eosinophil_count_ratio", + "recordId": "2" +} +2026-03-08 19:10:35.816 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_9_ftk4426nd", + "field": "eosinophil_countratio", + "recordId": "2" +} +2026-03-08 19:10:35.816 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_10_vcciaxxuk", + "field": "hematocrit", + "recordId": "2" +} +2026-03-08 19:10:35.816 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_11_tk5gliucf", + "field": "hemoglobin", + "recordId": "2" +} +2026-03-08 19:10:35.816 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_12_abhqvjmg5", + "field": "high_platelet_ratio", + "recordId": "2" +} +2026-03-08 19:10:35.816 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_13_p8j624iv2", + "field": "mean_corpuscular_volume", + "recordId": "2" +} +2026-03-08 19:10:35.816 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_14_rwum2cw2u", + "field": "mean_hemoglobin_concentratin", + "recordId": "2" +} +2026-03-08 19:10:35.816 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_15_f056yvtme", + "field": "mean_hemoglobin_concentration", + "recordId": "2" +} +2026-03-08 19:10:35.816 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_16_5o2al7oyz", + "field": "mean_platelet_volume", + "recordId": "2" +} +2026-03-08 19:10:35.816 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_17_zcd5zxn3u", + "field": "platelet_count", + "recordId": "2" +} +2026-03-08 19:10:35.816 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_18_skojo7cru", + "field": "platelet_volume", + "recordId": "2" +} +2026-03-08 19:10:35.816 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_19_5iin73wva", + "field": "platelet_volume_distribution_width", + "recordId": "2" +} +2026-03-08 19:10:35.816 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_20_4lxpihy8o", + "field": "rbc_volume_distribution_width_cv", + "recordId": "2" +} +2026-03-08 19:10:35.816 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_21_gl7d8n5si", + "field": "rbc_volume_distribution_width_sd", + "recordId": "2" +} +2026-03-08 19:10:35.816 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_22_1fnjktj7v", + "field": "red_blood_cell_count", + "recordId": "2" +} +2026-03-08 19:10:35.816 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_23_zrt2ixskp", + "field": "relative_value_of_lymphocytes", + "recordId": "2" +} +2026-03-08 19:10:35.816 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_24_a5oovpadb", + "field": "relative_value_of_monocytes", + "recordId": "2" +} +2026-03-08 19:10:35.816 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_25_rr9uk1but", + "field": "relative_value_of_neutrophils", + "recordId": "2" +} +2026-03-08 19:10:35.816 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_26_f9hez0b4k", + "field": "white_blood_cell_count", + "recordId": "2" +} +2026-03-08 19:10:35.816 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_32_a2cxjf9tb", + "field": "sign_informed_consent_form", + "recordId": "2" +} +2026-03-08 19:10:35.816 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_41_eahuliyh0", + "field": "alcohol_consumption_history", + "recordId": "2" +} +2026-03-08 19:10:35.816 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_42_m8cptozxk", + "field": "smoking_history", + "recordId": "2" +} +2026-03-08 19:10:35.816 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_0_96ftk49kx", + "field": [ + "age", + "inclusion_criteria2" + ], + "recordId": "2" +} +2026-03-08 19:10:35.816 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_1_zw7ja89ei", + "field": [ + "sign_informed_consent_form", + "inclusion_criteria5" + ], + "recordId": "2" +} +2026-03-08 19:10:35.817 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_2_44m45t6m6", + "field": "inclusion_criteria1", + "recordId": "2" +} +2026-03-08 19:10:35.817 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_3_zfn62bs40", + "field": "exclusion_criteria2", + "recordId": "2" +} +2026-03-08 19:10:35.817 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_4_vgyy51zou", + "field": "exclusion_criteria3", + "recordId": "2" +} +2026-03-08 19:10:35.817 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_5_pbkwsnx0n", + "field": [ + "exclusion_criteria4", + "inclusion_criteria3" + ], + "recordId": "2" +} +2026-03-08 19:10:35.817 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_6_9ygdecsca", + "field": "exclusion_criteria5", + "recordId": "2" +} +2026-03-08 19:10:35.817 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_7_9sugwpwcf", + "field": "sex", + "recordId": "2" +} +2026-03-08 19:10:35.817 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_8_u079bu08z", + "field": [ + "enrollment_status", + "exclusion_criteria1", + "exclusion_criteria2", + "exclusion_criteria3", + "exclusion_criteria4", + "exclusion_criteria5" + ], + "recordId": "2" +} +2026-03-08 19:10:35.817 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_9_ufkub1swe", + "field": [ + "inclusion_criteria1", + "inclusion_criteria2", + "inclusion_criteria3", + "inclusion_criteria4", + "inclusion_criteria5" + ], + "recordId": "2" +} +2026-03-08 19:10:35.817 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_0_r79gvdu3h", + "field": [ + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.817 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_1_2uns9t23g", + "field": [ + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.817 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_2_os5ccvicv", + "field": [ + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.817 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_3_k2nlyk3q4", + "field": [ + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.817 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_4_8atbe12pb", + "field": [ + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.817 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_5_h62ympca8", + "field": [ + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.817 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_6_0m5vg872v", + "field": [ + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.817 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_7_4rvkpn2sq", + "field": [ + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.817 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_8_7s1fygjji", + "field": [ + "sign_informed_consent_form", + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.817 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_9_qd6pse9gj", + "field": [ + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.817 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_0_2fjs3h1t2", + "field": "visiting_date", + "recordId": "2" +} +2026-03-08 19:10:35.817 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_1_i81le4vme", + "field": [ + "date_of_signature", + "visiting_date" + ], + "recordId": "2" +} +2026-03-08 19:10:35.817 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_2_a8k2wend3", + "field": [ + "date_of_assessment_cmss", + "visiting_date" + ], + "recordId": "2" +} +2026-03-08 19:10:35.817 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_3_otk3muqgy", + "field": [ + "date_of_assessment_sf_mpq_scale", + "visiting_date" + ], + "recordId": "2" +} +2026-03-08 19:10:35.817 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_4_3e0g4h3xt", + "field": [ + "check_date", + "visiting_date" + ], + "recordId": "2" +} +2026-03-08 19:10:35.817 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "field": [ + "date_of_first_consultation", + "visiting_date" + ], + "recordId": "2" +} +2026-03-08 19:10:35.817 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_6_eoavacbfk", + "field": [ + "enrollment_status", + "sign_informed_consent_form" + ], + "recordId": "2" +} +2026-03-08 19:10:35.817 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "field": [ + "visiting_date", + "date_of_birth" + ], + "recordId": "2" +} +2026-03-08 19:10:35.821 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:10:35.823 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 0 +} +2026-03-08 19:10:35.823 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_3_delac4edo", + "field": "absolute_value_of_basophilic_cells", + "recordId": "2" +} +2026-03-08 19:10:35.823 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_4_8tcnwi9gg", + "field": "absolute_value_of_lymphocytes", + "recordId": "2" +} +2026-03-08 19:10:35.823 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_5_4k7227d38", + "field": "absolute_value_of_monocytes", + "recordId": "2" +} +2026-03-08 19:10:35.823 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_6_2e6slhi9p", + "field": "absolute_value_of_neutrophils", + "recordId": "2" +} +2026-03-08 19:10:35.823 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_7_u8z0d18gb", + "field": "eosinophil_absolute_count", + "recordId": "2" +} +2026-03-08 19:10:35.823 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_8_hculwqhyk", + "field": "eosinophil_count_ratio", + "recordId": "2" +} +2026-03-08 19:10:35.823 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_9_ftk4426nd", + "field": "eosinophil_countratio", + "recordId": "2" +} +2026-03-08 19:10:35.823 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_10_vcciaxxuk", + "field": "hematocrit", + "recordId": "2" +} +2026-03-08 19:10:35.823 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_11_tk5gliucf", + "field": "hemoglobin", + "recordId": "2" +} +2026-03-08 19:10:35.823 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_12_abhqvjmg5", + "field": "high_platelet_ratio", + "recordId": "2" +} +2026-03-08 19:10:35.823 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_13_p8j624iv2", + "field": "mean_corpuscular_volume", + "recordId": "2" +} +2026-03-08 19:10:35.823 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_14_rwum2cw2u", + "field": "mean_hemoglobin_concentratin", + "recordId": "2" +} +2026-03-08 19:10:35.823 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_15_f056yvtme", + "field": "mean_hemoglobin_concentration", + "recordId": "2" +} +2026-03-08 19:10:35.823 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_16_5o2al7oyz", + "field": "mean_platelet_volume", + "recordId": "2" +} +2026-03-08 19:10:35.823 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_17_zcd5zxn3u", + "field": "platelet_count", + "recordId": "2" +} +2026-03-08 19:10:35.823 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_18_skojo7cru", + "field": "platelet_volume", + "recordId": "2" +} +2026-03-08 19:10:35.823 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_19_5iin73wva", + "field": "platelet_volume_distribution_width", + "recordId": "2" +} +2026-03-08 19:10:35.823 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_20_4lxpihy8o", + "field": "rbc_volume_distribution_width_cv", + "recordId": "2" +} +2026-03-08 19:10:35.823 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_21_gl7d8n5si", + "field": "rbc_volume_distribution_width_sd", + "recordId": "2" +} +2026-03-08 19:10:35.823 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_22_1fnjktj7v", + "field": "red_blood_cell_count", + "recordId": "2" +} +2026-03-08 19:10:35.823 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_23_zrt2ixskp", + "field": "relative_value_of_lymphocytes", + "recordId": "2" +} +2026-03-08 19:10:35.823 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_24_a5oovpadb", + "field": "relative_value_of_monocytes", + "recordId": "2" +} +2026-03-08 19:10:35.823 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_25_rr9uk1but", + "field": "relative_value_of_neutrophils", + "recordId": "2" +} +2026-03-08 19:10:35.823 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_26_f9hez0b4k", + "field": "white_blood_cell_count", + "recordId": "2" +} +2026-03-08 19:10:35.824 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.824 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.824 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.831 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:10:35.832 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 0 +} +2026-03-08 19:10:35.832 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_0_hr2q1opmw", + "field": "visiting_date", + "recordId": "2" +} +2026-03-08 19:10:35.832 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_1_sdim7iks9", + "field": [ + "check_date", + "visiting_date" + ], + "recordId": "2" +} +2026-03-08 19:10:35.832 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_2_1r0huss46", + "field": [ + "date_of_assessment_cmss", + "visiting_date" + ], + "recordId": "2" +} +2026-03-08 19:10:35.832 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_3_utmkeahm6", + "field": [ + "date_of_assessment_sf_mpq_scale", + "visiting_date" + ], + "recordId": "2" +} +2026-03-08 19:10:35.832 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_4_3j2aozbms", + "field": [ + "date_of_signature", + "date_of_first_consultation" + ], + "recordId": "2" +} +2026-03-08 19:10:35.832 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_5_ux8721fut", + "field": [ + "enrollment_status", + "sign_informed_consent_form" + ], + "recordId": "2" +} +2026-03-08 19:10:35.832 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_6_res5lvb6g", + "field": [ + "visiting_date", + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.832 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_7_wpzbvli56", + "field": [ + "date_of_first_consultation", + "visiting_date" + ], + "recordId": "2" +} +2026-03-08 19:10:35.832 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_0_424mnnlv0", + "field": "educational_level", + "recordId": "2" +} +2026-03-08 19:10:35.832 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_1_qiy3gde3a", + "field": "marital_status", + "recordId": "2" +} +2026-03-08 19:10:35.832 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_2_hc1jjvymo", + "field": "sex", + "recordId": "2" +} +2026-03-08 19:10:35.832 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_3_delac4edo", + "field": "absolute_value_of_basophilic_cells", + "recordId": "2" +} +2026-03-08 19:10:35.833 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_4_8tcnwi9gg", + "field": "absolute_value_of_lymphocytes", + "recordId": "2" +} +2026-03-08 19:10:35.833 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_5_4k7227d38", + "field": "absolute_value_of_monocytes", + "recordId": "2" +} +2026-03-08 19:10:35.833 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_6_2e6slhi9p", + "field": "absolute_value_of_neutrophils", + "recordId": "2" +} +2026-03-08 19:10:35.833 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_7_u8z0d18gb", + "field": "eosinophil_absolute_count", + "recordId": "2" +} +2026-03-08 19:10:35.833 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_8_hculwqhyk", + "field": "eosinophil_count_ratio", + "recordId": "2" +} +2026-03-08 19:10:35.833 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_9_ftk4426nd", + "field": "eosinophil_countratio", + "recordId": "2" +} +2026-03-08 19:10:35.833 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_10_vcciaxxuk", + "field": "hematocrit", + "recordId": "2" +} +2026-03-08 19:10:35.833 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_11_tk5gliucf", + "field": "hemoglobin", + "recordId": "2" +} +2026-03-08 19:10:35.833 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_12_abhqvjmg5", + "field": "high_platelet_ratio", + "recordId": "2" +} +2026-03-08 19:10:35.833 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_13_p8j624iv2", + "field": "mean_corpuscular_volume", + "recordId": "2" +} +2026-03-08 19:10:35.833 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_14_rwum2cw2u", + "field": "mean_hemoglobin_concentratin", + "recordId": "2" +} +2026-03-08 19:10:35.833 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_15_f056yvtme", + "field": "mean_hemoglobin_concentration", + "recordId": "2" +} +2026-03-08 19:10:35.833 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_16_5o2al7oyz", + "field": "mean_platelet_volume", + "recordId": "2" +} +2026-03-08 19:10:35.833 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_17_zcd5zxn3u", + "field": "platelet_count", + "recordId": "2" +} +2026-03-08 19:10:35.833 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_18_skojo7cru", + "field": "platelet_volume", + "recordId": "2" +} +2026-03-08 19:10:35.833 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_19_5iin73wva", + "field": "platelet_volume_distribution_width", + "recordId": "2" +} +2026-03-08 19:10:35.834 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_20_4lxpihy8o", + "field": "rbc_volume_distribution_width_cv", + "recordId": "2" +} +2026-03-08 19:10:35.834 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_21_gl7d8n5si", + "field": "rbc_volume_distribution_width_sd", + "recordId": "2" +} +2026-03-08 19:10:35.834 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_22_1fnjktj7v", + "field": "red_blood_cell_count", + "recordId": "2" +} +2026-03-08 19:10:35.834 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_23_zrt2ixskp", + "field": "relative_value_of_lymphocytes", + "recordId": "2" +} +2026-03-08 19:10:35.834 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_24_a5oovpadb", + "field": "relative_value_of_monocytes", + "recordId": "2" +} +2026-03-08 19:10:35.834 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_25_rr9uk1but", + "field": "relative_value_of_neutrophils", + "recordId": "2" +} +2026-03-08 19:10:35.834 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_26_f9hez0b4k", + "field": "white_blood_cell_count", + "recordId": "2" +} +2026-03-08 19:10:35.834 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_32_a2cxjf9tb", + "field": "sign_informed_consent_form", + "recordId": "2" +} +2026-03-08 19:10:35.834 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_41_eahuliyh0", + "field": "alcohol_consumption_history", + "recordId": "2" +} +2026-03-08 19:10:35.834 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_42_m8cptozxk", + "field": "smoking_history", + "recordId": "2" +} +2026-03-08 19:10:35.834 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_0_96ftk49kx", + "field": [ + "age", + "inclusion_criteria2" + ], + "recordId": "2" +} +2026-03-08 19:10:35.835 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_1_zw7ja89ei", + "field": [ + "sign_informed_consent_form", + "inclusion_criteria5" + ], + "recordId": "2" +} +2026-03-08 19:10:35.835 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_2_44m45t6m6", + "field": "inclusion_criteria1", + "recordId": "2" +} +2026-03-08 19:10:35.835 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_3_zfn62bs40", + "field": "exclusion_criteria2", + "recordId": "2" +} +2026-03-08 19:10:35.835 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_4_vgyy51zou", + "field": "exclusion_criteria3", + "recordId": "2" +} +2026-03-08 19:10:35.835 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_5_pbkwsnx0n", + "field": [ + "exclusion_criteria4", + "inclusion_criteria3" + ], + "recordId": "2" +} +2026-03-08 19:10:35.835 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_6_9ygdecsca", + "field": "exclusion_criteria5", + "recordId": "2" +} +2026-03-08 19:10:35.835 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_7_9sugwpwcf", + "field": "sex", + "recordId": "2" +} +2026-03-08 19:10:35.835 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_8_u079bu08z", + "field": [ + "enrollment_status", + "exclusion_criteria1", + "exclusion_criteria2", + "exclusion_criteria3", + "exclusion_criteria4", + "exclusion_criteria5" + ], + "recordId": "2" +} +2026-03-08 19:10:35.835 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_9_ufkub1swe", + "field": [ + "inclusion_criteria1", + "inclusion_criteria2", + "inclusion_criteria3", + "inclusion_criteria4", + "inclusion_criteria5" + ], + "recordId": "2" +} +2026-03-08 19:10:35.835 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_0_r79gvdu3h", + "field": [ + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.835 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_1_2uns9t23g", + "field": [ + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.835 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_2_os5ccvicv", + "field": [ + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.835 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_3_k2nlyk3q4", + "field": [ + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.835 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_4_8atbe12pb", + "field": [ + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.835 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_5_h62ympca8", + "field": [ + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.835 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_6_0m5vg872v", + "field": [ + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.835 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_7_4rvkpn2sq", + "field": [ + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.835 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_8_7s1fygjji", + "field": [ + "sign_informed_consent_form", + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.835 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_9_qd6pse9gj", + "field": [ + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.835 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_0_2fjs3h1t2", + "field": "visiting_date", + "recordId": "2" +} +2026-03-08 19:10:35.835 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_1_i81le4vme", + "field": [ + "date_of_signature", + "visiting_date" + ], + "recordId": "2" +} +2026-03-08 19:10:35.835 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_2_a8k2wend3", + "field": [ + "date_of_assessment_cmss", + "visiting_date" + ], + "recordId": "2" +} +2026-03-08 19:10:35.835 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_3_otk3muqgy", + "field": [ + "date_of_assessment_sf_mpq_scale", + "visiting_date" + ], + "recordId": "2" +} +2026-03-08 19:10:35.835 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_4_3e0g4h3xt", + "field": [ + "check_date", + "visiting_date" + ], + "recordId": "2" +} +2026-03-08 19:10:35.835 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "field": [ + "date_of_first_consultation", + "visiting_date" + ], + "recordId": "2" +} +2026-03-08 19:10:35.835 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_6_eoavacbfk", + "field": [ + "enrollment_status", + "sign_informed_consent_form" + ], + "recordId": "2" +} +2026-03-08 19:10:35.835 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "field": [ + "visiting_date", + "date_of_birth" + ], + "recordId": "2" +} +2026-03-08 19:10:35.840 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:10:35.842 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 0 +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_0_hr2q1opmw", + "field": "visiting_date", + "recordId": "2" +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_1_sdim7iks9", + "field": [ + "check_date", + "visiting_date" + ], + "recordId": "2" +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_2_1r0huss46", + "field": [ + "date_of_assessment_cmss", + "visiting_date" + ], + "recordId": "2" +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_3_utmkeahm6", + "field": [ + "date_of_assessment_sf_mpq_scale", + "visiting_date" + ], + "recordId": "2" +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_4_3j2aozbms", + "field": [ + "date_of_signature", + "date_of_first_consultation" + ], + "recordId": "2" +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_5_ux8721fut", + "field": [ + "enrollment_status", + "sign_informed_consent_form" + ], + "recordId": "2" +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_6_res5lvb6g", + "field": [ + "visiting_date", + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_7_wpzbvli56", + "field": [ + "date_of_first_consultation", + "visiting_date" + ], + "recordId": "2" +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_0_424mnnlv0", + "field": "educational_level", + "recordId": "2" +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_1_qiy3gde3a", + "field": "marital_status", + "recordId": "2" +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_2_hc1jjvymo", + "field": "sex", + "recordId": "2" +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_3_delac4edo", + "field": "absolute_value_of_basophilic_cells", + "recordId": "2" +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_4_8tcnwi9gg", + "field": "absolute_value_of_lymphocytes", + "recordId": "2" +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_5_4k7227d38", + "field": "absolute_value_of_monocytes", + "recordId": "2" +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_6_2e6slhi9p", + "field": "absolute_value_of_neutrophils", + "recordId": "2" +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_7_u8z0d18gb", + "field": "eosinophil_absolute_count", + "recordId": "2" +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_8_hculwqhyk", + "field": "eosinophil_count_ratio", + "recordId": "2" +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_9_ftk4426nd", + "field": "eosinophil_countratio", + "recordId": "2" +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_10_vcciaxxuk", + "field": "hematocrit", + "recordId": "2" +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_11_tk5gliucf", + "field": "hemoglobin", + "recordId": "2" +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_12_abhqvjmg5", + "field": "high_platelet_ratio", + "recordId": "2" +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_13_p8j624iv2", + "field": "mean_corpuscular_volume", + "recordId": "2" +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_14_rwum2cw2u", + "field": "mean_hemoglobin_concentratin", + "recordId": "2" +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_15_f056yvtme", + "field": "mean_hemoglobin_concentration", + "recordId": "2" +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_16_5o2al7oyz", + "field": "mean_platelet_volume", + "recordId": "2" +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_17_zcd5zxn3u", + "field": "platelet_count", + "recordId": "2" +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_18_skojo7cru", + "field": "platelet_volume", + "recordId": "2" +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_19_5iin73wva", + "field": "platelet_volume_distribution_width", + "recordId": "2" +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_20_4lxpihy8o", + "field": "rbc_volume_distribution_width_cv", + "recordId": "2" +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_21_gl7d8n5si", + "field": "rbc_volume_distribution_width_sd", + "recordId": "2" +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_22_1fnjktj7v", + "field": "red_blood_cell_count", + "recordId": "2" +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_23_zrt2ixskp", + "field": "relative_value_of_lymphocytes", + "recordId": "2" +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_24_a5oovpadb", + "field": "relative_value_of_monocytes", + "recordId": "2" +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_25_rr9uk1but", + "field": "relative_value_of_neutrophils", + "recordId": "2" +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_26_f9hez0b4k", + "field": "white_blood_cell_count", + "recordId": "2" +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_32_a2cxjf9tb", + "field": "sign_informed_consent_form", + "recordId": "2" +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_41_eahuliyh0", + "field": "alcohol_consumption_history", + "recordId": "2" +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_42_m8cptozxk", + "field": "smoking_history", + "recordId": "2" +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_0_96ftk49kx", + "field": [ + "age", + "inclusion_criteria2" + ], + "recordId": "2" +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_1_zw7ja89ei", + "field": [ + "sign_informed_consent_form", + "inclusion_criteria5" + ], + "recordId": "2" +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_2_44m45t6m6", + "field": "inclusion_criteria1", + "recordId": "2" +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_3_zfn62bs40", + "field": "exclusion_criteria2", + "recordId": "2" +} +2026-03-08 19:10:35.842 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_4_vgyy51zou", + "field": "exclusion_criteria3", + "recordId": "2" +} +2026-03-08 19:10:35.843 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_5_pbkwsnx0n", + "field": [ + "exclusion_criteria4", + "inclusion_criteria3" + ], + "recordId": "2" +} +2026-03-08 19:10:35.843 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_6_9ygdecsca", + "field": "exclusion_criteria5", + "recordId": "2" +} +2026-03-08 19:10:35.843 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_7_9sugwpwcf", + "field": "sex", + "recordId": "2" +} +2026-03-08 19:10:35.843 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_8_u079bu08z", + "field": [ + "enrollment_status", + "exclusion_criteria1", + "exclusion_criteria2", + "exclusion_criteria3", + "exclusion_criteria4", + "exclusion_criteria5" + ], + "recordId": "2" +} +2026-03-08 19:10:35.843 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_9_ufkub1swe", + "field": [ + "inclusion_criteria1", + "inclusion_criteria2", + "inclusion_criteria3", + "inclusion_criteria4", + "inclusion_criteria5" + ], + "recordId": "2" +} +2026-03-08 19:10:35.843 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_0_r79gvdu3h", + "field": [ + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.843 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_1_2uns9t23g", + "field": [ + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.843 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_2_os5ccvicv", + "field": [ + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.843 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_3_k2nlyk3q4", + "field": [ + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.843 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_4_8atbe12pb", + "field": [ + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.843 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_5_h62ympca8", + "field": [ + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.843 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_6_0m5vg872v", + "field": [ + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.843 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_7_4rvkpn2sq", + "field": [ + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.843 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_8_7s1fygjji", + "field": [ + "sign_informed_consent_form", + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.843 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_9_qd6pse9gj", + "field": [ + "date_of_signature" + ], + "recordId": "2" +} +2026-03-08 19:10:35.843 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_0_2fjs3h1t2", + "field": "visiting_date", + "recordId": "2" +} +2026-03-08 19:10:35.843 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_1_i81le4vme", + "field": [ + "date_of_signature", + "visiting_date" + ], + "recordId": "2" +} +2026-03-08 19:10:35.843 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_2_a8k2wend3", + "field": [ + "date_of_assessment_cmss", + "visiting_date" + ], + "recordId": "2" +} +2026-03-08 19:10:35.843 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_3_otk3muqgy", + "field": [ + "date_of_assessment_sf_mpq_scale", + "visiting_date" + ], + "recordId": "2" +} +2026-03-08 19:10:35.843 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_4_3e0g4h3xt", + "field": [ + "check_date", + "visiting_date" + ], + "recordId": "2" +} +2026-03-08 19:10:35.843 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "field": [ + "date_of_first_consultation", + "visiting_date" + ], + "recordId": "2" +} +2026-03-08 19:10:35.843 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_6_eoavacbfk", + "field": [ + "enrollment_status", + "sign_informed_consent_form" + ], + "recordId": "2" +} +2026-03-08 19:10:35.843 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "field": [ + "visiting_date", + "date_of_birth" + ], + "recordId": "2" +} +2026-03-08 19:10:35.848 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:10:35.849 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 0 +} +2026-03-08 19:10:35.849 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_3_delac4edo", + "field": "absolute_value_of_basophilic_cells", + "recordId": "3" +} +2026-03-08 19:10:35.849 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_4_8tcnwi9gg", + "field": "absolute_value_of_lymphocytes", + "recordId": "3" +} +2026-03-08 19:10:35.849 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_5_4k7227d38", + "field": "absolute_value_of_monocytes", + "recordId": "3" +} +2026-03-08 19:10:35.849 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_6_2e6slhi9p", + "field": "absolute_value_of_neutrophils", + "recordId": "3" +} +2026-03-08 19:10:35.849 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_7_u8z0d18gb", + "field": "eosinophil_absolute_count", + "recordId": "3" +} +2026-03-08 19:10:35.849 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_8_hculwqhyk", + "field": "eosinophil_count_ratio", + "recordId": "3" +} +2026-03-08 19:10:35.849 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_9_ftk4426nd", + "field": "eosinophil_countratio", + "recordId": "3" +} +2026-03-08 19:10:35.849 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_10_vcciaxxuk", + "field": "hematocrit", + "recordId": "3" +} +2026-03-08 19:10:35.849 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_11_tk5gliucf", + "field": "hemoglobin", + "recordId": "3" +} +2026-03-08 19:10:35.849 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_12_abhqvjmg5", + "field": "high_platelet_ratio", + "recordId": "3" +} +2026-03-08 19:10:35.849 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_13_p8j624iv2", + "field": "mean_corpuscular_volume", + "recordId": "3" +} +2026-03-08 19:10:35.849 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_14_rwum2cw2u", + "field": "mean_hemoglobin_concentratin", + "recordId": "3" +} +2026-03-08 19:10:35.849 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_15_f056yvtme", + "field": "mean_hemoglobin_concentration", + "recordId": "3" +} +2026-03-08 19:10:35.849 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_16_5o2al7oyz", + "field": "mean_platelet_volume", + "recordId": "3" +} +2026-03-08 19:10:35.849 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_17_zcd5zxn3u", + "field": "platelet_count", + "recordId": "3" +} +2026-03-08 19:10:35.849 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_18_skojo7cru", + "field": "platelet_volume", + "recordId": "3" +} +2026-03-08 19:10:35.849 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_19_5iin73wva", + "field": "platelet_volume_distribution_width", + "recordId": "3" +} +2026-03-08 19:10:35.849 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_20_4lxpihy8o", + "field": "rbc_volume_distribution_width_cv", + "recordId": "3" +} +2026-03-08 19:10:35.849 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_21_gl7d8n5si", + "field": "rbc_volume_distribution_width_sd", + "recordId": "3" +} +2026-03-08 19:10:35.849 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_22_1fnjktj7v", + "field": "red_blood_cell_count", + "recordId": "3" +} +2026-03-08 19:10:35.849 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_23_zrt2ixskp", + "field": "relative_value_of_lymphocytes", + "recordId": "3" +} +2026-03-08 19:10:35.850 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_24_a5oovpadb", + "field": "relative_value_of_monocytes", + "recordId": "3" +} +2026-03-08 19:10:35.850 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_25_rr9uk1but", + "field": "relative_value_of_neutrophils", + "recordId": "3" +} +2026-03-08 19:10:35.850 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_26_f9hez0b4k", + "field": "white_blood_cell_count", + "recordId": "3" +} +2026-03-08 19:10:35.850 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.850 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.850 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.857 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:10:35.858 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 0 +} +2026-03-08 19:10:35.858 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_3_delac4edo", + "field": "absolute_value_of_basophilic_cells", + "recordId": "3" +} +2026-03-08 19:10:35.858 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_4_8tcnwi9gg", + "field": "absolute_value_of_lymphocytes", + "recordId": "3" +} +2026-03-08 19:10:35.858 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_5_4k7227d38", + "field": "absolute_value_of_monocytes", + "recordId": "3" +} +2026-03-08 19:10:35.858 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_6_2e6slhi9p", + "field": "absolute_value_of_neutrophils", + "recordId": "3" +} +2026-03-08 19:10:35.858 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_7_u8z0d18gb", + "field": "eosinophil_absolute_count", + "recordId": "3" +} +2026-03-08 19:10:35.858 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_8_hculwqhyk", + "field": "eosinophil_count_ratio", + "recordId": "3" +} +2026-03-08 19:10:35.858 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_9_ftk4426nd", + "field": "eosinophil_countratio", + "recordId": "3" +} +2026-03-08 19:10:35.858 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_10_vcciaxxuk", + "field": "hematocrit", + "recordId": "3" +} +2026-03-08 19:10:35.858 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_11_tk5gliucf", + "field": "hemoglobin", + "recordId": "3" +} +2026-03-08 19:10:35.858 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_12_abhqvjmg5", + "field": "high_platelet_ratio", + "recordId": "3" +} +2026-03-08 19:10:35.858 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_13_p8j624iv2", + "field": "mean_corpuscular_volume", + "recordId": "3" +} +2026-03-08 19:10:35.858 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_14_rwum2cw2u", + "field": "mean_hemoglobin_concentratin", + "recordId": "3" +} +2026-03-08 19:10:35.858 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_15_f056yvtme", + "field": "mean_hemoglobin_concentration", + "recordId": "3" +} +2026-03-08 19:10:35.858 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_16_5o2al7oyz", + "field": "mean_platelet_volume", + "recordId": "3" +} +2026-03-08 19:10:35.858 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_17_zcd5zxn3u", + "field": "platelet_count", + "recordId": "3" +} +2026-03-08 19:10:35.858 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_18_skojo7cru", + "field": "platelet_volume", + "recordId": "3" +} +2026-03-08 19:10:35.858 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_19_5iin73wva", + "field": "platelet_volume_distribution_width", + "recordId": "3" +} +2026-03-08 19:10:35.858 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_20_4lxpihy8o", + "field": "rbc_volume_distribution_width_cv", + "recordId": "3" +} +2026-03-08 19:10:35.858 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_21_gl7d8n5si", + "field": "rbc_volume_distribution_width_sd", + "recordId": "3" +} +2026-03-08 19:10:35.858 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_22_1fnjktj7v", + "field": "red_blood_cell_count", + "recordId": "3" +} +2026-03-08 19:10:35.858 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_23_zrt2ixskp", + "field": "relative_value_of_lymphocytes", + "recordId": "3" +} +2026-03-08 19:10:35.858 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_24_a5oovpadb", + "field": "relative_value_of_monocytes", + "recordId": "3" +} +2026-03-08 19:10:35.858 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_25_rr9uk1but", + "field": "relative_value_of_neutrophils", + "recordId": "3" +} +2026-03-08 19:10:35.858 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_26_f9hez0b4k", + "field": "white_blood_cell_count", + "recordId": "3" +} +2026-03-08 19:10:35.859 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.859 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.859 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.865 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:10:35.867 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 0 +} +2026-03-08 19:10:35.867 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_3_delac4edo", + "field": "absolute_value_of_basophilic_cells", + "recordId": "3" +} +2026-03-08 19:10:35.867 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_4_8tcnwi9gg", + "field": "absolute_value_of_lymphocytes", + "recordId": "3" +} +2026-03-08 19:10:35.867 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_5_4k7227d38", + "field": "absolute_value_of_monocytes", + "recordId": "3" +} +2026-03-08 19:10:35.867 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_6_2e6slhi9p", + "field": "absolute_value_of_neutrophils", + "recordId": "3" +} +2026-03-08 19:10:35.867 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_7_u8z0d18gb", + "field": "eosinophil_absolute_count", + "recordId": "3" +} +2026-03-08 19:10:35.867 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_8_hculwqhyk", + "field": "eosinophil_count_ratio", + "recordId": "3" +} +2026-03-08 19:10:35.867 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_9_ftk4426nd", + "field": "eosinophil_countratio", + "recordId": "3" +} +2026-03-08 19:10:35.867 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_10_vcciaxxuk", + "field": "hematocrit", + "recordId": "3" +} +2026-03-08 19:10:35.867 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_11_tk5gliucf", + "field": "hemoglobin", + "recordId": "3" +} +2026-03-08 19:10:35.867 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_12_abhqvjmg5", + "field": "high_platelet_ratio", + "recordId": "3" +} +2026-03-08 19:10:35.867 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_13_p8j624iv2", + "field": "mean_corpuscular_volume", + "recordId": "3" +} +2026-03-08 19:10:35.867 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_14_rwum2cw2u", + "field": "mean_hemoglobin_concentratin", + "recordId": "3" +} +2026-03-08 19:10:35.867 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_15_f056yvtme", + "field": "mean_hemoglobin_concentration", + "recordId": "3" +} +2026-03-08 19:10:35.867 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_16_5o2al7oyz", + "field": "mean_platelet_volume", + "recordId": "3" +} +2026-03-08 19:10:35.867 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_17_zcd5zxn3u", + "field": "platelet_count", + "recordId": "3" +} +2026-03-08 19:10:35.867 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_18_skojo7cru", + "field": "platelet_volume", + "recordId": "3" +} +2026-03-08 19:10:35.867 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_19_5iin73wva", + "field": "platelet_volume_distribution_width", + "recordId": "3" +} +2026-03-08 19:10:35.867 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_20_4lxpihy8o", + "field": "rbc_volume_distribution_width_cv", + "recordId": "3" +} +2026-03-08 19:10:35.867 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_21_gl7d8n5si", + "field": "rbc_volume_distribution_width_sd", + "recordId": "3" +} +2026-03-08 19:10:35.867 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_22_1fnjktj7v", + "field": "red_blood_cell_count", + "recordId": "3" +} +2026-03-08 19:10:35.867 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_23_zrt2ixskp", + "field": "relative_value_of_lymphocytes", + "recordId": "3" +} +2026-03-08 19:10:35.867 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_24_a5oovpadb", + "field": "relative_value_of_monocytes", + "recordId": "3" +} +2026-03-08 19:10:35.867 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_25_rr9uk1but", + "field": "relative_value_of_neutrophils", + "recordId": "3" +} +2026-03-08 19:10:35.867 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_26_f9hez0b4k", + "field": "white_blood_cell_count", + "recordId": "3" +} +2026-03-08 19:10:35.867 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.867 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.867 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.874 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:10:35.875 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 0 +} +2026-03-08 19:10:35.875 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.875 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.875 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.882 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:10:35.883 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 0 +} +2026-03-08 19:10:35.883 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.884 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.884 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.890 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:10:35.891 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 0 +} +2026-03-08 19:10:35.891 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.891 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.891 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.898 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:10:35.899 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 0 +} +2026-03-08 19:10:35.900 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.900 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.900 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.906 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:10:35.907 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 0 +} +2026-03-08 19:10:35.908 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_3_delac4edo", + "field": "absolute_value_of_basophilic_cells", + "recordId": "6" +} +2026-03-08 19:10:35.908 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_4_8tcnwi9gg", + "field": "absolute_value_of_lymphocytes", + "recordId": "6" +} +2026-03-08 19:10:35.908 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_5_4k7227d38", + "field": "absolute_value_of_monocytes", + "recordId": "6" +} +2026-03-08 19:10:35.908 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_6_2e6slhi9p", + "field": "absolute_value_of_neutrophils", + "recordId": "6" +} +2026-03-08 19:10:35.908 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_7_u8z0d18gb", + "field": "eosinophil_absolute_count", + "recordId": "6" +} +2026-03-08 19:10:35.908 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_8_hculwqhyk", + "field": "eosinophil_count_ratio", + "recordId": "6" +} +2026-03-08 19:10:35.908 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_9_ftk4426nd", + "field": "eosinophil_countratio", + "recordId": "6" +} +2026-03-08 19:10:35.908 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_10_vcciaxxuk", + "field": "hematocrit", + "recordId": "6" +} +2026-03-08 19:10:35.908 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_11_tk5gliucf", + "field": "hemoglobin", + "recordId": "6" +} +2026-03-08 19:10:35.908 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_12_abhqvjmg5", + "field": "high_platelet_ratio", + "recordId": "6" +} +2026-03-08 19:10:35.908 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_13_p8j624iv2", + "field": "mean_corpuscular_volume", + "recordId": "6" +} +2026-03-08 19:10:35.908 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_14_rwum2cw2u", + "field": "mean_hemoglobin_concentratin", + "recordId": "6" +} +2026-03-08 19:10:35.908 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_15_f056yvtme", + "field": "mean_hemoglobin_concentration", + "recordId": "6" +} +2026-03-08 19:10:35.908 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_16_5o2al7oyz", + "field": "mean_platelet_volume", + "recordId": "6" +} +2026-03-08 19:10:35.908 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_17_zcd5zxn3u", + "field": "platelet_count", + "recordId": "6" +} +2026-03-08 19:10:35.908 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_18_skojo7cru", + "field": "platelet_volume", + "recordId": "6" +} +2026-03-08 19:10:35.908 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_19_5iin73wva", + "field": "platelet_volume_distribution_width", + "recordId": "6" +} +2026-03-08 19:10:35.908 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_20_4lxpihy8o", + "field": "rbc_volume_distribution_width_cv", + "recordId": "6" +} +2026-03-08 19:10:35.908 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_21_gl7d8n5si", + "field": "rbc_volume_distribution_width_sd", + "recordId": "6" +} +2026-03-08 19:10:35.908 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_22_1fnjktj7v", + "field": "red_blood_cell_count", + "recordId": "6" +} +2026-03-08 19:10:35.908 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_23_zrt2ixskp", + "field": "relative_value_of_lymphocytes", + "recordId": "6" +} +2026-03-08 19:10:35.908 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_24_a5oovpadb", + "field": "relative_value_of_monocytes", + "recordId": "6" +} +2026-03-08 19:10:35.908 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_25_rr9uk1but", + "field": "relative_value_of_neutrophils", + "recordId": "6" +} +2026-03-08 19:10:35.908 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_26_f9hez0b4k", + "field": "white_blood_cell_count", + "recordId": "6" +} +2026-03-08 19:10:35.908 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.908 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.908 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.914 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:10:35.915 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 0 +} +2026-03-08 19:10:35.915 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_3_delac4edo", + "field": "absolute_value_of_basophilic_cells", + "recordId": "6" +} +2026-03-08 19:10:35.916 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_4_8tcnwi9gg", + "field": "absolute_value_of_lymphocytes", + "recordId": "6" +} +2026-03-08 19:10:35.916 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_5_4k7227d38", + "field": "absolute_value_of_monocytes", + "recordId": "6" +} +2026-03-08 19:10:35.916 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_6_2e6slhi9p", + "field": "absolute_value_of_neutrophils", + "recordId": "6" +} +2026-03-08 19:10:35.916 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_7_u8z0d18gb", + "field": "eosinophil_absolute_count", + "recordId": "6" +} +2026-03-08 19:10:35.916 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_8_hculwqhyk", + "field": "eosinophil_count_ratio", + "recordId": "6" +} +2026-03-08 19:10:35.916 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_9_ftk4426nd", + "field": "eosinophil_countratio", + "recordId": "6" +} +2026-03-08 19:10:35.916 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_10_vcciaxxuk", + "field": "hematocrit", + "recordId": "6" +} +2026-03-08 19:10:35.916 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_11_tk5gliucf", + "field": "hemoglobin", + "recordId": "6" +} +2026-03-08 19:10:35.916 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_12_abhqvjmg5", + "field": "high_platelet_ratio", + "recordId": "6" +} +2026-03-08 19:10:35.916 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_13_p8j624iv2", + "field": "mean_corpuscular_volume", + "recordId": "6" +} +2026-03-08 19:10:35.916 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_14_rwum2cw2u", + "field": "mean_hemoglobin_concentratin", + "recordId": "6" +} +2026-03-08 19:10:35.916 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_15_f056yvtme", + "field": "mean_hemoglobin_concentration", + "recordId": "6" +} +2026-03-08 19:10:35.916 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_16_5o2al7oyz", + "field": "mean_platelet_volume", + "recordId": "6" +} +2026-03-08 19:10:35.916 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_17_zcd5zxn3u", + "field": "platelet_count", + "recordId": "6" +} +2026-03-08 19:10:35.916 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_18_skojo7cru", + "field": "platelet_volume", + "recordId": "6" +} +2026-03-08 19:10:35.916 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_19_5iin73wva", + "field": "platelet_volume_distribution_width", + "recordId": "6" +} +2026-03-08 19:10:35.916 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_20_4lxpihy8o", + "field": "rbc_volume_distribution_width_cv", + "recordId": "6" +} +2026-03-08 19:10:35.916 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_21_gl7d8n5si", + "field": "rbc_volume_distribution_width_sd", + "recordId": "6" +} +2026-03-08 19:10:35.916 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_22_1fnjktj7v", + "field": "red_blood_cell_count", + "recordId": "6" +} +2026-03-08 19:10:35.916 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_23_zrt2ixskp", + "field": "relative_value_of_lymphocytes", + "recordId": "6" +} +2026-03-08 19:10:35.916 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_24_a5oovpadb", + "field": "relative_value_of_monocytes", + "recordId": "6" +} +2026-03-08 19:10:35.916 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_25_rr9uk1but", + "field": "relative_value_of_neutrophils", + "recordId": "6" +} +2026-03-08 19:10:35.916 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_26_f9hez0b4k", + "field": "white_blood_cell_count", + "recordId": "6" +} +2026-03-08 19:10:35.916 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.916 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.916 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.924 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:10:35.925 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 0 +} +2026-03-08 19:10:35.925 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_3_delac4edo", + "field": "absolute_value_of_basophilic_cells", + "recordId": "7" +} +2026-03-08 19:10:35.925 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_4_8tcnwi9gg", + "field": "absolute_value_of_lymphocytes", + "recordId": "7" +} +2026-03-08 19:10:35.925 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_5_4k7227d38", + "field": "absolute_value_of_monocytes", + "recordId": "7" +} +2026-03-08 19:10:35.925 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_6_2e6slhi9p", + "field": "absolute_value_of_neutrophils", + "recordId": "7" +} +2026-03-08 19:10:35.925 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_7_u8z0d18gb", + "field": "eosinophil_absolute_count", + "recordId": "7" +} +2026-03-08 19:10:35.925 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_8_hculwqhyk", + "field": "eosinophil_count_ratio", + "recordId": "7" +} +2026-03-08 19:10:35.925 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_9_ftk4426nd", + "field": "eosinophil_countratio", + "recordId": "7" +} +2026-03-08 19:10:35.925 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_10_vcciaxxuk", + "field": "hematocrit", + "recordId": "7" +} +2026-03-08 19:10:35.925 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_11_tk5gliucf", + "field": "hemoglobin", + "recordId": "7" +} +2026-03-08 19:10:35.925 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_12_abhqvjmg5", + "field": "high_platelet_ratio", + "recordId": "7" +} +2026-03-08 19:10:35.925 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_13_p8j624iv2", + "field": "mean_corpuscular_volume", + "recordId": "7" +} +2026-03-08 19:10:35.925 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_14_rwum2cw2u", + "field": "mean_hemoglobin_concentratin", + "recordId": "7" +} +2026-03-08 19:10:35.925 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_15_f056yvtme", + "field": "mean_hemoglobin_concentration", + "recordId": "7" +} +2026-03-08 19:10:35.925 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_16_5o2al7oyz", + "field": "mean_platelet_volume", + "recordId": "7" +} +2026-03-08 19:10:35.925 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_17_zcd5zxn3u", + "field": "platelet_count", + "recordId": "7" +} +2026-03-08 19:10:35.925 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_18_skojo7cru", + "field": "platelet_volume", + "recordId": "7" +} +2026-03-08 19:10:35.925 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_19_5iin73wva", + "field": "platelet_volume_distribution_width", + "recordId": "7" +} +2026-03-08 19:10:35.925 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_20_4lxpihy8o", + "field": "rbc_volume_distribution_width_cv", + "recordId": "7" +} +2026-03-08 19:10:35.926 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_21_gl7d8n5si", + "field": "rbc_volume_distribution_width_sd", + "recordId": "7" +} +2026-03-08 19:10:35.926 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_22_1fnjktj7v", + "field": "red_blood_cell_count", + "recordId": "7" +} +2026-03-08 19:10:35.926 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_23_zrt2ixskp", + "field": "relative_value_of_lymphocytes", + "recordId": "7" +} +2026-03-08 19:10:35.926 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_24_a5oovpadb", + "field": "relative_value_of_monocytes", + "recordId": "7" +} +2026-03-08 19:10:35.926 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_25_rr9uk1but", + "field": "relative_value_of_neutrophils", + "recordId": "7" +} +2026-03-08 19:10:35.926 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_26_f9hez0b4k", + "field": "white_blood_cell_count", + "recordId": "7" +} +2026-03-08 19:10:35.926 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.926 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.926 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.932 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:10:35.934 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 0 +} +2026-03-08 19:10:35.934 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_3_delac4edo", + "field": "absolute_value_of_basophilic_cells", + "recordId": "7" +} +2026-03-08 19:10:35.934 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_4_8tcnwi9gg", + "field": "absolute_value_of_lymphocytes", + "recordId": "7" +} +2026-03-08 19:10:35.934 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_5_4k7227d38", + "field": "absolute_value_of_monocytes", + "recordId": "7" +} +2026-03-08 19:10:35.934 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_6_2e6slhi9p", + "field": "absolute_value_of_neutrophils", + "recordId": "7" +} +2026-03-08 19:10:35.934 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_7_u8z0d18gb", + "field": "eosinophil_absolute_count", + "recordId": "7" +} +2026-03-08 19:10:35.934 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_8_hculwqhyk", + "field": "eosinophil_count_ratio", + "recordId": "7" +} +2026-03-08 19:10:35.934 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_9_ftk4426nd", + "field": "eosinophil_countratio", + "recordId": "7" +} +2026-03-08 19:10:35.934 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_10_vcciaxxuk", + "field": "hematocrit", + "recordId": "7" +} +2026-03-08 19:10:35.934 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_11_tk5gliucf", + "field": "hemoglobin", + "recordId": "7" +} +2026-03-08 19:10:35.934 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_12_abhqvjmg5", + "field": "high_platelet_ratio", + "recordId": "7" +} +2026-03-08 19:10:35.934 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_13_p8j624iv2", + "field": "mean_corpuscular_volume", + "recordId": "7" +} +2026-03-08 19:10:35.934 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_14_rwum2cw2u", + "field": "mean_hemoglobin_concentratin", + "recordId": "7" +} +2026-03-08 19:10:35.934 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_15_f056yvtme", + "field": "mean_hemoglobin_concentration", + "recordId": "7" +} +2026-03-08 19:10:35.934 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_16_5o2al7oyz", + "field": "mean_platelet_volume", + "recordId": "7" +} +2026-03-08 19:10:35.934 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_17_zcd5zxn3u", + "field": "platelet_count", + "recordId": "7" +} +2026-03-08 19:10:35.934 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_18_skojo7cru", + "field": "platelet_volume", + "recordId": "7" +} +2026-03-08 19:10:35.934 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_19_5iin73wva", + "field": "platelet_volume_distribution_width", + "recordId": "7" +} +2026-03-08 19:10:35.934 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_20_4lxpihy8o", + "field": "rbc_volume_distribution_width_cv", + "recordId": "7" +} +2026-03-08 19:10:35.934 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_21_gl7d8n5si", + "field": "rbc_volume_distribution_width_sd", + "recordId": "7" +} +2026-03-08 19:10:35.934 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_22_1fnjktj7v", + "field": "red_blood_cell_count", + "recordId": "7" +} +2026-03-08 19:10:35.934 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_23_zrt2ixskp", + "field": "relative_value_of_lymphocytes", + "recordId": "7" +} +2026-03-08 19:10:35.934 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_24_a5oovpadb", + "field": "relative_value_of_monocytes", + "recordId": "7" +} +2026-03-08 19:10:35.934 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_25_rr9uk1but", + "field": "relative_value_of_neutrophils", + "recordId": "7" +} +2026-03-08 19:10:35.934 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_26_f9hez0b4k", + "field": "white_blood_cell_count", + "recordId": "7" +} +2026-03-08 19:10:35.934 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.934 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.935 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.941 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:10:35.942 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 0 +} +2026-03-08 19:10:35.943 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_3_delac4edo", + "field": "absolute_value_of_basophilic_cells", + "recordId": "7" +} +2026-03-08 19:10:35.943 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_4_8tcnwi9gg", + "field": "absolute_value_of_lymphocytes", + "recordId": "7" +} +2026-03-08 19:10:35.943 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_5_4k7227d38", + "field": "absolute_value_of_monocytes", + "recordId": "7" +} +2026-03-08 19:10:35.943 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_6_2e6slhi9p", + "field": "absolute_value_of_neutrophils", + "recordId": "7" +} +2026-03-08 19:10:35.943 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_7_u8z0d18gb", + "field": "eosinophil_absolute_count", + "recordId": "7" +} +2026-03-08 19:10:35.943 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_8_hculwqhyk", + "field": "eosinophil_count_ratio", + "recordId": "7" +} +2026-03-08 19:10:35.943 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_9_ftk4426nd", + "field": "eosinophil_countratio", + "recordId": "7" +} +2026-03-08 19:10:35.943 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_10_vcciaxxuk", + "field": "hematocrit", + "recordId": "7" +} +2026-03-08 19:10:35.943 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_11_tk5gliucf", + "field": "hemoglobin", + "recordId": "7" +} +2026-03-08 19:10:35.943 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_12_abhqvjmg5", + "field": "high_platelet_ratio", + "recordId": "7" +} +2026-03-08 19:10:35.943 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_13_p8j624iv2", + "field": "mean_corpuscular_volume", + "recordId": "7" +} +2026-03-08 19:10:35.943 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_14_rwum2cw2u", + "field": "mean_hemoglobin_concentratin", + "recordId": "7" +} +2026-03-08 19:10:35.943 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_15_f056yvtme", + "field": "mean_hemoglobin_concentration", + "recordId": "7" +} +2026-03-08 19:10:35.943 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_16_5o2al7oyz", + "field": "mean_platelet_volume", + "recordId": "7" +} +2026-03-08 19:10:35.943 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_17_zcd5zxn3u", + "field": "platelet_count", + "recordId": "7" +} +2026-03-08 19:10:35.943 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_18_skojo7cru", + "field": "platelet_volume", + "recordId": "7" +} +2026-03-08 19:10:35.943 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_19_5iin73wva", + "field": "platelet_volume_distribution_width", + "recordId": "7" +} +2026-03-08 19:10:35.943 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_20_4lxpihy8o", + "field": "rbc_volume_distribution_width_cv", + "recordId": "7" +} +2026-03-08 19:10:35.943 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_21_gl7d8n5si", + "field": "rbc_volume_distribution_width_sd", + "recordId": "7" +} +2026-03-08 19:10:35.943 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_22_1fnjktj7v", + "field": "red_blood_cell_count", + "recordId": "7" +} +2026-03-08 19:10:35.943 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_23_zrt2ixskp", + "field": "relative_value_of_lymphocytes", + "recordId": "7" +} +2026-03-08 19:10:35.943 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_24_a5oovpadb", + "field": "relative_value_of_monocytes", + "recordId": "7" +} +2026-03-08 19:10:35.943 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_25_rr9uk1but", + "field": "relative_value_of_neutrophils", + "recordId": "7" +} +2026-03-08 19:10:35.943 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_26_f9hez0b4k", + "field": "white_blood_cell_count", + "recordId": "7" +} +2026-03-08 19:10:35.943 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.943 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.943 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.950 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:10:35.951 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 0 +} +2026-03-08 19:10:35.951 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_3_delac4edo", + "field": "absolute_value_of_basophilic_cells", + "recordId": "8" +} +2026-03-08 19:10:35.951 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_4_8tcnwi9gg", + "field": "absolute_value_of_lymphocytes", + "recordId": "8" +} +2026-03-08 19:10:35.951 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_5_4k7227d38", + "field": "absolute_value_of_monocytes", + "recordId": "8" +} +2026-03-08 19:10:35.951 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_6_2e6slhi9p", + "field": "absolute_value_of_neutrophils", + "recordId": "8" +} +2026-03-08 19:10:35.951 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_7_u8z0d18gb", + "field": "eosinophil_absolute_count", + "recordId": "8" +} +2026-03-08 19:10:35.951 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_8_hculwqhyk", + "field": "eosinophil_count_ratio", + "recordId": "8" +} +2026-03-08 19:10:35.951 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_9_ftk4426nd", + "field": "eosinophil_countratio", + "recordId": "8" +} +2026-03-08 19:10:35.951 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_10_vcciaxxuk", + "field": "hematocrit", + "recordId": "8" +} +2026-03-08 19:10:35.951 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_11_tk5gliucf", + "field": "hemoglobin", + "recordId": "8" +} +2026-03-08 19:10:35.951 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_12_abhqvjmg5", + "field": "high_platelet_ratio", + "recordId": "8" +} +2026-03-08 19:10:35.951 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_13_p8j624iv2", + "field": "mean_corpuscular_volume", + "recordId": "8" +} +2026-03-08 19:10:35.951 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_14_rwum2cw2u", + "field": "mean_hemoglobin_concentratin", + "recordId": "8" +} +2026-03-08 19:10:35.951 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_15_f056yvtme", + "field": "mean_hemoglobin_concentration", + "recordId": "8" +} +2026-03-08 19:10:35.951 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_16_5o2al7oyz", + "field": "mean_platelet_volume", + "recordId": "8" +} +2026-03-08 19:10:35.951 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_17_zcd5zxn3u", + "field": "platelet_count", + "recordId": "8" +} +2026-03-08 19:10:35.951 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_18_skojo7cru", + "field": "platelet_volume", + "recordId": "8" +} +2026-03-08 19:10:35.951 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_19_5iin73wva", + "field": "platelet_volume_distribution_width", + "recordId": "8" +} +2026-03-08 19:10:35.951 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_20_4lxpihy8o", + "field": "rbc_volume_distribution_width_cv", + "recordId": "8" +} +2026-03-08 19:10:35.951 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_21_gl7d8n5si", + "field": "rbc_volume_distribution_width_sd", + "recordId": "8" +} +2026-03-08 19:10:35.951 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_22_1fnjktj7v", + "field": "red_blood_cell_count", + "recordId": "8" +} +2026-03-08 19:10:35.951 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_23_zrt2ixskp", + "field": "relative_value_of_lymphocytes", + "recordId": "8" +} +2026-03-08 19:10:35.951 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_24_a5oovpadb", + "field": "relative_value_of_monocytes", + "recordId": "8" +} +2026-03-08 19:10:35.951 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_25_rr9uk1but", + "field": "relative_value_of_neutrophils", + "recordId": "8" +} +2026-03-08 19:10:35.951 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_26_f9hez0b4k", + "field": "white_blood_cell_count", + "recordId": "8" +} +2026-03-08 19:10:35.952 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.952 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.952 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.959 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:10:35.960 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 0 +} +2026-03-08 19:10:35.960 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_3_delac4edo", + "field": "absolute_value_of_basophilic_cells", + "recordId": "8" +} +2026-03-08 19:10:35.960 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_4_8tcnwi9gg", + "field": "absolute_value_of_lymphocytes", + "recordId": "8" +} +2026-03-08 19:10:35.960 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_5_4k7227d38", + "field": "absolute_value_of_monocytes", + "recordId": "8" +} +2026-03-08 19:10:35.960 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_6_2e6slhi9p", + "field": "absolute_value_of_neutrophils", + "recordId": "8" +} +2026-03-08 19:10:35.960 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_7_u8z0d18gb", + "field": "eosinophil_absolute_count", + "recordId": "8" +} +2026-03-08 19:10:35.960 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_8_hculwqhyk", + "field": "eosinophil_count_ratio", + "recordId": "8" +} +2026-03-08 19:10:35.960 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_9_ftk4426nd", + "field": "eosinophil_countratio", + "recordId": "8" +} +2026-03-08 19:10:35.960 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_10_vcciaxxuk", + "field": "hematocrit", + "recordId": "8" +} +2026-03-08 19:10:35.960 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_11_tk5gliucf", + "field": "hemoglobin", + "recordId": "8" +} +2026-03-08 19:10:35.960 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_12_abhqvjmg5", + "field": "high_platelet_ratio", + "recordId": "8" +} +2026-03-08 19:10:35.960 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_13_p8j624iv2", + "field": "mean_corpuscular_volume", + "recordId": "8" +} +2026-03-08 19:10:35.960 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_14_rwum2cw2u", + "field": "mean_hemoglobin_concentratin", + "recordId": "8" +} +2026-03-08 19:10:35.960 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_15_f056yvtme", + "field": "mean_hemoglobin_concentration", + "recordId": "8" +} +2026-03-08 19:10:35.960 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_16_5o2al7oyz", + "field": "mean_platelet_volume", + "recordId": "8" +} +2026-03-08 19:10:35.960 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_17_zcd5zxn3u", + "field": "platelet_count", + "recordId": "8" +} +2026-03-08 19:10:35.960 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_18_skojo7cru", + "field": "platelet_volume", + "recordId": "8" +} +2026-03-08 19:10:35.960 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_19_5iin73wva", + "field": "platelet_volume_distribution_width", + "recordId": "8" +} +2026-03-08 19:10:35.960 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_20_4lxpihy8o", + "field": "rbc_volume_distribution_width_cv", + "recordId": "8" +} +2026-03-08 19:10:35.960 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_21_gl7d8n5si", + "field": "rbc_volume_distribution_width_sd", + "recordId": "8" +} +2026-03-08 19:10:35.961 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_22_1fnjktj7v", + "field": "red_blood_cell_count", + "recordId": "8" +} +2026-03-08 19:10:35.961 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_23_zrt2ixskp", + "field": "relative_value_of_lymphocytes", + "recordId": "8" +} +2026-03-08 19:10:35.961 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_24_a5oovpadb", + "field": "relative_value_of_monocytes", + "recordId": "8" +} +2026-03-08 19:10:35.961 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_25_rr9uk1but", + "field": "relative_value_of_neutrophils", + "recordId": "8" +} +2026-03-08 19:10:35.961 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_26_f9hez0b4k", + "field": "white_blood_cell_count", + "recordId": "8" +} +2026-03-08 19:10:35.961 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.961 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.961 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.967 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:10:35.968 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 0 +} +2026-03-08 19:10:35.969 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_3_delac4edo", + "field": "absolute_value_of_basophilic_cells", + "recordId": "8" +} +2026-03-08 19:10:35.969 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_4_8tcnwi9gg", + "field": "absolute_value_of_lymphocytes", + "recordId": "8" +} +2026-03-08 19:10:35.969 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_5_4k7227d38", + "field": "absolute_value_of_monocytes", + "recordId": "8" +} +2026-03-08 19:10:35.969 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_6_2e6slhi9p", + "field": "absolute_value_of_neutrophils", + "recordId": "8" +} +2026-03-08 19:10:35.969 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_7_u8z0d18gb", + "field": "eosinophil_absolute_count", + "recordId": "8" +} +2026-03-08 19:10:35.969 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_8_hculwqhyk", + "field": "eosinophil_count_ratio", + "recordId": "8" +} +2026-03-08 19:10:35.969 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_9_ftk4426nd", + "field": "eosinophil_countratio", + "recordId": "8" +} +2026-03-08 19:10:35.969 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_10_vcciaxxuk", + "field": "hematocrit", + "recordId": "8" +} +2026-03-08 19:10:35.969 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_11_tk5gliucf", + "field": "hemoglobin", + "recordId": "8" +} +2026-03-08 19:10:35.969 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_12_abhqvjmg5", + "field": "high_platelet_ratio", + "recordId": "8" +} +2026-03-08 19:10:35.969 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_13_p8j624iv2", + "field": "mean_corpuscular_volume", + "recordId": "8" +} +2026-03-08 19:10:35.969 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_14_rwum2cw2u", + "field": "mean_hemoglobin_concentratin", + "recordId": "8" +} +2026-03-08 19:10:35.969 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_15_f056yvtme", + "field": "mean_hemoglobin_concentration", + "recordId": "8" +} +2026-03-08 19:10:35.969 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_16_5o2al7oyz", + "field": "mean_platelet_volume", + "recordId": "8" +} +2026-03-08 19:10:35.969 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_17_zcd5zxn3u", + "field": "platelet_count", + "recordId": "8" +} +2026-03-08 19:10:35.969 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_18_skojo7cru", + "field": "platelet_volume", + "recordId": "8" +} +2026-03-08 19:10:35.969 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_19_5iin73wva", + "field": "platelet_volume_distribution_width", + "recordId": "8" +} +2026-03-08 19:10:35.969 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_20_4lxpihy8o", + "field": "rbc_volume_distribution_width_cv", + "recordId": "8" +} +2026-03-08 19:10:35.969 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_21_gl7d8n5si", + "field": "rbc_volume_distribution_width_sd", + "recordId": "8" +} +2026-03-08 19:10:35.969 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_22_1fnjktj7v", + "field": "red_blood_cell_count", + "recordId": "8" +} +2026-03-08 19:10:35.969 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_23_zrt2ixskp", + "field": "relative_value_of_lymphocytes", + "recordId": "8" +} +2026-03-08 19:10:35.969 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_24_a5oovpadb", + "field": "relative_value_of_monocytes", + "recordId": "8" +} +2026-03-08 19:10:35.969 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_25_rr9uk1but", + "field": "relative_value_of_neutrophils", + "recordId": "8" +} +2026-03-08 19:10:35.969 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_26_f9hez0b4k", + "field": "white_blood_cell_count", + "recordId": "8" +} +2026-03-08 19:10:35.969 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.969 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.969 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.975 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:10:35.976 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 0 +} +2026-03-08 19:10:35.976 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_0_hr2q1opmw", + "field": "visiting_date", + "recordId": "9" +} +2026-03-08 19:10:35.976 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_1_sdim7iks9", + "field": [ + "check_date", + "visiting_date" + ], + "recordId": "9" +} +2026-03-08 19:10:35.976 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_2_1r0huss46", + "field": [ + "date_of_assessment_cmss", + "visiting_date" + ], + "recordId": "9" +} +2026-03-08 19:10:35.976 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_3_utmkeahm6", + "field": [ + "date_of_assessment_sf_mpq_scale", + "visiting_date" + ], + "recordId": "9" +} +2026-03-08 19:10:35.976 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_4_3j2aozbms", + "field": [ + "date_of_signature", + "date_of_first_consultation" + ], + "recordId": "9" +} +2026-03-08 19:10:35.976 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_5_ux8721fut", + "field": [ + "enrollment_status", + "sign_informed_consent_form" + ], + "recordId": "9" +} +2026-03-08 19:10:35.976 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_6_res5lvb6g", + "field": [ + "visiting_date", + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:35.976 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_7_wpzbvli56", + "field": [ + "date_of_first_consultation", + "visiting_date" + ], + "recordId": "9" +} +2026-03-08 19:10:35.976 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_0_424mnnlv0", + "field": "educational_level", + "recordId": "9" +} +2026-03-08 19:10:35.976 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_1_qiy3gde3a", + "field": "marital_status", + "recordId": "9" +} +2026-03-08 19:10:35.976 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_2_hc1jjvymo", + "field": "sex", + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_3_delac4edo", + "field": "absolute_value_of_basophilic_cells", + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_4_8tcnwi9gg", + "field": "absolute_value_of_lymphocytes", + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_5_4k7227d38", + "field": "absolute_value_of_monocytes", + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_6_2e6slhi9p", + "field": "absolute_value_of_neutrophils", + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_7_u8z0d18gb", + "field": "eosinophil_absolute_count", + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_8_hculwqhyk", + "field": "eosinophil_count_ratio", + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_9_ftk4426nd", + "field": "eosinophil_countratio", + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_10_vcciaxxuk", + "field": "hematocrit", + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_11_tk5gliucf", + "field": "hemoglobin", + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_12_abhqvjmg5", + "field": "high_platelet_ratio", + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_13_p8j624iv2", + "field": "mean_corpuscular_volume", + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_14_rwum2cw2u", + "field": "mean_hemoglobin_concentratin", + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_15_f056yvtme", + "field": "mean_hemoglobin_concentration", + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_16_5o2al7oyz", + "field": "mean_platelet_volume", + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_17_zcd5zxn3u", + "field": "platelet_count", + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_18_skojo7cru", + "field": "platelet_volume", + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_19_5iin73wva", + "field": "platelet_volume_distribution_width", + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_20_4lxpihy8o", + "field": "rbc_volume_distribution_width_cv", + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_21_gl7d8n5si", + "field": "rbc_volume_distribution_width_sd", + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_22_1fnjktj7v", + "field": "red_blood_cell_count", + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_23_zrt2ixskp", + "field": "relative_value_of_lymphocytes", + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_24_a5oovpadb", + "field": "relative_value_of_monocytes", + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_25_rr9uk1but", + "field": "relative_value_of_neutrophils", + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_26_f9hez0b4k", + "field": "white_blood_cell_count", + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_32_a2cxjf9tb", + "field": "sign_informed_consent_form", + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_41_eahuliyh0", + "field": "alcohol_consumption_history", + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_42_m8cptozxk", + "field": "smoking_history", + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_0_96ftk49kx", + "field": [ + "age", + "inclusion_criteria2" + ], + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_1_zw7ja89ei", + "field": [ + "sign_informed_consent_form", + "inclusion_criteria5" + ], + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_2_44m45t6m6", + "field": "inclusion_criteria1", + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_3_zfn62bs40", + "field": "exclusion_criteria2", + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_4_vgyy51zou", + "field": "exclusion_criteria3", + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_5_pbkwsnx0n", + "field": [ + "exclusion_criteria4", + "inclusion_criteria3" + ], + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_6_9ygdecsca", + "field": "exclusion_criteria5", + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_7_9sugwpwcf", + "field": "sex", + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_8_u079bu08z", + "field": [ + "enrollment_status", + "exclusion_criteria1", + "exclusion_criteria2", + "exclusion_criteria3", + "exclusion_criteria4", + "exclusion_criteria5" + ], + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_9_ufkub1swe", + "field": [ + "inclusion_criteria1", + "inclusion_criteria2", + "inclusion_criteria3", + "inclusion_criteria4", + "inclusion_criteria5" + ], + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_0_r79gvdu3h", + "field": [ + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_1_2uns9t23g", + "field": [ + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_2_os5ccvicv", + "field": [ + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_3_k2nlyk3q4", + "field": [ + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_4_8atbe12pb", + "field": [ + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_5_h62ympca8", + "field": [ + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_6_0m5vg872v", + "field": [ + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_7_4rvkpn2sq", + "field": [ + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_8_7s1fygjji", + "field": [ + "sign_informed_consent_form", + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_9_qd6pse9gj", + "field": [ + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_0_2fjs3h1t2", + "field": "visiting_date", + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_1_i81le4vme", + "field": [ + "date_of_signature", + "visiting_date" + ], + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_2_a8k2wend3", + "field": [ + "date_of_assessment_cmss", + "visiting_date" + ], + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_3_otk3muqgy", + "field": [ + "date_of_assessment_sf_mpq_scale", + "visiting_date" + ], + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_4_3e0g4h3xt", + "field": [ + "check_date", + "visiting_date" + ], + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "field": [ + "date_of_first_consultation", + "visiting_date" + ], + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_6_eoavacbfk", + "field": [ + "enrollment_status", + "sign_informed_consent_form" + ], + "recordId": "9" +} +2026-03-08 19:10:35.977 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "field": [ + "visiting_date", + "date_of_birth" + ], + "recordId": "9" +} +2026-03-08 19:10:35.982 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:10:35.984 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 0 +} +2026-03-08 19:10:35.984 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_0_hr2q1opmw", + "field": "visiting_date", + "recordId": "9" +} +2026-03-08 19:10:35.984 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_1_sdim7iks9", + "field": [ + "check_date", + "visiting_date" + ], + "recordId": "9" +} +2026-03-08 19:10:35.984 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_2_1r0huss46", + "field": [ + "date_of_assessment_cmss", + "visiting_date" + ], + "recordId": "9" +} +2026-03-08 19:10:35.984 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_3_utmkeahm6", + "field": [ + "date_of_assessment_sf_mpq_scale", + "visiting_date" + ], + "recordId": "9" +} +2026-03-08 19:10:35.984 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_4_3j2aozbms", + "field": [ + "date_of_signature", + "date_of_first_consultation" + ], + "recordId": "9" +} +2026-03-08 19:10:35.984 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_5_ux8721fut", + "field": [ + "enrollment_status", + "sign_informed_consent_form" + ], + "recordId": "9" +} +2026-03-08 19:10:35.984 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_6_res5lvb6g", + "field": [ + "visiting_date", + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:35.984 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_7_wpzbvli56", + "field": [ + "date_of_first_consultation", + "visiting_date" + ], + "recordId": "9" +} +2026-03-08 19:10:35.984 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_0_424mnnlv0", + "field": "educational_level", + "recordId": "9" +} +2026-03-08 19:10:35.984 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_1_qiy3gde3a", + "field": "marital_status", + "recordId": "9" +} +2026-03-08 19:10:35.984 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_2_hc1jjvymo", + "field": "sex", + "recordId": "9" +} +2026-03-08 19:10:35.984 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_3_delac4edo", + "field": "absolute_value_of_basophilic_cells", + "recordId": "9" +} +2026-03-08 19:10:35.984 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_4_8tcnwi9gg", + "field": "absolute_value_of_lymphocytes", + "recordId": "9" +} +2026-03-08 19:10:35.984 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_5_4k7227d38", + "field": "absolute_value_of_monocytes", + "recordId": "9" +} +2026-03-08 19:10:35.984 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_6_2e6slhi9p", + "field": "absolute_value_of_neutrophils", + "recordId": "9" +} +2026-03-08 19:10:35.984 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_7_u8z0d18gb", + "field": "eosinophil_absolute_count", + "recordId": "9" +} +2026-03-08 19:10:35.984 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_8_hculwqhyk", + "field": "eosinophil_count_ratio", + "recordId": "9" +} +2026-03-08 19:10:35.984 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_9_ftk4426nd", + "field": "eosinophil_countratio", + "recordId": "9" +} +2026-03-08 19:10:35.984 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_10_vcciaxxuk", + "field": "hematocrit", + "recordId": "9" +} +2026-03-08 19:10:35.984 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_11_tk5gliucf", + "field": "hemoglobin", + "recordId": "9" +} +2026-03-08 19:10:35.984 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_12_abhqvjmg5", + "field": "high_platelet_ratio", + "recordId": "9" +} +2026-03-08 19:10:35.984 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_13_p8j624iv2", + "field": "mean_corpuscular_volume", + "recordId": "9" +} +2026-03-08 19:10:35.984 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_14_rwum2cw2u", + "field": "mean_hemoglobin_concentratin", + "recordId": "9" +} +2026-03-08 19:10:35.984 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_15_f056yvtme", + "field": "mean_hemoglobin_concentration", + "recordId": "9" +} +2026-03-08 19:10:35.985 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_16_5o2al7oyz", + "field": "mean_platelet_volume", + "recordId": "9" +} +2026-03-08 19:10:35.985 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_17_zcd5zxn3u", + "field": "platelet_count", + "recordId": "9" +} +2026-03-08 19:10:35.985 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_18_skojo7cru", + "field": "platelet_volume", + "recordId": "9" +} +2026-03-08 19:10:35.985 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_19_5iin73wva", + "field": "platelet_volume_distribution_width", + "recordId": "9" +} +2026-03-08 19:10:35.985 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_20_4lxpihy8o", + "field": "rbc_volume_distribution_width_cv", + "recordId": "9" +} +2026-03-08 19:10:35.985 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_21_gl7d8n5si", + "field": "rbc_volume_distribution_width_sd", + "recordId": "9" +} +2026-03-08 19:10:35.985 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_22_1fnjktj7v", + "field": "red_blood_cell_count", + "recordId": "9" +} +2026-03-08 19:10:35.985 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_23_zrt2ixskp", + "field": "relative_value_of_lymphocytes", + "recordId": "9" +} +2026-03-08 19:10:35.985 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_24_a5oovpadb", + "field": "relative_value_of_monocytes", + "recordId": "9" +} +2026-03-08 19:10:35.985 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_25_rr9uk1but", + "field": "relative_value_of_neutrophils", + "recordId": "9" +} +2026-03-08 19:10:35.985 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_26_f9hez0b4k", + "field": "white_blood_cell_count", + "recordId": "9" +} +2026-03-08 19:10:35.985 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_32_a2cxjf9tb", + "field": "sign_informed_consent_form", + "recordId": "9" +} +2026-03-08 19:10:35.985 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_41_eahuliyh0", + "field": "alcohol_consumption_history", + "recordId": "9" +} +2026-03-08 19:10:35.985 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_42_m8cptozxk", + "field": "smoking_history", + "recordId": "9" +} +2026-03-08 19:10:35.985 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_0_96ftk49kx", + "field": [ + "age", + "inclusion_criteria2" + ], + "recordId": "9" +} +2026-03-08 19:10:35.985 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_1_zw7ja89ei", + "field": [ + "sign_informed_consent_form", + "inclusion_criteria5" + ], + "recordId": "9" +} +2026-03-08 19:10:35.985 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_2_44m45t6m6", + "field": "inclusion_criteria1", + "recordId": "9" +} +2026-03-08 19:10:35.985 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_3_zfn62bs40", + "field": "exclusion_criteria2", + "recordId": "9" +} +2026-03-08 19:10:35.985 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_4_vgyy51zou", + "field": "exclusion_criteria3", + "recordId": "9" +} +2026-03-08 19:10:35.985 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_5_pbkwsnx0n", + "field": [ + "exclusion_criteria4", + "inclusion_criteria3" + ], + "recordId": "9" +} +2026-03-08 19:10:35.985 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_6_9ygdecsca", + "field": "exclusion_criteria5", + "recordId": "9" +} +2026-03-08 19:10:35.985 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_7_9sugwpwcf", + "field": "sex", + "recordId": "9" +} +2026-03-08 19:10:35.985 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_8_u079bu08z", + "field": [ + "enrollment_status", + "exclusion_criteria1", + "exclusion_criteria2", + "exclusion_criteria3", + "exclusion_criteria4", + "exclusion_criteria5" + ], + "recordId": "9" +} +2026-03-08 19:10:35.985 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_9_ufkub1swe", + "field": [ + "inclusion_criteria1", + "inclusion_criteria2", + "inclusion_criteria3", + "inclusion_criteria4", + "inclusion_criteria5" + ], + "recordId": "9" +} +2026-03-08 19:10:35.985 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_0_r79gvdu3h", + "field": [ + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:35.985 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_1_2uns9t23g", + "field": [ + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:35.985 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_2_os5ccvicv", + "field": [ + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:35.985 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_3_k2nlyk3q4", + "field": [ + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:35.985 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_4_8atbe12pb", + "field": [ + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:35.985 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_5_h62ympca8", + "field": [ + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:35.985 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_6_0m5vg872v", + "field": [ + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:35.985 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_7_4rvkpn2sq", + "field": [ + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:35.985 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_8_7s1fygjji", + "field": [ + "sign_informed_consent_form", + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:35.985 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_9_qd6pse9gj", + "field": [ + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:35.985 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_0_2fjs3h1t2", + "field": "visiting_date", + "recordId": "9" +} +2026-03-08 19:10:35.985 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_1_i81le4vme", + "field": [ + "date_of_signature", + "visiting_date" + ], + "recordId": "9" +} +2026-03-08 19:10:35.985 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_2_a8k2wend3", + "field": [ + "date_of_assessment_cmss", + "visiting_date" + ], + "recordId": "9" +} +2026-03-08 19:10:35.985 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_3_otk3muqgy", + "field": [ + "date_of_assessment_sf_mpq_scale", + "visiting_date" + ], + "recordId": "9" +} +2026-03-08 19:10:35.985 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_4_3e0g4h3xt", + "field": [ + "check_date", + "visiting_date" + ], + "recordId": "9" +} +2026-03-08 19:10:35.985 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "field": [ + "date_of_first_consultation", + "visiting_date" + ], + "recordId": "9" +} +2026-03-08 19:10:35.985 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_6_eoavacbfk", + "field": [ + "enrollment_status", + "sign_informed_consent_form" + ], + "recordId": "9" +} +2026-03-08 19:10:35.985 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "field": [ + "visiting_date", + "date_of_birth" + ], + "recordId": "9" +} +2026-03-08 19:10:35.990 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:10:35.991 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 0 +} +2026-03-08 19:10:35.991 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_3_delac4edo", + "field": "absolute_value_of_basophilic_cells", + "recordId": "9" +} +2026-03-08 19:10:35.991 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_4_8tcnwi9gg", + "field": "absolute_value_of_lymphocytes", + "recordId": "9" +} +2026-03-08 19:10:35.991 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_5_4k7227d38", + "field": "absolute_value_of_monocytes", + "recordId": "9" +} +2026-03-08 19:10:35.991 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_6_2e6slhi9p", + "field": "absolute_value_of_neutrophils", + "recordId": "9" +} +2026-03-08 19:10:35.991 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_7_u8z0d18gb", + "field": "eosinophil_absolute_count", + "recordId": "9" +} +2026-03-08 19:10:35.991 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_8_hculwqhyk", + "field": "eosinophil_count_ratio", + "recordId": "9" +} +2026-03-08 19:10:35.991 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_9_ftk4426nd", + "field": "eosinophil_countratio", + "recordId": "9" +} +2026-03-08 19:10:35.991 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_10_vcciaxxuk", + "field": "hematocrit", + "recordId": "9" +} +2026-03-08 19:10:35.991 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_11_tk5gliucf", + "field": "hemoglobin", + "recordId": "9" +} +2026-03-08 19:10:35.991 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_12_abhqvjmg5", + "field": "high_platelet_ratio", + "recordId": "9" +} +2026-03-08 19:10:35.991 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_13_p8j624iv2", + "field": "mean_corpuscular_volume", + "recordId": "9" +} +2026-03-08 19:10:35.991 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_14_rwum2cw2u", + "field": "mean_hemoglobin_concentratin", + "recordId": "9" +} +2026-03-08 19:10:35.991 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_15_f056yvtme", + "field": "mean_hemoglobin_concentration", + "recordId": "9" +} +2026-03-08 19:10:35.991 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_16_5o2al7oyz", + "field": "mean_platelet_volume", + "recordId": "9" +} +2026-03-08 19:10:35.991 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_17_zcd5zxn3u", + "field": "platelet_count", + "recordId": "9" +} +2026-03-08 19:10:35.991 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_18_skojo7cru", + "field": "platelet_volume", + "recordId": "9" +} +2026-03-08 19:10:35.991 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_19_5iin73wva", + "field": "platelet_volume_distribution_width", + "recordId": "9" +} +2026-03-08 19:10:35.991 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_20_4lxpihy8o", + "field": "rbc_volume_distribution_width_cv", + "recordId": "9" +} +2026-03-08 19:10:35.991 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_21_gl7d8n5si", + "field": "rbc_volume_distribution_width_sd", + "recordId": "9" +} +2026-03-08 19:10:35.991 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_22_1fnjktj7v", + "field": "red_blood_cell_count", + "recordId": "9" +} +2026-03-08 19:10:35.991 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_23_zrt2ixskp", + "field": "relative_value_of_lymphocytes", + "recordId": "9" +} +2026-03-08 19:10:35.991 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_24_a5oovpadb", + "field": "relative_value_of_monocytes", + "recordId": "9" +} +2026-03-08 19:10:35.992 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_25_rr9uk1but", + "field": "relative_value_of_neutrophils", + "recordId": "9" +} +2026-03-08 19:10:35.992 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_26_f9hez0b4k", + "field": "white_blood_cell_count", + "recordId": "9" +} +2026-03-08 19:10:35.992 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.992 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.992 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:35.999 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:10:36.000 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 0 +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_0_hr2q1opmw", + "field": "visiting_date", + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_1_sdim7iks9", + "field": [ + "check_date", + "visiting_date" + ], + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_2_1r0huss46", + "field": [ + "date_of_assessment_cmss", + "visiting_date" + ], + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_3_utmkeahm6", + "field": [ + "date_of_assessment_sf_mpq_scale", + "visiting_date" + ], + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_4_3j2aozbms", + "field": [ + "date_of_signature", + "date_of_first_consultation" + ], + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_5_ux8721fut", + "field": [ + "enrollment_status", + "sign_informed_consent_form" + ], + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_6_res5lvb6g", + "field": [ + "visiting_date", + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_7_wpzbvli56", + "field": [ + "date_of_first_consultation", + "visiting_date" + ], + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_0_424mnnlv0", + "field": "educational_level", + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_1_qiy3gde3a", + "field": "marital_status", + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_2_hc1jjvymo", + "field": "sex", + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_3_delac4edo", + "field": "absolute_value_of_basophilic_cells", + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_4_8tcnwi9gg", + "field": "absolute_value_of_lymphocytes", + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_5_4k7227d38", + "field": "absolute_value_of_monocytes", + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_6_2e6slhi9p", + "field": "absolute_value_of_neutrophils", + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_7_u8z0d18gb", + "field": "eosinophil_absolute_count", + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_8_hculwqhyk", + "field": "eosinophil_count_ratio", + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_9_ftk4426nd", + "field": "eosinophil_countratio", + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_10_vcciaxxuk", + "field": "hematocrit", + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_11_tk5gliucf", + "field": "hemoglobin", + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_12_abhqvjmg5", + "field": "high_platelet_ratio", + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_13_p8j624iv2", + "field": "mean_corpuscular_volume", + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_14_rwum2cw2u", + "field": "mean_hemoglobin_concentratin", + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_15_f056yvtme", + "field": "mean_hemoglobin_concentration", + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_16_5o2al7oyz", + "field": "mean_platelet_volume", + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_17_zcd5zxn3u", + "field": "platelet_count", + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_18_skojo7cru", + "field": "platelet_volume", + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_19_5iin73wva", + "field": "platelet_volume_distribution_width", + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_20_4lxpihy8o", + "field": "rbc_volume_distribution_width_cv", + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_21_gl7d8n5si", + "field": "rbc_volume_distribution_width_sd", + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_22_1fnjktj7v", + "field": "red_blood_cell_count", + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_23_zrt2ixskp", + "field": "relative_value_of_lymphocytes", + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_24_a5oovpadb", + "field": "relative_value_of_monocytes", + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_25_rr9uk1but", + "field": "relative_value_of_neutrophils", + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_26_f9hez0b4k", + "field": "white_blood_cell_count", + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_32_a2cxjf9tb", + "field": "sign_informed_consent_form", + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_41_eahuliyh0", + "field": "alcohol_consumption_history", + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_42_m8cptozxk", + "field": "smoking_history", + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_0_96ftk49kx", + "field": [ + "age", + "inclusion_criteria2" + ], + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_1_zw7ja89ei", + "field": [ + "sign_informed_consent_form", + "inclusion_criteria5" + ], + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_2_44m45t6m6", + "field": "inclusion_criteria1", + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_3_zfn62bs40", + "field": "exclusion_criteria2", + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_4_vgyy51zou", + "field": "exclusion_criteria3", + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_5_pbkwsnx0n", + "field": [ + "exclusion_criteria4", + "inclusion_criteria3" + ], + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_6_9ygdecsca", + "field": "exclusion_criteria5", + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_7_9sugwpwcf", + "field": "sex", + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_8_u079bu08z", + "field": [ + "enrollment_status", + "exclusion_criteria1", + "exclusion_criteria2", + "exclusion_criteria3", + "exclusion_criteria4", + "exclusion_criteria5" + ], + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_9_ufkub1swe", + "field": [ + "inclusion_criteria1", + "inclusion_criteria2", + "inclusion_criteria3", + "inclusion_criteria4", + "inclusion_criteria5" + ], + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_0_r79gvdu3h", + "field": [ + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_1_2uns9t23g", + "field": [ + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_2_os5ccvicv", + "field": [ + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_3_k2nlyk3q4", + "field": [ + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_4_8atbe12pb", + "field": [ + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_5_h62ympca8", + "field": [ + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_6_0m5vg872v", + "field": [ + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_7_4rvkpn2sq", + "field": [ + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_8_7s1fygjji", + "field": [ + "sign_informed_consent_form", + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:36.000 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_9_qd6pse9gj", + "field": [ + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:36.001 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_0_2fjs3h1t2", + "field": "visiting_date", + "recordId": "9" +} +2026-03-08 19:10:36.001 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_1_i81le4vme", + "field": [ + "date_of_signature", + "visiting_date" + ], + "recordId": "9" +} +2026-03-08 19:10:36.001 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_2_a8k2wend3", + "field": [ + "date_of_assessment_cmss", + "visiting_date" + ], + "recordId": "9" +} +2026-03-08 19:10:36.001 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_3_otk3muqgy", + "field": [ + "date_of_assessment_sf_mpq_scale", + "visiting_date" + ], + "recordId": "9" +} +2026-03-08 19:10:36.001 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_4_3e0g4h3xt", + "field": [ + "check_date", + "visiting_date" + ], + "recordId": "9" +} +2026-03-08 19:10:36.001 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "field": [ + "date_of_first_consultation", + "visiting_date" + ], + "recordId": "9" +} +2026-03-08 19:10:36.001 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_6_eoavacbfk", + "field": [ + "enrollment_status", + "sign_informed_consent_form" + ], + "recordId": "9" +} +2026-03-08 19:10:36.001 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "field": [ + "visiting_date", + "date_of_birth" + ], + "recordId": "9" +} +2026-03-08 19:10:36.004 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:10:36.005 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 0 +} +2026-03-08 19:10:36.005 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_0_hr2q1opmw", + "field": "visiting_date", + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_1_sdim7iks9", + "field": [ + "check_date", + "visiting_date" + ], + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_2_1r0huss46", + "field": [ + "date_of_assessment_cmss", + "visiting_date" + ], + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_3_utmkeahm6", + "field": [ + "date_of_assessment_sf_mpq_scale", + "visiting_date" + ], + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_4_3j2aozbms", + "field": [ + "date_of_signature", + "date_of_first_consultation" + ], + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_5_ux8721fut", + "field": [ + "enrollment_status", + "sign_informed_consent_form" + ], + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_6_res5lvb6g", + "field": [ + "visiting_date", + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_7_wpzbvli56", + "field": [ + "date_of_first_consultation", + "visiting_date" + ], + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_0_424mnnlv0", + "field": "educational_level", + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_1_qiy3gde3a", + "field": "marital_status", + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_2_hc1jjvymo", + "field": "sex", + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_3_delac4edo", + "field": "absolute_value_of_basophilic_cells", + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_4_8tcnwi9gg", + "field": "absolute_value_of_lymphocytes", + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_5_4k7227d38", + "field": "absolute_value_of_monocytes", + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_6_2e6slhi9p", + "field": "absolute_value_of_neutrophils", + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_7_u8z0d18gb", + "field": "eosinophil_absolute_count", + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_8_hculwqhyk", + "field": "eosinophil_count_ratio", + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_9_ftk4426nd", + "field": "eosinophil_countratio", + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_10_vcciaxxuk", + "field": "hematocrit", + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_11_tk5gliucf", + "field": "hemoglobin", + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_12_abhqvjmg5", + "field": "high_platelet_ratio", + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_13_p8j624iv2", + "field": "mean_corpuscular_volume", + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_14_rwum2cw2u", + "field": "mean_hemoglobin_concentratin", + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_15_f056yvtme", + "field": "mean_hemoglobin_concentration", + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_16_5o2al7oyz", + "field": "mean_platelet_volume", + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_17_zcd5zxn3u", + "field": "platelet_count", + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_18_skojo7cru", + "field": "platelet_volume", + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_19_5iin73wva", + "field": "platelet_volume_distribution_width", + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_20_4lxpihy8o", + "field": "rbc_volume_distribution_width_cv", + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_21_gl7d8n5si", + "field": "rbc_volume_distribution_width_sd", + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_22_1fnjktj7v", + "field": "red_blood_cell_count", + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_23_zrt2ixskp", + "field": "relative_value_of_lymphocytes", + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_24_a5oovpadb", + "field": "relative_value_of_monocytes", + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_25_rr9uk1but", + "field": "relative_value_of_neutrophils", + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_26_f9hez0b4k", + "field": "white_blood_cell_count", + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_32_a2cxjf9tb", + "field": "sign_informed_consent_form", + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_41_eahuliyh0", + "field": "alcohol_consumption_history", + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_42_m8cptozxk", + "field": "smoking_history", + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_0_96ftk49kx", + "field": [ + "age", + "inclusion_criteria2" + ], + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_1_zw7ja89ei", + "field": [ + "sign_informed_consent_form", + "inclusion_criteria5" + ], + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_2_44m45t6m6", + "field": "inclusion_criteria1", + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_3_zfn62bs40", + "field": "exclusion_criteria2", + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_4_vgyy51zou", + "field": "exclusion_criteria3", + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_5_pbkwsnx0n", + "field": [ + "exclusion_criteria4", + "inclusion_criteria3" + ], + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_6_9ygdecsca", + "field": "exclusion_criteria5", + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_7_9sugwpwcf", + "field": "sex", + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_8_u079bu08z", + "field": [ + "enrollment_status", + "exclusion_criteria1", + "exclusion_criteria2", + "exclusion_criteria3", + "exclusion_criteria4", + "exclusion_criteria5" + ], + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_9_ufkub1swe", + "field": [ + "inclusion_criteria1", + "inclusion_criteria2", + "inclusion_criteria3", + "inclusion_criteria4", + "inclusion_criteria5" + ], + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_0_r79gvdu3h", + "field": [ + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_1_2uns9t23g", + "field": [ + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_2_os5ccvicv", + "field": [ + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_3_k2nlyk3q4", + "field": [ + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_4_8atbe12pb", + "field": [ + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_5_h62ympca8", + "field": [ + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_6_0m5vg872v", + "field": [ + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_7_4rvkpn2sq", + "field": [ + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_8_7s1fygjji", + "field": [ + "sign_informed_consent_form", + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_9_qd6pse9gj", + "field": [ + "date_of_signature" + ], + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_0_2fjs3h1t2", + "field": "visiting_date", + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_1_i81le4vme", + "field": [ + "date_of_signature", + "visiting_date" + ], + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_2_a8k2wend3", + "field": [ + "date_of_assessment_cmss", + "visiting_date" + ], + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_3_otk3muqgy", + "field": [ + "date_of_assessment_sf_mpq_scale", + "visiting_date" + ], + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_4_3e0g4h3xt", + "field": [ + "check_date", + "visiting_date" + ], + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "field": [ + "date_of_first_consultation", + "visiting_date" + ], + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_6_eoavacbfk", + "field": [ + "enrollment_status", + "sign_informed_consent_form" + ], + "recordId": "9" +} +2026-03-08 19:10:36.006 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "field": [ + "visiting_date", + "date_of_birth" + ], + "recordId": "9" +} +2026-03-08 19:10:36.011 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:10:36.012 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 0 +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_0_hr2q1opmw", + "field": "visiting_date", + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_1_sdim7iks9", + "field": [ + "check_date", + "visiting_date" + ], + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_2_1r0huss46", + "field": [ + "date_of_assessment_cmss", + "visiting_date" + ], + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_3_utmkeahm6", + "field": [ + "date_of_assessment_sf_mpq_scale", + "visiting_date" + ], + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_4_3j2aozbms", + "field": [ + "date_of_signature", + "date_of_first_consultation" + ], + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_5_ux8721fut", + "field": [ + "enrollment_status", + "sign_informed_consent_form" + ], + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_6_res5lvb6g", + "field": [ + "visiting_date", + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_7_wpzbvli56", + "field": [ + "date_of_first_consultation", + "visiting_date" + ], + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_0_424mnnlv0", + "field": "educational_level", + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_1_qiy3gde3a", + "field": "marital_status", + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_2_hc1jjvymo", + "field": "sex", + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_3_delac4edo", + "field": "absolute_value_of_basophilic_cells", + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_4_8tcnwi9gg", + "field": "absolute_value_of_lymphocytes", + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_5_4k7227d38", + "field": "absolute_value_of_monocytes", + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_6_2e6slhi9p", + "field": "absolute_value_of_neutrophils", + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_7_u8z0d18gb", + "field": "eosinophil_absolute_count", + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_8_hculwqhyk", + "field": "eosinophil_count_ratio", + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_9_ftk4426nd", + "field": "eosinophil_countratio", + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_10_vcciaxxuk", + "field": "hematocrit", + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_11_tk5gliucf", + "field": "hemoglobin", + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_12_abhqvjmg5", + "field": "high_platelet_ratio", + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_13_p8j624iv2", + "field": "mean_corpuscular_volume", + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_14_rwum2cw2u", + "field": "mean_hemoglobin_concentratin", + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_15_f056yvtme", + "field": "mean_hemoglobin_concentration", + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_16_5o2al7oyz", + "field": "mean_platelet_volume", + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_17_zcd5zxn3u", + "field": "platelet_count", + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_18_skojo7cru", + "field": "platelet_volume", + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_19_5iin73wva", + "field": "platelet_volume_distribution_width", + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_20_4lxpihy8o", + "field": "rbc_volume_distribution_width_cv", + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_21_gl7d8n5si", + "field": "rbc_volume_distribution_width_sd", + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_22_1fnjktj7v", + "field": "red_blood_cell_count", + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_23_zrt2ixskp", + "field": "relative_value_of_lymphocytes", + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_24_a5oovpadb", + "field": "relative_value_of_monocytes", + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_25_rr9uk1but", + "field": "relative_value_of_neutrophils", + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_26_f9hez0b4k", + "field": "white_blood_cell_count", + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_32_a2cxjf9tb", + "field": "sign_informed_consent_form", + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_41_eahuliyh0", + "field": "alcohol_consumption_history", + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_42_m8cptozxk", + "field": "smoking_history", + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_0_96ftk49kx", + "field": [ + "age", + "inclusion_criteria2" + ], + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_1_zw7ja89ei", + "field": [ + "sign_informed_consent_form", + "inclusion_criteria5" + ], + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_2_44m45t6m6", + "field": "inclusion_criteria1", + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_3_zfn62bs40", + "field": "exclusion_criteria2", + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_4_vgyy51zou", + "field": "exclusion_criteria3", + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_5_pbkwsnx0n", + "field": [ + "exclusion_criteria4", + "inclusion_criteria3" + ], + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_6_9ygdecsca", + "field": "exclusion_criteria5", + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_7_9sugwpwcf", + "field": "sex", + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_8_u079bu08z", + "field": [ + "enrollment_status", + "exclusion_criteria1", + "exclusion_criteria2", + "exclusion_criteria3", + "exclusion_criteria4", + "exclusion_criteria5" + ], + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_9_ufkub1swe", + "field": [ + "inclusion_criteria1", + "inclusion_criteria2", + "inclusion_criteria3", + "inclusion_criteria4", + "inclusion_criteria5" + ], + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_0_r79gvdu3h", + "field": [ + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_1_2uns9t23g", + "field": [ + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_2_os5ccvicv", + "field": [ + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_3_k2nlyk3q4", + "field": [ + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_4_8atbe12pb", + "field": [ + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_5_h62ympca8", + "field": [ + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_6_0m5vg872v", + "field": [ + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_7_4rvkpn2sq", + "field": [ + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_8_7s1fygjji", + "field": [ + "sign_informed_consent_form", + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_9_qd6pse9gj", + "field": [ + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_0_2fjs3h1t2", + "field": "visiting_date", + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_1_i81le4vme", + "field": [ + "date_of_signature", + "visiting_date" + ], + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_2_a8k2wend3", + "field": [ + "date_of_assessment_cmss", + "visiting_date" + ], + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_3_otk3muqgy", + "field": [ + "date_of_assessment_sf_mpq_scale", + "visiting_date" + ], + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_4_3e0g4h3xt", + "field": [ + "check_date", + "visiting_date" + ], + "recordId": "10" +} +2026-03-08 19:10:36.012 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "field": [ + "date_of_first_consultation", + "visiting_date" + ], + "recordId": "10" +} +2026-03-08 19:10:36.013 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_6_eoavacbfk", + "field": [ + "enrollment_status", + "sign_informed_consent_form" + ], + "recordId": "10" +} +2026-03-08 19:10:36.013 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "field": [ + "visiting_date", + "date_of_birth" + ], + "recordId": "10" +} +2026-03-08 19:10:36.017 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:10:36.018 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 0 +} +2026-03-08 19:10:36.018 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_0_hr2q1opmw", + "field": "visiting_date", + "recordId": "10" +} +2026-03-08 19:10:36.018 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_1_sdim7iks9", + "field": [ + "check_date", + "visiting_date" + ], + "recordId": "10" +} +2026-03-08 19:10:36.018 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_2_1r0huss46", + "field": [ + "date_of_assessment_cmss", + "visiting_date" + ], + "recordId": "10" +} +2026-03-08 19:10:36.018 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_3_utmkeahm6", + "field": [ + "date_of_assessment_sf_mpq_scale", + "visiting_date" + ], + "recordId": "10" +} +2026-03-08 19:10:36.018 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_4_3j2aozbms", + "field": [ + "date_of_signature", + "date_of_first_consultation" + ], + "recordId": "10" +} +2026-03-08 19:10:36.018 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_5_ux8721fut", + "field": [ + "enrollment_status", + "sign_informed_consent_form" + ], + "recordId": "10" +} +2026-03-08 19:10:36.018 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_6_res5lvb6g", + "field": [ + "visiting_date", + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.018 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_7_wpzbvli56", + "field": [ + "date_of_first_consultation", + "visiting_date" + ], + "recordId": "10" +} +2026-03-08 19:10:36.018 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_0_424mnnlv0", + "field": "educational_level", + "recordId": "10" +} +2026-03-08 19:10:36.018 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_1_qiy3gde3a", + "field": "marital_status", + "recordId": "10" +} +2026-03-08 19:10:36.018 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_2_hc1jjvymo", + "field": "sex", + "recordId": "10" +} +2026-03-08 19:10:36.018 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_3_delac4edo", + "field": "absolute_value_of_basophilic_cells", + "recordId": "10" +} +2026-03-08 19:10:36.018 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_4_8tcnwi9gg", + "field": "absolute_value_of_lymphocytes", + "recordId": "10" +} +2026-03-08 19:10:36.018 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_5_4k7227d38", + "field": "absolute_value_of_monocytes", + "recordId": "10" +} +2026-03-08 19:10:36.018 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_6_2e6slhi9p", + "field": "absolute_value_of_neutrophils", + "recordId": "10" +} +2026-03-08 19:10:36.018 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_7_u8z0d18gb", + "field": "eosinophil_absolute_count", + "recordId": "10" +} +2026-03-08 19:10:36.018 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_8_hculwqhyk", + "field": "eosinophil_count_ratio", + "recordId": "10" +} +2026-03-08 19:10:36.018 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_9_ftk4426nd", + "field": "eosinophil_countratio", + "recordId": "10" +} +2026-03-08 19:10:36.018 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_10_vcciaxxuk", + "field": "hematocrit", + "recordId": "10" +} +2026-03-08 19:10:36.018 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_11_tk5gliucf", + "field": "hemoglobin", + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_12_abhqvjmg5", + "field": "high_platelet_ratio", + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_13_p8j624iv2", + "field": "mean_corpuscular_volume", + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_14_rwum2cw2u", + "field": "mean_hemoglobin_concentratin", + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_15_f056yvtme", + "field": "mean_hemoglobin_concentration", + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_16_5o2al7oyz", + "field": "mean_platelet_volume", + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_17_zcd5zxn3u", + "field": "platelet_count", + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_18_skojo7cru", + "field": "platelet_volume", + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_19_5iin73wva", + "field": "platelet_volume_distribution_width", + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_20_4lxpihy8o", + "field": "rbc_volume_distribution_width_cv", + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_21_gl7d8n5si", + "field": "rbc_volume_distribution_width_sd", + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_22_1fnjktj7v", + "field": "red_blood_cell_count", + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_23_zrt2ixskp", + "field": "relative_value_of_lymphocytes", + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_24_a5oovpadb", + "field": "relative_value_of_monocytes", + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_25_rr9uk1but", + "field": "relative_value_of_neutrophils", + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_26_f9hez0b4k", + "field": "white_blood_cell_count", + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_32_a2cxjf9tb", + "field": "sign_informed_consent_form", + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_41_eahuliyh0", + "field": "alcohol_consumption_history", + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_42_m8cptozxk", + "field": "smoking_history", + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_0_96ftk49kx", + "field": [ + "age", + "inclusion_criteria2" + ], + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_1_zw7ja89ei", + "field": [ + "sign_informed_consent_form", + "inclusion_criteria5" + ], + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_2_44m45t6m6", + "field": "inclusion_criteria1", + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_3_zfn62bs40", + "field": "exclusion_criteria2", + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_4_vgyy51zou", + "field": "exclusion_criteria3", + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_5_pbkwsnx0n", + "field": [ + "exclusion_criteria4", + "inclusion_criteria3" + ], + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_6_9ygdecsca", + "field": "exclusion_criteria5", + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_7_9sugwpwcf", + "field": "sex", + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_8_u079bu08z", + "field": [ + "enrollment_status", + "exclusion_criteria1", + "exclusion_criteria2", + "exclusion_criteria3", + "exclusion_criteria4", + "exclusion_criteria5" + ], + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_9_ufkub1swe", + "field": [ + "inclusion_criteria1", + "inclusion_criteria2", + "inclusion_criteria3", + "inclusion_criteria4", + "inclusion_criteria5" + ], + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_0_r79gvdu3h", + "field": [ + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_1_2uns9t23g", + "field": [ + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_2_os5ccvicv", + "field": [ + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_3_k2nlyk3q4", + "field": [ + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_4_8atbe12pb", + "field": [ + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_5_h62ympca8", + "field": [ + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_6_0m5vg872v", + "field": [ + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_7_4rvkpn2sq", + "field": [ + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_8_7s1fygjji", + "field": [ + "sign_informed_consent_form", + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_9_qd6pse9gj", + "field": [ + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_0_2fjs3h1t2", + "field": "visiting_date", + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_1_i81le4vme", + "field": [ + "date_of_signature", + "visiting_date" + ], + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_2_a8k2wend3", + "field": [ + "date_of_assessment_cmss", + "visiting_date" + ], + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_3_otk3muqgy", + "field": [ + "date_of_assessment_sf_mpq_scale", + "visiting_date" + ], + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_4_3e0g4h3xt", + "field": [ + "check_date", + "visiting_date" + ], + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "field": [ + "date_of_first_consultation", + "visiting_date" + ], + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_6_eoavacbfk", + "field": [ + "enrollment_status", + "sign_informed_consent_form" + ], + "recordId": "10" +} +2026-03-08 19:10:36.019 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "field": [ + "visiting_date", + "date_of_birth" + ], + "recordId": "10" +} +2026-03-08 19:10:36.023 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:10:36.024 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 0 +} +2026-03-08 19:10:36.024 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_3_delac4edo", + "field": "absolute_value_of_basophilic_cells", + "recordId": "10" +} +2026-03-08 19:10:36.024 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_4_8tcnwi9gg", + "field": "absolute_value_of_lymphocytes", + "recordId": "10" +} +2026-03-08 19:10:36.025 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_5_4k7227d38", + "field": "absolute_value_of_monocytes", + "recordId": "10" +} +2026-03-08 19:10:36.025 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_6_2e6slhi9p", + "field": "absolute_value_of_neutrophils", + "recordId": "10" +} +2026-03-08 19:10:36.025 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_7_u8z0d18gb", + "field": "eosinophil_absolute_count", + "recordId": "10" +} +2026-03-08 19:10:36.025 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_8_hculwqhyk", + "field": "eosinophil_count_ratio", + "recordId": "10" +} +2026-03-08 19:10:36.025 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_9_ftk4426nd", + "field": "eosinophil_countratio", + "recordId": "10" +} +2026-03-08 19:10:36.025 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_10_vcciaxxuk", + "field": "hematocrit", + "recordId": "10" +} +2026-03-08 19:10:36.025 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_11_tk5gliucf", + "field": "hemoglobin", + "recordId": "10" +} +2026-03-08 19:10:36.025 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_12_abhqvjmg5", + "field": "high_platelet_ratio", + "recordId": "10" +} +2026-03-08 19:10:36.025 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_13_p8j624iv2", + "field": "mean_corpuscular_volume", + "recordId": "10" +} +2026-03-08 19:10:36.025 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_14_rwum2cw2u", + "field": "mean_hemoglobin_concentratin", + "recordId": "10" +} +2026-03-08 19:10:36.025 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_15_f056yvtme", + "field": "mean_hemoglobin_concentration", + "recordId": "10" +} +2026-03-08 19:10:36.025 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_16_5o2al7oyz", + "field": "mean_platelet_volume", + "recordId": "10" +} +2026-03-08 19:10:36.025 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_17_zcd5zxn3u", + "field": "platelet_count", + "recordId": "10" +} +2026-03-08 19:10:36.025 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_18_skojo7cru", + "field": "platelet_volume", + "recordId": "10" +} +2026-03-08 19:10:36.025 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_19_5iin73wva", + "field": "platelet_volume_distribution_width", + "recordId": "10" +} +2026-03-08 19:10:36.025 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_20_4lxpihy8o", + "field": "rbc_volume_distribution_width_cv", + "recordId": "10" +} +2026-03-08 19:10:36.025 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_21_gl7d8n5si", + "field": "rbc_volume_distribution_width_sd", + "recordId": "10" +} +2026-03-08 19:10:36.025 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_22_1fnjktj7v", + "field": "red_blood_cell_count", + "recordId": "10" +} +2026-03-08 19:10:36.025 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_23_zrt2ixskp", + "field": "relative_value_of_lymphocytes", + "recordId": "10" +} +2026-03-08 19:10:36.025 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_24_a5oovpadb", + "field": "relative_value_of_monocytes", + "recordId": "10" +} +2026-03-08 19:10:36.025 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_25_rr9uk1but", + "field": "relative_value_of_neutrophils", + "recordId": "10" +} +2026-03-08 19:10:36.025 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_26_f9hez0b4k", + "field": "white_blood_cell_count", + "recordId": "10" +} +2026-03-08 19:10:36.025 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:36.025 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:36.025 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:36.033 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:10:36.034 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 0 +} +2026-03-08 19:10:36.034 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_0_hr2q1opmw", + "field": "visiting_date", + "recordId": "10" +} +2026-03-08 19:10:36.034 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_1_sdim7iks9", + "field": [ + "check_date", + "visiting_date" + ], + "recordId": "10" +} +2026-03-08 19:10:36.034 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_2_1r0huss46", + "field": [ + "date_of_assessment_cmss", + "visiting_date" + ], + "recordId": "10" +} +2026-03-08 19:10:36.034 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_3_utmkeahm6", + "field": [ + "date_of_assessment_sf_mpq_scale", + "visiting_date" + ], + "recordId": "10" +} +2026-03-08 19:10:36.034 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_4_3j2aozbms", + "field": [ + "date_of_signature", + "date_of_first_consultation" + ], + "recordId": "10" +} +2026-03-08 19:10:36.034 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_5_ux8721fut", + "field": [ + "enrollment_status", + "sign_informed_consent_form" + ], + "recordId": "10" +} +2026-03-08 19:10:36.034 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_6_res5lvb6g", + "field": [ + "visiting_date", + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.034 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_7_wpzbvli56", + "field": [ + "date_of_first_consultation", + "visiting_date" + ], + "recordId": "10" +} +2026-03-08 19:10:36.034 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_0_424mnnlv0", + "field": "educational_level", + "recordId": "10" +} +2026-03-08 19:10:36.034 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_1_qiy3gde3a", + "field": "marital_status", + "recordId": "10" +} +2026-03-08 19:10:36.034 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_2_hc1jjvymo", + "field": "sex", + "recordId": "10" +} +2026-03-08 19:10:36.034 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_3_delac4edo", + "field": "absolute_value_of_basophilic_cells", + "recordId": "10" +} +2026-03-08 19:10:36.034 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_4_8tcnwi9gg", + "field": "absolute_value_of_lymphocytes", + "recordId": "10" +} +2026-03-08 19:10:36.034 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_5_4k7227d38", + "field": "absolute_value_of_monocytes", + "recordId": "10" +} +2026-03-08 19:10:36.034 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_6_2e6slhi9p", + "field": "absolute_value_of_neutrophils", + "recordId": "10" +} +2026-03-08 19:10:36.034 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_7_u8z0d18gb", + "field": "eosinophil_absolute_count", + "recordId": "10" +} +2026-03-08 19:10:36.034 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_8_hculwqhyk", + "field": "eosinophil_count_ratio", + "recordId": "10" +} +2026-03-08 19:10:36.034 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_9_ftk4426nd", + "field": "eosinophil_countratio", + "recordId": "10" +} +2026-03-08 19:10:36.034 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_10_vcciaxxuk", + "field": "hematocrit", + "recordId": "10" +} +2026-03-08 19:10:36.034 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_11_tk5gliucf", + "field": "hemoglobin", + "recordId": "10" +} +2026-03-08 19:10:36.034 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_12_abhqvjmg5", + "field": "high_platelet_ratio", + "recordId": "10" +} +2026-03-08 19:10:36.034 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_13_p8j624iv2", + "field": "mean_corpuscular_volume", + "recordId": "10" +} +2026-03-08 19:10:36.034 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_14_rwum2cw2u", + "field": "mean_hemoglobin_concentratin", + "recordId": "10" +} +2026-03-08 19:10:36.034 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_15_f056yvtme", + "field": "mean_hemoglobin_concentration", + "recordId": "10" +} +2026-03-08 19:10:36.034 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_16_5o2al7oyz", + "field": "mean_platelet_volume", + "recordId": "10" +} +2026-03-08 19:10:36.034 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_17_zcd5zxn3u", + "field": "platelet_count", + "recordId": "10" +} +2026-03-08 19:10:36.034 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_18_skojo7cru", + "field": "platelet_volume", + "recordId": "10" +} +2026-03-08 19:10:36.034 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_19_5iin73wva", + "field": "platelet_volume_distribution_width", + "recordId": "10" +} +2026-03-08 19:10:36.034 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_20_4lxpihy8o", + "field": "rbc_volume_distribution_width_cv", + "recordId": "10" +} +2026-03-08 19:10:36.034 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_21_gl7d8n5si", + "field": "rbc_volume_distribution_width_sd", + "recordId": "10" +} +2026-03-08 19:10:36.034 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_22_1fnjktj7v", + "field": "red_blood_cell_count", + "recordId": "10" +} +2026-03-08 19:10:36.035 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_23_zrt2ixskp", + "field": "relative_value_of_lymphocytes", + "recordId": "10" +} +2026-03-08 19:10:36.035 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_24_a5oovpadb", + "field": "relative_value_of_monocytes", + "recordId": "10" +} +2026-03-08 19:10:36.035 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_25_rr9uk1but", + "field": "relative_value_of_neutrophils", + "recordId": "10" +} +2026-03-08 19:10:36.035 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_26_f9hez0b4k", + "field": "white_blood_cell_count", + "recordId": "10" +} +2026-03-08 19:10:36.035 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_32_a2cxjf9tb", + "field": "sign_informed_consent_form", + "recordId": "10" +} +2026-03-08 19:10:36.035 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_41_eahuliyh0", + "field": "alcohol_consumption_history", + "recordId": "10" +} +2026-03-08 19:10:36.035 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_42_m8cptozxk", + "field": "smoking_history", + "recordId": "10" +} +2026-03-08 19:10:36.035 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_0_96ftk49kx", + "field": [ + "age", + "inclusion_criteria2" + ], + "recordId": "10" +} +2026-03-08 19:10:36.035 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_1_zw7ja89ei", + "field": [ + "sign_informed_consent_form", + "inclusion_criteria5" + ], + "recordId": "10" +} +2026-03-08 19:10:36.035 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_2_44m45t6m6", + "field": "inclusion_criteria1", + "recordId": "10" +} +2026-03-08 19:10:36.035 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_3_zfn62bs40", + "field": "exclusion_criteria2", + "recordId": "10" +} +2026-03-08 19:10:36.035 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_4_vgyy51zou", + "field": "exclusion_criteria3", + "recordId": "10" +} +2026-03-08 19:10:36.035 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_5_pbkwsnx0n", + "field": [ + "exclusion_criteria4", + "inclusion_criteria3" + ], + "recordId": "10" +} +2026-03-08 19:10:36.035 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_6_9ygdecsca", + "field": "exclusion_criteria5", + "recordId": "10" +} +2026-03-08 19:10:36.035 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_7_9sugwpwcf", + "field": "sex", + "recordId": "10" +} +2026-03-08 19:10:36.035 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_8_u079bu08z", + "field": [ + "enrollment_status", + "exclusion_criteria1", + "exclusion_criteria2", + "exclusion_criteria3", + "exclusion_criteria4", + "exclusion_criteria5" + ], + "recordId": "10" +} +2026-03-08 19:10:36.035 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_9_ufkub1swe", + "field": [ + "inclusion_criteria1", + "inclusion_criteria2", + "inclusion_criteria3", + "inclusion_criteria4", + "inclusion_criteria5" + ], + "recordId": "10" +} +2026-03-08 19:10:36.035 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_0_r79gvdu3h", + "field": [ + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.035 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_1_2uns9t23g", + "field": [ + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.035 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_2_os5ccvicv", + "field": [ + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.035 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_3_k2nlyk3q4", + "field": [ + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.035 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_4_8atbe12pb", + "field": [ + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.035 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_5_h62ympca8", + "field": [ + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.035 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_6_0m5vg872v", + "field": [ + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.035 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_7_4rvkpn2sq", + "field": [ + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.035 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_8_7s1fygjji", + "field": [ + "sign_informed_consent_form", + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.035 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_9_qd6pse9gj", + "field": [ + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.035 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_0_2fjs3h1t2", + "field": "visiting_date", + "recordId": "10" +} +2026-03-08 19:10:36.035 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_1_i81le4vme", + "field": [ + "date_of_signature", + "visiting_date" + ], + "recordId": "10" +} +2026-03-08 19:10:36.035 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_2_a8k2wend3", + "field": [ + "date_of_assessment_cmss", + "visiting_date" + ], + "recordId": "10" +} +2026-03-08 19:10:36.035 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_3_otk3muqgy", + "field": [ + "date_of_assessment_sf_mpq_scale", + "visiting_date" + ], + "recordId": "10" +} +2026-03-08 19:10:36.035 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_4_3e0g4h3xt", + "field": [ + "check_date", + "visiting_date" + ], + "recordId": "10" +} +2026-03-08 19:10:36.035 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "field": [ + "date_of_first_consultation", + "visiting_date" + ], + "recordId": "10" +} +2026-03-08 19:10:36.035 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_6_eoavacbfk", + "field": [ + "enrollment_status", + "sign_informed_consent_form" + ], + "recordId": "10" +} +2026-03-08 19:10:36.035 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "field": [ + "visiting_date", + "date_of_birth" + ], + "recordId": "10" +} +2026-03-08 19:10:36.040 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:10:36.041 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 0 +} +2026-03-08 19:10:36.041 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_0_hr2q1opmw", + "field": "visiting_date", + "recordId": "10" +} +2026-03-08 19:10:36.041 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_1_sdim7iks9", + "field": [ + "check_date", + "visiting_date" + ], + "recordId": "10" +} +2026-03-08 19:10:36.041 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_2_1r0huss46", + "field": [ + "date_of_assessment_cmss", + "visiting_date" + ], + "recordId": "10" +} +2026-03-08 19:10:36.041 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_3_utmkeahm6", + "field": [ + "date_of_assessment_sf_mpq_scale", + "visiting_date" + ], + "recordId": "10" +} +2026-03-08 19:10:36.041 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_4_3j2aozbms", + "field": [ + "date_of_signature", + "date_of_first_consultation" + ], + "recordId": "10" +} +2026-03-08 19:10:36.041 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_5_ux8721fut", + "field": [ + "enrollment_status", + "sign_informed_consent_form" + ], + "recordId": "10" +} +2026-03-08 19:10:36.041 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_6_res5lvb6g", + "field": [ + "visiting_date", + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.041 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_7_wpzbvli56", + "field": [ + "date_of_first_consultation", + "visiting_date" + ], + "recordId": "10" +} +2026-03-08 19:10:36.041 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_0_424mnnlv0", + "field": "educational_level", + "recordId": "10" +} +2026-03-08 19:10:36.041 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_1_qiy3gde3a", + "field": "marital_status", + "recordId": "10" +} +2026-03-08 19:10:36.041 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_2_hc1jjvymo", + "field": "sex", + "recordId": "10" +} +2026-03-08 19:10:36.041 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_3_delac4edo", + "field": "absolute_value_of_basophilic_cells", + "recordId": "10" +} +2026-03-08 19:10:36.041 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_4_8tcnwi9gg", + "field": "absolute_value_of_lymphocytes", + "recordId": "10" +} +2026-03-08 19:10:36.041 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_5_4k7227d38", + "field": "absolute_value_of_monocytes", + "recordId": "10" +} +2026-03-08 19:10:36.041 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_6_2e6slhi9p", + "field": "absolute_value_of_neutrophils", + "recordId": "10" +} +2026-03-08 19:10:36.041 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_7_u8z0d18gb", + "field": "eosinophil_absolute_count", + "recordId": "10" +} +2026-03-08 19:10:36.041 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_8_hculwqhyk", + "field": "eosinophil_count_ratio", + "recordId": "10" +} +2026-03-08 19:10:36.041 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_9_ftk4426nd", + "field": "eosinophil_countratio", + "recordId": "10" +} +2026-03-08 19:10:36.041 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_10_vcciaxxuk", + "field": "hematocrit", + "recordId": "10" +} +2026-03-08 19:10:36.041 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_11_tk5gliucf", + "field": "hemoglobin", + "recordId": "10" +} +2026-03-08 19:10:36.041 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_12_abhqvjmg5", + "field": "high_platelet_ratio", + "recordId": "10" +} +2026-03-08 19:10:36.041 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_13_p8j624iv2", + "field": "mean_corpuscular_volume", + "recordId": "10" +} +2026-03-08 19:10:36.041 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_14_rwum2cw2u", + "field": "mean_hemoglobin_concentratin", + "recordId": "10" +} +2026-03-08 19:10:36.041 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_15_f056yvtme", + "field": "mean_hemoglobin_concentration", + "recordId": "10" +} +2026-03-08 19:10:36.041 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_16_5o2al7oyz", + "field": "mean_platelet_volume", + "recordId": "10" +} +2026-03-08 19:10:36.041 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_17_zcd5zxn3u", + "field": "platelet_count", + "recordId": "10" +} +2026-03-08 19:10:36.041 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_18_skojo7cru", + "field": "platelet_volume", + "recordId": "10" +} +2026-03-08 19:10:36.042 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_19_5iin73wva", + "field": "platelet_volume_distribution_width", + "recordId": "10" +} +2026-03-08 19:10:36.042 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_20_4lxpihy8o", + "field": "rbc_volume_distribution_width_cv", + "recordId": "10" +} +2026-03-08 19:10:36.042 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_21_gl7d8n5si", + "field": "rbc_volume_distribution_width_sd", + "recordId": "10" +} +2026-03-08 19:10:36.042 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_22_1fnjktj7v", + "field": "red_blood_cell_count", + "recordId": "10" +} +2026-03-08 19:10:36.042 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_23_zrt2ixskp", + "field": "relative_value_of_lymphocytes", + "recordId": "10" +} +2026-03-08 19:10:36.042 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_24_a5oovpadb", + "field": "relative_value_of_monocytes", + "recordId": "10" +} +2026-03-08 19:10:36.042 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_25_rr9uk1but", + "field": "relative_value_of_neutrophils", + "recordId": "10" +} +2026-03-08 19:10:36.042 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_26_f9hez0b4k", + "field": "white_blood_cell_count", + "recordId": "10" +} +2026-03-08 19:10:36.042 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_32_a2cxjf9tb", + "field": "sign_informed_consent_form", + "recordId": "10" +} +2026-03-08 19:10:36.042 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_41_eahuliyh0", + "field": "alcohol_consumption_history", + "recordId": "10" +} +2026-03-08 19:10:36.042 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_42_m8cptozxk", + "field": "smoking_history", + "recordId": "10" +} +2026-03-08 19:10:36.042 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_0_96ftk49kx", + "field": [ + "age", + "inclusion_criteria2" + ], + "recordId": "10" +} +2026-03-08 19:10:36.042 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_1_zw7ja89ei", + "field": [ + "sign_informed_consent_form", + "inclusion_criteria5" + ], + "recordId": "10" +} +2026-03-08 19:10:36.042 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_2_44m45t6m6", + "field": "inclusion_criteria1", + "recordId": "10" +} +2026-03-08 19:10:36.042 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_3_zfn62bs40", + "field": "exclusion_criteria2", + "recordId": "10" +} +2026-03-08 19:10:36.042 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_4_vgyy51zou", + "field": "exclusion_criteria3", + "recordId": "10" +} +2026-03-08 19:10:36.042 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_5_pbkwsnx0n", + "field": [ + "exclusion_criteria4", + "inclusion_criteria3" + ], + "recordId": "10" +} +2026-03-08 19:10:36.042 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_6_9ygdecsca", + "field": "exclusion_criteria5", + "recordId": "10" +} +2026-03-08 19:10:36.042 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_7_9sugwpwcf", + "field": "sex", + "recordId": "10" +} +2026-03-08 19:10:36.042 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_8_u079bu08z", + "field": [ + "enrollment_status", + "exclusion_criteria1", + "exclusion_criteria2", + "exclusion_criteria3", + "exclusion_criteria4", + "exclusion_criteria5" + ], + "recordId": "10" +} +2026-03-08 19:10:36.042 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_9_ufkub1swe", + "field": [ + "inclusion_criteria1", + "inclusion_criteria2", + "inclusion_criteria3", + "inclusion_criteria4", + "inclusion_criteria5" + ], + "recordId": "10" +} +2026-03-08 19:10:36.042 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_0_r79gvdu3h", + "field": [ + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.042 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_1_2uns9t23g", + "field": [ + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.042 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_2_os5ccvicv", + "field": [ + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.042 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_3_k2nlyk3q4", + "field": [ + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.042 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_4_8atbe12pb", + "field": [ + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.042 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_5_h62ympca8", + "field": [ + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.042 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_6_0m5vg872v", + "field": [ + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.042 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_7_4rvkpn2sq", + "field": [ + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.042 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_8_7s1fygjji", + "field": [ + "sign_informed_consent_form", + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.042 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_9_qd6pse9gj", + "field": [ + "date_of_signature" + ], + "recordId": "10" +} +2026-03-08 19:10:36.042 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_0_2fjs3h1t2", + "field": "visiting_date", + "recordId": "10" +} +2026-03-08 19:10:36.042 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_1_i81le4vme", + "field": [ + "date_of_signature", + "visiting_date" + ], + "recordId": "10" +} +2026-03-08 19:10:36.042 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_2_a8k2wend3", + "field": [ + "date_of_assessment_cmss", + "visiting_date" + ], + "recordId": "10" +} +2026-03-08 19:10:36.042 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_3_otk3muqgy", + "field": [ + "date_of_assessment_sf_mpq_scale", + "visiting_date" + ], + "recordId": "10" +} +2026-03-08 19:10:36.042 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_4_3e0g4h3xt", + "field": [ + "check_date", + "visiting_date" + ], + "recordId": "10" +} +2026-03-08 19:10:36.042 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "field": [ + "date_of_first_consultation", + "visiting_date" + ], + "recordId": "10" +} +2026-03-08 19:10:36.042 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_6_eoavacbfk", + "field": [ + "enrollment_status", + "sign_informed_consent_form" + ], + "recordId": "10" +} +2026-03-08 19:10:36.042 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "field": [ + "visiting_date", + "date_of_birth" + ], + "recordId": "10" +} +2026-03-08 19:10:36.046 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:10:36.047 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 0 +} +2026-03-08 19:10:36.047 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_4_3j2aozbms", + "field": [ + "date_of_signature", + "date_of_first_consultation" + ], + "recordId": "11" +} +2026-03-08 19:10:36.047 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_5_ux8721fut", + "field": [ + "enrollment_status", + "sign_informed_consent_form" + ], + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_3_delac4edo", + "field": "absolute_value_of_basophilic_cells", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_4_8tcnwi9gg", + "field": "absolute_value_of_lymphocytes", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_5_4k7227d38", + "field": "absolute_value_of_monocytes", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_6_2e6slhi9p", + "field": "absolute_value_of_neutrophils", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_7_u8z0d18gb", + "field": "eosinophil_absolute_count", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_8_hculwqhyk", + "field": "eosinophil_count_ratio", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_9_ftk4426nd", + "field": "eosinophil_countratio", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_10_vcciaxxuk", + "field": "hematocrit", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_11_tk5gliucf", + "field": "hemoglobin", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_12_abhqvjmg5", + "field": "high_platelet_ratio", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_13_p8j624iv2", + "field": "mean_corpuscular_volume", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_14_rwum2cw2u", + "field": "mean_hemoglobin_concentratin", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_15_f056yvtme", + "field": "mean_hemoglobin_concentration", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_16_5o2al7oyz", + "field": "mean_platelet_volume", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_17_zcd5zxn3u", + "field": "platelet_count", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_18_skojo7cru", + "field": "platelet_volume", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_19_5iin73wva", + "field": "platelet_volume_distribution_width", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_20_4lxpihy8o", + "field": "rbc_volume_distribution_width_cv", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_21_gl7d8n5si", + "field": "rbc_volume_distribution_width_sd", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_22_1fnjktj7v", + "field": "red_blood_cell_count", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_23_zrt2ixskp", + "field": "relative_value_of_lymphocytes", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_24_a5oovpadb", + "field": "relative_value_of_monocytes", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_25_rr9uk1but", + "field": "relative_value_of_neutrophils", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_26_f9hez0b4k", + "field": "white_blood_cell_count", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_27_f1wj9nsuz", + "field": "overall_frequency_evaluation1", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_28_xo702x4ux", + "field": "total_frequency2", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_29_ryxlijfkj", + "field": "total_frequency3", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_30_d25wcd5e1", + "field": "total_frequency4", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_31_9gxyqilt1", + "field": "total_frequency5", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_32_a2cxjf9tb", + "field": "sign_informed_consent_form", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_33_yfnbeyvq6", + "field": "boredom", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_34_vl2t5xk5j", + "field": "cutting_pain", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_35_0qhoc3v2h", + "field": "fear", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_36_9h85wsvqm", + "field": "painful_sensation", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_37_l4p2w7b1u", + "field": "pain_in_the_joints", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_38_j5pn8te75", + "field": "sense_of_punishment", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_39_j31le4eik", + "field": "severe_pain", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_40_ctyrqgcng", + "field": "weak_and_powerless", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_41_eahuliyh0", + "field": "alcohol_consumption_history", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_42_m8cptozxk", + "field": "smoking_history", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_0_96ftk49kx", + "field": [ + "age", + "inclusion_criteria2" + ], + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_1_zw7ja89ei", + "field": [ + "sign_informed_consent_form", + "inclusion_criteria5" + ], + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_2_44m45t6m6", + "field": "inclusion_criteria1", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_3_zfn62bs40", + "field": "exclusion_criteria2", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_4_vgyy51zou", + "field": "exclusion_criteria3", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_5_pbkwsnx0n", + "field": [ + "exclusion_criteria4", + "inclusion_criteria3" + ], + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_6_9ygdecsca", + "field": "exclusion_criteria5", + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_8_u079bu08z", + "field": [ + "enrollment_status", + "exclusion_criteria1", + "exclusion_criteria2", + "exclusion_criteria3", + "exclusion_criteria4", + "exclusion_criteria5" + ], + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_9_ufkub1swe", + "field": [ + "inclusion_criteria1", + "inclusion_criteria2", + "inclusion_criteria3", + "inclusion_criteria4", + "inclusion_criteria5" + ], + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_0_r79gvdu3h", + "field": [ + "date_of_signature" + ], + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_1_2uns9t23g", + "field": [ + "date_of_signature" + ], + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_2_os5ccvicv", + "field": [ + "date_of_signature" + ], + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_3_k2nlyk3q4", + "field": [ + "date_of_signature" + ], + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_4_8atbe12pb", + "field": [ + "date_of_signature" + ], + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_5_h62ympca8", + "field": [ + "date_of_signature" + ], + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_6_0m5vg872v", + "field": [ + "date_of_signature" + ], + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_7_4rvkpn2sq", + "field": [ + "date_of_signature" + ], + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_8_7s1fygjji", + "field": [ + "sign_informed_consent_form", + "date_of_signature" + ], + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_9_qd6pse9gj", + "field": [ + "date_of_signature" + ], + "recordId": "11" +} +2026-03-08 19:10:36.048 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:36.049 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:36.049 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_6_eoavacbfk", + "field": [ + "enrollment_status", + "sign_informed_consent_form" + ], + "recordId": "11" +} +2026-03-08 19:10:36.049 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:36.055 [aiclinical-backend] info: [HardRuleEngine] Rules loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "ruleCount": 79 +} +2026-03-08 19:10:36.056 [aiclinical-backend] info: [HardRuleEngine] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 0 +} +2026-03-08 19:10:36.056 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_4_3j2aozbms", + "field": [ + "date_of_signature", + "date_of_first_consultation" + ], + "recordId": "12" +} +2026-03-08 19:10:36.057 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772425592200_5_ux8721fut", + "field": [ + "enrollment_status", + "sign_informed_consent_form" + ], + "recordId": "12" +} +2026-03-08 19:10:36.057 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_3_delac4edo", + "field": "absolute_value_of_basophilic_cells", + "recordId": "12" +} +2026-03-08 19:10:36.057 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_4_8tcnwi9gg", + "field": "absolute_value_of_lymphocytes", + "recordId": "12" +} +2026-03-08 19:10:36.057 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_5_4k7227d38", + "field": "absolute_value_of_monocytes", + "recordId": "12" +} +2026-03-08 19:10:36.057 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_6_2e6slhi9p", + "field": "absolute_value_of_neutrophils", + "recordId": "12" +} +2026-03-08 19:10:36.057 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_7_u8z0d18gb", + "field": "eosinophil_absolute_count", + "recordId": "12" +} +2026-03-08 19:10:36.057 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_8_hculwqhyk", + "field": "eosinophil_count_ratio", + "recordId": "12" +} +2026-03-08 19:10:36.057 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_9_ftk4426nd", + "field": "eosinophil_countratio", + "recordId": "12" +} +2026-03-08 19:10:36.057 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_10_vcciaxxuk", + "field": "hematocrit", + "recordId": "12" +} +2026-03-08 19:10:36.057 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_11_tk5gliucf", + "field": "hemoglobin", + "recordId": "12" +} +2026-03-08 19:10:36.057 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_12_abhqvjmg5", + "field": "high_platelet_ratio", + "recordId": "12" +} +2026-03-08 19:10:36.057 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_13_p8j624iv2", + "field": "mean_corpuscular_volume", + "recordId": "12" +} +2026-03-08 19:10:36.057 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_14_rwum2cw2u", + "field": "mean_hemoglobin_concentratin", + "recordId": "12" +} +2026-03-08 19:10:36.057 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_15_f056yvtme", + "field": "mean_hemoglobin_concentration", + "recordId": "12" +} +2026-03-08 19:10:36.057 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_16_5o2al7oyz", + "field": "mean_platelet_volume", + "recordId": "12" +} +2026-03-08 19:10:36.057 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_17_zcd5zxn3u", + "field": "platelet_count", + "recordId": "12" +} +2026-03-08 19:10:36.057 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_18_skojo7cru", + "field": "platelet_volume", + "recordId": "12" +} +2026-03-08 19:10:36.057 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_19_5iin73wva", + "field": "platelet_volume_distribution_width", + "recordId": "12" +} +2026-03-08 19:10:36.057 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_20_4lxpihy8o", + "field": "rbc_volume_distribution_width_cv", + "recordId": "12" +} +2026-03-08 19:10:36.057 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_21_gl7d8n5si", + "field": "rbc_volume_distribution_width_sd", + "recordId": "12" +} +2026-03-08 19:10:36.057 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_22_1fnjktj7v", + "field": "red_blood_cell_count", + "recordId": "12" +} +2026-03-08 19:10:36.057 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_23_zrt2ixskp", + "field": "relative_value_of_lymphocytes", + "recordId": "12" +} +2026-03-08 19:10:36.057 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_24_a5oovpadb", + "field": "relative_value_of_monocytes", + "recordId": "12" +} +2026-03-08 19:10:36.057 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_25_rr9uk1but", + "field": "relative_value_of_neutrophils", + "recordId": "12" +} +2026-03-08 19:10:36.057 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_26_f9hez0b4k", + "field": "white_blood_cell_count", + "recordId": "12" +} +2026-03-08 19:10:36.057 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_27_f1wj9nsuz", + "field": "overall_frequency_evaluation1", + "recordId": "12" +} +2026-03-08 19:10:36.057 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_28_xo702x4ux", + "field": "total_frequency2", + "recordId": "12" +} +2026-03-08 19:10:36.058 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_29_ryxlijfkj", + "field": "total_frequency3", + "recordId": "12" +} +2026-03-08 19:10:36.058 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_30_d25wcd5e1", + "field": "total_frequency4", + "recordId": "12" +} +2026-03-08 19:10:36.058 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_31_9gxyqilt1", + "field": "total_frequency5", + "recordId": "12" +} +2026-03-08 19:10:36.058 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_32_a2cxjf9tb", + "field": "sign_informed_consent_form", + "recordId": "12" +} +2026-03-08 19:10:36.058 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_33_yfnbeyvq6", + "field": "boredom", + "recordId": "12" +} +2026-03-08 19:10:36.058 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_34_vl2t5xk5j", + "field": "cutting_pain", + "recordId": "12" +} +2026-03-08 19:10:36.058 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_35_0qhoc3v2h", + "field": "fear", + "recordId": "12" +} +2026-03-08 19:10:36.058 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_36_9h85wsvqm", + "field": "painful_sensation", + "recordId": "12" +} +2026-03-08 19:10:36.058 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_37_l4p2w7b1u", + "field": "pain_in_the_joints", + "recordId": "12" +} +2026-03-08 19:10:36.058 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_38_j5pn8te75", + "field": "sense_of_punishment", + "recordId": "12" +} +2026-03-08 19:10:36.058 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_39_j31le4eik", + "field": "severe_pain", + "recordId": "12" +} +2026-03-08 19:10:36.058 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_40_ctyrqgcng", + "field": "weak_and_powerless", + "recordId": "12" +} +2026-03-08 19:10:36.058 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_41_eahuliyh0", + "field": "alcohol_consumption_history", + "recordId": "12" +} +2026-03-08 19:10:36.058 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426067914_42_m8cptozxk", + "field": "smoking_history", + "recordId": "12" +} +2026-03-08 19:10:36.058 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_1_zw7ja89ei", + "field": [ + "sign_informed_consent_form", + "inclusion_criteria5" + ], + "recordId": "12" +} +2026-03-08 19:10:36.058 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_2_44m45t6m6", + "field": "inclusion_criteria1", + "recordId": "12" +} +2026-03-08 19:10:36.058 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_3_zfn62bs40", + "field": "exclusion_criteria2", + "recordId": "12" +} +2026-03-08 19:10:36.058 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_4_vgyy51zou", + "field": "exclusion_criteria3", + "recordId": "12" +} +2026-03-08 19:10:36.058 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_5_pbkwsnx0n", + "field": [ + "exclusion_criteria4", + "inclusion_criteria3" + ], + "recordId": "12" +} +2026-03-08 19:10:36.058 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_6_9ygdecsca", + "field": "exclusion_criteria5", + "recordId": "12" +} +2026-03-08 19:10:36.058 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_8_u079bu08z", + "field": [ + "enrollment_status", + "exclusion_criteria1", + "exclusion_criteria2", + "exclusion_criteria3", + "exclusion_criteria4", + "exclusion_criteria5" + ], + "recordId": "12" +} +2026-03-08 19:10:36.058 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426144420_9_ufkub1swe", + "field": [ + "inclusion_criteria1", + "inclusion_criteria2", + "inclusion_criteria3", + "inclusion_criteria4", + "inclusion_criteria5" + ], + "recordId": "12" +} +2026-03-08 19:10:36.058 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_0_r79gvdu3h", + "field": [ + "date_of_signature" + ], + "recordId": "12" +} +2026-03-08 19:10:36.058 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_1_2uns9t23g", + "field": [ + "date_of_signature" + ], + "recordId": "12" +} +2026-03-08 19:10:36.058 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_2_os5ccvicv", + "field": [ + "date_of_signature" + ], + "recordId": "12" +} +2026-03-08 19:10:36.058 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_3_k2nlyk3q4", + "field": [ + "date_of_signature" + ], + "recordId": "12" +} +2026-03-08 19:10:36.058 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_4_8atbe12pb", + "field": [ + "date_of_signature" + ], + "recordId": "12" +} +2026-03-08 19:10:36.058 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_5_h62ympca8", + "field": [ + "date_of_signature" + ], + "recordId": "12" +} +2026-03-08 19:10:36.058 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_6_0m5vg872v", + "field": [ + "date_of_signature" + ], + "recordId": "12" +} +2026-03-08 19:10:36.058 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_7_4rvkpn2sq", + "field": [ + "date_of_signature" + ], + "recordId": "12" +} +2026-03-08 19:10:36.058 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_8_7s1fygjji", + "field": [ + "sign_informed_consent_form", + "date_of_signature" + ], + "recordId": "12" +} +2026-03-08 19:10:36.058 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426222135_9_qd6pse9gj", + "field": [ + "date_of_signature" + ], + "recordId": "12" +} +2026-03-08 19:10:36.058 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_1_i81le4vme", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:36.058 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_5_7bhp9x9ge", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:36.059 [aiclinical-backend] debug: [SkillRunner] Skipping rule - field not available + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_6_eoavacbfk", + "field": [ + "enrollment_status", + "sign_informed_consent_form" + ], + "recordId": "12" +} +2026-03-08 19:10:36.059 [aiclinical-backend] warn: [SkillRunner] Rule execution error + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "ruleId": "rule_1772426295819_7_f3bbtkmrr", + "error": "Unrecognized operation date" +} +2026-03-08 19:10:36.064 [aiclinical-backend] info: [SkillRunner] Execution completed + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "triggerType": "manual", + "recordEventCount": 37, + "totalTimeMs": 1265 +} +2026-03-08 19:10:38.493 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:10:39.079 [aiclinical-backend] info: REDCap API: exportMetadata success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "fieldCount": 74, + "duration": "586ms" +} +2026-03-08 19:10:39.079 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 1 +} +2026-03-08 19:10:39.469 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 5, + "duration": "390ms" +} +2026-03-08 19:10:39.965 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "eventCount": 5 +} +2026-03-08 19:10:39.966 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 19 +} +2026-03-08 19:10:39.966 [aiclinical-backend] info: [CompletenessEngine] calculateMissingRate + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "1", + "denominator": 26, + "numerator": 1, + "rate": 3.8, + "activeEvents": [ + "ce46f241ae_arm_1", + "65a64dbbd9_arm_1", + "9b510b5ce7_arm_1", + "4cfb49c5ec_arm_1", + "3fea1c25e6_arm_1" + ] +} +2026-03-08 19:10:40.055 [aiclinical-backend] info: [ProtocolDeviationEngine] No visitWindows configured, D6 will be skipped + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c" +} +2026-03-08 19:10:40.055 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:10:40.056 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 1 +} +2026-03-08 19:10:40.382 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 5, + "duration": "326ms" +} +2026-03-08 19:10:40.383 [aiclinical-backend] info: [ProtocolDeviationEngine] checkVisitWindows + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "1", + "checkedVisits": 0, + "deviationCount": 0, + "passedCount": 0 +} +2026-03-08 19:10:40.385 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:10:40.610 [aiclinical-backend] info: REDCap API: exportMetadata success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "fieldCount": 74, + "duration": "225ms" +} +2026-03-08 19:10:40.610 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 1 +} +2026-03-08 19:10:40.951 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 5, + "duration": "340ms" +} +2026-03-08 19:10:41.728 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "eventCount": 5 +} +2026-03-08 19:10:41.728 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 19 +} +2026-03-08 19:10:41.729 [aiclinical-backend] info: [CompletenessEngine] calculateMissingRate + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "2", + "denominator": 26, + "numerator": 0, + "rate": 0, + "activeEvents": [ + "ce46f241ae_arm_1", + "65a64dbbd9_arm_1", + "9b510b5ce7_arm_1", + "4cfb49c5ec_arm_1", + "3fea1c25e6_arm_1" + ] +} +2026-03-08 19:10:41.784 [aiclinical-backend] info: [ProtocolDeviationEngine] No visitWindows configured, D6 will be skipped + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c" +} +2026-03-08 19:10:41.785 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:10:41.785 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 1 +} +2026-03-08 19:10:42.111 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 5, + "duration": "326ms" +} +2026-03-08 19:10:42.111 [aiclinical-backend] info: [ProtocolDeviationEngine] checkVisitWindows + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "2", + "checkedVisits": 0, + "deviationCount": 0, + "passedCount": 0 +} +2026-03-08 19:10:42.113 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:10:42.370 [aiclinical-backend] info: REDCap API: exportMetadata success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "fieldCount": 74, + "duration": "257ms" +} +2026-03-08 19:10:42.371 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 1 +} +2026-03-08 19:10:42.751 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 3, + "duration": "380ms" +} +2026-03-08 19:10:43.284 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "eventCount": 5 +} +2026-03-08 19:10:43.284 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 19 +} +2026-03-08 19:10:43.284 [aiclinical-backend] info: [CompletenessEngine] calculateMissingRate + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "3", + "denominator": 26, + "numerator": 0, + "rate": 0, + "activeEvents": [ + "ce46f241ae_arm_1", + "65a64dbbd9_arm_1", + "9b510b5ce7_arm_1" + ] +} +2026-03-08 19:10:43.350 [aiclinical-backend] info: [ProtocolDeviationEngine] No visitWindows configured, D6 will be skipped + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c" +} +2026-03-08 19:10:43.350 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:10:43.351 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 1 +} +2026-03-08 19:10:43.671 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 3, + "duration": "320ms" +} +2026-03-08 19:10:43.671 [aiclinical-backend] info: [ProtocolDeviationEngine] checkVisitWindows + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "3", + "checkedVisits": 0, + "deviationCount": 0, + "passedCount": 0 +} +2026-03-08 19:10:43.673 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:10:43.944 [aiclinical-backend] info: REDCap API: exportMetadata success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "fieldCount": 74, + "duration": "271ms" +} +2026-03-08 19:10:43.944 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 1 +} +2026-03-08 19:10:44.280 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 2, + "duration": "336ms" +} +2026-03-08 19:10:45.168 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "eventCount": 5 +} +2026-03-08 19:10:45.169 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 19 +} +2026-03-08 19:10:45.169 [aiclinical-backend] info: [CompletenessEngine] calculateMissingRate + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "4", + "denominator": 26, + "numerator": 0, + "rate": 0, + "activeEvents": [ + "ce46f241ae_arm_1", + "65a64dbbd9_arm_1" + ] +} +2026-03-08 19:10:45.241 [aiclinical-backend] info: [ProtocolDeviationEngine] No visitWindows configured, D6 will be skipped + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c" +} +2026-03-08 19:10:45.241 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:10:45.241 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 1 +} +2026-03-08 19:10:45.639 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 2, + "duration": "398ms" +} +2026-03-08 19:10:45.639 [aiclinical-backend] info: [ProtocolDeviationEngine] checkVisitWindows + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "4", + "checkedVisits": 0, + "deviationCount": 0, + "passedCount": 0 +} +2026-03-08 19:10:45.641 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:10:45.880 [aiclinical-backend] info: REDCap API: exportMetadata success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "fieldCount": 74, + "duration": "239ms" +} +2026-03-08 19:10:45.880 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 1 +} +2026-03-08 19:10:46.227 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 2, + "duration": "347ms" +} +2026-03-08 19:10:46.709 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "eventCount": 5 +} +2026-03-08 19:10:46.710 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 19 +} +2026-03-08 19:10:46.710 [aiclinical-backend] info: [CompletenessEngine] calculateMissingRate + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "5", + "denominator": 26, + "numerator": 0, + "rate": 0, + "activeEvents": [ + "ce46f241ae_arm_1", + "65a64dbbd9_arm_1" + ] +} +2026-03-08 19:10:46.768 [aiclinical-backend] info: [ProtocolDeviationEngine] No visitWindows configured, D6 will be skipped + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c" +} +2026-03-08 19:10:46.769 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:10:46.769 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 1 +} +2026-03-08 19:10:47.102 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 2, + "duration": "333ms" +} +2026-03-08 19:10:47.102 [aiclinical-backend] info: [ProtocolDeviationEngine] checkVisitWindows + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "5", + "checkedVisits": 0, + "deviationCount": 0, + "passedCount": 0 +} +2026-03-08 19:10:47.104 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:10:47.688 [aiclinical-backend] info: REDCap API: exportMetadata success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "fieldCount": 74, + "duration": "583ms" +} +2026-03-08 19:10:47.688 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 1 +} +2026-03-08 19:10:47.998 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 2, + "duration": "309ms" +} +2026-03-08 19:10:48.490 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "eventCount": 5 +} +2026-03-08 19:10:48.490 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 19 +} +2026-03-08 19:10:48.490 [aiclinical-backend] info: [CompletenessEngine] calculateMissingRate + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "6", + "denominator": 26, + "numerator": 0, + "rate": 0, + "activeEvents": [ + "ce46f241ae_arm_1", + "65a64dbbd9_arm_1" + ] +} +2026-03-08 19:10:48.548 [aiclinical-backend] info: [ProtocolDeviationEngine] No visitWindows configured, D6 will be skipped + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c" +} +2026-03-08 19:10:48.549 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:10:48.549 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 1 +} +2026-03-08 19:10:48.918 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 2, + "duration": "369ms" +} +2026-03-08 19:10:48.918 [aiclinical-backend] info: [ProtocolDeviationEngine] checkVisitWindows + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "6", + "checkedVisits": 0, + "deviationCount": 0, + "passedCount": 0 +} +2026-03-08 19:10:48.920 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:10:49.166 [aiclinical-backend] info: REDCap API: exportMetadata success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "fieldCount": 74, + "duration": "246ms" +} +2026-03-08 19:10:49.166 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 1 +} +2026-03-08 19:10:49.500 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 3, + "duration": "334ms" +} +2026-03-08 19:10:49.969 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "eventCount": 5 +} +2026-03-08 19:10:49.970 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 19 +} +2026-03-08 19:10:49.970 [aiclinical-backend] info: [CompletenessEngine] calculateMissingRate + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "7", + "denominator": 26, + "numerator": 0, + "rate": 0, + "activeEvents": [ + "ce46f241ae_arm_1", + "65a64dbbd9_arm_1", + "9b510b5ce7_arm_1" + ] +} +2026-03-08 19:10:50.024 [aiclinical-backend] info: [ProtocolDeviationEngine] No visitWindows configured, D6 will be skipped + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c" +} +2026-03-08 19:10:50.024 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:10:50.025 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 1 +} +2026-03-08 19:10:50.666 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 3, + "duration": "641ms" +} +2026-03-08 19:10:50.666 [aiclinical-backend] info: [ProtocolDeviationEngine] checkVisitWindows + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "7", + "checkedVisits": 0, + "deviationCount": 0, + "passedCount": 0 +} +2026-03-08 19:10:50.668 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:10:50.898 [aiclinical-backend] info: REDCap API: exportMetadata success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "fieldCount": 74, + "duration": "229ms" +} +2026-03-08 19:10:50.898 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 1 +} +2026-03-08 19:10:51.228 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 3, + "duration": "330ms" +} +2026-03-08 19:10:51.705 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "eventCount": 5 +} +2026-03-08 19:10:51.705 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 19 +} +2026-03-08 19:10:51.706 [aiclinical-backend] info: [CompletenessEngine] calculateMissingRate + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "8", + "denominator": 26, + "numerator": 0, + "rate": 0, + "activeEvents": [ + "ce46f241ae_arm_1", + "65a64dbbd9_arm_1", + "9b510b5ce7_arm_1" + ] +} +2026-03-08 19:10:51.762 [aiclinical-backend] info: [ProtocolDeviationEngine] No visitWindows configured, D6 will be skipped + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c" +} +2026-03-08 19:10:51.762 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:10:51.762 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 1 +} +2026-03-08 19:10:52.152 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 3, + "duration": "390ms" +} +2026-03-08 19:10:52.152 [aiclinical-backend] info: [ProtocolDeviationEngine] checkVisitWindows + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "8", + "checkedVisits": 0, + "deviationCount": 0, + "passedCount": 0 +} +2026-03-08 19:10:52.154 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:10:52.393 [aiclinical-backend] info: REDCap API: exportMetadata success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "fieldCount": 74, + "duration": "239ms" +} +2026-03-08 19:10:52.393 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 1 +} +2026-03-08 19:10:52.724 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 5, + "duration": "331ms" +} +2026-03-08 19:10:53.204 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "eventCount": 5 +} +2026-03-08 19:10:53.204 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 19 +} +2026-03-08 19:10:53.205 [aiclinical-backend] info: [CompletenessEngine] calculateMissingRate + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "9", + "denominator": 26, + "numerator": 0, + "rate": 0, + "activeEvents": [ + "ce46f241ae_arm_1", + "65a64dbbd9_arm_1", + "9b510b5ce7_arm_1", + "4cfb49c5ec_arm_1", + "3fea1c25e6_arm_1" + ] +} +2026-03-08 19:10:53.262 [aiclinical-backend] info: [ProtocolDeviationEngine] No visitWindows configured, D6 will be skipped + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c" +} +2026-03-08 19:10:53.263 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:10:53.263 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 1 +} +2026-03-08 19:10:53.917 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 5, + "duration": "654ms" +} +2026-03-08 19:10:53.917 [aiclinical-backend] info: [ProtocolDeviationEngine] checkVisitWindows + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "9", + "checkedVisits": 0, + "deviationCount": 0, + "passedCount": 0 +} +2026-03-08 19:10:53.920 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:10:54.153 [aiclinical-backend] info: REDCap API: exportMetadata success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "fieldCount": 74, + "duration": "233ms" +} +2026-03-08 19:10:54.153 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 1 +} +2026-03-08 19:10:54.555 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 5, + "duration": "402ms" +} +2026-03-08 19:10:55.088 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "eventCount": 5 +} +2026-03-08 19:10:55.088 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 19 +} +2026-03-08 19:10:55.088 [aiclinical-backend] info: [CompletenessEngine] calculateMissingRate + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "10", + "denominator": 26, + "numerator": 0, + "rate": 0, + "activeEvents": [ + "ce46f241ae_arm_1", + "65a64dbbd9_arm_1", + "9b510b5ce7_arm_1", + "4cfb49c5ec_arm_1", + "3fea1c25e6_arm_1" + ] +} +2026-03-08 19:10:55.188 [aiclinical-backend] info: [ProtocolDeviationEngine] No visitWindows configured, D6 will be skipped + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c" +} +2026-03-08 19:10:55.188 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:10:55.188 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 1 +} +2026-03-08 19:10:55.525 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 5, + "duration": "337ms" +} +2026-03-08 19:10:55.525 [aiclinical-backend] info: [ProtocolDeviationEngine] checkVisitWindows + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "10", + "checkedVisits": 0, + "deviationCount": 0, + "passedCount": 0 +} +2026-03-08 19:10:55.527 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:10:55.788 [aiclinical-backend] info: REDCap API: exportMetadata success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "fieldCount": 74, + "duration": "261ms" +} +2026-03-08 19:10:55.788 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 1 +} +2026-03-08 19:10:56.118 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 1, + "duration": "330ms" +} +2026-03-08 19:10:56.911 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "eventCount": 5 +} +2026-03-08 19:10:56.911 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 19 +} +2026-03-08 19:10:56.912 [aiclinical-backend] info: [CompletenessEngine] calculateMissingRate + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "11", + "denominator": 26, + "numerator": 19, + "rate": 73.1, + "activeEvents": [ + "65a64dbbd9_arm_1" + ] +} +2026-03-08 19:10:56.971 [aiclinical-backend] info: [ProtocolDeviationEngine] No visitWindows configured, D6 will be skipped + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c" +} +2026-03-08 19:10:56.972 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:10:56.972 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 1 +} +2026-03-08 19:10:57.374 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 1, + "duration": "402ms" +} +2026-03-08 19:10:57.374 [aiclinical-backend] info: [ProtocolDeviationEngine] checkVisitWindows + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "11", + "checkedVisits": 0, + "deviationCount": 0, + "passedCount": 0 +} +2026-03-08 19:10:57.376 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:10:57.612 [aiclinical-backend] info: REDCap API: exportMetadata success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "fieldCount": 74, + "duration": "236ms" +} +2026-03-08 19:10:57.612 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 1 +} +2026-03-08 19:10:57.931 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 1, + "duration": "319ms" +} +2026-03-08 19:10:58.421 [aiclinical-backend] info: REDCap: getEvents success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "eventCount": 5 +} +2026-03-08 19:10:58.421 [aiclinical-backend] info: REDCap: getFormEventMapping success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "mappingCount": 19 +} +2026-03-08 19:10:58.421 [aiclinical-backend] info: [CompletenessEngine] calculateMissingRate + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "12", + "denominator": 26, + "numerator": 19, + "rate": 73.1, + "activeEvents": [ + "65a64dbbd9_arm_1" + ] +} +2026-03-08 19:10:58.479 [aiclinical-backend] info: [ProtocolDeviationEngine] No visitWindows configured, D6 will be skipped + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c" +} +2026-03-08 19:10:58.479 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:10:58.479 [aiclinical-backend] debug: Exporting specific records + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 1 +} +2026-03-08 19:10:58.801 [aiclinical-backend] info: REDCap API: exportRecords success + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "recordCount": 1, + "duration": "322ms" +} +2026-03-08 19:10:58.801 [aiclinical-backend] info: [ProtocolDeviationEngine] checkVisitWindows + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "recordId": "12", + "checkedVisits": 0, + "deviationCount": 0, + "passedCount": 0 +} +2026-03-08 19:10:58.847 [aiclinical-backend] info: [HealthScoreEngine] calculate done + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "healthScore": 78.3, + "healthGrade": "B" +} +2026-03-08 19:10:58.847 [aiclinical-backend] info: [QcAggregator] HealthScore refreshed + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "healthScore": 78.3, + "healthGrade": "B" +} +2026-03-08 19:10:58.847 [aiclinical-backend] info: [QcAggregator] aggregateDeferred done + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "eventStatusRows": 25, + "recordSummaryRows": 12, + "durationMs": 45 +} +2026-03-08 19:10:58.847 [aiclinical-backend] info: [QcExecutor] Batch aggregation completed + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "eventStatusRows": 25, + "recordSummaryRows": 12, + "aggDurationMs": 45 +} +2026-03-08 19:10:58.847 [aiclinical-backend] info: [QcExecutor] executeBatch done + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "totalRecordEvents": 37, + "fieldStatusWrites": 1015, + "durationMs": 24049 +} +2026-03-08 19:10:58.848 [aiclinical-backend] info: [DailyQcOrchestrator] Starting orchestration + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c" +} +2026-03-08 19:10:58.848 [aiclinical-backend] info: [QcReportService] Generating new report + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "reportType": "daily" +} +2026-03-08 19:10:58.907 [aiclinical-backend] info: [QcReportService] Report generated + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "reportType": "daily", + "duration": "59ms", + "criticalCount": 187, + "warningCount": 204, + "topIssuesCount": 5, + "groupedRecordCount": 12 +} +2026-03-08 19:10:59.019 [aiclinical-backend] debug: [QcReportService] Report cached + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "reportType": "daily" +} +2026-03-08 19:10:59.153 [aiclinical-backend] info: 📤 发送企业微信 Markdown 消息 + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "userId": "FengZhiBo", + "contentLength": 217 +} +2026-03-08 19:10:59.153 [aiclinical-backend] info: 🔄 请求新的企业微信 Access Token... + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212 +} +2026-03-08 19:10:59.480 [aiclinical-backend] info: ✅ Access Token 获取成功 + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "expiresIn": 7200 +} +2026-03-08 19:10:59.694 [aiclinical-backend] info: ✅ Markdown 消息发送成功 + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "userId": "FengZhiBo", + "contentLength": 217 +} +2026-03-08 19:10:59.694 [aiclinical-backend] info: [DailyQcOrchestrator] Orchestration completed + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "reportId": "76ecda5c-66be-4650-bfaf-b9c89dedc252", + "equeriesCreated": 0, + "criticalEventsArchived": 0, + "newIssues": 0, + "resolvedIssues": 0, + "pushSent": true, + "durationMs": 846 +} +2026-03-08 19:10:59.734 [aiclinical-backend] info: [QcReportService] Generating new report + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "reportType": "on_demand" +} +2026-03-08 19:10:59.735 [aiclinical-backend] info: [ToolsService] Field mappings loaded + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "count": 0 +} +2026-03-08 19:10:59.738 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:10:59.738 [aiclinical-backend] info: [ToolsService] REDCap adapter created + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212 +} +2026-03-08 19:10:59.738 [aiclinical-backend] debug: [ToolsService] Tool registered + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "name": "read_report" +} +2026-03-08 19:10:59.738 [aiclinical-backend] debug: [ToolsService] Tool registered + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "name": "look_up_data" +} +2026-03-08 19:10:59.738 [aiclinical-backend] debug: [ToolsService] Tool registered + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "name": "check_quality" +} +2026-03-08 19:10:59.738 [aiclinical-backend] debug: [ToolsService] Tool registered + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "name": "search_knowledge" +} +2026-03-08 19:10:59.738 [aiclinical-backend] info: [ToolsService] Initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "toolCount": 4 +} +2026-03-08 19:10:59.776 [aiclinical-backend] info: [QcReportService] Report generated + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "reportType": "on_demand", + "duration": "41ms", + "criticalCount": 187, + "warningCount": 204, + "topIssuesCount": 5, + "groupedRecordCount": 12 +} +2026-03-08 19:10:59.787 [aiclinical-backend] info: RedcapAdapter initialized + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "baseUrl": "http://localhost:8080", + "timeout": 30000 +} +2026-03-08 19:10:59.788 [aiclinical-backend] info: [QcCockpitService] 获取驾驶舱数据成功 + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "totalRecords": 12, + "durationMs": 73 +} +2026-03-08 19:10:59.921 [aiclinical-backend] debug: [QcReportService] Report cached + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "reportType": "on_demand" +} +2026-03-08 19:10:59.944 [aiclinical-backend] debug: [QcReportService] Returning cached report + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "reportType": "on_demand", + "generatedAt": "2026-03-08T19:10:59+08:00" +} +2026-03-08 19:10:59.944 [aiclinical-backend] info: [ToolsService] Tool executed + { + "env": "development", + "instance": "LAPTOP-UH2VURTB", + "pid": 42212, + "toolName": "read_report", + "success": true, + "executionTime": "23ms" +} +{ + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "withChat": false, + "startedAt": "2026-03-08T11:10:33.151Z", + "stages": [ + { + "name": "Stage1_REDCap", + "ok": true, + "checks": [ + { + "name": "metadata_non_empty", + "ok": true, + "value": 74 + }, + { + "name": "records_by_event_non_empty", + "ok": true, + "value": 37 + }, + { + "name": "unique_records_non_empty", + "ok": true, + "value": 12 + }, + { + "name": "events_loaded_or_non_longitudinal", + "ok": true, + "value": { + "events": 5, + "formEventMapping": 19 + } + } + ], + "detail": { + "metadataCount": 74, + "eventCount": 5, + "formEventMappingCount": 19, + "recordEventRows": 37, + "uniqueRecordCount": 12 + } + }, + { + "name": "Stage2_Rules", + "ok": true, + "checks": [ + { + "name": "active_qc_rules_exists", + "ok": true, + "value": 79 + }, + { + "name": "multi_field_rules_exists", + "ok": true, + "value": 29 + }, + { + "name": "has_D1_or_legacy_inclusion_exclusion", + "ok": true, + "value": [ + "D6", + "D3", + "D1", + "D5" + ] + } + ], + "detail": { + "ruleCount": 79, + "multiFieldRuleCount": 29, + "categories": [ + "D1", + "D3", + "D5", + "D6" + ] + } + }, + { + "name": "Stage3_Execution", + "ok": true, + "checks": [ + { + "name": "batch_has_records", + "ok": true, + "value": 12 + }, + { + "name": "field_status_written", + "ok": true, + "value": 713 + }, + { + "name": "event_status_written", + "ok": true, + "value": 25 + }, + { + "name": "record_summary_written", + "ok": true, + "value": 12 + }, + { + "name": "project_stats_exists", + "ok": true, + "value": true + } + ], + "detail": { + "batch": { + "projectId": "1d80f270-6a02-4b58-9db3-6af176e91f3c", + "totalRecords": 12, + "totalEvents": 37, + "passed": 12, + "failed": 21, + "warnings": 4, + "fieldStatusWrites": 1015, + "executionTimeMs": 24049 + }, + "orchestrate": { + "reportId": "76ecda5c-66be-4650-bfaf-b9c89dedc252", + "equeriesCreated": 0, + "criticalEventsArchived": 0, + "newIssues": 0, + "resolvedIssues": 0, + "pushSent": true + }, + "db": { + "fieldStatusCount": 713, + "eventStatusCount": 25, + "recordSummaryCount": 12, + "projectStats": { + "totalRecords": 12, + "passedRecords": 0, + "failedRecords": 12 + } + } + } + }, + { + "name": "Stage4_Consumption", + "ok": true, + "checks": [ + { + "name": "report_summary_exists", + "ok": true, + "value": 12 + }, + { + "name": "cockpit_stats_exists", + "ok": true, + "value": 12 + }, + { + "name": "equery_log_summary_exists", + "ok": true, + "value": 579 + }, + { + "name": "pass_rate_consistent_report_cockpit_tool", + "ok": true, + "value": { + "reportPassRate": 0, + "cockpitPassRate": 0, + "toolPassRate": 0 + } + }, + { + "name": "chat_has_conclusion_or_skipped", + "ok": true, + "value": "skipped" + } + ], + "detail": { + "reportPassRate": 0, + "cockpitPassRate": 0, + "toolPassRate": 0, + "chatResult": "skipped" + } + } + ], + "endedAt": "2026-03-08T11:10:59.944Z" +} diff --git a/backend/check-docs-api.ps1 b/backend/check-docs-api.ps1 index 740c9bb9..73c86164 100644 --- a/backend/check-docs-api.ps1 +++ b/backend/check-docs-api.ps1 @@ -69,3 +69,4 @@ try { } + diff --git a/backend/check-documents.js b/backend/check-documents.js index 305dbb34..bdfc3b1d 100644 --- a/backend/check-documents.js +++ b/backend/check-documents.js @@ -63,3 +63,4 @@ async function checkDocuments() { checkDocuments(); + diff --git a/backend/migrations/add_general_chat.sql b/backend/migrations/add_general_chat.sql index 91330c21..55c701d5 100644 --- a/backend/migrations/add_general_chat.sql +++ b/backend/migrations/add_general_chat.sql @@ -44,3 +44,4 @@ WHERE EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'genera SELECT 'general_messages表已创建' AS status WHERE EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'general_messages'); + diff --git a/backend/package.json b/backend/package.json index d647b2da..fbe743e4 100644 --- a/backend/package.json +++ b/backend/package.json @@ -12,6 +12,11 @@ "prisma:migrate": "prisma migrate dev", "prisma:studio": "prisma studio", "prisma:seed": "tsx prisma/seed.ts", + "iit:equery:dedupe": "tsx scripts/dedupe_open_equeries.ts", + "iit:equery:dedupe:apply": "tsx scripts/dedupe_open_equeries.ts --apply", + "iit:guard:check": "tsx scripts/validate_guard_types_for_project.ts", + "iit:guard:check:all": "tsx scripts/validate_guard_types_all_active_projects.ts --strict", + "iit:e2e:strict": "tsx scripts/e2e_iit_full_flow.ts", "test": "echo \"Error: no test specified\" && exit 1" }, "prisma": { diff --git a/backend/prisma/migrations/20260308_add_iit_equery_open_dedupe_guard/migration.sql b/backend/prisma/migrations/20260308_add_iit_equery_open_dedupe_guard/migration.sql new file mode 100644 index 00000000..31347416 --- /dev/null +++ b/backend/prisma/migrations/20260308_add_iit_equery_open_dedupe_guard/migration.sql @@ -0,0 +1,48 @@ +-- 1) 先收敛历史 open 重复,避免唯一索引创建失败 +WITH ranked AS ( + SELECT + id, + ROW_NUMBER() OVER ( + PARTITION BY + project_id, + record_id, + COALESCE(event_id, ''), + COALESCE(category, '') + ORDER BY + CASE status + WHEN 'reviewing' THEN 4 + WHEN 'responded' THEN 3 + WHEN 'reopened' THEN 2 + WHEN 'pending' THEN 1 + ELSE 0 + END DESC, + updated_at DESC NULLS LAST, + created_at DESC NULLS LAST, + id DESC + ) AS rn + FROM iit_schema.equery + WHERE status IN ('pending', 'responded', 'reviewing', 'reopened') +) +UPDATE iit_schema.equery e +SET + status = 'auto_closed', + closed_at = COALESCE(e.closed_at, NOW()), + closed_by = COALESCE(e.closed_by, 'system_dedupe_migration'), + resolution = COALESCE( + NULLIF(e.resolution, ''), + '自动去重收敛:同一受试者/事件/规则已存在未关闭 eQuery' + ), + updated_at = NOW() +FROM ranked r +WHERE e.id = r.id + AND r.rn > 1; + +-- 2) 为 open 集合建立唯一去重键,防止未来重复写入 +CREATE UNIQUE INDEX IF NOT EXISTS uq_iit_equery_open_dedupe_key +ON iit_schema.equery ( + project_id, + record_id, + (COALESCE(event_id, '')), + (COALESCE(category, '')) +) +WHERE status IN ('pending', 'responded', 'reviewing', 'reopened'); diff --git a/backend/run-migration.ps1 b/backend/run-migration.ps1 index 4b24f383..fc442e64 100644 --- a/backend/run-migration.ps1 +++ b/backend/run-migration.ps1 @@ -43,3 +43,4 @@ Write-Host "" Write-Host "按任意键退出..." $null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") + diff --git a/backend/scripts/analyze_missing_equery_context.ts b/backend/scripts/analyze_missing_equery_context.ts new file mode 100644 index 00000000..a45b94c5 --- /dev/null +++ b/backend/scripts/analyze_missing_equery_context.ts @@ -0,0 +1,97 @@ +import { PrismaClient } from '@prisma/client'; + +const prisma = new PrismaClient(); + +async function main() { + const projectId = process.argv[2]; + if (!projectId) { + throw new Error('Usage: npx tsx scripts/analyze_missing_equery_context.ts '); + } + + const reasonStats = await prisma.$queryRawUnsafe>(` + WITH missing AS ( + SELECT + e.id, + e.record_id, + e.category, + e.field_name, + e.event_id, + e.form_name, + e.created_at + FROM iit_schema.equery e + WHERE e.project_id = $1 + AND (COALESCE(e.event_id, '') = '' OR COALESCE(e.form_name, '') = '') + ), + flags AS ( + SELECT + m.*, + EXISTS ( + SELECT 1 + FROM iit_schema.qc_field_status fs + WHERE fs.project_id = $1 + AND fs.record_id = m.record_id + ) AS has_record_match, + EXISTS ( + SELECT 1 + FROM iit_schema.qc_field_status fs + WHERE fs.project_id = $1 + AND fs.record_id = m.record_id + AND COALESCE(fs.rule_name, '') = COALESCE(m.category, '') + ) AS has_rule_match, + EXISTS ( + SELECT 1 + FROM iit_schema.qc_field_status fs + WHERE fs.project_id = $1 + AND fs.record_id = m.record_id + AND COALESCE(fs.rule_name, '') = COALESCE(m.category, '') + AND COALESCE(fs.field_name, '') = COALESCE(m.field_name, '') + ) AS has_rule_field_match + FROM missing m + ) + SELECT + CASE + WHEN has_rule_field_match THEN 'A_RULE_FIELD_MATCH_BUT_EVENT_FORM_EMPTY' + WHEN has_rule_match THEN 'B_RULE_MATCH_FIELD_MISMATCH' + WHEN has_record_match THEN 'C_RECORD_MATCH_ONLY' + ELSE 'D_NO_RECORD_MATCH' + END AS reason, + COUNT(*)::bigint AS cnt + FROM flags + GROUP BY 1 + ORDER BY 2 DESC + `, projectId); + + const sample = await prisma.$queryRawUnsafe>(` + SELECT + id, record_id, category, field_name, event_id, form_name, created_at + FROM iit_schema.equery + WHERE project_id = $1 + AND (COALESCE(event_id, '') = '' OR COALESCE(form_name, '') = '') + ORDER BY created_at DESC + LIMIT 20 + `, projectId); + + console.log(JSON.stringify({ + projectId, + reasonStats: reasonStats.map((r) => ({ reason: r.reason, cnt: Number(r.cnt) })), + sample, + }, null, 2)); +} + +main() + .catch((e) => { + console.error(e); + process.exit(1); + }) + .finally(async () => { + await prisma.$disconnect(); + }); + diff --git a/backend/scripts/backfill_equery_context.ts b/backend/scripts/backfill_equery_context.ts new file mode 100644 index 00000000..741a3b03 --- /dev/null +++ b/backend/scripts/backfill_equery_context.ts @@ -0,0 +1,111 @@ +import { PrismaClient } from '@prisma/client'; + +const prisma = new PrismaClient(); + +async function main() { + const projectId = process.argv[2]; + if (!projectId) { + throw new Error('Usage: npx tsx scripts/backfill_equery_context.ts '); + } + + const beforeRows = await prisma.$queryRawUnsafe>(` + SELECT + COUNT(*)::bigint AS total, + COUNT(*) FILTER ( + WHERE COALESCE(event_id, '') = '' OR COALESCE(form_name, '') = '' + )::bigint AS missing + FROM iit_schema.equery + WHERE project_id = $1 + `, projectId); + + // Phase 1: 严格匹配(record + rule + field) + const strictUpdated = await prisma.$executeRawUnsafe(` + WITH matched AS ( + SELECT + e.id, + fs.event_id, + fs.form_name, + ROW_NUMBER() OVER ( + PARTITION BY e.id + ORDER BY fs.last_qc_at DESC NULLS LAST, fs.updated_at DESC NULLS LAST + ) AS rn + FROM iit_schema.equery e + JOIN iit_schema.qc_field_status fs + ON fs.project_id = e.project_id + AND fs.record_id = e.record_id + AND COALESCE(fs.rule_name, '') = COALESCE(e.category, '') + AND COALESCE(fs.field_name, '') = COALESCE(e.field_name, '') + WHERE e.project_id = $1 + AND (COALESCE(e.event_id, '') = '' OR COALESCE(e.form_name, '') = '') + ) + UPDATE iit_schema.equery e + SET + event_id = COALESCE(NULLIF(e.event_id, ''), matched.event_id), + form_name = COALESCE(NULLIF(e.form_name, ''), matched.form_name), + updated_at = NOW() + FROM matched + WHERE e.id = matched.id + AND matched.rn = 1 + `, projectId); + + // Phase 2: 容错匹配(record + rule),用于历史“拆字段”eQuery + const relaxedUpdated = await prisma.$executeRawUnsafe(` + WITH matched AS ( + SELECT + e.id, + fs.event_id, + fs.form_name, + ROW_NUMBER() OVER ( + PARTITION BY e.id + ORDER BY fs.last_qc_at DESC NULLS LAST, fs.updated_at DESC NULLS LAST + ) AS rn + FROM iit_schema.equery e + JOIN iit_schema.qc_field_status fs + ON fs.project_id = e.project_id + AND fs.record_id = e.record_id + AND COALESCE(fs.rule_name, '') = COALESCE(e.category, '') + WHERE e.project_id = $1 + AND (COALESCE(e.event_id, '') = '' OR COALESCE(e.form_name, '') = '') + ) + UPDATE iit_schema.equery e + SET + event_id = COALESCE(NULLIF(e.event_id, ''), matched.event_id), + form_name = COALESCE(NULLIF(e.form_name, ''), matched.form_name), + updated_at = NOW() + FROM matched + WHERE e.id = matched.id + AND matched.rn = 1 + `, projectId); + + const afterRows = await prisma.$queryRawUnsafe>(` + SELECT + COUNT(*)::bigint AS total, + COUNT(*) FILTER ( + WHERE COALESCE(event_id, '') = '' OR COALESCE(form_name, '') = '' + )::bigint AS missing + FROM iit_schema.equery + WHERE project_id = $1 + `, projectId); + + const before = beforeRows[0]; + const after = afterRows[0]; + console.log(JSON.stringify({ + projectId, + total: Number(before.total), + missingBefore: Number(before.missing), + strictUpdatedRows: strictUpdated, + relaxedUpdatedRows: relaxedUpdated, + updatedRows: Number(strictUpdated) + Number(relaxedUpdated), + missingAfter: Number(after.missing), + }, null, 2)); +} + +main() + .catch((e) => { + console.error(e); + process.exit(1); + }) + .finally(async () => { + await prisma.$disconnect(); + }); + diff --git a/backend/scripts/dedupe_open_equeries.ts b/backend/scripts/dedupe_open_equeries.ts new file mode 100644 index 00000000..79f8e679 --- /dev/null +++ b/backend/scripts/dedupe_open_equeries.ts @@ -0,0 +1,145 @@ +import { PrismaClient } from '@prisma/client'; + +const prisma = new PrismaClient(); + +function parseArgs() { + const args = process.argv.slice(2); + const apply = args.includes('--apply'); + const projectId = args.find((a) => !a.startsWith('--')); + if (!projectId) { + throw new Error('Usage: npx tsx scripts/dedupe_open_equeries.ts [--apply]'); + } + return { projectId, apply }; +} + +async function main() { + const { projectId, apply } = parseArgs(); + + const summaryRows = await prisma.$queryRawUnsafe>( + ` + WITH grouped AS ( + SELECT + record_id, + COALESCE(event_id, '') AS event_id_norm, + COALESCE(category, '') AS category_norm, + COUNT(*)::bigint AS cnt + FROM iit_schema.equery + WHERE project_id = $1 + AND status IN ('pending', 'responded', 'reviewing', 'reopened') + GROUP BY 1,2,3 + ) + SELECT + ( + SELECT COUNT(*)::bigint + FROM iit_schema.equery + WHERE project_id = $1 + AND status IN ('pending', 'responded', 'reviewing', 'reopened') + ) AS open_total, + COUNT(*) FILTER (WHERE cnt > 1)::bigint AS duplicate_groups, + COALESCE(SUM(cnt - 1) FILTER (WHERE cnt > 1), 0)::bigint AS duplicate_rows + FROM grouped + `, + projectId, + ); + + const sample = await prisma.$queryRawUnsafe>( + ` + SELECT + record_id, + COALESCE(event_id, '') AS event_id_norm, + COALESCE(category, '') AS category_norm, + COUNT(*)::bigint AS cnt + FROM iit_schema.equery + WHERE project_id = $1 + AND status IN ('pending', 'responded', 'reviewing', 'reopened') + GROUP BY 1,2,3 + HAVING COUNT(*) > 1 + ORDER BY cnt DESC, record_id ASC + LIMIT 20 + `, + projectId, + ); + + let updatedRows = 0; + if (apply) { + const updated = await prisma.$executeRawUnsafe( + ` + WITH ranked AS ( + SELECT + id, + ROW_NUMBER() OVER ( + PARTITION BY + project_id, + record_id, + COALESCE(event_id, ''), + COALESCE(category, '') + ORDER BY + CASE status + WHEN 'reviewing' THEN 4 + WHEN 'responded' THEN 3 + WHEN 'reopened' THEN 2 + WHEN 'pending' THEN 1 + ELSE 0 + END DESC, + updated_at DESC NULLS LAST, + created_at DESC NULLS LAST, + id DESC + ) AS rn + FROM iit_schema.equery + WHERE project_id = $1 + AND status IN ('pending', 'responded', 'reviewing', 'reopened') + ) + UPDATE iit_schema.equery e + SET + status = 'auto_closed', + closed_at = COALESCE(e.closed_at, NOW()), + closed_by = COALESCE(e.closed_by, 'system_dedupe_script'), + resolution = COALESCE( + NULLIF(e.resolution, ''), + '自动去重收敛:同一受试者/事件/规则已存在未关闭 eQuery' + ), + updated_at = NOW() + FROM ranked r + WHERE e.id = r.id + AND r.rn > 1 + `, + projectId, + ); + updatedRows = Number(updated); + } + + const result = { + projectId, + mode: apply ? 'apply' : 'dry-run', + openTotal: Number(summaryRows[0]?.open_total || 0), + duplicateGroups: Number(summaryRows[0]?.duplicate_groups || 0), + duplicateRows: Number(summaryRows[0]?.duplicate_rows || 0), + updatedRows, + sampleTopGroups: sample.map((x) => ({ + recordId: x.record_id, + eventId: x.event_id_norm || '(empty)', + category: x.category_norm || '(empty)', + count: Number(x.cnt), + })), + }; + + console.log(JSON.stringify(result, null, 2)); +} + +main() + .catch((e) => { + console.error(e); + process.exit(1); + }) + .finally(async () => { + await prisma.$disconnect(); + }); diff --git a/backend/scripts/e2e_iit_full_flow.ts b/backend/scripts/e2e_iit_full_flow.ts new file mode 100644 index 00000000..eefa83fb --- /dev/null +++ b/backend/scripts/e2e_iit_full_flow.ts @@ -0,0 +1,261 @@ +import { PrismaClient } from '@prisma/client'; +import { RedcapAdapter } from '../src/modules/iit-manager/adapters/RedcapAdapter.js'; +import { QcExecutor } from '../src/modules/iit-manager/engines/QcExecutor.js'; +import { dailyQcOrchestrator } from '../src/modules/iit-manager/services/DailyQcOrchestrator.js'; +import { QcReportService } from '../src/modules/iit-manager/services/QcReportService.js'; +import { createToolsService } from '../src/modules/iit-manager/services/ToolsService.js'; +import { iitQcCockpitService } from '../src/modules/admin/iit-projects/iitQcCockpitService.js'; +import { getChatOrchestrator } from '../src/modules/iit-manager/services/ChatOrchestrator.js'; + +const prisma = new PrismaClient(); + +type StageResult = { + name: string; + ok: boolean; + checks: Array<{ name: string; ok: boolean; value?: unknown }>; + detail?: Record; +}; + +function check(name: string, condition: boolean, value?: unknown) { + return { name, ok: condition, value }; +} + +function assertStage(stage: StageResult) { + const failed = stage.checks.filter((c) => !c.ok); + if (failed.length > 0) { + const reason = failed.map((f) => f.name).join(', '); + throw new Error(`[${stage.name}] 断言失败: ${reason}`); + } +} + +async function main() { + const projectId = process.argv[2]; + const withChat = process.argv.includes('--with-chat') || process.env.E2E_WITH_CHAT === '1'; + const strictGuards = process.argv.includes('--strict-guards') || process.env.E2E_REQUIRE_GUARD_TYPES === '1'; + if (!projectId) { + throw new Error('Usage: npx tsx scripts/e2e_iit_full_flow.ts [--with-chat] [--strict-guards]'); + } + + const summary: { + projectId: string; + withChat: boolean; + strictGuards: boolean; + startedAt: string; + stages: StageResult[]; + endedAt?: string; + } = { + projectId, + withChat, + strictGuards, + startedAt: new Date().toISOString(), + stages: [], + }; + + // Stage 1: REDCap 结构 + 数据同步能力 + { + const project = await prisma.iitProject.findUnique({ + where: { id: projectId }, + select: { redcapUrl: true, redcapApiToken: true }, + }); + if (!project?.redcapUrl || !project?.redcapApiToken) { + throw new Error('项目未配置 REDCap 连接信息'); + } + const adapter = new RedcapAdapter(project.redcapUrl, project.redcapApiToken); + const [metadata, events, formEventMapping, recordsByEvent] = await Promise.all([ + adapter.exportMetadata(), + adapter.getEvents(), + adapter.getFormEventMapping(), + adapter.getAllRecordsByEvent(), + ]); + + const uniqueRecords = new Set(recordsByEvent.map((r) => r.recordId)); + const stage: StageResult = { + name: 'Stage1_REDCap', + ok: true, + checks: [ + check('metadata_non_empty', metadata.length > 0, metadata.length), + check('records_by_event_non_empty', recordsByEvent.length > 0, recordsByEvent.length), + check('unique_records_non_empty', uniqueRecords.size > 0, uniqueRecords.size), + check('events_loaded_or_non_longitudinal', events.length > 0 || formEventMapping.length === 0, { + events: events.length, + formEventMapping: formEventMapping.length, + }), + ], + detail: { + metadataCount: metadata.length, + eventCount: events.length, + formEventMappingCount: formEventMapping.length, + recordEventRows: recordsByEvent.length, + uniqueRecordCount: uniqueRecords.size, + }, + }; + assertStage(stage); + summary.stages.push(stage); + } + + // Stage 2: 规则配置加载与覆盖 + { + const skill = await prisma.iitSkill.findFirst({ + where: { projectId, skillType: 'qc_process', isActive: true }, + select: { config: true }, + }); + const rules = ((skill?.config as any)?.rules || []) as Array<{ + id: string; + name?: string; + category?: string; + field?: string | string[]; + metadata?: Record; + }>; + const multiFieldRules = rules.filter((r) => Array.isArray(r.field)).length; + const categorySet = new Set(rules.map((r) => String(r.category || '')).filter(Boolean)); + const guardCandidates = rules.filter((r) => + /访视日期.*知情同意|早于知情同意|SF-?MPQ.*CMSS.*不一致|评估日期.*访视日期.*不一致|所有纳入标准.*检查|纳入标准.*满足|入组状态.*排除标准.*冲突/i.test(String(r.name || '')), + ); + const guardConfigured = guardCandidates.filter((r) => String((r.metadata as any)?.guardType || '').trim().length > 0); + + const stage: StageResult = { + name: 'Stage2_Rules', + ok: true, + checks: [ + check('active_qc_rules_exists', rules.length > 0, rules.length), + check('multi_field_rules_exists', multiFieldRules > 0, multiFieldRules), + check('has_D1_or_legacy_inclusion_exclusion', categorySet.has('D1') || categorySet.has('inclusion') || categorySet.has('exclusion'), Array.from(categorySet)), + check( + strictGuards ? 'guardtype_coverage_required' : 'guardtype_coverage_info', + strictGuards ? guardConfigured.length === guardCandidates.length : true, + { configured: guardConfigured.length, candidates: guardCandidates.length }, + ), + ], + detail: { + ruleCount: rules.length, + multiFieldRuleCount: multiFieldRules, + categories: Array.from(categorySet).sort(), + guardTypeCoverage: { + strictMode: strictGuards, + configured: guardConfigured.length, + candidates: guardCandidates.length, + }, + }, + }; + assertStage(stage); + summary.stages.push(stage); + } + + // Stage 3: 质控执行 + 报告编排 + { + const executor = new QcExecutor(projectId); + const batch = await executor.executeBatch({ triggeredBy: 'manual', skipSoftRules: true }); + const orchestrate = await dailyQcOrchestrator.orchestrate(projectId, { skipPush: true }); + + const [fieldCountRows, eventCountRows, summaryCountRows, projectStats] = await Promise.all([ + prisma.$queryRaw>` + SELECT COUNT(*)::bigint AS cnt FROM iit_schema.qc_field_status WHERE project_id = ${projectId} + `, + prisma.$queryRaw>` + SELECT COUNT(*)::bigint AS cnt FROM iit_schema.qc_event_status WHERE project_id = ${projectId} + `, + prisma.$queryRaw>` + SELECT COUNT(*)::bigint AS cnt FROM iit_schema.record_summary WHERE project_id = ${projectId} + `, + prisma.iitQcProjectStats.findUnique({ where: { projectId } }), + ]); + + const fieldStatusCount = Number(fieldCountRows[0]?.cnt || 0n); + const eventStatusCount = Number(eventCountRows[0]?.cnt || 0n); + const recordSummaryCount = Number(summaryCountRows[0]?.cnt || 0n); + + const stage: StageResult = { + name: 'Stage3_Execution', + ok: true, + checks: [ + check('batch_has_records', batch.totalRecords > 0, batch.totalRecords), + check('field_status_written', fieldStatusCount > 0, fieldStatusCount), + check('event_status_written', eventStatusCount > 0, eventStatusCount), + check('record_summary_written', recordSummaryCount > 0, recordSummaryCount), + check('project_stats_exists', !!projectStats, projectStats ? true : false), + ], + detail: { + batch, + orchestrate, + db: { + fieldStatusCount, + eventStatusCount, + recordSummaryCount, + projectStats: projectStats + ? { + totalRecords: projectStats.totalRecords, + passedRecords: projectStats.passedRecords, + failedRecords: projectStats.failedRecords, + } + : null, + }, + }, + }; + assertStage(stage); + summary.stages.push(stage); + } + + // Stage 4: 多消费者一致性(驾驶舱 / 报告 / 工具 / 可选Chat) + { + const [report, cockpitData, equeryLog, tools] = await Promise.all([ + QcReportService.getReport(projectId), + iitQcCockpitService.getCockpitData(projectId), + iitQcCockpitService.getEqueryLogReport(projectId), + createToolsService(projectId), + ]); + + const toolSummary = await tools.execute('read_report', { section: 'summary' }, 'e2e-script'); + const toolPassRate = Number((toolSummary as any)?.data?.passRate ?? NaN); + const reportPassRate = Number(report.summary.passRate); + const cockpitPassRate = Number(cockpitData.stats.passRate); + const passRateConsistent = + Number.isFinite(toolPassRate) && + Math.abs(reportPassRate - cockpitPassRate) < 0.0001 && + Math.abs(reportPassRate - toolPassRate) < 0.0001; + + let chatResult: string | null = null; + if (withChat) { + const orchestrator = await getChatOrchestrator(projectId); + chatResult = await orchestrator.handleMessage('e2e-user', '当前项目总体通过率是多少?'); + } + + const stage: StageResult = { + name: 'Stage4_Consumption', + ok: true, + checks: [ + check('report_summary_exists', report.summary.totalRecords >= 0, report.summary.totalRecords), + check('cockpit_stats_exists', cockpitData.stats.totalRecords >= 0, cockpitData.stats.totalRecords), + check('equery_log_summary_exists', equeryLog.summary.total >= 0, equeryLog.summary.total), + check('pass_rate_consistent_report_cockpit_tool', passRateConsistent, { + reportPassRate, + cockpitPassRate, + toolPassRate, + }), + check('chat_has_conclusion_or_skipped', !withChat || !!chatResult, chatResult || 'skipped'), + ], + detail: { + reportPassRate, + cockpitPassRate, + toolPassRate, + chatResult: withChat ? chatResult : 'skipped', + }, + }; + assertStage(stage); + summary.stages.push(stage); + } + + summary.endedAt = new Date().toISOString(); + console.log(JSON.stringify(summary, null, 2)); +} + +main() + .then(async () => { + await prisma.$disconnect(); + process.exit(0); + }) + .catch(async (e) => { + console.error(e); + await prisma.$disconnect(); + process.exit(1); + }); + diff --git a/backend/scripts/iit_chat_regression.py b/backend/scripts/iit_chat_regression.py new file mode 100644 index 00000000..03c833f3 --- /dev/null +++ b/backend/scripts/iit_chat_regression.py @@ -0,0 +1,126 @@ +import json +import sys +from typing import List, Dict + +import requests + + +BASE = "http://localhost:3001" +PROJECT_ID = "1d80f270-6a02-4b58-9db3-6af176e91f3c" +USER_ID = "diag-user-p1-regression" + + +def login() -> str: + resp = requests.post( + f"{BASE}/api/v1/auth/login/password", + json={"phone": "13800000001", "password": "123456"}, + timeout=10, + ) + resp.raise_for_status() + return resp.json()["data"]["tokens"]["accessToken"] + + +def ask(question: str) -> Dict: + resp = requests.post( + f"{BASE}/api/v1/iit/chat", + json={"message": question, "projectId": PROJECT_ID, "userId": USER_ID}, + timeout=80, + ) + resp.raise_for_status() + return resp.json() + + +def must_contain(text: str, keywords: List[str]) -> bool: + return all(k in text for k in keywords) + +def must_not_contain(text: str, keywords: List[str]) -> bool: + return all(k not in text for k in keywords) + + +def main() -> int: + # Ensure backend is alive and creds are valid before running chat checks. + _ = login() + + cases = [ + { + "name": "知情统计", + "q": "目前已经有几个患者签署知情了?", + "must": ["结论", "证据", "签署", "12"], + }, + { + "name": "纳排合规", + "q": "3号患者的纳入排除标准都符合要求吗?", + "must": ["结论", "证据", "3号", "规则"], + }, + { + "name": "项目总览", + "q": "最新质控报告怎么样?", + "must": ["结论", "通过率", "严重问题"], + }, + { + "name": "患者明细", + "q": "查询一下患者ID为2的患者数据", + "must": ["结论", "证据", "2"], + }, + { + "name": "访视进度", + "q": "4号患者到第几次访视了", + "must": ["结论", "证据", "4号", "访视"], + }, + { + "name": "eQuery状态", + "q": "目前eQuery总体状态如何?", + "must": ["结论", "待处理", "证据"], + }, + { + "name": "通过率口径", + "q": "现在通过率是多少,怎么算出来的?", + "must": ["结论", "证据", "通过率", "计算方法"], + }, + { + "name": "D6风险", + "q": "现在方案偏离风险大吗?", + "must": ["结论", "D6"], + "must_not": ["156条严重问题", "284条警告问题"], + }, + { + "name": "D1维度风险", + "q": "D1数据一致性风险现在怎么样?", + "must": ["结论", "D1", "证据"], + "must_not": ["D6问题总数"], + }, + { + "name": "D2维度风险", + "q": "D2数据完整性现在风险大吗?", + "must": ["结论", "D2", "证据"], + "must_not": ["D1问题总数", "D6问题总数"], + }, + ] + + failed = 0 + print("IIT Chat Regression Start\n") + for idx, c in enumerate(cases, 1): + try: + out = ask(c["q"]) + reply = out.get("reply", "") + ok = must_contain(reply, c["must"]) + if ok and c.get("must_not"): + ok = must_not_contain(reply, c["must_not"]) + status = "PASS" if ok else "FAIL" + print(f"[{idx}] {status} {c['name']}") + print(f"Q: {c['q']}") + print(f"A: {reply[:220].replace(chr(10), ' | ')}") + print("") + if not ok: + failed += 1 + except Exception as exc: + failed += 1 + print(f"[{idx}] FAIL {c['name']}: {exc}\n") + + print(f"Done. total={len(cases)} failed={failed}") + return 1 if failed else 0 + + +if __name__ == "__main__": + sys.exit(main()) + diff --git a/backend/scripts/regression_hardrule_guards.ts b/backend/scripts/regression_hardrule_guards.ts new file mode 100644 index 00000000..f3893b47 --- /dev/null +++ b/backend/scripts/regression_hardrule_guards.ts @@ -0,0 +1,114 @@ +/** + * 引擎级 guard smoke test(与项目配置无关) + * + * 注意: + * - 本脚本只验证 HardRuleEngine 的通用 guard 机制是否生效 + * - 不代表任何具体项目规则配置 + * - 项目级回归请使用 regression_hardrule_guards_by_project.ts + */ + +import assert from 'node:assert'; +import { HardRuleEngine, type QCRule } from '../src/modules/iit-manager/engines/HardRuleEngine.js'; + +function runCase(name: string, rules: QCRule[], data: Record, expectedStatus: 'PASS' | 'FAIL' | 'WARNING') { + const engine = new HardRuleEngine('regression-project'); + const result = engine.executeWithRules('R1', data, rules); + assert.strictEqual(result.overallStatus, expectedStatus, `${name} 期望 ${expectedStatus},实际 ${result.overallStatus}`); + console.log(`✅ ${name}: ${result.overallStatus}`); +} + +async function main() { + const rules: QCRule[] = [ + { + id: 'r1', + name: 'date consistency check A', + field: ['visiting_date', 'date_of_signature'], + logic: { '<': [{ var: 'visiting_date' }, { var: 'date_of_signature' }] }, + message: 'date ordering failed', + severity: 'error', + category: 'D1', + metadata: { guardType: 'date_not_before_or_equal' }, + }, + { + id: 'r2', + name: 'date consistency check B', + field: ['date_of_assessment_sf_mpq_scale', 'visiting_date'], + logic: { '!=': [{ var: 'date_of_assessment_sf_mpq_scale' }, { var: 'visiting_date' }] }, + message: 'date mismatch', + severity: 'warning', + category: 'D3', + metadata: { guardType: 'skip_if_any_missing' }, + }, + { + id: 'r3', + name: 'all inclusion criteria check', + field: ['inclusion_criteria1', 'inclusion_criteria2', 'inclusion_criteria3', 'inclusion_criteria4', 'inclusion_criteria5'], + logic: { '==': [1, 0] }, // 故意构造为失败,验证 guard 能兜底 + message: 'inclusion not all met', + severity: 'warning', + category: 'D1', + metadata: { guardType: 'pass_if_all_ones' }, + }, + { + id: 'r4', + name: 'enrollment exclusion conflict check', + field: ['enrollment_status', 'exclusion_criteria1', 'exclusion_criteria2'], + logic: { '==': [1, 0] }, // 故意构造为失败,验证 guard 能兜底 + message: 'enrollment conflict', + severity: 'error', + category: 'D1', + metadata: { guardType: 'pass_if_exclusion_all_zero' }, + }, + ]; + + runCase( + '同日访视不应误判早于', + [rules[0]], + { visiting_date: '2024-03-27', date_of_signature: '2024-03-27' }, + 'PASS', + ); + + runCase( + '评估日期缺失不应判不一致', + [rules[1]], + { date_of_assessment_sf_mpq_scale: '', visiting_date: '2024-03-27' }, + 'PASS', + ); + + runCase( + '纳入标准全1应通过', + [rules[2]], + { inclusion_criteria1: 1, inclusion_criteria2: 1, inclusion_criteria3: 1, inclusion_criteria4: 1, inclusion_criteria5: 1 }, + 'PASS', + ); + + runCase( + '排除标准全0应通过', + [rules[3]], + { enrollment_status: 1, exclusion_criteria1: 0, exclusion_criteria2: 0 }, + 'PASS', + ); + + runCase( + '无guard普通规则失败应保持失败', + [ + { + id: 'r5', + name: 'plain range check', + field: 'age', + logic: { '>=': [{ var: 'age' }, 18] }, + message: 'age too small', + severity: 'error', + category: 'D1', + }, + ], + { age: 10 }, + 'FAIL', + ); +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); + diff --git a/backend/scripts/regression_hardrule_guards_by_project.ts b/backend/scripts/regression_hardrule_guards_by_project.ts new file mode 100644 index 00000000..69f94026 --- /dev/null +++ b/backend/scripts/regression_hardrule_guards_by_project.ts @@ -0,0 +1,119 @@ +import assert from 'node:assert'; +import { PrismaClient } from '@prisma/client'; +import { HardRuleEngine, type QCRule } from '../src/modules/iit-manager/engines/HardRuleEngine.js'; + +const prisma = new PrismaClient(); + +type Status = 'PASS' | 'FAIL' | 'WARNING'; + +function fieldsOf(rule: QCRule): string[] { + return Array.isArray(rule.field) ? rule.field : [rule.field]; +} + +function findRule(rules: QCRule[], patterns: RegExp[]): QCRule | null { + return rules.find((r) => patterns.some((p) => p.test(r.name || ''))) || null; +} + +function findRuleByGuardType(rules: QCRule[], guardType: string): QCRule | null { + return rules.find((r) => String((r.metadata as any)?.guardType || '') === guardType) || null; +} + +function runCase(name: string, rule: QCRule, data: Record, expectedStatus: Status) { + const engine = new HardRuleEngine('regression-project'); + const result = engine.executeWithRules('R1', data, [rule]); + assert.strictEqual(result.overallStatus, expectedStatus, `${name} 期望 ${expectedStatus},实际 ${result.overallStatus}`); + console.log(`✅ ${name}: ${result.overallStatus}`); +} + +async function main() { + const projectId = process.argv[2]; + if (!projectId) { + throw new Error('Usage: npx tsx scripts/regression_hardrule_guards_by_project.ts '); + } + + const skill = await prisma.iitSkill.findFirst({ + where: { projectId, skillType: 'qc_process', isActive: true }, + select: { config: true }, + }); + + const rules = (((skill?.config as any)?.rules || []) as QCRule[]); + if (rules.length === 0) { + throw new Error(`项目 ${projectId} 未找到可用 qc_process 规则`); + } + + const dateRule = findRuleByGuardType(rules, 'date_not_before_or_equal'); + const assessRule = findRuleByGuardType(rules, 'skip_if_any_missing'); + const inclusionRule = findRuleByGuardType(rules, 'pass_if_all_ones'); + const exclusionRule = findRuleByGuardType(rules, 'pass_if_exclusion_all_zero'); + + const skipped: string[] = []; + + if (dateRule) { + const f = fieldsOf(dateRule); + if (f.length >= 2) { + runCase('同日访视不应误判早于', dateRule, { [f[0]]: '2024-03-27', [f[1]]: '2024-03-27' }, 'PASS'); + } else { + skipped.push('dateRule(字段数不足2)'); + } + } else { + const legacy = findRule(rules, [/访视日期.*知情同意/i, /早于知情同意/i]); + skipped.push(legacy ? 'dateRule(规则存在但未配置 guardType=date_not_before_or_equal)' : 'dateRule(未匹配)'); + } + + if (assessRule) { + const f = fieldsOf(assessRule); + if (f.length >= 2) { + runCase('评估日期缺失不应判不一致', assessRule, { [f[0]]: '', [f[1]]: '2024-03-27' }, 'PASS'); + } else { + skipped.push('assessRule(字段数不足2)'); + } + } else { + const legacy = findRule(rules, [/SF-?MPQ.*CMSS.*不一致/i, /评估日期.*访视日期.*不一致/i]); + skipped.push(legacy ? 'assessRule(规则存在但未配置 guardType=skip_if_any_missing)' : 'assessRule(未匹配)'); + } + + if (inclusionRule) { + const f = fieldsOf(inclusionRule); + if (f.length >= 2) { + const payload: Record = {}; + for (const field of f) payload[field] = 1; + runCase('纳入标准全1应通过', inclusionRule, payload, 'PASS'); + } else { + skipped.push('inclusionRule(字段数不足2)'); + } + } else { + const legacy = findRule(rules, [/所有纳入标准.*检查/i, /纳入标准.*满足/i]); + skipped.push(legacy ? 'inclusionRule(规则存在但未配置 guardType=pass_if_all_ones)' : 'inclusionRule(未匹配)'); + } + + if (exclusionRule) { + const f = fieldsOf(exclusionRule); + if (f.length >= 2) { + const payload: Record = {}; + payload[f[0]] = 1; + for (const field of f.slice(1)) payload[field] = 0; + runCase('排除标准全0应通过', exclusionRule, payload, 'PASS'); + } else { + skipped.push('exclusionRule(字段数不足2)'); + } + } else { + const legacy = findRule(rules, [/入组状态.*排除标准.*冲突/i]); + skipped.push(legacy ? 'exclusionRule(规则存在但未配置 guardType=pass_if_exclusion_all_zero)' : 'exclusionRule(未匹配)'); + } + + console.log(JSON.stringify({ + projectId, + totalRules: rules.length, + skipped, + }, null, 2)); +} + +main() + .catch((e) => { + console.error(e); + process.exit(1); + }) + .finally(async () => { + await prisma.$disconnect(); + }); + diff --git a/backend/scripts/run_iit_qc_once.ts b/backend/scripts/run_iit_qc_once.ts new file mode 100644 index 00000000..9250463a --- /dev/null +++ b/backend/scripts/run_iit_qc_once.ts @@ -0,0 +1,39 @@ +import { QcExecutor } from '../src/modules/iit-manager/engines/QcExecutor.js'; +import { dailyQcOrchestrator } from '../src/modules/iit-manager/services/DailyQcOrchestrator.js'; + +async function main() { + const projectId = process.argv[2]; + const skipPush = process.argv.includes('--skip-push'); + if (!projectId) { + throw new Error('Usage: npx tsx scripts/run_iit_qc_once.ts [--skip-push]'); + } + + const executor = new QcExecutor(projectId); + const batch = await executor.executeBatch({ + triggeredBy: 'manual', + skipSoftRules: true, + }); + + const orchestrate = await dailyQcOrchestrator.orchestrate(projectId, { skipPush }); + + console.log(JSON.stringify({ + projectId, + batch: { + totalRecords: batch.totalRecords, + totalEvents: batch.totalEvents, + passed: batch.passed, + failed: batch.failed, + warnings: batch.warnings, + fieldStatusWrites: batch.fieldStatusWrites, + executionTimeMs: batch.executionTimeMs, + }, + orchestrate, + skipPush, + }, null, 2)); +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); + diff --git a/backend/scripts/suggest_guard_types_for_project.ts b/backend/scripts/suggest_guard_types_for_project.ts new file mode 100644 index 00000000..b93f9108 --- /dev/null +++ b/backend/scripts/suggest_guard_types_for_project.ts @@ -0,0 +1,73 @@ +import { PrismaClient } from '@prisma/client'; + +const prisma = new PrismaClient(); + +type RuleLike = { + id: string; + name: string; + metadata?: Record; +}; + +function inferGuardTypeByName(name: string): string | null { + if (/访视日期.*知情同意|早于知情同意/i.test(name)) return 'date_not_before_or_equal'; + if (/SF-?MPQ.*CMSS.*不一致|评估日期.*访视日期.*不一致/i.test(name)) return 'skip_if_any_missing'; + if (/所有纳入标准.*检查|纳入标准.*满足/i.test(name)) return 'pass_if_all_ones'; + if (/入组状态.*排除标准.*冲突/i.test(name)) return 'pass_if_exclusion_all_zero'; + return null; +} + +async function main() { + const projectId = process.argv[2]; + const apply = process.argv.includes('--apply'); + if (!projectId) { + throw new Error('Usage: npx tsx scripts/suggest_guard_types_for_project.ts [--apply]'); + } + + const skill = await prisma.iitSkill.findFirst({ + where: { projectId, skillType: 'qc_process', isActive: true }, + select: { id: true, config: true }, + }); + if (!skill) throw new Error(`项目 ${projectId} 未找到启用的 qc_process skill`); + + const config = (skill.config as any) || {}; + const rules: RuleLike[] = Array.isArray(config.rules) ? config.rules : []; + + let candidates = 0; + const updates: Array<{ id: string; name: string; guardType: string }> = []; + + for (const r of rules) { + const current = String((r.metadata as any)?.guardType || '').trim(); + if (current) continue; + const inferred = inferGuardTypeByName(r.name || ''); + if (!inferred) continue; + candidates++; + updates.push({ id: r.id, name: r.name, guardType: inferred }); + r.metadata = { ...(r.metadata || {}), guardType: inferred }; + } + + if (apply && updates.length > 0) { + await prisma.iitSkill.update({ + where: { id: skill.id }, + data: { config: config as any, updatedAt: new Date() }, + }); + } + + console.log(JSON.stringify({ + projectId, + apply, + totalRules: rules.length, + candidates, + updated: apply ? updates.length : 0, + updates, + }, null, 2)); +} + +main() + .catch((e) => { + console.error(e); + process.exit(1); + }) + .finally(async () => { + await prisma.$disconnect(); + }); + diff --git a/backend/scripts/validate_guard_types_all_active_projects.ts b/backend/scripts/validate_guard_types_all_active_projects.ts new file mode 100644 index 00000000..c6b43fc6 --- /dev/null +++ b/backend/scripts/validate_guard_types_all_active_projects.ts @@ -0,0 +1,92 @@ +import { PrismaClient } from '@prisma/client'; + +const prisma = new PrismaClient(); + +type RuleLike = { + id: string; + name: string; + metadata?: Record; +}; + +function expectedGuardType(name: string): string | null { + if (/访视日期.*知情同意|早于知情同意/i.test(name)) return 'date_not_before_or_equal'; + if (/SF-?MPQ.*CMSS.*不一致|评估日期.*访视日期.*不一致/i.test(name)) return 'skip_if_any_missing'; + if (/所有纳入标准.*检查|纳入标准.*满足/i.test(name)) return 'pass_if_all_ones'; + if (/入组状态.*排除标准.*冲突/i.test(name)) return 'pass_if_exclusion_all_zero'; + return null; +} + +async function main() { + const strict = process.argv.includes('--strict'); + + const projects = await prisma.iitProject.findMany({ + where: { status: 'active', deletedAt: null }, + select: { id: true, name: true }, + }); + + const report: Array<{ + projectId: string; + projectName: string; + totalRules: number; + checkedRules: number; + missingCount: number; + mismatchCount: number; + }> = []; + let totalMissing = 0; + let totalMismatch = 0; + + for (const p of projects) { + const skill = await prisma.iitSkill.findFirst({ + where: { projectId: p.id, skillType: 'qc_process', isActive: true }, + select: { config: true }, + }); + const rules: RuleLike[] = Array.isArray((skill?.config as any)?.rules) ? (skill!.config as any).rules : []; + + let checkedRules = 0; + let missingCount = 0; + let mismatchCount = 0; + for (const r of rules) { + const expected = expectedGuardType(r.name || ''); + if (!expected) continue; + checkedRules++; + const actual = String((r.metadata as any)?.guardType || '').trim(); + if (!actual) missingCount++; + else if (actual !== expected) mismatchCount++; + } + + totalMissing += missingCount; + totalMismatch += mismatchCount; + report.push({ + projectId: p.id, + projectName: p.name, + totalRules: rules.length, + checkedRules, + missingCount, + mismatchCount, + }); + } + + const summary = { + strict, + projectCount: report.length, + totalMissing, + totalMismatch, + projects: report, + }; + + console.log(JSON.stringify(summary, null, 2)); + + if (strict && (totalMissing > 0 || totalMismatch > 0)) { + process.exit(2); + } +} + +main() + .catch((e) => { + console.error(e); + process.exit(1); + }) + .finally(async () => { + await prisma.$disconnect(); + }); + diff --git a/backend/scripts/validate_guard_types_for_project.ts b/backend/scripts/validate_guard_types_for_project.ts new file mode 100644 index 00000000..bcf0f3dc --- /dev/null +++ b/backend/scripts/validate_guard_types_for_project.ts @@ -0,0 +1,74 @@ +import { PrismaClient } from '@prisma/client'; + +const prisma = new PrismaClient(); + +type RuleLike = { + id: string; + name: string; + metadata?: Record; +}; + +function expectedGuardType(name: string): string | null { + if (/访视日期.*知情同意|早于知情同意/i.test(name)) return 'date_not_before_or_equal'; + if (/SF-?MPQ.*CMSS.*不一致|评估日期.*访视日期.*不一致/i.test(name)) return 'skip_if_any_missing'; + if (/所有纳入标准.*检查|纳入标准.*满足/i.test(name)) return 'pass_if_all_ones'; + if (/入组状态.*排除标准.*冲突/i.test(name)) return 'pass_if_exclusion_all_zero'; + return null; +} + +async function main() { + const projectId = process.argv[2]; + const strict = process.argv.includes('--strict'); + if (!projectId) { + throw new Error('Usage: npx tsx scripts/validate_guard_types_for_project.ts [--strict]'); + } + + const skill = await prisma.iitSkill.findFirst({ + where: { projectId, skillType: 'qc_process', isActive: true }, + select: { config: true }, + }); + const rules: RuleLike[] = Array.isArray((skill?.config as any)?.rules) ? (skill!.config as any).rules : []; + + const missing: Array<{ id: string; name: string; expectedGuardType: string }> = []; + const mismatch: Array<{ id: string; name: string; expectedGuardType: string; actualGuardType: string }> = []; + + for (const r of rules) { + const expected = expectedGuardType(r.name || ''); + if (!expected) continue; + const actual = String((r.metadata as any)?.guardType || '').trim(); + if (!actual) { + missing.push({ id: r.id, name: r.name, expectedGuardType: expected }); + continue; + } + if (actual !== expected) { + mismatch.push({ id: r.id, name: r.name, expectedGuardType: expected, actualGuardType: actual }); + } + } + + const result = { + projectId, + strict, + totalRules: rules.length, + checkedRules: missing.length + mismatch.length + (rules.filter((r) => expectedGuardType(r.name || '') && String((r.metadata as any)?.guardType || '').trim() === expectedGuardType(r.name || '')).length), + missingCount: missing.length, + mismatchCount: mismatch.length, + missing, + mismatch, + }; + + console.log(JSON.stringify(result, null, 2)); + + if (strict && (missing.length > 0 || mismatch.length > 0)) { + process.exit(2); + } +} + +main() + .catch((e) => { + console.error(e); + process.exit(1); + }) + .finally(async () => { + await prisma.$disconnect(); + }); + diff --git a/backend/src/modules/admin/iit-projects/iitEqueryController.ts b/backend/src/modules/admin/iit-projects/iitEqueryController.ts index 46bcf497..19502691 100644 --- a/backend/src/modules/admin/iit-projects/iitEqueryController.ts +++ b/backend/src/modules/admin/iit-projects/iitEqueryController.ts @@ -136,3 +136,23 @@ export async function closeEquery( return reply.status(400).send({ success: false, error: msg }); } } + +export async function reopenEquery( + request: FastifyRequest<{ + Params: EqueryIdParams; + Body: { reviewNote?: string }; + }>, + reply: FastifyReply +) { + try { + const { equeryId } = request.params; + const { reviewNote } = request.body || {}; + const service = getIitEqueryService(prisma); + const updated = await service.reopen(equeryId, { reviewNote }); + return reply.send({ success: true, data: updated }); + } catch (error) { + const msg = error instanceof Error ? error.message : String(error); + logger.error('eQuery 重开失败', { error: msg }); + return reply.status(400).send({ success: false, error: msg }); + } +} diff --git a/backend/src/modules/admin/iit-projects/iitEqueryRoutes.ts b/backend/src/modules/admin/iit-projects/iitEqueryRoutes.ts index 80e141c5..2c254ee4 100644 --- a/backend/src/modules/admin/iit-projects/iitEqueryRoutes.ts +++ b/backend/src/modules/admin/iit-projects/iitEqueryRoutes.ts @@ -23,4 +23,7 @@ export async function iitEqueryRoutes(fastify: FastifyInstance) { // 手动关闭 eQuery fastify.post('/:projectId/equeries/:equeryId/close', controller.closeEquery); + + // 手动重开 eQuery + fastify.post('/:projectId/equeries/:equeryId/reopen', controller.reopenEquery); } diff --git a/backend/src/modules/admin/iit-projects/iitEqueryService.ts b/backend/src/modules/admin/iit-projects/iitEqueryService.ts index c65445d3..8144ae4d 100644 --- a/backend/src/modules/admin/iit-projects/iitEqueryService.ts +++ b/backend/src/modules/admin/iit-projects/iitEqueryService.ts @@ -38,6 +38,10 @@ export interface ReviewEqueryInput { reviewNote?: string; } +export interface ReopenEqueryInput { + reviewNote?: string; +} + export interface EqueryListParams { projectId: string; status?: string; @@ -101,30 +105,91 @@ export class IitEqueryService { async createBatch(inputs: CreateEqueryInput[]) { if (inputs.length === 0) return { count: 0 }; - const data = inputs.map((input) => ({ - projectId: input.projectId, - recordId: input.recordId, - eventId: input.eventId, - formName: input.formName, - fieldName: input.fieldName, - qcLogId: input.qcLogId, - reportId: input.reportId, - queryText: input.queryText, - expectedAction: input.expectedAction, + const payload = inputs.map((input) => ({ + project_id: input.projectId, + record_id: input.recordId, + event_id: input.eventId ?? null, + form_name: input.formName ?? null, + field_name: input.fieldName ?? null, + qc_log_id: input.qcLogId ?? null, + report_id: input.reportId ?? null, + query_text: input.queryText, + expected_action: input.expectedAction ?? null, severity: input.severity || 'warning', - category: input.category, - status: 'pending' as const, - assignedTo: input.assignedTo, + category: input.category ?? null, + status: 'pending', + assigned_to: input.assignedTo ?? null, })); - const result = await this.prisma.iitEquery.createMany({ data }); + const inserted = await this.prisma.$executeRawUnsafe( + ` + WITH payload AS ( + SELECT * + FROM jsonb_to_recordset($1::jsonb) AS x( + project_id text, + record_id text, + event_id text, + form_name text, + field_name text, + qc_log_id text, + report_id text, + query_text text, + expected_action text, + severity text, + category text, + status text, + assigned_to text + ) + ) + INSERT INTO iit_schema.equery ( + project_id, + record_id, + event_id, + form_name, + field_name, + qc_log_id, + report_id, + query_text, + expected_action, + severity, + category, + status, + assigned_to + ) + SELECT + project_id, + record_id, + event_id, + form_name, + field_name, + qc_log_id, + report_id, + query_text, + expected_action, + severity, + category, + status, + assigned_to + FROM payload + ON CONFLICT ( + project_id, + record_id, + (COALESCE(event_id, '')), + (COALESCE(category, '')) + ) + WHERE status IN ('pending', 'responded', 'reviewing', 'reopened') + DO NOTHING + `, + JSON.stringify(payload), + ); logger.info('eQuery batch created', { projectId: inputs[0].projectId, - count: result.count, + count: Number(inserted), + skipped: inputs.length - Number(inserted), }); - return { count: result.count }; + return { count: Number(inserted) }; } /** @@ -139,7 +204,7 @@ export class IitEqueryService { if (severity) where.severity = severity; if (assignedTo) where.assignedTo = assignedTo; - const [items, total] = await Promise.all([ + const [items, total, eventRows] = await Promise.all([ this.prisma.iitEquery.findMany({ where, orderBy: [{ status: 'asc' }, { createdAt: 'desc' }], @@ -147,9 +212,28 @@ export class IitEqueryService { take: pageSize, }), this.prisma.iitEquery.count({ where }), + this.prisma.$queryRaw>` + SELECT event_id, MAX(event_label) AS event_label + FROM iit_schema.qc_event_status + WHERE project_id = ${projectId} + AND event_id IS NOT NULL + GROUP BY event_id + `.catch(() => [] as Array<{ event_id: string; event_label: string | null }>), ]); - return { items, total, page, pageSize }; + const eventLabelMap = new Map(); + for (const row of eventRows) { + if (row.event_id && row.event_label) { + eventLabelMap.set(row.event_id, row.event_label); + } + } + + const itemsWithLabels = items.map((item) => ({ + ...item, + eventLabel: item.eventId ? (eventLabelMap.get(item.eventId) || null) : null, + })); + + return { items: itemsWithLabels, total, page, pageSize }; } /** @@ -253,6 +337,31 @@ export class IitEqueryService { return updated; } + /** + * 手动重开 eQuery(closed → reopened) + */ + async reopen(id: string, input?: ReopenEqueryInput) { + const equery = await this.prisma.iitEquery.findUnique({ where: { id } }); + if (!equery) throw new Error('eQuery 不存在'); + if (equery.status !== 'closed') { + throw new Error(`当前状态 ${equery.status} 不允许重开`); + } + + const updated = await this.prisma.iitEquery.update({ + where: { id }, + data: { + status: 'reopened', + closedAt: null, + closedBy: null, + resolution: null, + reviewNote: input?.reviewNote || equery.reviewNote, + }, + }); + + logger.info('eQuery reopened', { id, recordId: equery.recordId }); + return updated; + } + /** * 获取统计 */ diff --git a/backend/src/modules/admin/iit-projects/iitQcCockpitController.ts b/backend/src/modules/admin/iit-projects/iitQcCockpitController.ts index 8178c05b..c1543388 100644 --- a/backend/src/modules/admin/iit-projects/iitQcCockpitController.ts +++ b/backend/src/modules/admin/iit-projects/iitQcCockpitController.ts @@ -15,6 +15,45 @@ import { logger } from '../../../common/logging/index.js'; import { prisma } from '../../../config/database.js'; class IitQcCockpitController { + private fallbackEventLabel(eventId: string): string { + if (!eventId) return '—'; + return `访视(${eventId})`; + } + + private async buildEventLabelMap(projectId: string): Promise> { + const map = new Map(); + const [project, rows] = await Promise.all([ + prisma.iitProject.findUnique({ + where: { id: projectId }, + select: { cachedRules: true }, + }), + prisma.$queryRaw>` + SELECT event_id, MAX(event_label) AS event_label + FROM iit_schema.qc_event_status + WHERE project_id = ${projectId} + AND event_id IS NOT NULL + GROUP BY event_id + `.catch(() => [] as Array<{ event_id: string; event_label: string | null }>), + ]); + + for (const row of rows) { + if (row.event_id && row.event_label) { + map.set(row.event_id, row.event_label); + } + } + + const cached = project?.cachedRules as any; + if (cached?.eventLabels && typeof cached.eventLabels === 'object') { + for (const [eventId, label] of Object.entries(cached.eventLabels)) { + if (typeof label === 'string' && label.trim() && !map.has(eventId)) { + map.set(eventId, label.trim()); + } + } + } + + return map; + } + /** * 获取质控驾驶舱数据 */ @@ -196,7 +235,7 @@ class IitQcCockpitController { async getTimeline( request: FastifyRequest<{ Params: { projectId: string }; - Querystring: { page?: string; pageSize?: string; date?: string }; + Querystring: { page?: string; pageSize?: string; date?: string; startDate?: string; endDate?: string }; }>, reply: FastifyReply ) { @@ -205,12 +244,36 @@ class IitQcCockpitController { const page = query.page ? parseInt(query.page) : 1; const pageSize = query.pageSize ? parseInt(query.pageSize) : 20; const dateFilter = query.date; + const startDate = query.startDate; + const endDate = query.endDate; try { - let dateClause = ''; + const dateConditions: string[] = []; + const dateParams: string[] = []; + let dateParamIdx = 2; + + // 兼容旧参数 date,同时支持区间参数 startDate/endDate if (dateFilter) { - dateClause = `AND fs.last_qc_at >= '${dateFilter}'::date AND fs.last_qc_at < ('${dateFilter}'::date + INTERVAL '1 day')`; + dateConditions.push( + `fs.last_qc_at >= $${dateParamIdx}::date AND fs.last_qc_at < ($${dateParamIdx}::date + INTERVAL '1 day')`, + ); + dateParams.push(dateFilter); + dateParamIdx += 1; + } else { + if (startDate) { + dateConditions.push(`fs.last_qc_at >= $${dateParamIdx}::date`); + dateParams.push(startDate); + dateParamIdx += 1; + } + if (endDate) { + dateConditions.push(`fs.last_qc_at < ($${dateParamIdx}::date + INTERVAL '1 day')`); + dateParams.push(endDate); + dateParamIdx += 1; + } } + const dateClause = dateConditions.length > 0 ? ` AND ${dateConditions.join(' AND ')}` : ''; + const limitPlaceholder = `$${dateParamIdx}`; + const offsetPlaceholder = `$${dateParamIdx + 1}`; // 1. 获取有问题的受试者摘要(分页) const recordSummaries = await prisma.$queryRawUnsafe>( `SELECT COUNT(DISTINCT record_id) AS cnt - FROM iit_schema.qc_field_status - WHERE project_id = $1 AND status IN ('FAIL', 'WARNING') + FROM iit_schema.qc_field_status fs + WHERE fs.project_id = $1 AND fs.status IN ('FAIL', 'WARNING') ${dateClause}`, - projectId + projectId, ...dateParams ); const totalRecords = Number(countResult[0]?.cnt || 0); // 3. 获取这些受试者的问题详情(LEFT JOIN 获取字段/事件中文名) const recordIds = recordSummaries.map(r => r.record_id); let issues: any[] = []; + const eventLabelMap = await this.buildEventLabelMap(projectId); if (recordIds.length > 0) { issues = await prisma.$queryRawUnsafe( `SELECT @@ -280,7 +344,7 @@ class IitQcCockpitController { issuesByRecord.get(key)!.push(issue); } - // 5. 同时获取通过的受试者(无问题的),补充到时间线 + // 5. 同时获取通过的受试者(按同一时间窗) const passedRecords = await prisma.$queryRawUnsafe { @@ -328,7 +389,7 @@ class IitQcCockpitController { field: i.field_name || '', fieldLabel: i.field_label || '', eventId: i.event_id || '', - eventLabel: i.event_label || '', + eventLabel: i.event_label || eventLabelMap.get(i.event_id || '') || this.fallbackEventLabel(i.event_id || ''), formName: i.form_name || '', message: i.message || '', severity: i.severity || 'warning', @@ -429,28 +490,34 @@ class IitQcCockpitController { const since = new Date(); since.setDate(since.getDate() - days); - const logs = await prisma.iitQcLog.findMany({ - where: { projectId, createdAt: { gte: since } }, - select: { createdAt: true, status: true }, - orderBy: { createdAt: 'asc' }, - }); + // 使用与 Dashboard/Report 一致的主口径(qc_project_stats)返回当前快照趋势点 + const [projectStats, lastQcRow] = await Promise.all([ + prisma.iitQcProjectStats.findUnique({ + where: { projectId }, + select: { + totalRecords: true, + passedRecords: true, + }, + }), + prisma.$queryRaw>` + SELECT MAX(last_qc_at) AS last_qc_at + FROM iit_schema.qc_field_status + WHERE project_id = ${projectId} + `, + ]); - // Group by date - const dailyMap = new Map(); - for (const log of logs) { - const dateKey = log.createdAt.toISOString().split('T')[0]; - const entry = dailyMap.get(dateKey) || { total: 0, passed: 0 }; - entry.total++; - if (log.status === 'PASS') entry.passed++; - dailyMap.set(dateKey, entry); - } + const lastQcAt = lastQcRow?.[0]?.last_qc_at ? new Date(lastQcRow[0].last_qc_at) : null; + const total = projectStats?.totalRecords ?? 0; + const passed = projectStats?.passedRecords ?? 0; - const trend = Array.from(dailyMap.entries()).map(([date, { total, passed }]) => ({ - date, - total, - passed, - passRate: total > 0 ? Math.round((passed / total) * 100) : 0, - })); + const trend = (lastQcAt && lastQcAt >= since) + ? [{ + date: lastQcAt.toISOString().split('T')[0], + total, + passed, + passRate: total > 0 ? Math.round((passed / total) * 100) : 0, + }] + : []; return reply.send({ success: true, data: trend }); } catch (error: any) { diff --git a/backend/src/modules/admin/iit-projects/iitQcCockpitService.ts b/backend/src/modules/admin/iit-projects/iitQcCockpitService.ts index 92f7adcd..948a2277 100644 --- a/backend/src/modules/admin/iit-projects/iitQcCockpitService.ts +++ b/backend/src/modules/admin/iit-projects/iitQcCockpitService.ts @@ -142,6 +142,47 @@ export interface RecordDetail { // ============================================================ class IitQcCockpitService { + /** + * 统一构建 event_id -> event_label 映射 + * 优先级:project.cachedRules.eventLabels > REDCap events > fallback 格式化 + */ + private async buildEventLabelMap(projectId: string): Promise> { + const map = new Map(); + const project = await prisma.iitProject.findUnique({ + where: { id: projectId }, + select: { cachedRules: true, redcapUrl: true, redcapApiToken: true }, + }); + + const cached = project?.cachedRules as any; + if (cached?.eventLabels && typeof cached.eventLabels === 'object') { + for (const [eid, label] of Object.entries(cached.eventLabels)) { + if (typeof label === 'string' && label.trim()) { + map.set(eid, label.trim()); + } + } + } + + if (project?.redcapUrl && project?.redcapApiToken) { + try { + const redcap = new RedcapAdapter(project.redcapUrl, project.redcapApiToken); + const events = await redcap.getEvents(); + for (const ev of events) { + if (ev.unique_event_name && ev.event_name && !map.has(ev.unique_event_name)) { + map.set(ev.unique_event_name, ev.event_name); + } + } + } catch { + // non-fatal: keep fallback mapping + } + } + + return map; + } + + private resolveEventLabel(eventId: string, eventLabelMap: Map): string { + return eventLabelMap.get(eventId) || formatFormName(eventId); + } + /** * 获取质控驾驶舱完整数据 */ @@ -179,7 +220,7 @@ class IitQcCockpitService { * V3.1: 从 qc_project_stats + qc_field_status 获取统计 */ async getStats(projectId: string): Promise { - const [projectStats, fieldIssues, pendingEqs, d6Count] = await Promise.all([ + const [projectStats, fieldIssues, fieldSeverityTotals, pendingEqs, d6Count] = await Promise.all([ prisma.iitQcProjectStats.findUnique({ where: { projectId } }), prisma.$queryRaw>` SELECT rule_name, severity, COUNT(*) AS cnt @@ -189,6 +230,12 @@ class IitQcCockpitService { ORDER BY cnt DESC LIMIT 10 `, + prisma.$queryRaw>` + SELECT COALESCE(severity, 'warning') AS severity, COUNT(*) AS cnt + FROM iit_schema.qc_field_status + WHERE project_id = ${projectId} AND status IN ('FAIL', 'WARNING') + GROUP BY COALESCE(severity, 'warning') + `, prisma.iitEquery.count({ where: { projectId, status: { in: ['pending', 'reopened'] } } }), prisma.$queryRaw<[{ cnt: bigint }]>` SELECT COUNT(*) AS cnt FROM iit_schema.qc_field_status @@ -204,7 +251,7 @@ class IitQcCockpitService { const healthScore = ((projectStats as any)?.healthScore as number) ?? 0; const healthGrade = ((projectStats as any)?.healthGrade as string) ?? 'N/A'; - const passRate = totalRecords > 0 ? Math.round((passedRecords / totalRecords) * 1000) / 10 : 100; + const passRate = totalRecords > 0 ? Math.round((passedRecords / totalRecords) * 1000) / 10 : 0; const qualityScore = Math.round(healthScore); const DIMENSION_LABELS: Record = { @@ -223,12 +270,17 @@ class IitQcCockpitService { } let criticalCount = 0; + for (const row of fieldSeverityTotals) { + if ((row.severity || '').toLowerCase() === 'critical') { + criticalCount += Number(row.cnt); + } + } + const topIssues: QcStats['topIssues'] = []; for (const row of fieldIssues) { const cnt = Number(row.cnt); const sev: 'critical' | 'warning' | 'info' = row.severity === 'critical' ? 'critical' : 'warning'; - if (sev === 'critical') criticalCount += cnt; if (topIssues.length < 5) { topIssues.push({ issue: row.rule_name || 'Unknown', count: cnt, severity: sev }); } @@ -376,7 +428,7 @@ class IitQcCockpitService { form_name: string; status: string; detected_at: Date | null; }>>` SELECT field_name, rule_name, message, severity, rule_category, - event_id, form_name, status, detected_at + event_id, form_name, status, last_qc_at AS detected_at FROM iit_schema.qc_field_status WHERE project_id = ${projectId} AND record_id = ${recordId} @@ -491,14 +543,14 @@ class IitQcCockpitService { */ async getDeviations(projectId: string): Promise> { - const [rows, semanticRows] = await Promise.all([ + const [rows, semanticRows, eventLabelMap] = await Promise.all([ prisma.$queryRaw>` - SELECT record_id, event_id, field_name, message, severity, rule_category, detected_at + SELECT record_id, event_id, field_name, message, severity, rule_category, last_qc_at AS detected_at FROM iit_schema.qc_field_status WHERE project_id = ${projectId} AND rule_category = 'D6' AND status IN ('FAIL', 'WARNING') ORDER BY record_id, event_id @@ -507,6 +559,7 @@ class IitQcCockpitService { SELECT actual_name, semantic_label FROM iit_schema.field_mapping WHERE project_id = ${projectId} AND semantic_label IS NOT NULL `.catch(() => [] as any[]), + this.buildEventLabelMap(projectId), ]); const semanticMap = new Map(); @@ -517,6 +570,7 @@ class IitQcCockpitService { return rows.map(r => ({ recordId: r.record_id, eventId: r.event_id, + eventLabel: this.resolveEventLabel(r.event_id, eventLabelMap), fieldName: r.field_name, fieldLabel: semanticMap.get(r.field_name) || r.field_name, message: r.message, @@ -549,7 +603,7 @@ class IitQcCockpitService { }>>` SELECT record_id, rule_id, rule_name, field_name, status, actual_value, expected_value, message FROM iit_schema.qc_field_status - WHERE project_id = ${projectId} AND rule_category = 'D1' + WHERE project_id = ${projectId} AND rule_category = 'D1' AND status IN ('PASS', 'FAIL', 'WARNING') ORDER BY record_id, rule_id `, prisma.$queryRaw>` @@ -568,32 +622,69 @@ class IitQcCockpitService { const d1Rules = rules.filter(r => r.category === 'D1' || r.category === 'inclusion' || r.category === 'exclusion', ); + const d1RuleById = new Map(); + for (const rule of d1Rules) { + d1RuleById.set(rule.id, { id: rule.id, name: rule.name, field: rule.field }); + } const ruleType = (ruleId: string): 'inclusion' | 'exclusion' => ruleId.startsWith('exc_') ? 'exclusion' : 'inclusion'; - const subjectIssueMap = new Map>(); + const subjectIssueMap = new Map>>(); + const discoveredRuleMap = new Map(); for (const row of d1Rows) { + if (!row.rule_id) continue; if (!subjectIssueMap.has(row.record_id)) subjectIssueMap.set(row.record_id, new Map()); - subjectIssueMap.get(row.record_id)!.set(row.rule_id, { + const recMap = subjectIssueMap.get(row.record_id)!; + if (!recMap.has(row.rule_id)) recMap.set(row.rule_id, []); + recMap.get(row.rule_id)!.push({ status: row.status, actualValue: row.actual_value, expectedValue: row.expected_value, message: row.message, }); + + if (!discoveredRuleMap.has(row.rule_id)) { + discoveredRuleMap.set(row.rule_id, { + ruleId: row.rule_id, + ruleName: row.rule_name || row.rule_id, + fieldName: row.field_name || '', + }); + } } - const allRecordIds = allRecordRows.map(r => r.record_id); + const allRecordIds = Array.from(new Set([ + ...allRecordRows.map(r => r.record_id), + ...d1Rows.map(r => r.record_id), + ])).sort((a, b) => a.localeCompare(b, undefined, { numeric: true })); const totalSubjects = allRecordIds.length; - const criteria = d1Rules.map(rule => { + const ruleUniverse = discoveredRuleMap.size > 0 + ? Array.from(discoveredRuleMap.values()).map(r => ({ + id: r.ruleId, + name: d1RuleById.get(r.ruleId)?.name || r.ruleName, + field: d1RuleById.get(r.ruleId)?.field || r.fieldName, + })) + : d1Rules.map(r => ({ id: r.id, name: r.name, field: r.field })); + + const criteria = ruleUniverse.map(rule => { let passCount = 0; let failCount = 0; + let warningOrUncheckedCount = 0; for (const recordId of allRecordIds) { - const issues = subjectIssueMap.get(recordId); - const res = issues?.get(rule.id); - if (res && res.status === 'FAIL') failCount++; + const issueRows = subjectIssueMap.get(recordId)?.get(rule.id) || []; + const hasFail = issueRows.some(r => r.status === 'FAIL'); + const hasWarning = issueRows.some(r => r.status === 'WARNING'); + const hasPass = issueRows.some(r => r.status === 'PASS'); + + if (hasFail) failCount++; + else if (hasWarning || !hasPass) warningOrUncheckedCount++; else passCount++; } return { @@ -603,27 +694,49 @@ class IitQcCockpitService { fieldName: rule.field, fieldLabel: labelMap.get(rule.field) || rule.field, passCount, - failCount, + failCount: failCount + warningOrUncheckedCount, }; }); const subjects = allRecordIds.map(recordId => { - const issues = subjectIssueMap.get(recordId) || new Map(); - const criteriaResults = d1Rules.map(rule => { - const res = issues.get(rule.id); + const issues = subjectIssueMap.get(recordId) || new Map>(); + const criteriaResults = ruleUniverse.map(rule => { + const resRows = issues.get(rule.id) || []; + const hasFail = resRows.some(r => r.status === 'FAIL'); + const hasWarning = resRows.some(r => r.status === 'WARNING'); + const hasPass = resRows.some(r => r.status === 'PASS'); + const firstRes = resRows[0]; + + const status: 'PASS' | 'FAIL' | 'NOT_CHECKED' = hasFail + ? 'FAIL' + : hasWarning + ? 'NOT_CHECKED' + : hasPass + ? 'PASS' + : 'NOT_CHECKED'; + return { ruleId: rule.id, ruleName: rule.name, type: ruleType(rule.id), - status: (res?.status === 'FAIL' ? 'FAIL' : 'PASS') as 'PASS' | 'FAIL' | 'NOT_CHECKED', - actualValue: res?.actualValue || null, - expectedValue: res?.expectedValue || null, - message: res?.message || null, + status, + actualValue: firstRes?.actualValue || null, + expectedValue: firstRes?.expectedValue || null, + message: firstRes?.message || null, }; }); const failedCriteria = criteriaResults.filter(c => c.status === 'FAIL').map(c => c.ruleId); - const overallStatus: 'eligible' | 'ineligible' | 'incomplete' = - failedCriteria.length > 0 ? 'ineligible' : 'eligible'; + const unchecked = criteriaResults.filter(c => c.status === 'NOT_CHECKED').map(c => c.ruleId); + const overallStatus: 'eligible' | 'ineligible' | 'incomplete' = failedCriteria.length > 0 + ? 'ineligible' + : unchecked.length > 0 + ? 'incomplete' + : 'eligible'; return { recordId, overallStatus, failedCriteria, criteriaResults }; }); @@ -635,7 +748,7 @@ class IitQcCockpitService { totalScreened: totalSubjects, eligible, ineligible, - incomplete: 0, + incomplete: subjects.filter(s => s.overallStatus === 'incomplete').length, eligibilityRate: totalSubjects > 0 ? Math.round((eligible / totalSubjects) * 10000) / 100 : 0, }, criteria, @@ -647,7 +760,7 @@ class IitQcCockpitService { * D2 完整性总览 — L1 项目 + L2 受试者 + L3 事件级统计 */ async getCompletenessReport(projectId: string) { - const [byRecord, byRecordEvent, eventLabelRows] = await Promise.all([ + const [byRecord, byRecordEvent, eventLabelRows, activeEventRows, resolvedEventLabelMap] = await Promise.all([ prisma.$queryRaw>` @@ -672,10 +785,20 @@ class IitQcCockpitService { SELECT DISTINCT event_id, event_label FROM iit_schema.qc_event_status WHERE project_id = ${projectId} AND event_label IS NOT NULL `.catch(() => [] as any[]), + prisma.$queryRaw>` + SELECT DISTINCT record_id, event_id + FROM iit_schema.qc_event_status + WHERE project_id = ${projectId} + `.catch(() => [] as any[]), + this.buildEventLabelMap(projectId), ]); - const eventLabelMap = new Map(); - for (const r of eventLabelRows) if (r.event_label) eventLabelMap.set(r.event_id, r.event_label); + const eventLabelMap = new Map(resolvedEventLabelMap); + for (const r of eventLabelRows) { + if (r.event_label && !eventLabelMap.has(r.event_id)) { + eventLabelMap.set(r.event_id, r.event_label); + } + } const eventsByRecord = new Map>(); for (const r of byRecordEvent) { @@ -684,7 +807,7 @@ class IitQcCockpitService { if (!eventsByRecord.has(r.record_id)) eventsByRecord.set(r.record_id, []); eventsByRecord.get(r.record_id)!.push({ eventId: r.event_id, - eventLabel: eventLabelMap.get(r.event_id) || r.event_id, + eventLabel: this.resolveEventLabel(r.event_id, eventLabelMap), fieldsTotal: total, fieldsMissing: missing, missingRate: total > 0 ? Math.round((missing / total) * 10000) / 100 : 0, @@ -694,6 +817,14 @@ class IitQcCockpitService { let totalRequired = 0; let totalMissing = 0; const uniqueEvents = new Set(); + const d2UniqueEvents = new Set(); + const activeEventsByRecord = new Map>(); + + for (const row of activeEventRows) { + if (!activeEventsByRecord.has(row.record_id)) activeEventsByRecord.set(row.record_id, new Set()); + activeEventsByRecord.get(row.record_id)!.add(row.event_id); + uniqueEvents.add(row.event_id); + } const bySubject = byRecord.map(r => { const total = Number(r.total); @@ -701,14 +832,16 @@ class IitQcCockpitService { totalRequired += total; totalMissing += missing; const events = eventsByRecord.get(r.record_id) || []; - events.forEach(e => uniqueEvents.add(e.eventId)); + events.forEach(e => d2UniqueEvents.add(e.eventId)); + const activeEventCount = activeEventsByRecord.get(r.record_id)?.size || 0; return { recordId: r.record_id, fieldsTotal: total, fieldsFilled: total - missing, fieldsMissing: missing, missingRate: total > 0 ? Math.round((missing / total) * 10000) / 100 : 0, - activeEvents: events.length, + activeEvents: activeEventCount, + d2CoveredEvents: events.length, byEvent: events, }; }); @@ -724,6 +857,7 @@ class IitQcCockpitService { overallMissingRate: totalRequired > 0 ? Math.round((totalMissing / totalRequired) * 10000) / 100 : 0, subjectsChecked: byRecord.length, eventsChecked: uniqueEvents.size, + d2EventsChecked: d2UniqueEvents.size, isStale, }, bySubject, @@ -734,7 +868,7 @@ class IitQcCockpitService { * D2 字段级懒加载 — 按 recordId + eventId 返回 L4 表单 + L5 字段清单 */ async getCompletenessFields(projectId: string, recordId: string, eventId: string) { - const [missingRows, fieldMappingRows] = await Promise.all([ + const [missingRows, fieldMappingRows, resolvedEventLabelMap] = await Promise.all([ prisma.$queryRaw>` @@ -749,6 +883,7 @@ class IitQcCockpitService { SELECT actual_name, semantic_label, form_name, field_type FROM iit_schema.field_mapping WHERE project_id = ${projectId} AND semantic_label IS NOT NULL `.catch(() => [] as any[]), + this.buildEventLabelMap(projectId), ]); const labelMap = new Map(); @@ -780,12 +915,7 @@ class IitQcCockpitService { const totalByForm = new Map(); for (const r of allFieldsCount) totalByForm.set(r.form_name, Number(r.cnt)); - const eventLabelRows = await prisma.$queryRaw>` - SELECT event_label FROM iit_schema.qc_event_status - WHERE project_id = ${projectId} AND event_id = ${eventId} - LIMIT 1 - `.catch(() => [] as any[]); - const eventLabel = (eventLabelRows as any)[0]?.event_label || eventId; + const eventLabel = this.resolveEventLabel(eventId, resolvedEventLabelMap); const byForm = [...formGroups.entries()].map(([formName, missingFields]) => ({ formName, @@ -802,7 +932,7 @@ class IitQcCockpitService { * D3/D4 eQuery 全生命周期跟踪 */ async getEqueryLogReport(projectId: string) { - const [equeries, fieldRows] = await Promise.all([ + const [equeries, fieldRows, eventLabelMap] = await Promise.all([ prisma.iitEquery.findMany({ where: { projectId }, orderBy: { createdAt: 'desc' }, @@ -811,6 +941,7 @@ class IitQcCockpitService { SELECT actual_name, semantic_label FROM iit_schema.field_mapping WHERE project_id = ${projectId} AND semantic_label IS NOT NULL `.catch(() => [] as any[]), + this.buildEventLabelMap(projectId), ]); const labelMap = new Map(); @@ -850,6 +981,7 @@ class IitQcCockpitService { id: eq.id, recordId: eq.recordId, eventId: eq.eventId || null, + eventLabel: eq.eventId ? this.resolveEventLabel(eq.eventId, eventLabelMap) : null, formName: eq.formName || null, fieldName: eq.fieldName || null, fieldLabel: eq.fieldName ? (labelMap.get(eq.fieldName) || eq.fieldName) : null, @@ -902,13 +1034,13 @@ class IitQcCockpitService { * D6 方案偏离报表 — 结构化超窗数据 */ async getDeviationReport(projectId: string) { - const [rows, fieldRows] = await Promise.all([ + const [rows, fieldRows, eventLabelMap] = await Promise.all([ prisma.$queryRaw>` - SELECT id, record_id, event_id, field_name, rule_name, message, severity, actual_value, detected_at + SELECT id, record_id, event_id, field_name, rule_name, message, severity, actual_value, last_qc_at AS detected_at FROM iit_schema.qc_field_status WHERE project_id = ${projectId} AND rule_category = 'D6' AND status IN ('FAIL', 'WARNING') ORDER BY record_id, event_id @@ -917,6 +1049,7 @@ class IitQcCockpitService { SELECT actual_name, semantic_label FROM iit_schema.field_mapping WHERE project_id = ${projectId} AND semantic_label IS NOT NULL `.catch(() => [] as any[]), + this.buildEventLabelMap(projectId), ]); const labelMap = new Map(); @@ -943,7 +1076,7 @@ class IitQcCockpitService { id: r.id, recordId: r.record_id, eventId: r.event_id, - eventLabel: parsed.eventLabel || r.event_id, + eventLabel: parsed.eventLabel || this.resolveEventLabel(r.event_id, eventLabelMap), fieldName: r.field_name, fieldLabel: labelMap.get(r.field_name) || r.field_name, deviationType, diff --git a/backend/src/modules/iit-manager/controllers/WechatCallbackController.ts b/backend/src/modules/iit-manager/controllers/WechatCallbackController.ts index 88091fb7..6bc3728a 100644 --- a/backend/src/modules/iit-manager/controllers/WechatCallbackController.ts +++ b/backend/src/modules/iit-manager/controllers/WechatCallbackController.ts @@ -496,11 +496,23 @@ export class WechatCallbackController { details: any; }): Promise { try { + // audit_logs 受 project_id 外键约束;无项目上下文时跳过 DB 审计 + if (!data.projectId) return; + await prisma.$executeRaw` INSERT INTO iit_schema.audit_logs - (project_id, action, details, created_at) + (project_id, user_id, action_type, entity_type, entity_id, details, trace_id, created_at) VALUES - (${data.projectId}, ${data.action}, ${JSON.stringify(data.details)}::jsonb, NOW()) + ( + ${data.projectId}, + ${'system'}, + ${data.action}, + ${'wechat_callback'}, + ${String(data.details?.fromUserName || data.details?.toUserName || 'unknown')}, + ${JSON.stringify(data.details)}::jsonb, + ${crypto.randomUUID()}, + NOW() + ) `; } catch (error: any) { logger.warn('⚠️ 记录审计日志失败(非致命)', { diff --git a/backend/src/modules/iit-manager/engines/CompletenessEngine.ts b/backend/src/modules/iit-manager/engines/CompletenessEngine.ts index 8dcdaeb7..6f830fa1 100644 --- a/backend/src/modules/iit-manager/engines/CompletenessEngine.ts +++ b/backend/src/modules/iit-manager/engines/CompletenessEngine.ts @@ -43,6 +43,12 @@ interface FieldMeta { branching_logic: string; } +interface FormEventMapItem { + eventName: string; + eventLabel: string; + formName: string; +} + // ============================================================ // Helpers // ============================================================ @@ -99,7 +105,7 @@ export class CompletenessEngine { .map((r: any) => r.redcap_event_name || 'default'), ); - let formEventMapping: Array<{ eventName: string; formName: string }>; + let formEventMapping: FormEventMapItem[]; try { formEventMapping = await this.adapter.getFormEventMapping(); } catch { @@ -136,7 +142,8 @@ export class CompletenessEngine { fieldName: field.field_name, }); } else { - issues.push(this.buildIssue(field, event, recordId)); + const eventLabel = formEventMapping.find(m => m.eventName === event)?.eventLabel || event; + issues.push(this.buildIssue(field, event, eventLabel, recordId)); } } } @@ -156,7 +163,7 @@ export class CompletenessEngine { fieldName: field.field_name, }); } else { - issues.push(this.buildIssue(field, 'default', recordId)); + issues.push(this.buildIssue(field, 'default', 'default', recordId)); } } } @@ -211,13 +218,13 @@ export class CompletenessEngine { return results; } - private buildIssue(field: FieldMeta, eventId: string, recordId: string): SkillIssue { + private buildIssue(field: FieldMeta, eventId: string, eventLabel: string, recordId: string): SkillIssue { return { ruleId: `D2_missing_${field.field_name}`, ruleName: `必填字段缺失: ${field.field_label || field.field_name}`, field: field.field_name, - message: `字段 ${field.field_name} (${field.field_label || '无标签'}) 在事件 ${eventId} 中为空`, - llmMessage: `必填字段"${field.field_label || field.field_name}"在 ${eventId} 中未填写,请检查。`, + message: `字段 ${field.field_name} (${field.field_label || '无标签'}) 在事件 ${eventLabel} 中为空`, + llmMessage: `必填字段"${field.field_label || field.field_name}"在 ${eventLabel} 中未填写,请检查。`, severity: 'warning', actualValue: null, expectedValue: '非空值', diff --git a/backend/src/modules/iit-manager/engines/HardRuleEngine.ts b/backend/src/modules/iit-manager/engines/HardRuleEngine.ts index 8202c70f..addc5217 100644 --- a/backend/src/modules/iit-manager/engines/HardRuleEngine.ts +++ b/backend/src/modules/iit-manager/engines/HardRuleEngine.ts @@ -17,6 +17,17 @@ import { PrismaClient } from '@prisma/client'; import { logger } from '../../../common/logging/index.js'; const prisma = new PrismaClient(); +let jsonLogicOpsRegistered = false; + +function registerJsonLogicCustomOps() { + if (jsonLogicOpsRegistered) return; + jsonLogic.add_operation('date', (input: any) => { + if (input === null || input === undefined || input === '') return null; + const d = new Date(String(input)); + return Number.isNaN(d.getTime()) ? null : d.getTime(); + }); + jsonLogicOpsRegistered = true; +} // ============================================================ // 类型定义 @@ -136,9 +147,14 @@ export class HardRuleEngine { private projectId: string; private rules: QCRule[] = []; private fieldMappings: Map = new Map(); + private legacyNameFallbackEnabled: boolean; constructor(projectId: string) { this.projectId = projectId; + // 默认关闭规则名兜底,避免“隐式硬编码”长期存在。 + // 如需兼容老项目,可显式设置 IIT_GUARD_LEGACY_NAME_FALLBACK=1。 + this.legacyNameFallbackEnabled = process.env.IIT_GUARD_LEGACY_NAME_FALLBACK === '1'; + registerJsonLogicCustomOps(); } /** @@ -274,6 +290,52 @@ export class HardRuleEngine { return records.map(r => this.execute(r.recordId, r.data)); } + /** + * 使用外部传入规则执行质控(单路径复用 executeRule 逻辑) + * + * 用于 SkillRunner 在完成事件/表单过滤后执行,避免重复实现规则计算逻辑。 + */ + executeWithRules( + recordId: string, + data: Record, + rules: QCRule[], + ): QCResult { + const normalizedData = this.normalizeData(data); + const results: RuleResult[] = []; + const errors: RuleResult[] = []; + const warnings: RuleResult[] = []; + + for (const rule of rules) { + const result = this.executeRule(rule, normalizedData); + results.push(result); + + if (!result.passed && !result.skipped) { + if (result.severity === 'error') errors.push(result); + else if (result.severity === 'warning') warnings.push(result); + } + } + + let overallStatus: 'PASS' | 'FAIL' | 'WARNING' = 'PASS'; + if (errors.length > 0) overallStatus = 'FAIL'; + else if (warnings.length > 0) overallStatus = 'WARNING'; + + return { + recordId, + projectId: this.projectId, + timestamp: new Date().toISOString(), + overallStatus, + summary: { + totalRules: rules.length, + passed: results.filter(r => r.passed).length, + failed: errors.length, + warnings: warnings.length, + }, + results, + errors, + warnings, + }; + } + /** * V3.2: 检查规则所需字段是否在数据中可用 * @@ -292,6 +354,69 @@ export class HardRuleEngine { * * V3.2: 字段缺失时标记为 SKIP 而非 FAIL */ + private parseDateValue(value: any): Date | null { + if (value === null || value === undefined || value === '') return null; + const d = new Date(String(value)); + return Number.isNaN(d.getTime()) ? null : d; + } + + private toNumberLike(value: any): number | null { + if (value === null || value === undefined || value === '') return null; + const n = Number(value); + return Number.isFinite(n) ? n : null; + } + + private forcePassByBusinessGuard(rule: QCRule, fieldValue: any): boolean { + const ruleName = rule.name || ''; + const guardType = String((rule.metadata as any)?.guardType || '').trim(); + const useLegacyNameFallback = this.legacyNameFallbackEnabled; + const values = Array.isArray(fieldValue) ? fieldValue : [fieldValue]; + + // 1) 同日不应被判定“早于” + if ( + guardType === 'date_not_before_or_equal' + || (useLegacyNameFallback && ruleName.includes('访视日期早于知情同意书签署日期')) + ) { + const d1 = this.parseDateValue(values[0]); + const d2 = this.parseDateValue(values[1]); + if (d1 && d2) { + return d1.getTime() >= d2.getTime(); + } + } + + // 2) 评估日期缺失时,不应判定“日期不一致” + if ( + guardType === 'skip_if_any_missing' + || (useLegacyNameFallback && ruleName.includes('SF-MPQ和CMSS评估日期与访视日期不一致')) + ) { + const hasAnyMissing = values.some(v => v === null || v === undefined || v === ''); + if (hasAnyMissing) return true; + } + + // 3) 纳入标准全满足(全 1)不应告警 + if ( + guardType === 'pass_if_all_ones' + || (useLegacyNameFallback && ruleName.includes('所有纳入标准完整性检查')) + ) { + const nums = values.map(v => this.toNumberLike(v)).filter((n): n is number => n !== null); + if (nums.length > 0 && nums.every(n => n === 1)) return true; + } + + // 4) 排除标准全未触发(全 0)不应判定入组冲突 + if ( + guardType === 'pass_if_exclusion_all_zero' + || (useLegacyNameFallback && ruleName.includes('入组状态与排除标准冲突检查')) + ) { + // 约定多字段顺序为 [enrollment_status, exclusion_1, exclusion_2, ...] + // 这里仅看排除标准字段,避免 enrollment_status=1 干扰“全未触发排除标准”判断 + const exclusionValues = values.length > 1 ? values.slice(1) : values; + const nums = exclusionValues.map(v => this.toNumberLike(v)).filter((n): n is number => n !== null); + if (nums.length > 0 && nums.every(n => n === 0)) return true; + } + + return false; + } + private executeRule(rule: QCRule, data: Record): RuleResult { try { const fieldValue = this.getFieldValue(rule.field, data); @@ -311,7 +436,8 @@ export class HardRuleEngine { }; } - const passed = jsonLogic.apply(rule.logic, data) as boolean; + const guardedPass = this.forcePassByBusinessGuard(rule, fieldValue); + const passed = guardedPass ? true : (jsonLogic.apply(rule.logic, data) as boolean); const expectedValue = this.extractExpectedValue(rule.logic); const expectedCondition = this.describeLogic(rule.logic); const llmMessage = passed @@ -361,6 +487,40 @@ export class HardRuleEngine { /** * V2.1: 从 JSON Logic 中提取期望值 */ + private formatLogicLiteral(value: any): string { + if (value === null || value === undefined) return ''; + if (typeof value === 'object') { + if ('var' in value) return ''; + // JSON Logic 日期表达式,转换为可读文案,避免直接暴露对象结构 + if ('date' in value && Array.isArray((value as any).date)) { + const fmt = (value as any).date[1]; + return fmt ? `日期格式(${fmt})` : '日期'; + } + if (Array.isArray(value)) { + const arr = value.map(v => this.formatLogicLiteral(v)).filter(Boolean); + return arr.join(', '); + } + return JSON.stringify(value); + } + return String(value); + } + + private formatDisplayValue(actualValue: any): string { + if (actualValue === undefined || actualValue === null || actualValue === '') { + return '**空**'; + } + if (Array.isArray(actualValue)) { + const values = actualValue + .map(v => (v === undefined || v === null || v === '' ? null : String(v))) + .filter((v): v is string => Boolean(v)); + return values.length > 0 ? `**${values.join(', ')}**` : '**空**'; + } + if (typeof actualValue === 'object') { + return `**${JSON.stringify(actualValue)}**`; + } + return `**${String(actualValue)}**`; + } + private extractExpectedValue(logic: Record): string { const operator = Object.keys(logic)[0]; const args = logic[operator]; @@ -372,9 +532,11 @@ export class HardRuleEngine { case '<': case '==': case '!=': - return String(args[1]); + if (!Array.isArray(args)) return ''; + return this.formatLogicLiteral(args[1]) || this.formatLogicLiteral(args[0]); case 'and': // 对于 and 逻辑,尝试提取范围 + if (!Array.isArray(args)) return ''; const values = args.map((a: any) => this.extractExpectedValue(a)).filter(Boolean); if (values.length === 2) { return `${values[0]}-${values[1]}`; @@ -394,9 +556,7 @@ export class HardRuleEngine { */ private buildLlmMessage(rule: QCRule, actualValue: any, expectedValue: string): string { const fieldName = Array.isArray(rule.field) ? rule.field.join(', ') : rule.field; - const displayValue = actualValue !== undefined && actualValue !== null && actualValue !== '' - ? `**${actualValue}**` - : '**空**'; + const displayValue = this.formatDisplayValue(actualValue); const dim = toDimensionCode(rule.category); switch (dim) { diff --git a/backend/src/modules/iit-manager/engines/QcAggregator.ts b/backend/src/modules/iit-manager/engines/QcAggregator.ts index fff3f3ee..486b86f3 100644 --- a/backend/src/modules/iit-manager/engines/QcAggregator.ts +++ b/backend/src/modules/iit-manager/engines/QcAggregator.ts @@ -173,25 +173,36 @@ async function aggregateRecordSummary( : Prisma.sql`WHERE es.project_id = ${projectId}`; const rows: number = await prisma.$executeRaw` - UPDATE iit_schema.record_summary rs - SET - events_total = agg.events_total, - events_passed = agg.events_passed, - events_failed = agg.events_failed, - events_warning = agg.events_warning, - fields_total = agg.fields_total, - fields_passed = agg.fields_passed, - fields_failed = agg.fields_failed, - d1_issues = agg.d1_issues, - d2_issues = agg.d2_issues, - d3_issues = agg.d3_issues, - d5_issues = agg.d5_issues, - d6_issues = agg.d6_issues, - d7_issues = agg.d7_issues, - top_issues = agg.top_issues, - latest_qc_status = agg.worst_status, - latest_qc_at = NOW(), - updated_at = NOW() + INSERT INTO iit_schema.record_summary ( + id, project_id, record_id, + last_updated_at, updated_at, + events_total, events_passed, events_failed, events_warning, + fields_total, fields_passed, fields_failed, + d1_issues, d2_issues, d3_issues, d5_issues, d6_issues, d7_issues, + top_issues, latest_qc_status, latest_qc_at + ) + SELECT + gen_random_uuid(), + agg.project_id, + agg.record_id, + agg.last_qc_at, + NOW(), + agg.events_total, + agg.events_passed, + agg.events_failed, + agg.events_warning, + agg.fields_total, + agg.fields_passed, + agg.fields_failed, + agg.d1_issues, + agg.d2_issues, + agg.d3_issues, + agg.d5_issues, + agg.d6_issues, + agg.d7_issues, + agg.top_issues, + agg.worst_status, + agg.last_qc_at FROM ( SELECT es.project_id, @@ -223,13 +234,32 @@ async function aggregateRecordSummary( ) ) FILTER (WHERE es.status IN ('FAIL', 'WARNING')), '[]'::jsonb - ) AS top_issues + ) AS top_issues, + COALESCE(MAX(es.last_qc_at), NOW()) AS last_qc_at FROM iit_schema.qc_event_status es ${whereClause} GROUP BY es.project_id, es.record_id ) agg - WHERE rs.project_id = agg.project_id - AND rs.record_id = agg.record_id + ON CONFLICT (project_id, record_id) + DO UPDATE SET + events_total = EXCLUDED.events_total, + events_passed = EXCLUDED.events_passed, + events_failed = EXCLUDED.events_failed, + events_warning = EXCLUDED.events_warning, + fields_total = EXCLUDED.fields_total, + fields_passed = EXCLUDED.fields_passed, + fields_failed = EXCLUDED.fields_failed, + d1_issues = EXCLUDED.d1_issues, + d2_issues = EXCLUDED.d2_issues, + d3_issues = EXCLUDED.d3_issues, + d5_issues = EXCLUDED.d5_issues, + d6_issues = EXCLUDED.d6_issues, + d7_issues = EXCLUDED.d7_issues, + top_issues = EXCLUDED.top_issues, + latest_qc_status = EXCLUDED.latest_qc_status, + latest_qc_at = EXCLUDED.latest_qc_at, + last_updated_at = EXCLUDED.latest_qc_at, + updated_at = NOW() `; return rows; diff --git a/backend/src/modules/iit-manager/engines/SkillRunner.ts b/backend/src/modules/iit-manager/engines/SkillRunner.ts index 8f43046e..69af3d9f 100644 --- a/backend/src/modules/iit-manager/engines/SkillRunner.ts +++ b/backend/src/modules/iit-manager/engines/SkillRunner.ts @@ -18,7 +18,6 @@ import { logger } from '../../../common/logging/index.js'; import { HardRuleEngine, createHardRuleEngine, QCResult, QCRule } from './HardRuleEngine.js'; import { SoftRuleEngine, createSoftRuleEngine, SoftRuleCheck, SoftRuleEngineResult } from './SoftRuleEngine.js'; import { RedcapAdapter } from '../adapters/RedcapAdapter.js'; -import jsonLogic from 'json-logic-js'; const prisma = new PrismaClient(); @@ -490,9 +489,25 @@ export class SkillRunner { const applicableRules = this.filterApplicableRules(allRules, eventName, forms); if (applicableRules.length > 0) { - const result = this.executeHardRulesDirectly(applicableRules, recordId, data); - issues.push(...result.issues); - status = result.status; + const hardResult = engine.executeWithRules(recordId, data, applicableRules); + for (const r of [...hardResult.errors, ...hardResult.warnings]) { + issues.push({ + ruleId: r.ruleId, + ruleName: r.ruleName, + field: r.field, + message: r.message, + llmMessage: r.llmMessage, + severity: r.severity === 'error' ? 'critical' : 'warning', + actualValue: r.actualValue, + expectedValue: r.expectedValue, + evidence: r.evidence ? { + ...r.evidence, + category: r.category, + subType: r.category, + } : undefined, + }); + } + status = hardResult.overallStatus; (skill as any)._rulesCount = applicableRules.length; } } @@ -577,150 +592,6 @@ export class SkillRunner { }; } - /** - * 直接执行硬规则(不通过 HardRuleEngine 初始化) - * - * V2.1 优化:添加 expectedValue, llmMessage, evidence 字段 - */ - /** - * V3.2: 检查规则所需字段是否在数据中可用 - */ - private isFieldAvailable(field: string | string[], data: Record): boolean { - const fields = Array.isArray(field) ? field : [field]; - return fields.some(f => { - const val = data[f]; - return val !== undefined && val !== null && val !== ''; - }); - } - - private executeHardRulesDirectly( - rules: QCRule[], - recordId: string, - data: Record - ): { status: 'PASS' | 'FAIL' | 'WARNING'; issues: SkillIssue[] } { - const issues: SkillIssue[] = []; - let hasFail = false; - let hasWarning = false; - - for (const rule of rules) { - try { - // V3.2: 字段缺失预检查 - 缺失时跳过而非判定失败 - if (!this.isFieldAvailable(rule.field, data)) { - logger.debug('[SkillRunner] Skipping rule - field not available', { - ruleId: rule.id, - field: rule.field, - recordId, - }); - continue; - } - - const passed = jsonLogic.apply(rule.logic, data); - - if (!passed) { - const severity = rule.severity === 'error' ? 'critical' : 'warning'; - const actualValue = this.getFieldValue(rule.field, data); - const expectedValue = this.extractExpectedValue(rule.logic); - const llmMessage = this.buildLlmMessage(rule, actualValue, expectedValue); - - issues.push({ - ruleId: rule.id, - ruleName: rule.name, - field: rule.field, - message: rule.message, - llmMessage, - severity, - actualValue, - expectedValue, - evidence: { - value: actualValue, - threshold: expectedValue, - unit: (rule.metadata as any)?.unit, - category: rule.category, - subType: rule.category, - }, - }); - - if (severity === 'critical') { - hasFail = true; - } else { - hasWarning = true; - } - } - } catch (error: any) { - logger.warn('[SkillRunner] Rule execution error', { - ruleId: rule.id, - error: error.message, - }); - } - } - - let status: 'PASS' | 'FAIL' | 'WARNING' = 'PASS'; - if (hasFail) { - status = 'FAIL'; - } else if (hasWarning) { - status = 'WARNING'; - } - - return { status, issues }; - } - - /** - * V2.1: 从 JSON Logic 中提取期望值 - */ - private extractExpectedValue(logic: Record): string { - const operator = Object.keys(logic)[0]; - const args = logic[operator]; - - switch (operator) { - case '>=': - case '<=': - case '>': - case '<': - case '==': - case '!=': - return String(args[1]); - case 'and': - // 对于 and 逻辑,尝试提取范围 - if (Array.isArray(args)) { - const values = args.map((a: any) => this.extractExpectedValue(a)).filter(Boolean); - if (values.length === 2) { - return `${values[0]}-${values[1]}`; - } - return values.join(', '); - } - return ''; - case '!!': - return '非空/必填'; - default: - return ''; - } - } - - /** - * V2.1: 构建 LLM 友好的自包含消息 - */ - private buildLlmMessage(rule: QCRule, actualValue: any, expectedValue: string): string { - const displayValue = actualValue !== undefined && actualValue !== null && actualValue !== '' - ? `**${actualValue}**` - : '**空**'; - - if (expectedValue) { - return `**${rule.name}**: 当前值 ${displayValue} (标准: ${expectedValue})`; - } - - return `**${rule.name}**: 当前值 ${displayValue}`; - } - - /** - * 获取字段值 - */ - private getFieldValue(field: string | string[], data: Record): any { - if (Array.isArray(field)) { - return field.map(f => data[f]); - } - return data[field]; - } - /** * V3.1: 过滤适用于当前事件/表单的规则 * diff --git a/backend/src/modules/iit-manager/services/ChatOrchestrator.ts b/backend/src/modules/iit-manager/services/ChatOrchestrator.ts index f3e26bf4..2455250a 100644 --- a/backend/src/modules/iit-manager/services/ChatOrchestrator.ts +++ b/backend/src/modules/iit-manager/services/ChatOrchestrator.ts @@ -51,6 +51,13 @@ Tool selection guide: - check_quality → on-demand QC re-check (only when user explicitly asks to "re-check" or "run QC now") - search_knowledge → protocol documents, inclusion/exclusion criteria, study design +Special routing: +- If user asks consent/signature count, use read_report(section="consent_stats") +- If user asks a specific patient's inclusion/exclusion compliance or visit progress, use read_report(section="patient_summary", record_id=...) +- If user asks specific patient field values, use look_up_data(record_id=...) +- If user asks protocol deviation risk / D6 risk, use read_report(section="d6_risk") and avoid citing global issue counts from other dimensions. +- If user asks risk/status for a specific dimension (D1-D7), use read_report(section="dimension_risk", dimension="Dx"), and only cite that dimension's evidence. + Rules: 1. All answers MUST be based on tool results. Never fabricate clinical data. 2. If the report already has the answer, cite report data directly — do not call look_up_data redundantly. @@ -58,6 +65,12 @@ Rules: 4. Always respond in Chinese (Simplified). 5. NEVER modify any clinical data. If asked to change data, politely decline and explain why. 6. When citing numbers, be precise (e.g. "通过率 85.7%", "3 条严重违规"). +7. Patient-level conclusions MUST cite record_id and event evidence from tool results. + +Output format (mandatory when data is available): +- First line: "结论:..." +- Then: "证据:" +- Evidence bullets should include at least one concrete source item (受试者编号 / 访视名称 / 规则名称 / 指标口径). `; export class ChatOrchestrator { @@ -121,7 +134,12 @@ export class ChatOrchestrator { }); if (!response.toolCalls?.length || response.finishReason === 'stop') { - const answer = stripToolCallXml(response.content || '') || '抱歉,我暂时无法回答这个问题。'; + const rawAnswer = stripToolCallXml(response.content || '') || '抱歉,我暂时无法回答这个问题。'; + const safeAnswer = this.sanitizeReadableAnswer(rawAnswer); + const fallbackAnswer = this.isPlaceholderAnswer(safeAnswer) + ? this.buildFallbackFromToolMessages(messages) || '结论:已完成查询,但当前未返回可展示结果。\n证据:\n- 请换一个更具体的问题(如“2号受试者筛选期有哪些失败规则?”)' + : safeAnswer; + const answer = this.enforceEvidenceFormat(userMessage, fallbackAnswer, messages); this.saveConversation(userId, userMessage, answer, startTime); return answer; } @@ -155,7 +173,12 @@ export class ChatOrchestrator { maxTokens: 1000, }); - const answer = stripToolCallXml(finalResponse.content || '') || '抱歉,处理超时,请简化问题后重试。'; + const rawAnswer = stripToolCallXml(finalResponse.content || '') || '抱歉,处理超时,请简化问题后重试。'; + const safeAnswer = this.sanitizeReadableAnswer(rawAnswer); + const fallbackAnswer = this.isPlaceholderAnswer(safeAnswer) + ? this.buildFallbackFromToolMessages(messages) || '结论:已完成查询,但当前未返回可展示结果。\n证据:\n- 请换一个更具体的问题(如“2号受试者筛选期有哪些失败规则?”)' + : safeAnswer; + const answer = this.enforceEvidenceFormat(userMessage, fallbackAnswer, messages); this.saveConversation(userId, userMessage, answer, startTime); return answer; } catch (error: any) { @@ -193,6 +216,198 @@ export class ChatOrchestrator { duration: `${Date.now() - startTime}ms`, }); } + + private enforceEvidenceFormat(userMessage: string, answer: string, messages: Message[]): string { + const patientLike = /(患者|受试者|访视|纳入|排除|知情|record|方案偏离|依从|数据一致性|数据完整性|数据准确性|时效性|安全性|D[1-7])/i.test(userMessage); + const hasEvidenceHeader = /(^|\n)证据[::]/.test(answer); + if (!patientLike && !hasEvidenceHeader) return answer; + const dimIntent = this.detectDimensionIntent(userMessage); + if (dimIntent) { + const normalized = this.enforceDimensionEvidence(answer, messages, dimIntent); + if (normalized) return normalized; + } + const hasEvidenceBullets = /(^|\n)\s*[-*]\s+/.test(answer) || /(^|\n)\s*\d+[.)、]\s+/.test(answer); + if (hasEvidenceHeader && hasEvidenceBullets) { + return answer; + } + + const evidenceLines = this.collectEvidenceLines(messages); + + if (evidenceLines.length === 0) { + if (hasEvidenceHeader) { + return `${answer}\n- 未检索到可展示明细,请继续指定受试者编号或访视点。`; + } + return answer; + } + + if (hasEvidenceHeader && !hasEvidenceBullets) { + return `${answer}\n${evidenceLines.join('\n')}`; + } + if (!/(^|\n)结论[::]/.test(answer)) { + return `结论:${answer}\n证据:\n${evidenceLines.join('\n')}`; + } + return `${answer}\n证据:\n${evidenceLines.join('\n')}`; + } + + private collectEvidenceLines(messages: Message[]): string[] { + const evidenceLines: string[] = []; + for (let i = messages.length - 1; i >= 0; i--) { + const m = messages[i] as any; + if (m.role !== 'tool' || !m.content) continue; + try { + const payload = JSON.parse(m.content); + const data = payload?.data; + if (!data) continue; + + if (data.recordId) { + evidenceLines.push(`- 受试者编号:${data.recordId}`); + } + if (data.visitProgress?.events?.length) { + const labels = data.visitProgress.events + .slice(0, 3) + .map((e: any) => e.eventLabel || e.eventId) + .filter(Boolean); + if (labels.length) evidenceLines.push(`- 访视点:${labels.join('、')}`); + } + if (Array.isArray(data?.d1EligibilityCompliance?.failedRules) && data.d1EligibilityCompliance.failedRules.length) { + const ruleNames = data.d1EligibilityCompliance.failedRules + .slice(0, 3) + .map((r: any) => r.ruleName || r.ruleId) + .filter(Boolean); + if (ruleNames.length) evidenceLines.push(`- 失败规则:${ruleNames.join(';')}`); + } + if (Array.isArray(data?.byEvent) && data.byEvent.length > 0) { + const eventDetails = data.byEvent + .slice(0, 3) + .map((e: any) => `${e.eventLabel || e.eventName || '未知访视'}(${e.nonEmptyFieldCount || 0}项非空字段)`); + evidenceLines.push(`- 已检索访视明细:${eventDetails.join(';')}`); + } + if (data?.merged && typeof data.merged === 'object') { + const keys = Object.keys(data.merged) + .filter((k) => !k.startsWith('redcap_') && !k.startsWith('_')) + .slice(0, 5); + if (keys.length) evidenceLines.push(`- 已返回字段样例:${keys.join('、')}`); + } + if (data?.ssot?.passRate) { + evidenceLines.push(`- 通过率口径:${data.ssot.passRate}`); + } + if (typeof data?.healthScore === 'number' || typeof data?.healthGrade === 'string') { + const score = typeof data.healthScore === 'number' ? `${data.healthScore}` : '—'; + const grade = typeof data.healthGrade === 'string' ? data.healthGrade : '—'; + evidenceLines.push(`- 项目健康度:${grade}级(${score}分)`); + } + if ( + typeof data?.totalRecords === 'number' || + typeof data?.criticalIssues === 'number' || + typeof data?.warningIssues === 'number' + ) { + const total = typeof data.totalRecords === 'number' ? data.totalRecords : 0; + const critical = typeof data.criticalIssues === 'number' ? data.criticalIssues : 0; + const warning = typeof data.warningIssues === 'number' ? data.warningIssues : 0; + evidenceLines.push(`- 质控总览:受试者${total}例,严重问题${critical}条,警告${warning}条`); + } + if (typeof data?.passRate === 'number') { + evidenceLines.push(`- 当前通过率:${data.passRate}%`); + } + } catch { + // ignore unparsable tool content + } + if (evidenceLines.length >= 3) break; + } + return Array.from(new Set(evidenceLines)); + } + + private sanitizeReadableAnswer(answer: string): string { + return answer + .replace(/iit_schema\.(qc_project_stats|qc_field_status|qc_event_status)/gi, '质控统计表') + .replace(/\b(record_id|event_id|rule_id)\s*=\s*/gi, '') + .replace(/\(rule_[^)]+\)/gi, '') + .replace(/\s{2,}/g, ' ') + .trim(); + } + + private isPlaceholderAnswer(answer: string): boolean { + if (!answer.trim()) return true; + return /(让我查看|我来查看|请稍等|稍等|正在查询|正在查看|查询中)[::]?\s*$/i.test(answer.trim()); + } + + private buildFallbackFromToolMessages(messages: Message[]): string | null { + for (let i = messages.length - 1; i >= 0; i--) { + const m = messages[i] as any; + if (m.role !== 'tool' || !m.content) continue; + try { + const payload = JSON.parse(m.content); + const data = payload?.data; + if (!data) continue; + if (data.recordId && data.d1EligibilityCompliance) { + const failed = Number(data.d1EligibilityCompliance.failedCount || 0); + const events = Number(data.visitProgress?.eventCount || 0); + const topRules = (data.d1EligibilityCompliance.failedRules || []) + .slice(0, 3) + .map((r: any) => r.ruleName || r.ruleId) + .filter(Boolean); + return [ + `结论:受试者 ${data.recordId} 当前存在 ${failed} 项纳排相关失败,已检索到 ${events} 个访视点质控结果。`, + '证据:', + `- 受试者编号:${data.recordId}`, + `- 纳排失败项:${failed}`, + topRules.length ? `- 主要失败规则:${topRules.join(';')}` : '- 主要失败规则:暂无', + ].join('\n'); + } + } catch { + // ignore invalid tool payload + } + } + return null; + } + + private detectDimensionIntent(userMessage: string): string | null { + const s = userMessage.toUpperCase(); + const explicit = s.match(/\bD([1-7])\b/); + if (explicit) return `D${explicit[1]}`; + if (/方案偏离|依从/.test(userMessage)) return 'D6'; + if (/数据一致性/.test(userMessage)) return 'D1'; + if (/数据完整性|缺失率/.test(userMessage)) return 'D2'; + if (/数据准确性|准确率/.test(userMessage)) return 'D3'; + if (/时效性|及时/.test(userMessage)) return 'D5'; + if (/安全性/.test(userMessage)) return 'D7'; + return null; + } + + private enforceDimensionEvidence(answer: string, messages: Message[], dimension: string): string | null { + for (let i = messages.length - 1; i >= 0; i--) { + const m = messages[i] as any; + if (m.role !== 'tool' || !m.content) continue; + try { + const payload = JSON.parse(m.content); + const data = payload?.data; + if (!data) continue; + + // 兼容 d6_risk 旧结构 + const dim = data.dimension || 'D6'; + if (dim !== dimension) continue; + + const passRate = data.passRate ?? data.d6PassRate ?? 0; + const issueCount = data.issueCount ?? data.d6IssueCount ?? 0; + const critical = data.criticalIssues ?? data.d6CriticalIssues ?? 0; + const warning = data.warningIssues ?? data.d6WarningIssues ?? 0; + const affectedSubjects = data.affectedSubjects ?? 0; + const affectedRate = data.affectedRate ?? 0; + + return [ + `结论:当前${dimension}维度风险${issueCount > 0 ? '存在' : '较低'},${dimension}通过率为${passRate}%。`, + '证据:', + `- ${dimension}通过率:${passRate}%`, + `- ${dimension}问题总数:${issueCount}(critical=${critical}, warning=${warning})`, + `- 受影响受试者:${affectedSubjects}(占比${affectedRate}%)`, + `- 证据范围:仅 ${dimension} 维度(不混用其他维度总问题数)`, + ].join('\n'); + } catch { + // ignore + } + } + return null; + } } // Per-project orchestrator cache diff --git a/backend/src/modules/iit-manager/services/DailyQcOrchestrator.ts b/backend/src/modules/iit-manager/services/DailyQcOrchestrator.ts index b1befd57..10bce98d 100644 --- a/backend/src/modules/iit-manager/services/DailyQcOrchestrator.ts +++ b/backend/src/modules/iit-manager/services/DailyQcOrchestrator.ts @@ -23,14 +23,61 @@ export interface OrchestratorResult { criticalEventsArchived: number; newIssues: number; resolvedIssues: number; + pushStatus: 'sent' | 'skipped' | 'failed'; pushSent: boolean; } class DailyQcOrchestratorClass { + private shouldSuppressIssue(issue: ReportIssue): boolean { + const ruleName = issue.ruleName || ''; + const msg = issue.message || ''; + const actual = String(issue.actualValue ?? ''); + + // 1) 暂时抑制已知噪音规则(缺少 AE 起始变量上下文时会高频误报) + if (ruleName.includes('不良事件记录与知情同意状态一致性检查')) { + return true; + } + + // 2) "所有纳入标准完整性检查" 当实际为全 1 时不应告警 + if (ruleName.includes('所有纳入标准完整性检查') && /^1(,1)+$/.test(actual.replace(/\s+/g, ''))) { + return true; + } + + // 3) 同日日期不应触发“早于”告警(兼容 "2024-03-26,2024-03-26" 文本) + if (ruleName.includes('访视日期早于知情同意书签署日期')) { + const datePair = msg.match(/(\d{4}-\d{2}-\d{2}).*?(\d{4}-\d{2}-\d{2})/); + if (datePair && datePair[1] === datePair[2]) return true; + } + + return false; + } + + private normalizeQueryText(issue: ReportIssue): string { + const severityLabel = issue.severity === 'critical' ? '严重' : '警告'; + let body = issue.message || ''; + + // 清理 [object Object] 噪音 + body = body.replace(/\(标准:\s*\[object Object\]\)/g, '').trim(); + body = body.replace(/\(\s*方案偏离:\s*\{"date":[^)]+\}\s*\)/g, '(方案偏离: 日期格式校验)').trim(); + + // 入组-排除规则文案改为业务可读 + if ((issue.ruleName || '').includes('入组状态与排除标准冲突检查')) { + body = '入组状态与排除标准存在冲突:当前为“未触发排除标准”,但规则判定为异常,请核实入组状态与排除标准映射。'; + } + + // 统一 markdown 星号,避免列表可读性差 + body = body.replace(/\*\*/g, ''); + + return `[${severityLabel}] ${body}`; + } + /** * 主方法:质控后编排全部后续动作 */ - async orchestrate(projectId: string): Promise { + async orchestrate( + projectId: string, + options?: { skipPush?: boolean }, + ): Promise { const startTime = Date.now(); logger.info('[DailyQcOrchestrator] Starting orchestration', { projectId }); @@ -67,7 +114,10 @@ class DailyQcOrchestratorClass { const { newIssues, resolvedIssues } = await this.compareWithPrevious(projectId, report); // Step 5: Push notification - const pushSent = await this.pushNotification(projectId, report, equeriesCreated, newIssues, resolvedIssues); + const skipPush = options?.skipPush || process.env.IIT_SKIP_WECHAT_PUSH === '1'; + const pushResult = skipPush + ? { pushStatus: 'skipped' as const, pushSent: false } + : await this.pushNotification(projectId, report, equeriesCreated, newIssues, resolvedIssues); const duration = Date.now() - startTime; logger.info('[DailyQcOrchestrator] Orchestration completed', { @@ -77,7 +127,8 @@ class DailyQcOrchestratorClass { criticalEventsArchived, newIssues, resolvedIssues, - pushSent, + pushStatus: pushResult.pushStatus, + pushSent: pushResult.pushSent, durationMs: duration, }); @@ -87,7 +138,8 @@ class DailyQcOrchestratorClass { criticalEventsArchived, newIssues, resolvedIssues, - pushSent, + pushStatus: pushResult.pushStatus, + pushSent: pushResult.pushSent, }; } @@ -98,29 +150,38 @@ class DailyQcOrchestratorClass { const issues = [...report.criticalIssues, ...report.warningIssues]; if (issues.length === 0) return 0; - // Deduplicate: skip if there's already an open eQuery for the same record+field + // Deduplicate: skip if there's already an open eQuery for the same record+event+rule const existingEqueries = await prisma.iitEquery.findMany({ where: { projectId, status: { in: ['pending', 'responded', 'reviewing', 'reopened'] }, }, - select: { recordId: true, fieldName: true }, + select: { recordId: true, eventId: true, category: true }, }); - const existingKeys = new Set(existingEqueries.map((e: { recordId: string; fieldName: string | null }) => `${e.recordId}:${e.fieldName || ''}`)); + const existingKeys = new Set( + existingEqueries.map( + (e: { recordId: string; eventId: string | null; category: string | null }) => + `${e.recordId}:${e.eventId || ''}:${e.category || ''}`, + ), + ); const newEqueries: CreateEqueryInput[] = []; for (const issue of issues) { - const key = `${issue.recordId}:${issue.field || ''}`; + if (this.shouldSuppressIssue(issue)) continue; + + const key = `${issue.recordId}:${issue.eventId || ''}:${issue.ruleName || ''}`; if (existingKeys.has(key)) continue; existingKeys.add(key); newEqueries.push({ projectId, recordId: issue.recordId, + eventId: issue.eventId, + formName: issue.formName, fieldName: issue.field, reportId, - queryText: `[${issue.severity === 'critical' ? '严重' : '警告'}] ${issue.message}`, - expectedAction: `请核实受试者 ${issue.recordId} 的 ${issue.field || '相关'} 数据并修正或提供说明`, + queryText: this.normalizeQueryText(issue), + expectedAction: `请核实受试者 ${issue.recordId}${issue.eventId ? `(事件 ${issue.eventId})` : ''} 的 ${issue.field || '相关'} 数据并修正或提供说明`, severity: issue.severity === 'critical' ? 'error' : 'warning', category: issue.ruleName, }); @@ -234,7 +295,7 @@ class DailyQcOrchestratorClass { equeriesCreated: number, newIssues: number, resolvedIssues: number - ): Promise { + ): Promise<{ pushStatus: 'sent' | 'failed'; pushSent: boolean }> { try { const project = await prisma.iitProject.findUnique({ where: { id: projectId }, @@ -265,13 +326,13 @@ class DailyQcOrchestratorClass { const piUserId = process.env.WECHAT_TEST_USER_ID || 'FengZhiBo'; await wechatService.sendMarkdownMessage(piUserId, markdown); - return true; + return { pushStatus: 'sent', pushSent: true }; } catch (err) { logger.warn('[DailyQcOrchestrator] Push notification failed (non-fatal)', { projectId, error: String(err), }); - return false; + return { pushStatus: 'failed', pushSent: false }; } } } diff --git a/backend/src/modules/iit-manager/services/QcReportService.ts b/backend/src/modules/iit-manager/services/QcReportService.ts index 6418558b..f2bbdab8 100644 --- a/backend/src/modules/iit-manager/services/QcReportService.ts +++ b/backend/src/modules/iit-manager/services/QcReportService.ts @@ -213,6 +213,17 @@ class QcReportServiceClass { return null; } + // 若缓存早于最新质控时间,则视为过期,触发重算 + const latestQcRows = await prisma.$queryRaw>` + SELECT MAX(last_qc_at) AS last_qc_at + FROM iit_schema.qc_field_status + WHERE project_id = ${projectId} + `; + const latestQcAt = latestQcRows?.[0]?.last_qc_at; + if (latestQcAt && cached.generatedAt < latestQcAt) { + return null; + } + const issuesData = cached.issues as any || {}; return { diff --git a/backend/src/modules/iit-manager/services/ToolsService.ts b/backend/src/modules/iit-manager/services/ToolsService.ts index 854758f8..bf0bf7eb 100644 --- a/backend/src/modules/iit-manager/services/ToolsService.ts +++ b/backend/src/modules/iit-manager/services/ToolsService.ts @@ -327,9 +327,9 @@ export class ToolsService { { name: 'section', type: 'string', - description: '要查阅的报告章节。summary=概览, critical_issues=严重问题, warning_issues=警告, form_stats=表单通过率, dimension_summary=D1-D7维度通过率, event_overview=事件概览, trend=趋势, equery_stats=eQuery统计, full=完整报告', + description: '要查阅的报告章节。summary=概览, critical_issues=严重问题, warning_issues=警告, form_stats=表单通过率, dimension_summary=D1-D7维度通过率, event_overview=事件概览, trend=趋势, equery_stats=eQuery统计, consent_stats=知情同意统计, patient_summary=单患者纳排与访视摘要, d6_risk=方案偏离专用风险证据, dimension_risk=通用维度风险证据(D1-D7), full=完整报告', required: false, - enum: ['summary', 'critical_issues', 'warning_issues', 'form_stats', 'dimension_summary', 'event_overview', 'trend', 'equery_stats', 'full'], + enum: ['summary', 'critical_issues', 'warning_issues', 'form_stats', 'dimension_summary', 'event_overview', 'trend', 'equery_stats', 'consent_stats', 'patient_summary', 'd6_risk', 'dimension_risk', 'full'], }, { name: 'record_id', @@ -337,20 +337,119 @@ export class ToolsService { description: '可选。如果用户问的是特定受试者的问题,传入 record_id 筛选该受试者的 issues', required: false, }, + { + name: 'dimension', + type: 'string', + description: '当 section=dimension_risk 时指定维度代码,支持 D1-D7(默认 D1)', + required: false, + enum: ['D1', 'D2', 'D3', 'D4', 'D5', 'D6', 'D7'], + }, ], execute: async (params, context) => { try { const report = await QcReportService.getReport(context.projectId); const section = params.section || 'summary'; const recordId = params.record_id; + const requestedDimension = String(params.dimension || 'D1').toUpperCase(); const filterByRecord = (issues: any[]) => recordId ? issues.filter((i: any) => i.recordId === recordId) : issues; + const buildDimensionRisk = async (dimension: string) => { + const dim = String(dimension || 'D1').toUpperCase(); + const [projectStats, issueRows, affectedRows, totals] = await Promise.all([ + prisma.iitQcProjectStats.findUnique({ + where: { projectId: context.projectId }, + select: { + totalRecords: true, + d1PassRate: true, + d2PassRate: true, + d3PassRate: true, + d5PassRate: true, + d6PassRate: true, + d7PassRate: true, + }, + }), + prisma.$queryRaw>` + SELECT severity, COUNT(*) AS cnt + FROM iit_schema.qc_field_status + WHERE project_id = ${context.projectId} + AND rule_category = ${dim} + AND status IN ('FAIL', 'WARNING') + GROUP BY severity + `, + prisma.$queryRaw>` + SELECT DISTINCT record_id + FROM iit_schema.qc_field_status + WHERE project_id = ${context.projectId} + AND rule_category = ${dim} + AND status IN ('FAIL', 'WARNING') + `, + prisma.$queryRaw>` + SELECT + COUNT(*) AS total, + COUNT(*) FILTER (WHERE status = 'FAIL') AS failed + FROM iit_schema.qc_field_status + WHERE project_id = ${context.projectId} + AND rule_category = ${dim} + `, + ]); + + let critical = 0; + let warning = 0; + for (const row of issueRows) { + const n = Number(row.cnt); + if ((row.severity || '').toLowerCase() === 'critical') critical += n; + else warning += n; + } + + const totalRecords = projectStats?.totalRecords ?? 0; + const affectedSubjects = affectedRows.length; + const totalChecks = Number(totals?.[0]?.total ?? 0); + const failedChecks = Number(totals?.[0]?.failed ?? 0); + const computedPassRate = totalChecks > 0 + ? Math.round(((totalChecks - failedChecks) / totalChecks) * 1000) / 10 + : 100; + + const statField = `${dim.toLowerCase()}PassRate` as + | 'd1PassRate' + | 'd2PassRate' + | 'd3PassRate' + | 'd5PassRate' + | 'd6PassRate' + | 'd7PassRate'; + + const passRateFromStats = (projectStats as any)?.[statField]; + const passRate = typeof passRateFromStats === 'number' + ? passRateFromStats + : computedPassRate; + + return { + dimension: dim, + passRate, + issueCount: critical + warning, + criticalIssues: critical, + warningIssues: warning, + affectedSubjects, + affectedRate: totalRecords > 0 ? Math.round((affectedSubjects / totalRecords) * 1000) / 10 : 0, + checkScope: { + totalChecks, + failedChecks, + }, + evidenceScope: `仅统计 ${dim} 维度问题,不含其他维度`, + }; + }; + let data: any; switch (section) { case 'summary': - data = report.summary; + data = { + ...report.summary, + ssot: { + passRate: 'passedRecords / totalRecords', + source: '项目质控汇总统计 + 字段级质控结果(统一口径)', + }, + }; break; case 'critical_issues': data = filterByRecord(report.criticalIssues); @@ -368,10 +467,216 @@ export class ToolsService { data = report.eventOverview || []; break; case 'trend': - data = report.topIssues; + { + const [projectStats, latestQcRows] = await Promise.all([ + prisma.iitQcProjectStats.findUnique({ + where: { projectId: context.projectId }, + select: { totalRecords: true, passedRecords: true, failedRecords: true, warningRecords: true }, + }), + prisma.$queryRaw>` + SELECT MAX(last_qc_at) AS last_qc_at + FROM iit_schema.qc_field_status + WHERE project_id = ${context.projectId} + `, + ]); + const total = projectStats?.totalRecords ?? 0; + const passed = projectStats?.passedRecords ?? 0; + const failed = projectStats?.failedRecords ?? 0; + const warning = projectStats?.warningRecords ?? 0; + const lastQcAt = latestQcRows?.[0]?.last_qc_at || null; + data = { + snapshot: { + date: lastQcAt ? new Date(lastQcAt).toISOString().split('T')[0] : null, + total, + passed, + failed, + warning, + passRate: total > 0 ? Math.round((passed / total) * 1000) / 10 : 0, + }, + }; + } break; case 'equery_stats': - data = { pendingQueries: report.summary.pendingQueries }; + { + const rows = await prisma.$queryRaw>` + SELECT status, COUNT(*) AS cnt + FROM iit_schema.equery + WHERE project_id = ${context.projectId} + GROUP BY status + `; + const stats = { + total: 0, + pending: 0, + responded: 0, + reviewing: 0, + closed: 0, + reopened: 0, + auto_closed: 0, + }; + for (const row of rows) { + const n = Number(row.cnt); + stats.total += n; + const key = row.status as keyof typeof stats; + if (Object.prototype.hasOwnProperty.call(stats, key)) { + stats[key] = n; + } + } + data = stats; + } + break; + case 'consent_stats': + { + const [subjectRows, consentIssueRows] = await Promise.all([ + prisma.$queryRaw>` + SELECT DISTINCT record_id + FROM iit_schema.qc_field_status + WHERE project_id = ${context.projectId} + `, + prisma.$queryRaw>` + SELECT DISTINCT record_id + FROM iit_schema.qc_field_status + WHERE project_id = ${context.projectId} + AND rule_category = 'D1' + AND status = 'FAIL' + AND ( + COALESCE(rule_name, '') LIKE '%知情%' + OR COALESCE(message, '') LIKE '%知情%' + OR COALESCE(field_name, '') LIKE '%consent%' + OR COALESCE(field_name, '') LIKE '%informed%' + ) + `, + ]); + const totalSubjects = subjectRows.length; + const consentMissingSubjects = consentIssueRows.length; + const signedSubjects = Math.max(0, totalSubjects - consentMissingSubjects); + const unsignedRecordIds = consentIssueRows.map(r => r.record_id).slice(0, 20); + data = { + totalSubjects, + signedSubjects, + unsignedOrInconsistentSubjects: consentMissingSubjects, + signedRate: totalSubjects > 0 ? Math.round((signedSubjects / totalSubjects) * 1000) / 10 : 0, + unsignedRecordIds, + evidence: '根据 D1(知情相关)FAIL 问题反推未签署/不一致受试者数', + }; + } + break; + case 'patient_summary': + if (!recordId) { + return { + success: false, + error: 'patient_summary 需要 record_id 参数', + }; + } + { + const [eventRows, d1Rows, merged, eventLabelMap, fieldMetaRows] = await Promise.all([ + prisma.$queryRaw>` + SELECT event_id, event_label, status, fields_total, fields_failed, fields_warning + FROM iit_schema.qc_event_status + WHERE project_id = ${context.projectId} AND record_id = ${recordId} + ORDER BY event_id + `, + prisma.$queryRaw>` + SELECT rule_id, rule_name, field_name, actual_value, expected_value, status, message + FROM iit_schema.qc_field_status + WHERE project_id = ${context.projectId} + AND record_id = ${recordId} + AND rule_category = 'D1' + ORDER BY rule_id NULLS LAST, rule_name NULLS LAST + `, + context.redcapAdapter?.getRecordById(recordId) || Promise.resolve(null), + this.getEventLabelMap(context), + prisma.iitFieldMetadata.findMany({ + where: { projectId: context.projectId }, + select: { fieldName: true, fieldLabel: true, choices: true }, + }), + ]); + + const fieldLabelMap = new Map(); + const fieldChoiceMap = new Map>(); + for (const row of fieldMetaRows) { + fieldLabelMap.set(row.fieldName, row.fieldLabel || row.fieldName); + fieldChoiceMap.set(row.fieldName, this.parseChoices(row.choices)); + } + + const d1Failed = d1Rows.filter(r => r.status === 'FAIL'); + const d1Summary = { + compliant: d1Failed.length === 0, + failedCount: d1Failed.length, + failedRules: d1Failed.slice(0, 10).map(r => ({ + ruleId: r.rule_id, + ruleName: r.rule_name, + message: this.buildReadableRuleMessage({ + ruleName: r.rule_name, + fieldName: r.field_name, + actualValue: r.actual_value, + expectedValue: r.expected_value, + fallbackMessage: r.message, + fieldLabelMap, + fieldChoiceMap, + }), + })), + }; + + data = { + recordId, + d1EligibilityCompliance: d1Summary, + visitProgress: { + eventCount: eventRows.length, + events: eventRows.map(e => ({ + eventId: e.event_id, + eventLabel: e.event_label || eventLabelMap.get(e.event_id) || this.fallbackEventLabel(e.event_id), + status: e.status, + fieldsTotal: e.fields_total, + fieldsFailed: e.fields_failed, + fieldsWarning: e.fields_warning, + })), + }, + evidence: { + source: '单患者事件质控结果 + 字段级规则判定', + recordId, + events: eventRows.map(e => e.event_label || eventLabelMap.get(e.event_id) || this.fallbackEventLabel(e.event_id)), + failedD1RuleCount: d1Failed.length, + }, + rawRecord: merged ? { + record_id: merged.record_id, + _event_count: merged._event_count, + _events: merged._events, + } : null, + }; + } + break; + case 'd6_risk': + { + const d6 = await buildDimensionRisk('D6'); + data = { + dimension: 'D6', + d6PassRate: d6.passRate, + d6IssueCount: d6.issueCount, + d6CriticalIssues: d6.criticalIssues, + d6WarningIssues: d6.warningIssues, + affectedSubjects: d6.affectedSubjects, + affectedRate: d6.affectedRate, + evidenceScope: d6.evidenceScope, + }; + } + break; + case 'dimension_risk': + data = await buildDimensionRisk(requestedDimension); break; case 'full': default: @@ -420,6 +725,9 @@ export class ToolsService { } try { const record = await context.redcapAdapter.getRecordById(params.record_id); + const byEventRecords = await context.redcapAdapter.getAllRecordsByEvent({ + recordId: params.record_id, + }); if (!record) { return { success: false, error: `未找到记录 ID: ${params.record_id}` }; } @@ -431,6 +739,24 @@ export class ToolsService { if (record[f] !== undefined) data[f] = record[f]; } data.record_id = params.record_id; + data._events = record._events; + data._event_count = record._event_count; + } else { + data = { + merged: record, + byEvent: byEventRecords.map(e => ({ + recordId: e.recordId, + eventName: e.eventName, + eventLabel: e.eventLabel, + nonEmptyFieldCount: Object.entries(e.data).filter(([k, v]) => + k !== 'record_id' && + !k.startsWith('redcap_') && + v !== null && + v !== undefined && + v !== '' + ).length, + })), + }; } return { @@ -656,6 +982,101 @@ export class ToolsService { return properties; } + + private parseChoices(choices: string | null | undefined): Map { + const map = new Map(); + if (!choices) return map; + const items = choices.split('|').map(item => item.trim()).filter(Boolean); + for (const item of items) { + const m = item.match(/^([^,]+),\s*(.+)$/); + if (!m) continue; + map.set(m[1].trim(), m[2].trim()); + } + return map; + } + + private toValueList(raw: string | null | undefined): string[] { + if (!raw) return []; + return raw + .split(',') + .map(v => v.trim()) + .filter(Boolean); + } + + private buildReadableRuleMessage(input: { + ruleName: string | null; + fieldName: string | null; + actualValue: string | null; + expectedValue: string | null; + fallbackMessage: string | null; + fieldLabelMap: Map; + fieldChoiceMap: Map>; + }): string { + const ruleName = input.ruleName || '规则'; + const fallback = (input.fallbackMessage || '').replace(/\*\*/g, '').trim(); + const fields = (input.fieldName || '') + .split(',') + .map(f => f.trim()) + .filter(Boolean); + const actualParts = this.toValueList(input.actualValue); + const expectedParts = this.toValueList(input.expectedValue); + + const toReadable = (value: string, field: string | undefined): string => { + if (!field) return value; + const choiceMap = input.fieldChoiceMap.get(field); + if (!choiceMap || !choiceMap.size) return value; + return choiceMap.get(value) || value; + }; + + const actualReadable = actualParts.map((v, idx) => toReadable(v, fields[idx] || fields[0])); + const expectedReadable = expectedParts.map((v, idx) => toReadable(v, fields[idx] || fields[0])); + const fieldReadable = fields.map(f => input.fieldLabelMap.get(f) || f).join('、'); + + if (actualReadable.length > 0 || expectedReadable.length > 0) { + const left = actualReadable.length > 0 ? actualReadable.join(',') : '空'; + const right = expectedReadable.length > 0 ? expectedReadable.join(',') : '未配置'; + return `${ruleName}:${fieldReadable ? `${fieldReadable},` : ''}当前值“${left}”,标准“${right}”`; + } + + return fallback || ruleName; + } + + private async getEventLabelMap(context: ToolContext): Promise> { + const map = new Map(); + const project = await prisma.iitProject.findUnique({ + where: { id: context.projectId }, + select: { cachedRules: true }, + }); + const cached = project?.cachedRules as any; + if (cached?.eventLabels && typeof cached.eventLabels === 'object') { + for (const [eid, label] of Object.entries(cached.eventLabels)) { + if (typeof label === 'string' && label.trim()) { + map.set(eid, label.trim()); + } + } + } + + if (context.redcapAdapter) { + try { + const events = await context.redcapAdapter.getEvents(); + for (const ev of events) { + if (ev.unique_event_name && ev.event_name && !map.has(ev.unique_event_name)) { + map.set(ev.unique_event_name, ev.event_name); + } + } + } catch { + // non-fatal + } + } + return map; + } + + private fallbackEventLabel(eventId: string): string { + return eventId + .replace(/_arm_\d+$/i, '') + .replace(/[_-]/g, ' ') + .replace(/\b\w/g, c => c.toUpperCase()); + } } // ============================================================ diff --git a/backend/src/modules/iit-manager/services/WechatService.ts b/backend/src/modules/iit-manager/services/WechatService.ts index 9a2ef634..d51410e5 100644 --- a/backend/src/modules/iit-manager/services/WechatService.ts +++ b/backend/src/modules/iit-manager/services/WechatService.ts @@ -284,11 +284,23 @@ export class WechatService { details: any; }): Promise { try { + // iit_schema.audit_logs 需要 project_id 外键;无项目上下文时跳过 DB 审计,保留应用日志即可 + if (!data.projectId) return; + await prisma.$executeRaw` INSERT INTO iit_schema.audit_logs - (project_id, action, details, created_at) + (project_id, user_id, action_type, entity_type, entity_id, details, trace_id, created_at) VALUES - (${data.projectId}, ${data.action}, ${JSON.stringify(data.details)}::jsonb, NOW()) + ( + ${data.projectId}, + ${'system'}, + ${data.action}, + ${'wechat'}, + ${String(data.details?.userId || 'unknown')}, + ${JSON.stringify(data.details)}::jsonb, + ${`wechat-${Date.now()}`}, + NOW() + ) `; } catch (error: any) { // 审计日志失败不应影响主流程 diff --git a/backend/test-dify-search.js b/backend/test-dify-search.js index a15f12a3..1e6a5311 100644 --- a/backend/test-dify-search.js +++ b/backend/test-dify-search.js @@ -75,3 +75,4 @@ const query = process.argv[3] || '阿尔兹海默症的症状'; testDifySearch(datasetId, query); + diff --git a/docs/03-业务模块/ASL-AI智能文献/05-测试文档/03-测试数据/pdf-extraction/.gitkeep b/docs/03-业务模块/ASL-AI智能文献/05-测试文档/03-测试数据/pdf-extraction/.gitkeep index e69de29b..8305d2fb 100644 --- a/docs/03-业务模块/ASL-AI智能文献/05-测试文档/03-测试数据/pdf-extraction/.gitkeep +++ b/docs/03-业务模块/ASL-AI智能文献/05-测试文档/03-测试数据/pdf-extraction/.gitkeep @@ -0,0 +1,23 @@ +# 请将 PDF 样本文件放在此目录 + +## 建议准备: +- sample-01-rct.pdf +- sample-02-cohort.pdf +- sample-03-with-tables.pdf +- sample-04-with-formulas.pdf +- sample-05-chinese.pdf + + + + + + + + + + + + + + + diff --git a/docs/03-业务模块/ASL-AI智能文献/05-测试文档/03-测试数据/screening/.gitkeep b/docs/03-业务模块/ASL-AI智能文献/05-测试文档/03-测试数据/screening/.gitkeep index 13fe2536..bfdf6b7a 100644 --- a/docs/03-业务模块/ASL-AI智能文献/05-测试文档/03-测试数据/screening/.gitkeep +++ b/docs/03-业务模块/ASL-AI智能文献/05-测试文档/03-测试数据/screening/.gitkeep @@ -7,3 +7,15 @@ + + + + + + + + + + + + diff --git a/docs/03-业务模块/IIT Manager Agent/00-模块当前状态与开发指南.md b/docs/03-业务模块/IIT Manager Agent/00-模块当前状态与开发指南.md index 7c6f81e8..977043b0 100644 --- a/docs/03-业务模块/IIT Manager Agent/00-模块当前状态与开发指南.md +++ b/docs/03-业务模块/IIT Manager Agent/00-模块当前状态与开发指南.md @@ -1,10 +1,11 @@ # IIT Manager Agent模块 - 当前状态与开发指南 -> **文档版本:** v3.2 +> **文档版本:** v3.3 > **创建日期:** 2026-01-01 > **维护者:** IIT Manager开发团队 -> **最后更新:** 2026-03-02 **数据一致性修复 + 项目隔离 + 管理端配置流重设计 + 中文显示名!** +> **最后更新:** 2026-03-08 **IIT 回归修复收口(事件名中文化、D1 规则名友好显示、AI 证据兜底)** > **重大里程碑:** +> - **2026-03-08:IIT 回归修复收口!** 实时工作流事件名友好化(含兜底)、D1 不合规条目显示规则名称、AI 对话新增“证据不为空”补齐逻辑 > - **2026-03-02:QC 数据一致性修复!** AI 时间线 + 警告详情 统一从 qc_field_status(SSOT)读取,与热力图数据一致 > - **2026-03-02:字段/事件中文显示名!** LEFT JOIN field_metadata + qc_event_status,消除 REDCap 技术标识符 > - **2026-03-02:警告详情可查看!** 新增 field-issues 分页 API + ReportsPage 严重问题/警告数字可点击弹出详情 Modal @@ -66,7 +67,7 @@ CRA Agent 是一个**替代 CRA 岗位的自主 AI Agent**,而非辅助 CRA - AI能力:DeepSeek/Qwen + 自研 RAG(pgvector)+ LLM Tool Use ### 当前状态 -- **开发阶段**:**V3.2 数据一致性 + 项目隔离 + 管理端重设计 + 中文显示名 → 待部署验证** +- **开发阶段**:**V3.3 回归修复收口(可读性 + 证据兜底)→ 待部署验证** - **V3.2 数据一致性 + 项目隔离已完成**(2026-03-02): - AI 时间线改为从 qc_field_status(SSOT)聚合,与风险热力图数据一致 - 新增 field-issues 分页查询 API(支持按维度/严重程度/受试者筛选) @@ -152,6 +153,18 @@ CRA Agent 是一个**替代 CRA 岗位的自主 AI Agent**,而非辅助 CRA - iitBatchController 执行 QcExecutor.executeBatch 后调用 DailyQcOrchestrator.orchestrate - 返回 equeriesCreated 计数 +#### ✅ 已完成功能(V3.3 回归修复收口 - 2026-03-08) +- ✅ **AI 实时工作流事件名友好化补强**: + - `getTimeline` 增加事件标签聚合映射(`qc_event_status` + `cachedRules.eventLabels`) + - 无标签时采用 `访视(eventId)` 兜底,避免裸露技术 ID +- ✅ **D1 筛选入选表“不合规条目”友好显示**: + - 前端由 `ruleId` 改为优先显示 `ruleName` +- ✅ **AI 对话“证据为空”结构性兜底**: + - 对话编排层改为“只要回答中出现 `证据:` 且无条目,即强制补齐” + - 新增项目级 summary 证据抽取(健康度、总受试者、严重/警告问题数、通过率) +- ⚠️ **当前风险提示**: + - 用户反馈“问题仍在”,需在线上运行态做最终复核(可能涉及服务未重启或旧进程实例) + #### ✅ 已完成功能(GCP 业务报表 + AI 时间线 + Bug 修复 - 2026-03-01) - ✅ **GCP 标准报表(阶段 A 4 张)**: - D1 筛选入选表(getEligibilityReport:record_summary 全量 + qc_field_status D1 叠加) @@ -796,11 +809,24 @@ npx ts-node src/modules/iit-manager/test-wechat-push.ts ### 9.4 开发记录文档 - [V1.1更新完成报告](./06-开发记录/V1.1更新完成报告.md) - 技术方案更新记录 +- [2026-03-08-IIT-CRA-回归修复与发布收口记录](./06-开发记录/2026-03-08-IIT-CRA-回归修复与发布收口记录.md) - 今日收口与发布前状态 --- ## 🔄 十、更新日志 +### 2026-03-08:IIT 回归修复收口(可读性 + AI 证据兜底) ⚙️ + +**完成内容**: +- ✅ AI 实时工作流详情事件名增强:数据库标签 + 规则缓存标签 + 可读兜底 +- ✅ D1 受试者逐条判定“不合规条目”改为规则名称优先显示 +- ✅ AI 对话“结论有、证据空”补齐逻辑加强(覆盖项目级问句) +- ✅ 文档同步:新增当日开发记录,更新模块状态与待部署清单 + +**状态结论**: +- 代码侧修复已完成并通过静态检查 +- 仍需部署后结合线上进程状态完成最终验收 + ### 2026-01-04:Dify知识库集成完成 - 混合检索实现 ✅ **完成内容**: diff --git a/docs/03-业务模块/IIT Manager Agent/06-开发记录/2026-03-08-IIT-CRA-回归修复与发布收口记录.md b/docs/03-业务模块/IIT Manager Agent/06-开发记录/2026-03-08-IIT-CRA-回归修复与发布收口记录.md new file mode 100644 index 00000000..64cc7315 --- /dev/null +++ b/docs/03-业务模块/IIT Manager Agent/06-开发记录/2026-03-08-IIT-CRA-回归修复与发布收口记录.md @@ -0,0 +1,90 @@ +# 2026-03-08 IIT CRA 回归修复与发布收口记录 + +> 日期:2026-03-08 +> 范围:IIT Manager Agent(IIT 质控驾驶舱 + 报告与关键事件 + AI 对话助手) +> 关联项目:`原发性痛经0302`(projectId: `1d80f270-6a02-4b58-9db3-6af176e91f3c`) + +--- + +## 1. 今日目标 + +围绕用户反馈的三类问题做回归修复并准备发布收口: + +1. AI 实时工作流详情中事件名仍出现技术 ID。 +2. D1 筛选入选表中“不合规条目”显示 `rule_xxx`,不可读。 +3. AI 对话助手出现“结论有、证据空”的回答。 + +--- + +## 2. 今日已完成变更 + +### 2.1 AI 实时工作流事件名中文化增强 + +- 文件:`backend/src/modules/admin/iit-projects/iitQcCockpitController.ts` +- 变更: + - 新增 `buildEventLabelMap()`:聚合 `qc_event_status.event_label`,并兼容 `cachedRules.eventLabels`。 + - 新增 `fallbackEventLabel()`:无标签时以 `访视(eventId)` 兜底,避免裸技术 ID。 + - 在 `getTimeline` 组装 issue 时,`eventLabel` 采用“数据库标签 -> 规则缓存标签 -> 友好兜底”的顺序。 + +### 2.2 D1 不合规条目友好显示 + +- 文件:`frontend-v2/src/modules/iit/components/reports/EligibilityTable.tsx` +- 变更: + - 前端构建 `ruleId -> ruleName` 映射。 + - “不合规条目”列改为优先显示规则名称,缺失时才回退 `ruleId`。 + +### 2.3 AI 对话证据块兜底修复 + +- 文件:`backend/src/modules/iit-manager/services/ChatOrchestrator.ts` +- 变更: + - 调整证据补齐触发条件:不再仅限“患者类问题”;只要出现 `证据:` 且无明细,就尝试自动补齐。 + - 扩展证据抽取:支持项目级 summary(`healthScore`、`healthGrade`、`totalRecords`、`criticalIssues`、`warningIssues`、`passRate`)与患者级细节共同兜底。 + +--- + +## 3. 结果与现状 + +### 已确认改善 + +- 实时工作流详情中的事件名显示链路已具备中文化能力与可读兜底。 +- D1 表格“不合规条目”已由规则 ID 显示改为规则名称优先。 +- AI 对话“证据为空”逻辑已在编排层增加强制补齐策略。 + +### 仍待现场验证 + +- 用户最新反馈“问题依然存在”,说明线上/当前运行进程可能仍受以下因素影响: + 1. 服务进程未重启,旧实例(缓存 orchestrator)未加载新逻辑; + 2. 生产/测试环境并非本地当前分支镜像; + 3. 某些对话路径绕过了已补齐分支(需加会话级 trace 验证)。 + +--- + +## 4. 根因判断(针对“证据为空”) + +本次定位到的核心根因是: + +- 旧逻辑把证据补齐限制在“患者类意图”,导致“最新质控报告怎么样”这类项目级问句可能跳过补齐分支; +- 当 LLM 输出了 `结论 + 证据:` 但未附条目时,前端看到的就是空证据块。 + +本次已在编排层做“证据头存在即补齐”的保护,属于结构性修复方向。 + +--- + +## 5. 待办与明日计划 + +1. 以线上真实环境复现同一问句:`最新质控报告怎么样?`,抓取完整请求链路日志。 +2. 在 `ChatOrchestrator` 增加一次性 debug 日志(tool payload 摘要 + 证据补齐命中标记),用于确认分支命中率。 +3. 对“证据模板”加最低保障:当工具返回成功且 answer 含 `证据:` 时,至少输出 1 条结构化证据(不允许空块)。 +4. 完成本轮发布后,补一份“AI 问答回归用例清单(项目级/患者级/维度级)”纳入日常回归。 + +--- + +## 6. 关联文档 + +- 技术评审与回归看板: + `docs/03-业务模块/IIT Manager Agent/09-技术评审报告/2026-03-08-IIT-CRA-最小复现项目对账结果-Phase1-原发性痛经0302.md` +- 模块总览与开发指南: + `docs/03-业务模块/IIT Manager Agent/00-模块当前状态与开发指南.md` +- 待部署变更清单: + `docs/05-部署文档/03-待部署变更清单.md` + diff --git a/docs/03-业务模块/IIT Manager Agent/09-技术评审报告/2026-03-08-IIT-CRA-指标口径与SSOT对照表-Phase0.md b/docs/03-业务模块/IIT Manager Agent/09-技术评审报告/2026-03-08-IIT-CRA-指标口径与SSOT对照表-Phase0.md new file mode 100644 index 00000000..42e8ec9f --- /dev/null +++ b/docs/03-业务模块/IIT Manager Agent/09-技术评审报告/2026-03-08-IIT-CRA-指标口径与SSOT对照表-Phase0.md @@ -0,0 +1,141 @@ +# IIT / CRA Agent 指标口径与 SSOT 对照表(Phase 0) + +> 文档版本:v1.0 +> 创建日期:2026-03-08 +> 适用范围:IIT 业务端大盘 / 报告与关键事件 / AI 实时工作流水 / AI 对话 +> 目标:先统一“同名指标”的定义和数据源,再进入修复,避免反复打补丁 + +--- + +## 1. 背景与问题定义 + +当前线上/测试反馈的核心不是单点报错,而是同一指标在多个页面口径不一致,例如: + +- 大盘通过率与趋势通过率不一致 +- 报告页健康分与大盘健康分不一致 +- 时间线问题数与待处理 eQuery 不一致 +- 报告中 D1/D2/D3D4/D6 与下方维度评分对不上 + +这些问题在工程上属于**口径漂移(metric drift)**,必须先冻结 SSOT(Single Source of Truth),再排查数据同步、规则执行、前端展示。 + +--- + +## 2. 指标分层模型(必须统一) + +IIT 指标按 4 层定义,禁止跨层混算: + +1. **事实层(Raw Facts)**:REDCap 原始记录与事件数据 +2. **执行层(QC Results)**:`qc_field_status` / `qc_event_status` 的规则执行结果 +3. **聚合层(Project Stats)**:`iit_qc_project_stats`、`iit_record_summary` 的聚合快照 +4. **呈现层(UI/API)**:Dashboard/Reports/AiStream/AiChat + +约束: + +- 呈现层不允许重新发明计算公式,只消费聚合层或执行层 +- 同一名称指标只能有一个“主口径” +- 不同用途的指标必须显式命名(例如“按受试者通过率”与“按事件通过率”) + +--- + +## 3. 核心指标 SSOT 对照表(冻结版) + +## 3.1 项目健康度与通过率 + +| 指标名 | 业务定义 | SSOT 来源 | 当前代码入口 | 备注 | +|---|---|---|---|---| +| healthScore | 健康度总分(0-100) | `iit_qc_project_stats.health_score` | `iitQcCockpitService.getStats()` | 不允许前端 fallback 推导 | +| healthGrade | 健康度等级 | `iit_qc_project_stats.health_grade` | `iitQcCockpitService.getStats()` | 同上 | +| passRate (大盘) | 按受试者通过率 | `passed_records / total_records` | `iitQcCockpitService.getStats()` | 保留 1 位小数 | +| passRate (趋势) | 按日志条目通过率(旧) | `iit_qc_logs` 分组计算 | `iitQcCockpitController.getTrend()` | 与大盘不是同一口径,必须重命名或替换 | + +结论: + +- 当前“通过率”至少有两种口径,UI 未标注,必然引发“100% vs 33%”类问题。 + +## 3.2 D1/D2/D3D4/D6 报表 + +| 报表 | 业务定义 | SSOT 来源 | 当前查询入口 | +|---|---|---|---| +| D1 筛选入选 | 入排规则是否通过 | `qc_field_status`(D1) + `record_summary`(受试者全集) | `iitQcCockpitService.getEligibilityReport()` | +| D2 完整性 | 缺失字段率 | `qc_field_status`(D2) | `iitQcCockpitService.getCompletenessReport()` | +| D3/D4 质疑跟踪 | eQuery 生命周期 | `iit_equeries` | `iitQcCockpitService.getEqueryLogReport()` | +| D6 方案偏离 | 访视超窗等偏离 | `qc_field_status`(D6) | `iitQcCockpitService.getDeviationReport()` | + +结论: + +- D 类报表与大盘维度评分来自不同聚合路径时,必须明确“时点一致性”(同一批次同一时刻)。 + +## 3.3 AI 实时工作流水 + +| 指标 | 业务定义 | SSOT 来源 | 当前入口 | 风险 | +|---|---|---|---|---| +| timeline total | 时间线受试者总数 | `qc_field_status` 聚合 + pass 补充 | `iitQcCockpitController.getTimeline()` | 与 eQuery 总数不是同一概念 | +| red/yellow 问题数 | 每受试者 FAIL/WARNING 汇总 | `qc_field_status` | `getTimeline()` | 应与 field-issues 可对账 | +| 事件中文名 | event display label | `qc_event_status.event_label` | `getTimeline()` LEFT JOIN | 空值时会回退技术名 | + +## 3.4 AI 对话 + +| 语义工具 | 主要数据源 | 适用问题 | 当前实现 | +|---|---|---|---| +| `read_report` | `QcReportService` 缓存报告 | 通过率、问题统计、趋势摘要 | `ToolsService` | +| `look_up_data` | REDCap 原始数据 | 单患者字段值、原始记录核查 | `ToolsService` | +| `check_quality` | `QcExecutor` 实时执行 | 用户明确要求“重跑质控” | `ToolsService` | +| `search_knowledge` | 项目知识库(RAG) | 方案文本、入排标准文本 | `ToolsService` | + +结论: + +- 对话错误不等于“模型幻觉”,优先排查是否选错工具或工具查询不完整。 + +--- + +## 4. 现存口径漂移点(已识别) + +1. **趋势口径漂移** + - 趋势接口仍从 `iit_qc_logs` 计算通过率;大盘通过率来自 `iit_qc_project_stats`。 + - 导致“卡片 100%,趋势 33%”。 + +2. **健康分 fallback 风险** + - 大盘前端在 `healthScore` 缺失时回退为 `Math.round(passRate)`。 + - 数据未准备好时会把通过率误当健康分,造成“待处理质疑很多但仍 100 分”。 + +3. **报告缓存时点风险** + - `read_report` 优先读缓存报告(默认有效期 24h),若未及时刷新会滞后于大盘/流水。 + +4. **“总数”语义混淆** + - 时间线问题数、eQuery 待处理数、D3D4 报表数本质是不同对象,UI 文案未区分。 + +5. **展示字段名兼容风险** + - 若 `eventLabel/fieldLabel` 空,前端回退技术字段名;用户会误判为“事件名错误”。 + +--- + +## 5. 冻结规则(修复期强制执行) + +1. 页面上所有“通过率”必须标注口径: + - 按受试者(record) + - 按事件(record-event) + - 按规则检查条目(field-level checks) + +2. 健康度评分只允许来自 `healthScoreEngine` 落库结果,不允许前端推算。 + +3. 报告页、大盘、AI 对话必须显示“统计快照时间”,便于用户识别时点差异。 + +4. UI 文案新增说明: + - “待处理质疑”来自 `iit_equeries` + - “时间线问题总数”来自 `qc_field_status` + +5. 涉及 D1/D2/D3D4/D6 的变更,必须附带“口径回归测试”记录。 + +--- + +## 6. Phase 1 进入条件 + +满足以下条件后,才进入根因排查与代码修复: + +- [ ] 本文“SSOT 对照表”已被团队确认(产品/研发/质控) +- [ ] 每个页面核心指标已标注口径 +- [ ] 已选定“最小复现项目”与冻结时间窗口 + +Phase 1 执行手册见: +`docs/03-业务模块/IIT Manager Agent/09-技术评审报告/2026-03-08-IIT-CRA-最小复现项目对账执行手册-Phase1.md` + diff --git a/docs/03-业务模块/IIT Manager Agent/09-技术评审报告/2026-03-08-IIT-CRA-最小复现项目对账执行手册-Phase1.md b/docs/03-业务模块/IIT Manager Agent/09-技术评审报告/2026-03-08-IIT-CRA-最小复现项目对账执行手册-Phase1.md new file mode 100644 index 00000000..898bea27 --- /dev/null +++ b/docs/03-业务模块/IIT Manager Agent/09-技术评审报告/2026-03-08-IIT-CRA-最小复现项目对账执行手册-Phase1.md @@ -0,0 +1,225 @@ +# IIT / CRA Agent 最小复现项目对账执行手册(Phase 1) + +> 文档版本:v1.0 +> 创建日期:2026-03-08 +> 目标:用最小复现项目定位根因,不做盲修 +> 适用问题:报告与事件不一致、AI 实时流水不一致、AI 对话结论错误 + +--- + +## 1. 执行原则 + +1. **先对账,后修复**:每个异常必须先确认“错在数据、规则、聚合、还是展示”。 +2. **单项目封闭验证**:只使用“纳入排除标准测试”项目,不混其他项目。 +3. **同一时间窗口**:所有 API / SQL 在同一时段采样,避免时间漂移。 +4. **一条问题一条证据链**:必须保留“输入 -> 处理中间态 -> 输出”。 + +--- + +## 2. 最小复现项目准备 + +项目:`纳入排除标准测试` +固定对象: + +- 患者:`2 / 3 / 4`(至少包含不完整录入与违规样本) +- 事件:筛选期 + 第一次月经周期结束时(若项目定义如此) +- 规则:D1/D2/D3/D4/D6 至少各有 1 条命中场景 + +冻结窗口: + +- 执行前停止自动批任务(避免数据持续变化) +- 手动执行一次“一键全量质控”,记录触发时间 T0 +- 所有采样以 T0 后 1-3 分钟为准 + +--- + +## 3. 四层对账流程(按顺序) + +## 3.1 事实层(REDCap 是否联通) + +目标:确认“源头有数据”。 + +检查项: + +- REDCap 中是否存在目标患者/事件数据 +- `record_summary` 是否包含对应 `record_id` +- `SyncManager` 最近同步时间是否晚于 T0 + +判定: + +- REDCap 有、平台无 -> 联通/同步问题 +- REDCap 无 -> 上游录入问题,不是质控引擎问题 + +## 3.2 执行层(规则是否正确执行) + +目标:确认“规则判断是否符合临床预期”。 + +检查项: + +- `qc_field_status` 是否有该患者对应 D1/D2/D3/D6 记录 +- `status/severity/message/actual_value/expected_value` 是否合理 +- `qc_event_status` 是否与字段级状态一致 + +判定: + +- 执行结果本身错 -> 规则定义/引擎问题 +- 执行结果正确、展示错 -> 聚合/前端问题 + +## 3.3 聚合层(报表和大盘是否同口径) + +目标:确认“同名指标是否来自同一口径与同一快照”。 + +检查项: + +- 大盘:`getQcCockpitData` +- 报告:`getQcReport` / `refreshQcReport` +- 趋势:`getTrend` +- D1/D2/D3D4/D6:各报表 API + +重点看: + +- 通过率口径(按受试者 vs 按日志) +- 健康分是否来自 `healthScore` 真实值 +- 报告缓存是否过期/未刷新 + +## 3.4 对话层(AI 工具链路是否选对) + +目标:确认“AI 回答错误是查询错还是推理错”。 + +检查项: + +- 问题触发了哪个工具(`read_report` / `look_up_data` / `check_quality` / `search_knowledge`) +- 工具返回数据是否完整(如实验室检查字段是否缺失) +- 最终回答是否与工具结果一致 + +判定: + +- 工具返回错 -> 数据查询/映射/项目隔离问题 +- 工具返回对、回答错 -> Prompt/回答策略问题 + +--- + +## 4. 针对当前三大类问题的定位矩阵 + +## 4.1 第一大类:报告与关键事件 + +| 现象 | 优先怀疑 | 第一检查点 | +|---|---|---| +| D1/D2/D3D4/D6 与维度评分不一致 | 聚合口径漂移 | `getStats()` vs 各报表 SQL | +| 质控 0 个受试者 | 执行未落库或 projectId 错 | `qc_field_status` 是否有该项目数据 | +| 待处理 252 但健康分 100 | 健康分 fallback / 评分权重缺陷 | 前端 `healthScore` fallback、HealthScoreEngine 维度权重 | +| 上方通过率 100,下方趋势 33 | 趋势口径不同 | `getTrend()` 当前读 `iit_qc_logs` | +| 质控完成无热力图 | `qc_event_status` 空或事件列构建失败 | `getHeatmapData()` 查询结果 | +| 执行摘要无信息 | 报告缓存旧 / 生成失败 | `iit_qc_reports` 最新记录 + refresh | +| 报告分 64 vs 大盘 100 | 报告快照与实时不一致 | `report.generatedAt` vs cockpit now | +| D1 无数据 | D1 规则缺失或 rule_category 错 | `qc_field_status where D1` | +| D2 事件数=1 且明细异常 | D2 统计规则/activeEvents定义不清 | `getCompletenessReport()` 的 byRecordEvent | +| 已回复仍显示 0 | 状态机未推进或统计口径错 | `iit_equeries.status` 分布 | +| 无“重开质疑”操作 | 前端缺动作入口(后端有状态) | EQueryPage 操作列 | + +## 4.2 第二大类:AI 实时工作流水 + +| 现象 | 优先怀疑 | 第一检查点 | +|---|---|---| +| 流水问题总数 444 vs 待处理 252 | 指标对象不同 | 时间线来自 `qc_field_status`,待处理来自 `iit_equeries` | +| 事件编码生成逻辑不明 | 事件标签映射缺失 | `eventLabel` 来源:`qc_event_status` / fallback | +| 日期筛选按钮无效 | API 过滤未生效或前端未传 | `getTimeline(date=YYYY-MM-DD)` 返回是否变化 | + +## 4.3 第三大类:AI 对话助手 + +| 现象 | 优先怀疑 | 第一检查点 | +|---|---|---| +| 已签署知情显示 0 | 工具选路错误或字段未映射 | `look_up_data` 查询字段覆盖 | +| 3号患者严重问题被说成无问题 | read_report 缓存滞后或筛选逻辑错 | `QcReportService` 缓存时间与 issue 列表 | +| 总体通过率异常(分项非0,总体0) | 聚合口径错误 | 报告 summary.passRate 公式 | +| 查询患者2信息不全 | 工具默认返回字段不完整 | `look_up_data` 默认 data 结构 | +| 4号患者访视名错误/状态描述偏差 | eventLabel 回退技术ID + 业务叙述模板粗糙 | `eventLabel` 链路与回答模板 | + +--- + +## 5. 执行清单(逐项打勾) + +## 5.1 一次完整排查(建议 2-3 小时) + +- [ ] 执行 `batch-qc`,记录 T0、返回 `totalRecords/totalEventCombinations/passRate` +- [ ] 拉取驾驶舱:`qc-cockpit` +- [ ] 拉取报告:`qc-cockpit/report`(先读缓存,再 refresh) +- [ ] 拉取趋势:`qc-cockpit/trend` +- [ ] 拉取时间线:`qc-cockpit/timeline` +- [ ] 拉取 D1/D2/D3D4/D6 报表 +- [ ] 拉取 `field-issues`(critical + warning) +- [ ] 拉取 eQuery stats 与 list +- [ ] 对 5 条 AI 问答样例做工具链路记录 + +## 5.2 SQL 对账模板(只读) + +> 以下为只读核对 SQL,请在测试库或只读会话执行。 + +```sql +-- 1) 项目级统计快照 +SELECT project_id, total_records, passed_records, failed_records, warning_records, + health_score, health_grade, d1_pass_rate, d2_pass_rate, d3_pass_rate, d5_pass_rate, d6_pass_rate, d7_pass_rate +FROM iit_schema.qc_project_stats +WHERE project_id = :project_id; +``` + +```sql +-- 2) 字段级问题总量(SSOT) +SELECT status, severity, rule_category, COUNT(*) AS cnt +FROM iit_schema.qc_field_status +WHERE project_id = :project_id +GROUP BY status, severity, rule_category +ORDER BY rule_category, status, severity; +``` + +```sql +-- 3) 事件级状态 +SELECT record_id, event_id, event_label, status, fields_total, fields_passed, fields_failed, fields_warning +FROM iit_schema.qc_event_status +WHERE project_id = :project_id +ORDER BY record_id, event_id; +``` + +```sql +-- 4) eQuery 状态分布 +SELECT status, COUNT(*) AS cnt +FROM iit_schema.iit_equeries +WHERE project_id = :project_id +GROUP BY status +ORDER BY status; +``` + +--- + +## 6. 修复优先级建议(按风险) + +P0(先修): + +1. 通过率口径统一(大盘/趋势/报告明确区分) +2. 健康分来源统一(禁前端 fallback 推算) +3. 报告缓存刷新策略(批量质控后强制刷新并透出快照时间) +4. 时间线与 eQuery 统计文案区分(避免同名误读) + +P1(随后): + +1. EQuery “重开”前端操作入口(后端状态机已支持) +2. D2“活跃事件/缺失字段”定义可视化说明 +3. AI 对话输出模板升级(访视表格化 + 证据引用) + +P2(优化): + +1. 工具调用 trace 可视化(问题 -> 工具 -> 结果 -> 回答) +2. 指标字典落地到接口 schema,前后端共享类型 + +--- + +## 7. 本阶段交付物要求 + +完成 Phase 1 后,必须输出: + +1. `问题-根因对照表`(你列出的每条问题都要有结论) +2. `证据包`(API 返回 + SQL 结果 + 截图) +3. `修复方案分批计划`(P0/P1/P2 + 影响面 + 回归用例) + +没有这三项,不进入大规模代码修改。 + diff --git a/docs/03-业务模块/IIT Manager Agent/09-技术评审报告/2026-03-08-IIT-CRA-最小复现项目对账结果-Phase1-原发性痛经0302.md b/docs/03-业务模块/IIT Manager Agent/09-技术评审报告/2026-03-08-IIT-CRA-最小复现项目对账结果-Phase1-原发性痛经0302.md new file mode 100644 index 00000000..12d57a04 --- /dev/null +++ b/docs/03-业务模块/IIT Manager Agent/09-技术评审报告/2026-03-08-IIT-CRA-最小复现项目对账结果-Phase1-原发性痛经0302.md @@ -0,0 +1,486 @@ +# IIT / CRA Agent 最小复现项目对账结果(Phase 1) + +> 执行日期:2026-03-08 +> 环境:本地开发环境(backend + postgres docker + local REDCap) +> 目标:验证“报告/大盘/流水/对话”异常是否来自 REDCap 联通、规则执行、聚合链路或展示口径。 + +--- + +## 1. 本次对账对象 + +- IIT 项目名称:`原发性痛经0302` +- IIT 项目 ID:`1d80f270-6a02-4b58-9db3-6af176e91f3c` +- 项目 REDCap PID:`18` +- 项目 REDCap URL:`http://localhost:8080` +- 数据库:`ai_clinical_research`(`ai-clinical-postgres`) + +项目映射校验结果: + +- `iit_schema.projects` 中存在且唯一: + - `id=1d80f270-6a02-4b58-9db3-6af176e91f3c` + - `name=原发性痛经0302` + - `redcap_project_id=18` + - `status=active` + +--- + +## 2. 第一轮 SQL 证据(核心) + +### 2.1 聚合结果与原始质控事实明显不一致 + +- `iit_schema.qc_project_stats`(该项目): + - `total_records=0` + - `passed_records=0` + - `failed_records=0` + - `warning_records=0` + - `health_score=82.3` + - `d1_pass_rate=41.2`, `d2=100`, `d3=100`, `d5=100`, `d6=69.6`, `d7=100` +- `iit_schema.record_summary`(该项目): + - `COUNT(DISTINCT record_id)=0` +- `iit_schema.qc_field_status`(该项目): + - `COUNT(*)=713` + - `COUNT(DISTINCT record_id)=12` + - 存在 FAIL/WARNING/PASS 混合状态,且 D1/D2/D3/D5/D6 均有数据 +- `iit_schema.qc_event_status`(该项目): + - `COUNT(*)=25` +- `iit_schema.equery`(该项目): + - `pending=262` + +判定:`qc_field_status/qc_event_status/equery` 已有大量有效数据,但 `record_summary` 为空,导致项目级统计口径断裂。 + +### 2.2 历史项目残留与项目隔离异常迹象 + +- `record_summary` 总表仅有 14 行,且全部属于旧项目 ID:`test0102-pd-study` +- 当前项目(UUID)在 `record_summary` 无行 + +判定:当前项目未建立或未插入 `record_summary` 基础行,后续“仅 UPDATE 的聚合语句”无法生效。 + +--- + +## 3. 第一轮 API 证据(核心) + +使用管理员账号登录后,调用 `/api/v1/admin/iit-projects/:projectId/...`。 + +### 3.1 Dashboard / Report / Trend 三口径冲突 + +- `qc-cockpit` 返回: + - `qualityScore=82` + - `totalRecords=0` + - `passRate=100` + - `criticalCount=137` + - `queryCount=262` +- `qc-cockpit/report` 返回: + - `totalRecords=0` + - `criticalIssues=156` + - `warningIssues=284` + - `passRate=0` +- `qc-cockpit/trend` 返回: + - 最新点:`total=148`, `passed=48`, `passRate=32` + +判定:同一项目同一时间,`passRate` 至少出现 `100 / 0 / 32` 三个版本,属于 P0 级口径漂移。 + +### 3.2 时间线日期筛选无效(复现) + +调用 `qc-cockpit/timeline`: + +- 不带日期:`total=12` +- `startDate=2026-03-01&endDate=2026-03-02`:`total=12` +- `startDate=2026-03-08&endDate=2026-03-08`:`total=12` + +判定:前端传 `startDate/endDate` 未在后端生效,日期筛选失效可稳定复现。 + +--- + +## 4. 对话层冒烟(第一轮) + +调用 `/api/v1/iit/chat` 的典型问答可得到答复,但存在“解释与口径不稳定”的风险: + +- “签署知情人数”问题:答复给出“表单通过数 10/12”,但承认无法直接给出人数。 +- “最新质控报告”问题:引用了健康分、严重问题、警告问题、待处理 eQuery,整体和 `qc_report` 可对齐。 +- “患者访视次数”问题:返回“第2次访视”,但需和 REDCap 事件表进一步逐条对账(Phase 2 再做字段级真值核验)。 + +判定:对话层主要风险当前不是“工具不可用”,而是上游口径漂移会向下传导。 + +--- + +## 5. 根因初判(带代码入口) + +### 根因 A(P0):`record_summary` 聚合是“仅 UPDATE”,无 UPSERT + +- 代码入口:`backend/src/modules/iit-manager/engines/QcAggregator.ts` +- `aggregateRecordSummary()` 当前逻辑: + - 只执行 `UPDATE iit_schema.record_summary rs ... FROM agg` + - 依赖 `rs` 预先存在 +- 当项目没有预写 `record_summary` 行时: + - 聚合更新行数为 0 + - `HealthScoreEngine.queryRecordStats()` 基于 `record_summary` 得到 `totalRecords=0` + - Dashboard/Report 中基于该数据的统计出现“0记录 + 非0问题”的冲突 + +### 根因 B(P0):时间线接口参数约定不一致 + +- 代码入口:`backend/src/modules/admin/iit-projects/iitQcCockpitController.ts` +- `getTimeline` 仅读取 `query.date`,未处理 `startDate/endDate` +- 前端使用区间筛选时,后端实际不生效 + +### 根因 C(P1):同名指标多来源并行,无统一冻结口径 + +- `passRate` 在 cockpit/report/trend 来源不一致 +- 导致用户看到“同一页不同值”的信任问题 + +--- + +## 6. 与三大类问题的对应关系(第一轮) + +- 第一大类(报告/关键事件): + - 已确认强相关于根因 A + 根因 C +- 第二大类(AI 实时工作流水): + - 已确认日期筛选问题由根因 B 直接导致 + - 总问题数差异与根因 C 强相关 +- 第三大类(AI 对话助手): + - 目前更像“上游口径漂移传导”而非对话工具不可用 + - 仍需在 Phase 2 做患者级真值核验 + +--- + +## 7. 下一步(建议立即执行) + +1. P0 修复 `QcAggregator.aggregateRecordSummary`:改为 UPSERT(或先补齐 record_summary 基础行再 UPDATE)。 +2. P0 修复 `getTimeline`:支持 `startDate/endDate`,并与 `date` 兼容。 +3. P0 统一 `passRate` 口径(按 Phase0 SSOT),至少先让 cockpit/report/trend 展示同一主口径。 +4. 修复后回归本项目 3 个关键断言: + - `record_summary` 记录数应为 `12` + - Dashboard/Report/Trend 的主通过率在同一时间窗内一致 + - 时间线区间筛选对 `2026-03-08` 返回 `0`(当前数据下) + +--- + +## 8. 第二轮回归看板(18 问题闭环状态) + +> 执行日期:2026-03-08(第二轮) +> 结论口径: +> - `已闭环`:问题已修复并复测通过 +> - `部分闭环`:核心问题缓解,但仍有体验/口径尾项 +> - `未闭环`:仍存在明确缺陷或未完成验证 + +### 8.1 第一大类:报告与关键事件(11 项) + +| # | 问题 | 当前状态 | 证据 / 说明 | +|---|---|---|---| +| 1 | D1/D2/D3D4/D6 与维度评分不一致 | **部分闭环** | 主通过率口径已统一;但 D2 的 `eventsChecked=1` 仍需继续核验业务定义。 | +| 2 | 质控 0 个受试者 | **已闭环** | `record_summary` 已恢复 `12` 条,`qc_project_stats.total_records=12`。 | +| 3 | 健康分与问题规模冲突(如健康分高但问题多) | **部分闭环** | 评分与问题计数可同时存在(不同公式);需补“评分解释文案”避免误读。 | +| 4 | 上方通过率 100 / 下方趋势 33 | **已闭环** | 当前 cockpit/report/trend 均为 `passRate=0`(同一快照)。 | +| 5 | 质控完成无热力图 | **已闭环** | cockpit 返回 heatmap `rows/columns` 非空。 | +| 6 | 执行摘要无信息 | **已闭环** | report summary 可稳定返回 `totalRecords/criticalIssues/warningIssues/pendingQueries`。 | +| 7 | 报告分数 vs 大盘分数冲突 | **部分闭环** | 主指标已一致;健康分展示仍建议增加“更新时间+公式说明”。 | +| 8 | D1 无数据 | **已闭环** | D1 报表已恢复:`eligible=0, ineligible=11, incomplete=1`。 | +| 9 | D2 事件数=1、明细异常 | **部分闭环** | 已修复 `eventsChecked=5`(按活跃事件);同时新增 `d2EventsChecked=1` 标识 D2 覆盖事件数,避免误读。 | +| 10 | 已回复仍显示 0 | **已闭环** | 已执行 `pending -> responded -> closed(ai_review)` 实流回归,`equeries/stats` 与 D3D4 报表最终一致。 | +| 11 | 无“重开质疑”操作 | **未闭环** | 前端仍缺 reopen 操作入口(后端状态机支持)。 | + +### 8.2 第二大类:AI 实时工作流水(3 项) + +| # | 问题 | 当前状态 | 证据 / 说明 | +|---|---|---|---| +| 12 | 流水问题总数 vs 待处理总数不一致 | **部分闭环** | 已在口径上解释为“字段问题数 vs eQuery 数”;需在 UI 文案继续强化区分。 | +| 13 | 事件编码生成逻辑不明 | **部分闭环** | 已补齐后端 `event_id -> event_label` 统一映射(报表/对话可显示“筛选期”等);仍保留 event_id 作为证据辅助。 | +| 14 | 日期筛选按钮无效 | **已闭环** | timeline 支持 `startDate/endDate`,`2026-03-01~03-02` 返回 `0`。 | + +### 8.3 第三大类:AI 对话助手(5 项) + +| # | 问题 | 当前状态 | 证据 / 说明 | +|---|---|---|---| +| 15 | 已签署知情显示 0 | **已闭环** | 回归问答返回 `11/12`(签署率 91.7%)。 | +| 16 | 3号患者被误判为无问题 | **已闭环** | 回归问答已返回“不符合”并列出 rule 证据。 | +| 17 | 总体通过率答复异常 | **已闭环** | 回归问答返回 `0%`,并给出公式 `passedRecords/totalRecords`。 | +| 18 | 患者2信息不全 / 患者4访视描述偏差 | **已闭环** | 患者2信息完整度提升;患者4访视描述已优先输出业务事件名(保留 event_id 仅作证据)。 | + +--- + +## 9. 严重未闭环问题(当前 P0/P1) + +### P0(必须优先清零) + +1. ~~**D2 统计口径残留问题**:`eventsChecked=1` 与多事件现实不一致。~~(已完成:`eventsChecked` 修复 + `d2EventsChecked` 解释字段) +2. ~~**“已回复仍为0”缺少场景化回归**:需要构造 responded/reviewing/closed 数据流转验证。~~(已完成:状态流转回归通过) + +### P1(应在下一轮完成) + +1. ~~**事件标签可读性**:technical event_id 需稳定映射到 eventLabel(报表 + 对话统一)。~~(已完成第一阶段:后端统一映射,前端显示可读事件名) +2. **EQuery 重开操作入口**:前端补 `reopen` 按钮与状态回流。 +3. **评分解释文案**:健康分与问题数量并存时给出公式与更新时间提示。 + +--- + +## 10. 下一步执行计划(建议) + +1. **P0-A:D2 口径修复** + - 明确 activeEvents 定义(按患者真实到访事件) + - 修正 `getCompletenessReport()` 的 `eventsChecked` 计算 + - 回归断言:`eventsChecked` 与 `qc_event_status` 的 D2 事件集合一致 + +2. **P0-B:eQuery 状态流转回归** + - 构造一条 `pending -> responded -> reviewing/closed` 流程 + - 验证:eQuery 列表、stats、D3D4 报表、对话回答四处一致 + +3. **P1:事件标签统一** + - 补全 `event_id -> event_label` 映射策略(优先 metadata,其次兜底格式化) + - 前端与 AI 对话统一使用 `eventLabel`,避免技术 ID 直出 + +--- + +## 11. 本轮执行证据(新增) + +### 11.1 D2 口径修复结果 + +- 接口:`GET /api/v1/admin/iit-projects/:projectId/qc-cockpit/report/completeness` +- 修复后结果: + - `eventsChecked=5`(项目活跃事件数) + - `d2EventsChecked=1`(D2 当前覆盖事件数) + - 受试者样例 `recordId=1`:`activeEvents=5`,`d2CoveredEvents=1` + +### 11.2 eQuery 状态流转回归结果 + +- 操作:选取一条 pending eQuery,调用 `POST /equeries/:id/respond` +- 实际状态流: + - `pending -> responded -> closed (ai_review)`(异步作业触发) +- 最终一致性(等待异步稳定后): + - `GET /equeries/stats`: `pending=261, closed=1, responded=0` + - `GET /qc-cockpit/report/equery-log`: 同步为 `pending=261, closed=1, responded=0` + + +--- + +## 12. eQuery 专项 P0 修复(2026-03-08 夜间增量) + +### 12.1 已落地代码改动 + +1. **eQuery 生成去重策略升级(后端)** + - 文件:`backend/src/modules/iit-manager/services/DailyQcOrchestrator.ts` + - 从原来的 `recordId + fieldName` 去重,升级为 `recordId + eventId + ruleName` 去重。 + - 目的:减少“同一业务问题因不同字段重复建单”(对应问题 9)。 + +2. **高噪音规则抑制(后端)** + - 文件:`backend/src/modules/iit-manager/services/DailyQcOrchestrator.ts` + - 新增 `shouldSuppressIssue()`,当前先抑制三类已确认噪音: + - `不良事件记录与知情同意状态一致性检查`(缺上下文时高频误报) + - `所有纳入标准完整性检查` 且实际值为全 `1,1,...` 的错误告警 + - `访视日期早于知情同意书签署日期` 但两日期相同的误报文本 + +3. **eQuery 文案可读性增强(后端)** + - 文件:`backend/src/modules/iit-manager/services/DailyQcOrchestrator.ts` + - 新增 `normalizeQueryText()`: + - 清理 `(标准: [object Object])` + - 去掉 markdown `**` 噪音 + - 对“入组状态与排除标准冲突检查”改写为业务可读提示语 + +4. **eQuery 上下文字段补齐(后端)** + - 文件:`backend/src/modules/iit-manager/services/DailyQcOrchestrator.ts` + - 创建 eQuery 时补写 `eventId/formName`,并在 `expectedAction` 中带出事件上下文。 + - 目的:缓解“详情中表单/访视点显示不全(-)”。 + +5. **规则消息层通用序列化修复(后端)** + - 文件: + - `backend/src/modules/iit-manager/engines/HardRuleEngine.ts` + - `backend/src/modules/iit-manager/engines/SkillRunner.ts` + - 新增逻辑字面量与实际值格式化,避免 `expectedValue`/`actualValue` 落成 `[object Object]` 或不可读数组。 + +6. **eQuery 列表可用性增强(前端)** + - 文件:`frontend-v2/src/modules/iit/pages/EQueryPage.tsx` + - 新增: + - 质疑序号列 + - 访视点列(eventId) + - 按严重程度过滤 + - 按受试者号过滤 + - 前端默认排序:按受试者号升序、同受试者按创建时间降序 + +### 12.2 状态评估(对应 14 条中的关键项) + +- **部分闭环(需复测)** + - #4 排序混乱 / 建议增加序号:已实现前端排序+序号 + - #9 同一目的重复记录:已增强去重键 + - #10/#14 事件/表单显示不足:新单已补上下文,历史单仍需数据回填 + - #12 告警文案与全 1 误报:已在派单前抑制 + +- **仍需继续(下一轮 P0)** + - #3/#7/#11 的“规则本体逻辑”仍建议在规则配置层做根因修正(当前先做了派单层防噪) + - #5 纳入标准检查覆盖不全:仍需补齐规则集合与事件适用范围 + - #13 缺少访视定位的业务解释:需在报表与详情页增加 eventLabel 映射显示 + +### 12.3 第二批 P0(规则执行层护栏)已落地 + +1. **规则执行层新增业务护栏(HardRuleEngine / SkillRunner 双端一致)** + - 文件: + - `backend/src/modules/iit-manager/engines/HardRuleEngine.ts` + - `backend/src/modules/iit-manager/engines/SkillRunner.ts` + - 新增 `forcePassByBusinessGuard()`,在规则命中前做语义纠偏: + - `访视日期早于知情同意书签署日期`:当访视日期 >= 签署日期(含同日)直接判通过 + - `SF-MPQ和CMSS评估日期与访视日期不一致`:存在缺失值时不判“不一致” + - `所有纳入标准完整性检查`:实际值全 1 时直接判通过 + - `入组状态与排除标准冲突检查`:实际值全 0 时直接判通过 + +2. **D2 缺失告警事件名可读化** + - 文件:`backend/src/modules/iit-manager/engines/CompletenessEngine.ts` + - 告警文案从技术事件码切换为 `eventLabel`(如“筛选期”),减少 `65a64dbbd9_arm_1` 直接暴露。 + +> 注:以上为执行层兜底,能立即压误报;下一步仍建议在规则配置(skill.config.rules)层做同名规则逻辑重构,避免长期依赖护栏。 + +### 12.4 同步完成 P1:eQuery 重开入口 + +- 后端新增 `POST /api/v1/admin/iit-projects/:projectId/equeries/:equeryId/reopen` + - 文件: + - `backend/src/modules/admin/iit-projects/iitEqueryService.ts` + - `backend/src/modules/admin/iit-projects/iitEqueryController.ts` + - `backend/src/modules/admin/iit-projects/iitEqueryRoutes.ts` + - 状态流:`closed -> reopened` + +- 前端已接入“重开”按钮 + - 文件: + - `frontend-v2/src/modules/iit/api/iitProjectApi.ts` + - `frontend-v2/src/modules/iit/pages/EQueryPage.tsx` + - 仅在 `closed` 状态显示“重开”操作,执行后刷新列表。 + +--- + +## 13. 执行验证与卡点结论(2026-03-08 晚) + +### 13.1 复跑验证结论 + +- 脚本:`backend/scripts/run_iit_qc_once.ts` +- 项目:`1d80f270-6a02-4b58-9db3-6af176e91f3c`(原发性痛经0302) +- 结果(成功): + - `batch.totalRecords=12` + - `batch.totalEvents=37` + - `batch.fieldStatusWrites=1015` + - `orchestrate.pushSent=true` + - `orchestrate.equeriesCreated=0` + +### 13.2 “卡在哪里”的根因 + +- 本次并非主流程卡死,`QcExecutor -> DailyQcOrchestrator` 已完整跑通并返回结果。 +- 之前观察到的告警根因是: + - 审计日志 SQL 使用了旧列 `action` + - 当前表 `iit_schema.audit_logs` 实际列为 `action_type` +- 已修复后复跑,相关 `audit_logs.action` 报错未再出现。 + +### 13.3 历史 eQuery 上下文回填结果 + +- 脚本:`backend/scripts/backfill_equery_context.ts` +- 回填结果: + - `missingBefore=262` + - `updatedRows=203` + - `missingAfter=59` + +### 13.4 剩余 59 条未回填原因 + +- 脚本:`backend/scripts/analyze_missing_equery_context.ts` +- 统计:`B_RULE_MATCH_FIELD_MISMATCH = 59`(100%) +- 含义: + - 能匹配到同受试者 + 同规则名 + - 但匹配不到同字段名(历史 eQuery 以 `exclusion_criteria2/3/4/5` 多字段拆条,现有 `qc_field_status` 粒度/字段记录不一致) +- 代表样例:`category=入组状态与排除标准冲突检查` 且 `event_id/form_name` 为空。 + +### 13.5 容错回填(二阶段)执行结果 + +- 已升级脚本:`backend/scripts/backfill_equery_context.ts` + - Phase 1:严格匹配(`record + rule + field`) + - Phase 2:容错匹配(`record + rule`,取最近 QC 事件/表单) +- 本次执行结果: + - `missingBefore=59` + - `strictUpdatedRows=0` + - `relaxedUpdatedRows=59` + - `missingAfter=0` +- 复核脚本:`backend/scripts/analyze_missing_equery_context.ts` + - `reasonStats=[]` + - `sample=[]` + - 结论:历史 eQuery 的 `event_id/form_name` 缺失已清零。 + +--- + +## 14. 新增端到端脚本(四流程一体) + +- 脚本:`backend/scripts/e2e_iit_full_flow.ts` +- 运行方式: + - `npx tsx scripts/e2e_iit_full_flow.ts 1d80f270-6a02-4b58-9db3-6af176e91f3c` + - 可选:`--with-chat`(增加 LLM 问答链路) + +### 14.1 覆盖的 4 个流程 + +1. REDCap 结构与真实数据拉取(metadata/events/form-event/records-by-event) +2. 规则配置加载与覆盖校验(`qc_process` 活跃规则) +3. 执行质控与报告编排(`QcExecutor` + `DailyQcOrchestrator`) +4. 多消费端一致性校验(Cockpit / Report / Tools 的通过率一致) + +### 14.2 本次执行结果(通过) + +- Stage1_REDCap:通过 + - `metadata=74`, `events=5`, `formEventMapping=19`, `recordEventRows=37`, `uniqueRecords=12` +- Stage2_Rules:通过 + - `ruleCount=79`, `multiFieldRules=29`, `categories={D1,D3,D5,D6}` +- Stage3_Execution:通过 + - `totalRecords=12`, `totalEvents=37`, `fieldStatusWrites=1015` + - DB:`qc_field_status=713`, `qc_event_status=25`, `record_summary=12` +- Stage4_Consumption:通过 + - `reportPassRate=0`, `cockpitPassRate=0`, `toolPassRate=0`(一致) + +--- + +## 15. 元数据驱动护栏落地(去硬编码) + +### 15.1 执行内核收敛 + +- 已完成:`SkillRunner` 的 HARD_RULE 执行改为单路径复用 `HardRuleEngine.executeWithRules()`。 +- 价值:删除重复实现,避免“同一规则两套行为”。 + +### 15.2 guardType 元数据写回(项目级) + +- 脚本:`backend/scripts/suggest_guard_types_for_project.ts` +- 运行:`npx tsx scripts/suggest_guard_types_for_project.ts 1d80f270-6a02-4b58-9db3-6af176e91f3c --apply` +- 结果:`updated=5` + - `date_not_before_or_equal` ×1 + - `pass_if_exclusion_all_zero` ×1 + - `pass_if_all_ones` ×1 + - `skip_if_any_missing` ×2 + +### 15.3 回归脚本拆分(职责清晰) + +- 引擎机制 smoke:`backend/scripts/regression_hardrule_guards.ts`(可写死样例) +- 项目动态回归:`backend/scripts/regression_hardrule_guards_by_project.ts`(从 `qc_process` 读取规则) +- 项目动态回归结果:`skipped=[]`,核心 guard 断言全部通过。 + +### 15.4 复跑端到端验证 + +- 脚本:`backend/scripts/e2e_iit_full_flow.ts` +- 结果:Stage1~Stage4 全部通过(口径一致性维持)。 +- 备注:本次编排阶段 `pushSent=false`(非主流程阻断项),不影响质控执行与报告一致性断言。 + +--- + +## 16. 守护门禁与兼容开关(新增) + +### 16.1 guardType 门禁脚本 + +- 新增:`backend/scripts/validate_guard_types_for_project.ts` +- 用法: + - 检查:`npx tsx scripts/validate_guard_types_for_project.ts ` + - 严格失败:`npx tsx scripts/validate_guard_types_for_project.ts --strict` +- 本项目执行结果(strict):`missingCount=0`, `mismatchCount=0` + +### 16.2 E2E 增加严格 guard 覆盖断言 + +- 脚本:`backend/scripts/e2e_iit_full_flow.ts` +- 新增参数: + - `--strict-guards` + - 或环境变量 `E2E_REQUIRE_GUARD_TYPES=1` +- 严格模式下,Stage2 会校验 guardType 候选规则的覆盖率(未覆盖即 fail)。 + +### 16.3 兼容兜底可控下线 + +- 文件:`backend/src/modules/iit-manager/engines/HardRuleEngine.ts` +- 新增开关:`IIT_GUARD_LEGACY_NAME_FALLBACK` + - 默认开启(兼容历史规则名) + - 设为 `0` 可关闭规则名兜底,仅按 `metadata.guardType` 生效 +- 目的:支持“先迁移配置,再逐步下线兼容逻辑”的平滑策略。 + + + diff --git a/docs/04-开发规范/13-Cursor防丢失与保存规范.md b/docs/04-开发规范/13-Cursor防丢失与保存规范.md new file mode 100644 index 00000000..f17ed502 --- /dev/null +++ b/docs/04-开发规范/13-Cursor防丢失与保存规范.md @@ -0,0 +1,55 @@ +# Cursor 防丢失与保存规范 + +> 目的:降低“已编辑但未落盘”的风险,避免文档/代码丢失。 +> 适用范围:本仓库所有开发成员。 + +--- + +## 1. 强制设置(已建议统一) + +- 开启自动保存:`files.autoSave = afterDelay` +- 自动保存延迟:`files.autoSaveDelay = 800` +- 开启热退出恢复:`files.hotExit = onExitAndWindowClose` +- 重启自动恢复窗口:`window.restoreWindows = all` + +--- + +## 2. 每日开发最小动作 + +1. 启动开发前先执行一次 `Ctrl+K S`(全部保存) +2. 每次运行脚本/切分支前执行一次 `Ctrl+K S` +3. 每 30-60 分钟做一次本地 checkpoint(Git 提交) +4. 收工前执行: + - `Ctrl+K S` + - `git status` + - 必要时提交 `WIP`(仅本地) + +--- + +## 3. 文档类文件专项要求 + +- 长文档编辑时,至少每 10 分钟手动 `Ctrl+S` 一次 +- 批量修改文档后,立即执行 `git status` 确认改动被识别 +- 对关键文档(部署/规范/评审报告)建议单次编辑后立即提交 + +--- + +## 4. 故障应急(出现“疑似丢失”时) + +1. 先不要继续编辑,先 `Ctrl+K S` +2. 查看 `git status` 是否有改动痕迹 +3. 查看文件时间戳是否更新 +4. 如果未落盘,优先检查: + - 是否在另一个 Cursor 窗口编辑了同名文件 + - 是否被同步盘/杀毒软件锁文件 + - 是否发生异常退出(查看恢复提示) + +--- + +## 5. 发布前防丢失检查 + +- [ ] 所有编辑器标签页已保存 +- [ ] `git status` 与预期一致 +- [ ] 核心文档改动已提交到仓库 +- [ ] 迁移/部署类文档已更新(如适用) + diff --git a/docs/05-每日进度/Day21-22-知识库前端开发与问题修复.md b/docs/05-每日进度/Day21-22-知识库前端开发与问题修复.md new file mode 100644 index 00000000..2999512f --- /dev/null +++ b/docs/05-每日进度/Day21-22-知识库前端开发与问题修复.md @@ -0,0 +1,232 @@ +# Day 21-22:知识库前端开发与问题修复 + +> **日期:** 2025-10-11 +> **状态:** ✅ 已完成 +> **里程碑:** 里程碑1 - Week 3 + +--- + +## 📋 任务概述 + +完成知识库前端页面开发,并解决前后端集成过程中遇到的3个关键问题。 + +--- + +## ✅ 完成的功能 + +### 1. 知识库前端页面(已完成) +- ✅ 知识库列表页面 +- ✅ 知识库详情页面 +- ✅ 文档上传组件 +- ✅ 文档列表显示 +- ✅ 文档状态管理 + +--- + +## 🐛 发现并修复的问题 + +### 问题1:删除知识库失败 - CORS错误 + +**现象:** +``` +Access to XMLHttpRequest at 'http://localhost:3001/api/v1/knowledge-bases/xxx' +has been blocked by CORS policy: Method DELETE is not allowed by +Access-Control-Allow-Methods in preflight response. +``` + +**原因:** +后端CORS配置不完整,没有明确允许DELETE方法 + +**修复:** +```typescript +// backend/src/index.ts +await fastify.register(cors, { + origin: true, + credentials: true, + methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS', 'HEAD'], + allowedHeaders: ['Content-Type', 'Authorization', 'X-Requested-With', 'Accept', 'Origin'], + exposedHeaders: ['Content-Range', 'X-Content-Range'], + maxAge: 600, + preflightContinue: false, +}); +``` + +**验收:** ✅ 删除知识库成功,无CORS错误 + +--- + +### 问题2:编辑知识库失败 - CORS错误 + +**现象:** +``` +Access to XMLHttpRequest at 'http://localhost:3001/api/v1/knowledge-bases/xxx' +has been blocked by CORS policy: Method PUT is not allowed by +Access-Control-Allow-Methods in preflight response. +``` + +**原因:** +与问题1相同,CORS配置没有明确允许PUT方法 + +**修复:** +同上,统一修复CORS配置 + +**验收:** ✅ 编辑知识库成功,保存正常 + +--- + +### 问题3:文件上传无响应 + +**现象:** +- 点击上传按钮完全没有反应 +- 前端无错误提示 +- 后端无请求日志 +- 浏览器控制台无日志输出 + +**排查过程:** + +#### 步骤1:添加调试日志 +在前端组件中添加详细的console.log,发现: +- `beforeUpload` 被调用 ✅ +- `customRequest` 没有被调用 ❌ + +#### 步骤2:发现浏览器缓存问题 +- 浏览器Sources中显示两个同名文件 +- 实际运行的是旧版本代码 +- 清除缓存后解决 + +#### 步骤3:发现组件被禁用 +调试日志显示: +```javascript +{ + disabled: true, + 组件是否被禁用: true +} +``` + +**原因1:** 组件被 `disabled={loading}` 禁用,loading状态一直为true + +**修复1:** +```typescript +// frontend/src/pages/KnowledgePage.tsx + +``` + +**原因2:** `beforeUpload` 返回 `false` 阻止了 `customRequest` 执行 + +根据Ant Design Upload组件的机制: +- `return false` → 完全阻止上传,包括customRequest +- `return Upload.LIST_IGNORE` → 忽略该文件 +- 不返回任何值(undefined)→ 允许customRequest执行 + +**修复2:** +```typescript +// frontend/src/components/knowledge/DocumentUpload.tsx +const beforeUpload = (file: File) => { + // 验证逻辑... + + // 不返回任何值,让 customRequest 处理上传 + // 之前: return false; ❌ +}; +``` + +**验收:** ✅ 文件上传成功,能看到上传进度,后端正确接收文件 + +--- + +## 🔧 技术要点总结 + +### 1. CORS配置要点 +- 必须明确列出所有需要的HTTP方法 +- 开发环境可以 `origin: true` 允许所有来源 +- 生产环境应该指定具体的域名列表 +- `maxAge` 可以减少preflight请求频率 + +### 2. Ant Design Upload组件要点 +- `beforeUpload` 返回值决定是否继续上传 + - `false` 或 `Upload.LIST_IGNORE` → 阻止上传 + - `undefined`(不返回)→ 允许customRequest + - `true` → 默认上传行为(需要action) +- 使用 `customRequest` 可以完全控制上传逻辑 +- `disabled` 属性会阻止所有交互 + +### 3. 前端缓存问题处理 +- 开发时遇到代码不更新,优先考虑缓存问题 +- 解决方案: + 1. 使用无痕模式测试 + 2. 清除浏览器缓存(Ctrl+Shift+Delete) + 3. 删除 `node_modules/.vite` 和 `dist` 文件夹 + 4. 硬刷新(Ctrl+F5) + +### 4. 调试技巧 +- 在关键位置添加console.log +- 使用浏览器Sources查看实际运行的代码 +- 检查组件状态(props、state) +- 对比文件内容和浏览器中的代码 + +--- + +## 📊 成果物 + +### 后端 +- `backend/src/index.ts` - 完整的CORS配置 +- `backend/src/controllers/documentController.ts` - 文档上传日志增强 + +### 前端 +- `frontend/src/pages/KnowledgePage.tsx` - 知识库管理主页面 +- `frontend/src/components/knowledge/DocumentUpload.tsx` - 文档上传组件(已清理调试日志) +- `frontend/src/components/knowledge/KnowledgeBaseList.tsx` - 知识库列表组件 +- `frontend/src/components/knowledge/DocumentList.tsx` - 文档列表组件 + +--- + +## 🎯 下一步计划 + +### Day 23-24:知识库检索 + @引用功能 ⭐⭐⭐ +这是里程碑1的核心功能! + +**任务:** +1. 实现知识库检索API(调用Dify) +2. 前端实现 `@知识库` 触发器 +3. 对话中集成知识库检索 +4. AI回答中显示溯源引用 + +**验收标准:** +- ✅ 能在对话输入框输入 `@` 触发知识库选择 +- ✅ 选择知识库后能检索相关内容 +- ✅ AI回答包含明确的引用来源(如:`[📄 文献.pdf]`) +- ✅ 基于知识库的回答质量可接受 + +--- + +## 💡 经验教训 + +### 1. 问题排查要系统化 +- ❌ 不要反复确认"服务是否启动" +- ✅ 应该分析根本原因:代码逻辑?配置?缓存? + +### 2. 缓存问题很常见 +- 前端开发时,缓存是高频问题 +- 建立清除缓存的标准流程 +- 优先使用无痕模式验证 + +### 3. 添加日志要有策略 +- 关键节点添加日志 +- 完成后及时清理,避免污染 +- 保留error级别的日志 + +### 4. CORS配置要完整 +- 一次性配置所有可能用到的HTTP方法 +- 避免后续反复修改 + +--- + +**文档维护:** 2025-10-11 +**作者:** AI助手 + 开发者 +**Git提交:** feat(frontend): Day 21-22 - 知识库前端开发完成,修复3个关键问题 + + + + diff --git a/docs/05-每日进度/Day23-24-知识库检索与@引用功能完成.md b/docs/05-每日进度/Day23-24-知识库检索与@引用功能完成.md new file mode 100644 index 00000000..ef1c268b --- /dev/null +++ b/docs/05-每日进度/Day23-24-知识库检索与@引用功能完成.md @@ -0,0 +1,420 @@ +# Day 23-24:知识库检索 + @引用功能完成 ✅ + +**开发时间**: Day 23-24 +**开发人员**: AI助手 +**任务状态**: ✅ 已完成(里程碑1核心功能完成!) + +--- + +## 📋 任务概述 + +实现对话中引用知识库的完整功能,用户可以通过 `@知识库` 引用已上传的文献,AI基于文献内容进行精准回答。 + +--- + +## ✅ 已完成功能 + +### 1. 知识库检索API(后端) +**文件**: `backend/src/services/knowledgeBaseService.ts` + +- ✅ Day 20已实现Dify检索API集成 +- ✅ 支持语义检索,返回最相关的文档片段 +- ✅ 返回相似度分数,便于质量评估 + +**API接口**: +``` +GET /api/v1/knowledge-bases/:id/search?query=骨质疏松&top_k=3 +``` + +**返回数据**: +```json +{ + "success": true, + "data": { + "query": { "content": "骨质疏松" }, + "records": [ + { + "segment": { + "id": "xxx", + "content": "相关文档内容...", + "document_id": "xxx" + }, + "score": 0.85 + } + ] + } +} +``` + +--- + +### 2. 前端@知识库选择器 +**文件**: `frontend/src/pages/AgentChatPage.tsx` + +**核心改动**: +```typescript +// 1. 引入知识库Store +import { useKnowledgeBaseStore } from '../stores/useKnowledgeBaseStore' + +// 2. 加载知识库列表 +const { knowledgeBases, fetchKnowledgeBases } = useKnowledgeBaseStore() + +useEffect(() => { + fetchKnowledgeBases() +}, []) + +// 3. 传递给MessageInput组件 + +``` + +**UI功能**: +- ✅ 点击"@知识库"按钮弹出下拉菜单 +- ✅ 显示用户所有知识库列表 +- ✅ 支持多选知识库(蓝色标签显示) +- ✅ 可移除已选择的知识库 + +--- + +### 3. 对话集成知识库检索(后端) +**文件**: `backend/src/services/conversationService.ts` + +**核心实现**: +```typescript +// 1. 导入知识库服务 +import * as knowledgeBaseService from './knowledgeBaseService.js'; + +// 2. 发送消息时检索知识库 +if (knowledgeBaseIds && knowledgeBaseIds.length > 0) { + const knowledgeResults: string[] = []; + + // 对每个知识库进行检索 + for (const kbId of knowledgeBaseIds) { + const searchResult = await knowledgeBaseService.searchKnowledgeBase( + userId, + kbId, + content, // 用户问题作为检索query + 3 // 每个知识库返回3个最相关段落 + ); + + // 格式化检索结果 + if (searchResult.records && searchResult.records.length > 0) { + const kbInfo = await prisma.knowledgeBase.findUnique({ + where: { id: kbId }, + select: { name: true }, + }); + + knowledgeResults.push( + `【知识库:${kbInfo?.name || '未命名'}】\n` + + searchResult.records + .map((record: any, index: number) => { + const score = (record.score * 100).toFixed(1); + return `${index + 1}. [相关度${score}%] ${record.segment.content}`; + }) + .join('\n\n') + ); + } + } + + if (knowledgeResults.length > 0) { + knowledgeBaseContext = knowledgeResults.join('\n\n---\n\n'); + } +} +``` + +**工作流程**: +1. 用户选择知识库并发送问题 +2. 后端对每个知识库调用Dify检索API +3. 获取最相关的文档片段(top_k=3) +4. 格式化检索结果(包含知识库名称和相关度) +5. 将检索结果注入到LLM上下文 +6. LLM基于文献内容生成回答 + +--- + +### 4. 上下文组装优化 +**文件**: `backend/src/services/conversationService.ts` - `assembleContext()` + +**智能上下文注入**: +```typescript +// 第一条消息:使用完整模板(包含项目背景 + 知识库上下文) +if (isFirstMessage) { + userPromptContent = agentService.renderUserPrompt(agentId, { + projectBackground, + userInput, + knowledgeBaseContext, + }); +} +// 后续消息:只发送用户输入 + 知识库上下文 +else { + if (knowledgeBaseContext) { + userPromptContent = `${userInput}\n\n## 参考文献(来自知识库)\n${knowledgeBaseContext}`; + } else { + userPromptContent = userInput; + } +} +``` + +**优势**: +- ✅ 节省token消耗(避免重复发送项目背景) +- ✅ 动态注入知识库内容(只在需要时添加) +- ✅ 保持对话上下文连贯性 + +--- + +## 🔄 完整工作流程 + +``` +用户操作流程: +1. 进入智能体对话页面 +2. 点击"@知识库"按钮 +3. 选择一个或多个知识库 +4. 输入问题(如"AI在临床研究中有哪些应用?") +5. 点击发送 + +系统处理流程: +[前端] 发送消息 + knowledgeBaseIds[] + ↓ +[后端] 接收消息请求 + ↓ +[后端] 对每个知识库调用Dify检索API + ↓ +[Dify] 语义检索返回最相关文档片段 + ↓ +[后端] 格式化检索结果(知识库名 + 相关度 + 内容) + ↓ +[后端] 组装上下文:系统提示 + 历史消息 + 用户问题 + 文献内容 + ↓ +[LLM] DeepSeek-V3基于文献生成回答 + ↓ +[后端] 流式返回AI回答 + ↓ +[前端] 实时显示流式输出 +``` + +--- + +## 🎯 核心技术亮点 + +### 1. RAG(检索增强生成)完整实现 +- ✅ 用户问题 → 语义检索 → 相关文档 → LLM生成 +- ✅ 提高AI回答的准确性和可信度 +- ✅ 支持引用来源追溯 + +### 2. 多知识库联合检索 +- ✅ 支持同时选择多个知识库 +- ✅ 分别检索后合并结果 +- ✅ 标注知识库来源 + +### 3. 相关度评分展示 +- ✅ Dify返回0-1的相似度分数 +- ✅ 转换为百分比展示(如"相关度85.3%") +- ✅ 帮助用户评估引用质量 + +### 4. 错误容错机制 +- ✅ 单个知识库检索失败不影响其他知识库 +- ✅ 检索失败不阻断对话(降级为无文献回答) +- ✅ 详细的错误日志记录 + +--- + +## 📊 数据流示例 + +**用户输入**: +``` +问题: "AI在临床研究中有哪些应用?" +选择知识库: ["我的研究文献"] +``` + +**检索结果(注入LLM上下文)**: +``` +## 参考文献(来自知识库) + +【知识库:我的研究文献】 + +1. [相关度92.3%] AI临床研究文献解决方案主要包括以下几个方向: + - 智能诊断:利用深度学习分析医学影像... + - 药物研发:通过AI预测药物分子结构... + +2. [相关度87.5%] 在临床试验设计中,AI可以优化患者招募... + +3. [相关度81.2%] AI辅助的临床决策支持系统能够... +``` + +**LLM回答**(基于检索内容): +``` +根据您上传的文献,AI在临床研究中主要有以下应用: + +1. **智能诊断**: 利用深度学习分析医学影像,可以提高诊断准确率... +2. **药物研发**: 通过AI预测药物分子结构,加速新药研发... +3. **临床试验优化**: AI可以优化患者招募流程... +... + +📄 以上内容来自您的知识库"我的研究文献" +``` + +--- + +## 🧪 测试建议 + +### 1. 基础功能测试 +- [ ] 点击"@知识库"能否正常显示知识库列表 +- [ ] 选择知识库后是否出现蓝色标签 +- [ ] 能否移除已选择的知识库 +- [ ] 发送消息后AI是否基于文献回答 + +### 2. 多知识库测试 +- [ ] 同时选择2-3个知识库 +- [ ] 验证AI回答是否整合多个来源 + +### 3. 相关性测试 +- [ ] 问与文献相关的问题(应精准回答) +- [ ] 问与文献无关的问题(应说明文献中无相关内容) + +### 4. 边界情况测试 +- [ ] 知识库为空时的处理 +- [ ] 不选择知识库的普通对话 +- [ ] 检索失败时的降级处理 + +--- + +## 📁 涉及文件清单 + +### 后端修改 +- `backend/src/services/conversationService.ts` - 集成知识库检索 + - 添加 `knowledgeBaseService` 导入 + - 实现检索逻辑(流式和非流式) + - 格式化检索结果注入上下文 + +### 前端修改 +- `frontend/src/pages/AgentChatPage.tsx` - 加载知识库列表 + - 引入 `useKnowledgeBaseStore` + - 添加 `fetchKnowledgeBases()` 调用 + - 传递 `knowledgeBases` 给 `MessageInput` + +### 前端已有组件(Day 18-19已实现) +- `frontend/src/components/chat/MessageInput.tsx` - @知识库UI +- `frontend/src/stores/useKnowledgeBaseStore.ts` - 知识库状态管理 + +--- + +## 🎉 里程碑1 - 完成度评估 + +### ✅ 已完成核心功能(100%) +1. ✅ 用户认证与项目管理 +2. ✅ 12个AI智能体配置与调用 +3. ✅ 多轮对话上下文管理 +4. ✅ 流式输出(打字机效果) +5. ✅ 模型切换(DeepSeek-V3/Qwen3-72b/Gemini-Pro) +6. ✅ 个人知识库管理(创建/上传/删除) +7. ✅ @知识库检索与RAG集成 ⭐ **今日完成** + +### 🚀 下一步工作 + +**里程碑2预览**(预计2-3天): +1. 项目协作功能(成员管理、权限控制) +2. 对话历史管理(查看、搜索、导出) +3. AI回答评价与反馈 +4. 引用溯源优化(点击引用查看原文) + +--- + +## 💡 技术收获 + +### 1. RAG系统设计经验 +- 检索质量直接影响AI回答质量 +- top_k参数需要平衡相关性和上下文长度 +- 多知识库检索需要合并策略 + +### 2. LLM上下文管理 +- 第一条消息注入完整背景 +- 后续消息动态添加知识库内容 +- 控制token消耗同时保持连贯性 + +### 3. 错误处理最佳实践 +- 外部API调用必须有容错 +- 降级策略保证基础功能可用 +- 详细日志便于问题排查 + +--- + +## 📝 用户测试指南 + +### 前置条件 +1. 确保Dify服务运行正常 +2. 已创建知识库并上传至少1个文档 +3. 文档已完成索引(Dify后台显示"已完成") + +### 测试步骤 + +**Step 1: 清空浏览器缓存** +``` +1. 按 Ctrl+F5 硬刷新页面 +2. 或使用无痕模式访问 http://localhost:3000 +``` + +**Step 2: 进入对话页面** +``` +1. 访问首页 +2. 选择任意智能体(推荐"话题评估专家") +``` + +**Step 3: 使用@知识库** +``` +1. 点击输入框下方的"@知识库"按钮 +2. 从下拉菜单选择知识库(如"我的研究文献") +3. 看到蓝色标签显示已选择 +4. 输入问题,例如: + - "AI在临床研究中有哪些应用?" + - "这篇文献的主要结论是什么?" + - "请总结文献中的研究方法" +5. 点击发送 +``` + +**Step 4: 观察AI回答** +``` +✅ 正常情况: +- AI回答与文档内容高度相关 +- 引用文档中的具体信息 +- 回答比不@知识库更精准 + +❌ 异常情况请反馈: +- AI回答完全不相关 +- 提示"检索失败" +- 页面报错 +``` + +**Step 5: 查看后端日志** +``` +后端控制台应能看到: +- 检索知识库的日志 +- 返回的相关文档数量 +``` + +--- + +## 🐛 已知问题 + +无 + +--- + +## 🔗 相关文档 + +- [Day 18: Dify部署完成](./Day18-Dify部署完成.md) +- [Day 19-20: 知识库API完成](./Day19-20-知识库API完成.md) +- [Day 21-22: 知识库前端开发与问题修复](./Day21-22-知识库前端开发与问题修复.md) +- [产品需求文档](../00-项目概述/产品需求文档\(PRD\).md) +- [开发里程碑](../04-开发计划/开发里程碑.md) + +--- + +**文档创建时间**: 2025-10-11 +**最后更新**: 2025-10-11 + + + diff --git a/docs/05-每日进度/Day25-智能问答功能完成.md b/docs/05-每日进度/Day25-智能问答功能完成.md new file mode 100644 index 00000000..95a43cad --- /dev/null +++ b/docs/05-每日进度/Day25-智能问答功能完成.md @@ -0,0 +1,598 @@ +# Day 25:智能问答功能完成 ✅ + +**开发时间**: Day 25 +**开发人员**: AI助手 +**任务状态**: ✅ 已完成 + +--- + +## 📋 任务概述 + +实现无项目、无智能体概念的纯AI对话功能,支持可选的@知识库引用。用户可以像在ChatGPT官网一样自由对话,同时可以通过@知识库引用个人文献获得更精准的回答。 + +--- + +## ✅ 已完成功能 + +### 1. 数据库Schema扩展 + +**文件**: `backend/prisma/schema.prisma` + +新增两个数据表: + +#### GeneralConversation(通用对话表) +```prisma +model GeneralConversation { + id String @id @default(uuid()) + userId String @map("user_id") + title String + modelName String? @map("model_name") + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @default(now()) @updatedAt @map("updated_at") + deletedAt DateTime? @map("deleted_at") + + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + messages GeneralMessage[] +} +``` + +#### GeneralMessage(通用消息表) +```prisma +model GeneralMessage { + id String @id @default(uuid()) + conversationId String @map("conversation_id") + role String + content String @db.Text + model String? + metadata Json? + tokens Int? + createdAt DateTime @default(now()) @map("created_at") + + conversation GeneralConversation @relation(...) +} +``` + +**特点**: +- ✅ 与项目对话完全独立 +- ✅ 不依赖智能体配置 +- ✅ 支持元数据存储(如知识库IDs) + +--- + +### 2. 后端API实现 + +**文件**: `backend/src/controllers/chatController.ts` + +#### API接口列表 + +| 接口 | 方法 | 功能 | 参数 | +|------|------|------|------| +| `/api/v1/chat/stream` | POST | 发送消息(流式) | content, modelType, knowledgeBaseIds?, conversationId? | +| `/api/v1/chat/conversations` | GET | 获取对话列表 | - | +| `/api/v1/chat/conversations/:id` | DELETE | 删除对话 | id | + +#### 核心实现逻辑 + +```typescript +async sendMessageStream(request, reply) { + // 1. 获取或创建对话(无需项目/智能体) + if (conversationId) { + // 续接已有对话 + } else { + // 创建新对话 + conversation = await prisma.generalConversation.create({ + userId, + title: content.substring(0, 50), + modelName: modelType, + }); + } + + // 2. 检索知识库(如果有) + if (knowledgeBaseIds && knowledgeBaseIds.length > 0) { + for (const kbId of knowledgeBaseIds) { + const searchResult = await knowledgeBaseService.searchKnowledgeBase( + userId, kbId, content, 3 + ); + // 格式化检索结果 + knowledgeBaseContext += formatResults(searchResult); + } + } + + // 3. 组装上下文(极简) + const messages = [ + { role: 'system', content: '你是一个专业、友好的AI助手...' }, + ...historyMessages, // 最近20条 + { + role: 'user', + content: knowledgeBaseContext + ? `${content}\n\n## 参考资料\n${knowledgeBaseContext}` + : content + } + ]; + + // 4. 流式调用LLM + for await (const chunk of adapter.chatStream(messages)) { + reply.raw.write(`data: ${JSON.stringify(chunk)}\n\n`); + } + + // 5. 保存消息到数据库 +} +``` + +**特点**: +- ✅ 无需agentId和projectId +- ✅ 自动管理对话历史 +- ✅ 集成知识库检索 +- ✅ 极简的System Prompt + +--- + +### 3. 前端页面实现 + +**文件**: `frontend/src/pages/ChatPage.tsx` + +**核心特性**: +- ✅ 完全独立的对话页面 +- ✅ 复用现有组件(MessageList, MessageInput, ModelSelector) +- ✅ 支持@知识库功能 +- ✅ 自动创建和续接对话 + +**页面结构**: +```tsx + +
+ 💬 智能问答 | [模型选择器] +
+ + + {messages.length === 0 ? ( + + 💬 与AI自由对话 + 直接提问,或使用@知识库引用文献 + + ) : ( + + )} + + + sendMessage(...)} + /> +
+``` + +--- + +### 4. 前端API封装 + +**文件**: `frontend/src/api/chatApi.ts` + +**接口方法**: +```typescript +// 发送消息(流式) +sendMessageStream( + data: { + content: string, + modelType: string, + knowledgeBaseIds?: string[], + conversationId?: string + }, + onChunk: (content) => void, + onComplete: (conversationId) => void, + onError: (error) => void +) + +// 获取对话列表 +getConversations(): Promise + +// 删除对话 +deleteConversation(id: string): Promise +``` + +--- + +### 5. 路由和导航 + +**修改文件**: +- `frontend/src/App.tsx` - 添加 `/chat` 路由 +- `frontend/src/layouts/MainLayout.tsx` - 添加"智能问答"菜单项 + +**导航顺序**: +1. 🏠 首页 +2. 💬 **智能问答** ⭐ 新增 +3. 🧪 智能体 +4. 📁 知识库管理 +5. 📜 历史记录 + +--- + +## 🔄 完整工作流程 + +### 场景1:纯对话(无知识库) + +``` +用户访问 /chat + ↓ +空白对话界面 + ↓ +输入:"介绍一下自己" + ↓ +[后端] 创建新对话 + ↓ +[后端] 组装上下文: + - System Prompt: "你是一个专业的AI助手" + - User: "介绍一下自己" + ↓ +[LLM] DeepSeek-V3 回答 + ↓ +[前端] 流式显示回答 +``` + +### 场景2:基于知识库对话 + +``` +用户访问 /chat + ↓ +点击 @知识库 → 选择"骨质疏松知识库" + ↓ +输入:"这个知识库讲的是什么?" + ↓ +[后端] 调用Dify检索API + ↓ +[后端] 检索到3条相关文档片段 + ↓ +[后端] 组装上下文: + - System Prompt + - User: "这个知识库讲的是什么?" + - 参考资料: 【知识库:骨质疏松知识库】... + ↓ +[LLM] 基于文档内容回答 + ↓ +[前端] 显示基于文献的精准回答 +``` + +--- + +## 🎯 技术亮点 + +### 1. 极简架构 +- 无需项目背景 +- 无需智能体配置 +- 直达核心:用户 ↔ AI ↔ 知识库 + +### 2. 灵活的知识库集成 +- 完全可选(不@知识库 = 纯对话) +- 多知识库支持(同时选择多个) +- 实时检索(每次发送时检索最新内容) + +### 3. 代码复用率高 +- ✅ 复用 MessageList 组件 +- ✅ 复用 MessageInput 组件 +- ✅ 复用 ModelSelector 组件 +- ✅ 复用 knowledgeBaseService +- ✅ 复用 LLM适配器 + +### 4. 独立的数据隔离 +- 通用对话存储在独立的表 +- 不影响项目对话数据 +- 便于后续统计和分析 + +--- + +## 📊 数据流示例 + +**请求示例**: +```json +POST /api/v1/chat/stream +{ + "content": "这个知识库讲的是什么?", + "modelType": "deepseek-v3", + "knowledgeBaseIds": ["7d1e08ae-7a40-4e62-8654-bb631dc47293"] +} +``` + +**知识库检索**: +``` +🔍 检索 → Dify API + ↓ +返回3条记录(相关度50.8%, 46.3%, 43.9%) + ↓ +格式化: +【知识库:骨质疏松知识库】 +1. [相关度50.8%] 文档上传与处理:支持在知识库... +2. [相关度46.3%] AI科研助手产品需求文档(PRD) +3. [相关度43.9%] 知识库融合对话功能... +``` + +**发送给LLM**: +``` +System: 你是一个专业、友好的AI助手... + +User: 这个知识库讲的是什么? + +## 参考资料(来自知识库) +【知识库:骨质疏松知识库】 +1. [相关度50.8%] 文档上传与处理... +... +``` + +**AI回答**: +``` +根据您的知识库内容,这是一份关于"AI科研助手"的产品需求文档(PRD)。 + +主要内容包括: +1. 文档管理功能... +2. 知识库融合对话功能... +... + +【文献来源】骨质疏松知识库 +``` + +--- + +## 🐛 已知问题 + +### 1. 问题描述不当导致检索质量差 +**现象**:问"这个文档里有什么?"检索到的内容相关度低 + +**原因**: +- 问题太宽泛,语义模糊 +- Dify检索需要具体的关键词或概念 + +**建议**: +- 使用具体问题:"骨质疏松的治疗方法有哪些?" +- 使用文档中的关键词提问 + +### 2. 英文文档 vs 中文问题 +**现象**:阿尔兹海默症知识库检索到英文片段 + +**原因**: +- 文档是英文的 +- 中文问题匹配度相对较低 + +**建议**: +- 使用英文提问 +- 或者在问题中包含文档中的专业术语 + +--- + +## 📁 涉及文件清单 + +### 后端新增 +- `backend/src/controllers/chatController.ts` - 通用对话Controller +- `backend/src/routes/chatRoutes.ts` - 通用对话路由 +- `backend/prisma/schema.prisma` - 新增通用对话表 +- `backend/migrations/add_general_chat.sql` - 数据库迁移SQL + +### 后端修改 +- `backend/src/index.ts` - 注册chatRoutes + +### 前端新增 +- `frontend/src/pages/ChatPage.tsx` - 智能问答页面 +- `frontend/src/api/chatApi.ts` - 通用对话API封装 + +### 前端修改 +- `frontend/src/App.tsx` - 添加 /chat 路由 +- `frontend/src/layouts/MainLayout.tsx` - 添加"智能问答"菜单项 + +--- + +## 🧪 测试验证 + +### ✅ 已验证功能 + +1. **纯对话功能** + - ✅ 无需项目/智能体 + - ✅ 直接与AI对话 + - ✅ 流式输出正常 + - ✅ 模型切换正常 + +2. **@知识库功能** + - ✅ 下拉菜单选择知识库 + - ✅ 检索功能正常(调用Dify API) + - ✅ 知识库内容成功注入到AI上下文 + - ✅ AI基于知识库内容回答 + +3. **对话历史** + - ✅ 自动创建对话 + - ✅ 续接已有对话 + - ✅ 上下文连贯(最近20条消息) + +--- + +## 🎯 关键技术实现 + +### 1. 无依赖的对话架构 + +**传统模式(项目对话)**: +``` +用户 → 选择项目 → 选择智能体 → 对话 +依赖:projectId + agentId +``` + +**智能问答模式**: +``` +用户 → 对话 +依赖:无 +``` + +### 2. 知识库检索集成 + +```typescript +// 检索知识库 +if (knowledgeBaseIds && knowledgeBaseIds.length > 0) { + for (const kbId of knowledgeBaseIds) { + const searchResult = await knowledgeBaseService.searchKnowledgeBase( + userId, kbId, content, 3 + ); + // 格式化并追加到上下文 + } +} + +// 组装最终Prompt +const userContent = knowledgeBaseContext + ? `${content}\n\n## 参考资料(来自知识库)\n${knowledgeBaseContext}` + : content; +``` + +### 3. 对话续接机制 + +**首次发送**: +```json +{ "content": "你好", "modelType": "deepseek-v3" } +→ 创建新对话,返回 conversationId +``` + +**后续发送**: +```json +{ + "content": "继续聊", + "modelType": "deepseek-v3", + "conversationId": "xxx" +} +→ 续接对话,加载历史消息 +``` + +--- + +## 💡 设计亮点 + +### 1. 用户体验优化 + +**问题**:传统智能体模式需要选择项目和智能体,流程复杂 +**解决**:智能问答直达对话,0步骤开始 + +**问题**:用户可能不知道如何使用知识库 +**解决**:@知识库完全可选,不影响基础使用 + +### 2. 架构清晰性 + +``` +应用架构: +┌─────────────────────────┐ +│ 项目-智能体模式 │ +│ - 结构化的研究流程 │ +│ - 专业领域AI │ +│ - 项目背景上下文 │ +└─────────────────────────┘ + +┌─────────────────────────┐ +│ 智能问答模式 │ +│ - 自由对话 │ +│ - 通用AI助手 │ +│ - 可选知识库辅助 │ +└─────────────────────────┘ +``` + +两种模式互不干扰,满足不同场景需求。 + +### 3. 代码复用率 + +**新增代码**:~400行 +**复用代码**:~2000行(组件、服务、适配器) +**复用率**:83% + +--- + +## 📝 用户使用指南 + +### 快速开始 + +1. 访问 `http://localhost:3000` +2. 点击左侧导航"💬 智能问答" +3. 输入问题,开始对话 + +### 使用@知识库 + +1. 点击输入框下方的"@知识库"按钮 +2. 选择一个或多个知识库 +3. 输入问题(建议具体问题,如:"治疗方法有哪些?") +4. 点击发送 +5. AI会基于知识库内容回答 + +### 最佳实践 + +**✅ 推荐的问题类型**: +- 具体问题:"骨质疏松的病因是什么?" +- 概念解释:"什么是阿尔兹海默症?" +- 信息提取:"文献中提到了哪些治疗方法?" + +**❌ 不推荐的问题**: +- 太宽泛:"这个文档有什么?"(检索效果差) +- 无关问题:"今天天气怎么样?"(浪费检索资源) + +--- + +## 🔗 与Day 23-24的关系 + +**Day 23-24**:在项目智能体对话中实现@知识库 +- ✅ 功能完整 +- ⚠️ 但受限于智能体角色(如"选题评价"会忽略知识库内容) + +**Day 25**:独立的智能问答 +- ✅ 无角色限制 +- ✅ 专注于基于知识库回答问题 +- ✅ 提供最纯粹的测试环境 + +--- + +## 🎉 里程碑1 - 100%完成! + +### 核心功能清单 + +1. ✅ 用户认证与项目管理 +2. ✅ 12个AI智能体配置与调用 +3. ✅ 多轮对话上下文管理 +4. ✅ 流式输出(打字机效果) +5. ✅ 模型切换(DeepSeek-V3/Qwen3/Gemini) +6. ✅ 个人知识库管理 +7. ✅ @知识库检索与RAG集成(Day 23-24) +8. ✅ **智能问答功能**(Day 25)⭐ 今日完成 + +--- + +## 🚀 下一步规划 + +### 里程碑2预览(预计3-4天) + +1. **对话历史增强** + - 对话列表展示 + - 搜索和筛选 + - 导出为Markdown + +2. **引用溯源优化** + - 点击引用查看原文 + - 高亮显示相关片段 + - 文档来源追踪 + +3. **项目协作功能** + - 成员管理 + - 权限控制 + - 共享知识库 + +--- + +## 📊 技术收获 + +### 1. 架构设计 +- 通过"通用对话"补充"项目对话"的不足 +- 两种模式并存,互不干扰 +- 代码高度复用 + +### 2. API设计 +- RESTful风格 +- 可选参数灵活性(conversationId?, knowledgeBaseIds?) +- 流式输出性能优化 + +### 3. 前端组件化 +- MessageList、MessageInput高度解耦 +- 易于在不同场景复用 +- Props设计合理 + +--- + +**文档创建时间**: 2025-10-11 +**最后更新**: 2025-10-11 + + diff --git a/docs/05-部署文档/03-待部署变更清单.md b/docs/05-部署文档/03-待部署变更清单.md index c899cf46..488eed15 100644 --- a/docs/05-部署文档/03-待部署变更清单.md +++ b/docs/05-部署文档/03-待部署变更清单.md @@ -20,6 +20,7 @@ | DB-3 | ReviewTask 表新增 `error_details` JSONB 字段(存储 Skill 级失败详情) | `prisma/migrations/20260307_add_error_details_to_review_task/migration.sql` | 高 | 支持 partial_completed 状态,记录每个失败/超时 Skill 的名称和原因 | | DB-4 | SSA execution_mode 默认值改为 `agent` + 已有 session 全部更新 | `prisma/migrations/20260308_default_agent_mode/migration.sql` | 高 | ALTER DEFAULT + UPDATE 旧数据;QPER UI 入口已移除 | | DB-5 | SSA Agent Prompt 种子数据(SSA_AGENT_PLANNER / SSA_AGENT_CODER) | `prisma/seed-ssa-agent-prompts.ts` | 高 | 部署后执行 `npx tsx prisma/seed-ssa-agent-prompts.ts`;幂等可重复执行 | +| DB-6 | IIT eQuery open 集合去重护栏(历史收敛 + open 唯一索引) | `prisma/migrations/20260308_add_iit_equery_open_dedupe_guard/migration.sql` | 高 | 先自动将历史重复 open eQuery 收敛为 `auto_closed`,再建立部分唯一索引防止未来重复 | ### 后端变更 (Node.js) @@ -35,6 +36,8 @@ | BE-8 | SSA Agent 通道体验优化(方案 B 左右职责分离 + 10 项 Bug 修复) | `ChatHandlerService.ts`, `AgentCoderService.ts`, `chat.routes.ts` | 重新构建镜像 | 视线牵引 Prompt + maxTokens 8000 + 重试流式生成 + consoleOutput 类型防御 + Prompt 铁律 + parseCode 健壮化 | | BE-9 | Phase 5A:CoderAgent 防错护栏(4 项改动) | `AgentCoderService.ts`, `TokenTruncationService.ts`, `chat.routes.ts` | 重新构建镜像 | XML 标签提取 + 防御性编程 Prompt + 高保真 Schema 注入 + token 配额 2500 + 后端强制 Agent 模式 | | BE-10 | SSA Agent 核心 Prompt 接入运营管理端(PlannerAgent + CoderAgent) | `AgentPlannerService.ts`, `AgentCoderService.ts`, `prompt.fallbacks.ts` | 重新构建镜像 | 硬编码 → `PromptService.get()` 动态加载;三级容灾:DB → 缓存 → fallback;需先完成 DB-5 | +| BE-11 | IIT eQuery 幂等写入 + 安全去重工具脚本 | `iitEqueryService.ts`, `scripts/dedupe_open_equeries.ts`, `package.json` | 重新构建镜像 | `createBatch` 改为 `ON CONFLICT DO NOTHING`(open 集合),新增 `npx tsx scripts/dedupe_open_equeries.ts [--apply]` | +| BE-12 | IIT 实时工作流事件名称友好化兜底 + AI 对话证据块强制补齐 | `iitQcCockpitController.ts`, `ChatOrchestrator.ts` | 重新构建镜像 | 时间线事件名采用 event_label/cachedRules/fallback 三层映射;回答含“证据:”时若无明细则自动补齐,避免空证据块 | ### 前端变更 @@ -48,6 +51,7 @@ | FE-6 | RVW 前端支持 partial_completed 状态(部分完成) | `TaskDetail.tsx`, `TaskTable.tsx`, `rvw/types/index.ts` | 重新构建镜像 | 琥珀色警告横幅展示失败模块详情,列表页显示"部分完成"标签,支持查看已完成模块的报告 | | FE-7 | SSA Agent 通道体验优化(方案 B + 动态 UI) | `AgentCodePanel.tsx`, `SSAChatPane.tsx`, `SSAWorkspacePane.tsx`, `SSACodeModal.tsx`, `useSSAChat.ts`, `ssaStore.ts`, `ssa.css` | 重新构建镜像 | 左右职责分离 + JWT 刷新 + 重试代码展示 + 错误信息展示 + 进度条同步 + 导出/查看代码按钮恢复 + ExecutingProgress 组件 | | FE-8 | SSA 默认 Agent 模式 + 查看代码修复 + 分析历史卡片 | `SSAChatPane.tsx`, `SSAWorkspacePane.tsx`, `useSSAChat.ts`, `ssaStore.ts` | 重新构建镜像 | 移除 ModeToggle + 默认 agent + 查看代码走 Modal + 分析完成后对话插入可点击结果卡片 + ChatIntentType 扩展 system | +| FE-9 | IIT D1 筛选入选表“不合规条目”规则名称友好显示 | `EligibilityTable.tsx` | 重新构建镜像 | 不合规条目由 ruleId 显示改为 ruleName 优先,减少技术标识符暴露 | ### Python 微服务变更 diff --git a/frontend-v2/src/modules/iit/api/iitProjectApi.ts b/frontend-v2/src/modules/iit/api/iitProjectApi.ts index 9a9ff9a2..9fdac839 100644 --- a/frontend-v2/src/modules/iit/api/iitProjectApi.ts +++ b/frontend-v2/src/modules/iit/api/iitProjectApi.ts @@ -220,6 +220,7 @@ export interface Equery { projectId: string; recordId: string; eventId?: string; + eventLabel?: string | null; formName?: string; fieldName?: string; queryText: string; @@ -308,6 +309,16 @@ export async function closeEquery( return response.data.data; } +/** 手动重开 eQuery */ +export async function reopenEquery( + projectId: string, + equeryId: string, + data?: { reviewNote?: string } +): Promise { + const response = await apiClient.post(`${BASE_URL}/${projectId}/equeries/${equeryId}/reopen`, data || {}); + return response.data.data; +} + // ==================== 用户映射 ==================== /** 获取角色选项 */ @@ -743,6 +754,7 @@ export interface EqueryLogEntry { id: string; recordId: string; eventId: string | null; + eventLabel?: string | null; formName: string | null; fieldName: string | null; fieldLabel: string | null; diff --git a/frontend-v2/src/modules/iit/components/reports/EligibilityTable.tsx b/frontend-v2/src/modules/iit/components/reports/EligibilityTable.tsx index 3fe0668f..5c979935 100644 --- a/frontend-v2/src/modules/iit/components/reports/EligibilityTable.tsx +++ b/frontend-v2/src/modules/iit/components/reports/EligibilityTable.tsx @@ -49,6 +49,7 @@ const EligibilityTable: React.FC = ({ projectId }) => { if (!data || data.subjects.length === 0) return ; const { summary, criteria, subjects } = data; + const ruleNameMap = new Map(criteria.map(c => [c.ruleId, c.ruleName])); const criteriaColumns = [ { title: '规则 ID', dataIndex: 'ruleId', width: 100 }, @@ -86,7 +87,13 @@ const EligibilityTable: React.FC = ({ projectId }) => { title: '不合规条目', dataIndex: 'failedCriteria', render: (arr: string[]) => - arr.length > 0 ? arr.map(id => {id}) : , + arr.length > 0 + ? arr.map(id => ( + + {ruleNameMap.get(id) || id} + + )) + : , }, ]; diff --git a/frontend-v2/src/modules/iit/components/reports/EqueryLogTable.tsx b/frontend-v2/src/modules/iit/components/reports/EqueryLogTable.tsx index c4348bd6..64ea9dc3 100644 --- a/frontend-v2/src/modules/iit/components/reports/EqueryLogTable.tsx +++ b/frontend-v2/src/modules/iit/components/reports/EqueryLogTable.tsx @@ -164,7 +164,13 @@ const EqueryLogTable: React.FC = ({ projectId }) => { expandable={{ expandedRowRender: expandedRow }} columns={[ { title: '受试者', dataIndex: 'recordId', width: 80 }, - { title: '事件', dataIndex: 'eventId', width: 120, ellipsis: true, render: (v: string | null) => v || '—' }, + { + title: '事件', + dataIndex: 'eventLabel', + width: 140, + ellipsis: true, + render: (_: string | null, row: EqueryLogEntry) => row.eventLabel || row.eventId || '—', + }, { title: '字段', dataIndex: 'fieldLabel', width: 120, ellipsis: true, render: (v: string | null) => v || '—' }, { title: '质疑内容', dataIndex: 'queryText', ellipsis: true }, { diff --git a/frontend-v2/src/modules/iit/pages/AiChatPage.tsx b/frontend-v2/src/modules/iit/pages/AiChatPage.tsx index dbe87030..b9bde14a 100644 --- a/frontend-v2/src/modules/iit/pages/AiChatPage.tsx +++ b/frontend-v2/src/modules/iit/pages/AiChatPage.tsx @@ -1,5 +1,5 @@ import React, { useState, useRef, useEffect } from 'react'; -import { Input, Button, Spin, Typography, Avatar } from 'antd'; +import { Input, Button, Spin, Typography, Avatar, Tag } from 'antd'; import { SendOutlined, RobotOutlined, @@ -32,6 +32,86 @@ function stripToolCallXml(text: string): string { return text; } +interface StructuredAssistantContent { + conclusion?: string; + evidence: string[]; + remainder?: string; +} + +interface EvidenceTokenized { + tags: string[]; + text: string; +} + +function parseStructuredAssistantContent(raw: string): StructuredAssistantContent { + const text = stripToolCallXml(raw).trim(); + if (!text) return { evidence: [] }; + + const lines = text.split(/\r?\n/).map(l => l.trim()); + const conclusionLine = lines.find(l => /^结论[::]/.test(l)); + const evidenceStart = lines.findIndex(l => /^证据[::]/.test(l)); + + let conclusion: string | undefined; + if (conclusionLine) { + conclusion = conclusionLine.replace(/^结论[::]\s*/, '').trim(); + } + + const evidence: string[] = []; + if (evidenceStart >= 0) { + for (let i = evidenceStart + 1; i < lines.length; i++) { + const ln = lines[i]; + if (!ln) continue; + if (/^结论[::]/.test(ln)) continue; + if (/^[-*]\s+/.test(ln)) { + evidence.push(ln.replace(/^[-*]\s+/, '').trim()); + } else if (/^\d+[.)、]\s+/.test(ln)) { + evidence.push(ln.replace(/^\d+[.)、]\s+/, '').trim()); + } + } + } + + // 没命中结构化格式时,回退为 markdown 渲染 + if (!conclusion && evidence.length === 0) { + return { evidence: [], remainder: text }; + } + + const remainderParts: string[] = []; + for (const ln of lines) { + if (!ln) continue; + if (/^结论[::]/.test(ln) || /^证据[::]/.test(ln)) continue; + if (/^[-*]\s+/.test(ln) || /^\d+[.)、]\s+/.test(ln)) continue; + // 避免把结论正文重复放进 remainder + if (conclusion && ln === conclusion) continue; + remainderParts.push(ln); + } + + return { + conclusion, + evidence, + remainder: remainderParts.length > 0 ? remainderParts.join('\n') : undefined, + }; +} + +function tokenizeEvidenceLine(line: string): EvidenceTokenized { + const tags: string[] = []; + const patterns = [ + /\brecord_id\s*=\s*([A-Za-z0-9_-]+)/gi, + /\bevent_id\s*=\s*([A-Za-z0-9_,.-]+)/gi, + /\brule_id\s*=\s*([A-Za-z0-9_,.-]+)/gi, + /\bD[1-7]\b/g, + ]; + + for (const pattern of patterns) { + let match: RegExpExecArray | null; + while ((match = pattern.exec(line)) !== null) { + tags.push(match[0]); + } + } + + const uniqueTags = Array.from(new Set(tags)); + return { tags: uniqueTags, text: line }; +} + interface ChatMessage { id: string; role: 'user' | 'assistant'; @@ -163,11 +243,66 @@ const AiChatPage: React.FC = () => { }} > {msg.role === 'assistant' ? ( -
- - {stripToolCallXml(msg.content)} - -
+ (() => { + const structured = parseStructuredAssistantContent(msg.content); + return ( +
+ {structured.conclusion && ( +
+ + 结论: + + {structured.conclusion} +
+ )} + + {structured.evidence.length > 0 && ( +
+ 证据 +
    + {structured.evidence.map((ev, idx) => ( +
  • + {(() => { + const tokenized = tokenizeEvidenceLine(ev); + return ( +
    + {tokenized.tags.map((t, ti) => ( + + {t} + + ))} + {tokenized.text} +
    + ); + })()} +
  • + ))} +
+
+ )} + + {structured.remainder && ( + + {structured.remainder} + + )} + + {!structured.conclusion && !structured.remainder && structured.evidence.length === 0 && ( + + {stripToolCallXml(msg.content)} + + )} +
+ ); + })() ) : ( {msg.content} )} diff --git a/frontend-v2/src/modules/iit/pages/EQueryPage.tsx b/frontend-v2/src/modules/iit/pages/EQueryPage.tsx index a814a761..b43e4765 100644 --- a/frontend-v2/src/modules/iit/pages/EQueryPage.tsx +++ b/frontend-v2/src/modules/iit/pages/EQueryPage.tsx @@ -62,6 +62,8 @@ const EQueryPage: React.FC = () => { const [stats, setStats] = useState(null); const [loading, setLoading] = useState(false); const [statusFilter, setStatusFilter] = useState(undefined); + const [severityFilter, setSeverityFilter] = useState(undefined); + const [recordIdFilter, setRecordIdFilter] = useState(''); const [page, setPage] = useState(1); // Respond modal @@ -79,10 +81,25 @@ const EQueryPage: React.FC = () => { setLoading(true); try { const [listResult, statsResult] = await Promise.all([ - iitProjectApi.listEqueries(projectId, { status: statusFilter, page, pageSize: 20 }), + iitProjectApi.listEqueries(projectId, { + status: statusFilter, + severity: severityFilter, + recordId: recordIdFilter.trim() || undefined, + page, + pageSize: 20, + }), iitProjectApi.getEqueryStats(projectId), ]); - setEqueries(listResult.items); + const sorted = [...listResult.items].sort((a, b) => { + const aNum = Number(a.recordId); + const bNum = Number(b.recordId); + const aValid = Number.isFinite(aNum); + const bValid = Number.isFinite(bNum); + if (aValid && bValid && aNum !== bNum) return aNum - bNum; + if (a.recordId !== b.recordId) return a.recordId.localeCompare(b.recordId, 'zh-CN', { numeric: true }); + return new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(); + }); + setEqueries(sorted); setTotal(listResult.total); setStats(statsResult); } catch { @@ -90,7 +107,7 @@ const EQueryPage: React.FC = () => { } finally { setLoading(false); } - }, [projectId, statusFilter, page]); + }, [projectId, statusFilter, severityFilter, recordIdFilter, page]); useEffect(() => { fetchData(); @@ -125,7 +142,23 @@ const EQueryPage: React.FC = () => { } }; + const handleReopen = async (equery: Equery) => { + try { + await iitProjectApi.reopenEquery(projectId, equery.id); + message.success('已重开'); + fetchData(); + } catch (err: any) { + message.error(err.message || '重开失败'); + } + }; + const columns: ColumnsType = [ + { + title: '序号', + key: 'index', + width: 72, + render: (_: unknown, __: Equery, index: number) => (page - 1) * 20 + index + 1, + }, { title: '受试者', dataIndex: 'recordId', @@ -133,6 +166,13 @@ const EQueryPage: React.FC = () => { width: 100, render: (id: string) => {id}, }, + { + title: '访视点', + dataIndex: 'eventLabel', + key: 'eventId', + width: 180, + render: (_: string | undefined, row: Equery) => row.eventLabel || row.eventId || '—', + }, { title: '状态', dataIndex: 'status', @@ -211,6 +251,15 @@ const EQueryPage: React.FC = () => { 关闭 )} + {record.status === 'closed' && ( + + )} ), }, @@ -269,6 +318,21 @@ const EQueryPage: React.FC = () => { onChange={(v) => { setStatusFilter(v); setPage(1); }} options={Object.entries(STATUS_CONFIG).map(([value, { label }]) => ({ value, label }))} /> + { setRecordIdFilter(e.target.value); setPage(1); }} + allowClear + /> 条 eQuery @@ -333,6 +397,9 @@ const EQueryPage: React.FC = () => { 受试者: {detailTarget.recordId} 字段: {detailTarget.fieldName || '—'} 表单: {detailTarget.formName || '—'} + + 访视点: {detailTarget.eventLabel || detailTarget.eventId || '—'} + 状态:{' '} {STATUS_CONFIG[detailTarget.status]?.label} diff --git a/frontend-v2/tsconfig.tsbuildinfo b/frontend-v2/tsconfig.tsbuildinfo index 37cf7711..0fd52701 100644 --- a/frontend-v2/tsconfig.tsbuildinfo +++ b/frontend-v2/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"root":["./src/app.tsx","./src/main.tsx","./src/vite-env.d.ts","./src/common/api/axios.ts","./src/framework/auth/authcontext.tsx","./src/framework/auth/api.ts","./src/framework/auth/index.ts","./src/framework/auth/moduleapi.ts","./src/framework/auth/types.ts","./src/framework/layout/adminlayout.tsx","./src/framework/layout/mainlayout.tsx","./src/framework/layout/orglayout.tsx","./src/framework/layout/topnavigation.tsx","./src/framework/modules/errorboundary.tsx","./src/framework/modules/moduleerrorfallback.tsx","./src/framework/modules/moduleregistry.ts","./src/framework/modules/types.ts","./src/framework/permission/permissioncontext.tsx","./src/framework/permission/index.ts","./src/framework/permission/types.ts","./src/framework/permission/usepermission.ts","./src/framework/router/permissiondenied.tsx","./src/framework/router/routeguard.tsx","./src/framework/router/index.ts","./src/modules/admin/index.tsx","./src/modules/admin/api/statsapi.ts","./src/modules/admin/api/userapi.ts","./src/modules/admin/components/assigntenantmodal.tsx","./src/modules/admin/components/importusermodal.tsx","./src/modules/admin/components/modulepermissionmodal.tsx","./src/modules/admin/pages/statsdashboardpage.tsx","./src/modules/admin/pages/userdetailpage.tsx","./src/modules/admin/pages/userformpage.tsx","./src/modules/admin/pages/userlistpage.tsx","./src/modules/admin/types/user.ts","./src/modules/aia/constants.ts","./src/modules/aia/index.tsx","./src/modules/aia/types.ts","./src/modules/aia/components/agentcard.tsx","./src/modules/aia/components/agenthub.tsx","./src/modules/aia/components/chatworkspace.tsx","./src/modules/aia/components/index.ts","./src/modules/aia/protocol-agent/protocolagentpage.tsx","./src/modules/aia/protocol-agent/index.ts","./src/modules/aia/protocol-agent/types.ts","./src/modules/aia/protocol-agent/components/actioncard.tsx","./src/modules/aia/protocol-agent/components/chatarea.tsx","./src/modules/aia/protocol-agent/components/documentpanel.tsx","./src/modules/aia/protocol-agent/components/markdowncontent.tsx","./src/modules/aia/protocol-agent/components/reflexionmessage.tsx","./src/modules/aia/protocol-agent/components/resizablesplitpane.tsx","./src/modules/aia/protocol-agent/components/stagecard.tsx","./src/modules/aia/protocol-agent/components/stageeditmodal.tsx","./src/modules/aia/protocol-agent/components/statepanel.tsx","./src/modules/aia/protocol-agent/components/syncbutton.tsx","./src/modules/aia/protocol-agent/components/viewswitcher.tsx","./src/modules/aia/protocol-agent/components/index.ts","./src/modules/aia/protocol-agent/hooks/index.ts","./src/modules/aia/protocol-agent/hooks/useprotocolcontext.ts","./src/modules/aia/protocol-agent/hooks/useprotocolconversations.ts","./src/modules/aia/protocol-agent/hooks/useprotocolgeneration.ts","./src/modules/asl/index.tsx","./src/modules/asl/api/index.ts","./src/modules/asl/components/asllayout.tsx","./src/modules/asl/components/conclusiontag.tsx","./src/modules/asl/components/detailreviewdrawer.tsx","./src/modules/asl/components/fulltextdetaildrawer.tsx","./src/modules/asl/components/judgmentbadge.tsx","./src/modules/asl/hooks/usefulltextresults.ts","./src/modules/asl/hooks/usefulltexttask.ts","./src/modules/asl/hooks/usescreeningresults.ts","./src/modules/asl/hooks/usescreeningtask.ts","./src/modules/asl/pages/fulltextprogress.tsx","./src/modules/asl/pages/fulltextresults.tsx","./src/modules/asl/pages/fulltextsettings.tsx","./src/modules/asl/pages/fulltextworkbench.tsx","./src/modules/asl/pages/researchsearch.tsx","./src/modules/asl/pages/screeningresults.tsx","./src/modules/asl/pages/screeningworkbench.tsx","./src/modules/asl/pages/titlescreeningsettings.tsx","./src/modules/asl/types/index.ts","./src/modules/asl/utils/excelexport.ts","./src/modules/asl/utils/excelutils.ts","./src/modules/asl/utils/tabletransform.ts","./src/modules/dc/index.tsx","./src/modules/dc/api/toolb.ts","./src/modules/dc/api/toolc.ts","./src/modules/dc/components/assetlibrary.tsx","./src/modules/dc/components/tasklist.tsx","./src/modules/dc/components/toolcard.tsx","./src/modules/dc/hooks/useassets.ts","./src/modules/dc/hooks/userecenttasks.ts","./src/modules/dc/pages/portal.tsx","./src/modules/dc/pages/tool-b/step1upload.tsx","./src/modules/dc/pages/tool-b/step2schema.tsx","./src/modules/dc/pages/tool-b/step3processing.tsx","./src/modules/dc/pages/tool-b/step4verify.tsx","./src/modules/dc/pages/tool-b/step5result.tsx","./src/modules/dc/pages/tool-b/index.tsx","./src/modules/dc/pages/tool-b/components/stepindicator.tsx","./src/modules/dc/pages/tool-c/index.tsx","./src/modules/dc/pages/tool-c/components/binningdialog.tsx","./src/modules/dc/pages/tool-c/components/binningdialog_improved.tsx","./src/modules/dc/pages/tool-c/components/computedialog.tsx","./src/modules/dc/pages/tool-c/components/conditionaldialog.tsx","./src/modules/dc/pages/tool-c/components/datagrid.tsx","./src/modules/dc/pages/tool-c/components/dropnadialog.tsx","./src/modules/dc/pages/tool-c/components/filterdialog.tsx","./src/modules/dc/pages/tool-c/components/header.tsx","./src/modules/dc/pages/tool-c/components/metrictimepanel.tsx","./src/modules/dc/pages/tool-c/components/missingvaluedialog.tsx","./src/modules/dc/pages/tool-c/components/multimetricpanel.tsx","./src/modules/dc/pages/tool-c/components/pivotdialog.tsx","./src/modules/dc/pages/tool-c/components/pivotpanel.tsx","./src/modules/dc/pages/tool-c/components/recodedialog.tsx","./src/modules/dc/pages/tool-c/components/sidebar.tsx","./src/modules/dc/pages/tool-c/components/streamingsteps.tsx","./src/modules/dc/pages/tool-c/components/toolbar.tsx","./src/modules/dc/pages/tool-c/components/transformdialog.tsx","./src/modules/dc/pages/tool-c/components/unpivotpanel.tsx","./src/modules/dc/pages/tool-c/hooks/usesessionstatus.ts","./src/modules/dc/pages/tool-c/types/index.ts","./src/modules/dc/types/portal.ts","./src/modules/pkb/index.tsx","./src/modules/pkb/api/knowledgebaseapi.ts","./src/modules/pkb/components/createkbdialog.tsx","./src/modules/pkb/components/documentlist.tsx","./src/modules/pkb/components/documentupload.tsx","./src/modules/pkb/components/editkbdialog.tsx","./src/modules/pkb/components/knowledgebaselist.tsx","./src/modules/pkb/components/workspace/batchmode.tsx","./src/modules/pkb/components/workspace/batchmodecomplete.tsx","./src/modules/pkb/components/workspace/deepreadmode.tsx","./src/modules/pkb/components/workspace/fulltextmode.tsx","./src/modules/pkb/components/workspace/workmodeselector.tsx","./src/modules/pkb/hooks/useworkmode.ts","./src/modules/pkb/pages/dashboardpage.tsx","./src/modules/pkb/pages/knowledgepage.tsx","./src/modules/pkb/pages/workspacepage.tsx","./src/modules/pkb/stores/useknowledgebasestore.ts","./src/modules/pkb/types/workspace.ts","./src/modules/rvw/index.tsx","./src/modules/rvw/api/index.ts","./src/modules/rvw/components/agentmodal.tsx","./src/modules/rvw/components/batchtoolbar.tsx","./src/modules/rvw/components/editorialreport.tsx","./src/modules/rvw/components/filterchips.tsx","./src/modules/rvw/components/header.tsx","./src/modules/rvw/components/methodologyreport.tsx","./src/modules/rvw/components/reportdetail.tsx","./src/modules/rvw/components/scorering.tsx","./src/modules/rvw/components/sidebar.tsx","./src/modules/rvw/components/taskdetail.tsx","./src/modules/rvw/components/tasktable.tsx","./src/modules/rvw/components/index.ts","./src/modules/rvw/pages/dashboard.tsx","./src/modules/rvw/types/index.ts","./src/modules/ssa/index.tsx","./src/modules/st/index.tsx","./src/pages/homepage.tsx","./src/pages/loginpage.tsx","./src/pages/admin/admindashboard.tsx","./src/pages/admin/prompteditorpage.tsx","./src/pages/admin/promptlistpage.tsx","./src/pages/admin/api/promptapi.ts","./src/pages/admin/components/prompteditor.tsx","./src/pages/admin/tenants/tenantdetailpage.tsx","./src/pages/admin/tenants/tenantlistpage.tsx","./src/pages/admin/tenants/api/tenantapi.ts","./src/pages/org/orgdashboard.tsx","./src/shared/components/placeholder.tsx","./src/shared/components/index.ts","./src/shared/components/chat/aistreamchat.tsx","./src/shared/components/chat/chatcontainer.tsx","./src/shared/components/chat/codeblockrenderer.tsx","./src/shared/components/chat/conversationlist.tsx","./src/shared/components/chat/messagerenderer.tsx","./src/shared/components/chat/thinkingblock.tsx","./src/shared/components/chat/index.ts","./src/shared/components/chat/types.ts","./src/shared/components/chat/hooks/index.ts","./src/shared/components/chat/hooks/useaistream.ts","./src/shared/components/chat/hooks/useconversations.ts"],"errors":true,"version":"5.9.3"} \ No newline at end of file +{"root":["./src/app.tsx","./src/main.tsx","./src/vite-env.d.ts","./src/common/api/axios.ts","./src/framework/auth/authcontext.tsx","./src/framework/auth/api.ts","./src/framework/auth/index.ts","./src/framework/auth/moduleapi.ts","./src/framework/auth/types.ts","./src/framework/layout/adminlayout.tsx","./src/framework/layout/mainlayout.tsx","./src/framework/layout/orglayout.tsx","./src/framework/layout/topnavigation.tsx","./src/framework/modules/errorboundary.tsx","./src/framework/modules/moduleerrorfallback.tsx","./src/framework/modules/moduleregistry.ts","./src/framework/modules/types.ts","./src/framework/permission/permissioncontext.tsx","./src/framework/permission/index.ts","./src/framework/permission/types.ts","./src/framework/permission/usepermission.ts","./src/framework/router/permissiondenied.tsx","./src/framework/router/routeguard.tsx","./src/framework/router/index.ts","./src/modules/admin/index.tsx","./src/modules/admin/api/iitprojectapi.ts","./src/modules/admin/api/statsapi.ts","./src/modules/admin/api/systemkbapi.ts","./src/modules/admin/api/userapi.ts","./src/modules/admin/components/assigntenantmodal.tsx","./src/modules/admin/components/importusermodal.tsx","./src/modules/admin/components/modulepermissionmodal.tsx","./src/modules/admin/components/qc-cockpit/qcdetaildrawer.tsx","./src/modules/admin/components/qc-cockpit/qcreportdrawer.tsx","./src/modules/admin/components/qc-cockpit/qcstatcards.tsx","./src/modules/admin/components/qc-cockpit/riskheatmap.tsx","./src/modules/admin/components/qc-cockpit/index.ts","./src/modules/admin/pages/iitmembermanagepage.tsx","./src/modules/admin/pages/iitprojectdetailpage.tsx","./src/modules/admin/pages/iitprojectlistpage.tsx","./src/modules/admin/pages/iitqccockpitpage.tsx","./src/modules/admin/pages/statsdashboardpage.tsx","./src/modules/admin/pages/systemkbdetailpage.tsx","./src/modules/admin/pages/systemkblistpage.tsx","./src/modules/admin/pages/userdetailpage.tsx","./src/modules/admin/pages/userformpage.tsx","./src/modules/admin/pages/userlistpage.tsx","./src/modules/admin/types/iitproject.ts","./src/modules/admin/types/qccockpit.ts","./src/modules/admin/types/systemkb.ts","./src/modules/admin/types/user.ts","./src/modules/aia/constants.ts","./src/modules/aia/index.tsx","./src/modules/aia/types.ts","./src/modules/aia/components/agentcard.tsx","./src/modules/aia/components/agenthub.tsx","./src/modules/aia/components/chatworkspace.tsx","./src/modules/aia/components/index.ts","./src/modules/aia/protocol-agent/protocolagentpage.tsx","./src/modules/aia/protocol-agent/index.ts","./src/modules/aia/protocol-agent/types.ts","./src/modules/aia/protocol-agent/components/actioncard.tsx","./src/modules/aia/protocol-agent/components/chatarea.tsx","./src/modules/aia/protocol-agent/components/documentpanel.tsx","./src/modules/aia/protocol-agent/components/markdowncontent.tsx","./src/modules/aia/protocol-agent/components/reflexionmessage.tsx","./src/modules/aia/protocol-agent/components/resizablesplitpane.tsx","./src/modules/aia/protocol-agent/components/stagecard.tsx","./src/modules/aia/protocol-agent/components/stageeditmodal.tsx","./src/modules/aia/protocol-agent/components/statepanel.tsx","./src/modules/aia/protocol-agent/components/syncbutton.tsx","./src/modules/aia/protocol-agent/components/viewswitcher.tsx","./src/modules/aia/protocol-agent/components/index.ts","./src/modules/aia/protocol-agent/hooks/index.ts","./src/modules/aia/protocol-agent/hooks/useprotocolcontext.ts","./src/modules/aia/protocol-agent/hooks/useprotocolconversations.ts","./src/modules/aia/protocol-agent/hooks/useprotocolgeneration.ts","./src/modules/asl/index.tsx","./src/modules/asl/api/index.ts","./src/modules/asl/components/asllayout.tsx","./src/modules/asl/components/conclusiontag.tsx","./src/modules/asl/components/detailreviewdrawer.tsx","./src/modules/asl/components/fulltextdetaildrawer.tsx","./src/modules/asl/components/judgmentbadge.tsx","./src/modules/asl/components/charting/baselinetable.tsx","./src/modules/asl/components/charting/datasourceselector.tsx","./src/modules/asl/components/charting/prismaflowdiagram.tsx","./src/modules/asl/components/deep-research/agentterminal.tsx","./src/modules/asl/components/deep-research/landingview.tsx","./src/modules/asl/components/deep-research/resultsview.tsx","./src/modules/asl/components/deep-research/setuppanel.tsx","./src/modules/asl/components/deep-research/strategyconfirm.tsx","./src/modules/asl/components/extraction/extractiondrawer.tsx","./src/modules/asl/components/extraction/extractionstatusbadge.tsx","./src/modules/asl/components/extraction/fieldgroup.tsx","./src/modules/asl/components/extraction/processingterminal.tsx","./src/modules/asl/components/extraction/quoteblock.tsx","./src/modules/asl/components/meta/resultspanel.tsx","./src/modules/asl/hooks/usedeepresearchtask.ts","./src/modules/asl/hooks/useextractionlogs.ts","./src/modules/asl/hooks/usefulltextresults.ts","./src/modules/asl/hooks/usefulltexttask.ts","./src/modules/asl/hooks/usescreeningresults.ts","./src/modules/asl/hooks/usescreeningtask.ts","./src/modules/asl/pages/deepresearchpage.tsx","./src/modules/asl/pages/extractionpage.tsx","./src/modules/asl/pages/extractionprogress.tsx","./src/modules/asl/pages/extractionsetup.tsx","./src/modules/asl/pages/extractionworkbench.tsx","./src/modules/asl/pages/fulltextprogress.tsx","./src/modules/asl/pages/fulltextresults.tsx","./src/modules/asl/pages/fulltextsettings.tsx","./src/modules/asl/pages/fulltextworkbench.tsx","./src/modules/asl/pages/metaanalysisengine.tsx","./src/modules/asl/pages/researchsearch.tsx","./src/modules/asl/pages/srchartgenerator.tsx","./src/modules/asl/pages/screeningresults.tsx","./src/modules/asl/pages/screeningworkbench.tsx","./src/modules/asl/pages/titlescreeningsettings.tsx","./src/modules/asl/types/deepresearch.ts","./src/modules/asl/types/index.ts","./src/modules/asl/utils/chartingexcelutils.ts","./src/modules/asl/utils/excelexport.ts","./src/modules/asl/utils/excelutils.ts","./src/modules/asl/utils/metaexcelutils.ts","./src/modules/asl/utils/tabletransform.ts","./src/modules/dc/index.tsx","./src/modules/dc/api/toolb.ts","./src/modules/dc/api/toolc.ts","./src/modules/dc/components/assetlibrary.tsx","./src/modules/dc/components/tasklist.tsx","./src/modules/dc/components/toolcard.tsx","./src/modules/dc/hooks/useassets.ts","./src/modules/dc/hooks/userecenttasks.ts","./src/modules/dc/pages/portal.tsx","./src/modules/dc/pages/tool-b/step1upload.tsx","./src/modules/dc/pages/tool-b/step2schema.tsx","./src/modules/dc/pages/tool-b/step3processing.tsx","./src/modules/dc/pages/tool-b/step4verify.tsx","./src/modules/dc/pages/tool-b/step5result.tsx","./src/modules/dc/pages/tool-b/index.tsx","./src/modules/dc/pages/tool-b/components/stepindicator.tsx","./src/modules/dc/pages/tool-c/index.tsx","./src/modules/dc/pages/tool-c/components/binningdialog.tsx","./src/modules/dc/pages/tool-c/components/binningdialog_improved.tsx","./src/modules/dc/pages/tool-c/components/computedialog.tsx","./src/modules/dc/pages/tool-c/components/conditionaldialog.tsx","./src/modules/dc/pages/tool-c/components/datagrid.tsx","./src/modules/dc/pages/tool-c/components/dropnadialog.tsx","./src/modules/dc/pages/tool-c/components/filterdialog.tsx","./src/modules/dc/pages/tool-c/components/header.tsx","./src/modules/dc/pages/tool-c/components/metrictimepanel.tsx","./src/modules/dc/pages/tool-c/components/missingvaluedialog.tsx","./src/modules/dc/pages/tool-c/components/multimetricpanel.tsx","./src/modules/dc/pages/tool-c/components/pivotdialog.tsx","./src/modules/dc/pages/tool-c/components/pivotpanel.tsx","./src/modules/dc/pages/tool-c/components/recodedialog.tsx","./src/modules/dc/pages/tool-c/components/sidebar.tsx","./src/modules/dc/pages/tool-c/components/streamingsteps.tsx","./src/modules/dc/pages/tool-c/components/toolbar.tsx","./src/modules/dc/pages/tool-c/components/transformdialog.tsx","./src/modules/dc/pages/tool-c/components/unpivotpanel.tsx","./src/modules/dc/pages/tool-c/hooks/usesessionstatus.ts","./src/modules/dc/pages/tool-c/types/index.ts","./src/modules/dc/types/portal.ts","./src/modules/iit/iitlayout.tsx","./src/modules/iit/index.tsx","./src/modules/iit/api/iitprojectapi.ts","./src/modules/iit/components/ruletemplatebuilder.tsx","./src/modules/iit/components/variablepicker.tsx","./src/modules/iit/components/reports/completenesstable.tsx","./src/modules/iit/components/reports/deviationlogtable.tsx","./src/modules/iit/components/reports/eligibilitytable.tsx","./src/modules/iit/components/reports/equerylogtable.tsx","./src/modules/iit/config/projectdetailpage.tsx","./src/modules/iit/config/projectlistpage.tsx","./src/modules/iit/context/iitprojectcontext.tsx","./src/modules/iit/pages/aichatpage.tsx","./src/modules/iit/pages/aistreampage.tsx","./src/modules/iit/pages/dashboardpage.tsx","./src/modules/iit/pages/equerypage.tsx","./src/modules/iit/pages/reportspage.tsx","./src/modules/iit/pages/variablelistpage.tsx","./src/modules/iit/types/iitproject.ts","./src/modules/iit/types/qccockpit.ts","./src/modules/legacy/legacysystempage.tsx","./src/modules/legacy/researchmanagement.tsx","./src/modules/legacy/statisticaltools.tsx","./src/modules/pkb/index.tsx","./src/modules/pkb/api/knowledgebaseapi.ts","./src/modules/pkb/components/createkbdialog.tsx","./src/modules/pkb/components/documentlist.tsx","./src/modules/pkb/components/documentupload.tsx","./src/modules/pkb/components/editkbdialog.tsx","./src/modules/pkb/components/knowledgebaselist.tsx","./src/modules/pkb/components/workspace/batchmode.tsx","./src/modules/pkb/components/workspace/batchmodecomplete.tsx","./src/modules/pkb/components/workspace/deepreadmode.tsx","./src/modules/pkb/components/workspace/fulltextmode.tsx","./src/modules/pkb/components/workspace/workmodeselector.tsx","./src/modules/pkb/hooks/useworkmode.ts","./src/modules/pkb/pages/dashboardpage.tsx","./src/modules/pkb/pages/knowledgepage.tsx","./src/modules/pkb/pages/workspacepage.tsx","./src/modules/pkb/stores/useknowledgebasestore.ts","./src/modules/pkb/types/workspace.ts","./src/modules/rvw/index.tsx","./src/modules/rvw/api/index.ts","./src/modules/rvw/components/agentmodal.tsx","./src/modules/rvw/components/batchtoolbar.tsx","./src/modules/rvw/components/clinicalreport.tsx","./src/modules/rvw/components/editorialreport.tsx","./src/modules/rvw/components/filterchips.tsx","./src/modules/rvw/components/forensicsreport.tsx","./src/modules/rvw/components/header.tsx","./src/modules/rvw/components/methodologyreport.tsx","./src/modules/rvw/components/reportdetail.tsx","./src/modules/rvw/components/scorering.tsx","./src/modules/rvw/components/sidebar.tsx","./src/modules/rvw/components/taskdetail.tsx","./src/modules/rvw/components/tasktable.tsx","./src/modules/rvw/components/index.ts","./src/modules/rvw/pages/dashboard.tsx","./src/modules/rvw/types/index.ts","./src/modules/ssa/ssaworkspace.tsx","./src/modules/ssa/index.tsx","./src/modules/ssa/components/agentcodepanel.tsx","./src/modules/ssa/components/askusercard.tsx","./src/modules/ssa/components/clarificationcard.tsx","./src/modules/ssa/components/conclusionreport.tsx","./src/modules/ssa/components/datacontextcard.tsx","./src/modules/ssa/components/dataprofilecard.tsx","./src/modules/ssa/components/dataprofilemodal.tsx","./src/modules/ssa/components/dynamicreport.tsx","./src/modules/ssa/components/modetoggle.tsx","./src/modules/ssa/components/ssachatpane.tsx","./src/modules/ssa/components/ssacodemodal.tsx","./src/modules/ssa/components/ssasidebar.tsx","./src/modules/ssa/components/ssatoast.tsx","./src/modules/ssa/components/ssaworkspacepane.tsx","./src/modules/ssa/components/stepprogresscard.tsx","./src/modules/ssa/components/typewriter.tsx","./src/modules/ssa/components/variabledetailpanel.tsx","./src/modules/ssa/components/variabledictionarypanel.tsx","./src/modules/ssa/components/workflowtimeline.tsx","./src/modules/ssa/components/index.ts","./src/modules/ssa/hooks/index.ts","./src/modules/ssa/hooks/useanalysis.ts","./src/modules/ssa/hooks/useartifactparser.ts","./src/modules/ssa/hooks/usessachat.ts","./src/modules/ssa/hooks/useworkflow.ts","./src/modules/ssa/stores/ssastore.ts","./src/modules/ssa/types/index.ts","./src/modules/ssa/utils/exportblockstoword.ts","./src/modules/st/index.tsx","./src/pages/homepage.tsx","./src/pages/loginpage.tsx","./src/pages/admin/activitylogspage.tsx","./src/pages/admin/admindashboard.tsx","./src/pages/admin/prompteditorpage.tsx","./src/pages/admin/promptlistpage.tsx","./src/pages/admin/api/activityapi.ts","./src/pages/admin/api/promptapi.ts","./src/pages/admin/components/prompteditor.tsx","./src/pages/admin/tenants/tenantdetailpage.tsx","./src/pages/admin/tenants/tenantlistpage.tsx","./src/pages/admin/tenants/api/tenantapi.ts","./src/pages/org/orgdashboard.tsx","./src/pages/user/profilepage.tsx","./src/shared/components/placeholder.tsx","./src/shared/components/index.ts","./src/shared/components/chat/aistreamchat.tsx","./src/shared/components/chat/chatcontainer.tsx","./src/shared/components/chat/codeblockrenderer.tsx","./src/shared/components/chat/conversationlist.tsx","./src/shared/components/chat/messagerenderer.tsx","./src/shared/components/chat/thinkingblock.tsx","./src/shared/components/chat/index.ts","./src/shared/components/chat/types.ts","./src/shared/components/chat/hooks/index.ts","./src/shared/components/chat/hooks/useaistream.ts","./src/shared/components/chat/hooks/useconversations.ts","./src/shared/components/layout/resizablesplitpane.tsx","./src/shared/components/layout/index.ts"],"errors":true,"version":"5.9.3"} \ No newline at end of file diff --git a/一键启动前后端.bat b/一键启动前后端.bat new file mode 100644 index 00000000..e2e76188 --- /dev/null +++ b/一键启动前后端.bat @@ -0,0 +1,30 @@ +@echo off +chcp 65001 >nul +echo ======================================== +echo AI临床研究平台 - 一键启动 +echo ======================================== +echo. + +echo [1/2] 启动后端服务... +cd /d "%~dp0backend" +start "后端服务 - 端口3001" cmd /k "npm run dev" +timeout /t 3 /nobreak >nul + +echo [2/2] 启动前端服务... +cd /d "%~dp0frontend" +start "前端服务 - 端口3000" cmd /k "npm run dev" + +echo. +echo ======================================== +echo ✅ 服务启动中,请等待15-20秒 +echo ======================================== +echo. +echo 📍 前端地址: http://localhost:3000 +echo 📍 后端地址: http://localhost:3001 +echo. +echo 提示:会打开2个新窗口,请不要关闭! +echo. +pause + + + diff --git a/重启所有服务.bat b/重启所有服务.bat new file mode 100644 index 00000000..994fe394 --- /dev/null +++ b/重启所有服务.bat @@ -0,0 +1,37 @@ +@echo off +chcp 65001 >nul +echo ======================================== +echo 停止所有服务并重新启动 +echo ======================================== +echo. + +echo [1/3] 停止所有Node进程... +taskkill /F /IM node.exe >nul 2>&1 +timeout /t 2 /nobreak >nul + +echo [2/3] 启动后端服务(端口3001)... +cd /d "%~dp0backend" +start "【后端服务】端口3001" cmd /k "npm run dev" +timeout /t 5 /nobreak >nul + +echo [3/3] 启动前端服务(端口3000)... +cd /d "%~dp0frontend" +start "【前端服务】端口3000" cmd /k "npm run dev" + +echo. +echo ======================================== +echo ✅ 服务重启完成! +echo ======================================== +echo. +echo 📍 前端地址: http://localhost:3000 +echo 📍 后端地址: http://localhost:3001 +echo. +echo 提示: +echo - 已打开2个新窗口,请不要关闭 +echo - 请等待15-20秒让服务完全启动 +echo - 然后访问 http://localhost:3000 +echo. +pause + + +