---
title: "Calypso test report"
author: "auto-generated (tests/conftest.py)"
date: today
date-format: "YYYY-MM-DD HH:mm"
format:
  html:
    toc: true
    toc-depth: 3
    toc-location: left
    code-fold: true
    code-tools: true
    theme:
      light: cosmo
      dark: darkly
    embed-resources: true
  gfm:
    preview-mode: raw
mermaid:
  theme: default
execute:
  echo: false
  warning: false
---

> Auto-generated by `tests/conftest.py::pytest_sessionfinish`.
> Pasteable directly in a GitHub issue/PR (Mermaid blocks render natively).

## Status global

> [!WARNING]
> ⚠️ **PARTIAL** — 14 échec(s), 34/70 passent (49 %)

| résultat | nombre |
|---|---:|
| ✅ passed | 34 |
| ❌ failed | 14 |
| ⏭️ skipped | 3 |
| ⚠️ xfailed | 19 |
| **total** | **70** |


## Pipeline — où ça casse

Le pipeline ci-dessous trace le flux logique GSM Calypso, étape par étape.
Chaque étape est colorée selon le ratio de tests qui passent. **Si une étape
est rouge (0% pass), c'est le premier blocker** — tout ce qui vient après
ne peut pas être validé tant qu'elle n'est pas verte.

```{mermaid}
graph LR
  classDef pass    fill:#bef5b1,stroke:#1f7a1f,color:#0a3d0a;
  classDef partial fill:#fde79c,stroke:#b07a00,color:#3a2c00;
  classDef fail    fill:#fbb4b4,stroke:#a31a1a,color:#5a0000;
  classDef skip    fill:#e0e0e0,stroke:#6a6a6a,color:#333;
  classDef break_  fill:#ff5252,stroke:#990000,color:#fff,stroke-width:3px;
  P_Infra["Infra<br/>5/5"]
  class P_Infra pass;
  P_DSP["DSP<br/>10/20"]
  class P_DSP partial;
  P_Infra --> P_DSP
  P_L1_data["L1-data<br/>4/7"]
  class P_L1_data partial;
  P_DSP --> P_L1_data
  P_L1_ctrl["L1-ctrl<br/>2/8"]
  class P_L1_ctrl partial;
  P_L1_data --> P_L1_ctrl
  P_NDB["NDB<br/>9/19"]
  class P_NDB partial;
  P_L1_ctrl --> P_NDB
  P_ARM_feedback["ARM-feedback<br/>0/2"]
  class P_ARM_feedback fail;
  P_NDB --> P_ARM_feedback
  P_ARM_feedback -.->|🛑| BREAK_ARM_feedback["BREAK HERE<br/>ARM-feedback 0% pass"]
  class BREAK_ARM_feedback break_;
  P_L3_MM["L3-MM<br/>0/5"]
  class P_L3_MM fail;
  P_ARM_feedback --> P_L3_MM
  P_Mgmt["Mgmt<br/>3/3"]
  class P_Mgmt pass;
  P_L3_MM --> P_Mgmt
  P_Summary["Summary<br/>1/1"]
  class P_Summary pass;
  P_Mgmt --> P_Summary
```

➡️ **Première rupture : `ARM-feedback`** (0/2 tests passent).

Les étapes jusqu'à `Infra` sont OK ; le bug à investiguer est dans la transition `Infra` → `ARM-feedback`.

## Blockers

**14 test(s) en échec** :

🔴 **1. `test_l1ctl_data_ind_received`** — Milestone / L1-ctrl — marker(s): milestone_l1ctl — durée 0.16s
  - `test_calypso_milestones.py::test_l1ctl_data_ind_received`
🔻 **2. `test_l1ctl_data_ind_rate_vs_alc`** — Runtime / L1-ctrl — marker(s): runtime_l1ctl — durée 0.24s
  - `test_run_observability.py::test_l1ctl_data_ind_rate_vs_alc`
🔻 **3. `test_l1ctl_data_ind_received`** — Runtime / L1-ctrl — marker(s): runtime_l1ctl — durée 0.17s
  - `test_run_observability.py::test_l1ctl_data_ind_received`
🔻 **4. `test_inject_a_cd_pattern_23B`** — Injection / NDB — marker(s): inject_frames — durée 0.33s
  - `test_inject_frames.py::test_inject_a_cd_pattern_23B`
🔻 **5. `test_inject_a_cd_pattern_30B`** — Injection / NDB — marker(s): inject_frames — durée 0.33s
  - `test_inject_frames.py::test_inject_a_cd_pattern_30B`
🔻 **6. `test_inject_d_task[28-1]`** — Injection / NDB — marker(s): inject_frames,parametrize — durée 0.04s
  - `test_inject_frames.py::test_inject_d_task[28-1]`
🔻 **7. `test_inject_fbsb_fb_found`** — Injection / NDB — marker(s): inject_frames — durée 0.62s
  - `test_inject_frames.py::test_inject_fbsb_fb_found`
