交付规范
每个挑战交付一个 skill、它的输出和运行日志。本页给出统一的格式。
Skill 的两种形态
每个 skill 可以写成下面任意一种,也可以两种都写。
| Python 脚本 | AI 可执行的说明 | |
|---|---|---|
| 主文件 | skills/<名称>/run.py | skills/<名称>/SKILL.md,可附脚本 |
| 怎么调用 | 命令行:输入文件、配置、输出位置 | 让 AI 读 SKILL.md,按步骤执行 |
| 必须写明 | 输入的列、输出的格式、假设、已知限制 | 什么时候用、每一步做什么、每一步怎么检查、常见的失败 |
| 机器相关的内容 | 从 machine.yaml 读,不写死在代码里 | 写成"先读 machine.yaml,再……" |
| 自证 | 在第二份日志上运行的一个测试 | 用它完成一次任务的记录 |
机器相关的内容必须放在配置里,这是 S8 能检验 skill 可移植性的前提:换一台机器时,理想情况下只需要换 machine.yaml。
目录结构
<你的学号>/
machine.yaml # 数据词典和规则(S1 起,逐步补充)
skills/
check-log/ # S1
clean-log/ # S2
kpi-report/ # S3
data/
raw/ # 原始文件,只读
work/ # 各步骤生成的文件
outputs/
s1_phenomena.jsonl
s2_cleaning.jsonl
s3_report.md
runs.jsonl # 运行日志,所有 skill 共用
数据词典
machine.yaml 的骨架。meaning 写含义,evidence 写你在哪里证实了它(时间、行号、回放页截图)。
machine.yaml(骨架)
machine:
model: DataLog-1
sample_rate_hz: 10
time:
columns: [Date, Time]
format: "%Y-%m-%d %H:%M:%S.%f"
timezone: local
step_s: 0.1
columns:
- name: T1
type: int
unit: balls
range: [0, 6]
meaning: 1 号管当前的球数
- name: Sensors_Left
type: bitfield
bits:
- {bit: 0, value: 1, name: S1_in, meaning: 大气缸缩回到位}
- {bit: 1, value: 2, name: S1_out, meaning: 大气缸伸出到位}
# ……
rest_value: 37
rules:
- id: time_repeated
category: time # time / range / count / conservation / cross_column / sequence
reference: manual # manual / physics / cross_column / baseline
check: 相邻两行的时间戳不相同
origin: self # self / ai
validated_on: demo_healthy.csv
events: # S3 起
- id: standing
rule: 两臂 Sensors & 127 == 37 且 Command_Stepper != 15,持续 ≥ 1 s
现象记录
S1 的输出,每条现象一行 JSON。字段说明见 S1。
s1_phenomena.jsonl(一行,为便于阅读已换行)
{"first_seen": "08:00:03.6", "last_seen": "08:29:41.2", "rows": "39, 412, …", "count": 84,
"rule": "time_repeated", "reference": "manual",
"phenomenon": "84 行的时间戳与上一行相同,且整行内容也相同",
"evidence": "第 38、39 行"}
清洗日志
S2 的输出,每个清洗动作一行。由代码在运行时写出。
s2_cleaning.jsonl(一行,为便于阅读已换行)
{"step": 1, "action": "drop_exact_duplicates", "rule": "time_repeated",
"rows": "39, 412, …", "rows_changed": 177, "reversible": true,
"detail": "整行完全相同的重复行只保留第一行",
"reason": "时间戳和内容都相同,属于重复记录"}
| 字段 | 内容 |
|---|---|
step | 第几步,按执行顺序 |
action | 做了什么 |
rule | 由哪条规则发现 |
rows | 涉及的行 |
rows_changed | 改 动、删除或标记了多少行 |
reversible | 能否由原始文件和这条记录恢复 |
detail | 具体怎么改的 |
reason | 为什么这样改 |
运行日志
所有 skill 每运行一次,就往 runs.jsonl 追加一行。它是给你自己、老师和 AI 回看的过程记录。
runs.jsonl(一行,为便于阅读已换行)
{"time": "2026-11-19T10:42:03", "skill": "check-log", "version": "0.3",
"input": {"file": "data/raw/s1_problem.csv", "rows": 18084}, "config": "machine.yaml",
"checks": [{"name": "rules_quiet_on_acceptance_log", "ok": true}],
"output": {"file": "outputs/s1_phenomena.jsonl", "phenomena": 7},
"assumptions": ["standing = 两臂停在原位 ≥ 1 s"],
"notes": "5、6 号管没有 Full_Tube 位,只能用 Command_Stepper 判断它们的满管停机"}
运行日志由代码写出,不手写。它记录的是这次运行实际读了什么、做了什么、得到了什么。