Required outputs:

1. cohort.csv
   - Must contain at least these columns:
     patient_id,sample_id,file_id,kras_expression_selected,kras_group,time_days,status,age_at_diagnosis_years,raw_stage,stage_group
   - sample_id must be the sample submitter_id (first 15 characters of the TCGA barcode, e.g. TCGA-05-4245-01A)
   - kras_expression_selected must use the tpm_unstranded metric
   - Must contain at least 400 rows
   - Must not contain NA in kras_expression_selected,kras_group,time_days,status,age_at_diagnosis_years,stage_group

2. km_plot.png
   - Valid non-trivial PNG

3. cox_results.json
   - Must include these top-level sections: cohort_summary, log_rank, cox_model, ph_test
   - cohort_summary must contain: n_patients, n_events, n_kras_high, n_kras_low, median_kras_expression
   - log_rank must contain: test_statistic (chi-squared value), p_value
   - cox_model must contain a coefficients dict keyed by variable name:
     keys: kras_group_high, age_at_diagnosis_years, stage_group_advanced
     each value must contain: hazard_ratio, p_value, ci_lower_95, ci_upper_95
   - ph_test: structure is flexible

4. analysis.R
   - Must clearly encode the intended TCGA-LUAD download and survival-analysis workflow
