#!/usr/bin/env python3 import sqlite3 import json import os import sys import time DB_PATH = '/root/.hermes/kanban/boards/research-hub/kanban.db' PROJECT_BASE = '/opt/ai-os/products/ceo/content/research/tourism_benchmarking/' def init_pipeline(): conn = sqlite3.connect(DB_PATH) c = conn.cursor() # 1. Đọc loop_count hiện tại từ processed_sources_tl.json sync_state_path = os.path.join(PROJECT_BASE, 'processed_sources_tl.json') loop_count = 0 if os.path.exists(sync_state_path): try: with open(sync_state_path, 'r') as f: data = json.load(f) loop_count = data.get('loop_count', 0) except Exception: pass # 2. Định nghĩa 5 task với đầy đủ Body (Task description) cho TL tasks = [ { "id": f"tl_p1_l{loop_count}_{int(time.time())}", "title": f"[TL.Task 1] Scoping & Data Sync (NotebookLM)", "assignee": "r-and-d", "status": "ready", "body": f"""[CONTEXT] Luận đề: đánh giá chính sách du lịch Thái Lan có tập trung (coherent) hay bị dàn trải (over-dispersed) so với năng lực thực thi. Sử dụng brief.md làm nguồn chân lý với 7 trụ cột. Ma trận benchmark: lượt quốc tế/nội địa, GDP du lịch, việc làm, phòng, chi tiêu trung bình, ngân sách xúc tiến. [PHASE 1] Đối chiếu 10 nguồn tài liệu mới với 7 trụ cột chiến lược. Phân tích xem tài liệu đề cập đến khía cạnh nào trong 7 trụ cột, đánh giá mức độ bao phủ dữ liệu, phát hiện nội dung chính sách có mâu thuẫn hay lệch pha với mục tiêu nghiên cứu gốc không. Sync Logic: Đọc processed_sources_tl.json, lấy 10 source ID mới chưa có trong processed_ids (nếu chưa có file thì lấy 10 source đầu). Lưu vào last_batch. OUTPUT: Ghi file vào Project Base/sources/, ví dụ: batch_{loop_count}_sources.md COPY FILE ra master_reports/ Báo cáo Telegram: - [batch_{loop_count}_sources.md](https://vmi3427693.tail8c1aaf.ts.net/files/opt/ai-os/products/ceo/content/research/tourism_benchmarking/sources/batch_{loop_count}_sources.md)""", "skills": json.dumps(["notebooklm-research"]) }, { "id": f"tl_p2_l{loop_count}_{int(time.time())}", "title": f"[TL.Task 2] RAG Analysis & Deep Finding", "assignee": "r-and-d", "status": "todo", "body": """[CONTEXT] Luận đề: đánh giá chính sách du lịch Thái Lan có tập trung (coherent) hay bị dàn trải (over-dispersed). brief.md là nguồn chân lý. 7 trụ cột. Benchmark matrix đầy đủ. [PHASE 2] Khai thác chuyên sâu 10 nguồn thuộc last_batch qua RAG. Thực hiện Policy Coherence Test: đánh giá sự tương thích giữa số lượng mục tiêu chính sách đề ra với nguồn lực thực thi được phân bổ (flag quá tải chương trình nghị sự). Đúc kết findings định lượng lẫn định tính. Scope control: Chỉ query đúng 10 source ID từ last_batch. Dùng `nlm notebook query --source-ids`. OUTPUT: Viết file rồi COPY vào master_reports/Thailand_tourism_policy.md. Ghi đè nội dung mới nhất. Báo cáo Telegram: - [Thailand_tourism_policy.md](https://vmi3427693.tail8c1aaf.ts.net/files/opt/ai-os/products/ceo/content/research/tourism_benchmarking/master_reports/Thailand_tourism_policy.md)""", "skills": json.dumps(["notebooklm-research"]) }, { "id": f"tl_p3_l{loop_count}_{int(time.time())}", "title": f"[TL.Task 3] Critique", "assignee": "grill-qa", "status": "todo", "body": """[CONTEXT] Luận đề chính: policy coherence vs dispersion (brief.md). 7 trụ cột. Yêu cầu phản biện chuyên sâu. [PHASE 3] BẮT BUỘC SỬ DỤNG SKILL: `research/research-critism`. Đóng vai phản biện độc lập (Methodology Reviewer & Devil's Advocate). Áp dụng quy tắc Anti Sycophancy (tấn công ít nhất 2 luận điểm chính của Phase 2, không đồng thuận dễ dãi). Kiểm tra Hypothesis Discipline và đặt Counter argument cho các luận điểm về "dàn trải chính sách". Chỉ ra điểm cần R&D làm rõ hoặc bổ sung nguồn đối chứng. Trả kết quả bằng Template phê bình (Mức A/B/C). HANDOFF: GHI critique findings vào comment của task này. KHÔNG block task — set status thành done, sau đó chuyển Task 4 từ todo → ready để pipeline tiếp tục.""", "skills": json.dumps(["research-critism"]), "model_override": json.dumps({"model": "default"}) }, { "id": f"tl_p4_l{loop_count}_{int(time.time())}", "title": f"[TL.Task 4] Synthesis & Reporting", "assignee": "writers", "status": "todo", "body": """[CONTEXT] Luận đề trung tâm: chính sách du lịch Thái Lan tập trung hay dàn trải? brief.md là nguồn chân lý. 7 trụ cột. Benchmark matrix. [PHASE 4] ĐỌC COMMENT của Phase 3 (Critique) để biết các điểm phản biện. Tổng hợp dữ liệu từ các phase trước có tính đến ý kiến phê bình, điều chỉnh lập luận nếu critique hợp lý. Biên soạn theo cấu trúc Claim → Evidence → Inference → Citation (APA 7). Trả lời trực tiếp Thesis: chính sách đang tập trung hay bị phân mảnh? Làm rõ ưu tiên cốt lõi vs thứ cấp. OUTPUT: Viết file Thailand_tourism_policy.md trong workspace, SAU ĐÓ COPY vào master_reports/Thailand_tourism_policy.md (ghi đè). Báo cáo Telegram: - [Thailand_tourism_policy.md](https://vmi3427693.tail8c1aaf.ts.net/files/opt/ai-os/products/ceo/content/research/tourism_benchmarking/master_reports/Thailand_tourism_policy.md)""", "model_override": json.dumps({"model": "default"}) }, { "id": f"tl_p5_l{loop_count}_{int(time.time())}", "title": f"[TL.Task 5] Master Update & QA Gate", "assignee": "grill-qa", "status": "todo", "body": """[CONTEXT] Luận đề: policy coherence (brief.md). 7 trụ cột. Toàn bộ dữ liệu từ 4 phase trước. [PHASE 5] Đóng vai tổng biên tập kiểm soát chất lượng cuối cùng. Kiểm tra APA 7 cho toàn bộ in-text citations & References list; không để sót dấu gạch nối trong văn xuôi tiếng Việt. Cập nhật index.md cho các hướng nghiên cứu kế tiếp. Sync Update: Gộp last_batch vào processed_ids, tăng loop_count, clear last_batch, save JSON. Pre-loop handoff. OUTPUT: Viết file index.md trong workspace, SAU ĐÓ COPY vào master_reports/index.md (ghi đè). Báo cáo Telegram: - [index.md](https://vmi3427693.tail8c1aaf.ts.net/files/opt/ai-os/products/ceo/content/research/tourism_benchmarking/master_reports/index.md)""", "skills": json.dumps(["research-critism"]), "model_override": json.dumps({"model": "default"}) } ] # 3. Chèn các task mới vào database for t in tasks: c.execute(""" INSERT INTO tasks (id, title, assignee, status, body, skills, model_override, created_at, goal_mode) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 1) """, ( t["id"], t["title"], t["assignee"], t["status"], t["body"], t.get("skills", None), t.get("model_override", None), int(time.time()), )) conn.commit() conn.close() print(f"✅ Đã khởi tạo thành công Pipeline TL Loop {loop_count} với đầy đủ Description!") if __name__ == "__main__": init_pipeline()