schema_version: gas_migration_wave1.v1
generated_at: '2026-06-10'
playbook_ref: suggest/quant_engine_refactor_playbook_v1.yaml#P5-T01
total_findings: 103
wave: 1
wave_size: 25
remaining_waves: 4
wave1_status: IN_PROGRESS

classification_guide:
  ADAPTER_OK: GAS reads Python-computed value and passes to sheet/next step. No business logic.
  MIGRATE_TO_PYTHON: GAS computes a score/decision that should live in Python.
  DELETE_DUPLICATE: Logic already exists in Python; GAS version is redundant.
  COMMENT_FALSE_POSITIVE: Comment or doc line flagged by keyword match, not actual logic.

wave1_items:
  - idx: 0
    file: gas_apex_alpha_watch.gs
    line: 174
    text: "macro_risk_score: score,"
    classification: ADAPTER_OK
    rationale: Assembling output object from Python-provided score, not computing it.
    python_path: null
    formula_id: null

  - idx: 1
    file: gas_apex_alpha_watch.gs
    line: 223
    text: "var totalScore = mesResult.macro_risk_score || 0;"
    classification: ADAPTER_OK
    rationale: Reading macro_risk_score from Python MES result JSON.
    python_path: null
    formula_id: null

  - idx: 2
    file: gas_apex_runtime_core.gs
    line: 34
    text: "hApex.macro_risk_score = mesResult.macro_risk_score;"
    classification: ADAPTER_OK
    rationale: Passing Python result field through to apex harness struct.
    python_path: null
    formula_id: null

  - idx: 3
    file: gas_apex_runtime_core.gs
    line: 103
    text: "// macro_risk_score (max 100)"
    classification: COMMENT_FALSE_POSITIVE
    rationale: Comment line describing the field; contains keyword but no logic.
    python_path: null
    formula_id: null

  - idx: 4
    file: gas_apex_runtime_core.gs
    line: 153
    text: "macro_risk_score: macroRiskScore,"
    classification: ADAPTER_OK
    rationale: Assembling output packet with Python-derived score.
    python_path: null
    formula_id: null

  - idx: 5
    file: gas_apex_runtime_core.gs
    line: 185
    text: "var macroRiskScore = toNumber_(mes.macro_risk_score) || 0;"
    classification: ADAPTER_OK
    rationale: Reads Python result; toNumber_ is a type coercion helper, not business logic.
    python_path: null
    formula_id: null

  - idx: 6
    file: gas_apex_runtime_core.gs
    line: 237
    text: "micro_risk_score: l1,"
    classification: ADAPTER_OK
    rationale: Assembling risk level packet from Python-provided values.
    python_path: null
    formula_id: null

  - idx: 7
    file: gas_apex_runtime_core.gs
    line: 238
    text: "macro_risk_score_normalized: l2,"
    classification: ADAPTER_OK
    rationale: Assembling risk level packet; normalized value from Python.
    python_path: null
    formula_id: null

  - idx: 8
    file: gas_apex_runtime_core.gs
    line: 239
    text: "global_risk_score: l3,"
    classification: ADAPTER_OK
    rationale: Assembling risk level packet from Python-provided values.
    python_path: null
    formula_id: null

  - idx: 9
    file: gas_apex_runtime_core.gs
    line: 240
    text: "event_risk_score: l4,"
    classification: ADAPTER_OK
    rationale: Assembling risk level packet from Python-provided values.
    python_path: null
    formula_id: null

  - idx: 10
    file: gas_data_collect.gs
    line: 1038
    text: "Number.isFinite(alpha[\"late_chase_risk_score\"]) ? alpha[\"late_chase_risk_score\"]"
    classification: ADAPTER_OK
    rationale: Reading late_chase_risk_score from Python alpha JSON; conditional is null-guard.
    python_path: null
    formula_id: null

  - idx: 11
    file: gas_data_collect.gs
    line: 1068
    text: '"Volume_Ratio_5D","Flow_Credit","RSI14_At_Entry","Late_Chase_Risk_Score"'
    classification: ADAPTER_OK
    rationale: Column name list for sheet header; no computation.
    python_path: null
    formula_id: null

  - idx: 12
    file: gas_data_collect.gs
    line: 1069
    text: '"Breakout_Score","Rebound_Preservation_Score","Setup_Decision","Exit_Reason"'
    classification: ADAPTER_OK
    rationale: Column name list for sheet header; no computation.
    python_path: null
    formula_id: null

  - idx: 13
    file: gas_data_collect.gs
    line: 2016
    text: "// TAKE_PROFIT_LADDER_V1"
    classification: COMMENT_FALSE_POSITIVE
    rationale: Comment referencing a spec item; no code logic.
    python_path: null
    formula_id: null

  - idx: 14
    file: gas_data_collect.gs
    line: 2036
    text: '"Final_Action","Action_Priority","Priority_Score","Final_Rank","Decision_Source"'
    classification: ADAPTER_OK
    rationale: Column name list for sheet header; no computation.
    python_path: null
    formula_id: null

  - idx: 15
    file: gas_data_collect.gs
    line: 2704
    text: "// entry sizing, breakout/anti-climax/leader/RW gates,"
    classification: COMMENT_FALSE_POSITIVE
    rationale: Documentation comment describing Python-computed fields to be collected.
    python_path: null
    formula_id: null

  - idx: 16
    file: gas_data_collect.gs
    line: 2894
    text: "// TAKE_PROFIT_LADDER_V1"
    classification: COMMENT_FALSE_POSITIVE
    rationale: Section comment; no logic.
    python_path: null
    formula_id: null

  - idx: 17
    file: gas_data_collect.gs
    line: 2986
    text: "// Decision: F1-F3 timing, sell decision, allowed/final action"
    classification: COMMENT_FALSE_POSITIVE
    rationale: Section comment; no logic.
    python_path: null
    formula_id: null

  - idx: 18
    file: gas_data_collect.gs
    line: 3178
    text: '"TAKE_PROFIT_TIER1":"TP1 description"'
    classification: ADAPTER_OK
    rationale: Label map for sheet display; references a Python decision value, not computing it.
    python_path: null
    formula_id: null

  - idx: 19
    file: gas_data_collect.gs
    line: 3502
    text: '"Candidate_Quality_Grade","T1_Forced_Sell_Risk_Score"'
    classification: ADAPTER_OK
    rationale: Column name list; no computation.
    python_path: null
    formula_id: null

  - idx: 20
    file: gas_data_collect.gs
    line: 3602
    text: "lateChaseRiskScore: sellRow_ ? sellRow_[\"Late_Chase_Risk_Score\"] : \"\","
    classification: ADAPTER_OK
    rationale: Reading Python-computed Late_Chase_Risk_Score from sheet row; null-safe read.
    python_path: null
    formula_id: null

  - idx: 21
    file: gas_data_collect.gs
    line: 3603
    text: "distributionRiskScore: sellRow_ ? sellRow_[\"Distribution_Risk_Score\"] : \"\","
    classification: ADAPTER_OK
    rationale: Reading Python-computed Distribution_Risk_Score from sheet row; null-safe read.
    python_path: null
    formula_id: null

  - idx: 22
    file: gas_data_collect.gs
    line: 3746
    text: '"Candidate_Quality_Grade","T1_Forced_Sell_Risk_Score"'
    classification: ADAPTER_OK
    rationale: Column name list; no computation.
    python_path: null
    formula_id: null

  - idx: 23
    file: gas_data_feed.gs
    line: 186
    text: "SP_TAKE_PROFIT: 10, // Profit_Pct >= 10%"
    classification: MIGRATE_TO_PYTHON
    rationale: Threshold constant defined in GAS; should be in spec/calibration_registry.yaml.
    python_path: spec/calibration_registry.yaml
    formula_id: TAKE_PROFIT_LADDER_V2
    migration_action: Add to calibration_registry.yaml as threshold id=SP_TAKE_PROFIT value=10 source=SPEC_DERIVED.

  - idx: 24
    file: gas_data_feed.gs
    line: 559
    text: "// sell_signal_priority level 2: REGIME_RISK_OFF (spec/exit/stop_loss.yaml)"
    classification: COMMENT_FALSE_POSITIVE
    rationale: Comment citing spec file; no business logic.
    python_path: null
    formula_id: null

