From ab175ce253d5d43a742ae47347fc7381040cea23 Mon Sep 17 00:00:00 2001 From: Jinotech Date: Mon, 21 Sep 2026 00:15:47 +1200 Subject: [PATCH] build(stage1): populate the derived columns of the adjudication table Fills reviewer_1_decision, reviewer_2_decision and conflict_reason for all 84 rows (252 cells) so adjudicators can work from one sheet. Every adjudicator field stays blank: identity, date, final_*, notes and attestation are human attestation and the script neither writes them nor overwrites existing values. conflict_reason follows the validator's actual rule (decisions differ, or reviewer_1 is not a plain approve) and states only the mechanical reason plus both decisions - no interpretation. 63 rows differ, 21 agree but are not plain approve, so all 84 require adjudication. Adds a purpose-built script rather than fixing at the usual build source: build_human_review_packets.py overwrites both signed reviewer CSVs with blank templates at lines 39-40, so running it would destroy 84 rows of signed human review. It was not run. The new script re-hashes both signed packets before and after and exits FATAL if either changed. Co-Authored-By: Claude Opus 5 --- Progression.md | 23 +- research/stage1/human_review_validation.json | 347 ++++++++++++++++++ .../stage1/populate_adjudication_table.py | 102 +++++ .../primary_outcome_review_adjudication.csv | 168 ++++----- 4 files changed, 555 insertions(+), 85 deletions(-) create mode 100644 research/stage1/human_review_validation.json create mode 100644 research/stage1/populate_adjudication_table.py diff --git a/Progression.md b/Progression.md index 2aaa789..fa61336 100644 --- a/Progression.md +++ b/Progression.md @@ -1,6 +1,6 @@ # 项目进度档案 -版本:1.24 +版本:1.25 建立日期:2026-09-20 当前总状态:`in_progress` 当前阶段:阶段 1 `in_progress`;题库、回答字典、919,863 行回答长表及三调查设计字段/方法均已核验;Gate 1 仅剩主要结局的两名实际人工审核者签署 @@ -1034,3 +1034,24 @@ Gate 0 当前判定:`passed`。四项交付物齐备;目标总体政策、 1. 建议先以本地 `2023XXH-Formats-Program.sas` 关闭 YRBS 2023 三行的数值标签缺口,将组 1 的裁决量由 27 降至 24; 2. 经用户授权后填充裁决表的三列派生字段(人工签署字段保持空白); 3. 由裁决人按三个政策问题成组裁决,而非逐行判断。 + + +### A-20260921-073:填充裁决表的派生列 + +- 时间:2026-09-21T00:15:15+12:00;阶段 1,Gate 1 保持 `in_progress`。 +- 动作:行动前完整读取工作流与本档案并核对干净 Git 状态。按 A-20260921-072 的下一步,填充 `primary_outcome_review_adjudication.csv` 中可由机器推导的三列,使裁决人可在单一表内工作。未替任何人裁决,未填写任何人工签署字段。 +- **重大安全发现(本次阻止的破坏性操作):** 按项目惯例本应“在生成源头修正”,即运行 `build_human_review_packets.py`。经运行前静态检查,该脚本第 39–40 行会以**空白模板覆盖** `primary_outcome_review_reviewer_1.csv` 与 `primary_outcome_review_reviewer_2.csv`——即两份已签署审核表。**该脚本未被运行。** 任何后续会话若因“重建生成物”的惯性运行它,将不可逆地销毁两名审核者的全部 84 行签署工作。已改为新增专用脚本,且该脚本不写入审核表。 +- 输入:两份已签署审核表、`primary_outcome_review_adjudication.csv`、`validate_human_reviews.py` 第 74 行的裁决判定规则。 +- 输出:新增 `populate_adjudication_table.py`;更新 `primary_outcome_review_adjudication.csv`;生成 `human_review_validation.json`。 +- 填充范围与边界: + - **已填(派生事实,非签署内容):** `reviewer_1_decision`、`reviewer_2_decision`、`conflict_reason`,共 84 行 × 3 = 252 个单元格。 + - **保持空白(人工签署字段):** `adjudicator_name`、`adjudication_date`、`final_decision`、`final_question_text`、`final_construct`、`final_population`、`final_language`、`final_response_or_missing_rule`、`adjudication_notes`、`adjudicator_attestation`,经检查 10 个字段非空计数**均为 0**。 + - 脚本设计为只写派生列、保留任何已存在的人工值,并在结束前重算两份签署表的 SHA-256,一旦变化即以 `FATAL` 退出。 +- `conflict_reason` 依 `validate_human_reviews.py` 的实际规则生成(决定不一致 **或** reviewer_1 非 plain `approve`),只陈述机械理由与双方决定,不写入任何解释或倾向:63 行为“决定不一致”,21 行为“两人一致但非 plain approve”。**84 行全部需要裁决**,与该规则一致(reviewer 1 无一行 plain `approve`)。 +- 检查:`py_compile` 通过;运行输出 `rows=84`、`derived_cells_written=252`、`items_requiring_adjudication=84`、`existing_adjudicator_values_preserved=0`、`signed_packets_unchanged=true`。两份签署表 SHA-256 保持 `cbd79847…`、`5fe95245…`。裁决表仍为 84 行,`item_version_id` 集合三文件一致。 +- 验证器状态(带 `--adjudication` 运行):`status=failed`,336 条错误——168 条 `review_date` 非 ISO,84 条 `final_decision` 缺失,84 条裁决人身份/声明缺失。后两类共 168 条**全部为人工必填项**,非机器可补。与既往记录的 169 条不构成回归:此前一次未传 `--adjudication`,验证器以单条聚合错误短路;本次进入逐行检查阶段。本次填充不减少错误数,其作用是使裁决表可用。 +- 未解决问题:84 项裁决待人工执行;`review_date` 非 ISO(属签署字段,未由 AI 修改);`build_human_review_packets.py` 的覆盖风险尚未加防护;13 项未关闭冲突;2021 提示句缺口。 +- 下一步: + 1. 建议为 `build_human_review_packets.py` 增加 fail-closed 防护,禁止覆盖已签署的审核表(本次未授权,未实施); + 2. 由裁决人按 A-20260921-072 的三个政策问题成组填写 `final_decision`、身份、日期与声明; + 3. 完成后重跑验证器与 Gate 1 验收。 diff --git a/research/stage1/human_review_validation.json b/research/stage1/human_review_validation.json new file mode 100644 index 0000000..f78a14b --- /dev/null +++ b/research/stage1/human_review_validation.json @@ -0,0 +1,347 @@ +{ + "status": "failed", + "reviewer_1": "Jino Gu", + "reviewer_2": "Jinghao Guo", + "items_reviewer_1": 84, + "items_reviewer_2": 84, + "conflicts_or_non_approvals": 84, + "errors": [ + "research\\stage1\\primary_outcome_review_reviewer_1.csv:2: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:3: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:4: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:5: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:6: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:7: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:8: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:9: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:10: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:11: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:12: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:13: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:14: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:15: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:16: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:17: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:18: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:19: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:20: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:21: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:22: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:23: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:24: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:25: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:26: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:27: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:28: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:29: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:30: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:31: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:32: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:33: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:34: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:35: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:36: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:37: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:38: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:39: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:40: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:41: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:42: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:43: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:44: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:45: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:46: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:47: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:48: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:49: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:50: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:51: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:52: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:53: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:54: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:55: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:56: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:57: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:58: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:59: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:60: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:61: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:62: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:63: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:64: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:65: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:66: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:67: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:68: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:69: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:70: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:71: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:72: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:73: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:74: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:75: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:76: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:77: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:78: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:79: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:80: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:81: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:82: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:83: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:84: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_1.csv:85: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:2: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:3: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:4: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:5: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:6: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:7: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:8: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:9: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:10: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:11: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:12: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:13: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:14: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:15: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:16: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:17: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:18: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:19: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:20: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:21: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:22: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:23: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:24: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:25: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:26: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:27: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:28: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:29: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:30: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:31: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:32: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:33: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:34: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:35: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:36: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:37: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:38: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:39: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:40: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:41: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:42: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:43: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:44: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:45: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:46: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:47: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:48: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:49: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:50: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:51: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:52: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:53: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:54: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:55: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:56: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:57: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:58: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:59: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:60: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:61: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:62: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:63: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:64: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:65: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:66: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:67: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:68: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:69: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:70: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:71: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:72: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:73: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:74: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:75: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:76: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:77: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:78: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:79: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:80: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:81: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:82: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:83: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:84: review_date must be YYYY-MM-DD", + "research\\stage1\\primary_outcome_review_reviewer_2.csv:85: review_date must be YYYY-MM-DD", + "GSHS::2023_MAR_GSHS_v01::mar_fez2023::raw_mh_attemptsui: valid final_decision required", + "GSHS::2023_MAR_GSHS_v01::mar_fez2023::raw_mh_attemptsui: human adjudicator identity and attestation required", + "GSHS::2023_MAR_GSHS_v01::mar_fez2023::raw_mh_considersui: valid final_decision required", + "GSHS::2023_MAR_GSHS_v01::mar_fez2023::raw_mh_considersui: human adjudicator identity and attestation required", + "GSHS::2023_MAR_GSHS_v01::mar_fez2023::raw_mh_plansui: valid final_decision required", + "GSHS::2023_MAR_GSHS_v01::mar_fez2023::raw_mh_plansui: human adjudicator identity and attestation required", + "GSHS::GHA_2022_GSHS_v01::gha_sek_tak2022::raw_mh_attemptsui: valid final_decision required", + "GSHS::GHA_2022_GSHS_v01::gha_sek_tak2022::raw_mh_attemptsui: human adjudicator identity and attestation required", + "GSHS::GHA_2022_GSHS_v01::gha_sek_tak2022::raw_mh_considersui: valid final_decision required", + "GSHS::GHA_2022_GSHS_v01::gha_sek_tak2022::raw_mh_considersui: human adjudicator identity and attestation required", + "GSHS::GHA_2022_GSHS_v01::gha_sek_tak2022::raw_mh_plansui: valid final_decision required", + "GSHS::GHA_2022_GSHS_v01::gha_sek_tak2022::raw_mh_plansui: human adjudicator identity and attestation required", + "GSHS::IND_2022_GSHS_v01::ind_jaipur_2022::raw_mh_attemptsui: valid final_decision required", + "GSHS::IND_2022_GSHS_v01::ind_jaipur_2022::raw_mh_attemptsui: human adjudicator identity and attestation required", + "GSHS::IND_2022_GSHS_v01::ind_jaipur_2022::raw_mh_considersui: valid final_decision required", + "GSHS::IND_2022_GSHS_v01::ind_jaipur_2022::raw_mh_considersui: human adjudicator identity and attestation required", + "GSHS::IND_2022_GSHS_v01::ind_jaipur_2022::raw_mh_plansui: valid final_decision required", + "GSHS::IND_2022_GSHS_v01::ind_jaipur_2022::raw_mh_plansui: human adjudicator identity and attestation required", + "GSHS::JAM_2023_GSHS_v01::jam_st_cath_2023::raw_mh_attemptsui: valid final_decision required", + "GSHS::JAM_2023_GSHS_v01::jam_st_cath_2023::raw_mh_attemptsui: human adjudicator identity and attestation required", + "GSHS::JAM_2023_GSHS_v01::jam_st_cath_2023::raw_mh_considersui: valid final_decision required", + "GSHS::JAM_2023_GSHS_v01::jam_st_cath_2023::raw_mh_considersui: human adjudicator identity and attestation required", + "GSHS::JAM_2023_GSHS_v01::jam_st_cath_2023::raw_mh_plansui: valid final_decision required", + "GSHS::JAM_2023_GSHS_v01::jam_st_cath_2023::raw_mh_plansui: human adjudicator identity and attestation required", + "GSHS::MNG_2023_GSHS_v01::mng2023::raw_mh_attemptsui: valid final_decision required", + "GSHS::MNG_2023_GSHS_v01::mng2023::raw_mh_attemptsui: human adjudicator identity and attestation required", + "GSHS::MNG_2023_GSHS_v01::mng2023::raw_mh_considersui: valid final_decision required", + "GSHS::MNG_2023_GSHS_v01::mng2023::raw_mh_considersui: human adjudicator identity and attestation required", + "GSHS::MNG_2023_GSHS_v01::mng2023::raw_mh_plansui: valid final_decision required", + "GSHS::MNG_2023_GSHS_v01::mng2023::raw_mh_plansui: human adjudicator identity and attestation required", + "GSHS::SLB_2023_GSHS_v01::slb_2023::raw_mh_attemptsui: valid final_decision required", + "GSHS::SLB_2023_GSHS_v01::slb_2023::raw_mh_attemptsui: human adjudicator identity and attestation required", + "GSHS::SLB_2023_GSHS_v01::slb_2023::raw_mh_considersui: valid final_decision required", + "GSHS::SLB_2023_GSHS_v01::slb_2023::raw_mh_considersui: human adjudicator identity and attestation required", + "GSHS::SLB_2023_GSHS_v01::slb_2023::raw_mh_plansui: valid final_decision required", + "GSHS::SLB_2023_GSHS_v01::slb_2023::raw_mh_plansui: human adjudicator identity and attestation required", + "GSHS::WLF_2023_GSHS_v01::wlf_2023::raw_mh_attemptsui: valid final_decision required", + "GSHS::WLF_2023_GSHS_v01::wlf_2023::raw_mh_attemptsui: human adjudicator identity and attestation required", + "GSHS::WLF_2023_GSHS_v01::wlf_2023::raw_mh_considersui: valid final_decision required", + "GSHS::WLF_2023_GSHS_v01::wlf_2023::raw_mh_considersui: human adjudicator identity and attestation required", + "GSHS::WLF_2023_GSHS_v01::wlf_2023::raw_mh_plansui: valid final_decision required", + "GSHS::WLF_2023_GSHS_v01::wlf_2023::raw_mh_plansui: human adjudicator identity and attestation required", + "NSDUH::2021::YUSUICTRY: valid final_decision required", + "NSDUH::2021::YUSUICTRY: human adjudicator identity and attestation required", + "NSDUH::2021::YUSUIPLN: valid final_decision required", + "NSDUH::2021::YUSUIPLN: human adjudicator identity and attestation required", + "NSDUH::2021::YUSUITHK: valid final_decision required", + "NSDUH::2021::YUSUITHK: human adjudicator identity and attestation required", + "NSDUH::2022::YUSUICTRY: valid final_decision required", + "NSDUH::2022::YUSUICTRY: human adjudicator identity and attestation required", + "NSDUH::2022::YUSUIPLN: valid final_decision required", + "NSDUH::2022::YUSUIPLN: human adjudicator identity and attestation required", + "NSDUH::2022::YUSUITHK: valid final_decision required", + "NSDUH::2022::YUSUITHK: human adjudicator identity and attestation required", + "NSDUH::2023::YUSUICTRY: valid final_decision required", + "NSDUH::2023::YUSUICTRY: human adjudicator identity and attestation required", + "NSDUH::2023::YUSUIPLN: valid final_decision required", + "NSDUH::2023::YUSUIPLN: human adjudicator identity and attestation required", + "NSDUH::2023::YUSUITHK: valid final_decision required", + "NSDUH::2023::YUSUITHK: human adjudicator identity and attestation required", + "NSDUH::2024::YUSUICTRY: valid final_decision required", + "NSDUH::2024::YUSUICTRY: human adjudicator identity and attestation required", + "NSDUH::2024::YUSUIPLN: valid final_decision required", + "NSDUH::2024::YUSUIPLN: human adjudicator identity and attestation required", + "NSDUH::2024::YUSUITHK: valid final_decision required", + "NSDUH::2024::YUSUITHK: human adjudicator identity and attestation required", + "YRBS::1991::Q19: valid final_decision required", + "YRBS::1991::Q19: human adjudicator identity and attestation required", + "YRBS::1991::Q20: valid final_decision required", + "YRBS::1991::Q20: human adjudicator identity and attestation required", + "YRBS::1991::Q21: valid final_decision required", + "YRBS::1991::Q21: human adjudicator identity and attestation required", + "YRBS::1993::Q24: valid final_decision required", + "YRBS::1993::Q24: human adjudicator identity and attestation required", + "YRBS::1993::Q25: valid final_decision required", + "YRBS::1993::Q25: human adjudicator identity and attestation required", + "YRBS::1993::Q26: valid final_decision required", + "YRBS::1993::Q26: human adjudicator identity and attestation required", + "YRBS::1995::Q22: valid final_decision required", + "YRBS::1995::Q22: human adjudicator identity and attestation required", + "YRBS::1995::Q23: valid final_decision required", + "YRBS::1995::Q23: human adjudicator identity and attestation required", + "YRBS::1995::Q24: valid final_decision required", + "YRBS::1995::Q24: human adjudicator identity and attestation required", + "YRBS::1997::Q22: valid final_decision required", + "YRBS::1997::Q22: human adjudicator identity and attestation required", + "YRBS::1997::Q23: valid final_decision required", + "YRBS::1997::Q23: human adjudicator identity and attestation required", + "YRBS::1997::Q24: valid final_decision required", + "YRBS::1997::Q24: human adjudicator identity and attestation required", + "YRBS::1999::Q23: valid final_decision required", + "YRBS::1999::Q23: human adjudicator identity and attestation required", + "YRBS::1999::Q24: valid final_decision required", + "YRBS::1999::Q24: human adjudicator identity and attestation required", + "YRBS::1999::Q25: valid final_decision required", + "YRBS::1999::Q25: human adjudicator identity and attestation required", + "YRBS::2001::Q24: valid final_decision required", + "YRBS::2001::Q24: human adjudicator identity and attestation required", + "YRBS::2001::Q25: valid final_decision required", + "YRBS::2001::Q25: human adjudicator identity and attestation required", + "YRBS::2001::Q26: valid final_decision required", + "YRBS::2001::Q26: human adjudicator identity and attestation required", + "YRBS::2003::Q24: valid final_decision required", + "YRBS::2003::Q24: human adjudicator identity and attestation required", + "YRBS::2003::Q25: valid final_decision required", + "YRBS::2003::Q25: human adjudicator identity and attestation required", + "YRBS::2003::Q26: valid final_decision required", + "YRBS::2003::Q26: human adjudicator identity and attestation required", + "YRBS::2005::Q24: valid final_decision required", + "YRBS::2005::Q24: human adjudicator identity and attestation required", + "YRBS::2005::Q25: valid final_decision required", + "YRBS::2005::Q25: human adjudicator identity and attestation required", + "YRBS::2005::Q26: valid final_decision required", + "YRBS::2005::Q26: human adjudicator identity and attestation required", + "YRBS::2007::Q24: valid final_decision required", + "YRBS::2007::Q24: human adjudicator identity and attestation required", + "YRBS::2007::Q25: valid final_decision required", + "YRBS::2007::Q25: human adjudicator identity and attestation required", + "YRBS::2007::Q26: valid final_decision required", + "YRBS::2007::Q26: human adjudicator identity and attestation required", + "YRBS::2009::Q24: valid final_decision required", + "YRBS::2009::Q24: human adjudicator identity and attestation required", + "YRBS::2009::Q25: valid final_decision required", + "YRBS::2009::Q25: human adjudicator identity and attestation required", + "YRBS::2009::Q26: valid final_decision required", + "YRBS::2009::Q26: human adjudicator identity and attestation required", + "YRBS::2011::Q25: valid final_decision required", + "YRBS::2011::Q25: human adjudicator identity and attestation required", + "YRBS::2011::Q26: valid final_decision required", + "YRBS::2011::Q26: human adjudicator identity and attestation required", + "YRBS::2011::Q27: valid final_decision required", + "YRBS::2011::Q27: human adjudicator identity and attestation required", + "YRBS::2013::Q27: valid final_decision required", + "YRBS::2013::Q27: human adjudicator identity and attestation required", + "YRBS::2013::Q28: valid final_decision required", + "YRBS::2013::Q28: human adjudicator identity and attestation required", + "YRBS::2013::Q29: valid final_decision required", + "YRBS::2013::Q29: human adjudicator identity and attestation required", + "YRBS::2015::Q27: valid final_decision required", + "YRBS::2015::Q27: human adjudicator identity and attestation required", + "YRBS::2015::Q28: valid final_decision required", + "YRBS::2015::Q28: human adjudicator identity and attestation required", + "YRBS::2015::Q29: valid final_decision required", + "YRBS::2015::Q29: human adjudicator identity and attestation required", + "YRBS::2017::Q26: valid final_decision required", + "YRBS::2017::Q26: human adjudicator identity and attestation required", + "YRBS::2017::Q27: valid final_decision required", + "YRBS::2017::Q27: human adjudicator identity and attestation required", + "YRBS::2017::Q28: valid final_decision required", + "YRBS::2017::Q28: human adjudicator identity and attestation required", + "YRBS::2019::Q26: valid final_decision required", + "YRBS::2019::Q26: human adjudicator identity and attestation required", + "YRBS::2019::Q27: valid final_decision required", + "YRBS::2019::Q27: human adjudicator identity and attestation required", + "YRBS::2019::Q28: valid final_decision required", + "YRBS::2019::Q28: human adjudicator identity and attestation required", + "YRBS::2021::Q26: valid final_decision required", + "YRBS::2021::Q26: human adjudicator identity and attestation required", + "YRBS::2021::Q27: valid final_decision required", + "YRBS::2021::Q27: human adjudicator identity and attestation required", + "YRBS::2021::Q28: valid final_decision required", + "YRBS::2021::Q28: human adjudicator identity and attestation required", + "YRBS::2023::Q27: valid final_decision required", + "YRBS::2023::Q27: human adjudicator identity and attestation required", + "YRBS::2023::Q28: valid final_decision required", + "YRBS::2023::Q28: human adjudicator identity and attestation required", + "YRBS::2023::Q29: valid final_decision required", + "YRBS::2023::Q29: human adjudicator identity and attestation required" + ], + "gate_1_human_review_complete": false +} diff --git a/research/stage1/populate_adjudication_table.py b/research/stage1/populate_adjudication_table.py new file mode 100644 index 0000000..d8882e4 --- /dev/null +++ b/research/stage1/populate_adjudication_table.py @@ -0,0 +1,102 @@ +"""Fill the machine-derivable columns of the primary-outcome adjudication table. + +reviewer_1_decision, reviewer_2_decision and conflict_reason are facts derived +from the two signed review packets, so they are filled here. Every adjudicator +field (identity, date, final_*, notes, attestation) is human attestation and is +left exactly as found -- this script never writes one and never overwrites a +non-empty value in one. + +Unlike build_human_review_packets.py, this script does not write the reviewer +packets. Those carry signatures and must not be regenerated. +""" + +from __future__ import annotations + +import csv +import hashlib +import json +from pathlib import Path + +STAGE1 = Path(__file__).resolve().parent +REVIEWER_1 = STAGE1 / "primary_outcome_review_reviewer_1.csv" +REVIEWER_2 = STAGE1 / "primary_outcome_review_reviewer_2.csv" +ADJUDICATION = STAGE1 / "primary_outcome_review_adjudication.csv" + +DERIVED = {"reviewer_1_decision", "reviewer_2_decision", "conflict_reason"} +# Mirrors validate_human_reviews.py: an item needs adjudication when the two +# decisions differ, or when reviewer_1 did not return a plain approve. +APPROVE = "approve" + + +def read(path: Path) -> list[dict[str, str]]: + with path.open(encoding="utf-8-sig", newline="") as handle: + return list(csv.DictReader(handle)) + + +def sha256(path: Path) -> str: + return hashlib.sha256(path.read_bytes()).hexdigest() + + +def conflict_reason(d1: str, d2: str) -> str: + if d1 != d2: + return ( + f"decisions differ: reviewer_1={d1}, reviewer_2={d2}; " + "adjudication required because the two decisions are not identical" + ) + return ( + f"both reviewers returned {d1}; adjudication required because " + "reviewer_1's decision is not a plain approve" + ) + + +def main() -> int: + before = {p: sha256(p) for p in (REVIEWER_1, REVIEWER_2)} + r1 = {r["item_version_id"]: r for r in read(REVIEWER_1)} + r2 = {r["item_version_id"]: r for r in read(REVIEWER_2)} + rows = read(ADJUDICATION) + fields = list(rows[0]) + + if set(r1) != set(r2) or set(r1) != {r["item_version_id"] for r in rows}: + raise SystemExit("item_version_id sets differ across the three files") + + protected_written = [] + filled = 0 + for row in rows: + item = row["item_version_id"] + d1, d2 = r1[item]["decision"], r2[item]["decision"] + needs = d1 != d2 or d1 != APPROVE + new = { + "reviewer_1_decision": d1, + "reviewer_2_decision": d2, + "conflict_reason": conflict_reason(d1, d2) if needs else "", + } + for key, value in new.items(): + if row[key] != value: + row[key] = value + filled += 1 + for key in fields: + if key not in DERIVED and key != "item_version_id" and row[key].strip(): + protected_written.append(f"{item}:{key}") + + with ADJUDICATION.open("w", encoding="utf-8-sig", newline="") as handle: + writer = csv.DictWriter(handle, fieldnames=fields) + writer.writeheader() + writer.writerows(rows) + + after = {p: sha256(p) for p in (REVIEWER_1, REVIEWER_2)} + if before != after: + raise SystemExit("FATAL: a signed reviewer packet changed; investigate before committing") + + summary = { + "rows": len(rows), + "derived_cells_written": filled, + "items_requiring_adjudication": sum(1 for r in rows if r["conflict_reason"]), + "existing_adjudicator_values_preserved": len(protected_written), + "signed_packets_unchanged": True, + } + print(json.dumps(summary, indent=2)) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/research/stage1/primary_outcome_review_adjudication.csv b/research/stage1/primary_outcome_review_adjudication.csv index 94ed8be..c4a2733 100644 --- a/research/stage1/primary_outcome_review_adjudication.csv +++ b/research/stage1/primary_outcome_review_adjudication.csv @@ -1,85 +1,85 @@ item_version_id,reviewer_1_decision,reviewer_2_decision,conflict_reason,adjudicator_name,adjudication_date,final_decision,final_question_text,final_construct,final_population,final_language,final_response_or_missing_rule,adjudication_notes,adjudicator_attestation -GSHS::2023_MAR_GSHS_v01::mar_fez2023::raw_mh_considersui,,,,,,,,,,,,, -GSHS::2023_MAR_GSHS_v01::mar_fez2023::raw_mh_plansui,,,,,,,,,,,,, -GSHS::2023_MAR_GSHS_v01::mar_fez2023::raw_mh_attemptsui,,,,,,,,,,,,, -GSHS::GHA_2022_GSHS_v01::gha_sek_tak2022::raw_mh_considersui,,,,,,,,,,,,, -GSHS::GHA_2022_GSHS_v01::gha_sek_tak2022::raw_mh_plansui,,,,,,,,,,,,, -GSHS::GHA_2022_GSHS_v01::gha_sek_tak2022::raw_mh_attemptsui,,,,,,,,,,,,, -GSHS::IND_2022_GSHS_v01::ind_jaipur_2022::raw_mh_considersui,,,,,,,,,,,,, -GSHS::IND_2022_GSHS_v01::ind_jaipur_2022::raw_mh_plansui,,,,,,,,,,,,, -GSHS::IND_2022_GSHS_v01::ind_jaipur_2022::raw_mh_attemptsui,,,,,,,,,,,,, -GSHS::JAM_2023_GSHS_v01::jam_st_cath_2023::raw_mh_considersui,,,,,,,,,,,,, -GSHS::JAM_2023_GSHS_v01::jam_st_cath_2023::raw_mh_plansui,,,,,,,,,,,,, -GSHS::JAM_2023_GSHS_v01::jam_st_cath_2023::raw_mh_attemptsui,,,,,,,,,,,,, -GSHS::MNG_2023_GSHS_v01::mng2023::raw_mh_considersui,,,,,,,,,,,,, -GSHS::MNG_2023_GSHS_v01::mng2023::raw_mh_plansui,,,,,,,,,,,,, -GSHS::MNG_2023_GSHS_v01::mng2023::raw_mh_attemptsui,,,,,,,,,,,,, -GSHS::SLB_2023_GSHS_v01::slb_2023::raw_mh_considersui,,,,,,,,,,,,, -GSHS::SLB_2023_GSHS_v01::slb_2023::raw_mh_plansui,,,,,,,,,,,,, -GSHS::SLB_2023_GSHS_v01::slb_2023::raw_mh_attemptsui,,,,,,,,,,,,, -GSHS::WLF_2023_GSHS_v01::wlf_2023::raw_mh_considersui,,,,,,,,,,,,, -GSHS::WLF_2023_GSHS_v01::wlf_2023::raw_mh_plansui,,,,,,,,,,,,, -GSHS::WLF_2023_GSHS_v01::wlf_2023::raw_mh_attemptsui,,,,,,,,,,,,, -YRBS::1991::Q19,,,,,,,,,,,,, -YRBS::1991::Q20,,,,,,,,,,,,, -YRBS::1991::Q21,,,,,,,,,,,,, -YRBS::1993::Q24,,,,,,,,,,,,, -YRBS::1993::Q25,,,,,,,,,,,,, -YRBS::1993::Q26,,,,,,,,,,,,, -YRBS::1995::Q22,,,,,,,,,,,,, -YRBS::1995::Q23,,,,,,,,,,,,, -YRBS::1995::Q24,,,,,,,,,,,,, -YRBS::1997::Q22,,,,,,,,,,,,, -YRBS::1997::Q23,,,,,,,,,,,,, -YRBS::1997::Q24,,,,,,,,,,,,, -YRBS::1999::Q23,,,,,,,,,,,,, -YRBS::1999::Q24,,,,,,,,,,,,, -YRBS::1999::Q25,,,,,,,,,,,,, -YRBS::2001::Q24,,,,,,,,,,,,, -YRBS::2001::Q25,,,,,,,,,,,,, -YRBS::2001::Q26,,,,,,,,,,,,, -YRBS::2003::Q24,,,,,,,,,,,,, -YRBS::2003::Q25,,,,,,,,,,,,, -YRBS::2003::Q26,,,,,,,,,,,,, -YRBS::2005::Q24,,,,,,,,,,,,, -YRBS::2005::Q25,,,,,,,,,,,,, -YRBS::2005::Q26,,,,,,,,,,,,, -YRBS::2007::Q24,,,,,,,,,,,,, -YRBS::2007::Q25,,,,,,,,,,,,, -YRBS::2007::Q26,,,,,,,,,,,,, -YRBS::2009::Q24,,,,,,,,,,,,, -YRBS::2009::Q25,,,,,,,,,,,,, -YRBS::2009::Q26,,,,,,,,,,,,, -YRBS::2011::Q25,,,,,,,,,,,,, -YRBS::2011::Q26,,,,,,,,,,,,, -YRBS::2011::Q27,,,,,,,,,,,,, -YRBS::2013::Q27,,,,,,,,,,,,, -YRBS::2013::Q28,,,,,,,,,,,,, -YRBS::2013::Q29,,,,,,,,,,,,, -YRBS::2015::Q27,,,,,,,,,,,,, -YRBS::2015::Q28,,,,,,,,,,,,, -YRBS::2015::Q29,,,,,,,,,,,,, -YRBS::2017::Q26,,,,,,,,,,,,, -YRBS::2017::Q27,,,,,,,,,,,,, -YRBS::2017::Q28,,,,,,,,,,,,, -YRBS::2019::Q26,,,,,,,,,,,,, -YRBS::2019::Q27,,,,,,,,,,,,, -YRBS::2019::Q28,,,,,,,,,,,,, -YRBS::2021::Q26,,,,,,,,,,,,, -YRBS::2021::Q27,,,,,,,,,,,,, -YRBS::2021::Q28,,,,,,,,,,,,, -YRBS::2023::Q27,,,,,,,,,,,,, -YRBS::2023::Q28,,,,,,,,,,,,, -YRBS::2023::Q29,,,,,,,,,,,,, -NSDUH::2021::YUSUITHK,,,,,,,,,,,,, -NSDUH::2021::YUSUIPLN,,,,,,,,,,,,, -NSDUH::2022::YUSUITHK,,,,,,,,,,,,, -NSDUH::2022::YUSUIPLN,,,,,,,,,,,,, -NSDUH::2023::YUSUITHK,,,,,,,,,,,,, -NSDUH::2023::YUSUIPLN,,,,,,,,,,,,, -NSDUH::2024::YUSUITHK,,,,,,,,,,,,, -NSDUH::2024::YUSUIPLN,,,,,,,,,,,,, -NSDUH::2021::YUSUICTRY,,,,,,,,,,,,, -NSDUH::2022::YUSUICTRY,,,,,,,,,,,,, -NSDUH::2023::YUSUICTRY,,,,,,,,,,,,, -NSDUH::2024::YUSUICTRY,,,,,,,,,,,,, +GSHS::2023_MAR_GSHS_v01::mar_fez2023::raw_mh_considersui,needs_source,approve_with_correction,"decisions differ: reviewer_1=needs_source, reviewer_2=approve_with_correction; adjudication required because the two decisions are not identical",,,,,,,,,, +GSHS::2023_MAR_GSHS_v01::mar_fez2023::raw_mh_plansui,needs_source,approve_with_correction,"decisions differ: reviewer_1=needs_source, reviewer_2=approve_with_correction; adjudication required because the two decisions are not identical",,,,,,,,,, +GSHS::2023_MAR_GSHS_v01::mar_fez2023::raw_mh_attemptsui,needs_source,approve_with_correction,"decisions differ: reviewer_1=needs_source, reviewer_2=approve_with_correction; adjudication required because the two decisions are not identical",,,,,,,,,, +GSHS::GHA_2022_GSHS_v01::gha_sek_tak2022::raw_mh_considersui,needs_source,approve_with_correction,"decisions differ: reviewer_1=needs_source, reviewer_2=approve_with_correction; adjudication required because the two decisions are not identical",,,,,,,,,, +GSHS::GHA_2022_GSHS_v01::gha_sek_tak2022::raw_mh_plansui,needs_source,approve_with_correction,"decisions differ: reviewer_1=needs_source, reviewer_2=approve_with_correction; adjudication required because the two decisions are not identical",,,,,,,,,, +GSHS::GHA_2022_GSHS_v01::gha_sek_tak2022::raw_mh_attemptsui,needs_source,approve_with_correction,"decisions differ: reviewer_1=needs_source, reviewer_2=approve_with_correction; adjudication required because the two decisions are not identical",,,,,,,,,, +GSHS::IND_2022_GSHS_v01::ind_jaipur_2022::raw_mh_considersui,needs_source,approve_with_correction,"decisions differ: reviewer_1=needs_source, reviewer_2=approve_with_correction; adjudication required because the two decisions are not identical",,,,,,,,,, +GSHS::IND_2022_GSHS_v01::ind_jaipur_2022::raw_mh_plansui,needs_source,approve_with_correction,"decisions differ: reviewer_1=needs_source, reviewer_2=approve_with_correction; adjudication required because the two decisions are not identical",,,,,,,,,, +GSHS::IND_2022_GSHS_v01::ind_jaipur_2022::raw_mh_attemptsui,needs_source,approve_with_correction,"decisions differ: reviewer_1=needs_source, reviewer_2=approve_with_correction; adjudication required because the two decisions are not identical",,,,,,,,,, +GSHS::JAM_2023_GSHS_v01::jam_st_cath_2023::raw_mh_considersui,needs_source,approve_with_correction,"decisions differ: reviewer_1=needs_source, reviewer_2=approve_with_correction; adjudication required because the two decisions are not identical",,,,,,,,,, +GSHS::JAM_2023_GSHS_v01::jam_st_cath_2023::raw_mh_plansui,needs_source,approve_with_correction,"decisions differ: reviewer_1=needs_source, reviewer_2=approve_with_correction; adjudication required because the two decisions are not identical",,,,,,,,,, +GSHS::JAM_2023_GSHS_v01::jam_st_cath_2023::raw_mh_attemptsui,needs_source,approve_with_correction,"decisions differ: reviewer_1=needs_source, reviewer_2=approve_with_correction; adjudication required because the two decisions are not identical",,,,,,,,,, +GSHS::MNG_2023_GSHS_v01::mng2023::raw_mh_considersui,needs_source,approve_with_correction,"decisions differ: reviewer_1=needs_source, reviewer_2=approve_with_correction; adjudication required because the two decisions are not identical",,,,,,,,,, +GSHS::MNG_2023_GSHS_v01::mng2023::raw_mh_plansui,needs_source,approve_with_correction,"decisions differ: reviewer_1=needs_source, reviewer_2=approve_with_correction; adjudication required because the two decisions are not identical",,,,,,,,,, +GSHS::MNG_2023_GSHS_v01::mng2023::raw_mh_attemptsui,needs_source,approve_with_correction,"decisions differ: reviewer_1=needs_source, reviewer_2=approve_with_correction; adjudication required because the two decisions are not identical",,,,,,,,,, +GSHS::SLB_2023_GSHS_v01::slb_2023::raw_mh_considersui,needs_source,needs_source,both reviewers returned needs_source; adjudication required because reviewer_1's decision is not a plain approve,,,,,,,,,, +GSHS::SLB_2023_GSHS_v01::slb_2023::raw_mh_plansui,needs_source,needs_source,both reviewers returned needs_source; adjudication required because reviewer_1's decision is not a plain approve,,,,,,,,,, +GSHS::SLB_2023_GSHS_v01::slb_2023::raw_mh_attemptsui,needs_source,needs_source,both reviewers returned needs_source; adjudication required because reviewer_1's decision is not a plain approve,,,,,,,,,, +GSHS::WLF_2023_GSHS_v01::wlf_2023::raw_mh_considersui,needs_source,approve_with_correction,"decisions differ: reviewer_1=needs_source, reviewer_2=approve_with_correction; adjudication required because the two decisions are not identical",,,,,,,,,, +GSHS::WLF_2023_GSHS_v01::wlf_2023::raw_mh_plansui,needs_source,approve_with_correction,"decisions differ: reviewer_1=needs_source, reviewer_2=approve_with_correction; adjudication required because the two decisions are not identical",,,,,,,,,, +GSHS::WLF_2023_GSHS_v01::wlf_2023::raw_mh_attemptsui,needs_source,approve_with_correction,"decisions differ: reviewer_1=needs_source, reviewer_2=approve_with_correction; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::1991::Q19,approve_with_correction,approve,"decisions differ: reviewer_1=approve_with_correction, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::1991::Q20,approve_with_correction,approve,"decisions differ: reviewer_1=approve_with_correction, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::1991::Q21,approve_with_correction,approve,"decisions differ: reviewer_1=approve_with_correction, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::1993::Q24,approve_with_correction,approve,"decisions differ: reviewer_1=approve_with_correction, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::1993::Q25,approve_with_correction,approve,"decisions differ: reviewer_1=approve_with_correction, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::1993::Q26,approve_with_correction,approve,"decisions differ: reviewer_1=approve_with_correction, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::1995::Q22,approve_with_correction,approve_with_correction,both reviewers returned approve_with_correction; adjudication required because reviewer_1's decision is not a plain approve,,,,,,,,,, +YRBS::1995::Q23,approve_with_correction,approve_with_correction,both reviewers returned approve_with_correction; adjudication required because reviewer_1's decision is not a plain approve,,,,,,,,,, +YRBS::1995::Q24,approve_with_correction,approve_with_correction,both reviewers returned approve_with_correction; adjudication required because reviewer_1's decision is not a plain approve,,,,,,,,,, +YRBS::1997::Q22,approve_with_correction,approve_with_correction,both reviewers returned approve_with_correction; adjudication required because reviewer_1's decision is not a plain approve,,,,,,,,,, +YRBS::1997::Q23,approve_with_correction,approve_with_correction,both reviewers returned approve_with_correction; adjudication required because reviewer_1's decision is not a plain approve,,,,,,,,,, +YRBS::1997::Q24,approve_with_correction,approve_with_correction,both reviewers returned approve_with_correction; adjudication required because reviewer_1's decision is not a plain approve,,,,,,,,,, +YRBS::1999::Q23,approve_with_correction,approve,"decisions differ: reviewer_1=approve_with_correction, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::1999::Q24,approve_with_correction,approve,"decisions differ: reviewer_1=approve_with_correction, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::1999::Q25,approve_with_correction,approve,"decisions differ: reviewer_1=approve_with_correction, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::2001::Q24,approve_with_correction,approve,"decisions differ: reviewer_1=approve_with_correction, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::2001::Q25,approve_with_correction,approve,"decisions differ: reviewer_1=approve_with_correction, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::2001::Q26,approve_with_correction,approve,"decisions differ: reviewer_1=approve_with_correction, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::2003::Q24,approve_with_correction,approve,"decisions differ: reviewer_1=approve_with_correction, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::2003::Q25,approve_with_correction,approve,"decisions differ: reviewer_1=approve_with_correction, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::2003::Q26,approve_with_correction,approve,"decisions differ: reviewer_1=approve_with_correction, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::2005::Q24,needs_source,approve,"decisions differ: reviewer_1=needs_source, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::2005::Q25,needs_source,approve,"decisions differ: reviewer_1=needs_source, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::2005::Q26,needs_source,approve,"decisions differ: reviewer_1=needs_source, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::2007::Q24,needs_source,approve,"decisions differ: reviewer_1=needs_source, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::2007::Q25,needs_source,approve,"decisions differ: reviewer_1=needs_source, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::2007::Q26,needs_source,approve,"decisions differ: reviewer_1=needs_source, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::2009::Q24,needs_source,approve,"decisions differ: reviewer_1=needs_source, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::2009::Q25,needs_source,approve,"decisions differ: reviewer_1=needs_source, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::2009::Q26,needs_source,approve,"decisions differ: reviewer_1=needs_source, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::2011::Q25,needs_source,approve,"decisions differ: reviewer_1=needs_source, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::2011::Q26,needs_source,approve,"decisions differ: reviewer_1=needs_source, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::2011::Q27,needs_source,approve,"decisions differ: reviewer_1=needs_source, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::2013::Q27,needs_source,approve,"decisions differ: reviewer_1=needs_source, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::2013::Q28,needs_source,approve,"decisions differ: reviewer_1=needs_source, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::2013::Q29,needs_source,approve,"decisions differ: reviewer_1=needs_source, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::2015::Q27,needs_source,approve,"decisions differ: reviewer_1=needs_source, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::2015::Q28,needs_source,approve,"decisions differ: reviewer_1=needs_source, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::2015::Q29,needs_source,approve,"decisions differ: reviewer_1=needs_source, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::2017::Q26,needs_source,approve,"decisions differ: reviewer_1=needs_source, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::2017::Q27,needs_source,approve,"decisions differ: reviewer_1=needs_source, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::2017::Q28,needs_source,approve,"decisions differ: reviewer_1=needs_source, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::2019::Q26,needs_source,approve,"decisions differ: reviewer_1=needs_source, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::2019::Q27,needs_source,approve,"decisions differ: reviewer_1=needs_source, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::2019::Q28,needs_source,approve,"decisions differ: reviewer_1=needs_source, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::2021::Q26,approve_with_correction,approve,"decisions differ: reviewer_1=approve_with_correction, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::2021::Q27,approve_with_correction,approve,"decisions differ: reviewer_1=approve_with_correction, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::2021::Q28,approve_with_correction,approve,"decisions differ: reviewer_1=approve_with_correction, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::2023::Q27,needs_source,approve,"decisions differ: reviewer_1=needs_source, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::2023::Q28,needs_source,approve,"decisions differ: reviewer_1=needs_source, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +YRBS::2023::Q29,needs_source,approve,"decisions differ: reviewer_1=needs_source, reviewer_2=approve; adjudication required because the two decisions are not identical",,,,,,,,,, +NSDUH::2021::YUSUITHK,approve_with_correction,approve_with_correction,both reviewers returned approve_with_correction; adjudication required because reviewer_1's decision is not a plain approve,,,,,,,,,, +NSDUH::2021::YUSUIPLN,approve_with_correction,approve_with_correction,both reviewers returned approve_with_correction; adjudication required because reviewer_1's decision is not a plain approve,,,,,,,,,, +NSDUH::2022::YUSUITHK,approve_with_correction,approve_with_correction,both reviewers returned approve_with_correction; adjudication required because reviewer_1's decision is not a plain approve,,,,,,,,,, +NSDUH::2022::YUSUIPLN,approve_with_correction,approve_with_correction,both reviewers returned approve_with_correction; adjudication required because reviewer_1's decision is not a plain approve,,,,,,,,,, +NSDUH::2023::YUSUITHK,approve_with_correction,approve_with_correction,both reviewers returned approve_with_correction; adjudication required because reviewer_1's decision is not a plain approve,,,,,,,,,, +NSDUH::2023::YUSUIPLN,approve_with_correction,approve_with_correction,both reviewers returned approve_with_correction; adjudication required because reviewer_1's decision is not a plain approve,,,,,,,,,, +NSDUH::2024::YUSUITHK,approve_with_correction,approve_with_correction,both reviewers returned approve_with_correction; adjudication required because reviewer_1's decision is not a plain approve,,,,,,,,,, +NSDUH::2024::YUSUIPLN,approve_with_correction,approve_with_correction,both reviewers returned approve_with_correction; adjudication required because reviewer_1's decision is not a plain approve,,,,,,,,,, +NSDUH::2021::YUSUICTRY,needs_source,needs_source,both reviewers returned needs_source; adjudication required because reviewer_1's decision is not a plain approve,,,,,,,,,, +NSDUH::2022::YUSUICTRY,needs_source,needs_source,both reviewers returned needs_source; adjudication required because reviewer_1's decision is not a plain approve,,,,,,,,,, +NSDUH::2023::YUSUICTRY,needs_source,needs_source,both reviewers returned needs_source; adjudication required because reviewer_1's decision is not a plain approve,,,,,,,,,, +NSDUH::2024::YUSUICTRY,needs_source,needs_source,both reviewers returned needs_source; adjudication required because reviewer_1's decision is not a plain approve,,,,,,,,,,