Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .github/scripts/run_skill_selftests.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,12 @@
ROOT = pathlib.Path(__file__).resolve().parents[2]
SKILLS_DIR = ROOT / "skills"

# Windows 控制台默认 GBK,打印 ✓/✗ 等会 UnicodeEncodeError;与各技能脚本同口径重配 UTF-8。
if hasattr(sys.stdout, "reconfigure"):
sys.stdout.reconfigure(encoding="utf-8")
if hasattr(sys.stderr, "reconfigure"):
sys.stderr.reconfigure(encoding="utf-8")

DOCUMENT_IMPORTS = {
"docx",
"fitz",
Expand Down
2 changes: 1 addition & 1 deletion CONVENTIONS.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ m03 与 m04 构成循环:idea 不过关就回到 m03。
| 阶段 | 产出技能 | 标准工件(落盘名) | 下游消费 |
|---|---|---|---|
| 调研 | m01 literature-search | `docs/literature_review.md` | m03/m04/m07/m10 |
| 数据工程 | m02 data-engineering | `data_card.md` + `quality_report.md` | m05/a03/m06 |
| 数据工程 | m02 data-engineering | `data_card.md` + `quality_report.md` + `data_feasibility.md` | m03/m04(四问结论) · m05/a03/m06(数据卡/体检) |
| idea 生成 | m03 idea-generation | `idea_candidates.md` | m04 |
| idea 审查 | m04 idea-critique | `critique_verdict.md` | m05 |
| 研究方案 | m05 research-plan | `PROJECT_PLAN.md` + `experiments/experiment_matrix.md` | a03/m06 |
Expand Down
6 changes: 5 additions & 1 deletion WHATS_INCLUDED.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,11 @@
| consistency | `scripts/consistency_audit.py` | 读取 db09 术语/方法/指标事实源,跨论文/PPT/文档检测术语、指标名、指标值与覆盖缺口 |
| data-engineering | `scripts/check_access_level.py` | 数据访问分级守门:阻断 raw 数据流向 paper/figure/public-repo 等公开产物 |
| data-engineering | `scripts/croissant_export.py` | 数据卡字段 → Croissant JSON-LD(MLCommons 机器可读标准),便于发布 HF/Kaggle/OpenML 被自动索引(最小骨架,标注须官方库校验) |
| data-engineering | `scripts/data_doctor.py` | CSV → Markdown 数据体检报告:形状、类型、缺失、重复、异常值、强相关、泄漏提示 |
| data-engineering | `scripts/data_doctor.py` | CSV → Markdown 数据体检报告:形状、类型、缺失、重复、异常值、强相关、泄漏提示、inf/混合类型/类不均衡/偏态/稀有类 |
| data-engineering | `scripts/data_feasibility.py` | 数据先行四问 → data_feasibility.md(交 m03/m04):四问各 ok/warn/insufficient + 依据,insufficient 退出码 1 当"不进 m03"闸门 |
| data-engineering | `scripts/derive_eval_set.py` | m05 派生数据回边的可执行实现:据规格生成加噪/缺失/跨域/扫参评测集 + 对齐 db04 的 dataset_card 字段(只动特征不碰标签、固定种子) |
| data-engineering | `scripts/drift_check.py` | 两数据集分布漂移检验:数值列 KS+PSI、类别列卡方+PSI,纯 numpy(p 渐近近似),以 PSI 效应量为主 |
| data-engineering | `scripts/emit_artifacts.py` | m02 标准工件落位守门:核 quality_report/data_card/data_feasibility 落 §6.1 标准名,打印 passport 登记命令 |
| data-engineering | `scripts/quality_gate.py` | 按 YAML 规则校验 CSV,输出 PASS/FAIL 数据质量门报告,退出码可接 CI |
| data-engineering | `scripts/safe_split.py` | 构建防泄漏 split + Pipeline/ColumnTransformer,支持 clf/reg/timeseries/group 任务 |
| data-engineering | `scripts/sample_size_check.py` | 数据规模充足性经验预警:分类每类最小样本/回归样本特征比(EPV)/检测每类实例数,把"四问"之规模变可计算(标注非 power analysis) |
Expand Down
17 changes: 16 additions & 1 deletion skills/light-data-engineering/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,13 +54,16 @@ description: 数据处理、数据质量分析与数据集构建。当用户需
2. 可复现处理流水线(脚本 + 参数 + 种子,交 a03 落地)。
3. 划分方案与说明。
4. dataset_card(自建时)。**项目级数据卡标准工件:`data_card.md`**(交 m05/a03/m06)。
5. **四问结论卡 `data_feasibility.md`**(交 m03/m04):把"数据是否足以支撑/质量是否可靠/规模是否足够/特征是否有价值"四问收敛成 ok/warn/insufficient + 依据的轻量落盘工件,**给 m03 判 idea 该不该立项、m04 复核数据声明用**——区别于给做实验用的重工件 data_card/quality_report。由 `scripts/data_feasibility.py` 生成;insufficient 即退出码 1,可当"不进 m03"的闸门。**这是 m02→m03/m04 的标准交接工件,补此前靠聊天传的单向挂载(CONVENTIONS §6.1 双向声明)。**

> 工件落位:用 `scripts/emit_artifacts.py --check` 核三件套(quality_report.md / data_card.md / data_feasibility.md)是否落到 §6.1 标准名,`--register` 打印 passport 登记命令(委托 a01 orchestrator 的 passport.py),保证 orchestrator 台账与 a07 一致性回扫扫得到。

## 衔接
结论喂给 m03/m04;流水线交 a03 实现;数据集登记 db04 与项目库 db09。隐私/许可问题上报 a10。

## 随技能脚本(可直接运行,纯 python + 合成自测,无网络依赖)
所有脚本带 `--selftest`(无需数据,内置合成数据 + 断言验证检测器真的触发)。
- `scripts/data_doctor.py`:CSV → Markdown 数据体检报告(形状/类型/真实内存/缺失/重复/常量列/全空列/高基数/IQR 异常值/强相关/**目标泄漏提示/ID-like 列**,按 HIGH/MED/LOW 给问题摘要)。**泄漏检测覆盖数值目标(|corr|≥0.98)与分类目标(数值特征 η² 相关比、类别特征条件纯度,纯 numpy/pandas 算单特征近乎可分);低基数整数目标自动当分类处理;ID-like 列(近乎逐行唯一)单列提示;高基数阈值随行数自适应。**
- `scripts/data_doctor.py`:CSV → Markdown 数据体检报告(形状/类型/真实内存/缺失/重复/常量列/全空列/高基数/IQR 异常值/强相关/**目标泄漏提示/ID-like 列/inf 无穷值/混合类型列/类不均衡/强偏态/稀有类别**,按 HIGH/MED/LOW 给问题摘要)。**泄漏检测覆盖数值目标(|corr|≥0.98)与分类目标(数值特征 η² 相关比、类别特征条件纯度,纯 numpy/pandas 算单特征近乎可分);低基数整数目标自动当分类处理;ID-like 列(近乎逐行唯一)单列提示;高基数阈值随行数自适应。**
- 自测:`python scripts/data_doctor.py --selftest`
- 用法:`python scripts/data_doctor.py --csv data.csv --target y --out report.md`(`--sample N` 先抽样防大表卡死)。
- `scripts/safe_split.py`:按 `--task clf/reg/timeseries/group` 构建 `Pipeline`+`ColumnTransformer`(数值 median 插补+标准化、类别 most_frequent 插补+OneHot)并自动选 CV——StratifiedKFold/KFold/TimeSeriesSplit/GroupKFold/StratifiedGroupKFold。内置泄漏断言:证明预处理在每折单独 refit(折内 mean ≠ 全量 mean),杜绝划分前 fit_transform。**时序正确性护栏**:timeseries 任务用 `--time-col` 按时间升序重排并校验单调(不给则显式警告,不静默用乱序数据跑出穿越结果)。**group 分类/回归显式声明** `--group-clf`/`--group-reg`(不再靠 `nunique<=20` 猜,避免 20+ 类分类误退化丢分层)。
Expand All @@ -77,6 +80,18 @@ description: 数据处理、数据质量分析与数据集构建。当用户需
- `scripts/check_access_level.py`:数据访问分级守门。每份数据/派生集在数据卡声明 `access_level`(`raw`/`redacted`/`verified_only`),脚本校验它能否流向某下游 sink——raw 数据流向 paper/figure/public-repo 等公开环节会被**阻断**(退出码非零,可当 pipeline 闸门)。三态 pass/blocked/unknown,只按声明判定,真实脱敏是否到位仍需 a10 复核。
- 自测:`python scripts/check_access_level.py --selftest`
- 用法:`python scripts/check_access_level.py --level raw --sink paper`,或 `--manifest flows.json` 批量校验流向清单。
- `scripts/data_feasibility.py`:**数据先行四问 → `data_feasibility.md`**(交 m03/m04 的标准工件)。四问各给 ok/warn/insufficient + 依据,整体取最差档(usable/usable_with_caveats/insufficient)。可手填(`--q1 ok:理由`)或吃 `sample_size_check.py --json` 自动填 Q3(`--scale-json`)。insufficient → 退出码 1,可当"不进 m03"闸门。补 m02→m03/m04 的单向挂载。
- 自测:`python scripts/data_feasibility.py --selftest`
- 用法:`python scripts/data_feasibility.py --project X --q1 ok:... --q2 warn:... --q3 insufficient:... --q4 ok:... --out data_feasibility.md`。
- `scripts/drift_check.py`:两数据集分布漂移检验(reference vs current),补 data_doctor 单数据集体检之外的 train/test 同分布 / 上线漂移 / 清洗前后对比。数值列 KS+PSI、类别列卡方+PSI;纯 numpy 实现(p 值渐近近似,无 scipy 硬依赖)。PSI 档 <0.1 稳定/0.1~0.25 轻微/>0.25 显著。**以 PSI 效应量为主、p 为辅**(大样本 p 过敏),检出漂移≠有害。
- 自测:`python scripts/drift_check.py --selftest`
- 用法:`python scripts/drift_check.py --ref train.csv --cur test.csv --out drift.md`。
- `scripts/derive_eval_set.py`:**m05 派生数据回边的可执行实现**。据派生规格 JSON(基础集 + 变换 + 参数)生成鲁棒性/泛化/敏感性评测集 + 对齐 db04 的 dataset_card 字段。变换:noise(加噪)/missing(MCAR缺失)/subset(跨域子集)/scale(扫参)。**铁律:默认只动特征不碰标签(target_safe)、固定 seed 记入卡、仅作评测不回流训练折**。规格示例见 `examples/derive_spec.example.json`,产出 card_fields 可喂 `croissant_export.py` 回填 db04。
- 自测:`python scripts/derive_eval_set.py --selftest`
- 用法:`python scripts/derive_eval_set.py --base data.csv --spec derive_spec.json --outdir derived/`。
- `scripts/emit_artifacts.py`:m02 标准工件落位守门——`--check` 核 quality_report.md/data_card.md/data_feasibility.md 是否落到 §6.1 标准名,`--register` 打印委托 orchestrator passport.py 的登记命令(artifacts 路径是 a07 回扫权威清单)。纯标准库。
- 自测:`python scripts/emit_artifacts.py --selftest`
- 用法:`python scripts/emit_artifacts.py --check --dir .`。
- 统计检验/效应量/多重校正请复用仓库根的 `code_assets/stats_tests.py`(相对本技能为 `../../code_assets/`,含 welch_t、benjamini_hochberg、wilson_ci 等),标注一致性复用 `agreement.py`,长尾重采样复用 `longtail_resample.py`,不要重造。

---
Expand Down
32 changes: 32 additions & 0 deletions skills/light-data-engineering/examples/derive_spec.example.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
{
"_comment": "derive_eval_set.py 的派生规格示例。由 m05 实验矩阵『派生数据规格』区块填写,回 m02 构建。",
"base_name": "goat_behavior",
"target": "behavior",
"seed": 42,
"transforms": [
{
"name": "goat_noise_05",
"transform": "noise",
"eval_dim": "robustness",
"params": {"scale": 0.5, "cols": ["accel_x", "accel_y", "accel_z"]}
},
{
"name": "goat_missing_20",
"transform": "missing",
"eval_dim": "robustness",
"params": {"rate": 0.2}
},
{
"name": "goat_domain_barnA",
"transform": "subset",
"eval_dim": "generalization",
"params": {"col": "barn", "values": ["A"]}
},
{
"name": "goat_scale_sensor",
"transform": "scale",
"eval_dim": "sensitivity",
"params": {"factor": 1.5, "cols": ["accel_x"]}
}
]
}
27 changes: 26 additions & 1 deletion skills/light-data-engineering/examples/worked_example.md
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,31 @@ python scripts/safe_split.py --csv ts.csv --target estrus --task timeseries --ti

---

## Step 4.5 — 四问结论卡(data_feasibility.py,交 m03/m04)

把 Step 1-4 收敛成给 m03/m04 的标准工件(区别于给 m05/a03 做实验的 data_card/quality_report):

```bash
# 先把 Step 2 的规模检查存成 JSON 喂进来,其余三问手填:
python scripts/sample_size_check.py --task clf --n 3000 --classes 3 \
--per-class 1800,800,400 --features 25 --json > size.json
python scripts/data_feasibility.py --project goat-behavior \
--q1 ok:"3类行为有判别性传感器特征,剔除泄漏列后25维有效" \
--q2 warn:"error级门禁全过;accel_x偶发越界(warn)待异常处理" \
--scale-json size.json \
--q4 ok:"无ID-like误用、无目标泄漏,特征-目标关系真实" \
--out data_feasibility.md
```

产出 `data_feasibility.md`:四问各档 + 整体 verdict(本例含 warn → `USABLE_WITH_CAVEATS`)。
- **m03 读它**:verdict 非 INSUFFICIENT 才提 idea;warn 项(如"发情类规模待 power analysis")写进 idea 约束。
- **m04 读它**:核 idea 自报"数据够"是否与该卡一致,不一致按封顶处理。
- 若把发情类改到 40 条,Q3 变 insufficient → 整体 INSUFFICIENT、退出码 1 → **不进 m03**。

> 落位:`python scripts/emit_artifacts.py --check --dir .` 核 data_card.md / quality_report.md / data_feasibility.md 三件套是否齐备并落到 §6.1 标准名。

---

## Step 5 — 数据卡(data_card_template.md)

填 `assets/data_card_template.md` 的 10 节(对齐 db04)。关键节示意:
Expand All @@ -119,5 +144,5 @@ python scripts/safe_split.py --csv ts.csv --target estrus --task timeseries --ti
| 规模是否足够 | ⚠ 关注稀有类 | 总量 3000 够,但"发情"类须 ≥100;正式结论待 power analysis |
| 特征是否有挖掘价值 | ✅ 是 | 无 ID-like 误用、无目标泄漏后,特征-目标关系真实 |

> 这套走查产出 quality_report.md + gate.md + data_card.md 三件套,结论喂 m03idea 是否有数据基础)/ m04(审 idea 时核数据声明)。每步脚本均纯本地零网络、带 selftest。
> 这套走查产出 quality_report.md + data_card.md + **data_feasibility.md**(+ gate.md)四件套:前两件交 m05/a03/m06 做实验,**data_feasibility.md 交 m03/m04 判 idea 是否有数据基础**(CONVENTIONS §6.1 标准交接,补此前靠聊天传的单向挂载)。每步脚本均纯本地零网络、带 selftest。

Loading