{
  "systemId": "1do",
  "ruleId": "1do-scheduler-2026-08-31-v1",
  "status": "success",
  "startedAt": "2026-09-17T02:56:52.086599+08:00",
  "finishedAt": "2026-09-17T02:57:02.294949+08:00",
  "root": "/test/1do",
  "independentDatabase": "website_database:one_do_*",
  "databaseConfigured": true,
  "databaseStatus": "ready",
  "nineDoRoot": "/test/9do",
  "nineDoDataRoot": "/var/lib/9do",
  "nineDoAccess": "read_only_registered_resources",
  "dataSourcePolicy": {
    "policy": "9do_first_free_source_only_when_missing",
    "summary": "涉及数据时 1do 先读取 9do 已有数据；9do 没有对应数据时，才在交易保护窗口外使用免费源补充，补充结果只保存到 1do。",
    "priority": [
      "9do_readonly_data",
      "website_database_readonly_9do_tables",
      "free_public_source_fallback"
    ],
    "writeBoundary": "免费源补充和执行结果只允许写入 one_do_ 表和 /test/1do/data，不允许写入 9do。"
  },
  "guard": {
    "ruleId": "trading-session-exclusive-jysystem-2026-08-28",
    "status": "inactive",
    "checkedAt": "2026-09-17T02:56:52.148732+08:00",
    "date": "20260917",
    "time": "02:56:52",
    "timezone": "Asia/Shanghai",
    "isTradingDay": true,
    "calendarSource": "/var/lib/9do/common/stock/tushare/trade-calendar.json",
    "reason": "calendar_open",
    "sessionWindow": "09:15-15:00 Asia/Shanghai",
    "sessionPolicy": "交易日交易期间只允许持仓情况分析系统运行；其它股票采集、学习、冻结、预测、看板任务暂停、延后或排队。",
    "allowedModules": [
      "JYsystem",
      "trading-session-guard"
    ],
    "active": false,
    "module": "1DOsystem",
    "mode": "assert",
    "decision": "allowed",
    "exitCode": 0
  },
  "categories": [
    {
      "id": "frontend_display",
      "name": "前台显示",
      "description": "只展示后台明确允许公开的模块和状态。"
    },
    {
      "id": "server_learning",
      "name": "服务器学习",
      "description": "服务器后台执行但不直接在前台展示结果，说明学习哪些规则。"
    },
    {
      "id": "backend_display",
      "name": "后台显示",
      "description": "后台展示模型学习情况、完成度和边界状态。"
    },
    {
      "id": "scheduled_task",
      "name": "计划任务",
      "description": "显示更新时间、学习时间、保护窗口和排队规则。"
    }
  ],
  "requirementGroups": {
    "frontend_display": [
      {
        "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"
        ]
      }
    ],
    "server_learning": [
      {
        "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-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-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"
        ]
      }
    ],
    "backend_display": [
      {
        "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-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-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-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"
        ]
      }
    ],
    "scheduled_task": [
      {
        "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"
        ]
      }
    ]
  },
  "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": [
    "股票代码、名称、交易所、行业和概念标签",
    "历史日线行情、指数行情、复权因子和成交额",
    "公告、新闻标题摘要、事件类别和发布时间",
    "每次模型输出的规则版本、输入样本区间、权重变化和验证结果",
    "计划任务运行时间、是否被交易保护窗口延后、下一次排队时间"
  ],
  "borrowedResources": [
    {
      "id": "9do-all-test-data-readonly",
      "sourcePath": "/test/9do",
      "resolvedPath": "/test/9do",
      "accessMode": "read_only",
      "purpose": "允许 1do 读取 9do 测试系统全部页面、配置、静态数据和状态快照；只读，不允许修改或写入",
      "existsOnServer": true,
      "sha256": null,
      "lastCheckedAt": "2026-09-17T02:56:52.214316+08:00"
    },
    {
      "id": "9do-all-runtime-data-readonly",
      "sourcePath": "/var/lib/9do",
      "resolvedPath": "/var/lib/9do",
      "accessMode": "read_only",
      "purpose": "允许 1do 读取 9do 运行数据、公共库、采集结果、学习结果、冻结和复盘产物；只读，不允许修改或写入",
      "existsOnServer": true,
      "sha256": null,
      "lastCheckedAt": "2026-09-17T02:56:52.214316+08:00"
    },
    {
      "id": "9do-global-server-rules",
      "sourcePath": "/test/9do/AGENTS.md",
      "resolvedPath": "/test/9do/AGENTS.md",
      "accessMode": "read_only",
      "purpose": "学习 9do 边界冻结、正式入口和交易保护规则",
      "existsOnServer": true,
      "sha256": "cf334ec336f5b816f13a42fd1b07a61cec192207e8fdd4820a8697ec2049de6a",
      "lastCheckedAt": "2026-09-17T02:56:52.214316+08:00"
    },
    {
      "id": "9do-common-stock-readme",
      "sourcePath": "/test/9do/common/stock/README.md",
      "resolvedPath": "/test/9do/common/stock/README.md",
      "accessMode": "read_only",
      "purpose": "学习公共股票库来源和只读使用方式",
      "existsOnServer": true,
      "sha256": "69a51ec182230f49bc8d48122f73193838f9808d0b18ec6204b04a8725428ad9",
      "lastCheckedAt": "2026-09-17T02:56:52.214316+08:00"
    },
    {
      "id": "9do-common-stock-policy",
      "sourcePath": "/test/9do/common/stock/data-library-policy.json",
      "resolvedPath": "/test/9do/common/stock/data-library-policy.json",
      "accessMode": "read_only",
      "purpose": "学习公共库禁止写入和数据归属规则",
      "existsOnServer": true,
      "sha256": "54a07dc565cc7b78d988ada87feced30d9c4d1b117195a506e821b62edc58685",
      "lastCheckedAt": "2026-09-17T02:56:52.214316+08:00"
    },
    {
      "id": "9do-common-stock-daily-market",
      "sourcePath": "/var/lib/9do/common/stock/tushare/daily-market",
      "resolvedPath": "/var/lib/9do/common/stock/tushare/daily-market",
      "accessMode": "read_only",
      "purpose": "优先读取 9do 公共库中已存在的 A 股日级行情，作为 1do 前台行情展示和后台学习输入的只读数据源",
      "existsOnServer": true,
      "sha256": null,
      "lastCheckedAt": "2026-09-17T02:56:52.214316+08:00"
    },
    {
      "id": "9do-unified-system-management",
      "sourcePath": "/test/9do/data/unified-system-management.json",
      "resolvedPath": "/test/9do/data/unified-system-management.json",
      "accessMode": "read_only",
      "purpose": "读取并列子系统登记，不作为 1do 写入目标",
      "existsOnServer": true,
      "sha256": "bfddb1e7f6d09b53c799ab1c52dc9f82270058034e5cbe46465a5020b13deaca",
      "lastCheckedAt": "2026-09-17T02:56:52.214316+08:00"
    },
    {
      "id": "9do-trading-session-guard",
      "sourcePath": "/test/9do/ops/stock_trading_session_guard.py",
      "resolvedPath": "/test/9do/ops/stock_trading_session_guard.py",
      "accessMode": "read_only",
      "purpose": "交易保护窗口判定，1do 非 JY 股票后台工作被拦截时排队",
      "existsOnServer": true,
      "sha256": "b4ca5b1a981a7dc3209235a62fe025b95f3728f29fc4c977ce413fbb23160c3b",
      "lastCheckedAt": "2026-09-17T02:56:52.214316+08:00"
    }
  ],
  "nineDoDataIndex": "/test/1do/data/9do-data-index.json",
  "latestExecutions": [
    {
      "acceptance": "显示000001股票最近5日价格",
      "category": "frontend_display",
      "createdAt": "2026-08-31T15:49:00.555693+08:00",
      "dependsOn": [],
      "displayModule": "股票价格模块",
      "executionSequence": 1,
      "executionType": "frontend_module",
      "frontendVisible": true,
      "id": "1do-front-1788162539817",
      "learningRules": [
        "显示000001股票最近5日价格"
      ],
      "modelLearning": {
        "status": "已重跑补源、补数据和学习流程",
        "lastResult": "前台显示类已发布到 front-display；其他分类仅后台维护可见。",
        "updatedAt": "2026-09-17T02:57:02.290975+08:00"
      },
      "moduleSpec": {
        "type": "stock_recent_daily_prices",
        "symbol": "000001",
        "days": 5,
        "title": "000001 近5个交易日行情",
        "name": "平安银行",
        "rows": [
          {
            "date": "2026-09-10",
            "open": "11.68",
            "close": "11.85",
            "high": "11.86",
            "low": "11.66",
            "volume": "867632.22",
            "amount": "1022543.91424",
            "amplitude": "",
            "pct": "1.2821",
            "change": "0.15",
            "turnover": ""
          },
          {
            "date": "2026-09-11",
            "open": "11.82",
            "close": "11.74",
            "high": "11.86",
            "low": "11.71",
            "volume": "832460.84",
            "amount": "979990.5542",
            "amplitude": "",
            "pct": "-0.9283",
            "change": "-0.11",
            "turnover": ""
          },
          {
            "date": "2026-09-14",
            "open": "11.73",
            "close": "11.85",
            "high": "11.9",
            "low": "11.72",
            "volume": "741248.02",
            "amount": "876071.01822",
            "amplitude": "",
            "pct": "0.937",
            "change": "0.11",
            "turnover": ""
          },
          {
            "date": "2026-09-15",
            "open": "11.82",
            "close": "11.82",
            "high": "11.88",
            "low": "11.77",
            "volume": "755251.46",
            "amount": "893382.87634",
            "amplitude": "",
            "pct": "-0.2532",
            "change": "-0.03",
            "turnover": ""
          },
          {
            "date": "2026-09-16",
            "open": "11.8",
            "close": "11.7",
            "high": "11.84",
            "low": "11.57",
            "volume": "949626.32",
            "amount": "1106652.93966",
            "amplitude": "",
            "pct": "-1.0152",
            "change": "-0.12",
            "turnover": ""
          }
        ],
        "source": "9do_common_stock_library_readonly",
        "sourcePath": "/var/lib/9do/common/stock/tushare/daily-market",
        "fetchedAt": "2026-09-17T02:57:02.282268+08:00"
      },
      "origin": "execution_request",
      "ownerModel": "one_do_front_backend_publisher_v1",
      "schedule": {
        "learningTime": "显示000001股票最近5日价格",
        "nextPolicy": "按 1do 与 9do 共用服务器计划排队",
        "updateTime": "显示000001股票最近5日价格"
      },
      "status": "rerun_complete_from_9do_readonly",
      "title": "000001 近5个交易日行情",
      "guardStatus": "inactive",
      "dataSourcePriority": [
        "9do_readonly_data",
        "website_database_readonly_9do_tables",
        "free_public_source_fallback"
      ],
      "usedNineDoReadOnlyData": true,
      "serverSteps": [
        {
          "id": "supplement_sources",
          "name": "补数据源",
          "status": "completed",
          "summary": "已优先读取 9do 公共股票库，只读使用，不写入 9do。"
        },
        {
          "id": "supplement_data",
          "name": "补数据",
          "status": "completed",
          "summary": "已从 9do 公共库读取 000001 最近 5 条日线。"
        },
        {
          "id": "learning",
          "name": "学习",
          "status": "completed",
          "summary": "已用 9do 公共库真实日线作为 1do 学习输入，不回写 9do。"
        },
        {
          "id": "publish_front",
          "name": "更新前台",
          "status": "published",
          "summary": "已更新前台展示项。"
        }
      ],
      "updatedAt": "2026-09-17T02:57:02.290995+08:00"
    }
  ],
  "writeBoundary": {
    "allowed": [
      "/test/1do",
      "website_database:one_do_*"
    ],
    "forbidden": [
      "/test/9do",
      "/var/lib/9do",
      "/etc/9do",
      "9do RDS 业务表"
    ]
  },
  "scheduler": {
    "service": "1do-background-work.service",
    "registeredIn": "9do-master-scheduler.service",
    "resourcePolicy": "与 9do 共用服务器资源，由总调度器串行派发并保留 20% 空闲余量。"
  }
}