🔻 **8. `test_inject_si[1]`** — Injection / NDB — marker(s): inject_frames,parametrize — durée 0.33s
  - `test_inject_frames.py::test_inject_si[1]`
🔻 **9. `test_inject_si[2]`** — Injection / NDB — marker(s): inject_frames,parametrize — durée 0.33s
  - `test_inject_frames.py::test_inject_si[2]`
🔻 **10. `test_inject_si[3]`** — Injection / NDB — marker(s): inject_frames,parametrize — durée 0.33s
  - `test_inject_frames.py::test_inject_si[3]`
🔻 **11. `test_inject_si[4]`** — Injection / NDB — marker(s): inject_frames,parametrize — durée 0.33s
  - `test_inject_frames.py::test_inject_si[4]`
🔻 **12. `test_inject_si[5]`** — Injection / NDB — marker(s): inject_frames,parametrize — durée 0.37s
  - `test_inject_frames.py::test_inject_si[5]`
🔻 **13. `test_inject_si[6]`** — Injection / NDB — marker(s): inject_frames,parametrize — durée 0.33s
  - `test_inject_frames.py::test_inject_si[6]`
🔻 **14. `test_efficacy_arm_reads_d_fb_det_1`** — Injection / ARM-feedback — marker(s): inject_efficacy,inject_frames — durée 3.15s
  - `test_inject_frames.py::test_efficacy_arm_reads_d_fb_det_1`

## Couches — ce qui marche, ce qui casse

### ✅ `Infra` — 5/5
Tous les tests passent dans cette couche.

### 🟡 `DSP` — 10/20
⏭️ **Skipped :** `test_fb0_att_nonzero`, `test_synth_zero_path_active`, `test_c54x_interrupt_ex_called_nonzero`, `test_isr_entered_implies_rete`, `test_no_pending_irq_gated`, `test_rxdoneflag_no_longer_blocks`, `test_d_fb_det_pattern_unchanged`, `test_interrupt_ex_called_counter_exposed`, `test_isr_entered_matches_rete`, `test_no_pending_irq_gating`
⚠️ **xfail :** `test_fb0_att_nonzero`, `test_c54x_interrupt_ex_called_nonzero`, `test_isr_entered_implies_rete`, `test_no_pending_irq_gated`, `test_rxdoneflag_no_longer_blocks`, `test_d_fb_det_pattern_unchanged`, `test_interrupt_ex_called_counter_exposed`, `test_isr_entered_matches_rete`, `test_no_pending_irq_gating`

### 🟡 `L1-data` — 4/7
⏭️ **Skipped :** `test_ar3_init_source_identified`, `test_ar4_init_source_identified`, `test_bridge_fn_drift_under_threshold`
⚠️ **xfail :** `test_bridge_fn_drift_under_threshold`

### 🟡 `L1-ctrl` — 2/8
❌ **Échecs :** `test_l1ctl_data_ind_received`, `test_l1ctl_data_ind_received`, `test_l1ctl_data_ind_rate_vs_alc`
⏭️ **Skipped :** `test_neigh_pm_req_response_unchanged`, `test_a_cd_write_pc_includes_ccch_demod`, `test_rach_attempted`
⚠️ **xfail :** `test_neigh_pm_req_response_unchanged`, `test_a_cd_write_pc_includes_ccch_demod`, `test_rach_attempted`

### 🟡 `NDB` — 9/19
❌ **Échecs :** `test_inject_fbsb_fb_found`, `test_inject_si[1]`, `test_inject_si[2]`, `test_inject_si[3]`, `test_inject_si[4]`, `test_inject_si[5]`, `test_inject_si[6]`, `test_inject_a_cd_pattern_23B`, `test_inject_a_cd_pattern_30B`, `test_inject_d_task[28-1]`

### 🛑 `ARM-feedback` — 0/2
❌ **Échecs :** `test_efficacy_arm_reads_d_fb_det_1`
⏭️ **Skipped :** `test_efficacy_arm_reads_a_cd`
⚠️ **xfail :** `test_efficacy_arm_reads_a_cd`

### 🛑 `L3-MM` — 0/5
⏭️ **Skipped :** `test_rach_emitted`, `test_immediate_assignment_decoded`, `test_rr_sdcch_established`, `test_location_updating_request_sent`, `test_location_updating_accept_received`
⚠️ **xfail :** `test_rach_emitted`, `test_immediate_assignment_decoded`, `test_rr_sdcch_established`, `test_location_updating_request_sent`, `test_location_updating_accept_received`

### ✅ `Mgmt` — 3/3
Tous les tests passent dans cette couche.

### ✅ `Summary` — 1/1
Tous les tests passent dans cette couche.


## Diagramme détaillé (catégorie → couche → test)

