Charge Boundary Routing I
Phase 2 — Bridge Ladder Generation Report
phase2_bridge_ladder_generation_report.txt

Generated: 2026-06-15

Purpose
-------
Generate bridge ladders for Phase 2 cross-layer tests:

    A <-> B
    B <-> C
    C <-> D
    A <-> B <-> C
    B <-> C <-> D

These ladders test where charge-route coherence first appears.

Input
-----
    data\derived\charge_boundary_phase1_combined.csv

Outputs
-------
    ladders\phase2_bridges
    ladders\phase2_bridges\one_column
    ladders\phase2_bridges\diagnostics

Layer D Rule
------------
Bridges containing Layer D skip signed_charge and absolute_charge. Layer D participates only through boundary_route_coordinate, closure_class_code, closure_state_code, and route_class_code.

Source Layer Counts
-------------------
    A: 14
    B: 12
    C: 10
    D: 4

Bridge Diagnostics
------------------

AB | A <-> B | signed_charge
    status: OK
    row_count: 26
    unique_value_count: 7
    layer_counts: {'A': 14, 'B': 12}
    values: [-1.0, -0.666666666667, -0.333333333333, 0.0, 0.333333333333, 0.666666666667, 1.0]

AB | A <-> B | absolute_charge
    status: OK
    row_count: 26
    unique_value_count: 4
    layer_counts: {'A': 14, 'B': 12}
    values: [0.0, 0.333333333333, 0.666666666667, 1.0]

AB | A <-> B | boundary_route_coordinate
    status: OK
    row_count: 26
    unique_value_count: 3
    layer_counts: {'A': 14, 'B': 12}
    values: [0.0, 0.25, 0.5]

AB | A <-> B | closure_class_code
    status: OK
    row_count: 26
    unique_value_count: 3
    layer_counts: {'A': 14, 'B': 12}
    values: [0.0, 1.0, 2.0]

AB | A <-> B | closure_state_code
    status: OK
    row_count: 26
    unique_value_count: 2
    layer_counts: {'A': 14, 'B': 12}
    values: [0.0, 1.0]

AB | A <-> B | route_class_code
    status: OK
    row_count: 26
    unique_value_count: 2
    layer_counts: {'A': 14, 'B': 12}
    values: [0.0, 1.0]

BC | B <-> C | signed_charge
    status: OK
    row_count: 22
    unique_value_count: 8
    layer_counts: {'C': 10, 'B': 12}
    values: [-1.0, -0.666666666667, -0.333333333333, 0.0, 0.333333333333, 0.666666666667, 1.0, 2.0]

BC | B <-> C | absolute_charge
    status: OK
    row_count: 22
    unique_value_count: 5
    layer_counts: {'C': 10, 'B': 12}
    values: [0.0, 0.333333333333, 0.666666666667, 1.0, 2.0]

BC | B <-> C | boundary_route_coordinate
    status: OK
    row_count: 22
    unique_value_count: 3
    layer_counts: {'B': 12, 'C': 10}
    values: [0.5, 0.75, 1.0]

BC | B <-> C | closure_class_code
    status: OK
    row_count: 22
    unique_value_count: 3
    layer_counts: {'B': 12, 'C': 10}
    values: [2.0, 3.0, 4.0]

BC | B <-> C | closure_state_code
    status: OK
    row_count: 22
    unique_value_count: 2
    layer_counts: {'C': 10, 'B': 12}
    values: [0.0, 1.0]

BC | B <-> C | route_class_code
    status: OK
    row_count: 22
    unique_value_count: 2
    layer_counts: {'B': 12, 'C': 10}
    values: [1.0, 2.0]

CD | C <-> D | signed_charge
    status: SKIPPED
    reason: N/A: bridge includes Layer D; Layer D is a boundary-absence / constraint layer and should not be forced into signed/absolute charge ladders.
    row_count: 0
    unique_value_count: 0
    layer_counts: {}
    values: []

CD | C <-> D | absolute_charge
    status: SKIPPED
    reason: N/A: bridge includes Layer D; Layer D is a boundary-absence / constraint layer and should not be forced into signed/absolute charge ladders.
    row_count: 0
    unique_value_count: 0
    layer_counts: {}
    values: []

