[
  {
    "task_no": "PT-1001",
    "project_code": "GAME-A",
    "task_name_raw": "load_orders_daily",
    "operator_raw": "PythonOperator",
    "body_text": "SELECT * FROM raw.orders WHERE dt = '{{ ds }}'",
    "dataset_name": "orders",
    "upstream_task_no": null
  },
  {
    "task_no": "PT-1002",
    "project_code": "GAME-A",
    "task_name_raw": "mask_user_email",
    "operator_raw": "PythonOperator",
    "body_text": "UPDATE stg.users SET email = sha2(email, 256)",
    "dataset_name": "users",
    "upstream_task_no": "PT-1001"
  },
  {
    "task_no": "PT-1003",
    "project_code": "GAME-A",
    "task_name_raw": "push_to_gamecorp_bucket",
    "operator_raw": "python_operator",
    "body_text": "aws s3 cp out/ s3://gamecorp-prod-dw/daily/ --profile gamecorp-fde",
    "dataset_name": null,
    "upstream_task_no": "PT-1002"
  },
  {
    "task_no": "PT-1004",
    "project_code": "MED-B",
    "task_name_raw": "load_orders_daily",
    "operator_raw": "PythonOperator",
    "body_text": "SELECT * FROM raw.orders WHERE dt = '{{ ds }}'",
    "dataset_name": "orders",
    "upstream_task_no": null
  },
  {
    "task_no": "PT-1005",
    "project_code": "MED-B",
    "task_name_raw": "normalize_dept_code",
    "operator_raw": "PythonOperator",
    "body_text": "SELECT dept, upper(trim(dept)) AS dept_code FROM raw.visits",
    "dataset_name": "visits",
    "upstream_task_no": "PT-1004"
  },
  {
    "task_no": "PT-1006",
    "project_code": "MED-B",
    "task_name_raw": "call_medcenter_hl7_api",
    "operator_raw": "HttpOperator",
    "body_text": "GET https://api.medcenter.co.kr/v2/hl7?tenant=medcenter-01",
    "dataset_name": null,
    "upstream_task_no": "PT-1005"
  },
  {
    "task_no": "PT-1007",
    "project_code": "MFG-C",
    "task_name_raw": "parse_sensor_csv",
    "operator_raw": "PythonOperator",
    "body_text": "pd.read_csv(path, encoding='cp949', names=SENSOR_COLS)",
    "dataset_name": "sensors",
    "upstream_task_no": null
  },
  {
    "task_no": "PT-1008",
    "project_code": "MFG-C",
    "task_name_raw": "resample_to_hourly",
    "operator_raw": "PythonOperator",
    "body_text": "df.set_index('ts').resample('1H').mean()",
    "dataset_name": "sensors",
    "upstream_task_no": "PT-1007"
  },
  {
    "task_no": "PT-1009",
    "project_code": "MFG-C",
    "task_name_raw": "train_anomaly_model",
    "operator_raw": "SparkSubmitOperator",
    "body_text": "spark-submit --master yarn jobs/anomaly_fit.py",
    "dataset_name": "sensors",
    "upstream_task_no": "PT-1008"
  },
  {
    "task_no": "PT-1010",
    "project_code": "FIN-D",
    "task_name_raw": "load_orders_daily",
    "operator_raw": "python_operator",
    "body_text": "SELECT * FROM raw.orders WHERE dt = '{{ ds }}'",
    "dataset_name": "orders",
    "upstream_task_no": null
  },
  {
    "task_no": "PT-1011",
    "project_code": "FIN-D",
    "task_name_raw": "send_report_mail",
    "operator_raw": "EmailOperator",
    "body_text": null,
    "dataset_name": null,
    "upstream_task_no": "PT-1010"
  },
  {
    "task_no": "PT-1012",
    "project_code": "FIN-D",
    "task_name_raw": "apply_fincorp_fx_rate",
    "operator_raw": "PythonOperator",
    "body_text": "rate = FX['KRW'] * 1.0032  # fincorp 계약 환율 2026-01 고시",
    "dataset_name": null,
    "upstream_task_no": "PT-1010"
  }
]