```{mermaid}
graph TD
  classDef pass    fill:#bef5b1,stroke:#1f7a1f,color:#0a3d0a;
  classDef partial fill:#fde79c,stroke:#b07a00,color:#3a2c00;
  classDef fail    fill:#fbb4b4,stroke:#a31a1a,color:#5a0000;
  classDef skip    fill:#e0e0e0,stroke:#6a6a6a,color:#333;
  classDef xfail   fill:#fde79c,stroke:#b07a00,color:#3a2c00;
  C_Injection["Injection<br/>9/21"]
  class C_Injection partial;
  C_Injection_L_ARM_feedback["ARM-feedback<br/>0/2"]
  class C_Injection_L_ARM_feedback fail;
  C_Injection --> C_Injection_L_ARM_feedback
  C_Injection_L_ARM_feedback --> T_001_test_efficacy_arm_reads_d_fb_det_1["test_efficacy_arm_reads_d_fb_det_1<br/>inject_efficacy<br/>3.15s"]
  class T_001_test_efficacy_arm_reads_d_fb_det_1 fail;
  C_Injection_L_ARM_feedback --> T_002_test_efficacy_arm_reads_a_cd["test_efficacy_arm_reads_a_cd<br/>inject_efficacy<br/>3.11s"]
  class T_002_test_efficacy_arm_reads_a_cd xfail;
  C_Injection_L_NDB["NDB<br/>9/19"]
  class C_Injection_L_NDB partial;
  C_Injection --> C_Injection_L_NDB
  C_Injection_L_NDB --> T_003_test_probe_ndb["test_probe_ndb<br/>inject_frames<br/>0.29s"]
  class T_003_test_probe_ndb pass;
  C_Injection_L_NDB --> T_004_test_clear_ndb["test_clear_ndb<br/>inject_frames<br/>0.29s"]
  class T_004_test_clear_ndb pass;
  C_Injection_L_NDB --> T_005_test_inject_fbsb_fb_found["test_inject_fbsb_fb_found<br/>inject_frames<br/>0.62s"]
  class T_005_test_inject_fbsb_fb_found fail;
  C_Injection_L_NDB --> T_006_test_inject_fbsb_sb_found["test_inject_fbsb_sb_found<br/>inject_frames<br/>0.54s"]
  class T_006_test_inject_fbsb_sb_found pass;
  C_Injection_L_NDB --> T_007_test_inject_si_1_["test_inject_si(1)<br/>inject_frames<br/>0.33s"]
  class T_007_test_inject_si_1_ fail;
  C_Injection_L_NDB --> T_008_test_inject_si_2_["test_inject_si(2)<br/>inject_frames<br/>0.33s"]
  class T_008_test_inject_si_2_ fail;
  C_Injection_L_NDB --> T_009_test_inject_si_3_["test_inject_si(3)<br/>inject_frames<br/>0.33s"]
  class T_009_test_inject_si_3_ fail;
  C_Injection_L_NDB --> T_010_test_inject_si_4_["test_inject_si(4)<br/>inject_frames<br/>0.33s"]
  class T_010_test_inject_si_4_ fail;
  C_Injection_L_NDB --> T_011_test_inject_si_5_["test_inject_si(5)<br/>inject_frames<br/>0.37s"]
  class T_011_test_inject_si_5_ fail;
  C_Injection_L_NDB --> T_012_test_inject_si_6_["test_inject_si(6)<br/>inject_frames<br/>0.33s"]
  class T_012_test_inject_si_6_ fail;
  C_Injection_L_NDB --> T_013_test_inject_a_cd_pattern_23B["test_inject_a_cd_pattern_23B<br/>inject_frames<br/>0.33s"]
  class T_013_test_inject_a_cd_pattern_23B fail;
  C_Injection_L_NDB --> T_014_test_inject_a_cd_pattern_30B["test_inject_a_cd_pattern_30B<br/>inject_frames<br/>0.33s"]
  class T_014_test_inject_a_cd_pattern_30B fail;
  C_Injection_L_NDB --> T_015_test_inject_a_cd_invalid_length["test_inject_a_cd_invalid_length<br/>inject_frames<br/>0.00s"]
  class T_015_test_inject_a_cd_invalid_length pass;
  C_Injection_L_NDB --> T_016_test_inject_d_task_5_0_["test_inject_d_task(5-0)<br/>inject_frames<br/>0.04s"]
  class T_016_test_inject_d_task_5_0_ pass;
  C_Injection_L_NDB --> T_017_test_inject_d_task_6_1_["test_inject_d_task(6-1)<br/>inject_frames<br/>0.04s"]
  class T_017_test_inject_d_task_6_1_ pass;
  C_Injection_L_NDB --> T_018_test_inject_d_task_24_0_["test_inject_d_task(24-0)<br/>inject_frames<br/>0.04s"]
  class T_018_test_inject_d_task_24_0_ pass;
  C_Injection_L_NDB --> T_019_test_inject_d_task_28_1_["test_inject_d_task(28-1)<br/>inject_frames<br/>0.04s"]
  class T_019_test_inject_d_task_28_1_ fail;
  C_Injection_L_NDB --> T_020_test_inject_d_burst_0_["test_inject_d_burst(0)<br/>inject_frames<br/>0.04s"]
  class T_020_test_inject_d_burst_0_ pass;
  C_Injection_L_NDB --> T_021_test_inject_d_burst_1_["test_inject_d_burst(1)<br/>inject_frames<br/>0.04s"]
  class T_021_test_inject_d_burst_1_ pass;
  C_Milestone["Milestone<br/>6/21"]
  class C_Milestone partial;
  C_Milestone_L_DSP["DSP<br/>4/10"]
  class C_Milestone_L_DSP partial;
  C_Milestone --> C_Milestone_L_DSP
  C_Milestone_L_DSP --> T_022_test_popm_decoder_active["test_popm_decoder_active<br/>milestone_dsp_decoder<br/>0.00s"]
  class T_022_test_popm_decoder_active pass;
  C_Milestone_L_DSP --> T_023_test_tier_a_decoder_fixes_present["test_tier_a_decoder_fixes_present<br/>milestone_dsp_decoder<br/>0.00s"]
  class T_023_test_tier_a_decoder_fixes_present pass;
  C_Milestone_L_DSP --> T_024_test_intm_dwell_no_regression["test_intm_dwell_no_regression<br/>milestone_dsp_decoder<br/>30.57s"]
  class T_024_test_intm_dwell_no_regression pass;
  C_Milestone_L_DSP --> T_025_test_dsp_throughput_5x["test_dsp_throughput_5x<br/>milestone_dsp_decoder<br/>0.13s"]
  class T_025_test_dsp_throughput_5x pass;
  C_Milestone_L_DSP --> T_026_test_fb0_att_nonzero["test_fb0_att_nonzero<br/>milestone_fb_det<br/>0.00s"]
  class T_026_test_fb0_att_nonzero xfail;
  C_Milestone_L_DSP --> T_027_test_synth_zero_path_active["test_synth_zero_path_active<br/>milestone_fb_det<br/>0.11s"]
  class T_027_test_synth_zero_path_active skip;
  C_Milestone_L_DSP --> T_028_test_c54x_interrupt_ex_called_nonzero["test_c54x_interrupt_ex_called_nonzero<br/>milestone_irq<br/>0.00s"]
  class T_028_test_c54x_interrupt_ex_called_nonzero xfail;
  C_Milestone_L_DSP --> T_029_test_isr_entered_implies_rete["test_isr_entered_implies_rete<br/>milestone_irq<br/>0.00s"]
  class T_029_test_isr_entered_implies_rete xfail;
  C_Milestone_L_DSP --> T_030_test_no_pending_irq_gated["test_no_pending_irq_gated<br/>milestone_irq<br/>0.00s"]
  class T_030_test_no_pending_irq_gated xfail;
  C_Milestone_L_DSP --> T_031_test_rxdoneflag_no_longer_blocks["test_rxdoneflag_no_longer_blocks<br/>milestone_dsp_decoder<br/>0.00s"]
  class T_031_test_rxdoneflag_no_longer_blocks xfail;
  C_Milestone_L_L1_ctrl["L1-ctrl<br/>0/2"]
  class C_Milestone_L_L1_ctrl fail;
  C_Milestone --> C_Milestone_L_L1_ctrl
  C_Milestone_L_L1_ctrl --> T_032_test_l1ctl_data_ind_received["test_l1ctl_data_ind_received<br/>milestone_l1ctl<br/>0.16s"]
  class T_032_test_l1ctl_data_ind_received fail;
  C_Milestone_L_L1_ctrl --> T_033_test_neigh_pm_req_response_unchanged["test_neigh_pm_req_response_unchanged<br/>milestone_l1ctl<br/>0.00s"]
  class T_033_test_neigh_pm_req_response_unchanged xfail;
  C_Milestone_L_L1_data["L1-data<br/>2/4"]
  class C_Milestone_L_L1_data partial;
  C_Milestone --> C_Milestone_L_L1_data
  C_Milestone_L_L1_data --> T_034_test_ar3_init_source_identified["test_ar3_init_source_identified<br/>milestone_bsp_dma<br/>0.01s"]
  class T_034_test_ar3_init_source_identified skip;
  C_Milestone_L_L1_data --> T_035_test_ar4_init_source_identified["test_ar4_init_source_identified<br/>milestone_bsp_dma<br/>0.01s"]
  class T_035_test_ar4_init_source_identified skip;
  C_Milestone_L_L1_data --> T_036_test_bsp_dma_target_matches_correlator_read_zone["test_bsp_dma_target_matches_correlator<br/>milestone_bsp_dma<br/>0.06s"]
  class T_036_test_bsp_dma_target_matches_correlator_read_zone pass;
  C_Milestone_L_L1_data --> T_037_test_no_d_fb_det_wr_site_anomaly["test_no_d_fb_det_wr_site_anomaly<br/>milestone_bsp_dma<br/>0.17s"]
  class T_037_test_no_d_fb_det_wr_site_anomaly pass;
  C_Milestone_L_L3_MM["L3-MM<br/>0/5"]
  class C_Milestone_L_L3_MM fail;
  C_Milestone --> C_Milestone_L_L3_MM
  C_Milestone_L_L3_MM --> T_038_test_rach_emitted["test_rach_emitted<br/>milestone_mm_lu<br/>0.00s"]
  class T_038_test_rach_emitted xfail;
  C_Milestone_L_L3_MM --> T_039_test_immediate_assignment_decoded["test_immediate_assignment_decoded<br/>milestone_mm_lu<br/>0.00s"]
  class T_039_test_immediate_assignment_decoded xfail;
  C_Milestone_L_L3_MM --> T_040_test_rr_sdcch_established["test_rr_sdcch_established<br/>milestone_mm_lu<br/>0.00s"]
  class T_040_test_rr_sdcch_established xfail;
  C_Milestone_L_L3_MM --> T_041_test_location_updating_request_sent["test_location_updating_request_sent<br/>milestone_mm_lu<br/>0.00s"]
  class T_041_test_location_updating_request_sent xfail;
  C_Milestone_L_L3_MM --> T_042_test_location_updating_accept_received["test_location_updating_accept_received<br/>milestone_mm_lu<br/>0.00s"]
  class T_042_test_location_updating_accept_received xfail;
  C_Runtime["Runtime<br/>19/28"]
  class C_Runtime partial;
  C_Runtime_L_DSP["DSP<br/>6/10"]
  class C_Runtime_L_DSP partial;
  C_Runtime --> C_Runtime_L_DSP
  C_Runtime_L_DSP --> T_043_test_no_wait_a21a_on_window["test_no_wait_a21a_on_window<br/>runtime_dsp<br/>0.07s"]
  class T_043_test_no_wait_a21a_on_window pass;
  C_Runtime_L_DSP --> T_044_test_no_enter_7740_dwell["test_no_enter_7740_dwell<br/>runtime_dsp<br/>0.08s"]
  class T_044_test_no_enter_7740_dwell pass;
  C_Runtime_L_DSP --> T_045_test_intm_reaches_zero["test_intm_reaches_zero<br/>runtime_dsp<br/>0.07s"]
  class T_045_test_intm_reaches_zero pass;
  C_Runtime_L_DSP --> T_046_test_dsp_throughput_above_threshold["test_dsp_throughput_above_threshold<br/>runtime_dsp<br/>0.07s"]
  class T_046_test_dsp_throughput_above_threshold pass;
  C_Runtime_L_DSP --> T_047_test_d_fb_det_pattern_unchanged["test_d_fb_det_pattern_unchanged<br/>runtime_dsp<br/>0.06s"]
  class T_047_test_d_fb_det_pattern_unchanged xfail;
  C_Runtime_L_DSP --> T_048_test_bsp_daram_write_distribution["test_bsp_daram_write_distribution<br/>runtime_dsp<br/>0.08s"]
  class T_048_test_bsp_daram_write_distribution pass;
  C_Runtime_L_DSP --> T_049_test_d_fb_det_data_no_longer_zero["test_d_fb_det_data_no_longer_zero<br/>runtime_dsp<br/>0.08s"]
  class T_049_test_d_fb_det_data_no_longer_zero pass;
  C_Runtime_L_DSP --> T_050_test_interrupt_ex_called_counter_exposed["test_interrupt_ex_called_counter_expos<br/>runtime_irq<br/>0.06s"]
  class T_050_test_interrupt_ex_called_counter_exposed xfail;
  C_Runtime_L_DSP --> T_051_test_isr_entered_matches_rete["test_isr_entered_matches_rete<br/>runtime_irq<br/>0.13s"]
  class T_051_test_isr_entered_matches_rete xfail;
  C_Runtime_L_DSP --> T_052_test_no_pending_irq_gating["test_no_pending_irq_gating<br/>runtime_irq<br/>0.16s"]
  class T_052_test_no_pending_irq_gating xfail;
  C_Runtime_L_Infra["Infra<br/>5/5"]
  class C_Runtime_L_Infra pass;
  C_Runtime --> C_Runtime_L_Infra
  C_Runtime_L_Infra --> T_053_test_all_expected_processes_present["test_all_expected_processes_present<br/>runtime_health<br/>0.12s"]
  class T_053_test_all_expected_processes_present pass;
  C_Runtime_L_Infra --> T_054_test_no_zombie_or_defunct["test_no_zombie_or_defunct<br/>runtime_health<br/>0.05s"]
  class T_054_test_no_zombie_or_defunct pass;
  C_Runtime_L_Infra --> T_055_test_qemu_log_is_fresh["test_qemu_log_is_fresh<br/>runtime_health<br/>3.11s"]
  class T_055_test_qemu_log_is_fresh pass;
  C_Runtime_L_Infra --> T_056_test_mobile_pcap_growing["test_mobile_pcap_growing<br/>runtime_health<br/>10.00s"]
  class T_056_test_mobile_pcap_growing pass;
  C_Runtime_L_Infra --> T_057_test_volumes_mounted["test_volumes_mounted<br/>runtime_health<br/>0.08s"]
  class T_057_test_volumes_mounted pass;
  C_Runtime_L_L1_ctrl["L1-ctrl<br/>2/6"]
  class C_Runtime_L_L1_ctrl partial;
  C_Runtime --> C_Runtime_L_L1_ctrl
  C_Runtime_L_L1_ctrl --> T_058_test_neigh_pm_req_loop_alive["test_neigh_pm_req_loop_alive<br/>runtime_l1ctl<br/>0.19s"]
  class T_058_test_neigh_pm_req_loop_alive pass;
  C_Runtime_L_L1_ctrl --> T_059_test_l1ctl_data_ind_received["test_l1ctl_data_ind_received<br/>runtime_l1ctl<br/>0.17s"]
  class T_059_test_l1ctl_data_ind_received fail;
  C_Runtime_L_L1_ctrl --> T_060_test_a_cd_writes_nonzero["test_a_cd_writes_nonzero<br/>runtime_l1ctl<br/>0.09s"]
  class T_060_test_a_cd_writes_nonzero pass;
  C_Runtime_L_L1_ctrl --> T_061_test_a_cd_write_pc_includes_ccch_demod["test_a_cd_write_pc_includes_ccch_demod<br/>runtime_l1ctl<br/>0.19s"]
  class T_061_test_a_cd_write_pc_includes_ccch_demod xfail;
  C_Runtime_L_L1_ctrl --> T_062_test_l1ctl_data_ind_rate_vs_alc["test_l1ctl_data_ind_rate_vs_alc<br/>runtime_l1ctl<br/>0.24s"]
  class T_062_test_l1ctl_data_ind_rate_vs_alc fail;
  C_Runtime_L_L1_ctrl --> T_063_test_rach_attempted["test_rach_attempted<br/>runtime_l1ctl<br/>0.00s"]
  class T_063_test_rach_attempted xfail;
  C_Runtime_L_L1_data["L1-data<br/>2/3"]
  class C_Runtime_L_L1_data partial;
  C_Runtime --> C_Runtime_L_L1_data
  C_Runtime_L_L1_data --> T_064_test_bridge_log_shows_traffic["test_bridge_log_shows_traffic<br/>runtime_bridge<br/>0.05s"]
  class T_064_test_bridge_log_shows_traffic pass;
  C_Runtime_L_L1_data --> T_065_test_bridge_fn_drift_under_threshold["test_bridge_fn_drift_under_threshold<br/>runtime_bridge<br/>0.00s"]
  class T_065_test_bridge_fn_drift_under_threshold xfail;
  C_Runtime_L_L1_data --> T_066_test_bridge_dl_lookahead_respected["test_bridge_dl_lookahead_respected<br/>runtime_bridge<br/>0.05s"]
  class T_066_test_bridge_dl_lookahead_respected pass;
  C_Runtime_L_Mgmt["Mgmt<br/>3/3"]
  class C_Runtime_L_Mgmt pass;
  C_Runtime --> C_Runtime_L_Mgmt
  C_Runtime_L_Mgmt --> T_067_test_mobile_vty_reachable["test_mobile_vty_reachable<br/>runtime_vty<br/>1.61s"]
  class T_067_test_mobile_vty_reachable pass;
  C_Runtime_L_Mgmt --> T_068_test_mobile_imsi_loaded["test_mobile_imsi_loaded<br/>runtime_vty<br/>1.62s"]
  class T_068_test_mobile_imsi_loaded pass;
  C_Runtime_L_Mgmt --> T_069_test_mobile_mm_state_is_null_or_idle["test_mobile_mm_state_is_null_or_idle<br/>runtime_vty<br/>1.73s"]
  class T_069_test_mobile_mm_state_is_null_or_idle pass;
  C_Runtime_L_Summary["Summary<br/>1/1"]
  class C_Runtime_L_Summary pass;
  C_Runtime --> C_Runtime_L_Summary
  C_Runtime_L_Summary --> T_070_test_run_summary_snapshot["test_run_summary_snapshot<br/>runtime_summary<br/>30.68s"]
  class T_070_test_run_summary_snapshot pass;
```