CD | C <-> D | boundary_route_coordinate
    status: OK
    row_count: 14
    unique_value_count: 6
    layer_counts: {'C': 10, 'D': 4}
    values: [0.75, 1.0, 1.25, 1.5, 1.75, 2.0]

CD | C <-> D | closure_class_code
    status: OK
    row_count: 14
    unique_value_count: 6
    layer_counts: {'C': 10, 'D': 4}
    values: [3.0, 4.0, 5.0, 6.0, 7.0, 8.0]

CD | C <-> D | closure_state_code
    status: OK
    row_count: 14
    unique_value_count: 4
    layer_counts: {'C': 10, 'D': 4}
    values: [0.0, 2.0, 3.0, 4.0]

CD | C <-> D | route_class_code
    status: OK
    row_count: 14
    unique_value_count: 4
    layer_counts: {'C': 10, 'D': 4}
    values: [2.0, 3.0, 4.0, 5.0]

ABC | A <-> B <-> C | signed_charge
    status: OK
    row_count: 36
    unique_value_count: 8
    layer_counts: {'A': 14, 'C': 10, 'B': 12}
    values: [-1.0, -0.666666666667, -0.333333333333, 0.0, 0.333333333333, 0.666666666667, 1.0, 2.0]

ABC | A <-> B <-> C | absolute_charge
    status: OK
    row_count: 36
    unique_value_count: 5
    layer_counts: {'A': 14, 'C': 10, 'B': 12}
    values: [0.0, 0.333333333333, 0.666666666667, 1.0, 2.0]

ABC | A <-> B <-> C | boundary_route_coordinate
    status: OK
    row_count: 36
    unique_value_count: 5
    layer_counts: {'A': 14, 'B': 12, 'C': 10}
    values: [0.0, 0.25, 0.5, 0.75, 1.0]

ABC | A <-> B <-> C | closure_class_code
    status: OK
    row_count: 36
    unique_value_count: 5
    layer_counts: {'A': 14, 'B': 12, 'C': 10}
    values: [0.0, 1.0, 2.0, 3.0, 4.0]

ABC | A <-> B <-> C | closure_state_code
    status: OK
    row_count: 36
    unique_value_count: 2
    layer_counts: {'A': 14, 'C': 10, 'B': 12}
    values: [0.0, 1.0]

ABC | A <-> B <-> C | route_class_code
    status: OK
    row_count: 36
    unique_value_count: 3
    layer_counts: {'A': 14, 'B': 12, 'C': 10}
    values: [0.0, 1.0, 2.0]

BCD | B <-> C <-> D | signed_charge
    status: SKIPPED
    reason: N/A: bridge includes Layer D; Layer D is a boundary-absence / constraint layer and should not be forced into signed/absolute charge ladders.
    row_count: 0
    unique_value_count: 0
    layer_counts: {}
    values: []

BCD | B <-> C <-> D | absolute_charge
    status: SKIPPED
    reason: N/A: bridge includes Layer D; Layer D is a boundary-absence / constraint layer and should not be forced into signed/absolute charge ladders.
    row_count: 0
    unique_value_count: 0
    layer_counts: {}
    values: []

BCD | B <-> C <-> D | boundary_route_coordinate
    status: OK
    row_count: 26
    unique_value_count: 7
    layer_counts: {'B': 12, 'C': 10, 'D': 4}
    values: [0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0]

BCD | B <-> C <-> D | closure_class_code
    status: OK
    row_count: 26
    unique_value_count: 7
    layer_counts: {'B': 12, 'C': 10, 'D': 4}
    values: [2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0]

BCD | B <-> C <-> D | closure_state_code
    status: OK
    row_count: 26
    unique_value_count: 5
    layer_counts: {'C': 10, 'B': 12, 'D': 4}
    values: [0.0, 1.0, 2.0, 3.0, 4.0]

BCD | B <-> C <-> D | route_class_code
    status: OK
    row_count: 26
    unique_value_count: 5
    layer_counts: {'B': 12, 'C': 10, 'D': 4}
    values: [1.0, 2.0, 3.0, 4.0, 5.0]

Recommended First Run
---------------------
Start with the B <-> C bridge because it tests the central physical route:

    confined fractional coordinates -> composite closures

Upload the one-column BC files first to STRUC-PERC-I, then STRUC-I.

Do not begin with C <-> D until B <-> C is checked, because Layer D is
a boundary-marker layer and only becomes meaningful through a bridge.
