{
  "systemId": "1do",
  "name": "1do 股票分析系统",
  "ruleVersion": "1do-requirements-2026-08-31-v2",
  "updatedAt": "2026-08-31T12:10:00+08:00",
  "categories": [
    {
      "id": "frontend_display",
      "name": "前台显示",
      "description": "只展示后台明确允许公开的模块和状态。"
    },
    {
      "id": "server_learning",
      "name": "服务器学习",
      "description": "服务器后台执行但不直接在前台展示结果，说明学习哪些规则。"
    },
    {
      "id": "backend_display",
      "name": "后台显示",
      "description": "后台展示模型学习情况、完成度和边界状态。"
    },
    {
      "id": "scheduled_task",
      "name": "计划任务",
      "description": "显示更新时间、学习时间、保护窗口和排队规则。"
    }
  ],
  "defaultFreeSources": [
    {
      "id": "exchange-calendar",
      "name": "交易日历与停复牌公开信息",
      "collects": ["交易日", "停牌状态", "复牌状态", "节假日"],
      "usage": "9do 没有对应日历数据时才作为补充，用于判断采集窗口、冻结窗口和样本有效性。"
    },
    {
      "id": "public-market-daily",
      "name": "公开日行情与指数行情",
      "collects": ["开盘价", "最高价", "最低价", "收盘价", "成交量", "成交额", "指数涨跌"],
      "usage": "优先读取 9do 公共行情库；9do 缺少对应股票或日期时才补充，用于基础趋势、波动、量价结构和市场环境学习。"
    },
    {
      "id": "public-announcements",
      "name": "上市公司公告公开源",
      "collects": ["公告标题", "公告日期", "公告类型", "证券代码"],
      "usage": "优先读取 9do 已采集公告和事件标签；9do 缺少时才补充，用于事件标签、风险提示和公告影响规则学习。"
    },
    {
      "id": "public-news-summary",
      "name": "公开新闻标题与摘要源",
      "collects": ["标题", "摘要", "发布时间", "来源名", "关联证券"],
      "usage": "优先读取 9do 已有新闻和外部事件数据；9do 缺少时才补充，用于外部事件强度、主题热度和风险方向学习。"
    }
  ],
  "collectionDataRequirements": [
    "股票代码、名称、交易所、行业和概念标签",
    "历史日线行情、指数行情、复权因子和成交额",
    "公告、新闻标题摘要、事件类别和发布时间",
    "每次模型输出的规则版本、输入样本区间、权重变化和验证结果",
    "计划任务运行时间、是否被交易保护窗口延后、下一次排队时间"
  ],
  "requirements": [
    {
      "id": "1do-boundary-001",
      "title": "创建与 9do 平行的独立根目录",
      "category": "backend_display",
      "status": "implemented",
      "frontendVisible": false,
      "ownerModel": "one_do_requirement_coordinator_v1",
      "acceptance": "服务器目标路径为 /test/1do；不得把 1do 页面、数据或后台脚本放入 /test/9do。",
      "displayModule": "运行与边界",
      "learningRules": [],
      "modelLearning": {
        "status": "已冻结独立边界",
        "lastResult": "1do 写入范围限定为 /test/1do 和网站数据库 one_do_ 表。"
      },
      "schedule": {},
      "dependsOn": []
    },
    {
      "id": "1do-db-001",
      "title": "生成网站数据库中的 1do 独立表",
      "category": "server_learning",
      "status": "implemented",
      "frontendVisible": false,
      "ownerModel": "one_do_readonly_resource_worker_v1",
      "acceptance": "1do 使用网站 DATABASE_URL 指向的数据库，表名统一以 one_do_ 开头；不生成 SQLite、DuckDB 或其它本地数据库文件。",
      "displayModule": "服务器学习",
      "learningRules": ["所有 1do 新数据只写入 one_do_ 前缀表", "用户和权限沿用网站数据库标准来源", "不得生成本地独立数据库文件"],
      "modelLearning": {
        "status": "表结构已准备",
        "lastResult": "等待服务器环境注入 DATABASE_URL 后写入。"
      },
      "schedule": {},
      "dependsOn": ["1do-boundary-001"]
    },
    {
      "id": "1do-readonly-9do-001",
      "title": "只读借用 9do 全部数据、字段、模块库和公共库",
      "category": "backend_display",
      "status": "implemented",
      "frontendVisible": false,
      "ownerModel": "one_do_readonly_resource_worker_v1",
      "acceptance": "允许读取 9do 全部数据、字段结构、模块库、公共库、冻结规则、只读快照和管理清单；禁止写入 9do 任意路径、9do 运行目录或 9do 数据库业务表。",
      "displayModule": "9do 只读资源",
      "learningRules": ["涉及数据时优先读取 9do", "读取 9do 时只读不写入", "9do 没有对应数据时才通过免费源补充", "补充和索引结果只写入 1do 数据库和 /test/1do/data"],
      "modelLearning": {
        "status": "只读边界已登记",
        "lastResult": "已记录 9do 数据、字段、模块库和公共库的只读索引规则。"
      },
      "schedule": {},
      "dependsOn": ["1do-boundary-001"]
    },
    {
      "id": "1do-ui-frontend-001",
      "title": "前台按后台允许展示的需求显示",
      "category": "frontend_display",
      "status": "implemented",
      "frontendVisible": true,
      "ownerModel": "one_do_front_backend_publisher_v1",
      "acceptance": "前台只读取 data/front-display.json，不显示服务器学习的隐藏结果。",
      "displayModule": "前台展示项",
      "learningRules": [],
      "modelLearning": {
        "status": "展示规则已生效",
        "lastResult": "前台仅展示 frontendVisible=true 的要求。"
      },
      "schedule": {},
      "dependsOn": ["1do-readonly-9do-001"]
    },
    {
      "id": "1do-ui-admin-001",
      "title": "后台逐条表述需求并四类显示",
      "category": "backend_display",
      "status": "implemented",
      "frontendVisible": false,
      "ownerModel": "one_do_front_backend_publisher_v1",
      "acceptance": "后台按前台显示、服务器学习、后台显示、计划任务四类列出历史要求、状态、模型、依赖和验收条件，并提供删除按钮。",
      "displayModule": "历史要求",
      "learningRules": [],
      "modelLearning": {
        "status": "页面已支持四类分组",
        "lastResult": "新增要求和删除记录先保存在后台页面本地历史。"
      },
      "schedule": {},
      "dependsOn": ["1do-ui-frontend-001", "1do-models-001"]
    },
    {
      "id": "1do-models-001",
      "title": "配置四模型协作",
      "category": "backend_display",
      "status": "implemented",
      "frontendVisible": false,
      "ownerModel": "one_do_requirement_coordinator_v1",
      "acceptance": "1 个需求协调模型理解后台需求、跟踪完成情况，并分配 3 个不同工作模型执行。",
      "displayModule": "四模型分配",
      "learningRules": ["协调模型先判断需求分类", "工作模型按只读资源、股票学习、前后台发布分工", "涉及 9do 写入的需求直接拒绝"],
      "modelLearning": {
        "status": "四模型分工已登记",
        "lastResult": "协调模型负责完成跟踪，其它三个模型负责执行。"
      },
      "schedule": {},
      "dependsOn": ["1do-ui-admin-001"]
    },
    {
      "id": "1do-schedule-001",
      "title": "纳入服务器计划任务",
      "category": "scheduled_task",
      "status": "implemented",
      "frontendVisible": false,
      "ownerModel": "one_do_stock_analysis_worker_v1",
      "acceptance": "1do 后台工作注册为 1do-background-work.service，并由 9do-master-scheduler 串行调度。",
      "displayModule": "计划任务",
      "learningRules": ["交易保护窗口内排队", "空闲期由总调度器串行派发", "保留服务器资源余量"],
      "modelLearning": {
        "status": "计划任务已登记",
        "lastResult": "等待空闲窗口运行 1do 自有学习。"
      },
      "schedule": {
        "updateTime": "每 5 分钟由总调度器检查",
        "learningTime": "交易保护窗口外的服务器空闲期",
        "nextPolicy": "若处于 09:15-15:00 Asia/Shanghai 交易保护窗口则排队"
      },
      "dependsOn": ["1do-db-001", "1do-guard-001"]
    },
    {
      "id": "1do-guard-001",
      "title": "学习 9do 交易保护和边界冻结",
      "category": "server_learning",
      "status": "implemented",
      "frontendVisible": false,
      "ownerModel": "one_do_readonly_resource_worker_v1",
      "acceptance": "交易保护窗口内 1do 股票后台任务排队；脚本写入 1do 状态，不制造伪成功结果。",
      "displayModule": "服务器学习",
      "learningRules": ["读取 9do 交易保护规则", "交易保护窗口内非 JY 股票任务延后", "延后时只写排队状态，不写学习成功"],
      "modelLearning": {
        "status": "保护规则已学习",
        "lastResult": "1do 后台任务会先调用 9do 交易保护判定。"
      },
      "schedule": {
        "updateTime": "每次 1do 后台任务启动前",
        "learningTime": "交易保护窗口外"
      },
      "dependsOn": ["1do-readonly-9do-001"]
    },
    {
      "id": "1do-user-reset-001",
      "title": "后台增加一键清除并重设账号",
      "category": "backend_display",
      "status": "implemented",
      "frontendVisible": false,
      "ownerModel": "one_do_front_backend_publisher_v1",
      "acceptance": "后台必须先选中数据库用户，再重新输入用户名和密码，并确认风险提示；提交后只更新网站数据库用户记录并写审计，不删除历史数据。",
      "displayModule": "账号清除与重设",
      "learningRules": [],
      "modelLearning": {
        "status": "按钮已上线",
        "lastResult": "已要求用户选择账号、重输用户名密码并确认风险。"
      },
      "schedule": {},
      "dependsOn": ["1do-db-001"]
    },
    {
      "id": "1do-free-source-001",
      "title": "默认扩展免费源作为 9do 缺数据后的补充",
      "category": "server_learning",
      "status": "planned",
      "frontendVisible": false,
      "ownerModel": "one_do_stock_analysis_worker_v1",
      "acceptance": "默认登记交易日历、公开日行情、上市公司公告、新闻标题摘要等免费源；涉及数据时先读取 9do，只有 9do 没有对应数据时才通过免费源获取；采集字段必须服务于真实历史样本学习，不生成虚假结论。",
      "displayModule": "免费源与采集数据",
      "learningRules": ["9do 数据优先", "免费源只补 9do 缺失数据", "公开源先登记能力和字段，再进入采集", "仅使用真实历史样本训练规则", "复盘样本只用于验证和反向修正规则", "来源未验证时只显示待验证，不参与结论"],
      "modelLearning": {
        "status": "已列入默认扩展",
        "lastResult": "等待服务器空闲窗口采集和验证公开源。"
      },
      "schedule": {
        "updateTime": "每日空闲窗口检查源可用性",
        "learningTime": "公开源数据验证后进入学习队列"
      },
      "dependsOn": ["1do-db-001", "1do-guard-001"]
    }
  ]
}