## Skipped / xfailed

### 22 skipped
- `test_ar3_init_source_identified` — milestone_bsp_dma
- `test_ar4_init_source_identified` — milestone_bsp_dma
- `test_fb0_att_nonzero` — milestone_fb_det
- `test_synth_zero_path_active` — milestone_fb_det
- `test_c54x_interrupt_ex_called_nonzero` — milestone_irq
- `test_isr_entered_implies_rete` — milestone_irq
- `test_no_pending_irq_gated` — milestone_irq
- `test_neigh_pm_req_response_unchanged` — milestone_l1ctl
- `test_rach_emitted` — milestone_mm_lu
- `test_immediate_assignment_decoded` — milestone_mm_lu
- `test_rr_sdcch_established` — milestone_mm_lu
- `test_location_updating_request_sent` — milestone_mm_lu
- `test_location_updating_accept_received` — milestone_mm_lu
- `test_rxdoneflag_no_longer_blocks` — milestone_dsp_decoder
- `test_efficacy_arm_reads_a_cd` — inject_efficacy,inject_frames
- `test_d_fb_det_pattern_unchanged` — runtime_dsp
- `test_bridge_fn_drift_under_threshold` — runtime_bridge
- `test_a_cd_write_pc_includes_ccch_demod` — runtime_l1ctl
- `test_rach_attempted` — runtime_l1ctl
- `test_interrupt_ex_called_counter_exposed` — runtime_irq
- `test_isr_entered_matches_rete` — runtime_irq
- `test_no_pending_irq_gating` — runtime_irq