wave2_preview:
  - idx: 25
    file: gas_data_feed.gs
    line: 656
    tentative_classification: MIGRATE_TO_PYTHON
    text: "priceBasis = TAKE_PROFIT_TIER2_PRICE fallback"
  - idx: 55
    file: gas_data_feed.gs
    line: 6688
    tentative_classification: DELETE_DUPLICATE
    text: "distribution_risk_score = Math.min(100, Math.max(0, score))"
  - idx: 57
    file: gas_data_feed.gs
    line: 6774
    tentative_classification: DELETE_DUPLICATE
    text: "late_chase_risk_score = Math.min(100, Math.max(0, Math.round(lateChaseRisk)))"

wave1_summary:
  ADAPTER_OK: 17
  COMMENT_FALSE_POSITIVE: 7
  MIGRATE_TO_PYTHON: 1
  DELETE_DUPLICATE: 0
  total_wave1: 25

wave1_action_items:
  - id: SP_TAKE_PROFIT_SPEC_MIGRATION
    type: SPEC_REGISTRATION
    file: spec/calibration_registry.yaml
    action: Register SP_TAKE_PROFIT=10 as threshold_id with source=SPEC_DERIVED, owner_formula=TAKE_PROFIT_LADDER_V2
    status: TODO

remaining_findings_classification:
  note: Wave 2-4 will address the remaining 78 findings
  high_priority:
    - gas_data_feed L6688 distribution_risk_score computation (DELETE_DUPLICATE - Python has DISTRIBUTION_RISK_SCORE_V1)
    - gas_data_feed L6774 late_chase_risk_score computation (DELETE_DUPLICATE - Python has late_chase_risk_score formula)
    - gas_data_feed L1577 score += THRESHOLDS["SP_TAKE_PROFIT"] (MIGRATE_TO_PYTHON - threshold scoring)
    - gas_data_feed L656-683 priceBasis fallback logic (MIGRATE_TO_PYTHON - price determination)
    - gas_data_feed L5920 STOP_LOSS decision (DELETE_DUPLICATE - Python has stop_loss logic)