### 19 xfailed
- `test_fb0_att_nonzero` — milestone_fb_det
- `test_c54x_interrupt_ex_called_nonzero` — milestone_irq
- `test_isr_entered_implies_rete` — milestone_irq
- `test_no_pending_irq_gated` — milestone_irq
- `test_neigh_pm_req_response_unchanged` — milestone_l1ctl
- `test_rach_emitted` — milestone_mm_lu
- `test_immediate_assignment_decoded` — milestone_mm_lu
- `test_rr_sdcch_established` — milestone_mm_lu
- `test_location_updating_request_sent` — milestone_mm_lu
- `test_location_updating_accept_received` — milestone_mm_lu
- `test_rxdoneflag_no_longer_blocks` — milestone_dsp_decoder
- `test_efficacy_arm_reads_a_cd` — inject_efficacy,inject_frames
- `test_d_fb_det_pattern_unchanged` — runtime_dsp
- `test_bridge_fn_drift_under_threshold` — runtime_bridge
- `test_a_cd_write_pc_includes_ccch_demod` — runtime_l1ctl
- `test_rach_attempted` — runtime_l1ctl
- `test_interrupt_ex_called_counter_exposed` — runtime_irq
- `test_isr_entered_matches_rete` — runtime_irq
- `test_no_pending_irq_gating` — runtime_irq

## Résultats bruts pytest

<details>
<summary>Cliquer pour déplier — sortie verbatim type <code>pytest -v</code></summary>

```
PASSED   test_calypso_milestones.py::test_popm_decoder_active (0.001s)
PASSED   test_calypso_milestones.py::test_tier_a_decoder_fixes_present (0.002s)
PASSED   test_calypso_milestones.py::test_intm_dwell_no_regression (30.572s)
PASSED   test_calypso_milestones.py::test_dsp_throughput_5x (0.132s)
SKIPPED  test_calypso_milestones.py::test_ar3_init_source_identified (0.007s)
SKIPPED  test_calypso_milestones.py::test_ar4_init_source_identified (0.005s)
PASSED   test_calypso_milestones.py::test_bsp_dma_target_matches_correlator_read_zone (0.065s)
PASSED   test_calypso_milestones.py::test_no_d_fb_det_wr_site_anomaly (0.169s)
XFAIL    test_calypso_milestones.py::test_fb0_att_nonzero (0.000s)
SKIPPED  test_calypso_milestones.py::test_synth_zero_path_active (0.111s)
XFAIL    test_calypso_milestones.py::test_c54x_interrupt_ex_called_nonzero (0.000s)
XFAIL    test_calypso_milestones.py::test_isr_entered_implies_rete (0.000s)
XFAIL    test_calypso_milestones.py::test_no_pending_irq_gated (0.000s)
FAILED   test_calypso_milestones.py::test_l1ctl_data_ind_received (0.164s)
XFAIL    test_calypso_milestones.py::test_neigh_pm_req_response_unchanged (0.000s)
XFAIL    test_calypso_milestones.py::test_rach_emitted (0.000s)
XFAIL    test_calypso_milestones.py::test_immediate_assignment_decoded (0.000s)
XFAIL    test_calypso_milestones.py::test_rr_sdcch_established (0.000s)
XFAIL    test_calypso_milestones.py::test_location_updating_request_sent (0.000s)
XFAIL    test_calypso_milestones.py::test_location_updating_accept_received (0.000s)
XFAIL    test_calypso_milestones.py::test_rxdoneflag_no_longer_blocks (0.000s)
PASSED   test_inject_frames.py::test_probe_ndb (0.289s)
PASSED   test_inject_frames.py::test_clear_ndb (0.289s)
FAILED   test_inject_frames.py::test_inject_fbsb_fb_found (0.617s)
PASSED   test_inject_frames.py::test_inject_fbsb_sb_found (0.535s)
FAILED   test_inject_frames.py::test_inject_si[1] (0.329s)
FAILED   test_inject_frames.py::test_inject_si[2] (0.329s)
FAILED   test_inject_frames.py::test_inject_si[3] (0.331s)
FAILED   test_inject_frames.py::test_inject_si[4] (0.330s)
FAILED   test_inject_frames.py::test_inject_si[5] (0.371s)
FAILED   test_inject_frames.py::test_inject_si[6] (0.329s)
FAILED   test_inject_frames.py::test_inject_a_cd_pattern_23B (0.331s)
FAILED   test_inject_frames.py::test_inject_a_cd_pattern_30B (0.330s)
PASSED   test_inject_frames.py::test_inject_a_cd_invalid_length (0.001s)
PASSED   test_inject_frames.py::test_inject_d_task[5-0] (0.041s)
PASSED   test_inject_frames.py::test_inject_d_task[6-1] (0.041s)
PASSED   test_inject_frames.py::test_inject_d_task[24-0] (0.042s)
FAILED   test_inject_frames.py::test_inject_d_task[28-1] (0.043s)
PASSED   test_inject_frames.py::test_inject_d_burst[0] (0.043s)
PASSED   test_inject_frames.py::test_inject_d_burst[1] (0.042s)
FAILED   test_inject_frames.py::test_efficacy_arm_reads_d_fb_det_1 (3.151s)
XFAIL    test_inject_frames.py::test_efficacy_arm_reads_a_cd (3.112s)
PASSED   test_run_observability.py::test_all_expected_processes_present (0.122s)
PASSED   test_run_observability.py::test_no_zombie_or_defunct (0.054s)
PASSED   test_run_observability.py::test_qemu_log_is_fresh (3.109s)
PASSED   test_run_observability.py::test_mobile_pcap_growing (10.000s)
PASSED   test_run_observability.py::test_volumes_mounted (0.079s)
PASSED   test_run_observability.py::test_no_wait_a21a_on_window (0.071s)
PASSED   test_run_observability.py::test_no_enter_7740_dwell (0.079s)
PASSED   test_run_observability.py::test_intm_reaches_zero (0.066s)
PASSED   test_run_observability.py::test_dsp_throughput_above_threshold (0.066s)
XFAIL    test_run_observability.py::test_d_fb_det_pattern_unchanged (0.064s)
PASSED   test_run_observability.py::test_bsp_daram_write_distribution (0.083s)
PASSED   test_run_observability.py::test_d_fb_det_data_no_longer_zero (0.076s)
PASSED   test_run_observability.py::test_bridge_log_shows_traffic (0.051s)
XFAIL    test_run_observability.py::test_bridge_fn_drift_under_threshold (0.000s)
PASSED   test_run_observability.py::test_bridge_dl_lookahead_respected (0.051s)
PASSED   test_run_observability.py::test_neigh_pm_req_loop_alive (0.189s)
FAILED   test_run_observability.py::test_l1ctl_data_ind_received (0.173s)
PASSED   test_run_observability.py::test_a_cd_writes_nonzero (0.088s)
XFAIL    test_run_observability.py::test_a_cd_write_pc_includes_ccch_demod (0.193s)
FAILED   test_run_observability.py::test_l1ctl_data_ind_rate_vs_alc (0.240s)
XFAIL    test_run_observability.py::test_rach_attempted (0.000s)
PASSED   test_run_observability.py::test_mobile_vty_reachable (1.612s)
PASSED   test_run_observability.py::test_mobile_imsi_loaded (1.621s)
PASSED   test_run_observability.py::test_mobile_mm_state_is_null_or_idle (1.731s)
XFAIL    test_run_observability.py::test_interrupt_ex_called_counter_exposed (0.063s)
XFAIL    test_run_observability.py::test_isr_entered_matches_rete (0.130s)
XFAIL    test_run_observability.py::test_no_pending_irq_gating (0.160s)
PASSED   test_run_observability.py::test_run_summary_snapshot (30.677s)

============================================================
34 passed, 14 failed, 3 skipped, 19 xfailed in 93.00s
```

</details>

## Reproduction

```bash
cd /home/nirvana/qemu-calypso/tests
/tmp/calypso-venv/bin/pytest -v --tb=short
# Filtrer par marker :
/tmp/calypso-venv/bin/pytest -v -m inject_frames
/tmp/calypso-venv/bin/pytest -v -m 'not inject_efficacy'
```

Le diagramme et ce rapport sont régénérés à chaque run et écrits dans
`/tmp/test_results_20260515_232830/test_results.{mmd,md}` (override via `CALYPSO_TEST_OUT`).

---

_Run finished at 2026-05-15T23:28:30._
