Skip to main content

dsfb_semiconductor/
report.rs

1use crate::cohort::{
2    cohort_report_section, rating_forecast_report_section, CohortDsaSummary, DeltaTargetAssessment,
3    FeatureCohorts, OptimizationExecution, RatingDeltaForecast,
4};
5use crate::config::PipelineConfig;
6use crate::dataset::phm2018::Phm2018SupportStatus;
7use crate::dataset::secom::SecomArchiveLayout;
8use crate::error::Result;
9use crate::failure_driven::FailureDrivenArtifacts;
10use crate::heuristics::HeuristicEntry;
11use crate::metrics::{BenchmarkMetrics, MotifMetric};
12use crate::plots::FigureManifest;
13use crate::precursor::DsaEvaluation;
14use crate::secom_addendum::SecomAddendumArtifacts;
15use serde::Serialize;
16use std::fs;
17use std::path::{Path, PathBuf};
18
19#[derive(Debug, Clone, Serialize)]
20struct ArtifactInventoryEntry {
21    path: String,
22    role: String,
23}
24
25#[derive(Debug, Clone, Serialize)]
26pub struct ReportArtifacts {
27    pub markdown_path: PathBuf,
28    pub tex_path: PathBuf,
29    pub pdf_path: Option<PathBuf>,
30    pub pdf_error: Option<String>,
31}
32
33pub fn write_reports(
34    run_dir: &Path,
35    config: &PipelineConfig,
36    metrics: &BenchmarkMetrics,
37    dsa: &DsaEvaluation,
38    optimization: &OptimizationExecution,
39    delta_target_assessment: &DeltaTargetAssessment,
40    failure_driven: &FailureDrivenArtifacts,
41    feature_cohorts: &FeatureCohorts,
42    cohort_summary: &CohortDsaSummary,
43    rating_delta_forecast: &RatingDeltaForecast,
44    secom_addendum: &SecomAddendumArtifacts,
45    figures: &FigureManifest,
46    heuristics: &[HeuristicEntry],
47    phm_status: &Phm2018SupportStatus,
48    secom_layout: &SecomArchiveLayout,
49) -> Result<ReportArtifacts> {
50    let markdown_path = run_dir.join("engineering_report.md");
51    let tex_path = run_dir.join("engineering_report.tex");
52    fs::write(
53        &markdown_path,
54        markdown_report(
55            config,
56            metrics,
57            dsa,
58            optimization,
59            delta_target_assessment,
60            failure_driven,
61            feature_cohorts,
62            cohort_summary,
63            rating_delta_forecast,
64            secom_addendum,
65            figures,
66            heuristics,
67            phm_status,
68            secom_layout,
69        ),
70    )?;
71    fs::write(
72        &tex_path,
73        latex_report(
74            config,
75            metrics,
76            dsa,
77            optimization,
78            delta_target_assessment,
79            failure_driven,
80            feature_cohorts,
81            cohort_summary,
82            rating_delta_forecast,
83            secom_addendum,
84            figures,
85            heuristics,
86            phm_status,
87            secom_layout,
88        ),
89    )?;
90
91    let (pdf_path, pdf_error) = compile_pdf(&tex_path, run_dir);
92
93    Ok(ReportArtifacts {
94        markdown_path,
95        tex_path,
96        pdf_path,
97        pdf_error,
98    })
99}
100
101fn markdown_report(
102    config: &PipelineConfig,
103    metrics: &BenchmarkMetrics,
104    dsa: &DsaEvaluation,
105    optimization: &OptimizationExecution,
106    delta_target_assessment: &DeltaTargetAssessment,
107    failure_driven: &FailureDrivenArtifacts,
108    feature_cohorts: &FeatureCohorts,
109    cohort_summary: &CohortDsaSummary,
110    rating_delta_forecast: &RatingDeltaForecast,
111    secom_addendum: &SecomAddendumArtifacts,
112    figures: &FigureManifest,
113    heuristics: &[HeuristicEntry],
114    phm_status: &Phm2018SupportStatus,
115    secom_layout: &SecomArchiveLayout,
116) -> String {
117    let mut out = String::new();
118    let artifact_inventory = artifact_inventory(
119        figures,
120        cohort_summary.failure_analysis.is_some(),
121        !rating_delta_forecast.primary_success_met,
122    );
123
124    out.push_str("# DSFB Semiconductor Engineering Report\n\n");
125    out.push_str(&executive_summary_markdown_section(
126        optimization,
127        secom_addendum,
128    ));
129
130    out.push_str("## Dataset\n\n");
131    out.push_str("- Dataset: SECOM (UCI Machine Learning Repository)\n");
132    out.push_str(
133        "- Evidence class: Stage II public-benchmark evidence on real semiconductor data\n",
134    );
135    out.push_str("- Non-claim: this run does not establish SEMI compliance, production readiness, or chamber-level mechanism attribution\n\n");
136
137    out.push_str("## Archive Layout Note\n\n");
138    out.push_str(&format!(
139        "- Numeric columns parsed from `secom.data`: {}\n- Metadata attribute count claimed in `secom.names`: {}\n- Label rows parsed from `secom_labels.data`: {}\n- Label file includes timestamps: {}\n\n{}\n\n",
140        secom_layout.data_file_numeric_column_count,
141        secom_layout
142            .metadata_attribute_count_claim
143            .map(|value| value.to_string())
144            .unwrap_or_else(|| "unknown".into()),
145        secom_layout.label_row_count,
146        secom_layout.label_file_includes_timestamp,
147        secom_layout.note,
148    ));
149
150    out.push_str("## Preprocessing Summary\n\n");
151    out.push_str(&format!(
152        "- Runs: {}\n- Features used by crate: {}\n- Passing runs: {}\n- Failure runs: {}\n- Dataset missing fraction: {:.4}\n- Healthy passing runs requested/found: {}/{}\n\n",
153        metrics.summary.dataset_summary.run_count,
154        metrics.summary.dataset_summary.feature_count,
155        metrics.summary.dataset_summary.pass_count,
156        metrics.summary.dataset_summary.fail_count,
157        metrics.summary.dataset_summary.dataset_missing_fraction,
158        metrics.summary.dataset_summary.healthy_pass_runs_requested,
159        metrics.summary.dataset_summary.healthy_pass_runs_found,
160    ));
161    out.push_str("Missing values remain explicit during dataset loading and are deterministically imputed with the healthy-window nominal mean before residual construction. Stage III treats those imputed observations as structurally invalid for DSFB drift, slew, grammar-state assignment, and the boundary/drift fractions used by DSA.\n\n");
162
163    out.push_str("## DSFB Instantiation\n\n");
164    out.push_str(&format!(
165        "- Nominal reference: healthy-window mean over first {} passing runs\n- Residual: x(k) - x_hat\n- Envelope radius rho: {:.1} * healthy-window residual std\n- Drift window W: {}\n- Boundary condition: |r| > {:.1} * rho and drift > {:.1} * healthy drift std\n- Slew threshold: {:.1} * healthy slew std\n- Recurrent-boundary grazing: {} hits in a {}-run window\n- Hysteresis confirmations: {}\n- Persistent-state minimum length: {}\n- Density window: {}\n- Baseline comparators: raw residual threshold, univariate EWMA on residual norms with alpha = {:.2} and threshold mean + {:.1} * healthy EWMA std, positive CUSUM on residual norms with kappa = {:.1} * healthy std and alarm threshold = {:.1} * healthy std, run-level residual energy with threshold mean + {:.1} * healthy run-energy std, and PCA T2/SPE multivariate FDC retaining {:.0}% healthy variance with thresholds mean + {:.1}/{:.1} * healthy sigma\n\n",
166        config.healthy_pass_runs,
167        config.envelope_sigma,
168        config.drift_window,
169        config.boundary_fraction_of_rho,
170        config.drift_sigma_multiplier,
171        config.slew_sigma_multiplier,
172        config.grazing_min_hits,
173        config.grazing_window,
174        config.state_confirmation_steps,
175        config.persistent_state_steps,
176        config.density_window,
177        config.ewma_alpha,
178        config.ewma_sigma_multiplier,
179        config.cusum_kappa_sigma_multiplier,
180        config.cusum_alarm_sigma_multiplier,
181        config.run_energy_sigma_multiplier,
182        config.pca_variance_explained * 100.0,
183        config.pca_t2_sigma_multiplier,
184        config.pca_spe_sigma_multiplier,
185    ));
186    out.push_str("Stage III keeps the nominal reference, envelope, violation definition, hysteresis, motif definitions, and DSA weights fixed. The change in this pass is missingness-aware signal validity: drift and slew are zeroed across imputed gaps, grammar states are suppressed to Admissible on imputed runs, and DSA boundary/drift fractions exclude imputed runs from the window denominator.\n\n");
187    out.push_str(&format!(
188        "In this crate, `DSFB Violation` remains instantaneous hard envelope exit (`|r| > rho`). `Deterministic Structural Accumulator (DSA)` is additive and sits above the existing DSFB outputs. The feature-level DSA precursor itself remains persistence-constrained, and the run-level comparison signal is cross-feature corroboration: `{}`. The current DSA configuration uses `W = {}`, `K = {}`, `tau = {:.2}`, `m = {}`, fixed unit weights, and a consistency rule that rejects thresholded inward drift and thresholded drift-sign flips.\n\n",
189        dsa.run_signals.primary_run_signal,
190        dsa.summary.config.window,
191        dsa.summary.config.persistence_runs,
192        dsa.summary.config.alert_tau,
193        dsa.summary.config.corroborating_feature_count_min,
194    ));
195
196    out.push_str("## Quantitative Summary\n\n");
197    out.push_str(&format!(
198        "- Analyzable features: {}\n- Grammar-state suppressions due to imputation: {}\n- Threshold alarm points: {}\n- EWMA alarm points: {}\n- CUSUM alarm points: {}\n- Run-energy alarm points: {}\n- PCA T2/SPE alarm points: {}\n- DSFB raw boundary points: {}\n- DSFB persistent boundary points: {}\n- DSFB raw violation points: {}\n- DSFB persistent violation points: {}\n- DSA alert points: {}\n- DSA alert runs: {}\n- Failure runs with preceding DSA signal ({}-run lookback): {}\n- Failure runs with preceding DSFB Violation signal ({}-run lookback): {}\n- Failure runs with preceding raw DSFB boundary signal ({}-run lookback): {}\n- Failure runs with preceding EWMA signal ({}-run lookback): {}\n- Failure runs with preceding CUSUM signal ({}-run lookback): {}\n- Failure runs with preceding run-energy signal ({}-run lookback): {}\n- Failure runs with preceding PCA T2/SPE signal ({}-run lookback): {}\n- Failure runs with preceding threshold signal ({}-run lookback): {}\n\n",
199        metrics.summary.analyzable_feature_count,
200        metrics.summary.grammar_imputation_suppression_points,
201        metrics.summary.threshold_alarm_points,
202        metrics.summary.ewma_alarm_points,
203        metrics.summary.cusum_alarm_points,
204        metrics.summary.run_energy_alarm_points,
205        metrics.summary.pca_fdc_alarm_points,
206        metrics.summary.dsfb_raw_boundary_points,
207        metrics.summary.dsfb_persistent_boundary_points,
208        metrics.summary.dsfb_raw_violation_points,
209        metrics.summary.dsfb_persistent_violation_points,
210        dsa.summary.alert_point_count,
211        dsa.summary.alert_run_count,
212        config.pre_failure_lookback_runs,
213        dsa.summary.failure_run_recall,
214        config.pre_failure_lookback_runs,
215        dsa.comparison_summary.dsfb_violation.failure_run_recall,
216        config.pre_failure_lookback_runs,
217        dsa.comparison_summary.dsfb_raw_boundary.failure_run_recall,
218        config.pre_failure_lookback_runs,
219        metrics.summary.failure_runs_with_preceding_ewma_signal,
220        config.pre_failure_lookback_runs,
221        metrics.summary.failure_runs_with_preceding_cusum_signal,
222        config.pre_failure_lookback_runs,
223        metrics.summary.failure_runs_with_preceding_run_energy_signal,
224        config.pre_failure_lookback_runs,
225        metrics.summary.failure_runs_with_preceding_pca_fdc_signal,
226        config.pre_failure_lookback_runs,
227        metrics.summary.failure_runs_with_preceding_threshold_signal,
228    ));
229    out.push_str("The raw threshold baseline and the raw DSFB Violation state still share the same instantaneous envelope-exit condition. The feature-level DSA precursor is separate structural compression logic, and the run-level primary DSA signal requires cross-feature corroboration without redefining either frozen baseline.\n\n");
230
231    out.push_str("## Lead-Time and Nuisance Proxies\n\n");
232    out.push_str(&format!(
233        "- Mean DSA lead (runs): {}\n- Median DSA lead (runs): {}\n- Mean raw DSFB boundary lead (runs): {}\n- Mean DSFB Violation lead (runs): {}\n- Mean EWMA lead (runs): {}\n- Mean CUSUM lead (runs): {}\n- Mean run-energy lead (runs): {}\n- Mean PCA T2/SPE lead (runs): {}\n- Mean threshold lead (runs): {}\n- Mean DSA minus CUSUM lead delta (runs): {}\n- Mean DSA minus run-energy lead delta (runs): {}\n- Mean DSA minus PCA T2/SPE lead delta (runs): {}\n- Mean DSA minus threshold lead delta (runs): {}\n- Mean DSA minus EWMA lead delta (runs): {}\n- Pass-run nuisance proxy, DSA: {:.4}\n- Pass-run nuisance proxy, raw DSFB boundary: {:.4}\n- Pass-run nuisance proxy, DSFB Violation: {:.4}\n- Pass-run nuisance proxy, EWMA: {:.4}\n- Pass-run nuisance proxy, CUSUM: {:.4}\n- Pass-run nuisance proxy, run energy: {:.4}\n- Pass-run nuisance proxy, PCA T2/SPE: {:.4}\n- Pass-run nuisance proxy, threshold: {:.4}\n\n",
234        format_option_f64(dsa.summary.mean_lead_time_runs),
235        format_option_f64(dsa.summary.median_lead_time_runs),
236        format_option_f64(metrics.lead_time_summary.mean_raw_boundary_lead_runs),
237        format_option_f64(metrics.lead_time_summary.mean_raw_violation_lead_runs),
238        format_option_f64(metrics.lead_time_summary.mean_ewma_lead_runs),
239        format_option_f64(metrics.lead_time_summary.mean_cusum_lead_runs),
240        format_option_f64(metrics.lead_time_summary.mean_run_energy_lead_runs),
241        format_option_f64(metrics.lead_time_summary.mean_pca_fdc_lead_runs),
242        format_option_f64(metrics.lead_time_summary.mean_threshold_lead_runs),
243        format_option_f64(dsa.summary.mean_lead_delta_vs_cusum_runs),
244        format_option_f64(dsa.summary.mean_lead_delta_vs_run_energy_runs),
245        format_option_f64(dsa.summary.mean_lead_delta_vs_pca_fdc_runs),
246        format_option_f64(dsa.summary.mean_lead_delta_vs_threshold_runs),
247        format_option_f64(dsa.summary.mean_lead_delta_vs_ewma_runs),
248        dsa.comparison_summary.dsa.pass_run_nuisance_proxy,
249        dsa.comparison_summary.dsfb_raw_boundary.pass_run_nuisance_proxy,
250        dsa.comparison_summary.dsfb_violation.pass_run_nuisance_proxy,
251        dsa.comparison_summary.ewma.pass_run_nuisance_proxy,
252        dsa.comparison_summary.cusum.pass_run_nuisance_proxy,
253        dsa.comparison_summary.run_energy.pass_run_nuisance_proxy,
254        dsa.comparison_summary.pca_fdc.pass_run_nuisance_proxy,
255        dsa.comparison_summary.threshold.pass_run_nuisance_proxy,
256    ));
257    out.push_str("These nuisance values are pass-run proxies on SECOM labels, not fab-certified false-alarm metrics.\n\n");
258
259    out.push_str("## Deterministic Structural Accumulator (DSA)\n\n");
260    out.push_str("- DSA is a persistence-constrained structural decision layer\n");
261    out.push_str("- DSA is additive and sits above existing DSFB outputs\n");
262    out.push_str("- DSFB Violation remains instantaneous envelope exit\n");
263    out.push_str("- The feature-level DSA precursor is structural accumulation; the run-level primary signal is a corroborated feature-count decision\n");
264    out.push_str("- DSA is intended to reduce nuisance and stabilize precursor regimes\n");
265    out.push_str("- The predeclared 40% nuisance-reduction target is evaluated separately below; the legacy one-run nuisance/recall sweep gate reported here is not sufficient for target attainment\n");
266    out.push_str(&format!(
267        "- Primary run-level comparison signal: `{}`\n- Primary run-level signal definition: `{}`\n- Secondary run-level signal emitted: `{}`\n- Tertiary run-level signal emitted: `{}`\n- Failure-run recall, DSA: {}/{}\n- Failure-run recall, threshold: {}/{}\n- Failure-run recall, EWMA: {}/{}\n- Failure-run recall, CUSUM: {}/{}\n- Failure-run recall, run energy: {}/{}\n- Failure-run recall, PCA T2/SPE: {}/{}\n- Failure-run recall, DSFB Violation: {}/{}\n- Mean lead time, DSA: {}\n- Median lead time, DSA: {}\n- Pass-run nuisance proxy, DSA: {:.4}\n- Lead delta vs CUSUM (runs): {}\n- Lead delta vs run energy (runs): {}\n- Lead delta vs PCA T2/SPE (runs): {}\n- Lead delta vs threshold (runs): {}\n- Lead delta vs EWMA (runs): {}\n- Nuisance delta vs threshold: {:.4}\n- Nuisance delta vs EWMA: {:.4}\n- Nuisance delta vs DSFB Violation: {:.4}\n- Nuisance delta vs CUSUM: {:.4}\n- Nuisance delta vs run energy: {:.4}\n- Nuisance delta vs PCA T2/SPE: {:.4}\n- Nuisance delta vs raw DSFB boundary: {:.4}\n- DSA episodes: {}\n- DSA episodes preceding failure: {}\n- Precursor quality: {}\n- Mean DSA episode length (runs): {}\n- Max DSA episode length (runs): {}\n- Raw boundary episodes: {}\n- Compression ratio (raw boundary / DSA): {}\n- Non-escalating DSA episode fraction: {}\n- Legacy one-run nuisance/recall sweep gate met: {}\n- Legacy gate failures: {}\n- Nuisance improved: {}\n- Lead time improved: {}\n- Recall preserved: {}\n- Compression improved: {}\n- Nothing improved: {}\n- Legacy threshold-minus-one recall gate passed: {}\n- Legacy boundary nuisance gate passed: {}\n- Stricter validation passed: {}\n\n{}\n\n",
268        dsa.run_signals.primary_run_signal,
269        dsa.parameter_manifest.primary_run_signal_definition,
270        dsa.parameter_manifest.secondary_run_signal,
271        dsa.parameter_manifest.tertiary_run_signal,
272        dsa.comparison_summary.dsa.failure_run_recall,
273        dsa.comparison_summary.dsa.failure_runs,
274        dsa.comparison_summary.threshold.failure_run_recall,
275        dsa.comparison_summary.threshold.failure_runs,
276        dsa.comparison_summary.ewma.failure_run_recall,
277        dsa.comparison_summary.ewma.failure_runs,
278        dsa.comparison_summary.cusum.failure_run_recall,
279        dsa.comparison_summary.cusum.failure_runs,
280        dsa.comparison_summary.run_energy.failure_run_recall,
281        dsa.comparison_summary.run_energy.failure_runs,
282        dsa.comparison_summary.pca_fdc.failure_run_recall,
283        dsa.comparison_summary.pca_fdc.failure_runs,
284        dsa.comparison_summary.dsfb_violation.failure_run_recall,
285        dsa.comparison_summary.dsfb_violation.failure_runs,
286        format_option_f64(dsa.comparison_summary.dsa.mean_lead_time_runs),
287        format_option_f64(dsa.comparison_summary.dsa.median_lead_time_runs),
288        dsa.comparison_summary.dsa.pass_run_nuisance_proxy,
289        format_option_f64(dsa.comparison_summary.dsa.mean_lead_delta_vs_cusum_runs),
290        format_option_f64(dsa.comparison_summary.dsa.mean_lead_delta_vs_run_energy_runs),
291        format_option_f64(dsa.comparison_summary.dsa.mean_lead_delta_vs_pca_fdc_runs),
292        format_option_f64(dsa.comparison_summary.dsa.mean_lead_delta_vs_threshold_runs),
293        format_option_f64(dsa.comparison_summary.dsa.mean_lead_delta_vs_ewma_runs),
294        dsa.comparison_summary.pass_run_nuisance_delta_vs_threshold,
295        dsa.comparison_summary.pass_run_nuisance_delta_vs_ewma,
296        dsa.comparison_summary.pass_run_nuisance_delta_vs_violation,
297        dsa.comparison_summary.pass_run_nuisance_delta_vs_cusum,
298        dsa.comparison_summary.pass_run_nuisance_delta_vs_run_energy,
299        dsa.comparison_summary.pass_run_nuisance_delta_vs_pca_fdc,
300        dsa.comparison_summary.pass_run_nuisance_delta_vs_raw_boundary,
301        dsa.episode_summary.dsa_episode_count,
302        dsa.episode_summary.dsa_episodes_preceding_failure,
303        format_option_f64(dsa.episode_summary.precursor_quality),
304        format_option_f64(dsa.episode_summary.mean_dsa_episode_length_runs),
305        dsa.episode_summary.max_dsa_episode_length_runs,
306        dsa.episode_summary.raw_boundary_episode_count,
307        format_option_f64(dsa.episode_summary.compression_ratio),
308        format_option_f64(dsa.episode_summary.non_escalating_dsa_episode_fraction),
309        dsa.comparison_summary.primary_success_condition_met,
310        if dsa.comparison_summary.success_condition_failures.is_empty() {
311            "none".to_string()
312        } else {
313            dsa.comparison_summary.success_condition_failures.join("; ")
314        },
315        dsa.comparison_summary.nuisance_improved,
316        dsa.comparison_summary.lead_time_improved,
317        dsa.comparison_summary.recall_preserved,
318        dsa.comparison_summary.compression_improved,
319        dsa.comparison_summary.nothing_improved,
320        dsa.comparison_summary.threshold_recall_gate_passed,
321        dsa.comparison_summary.boundary_nuisance_gate_passed,
322        dsa.comparison_summary.validation_passed,
323        dsa.comparison_summary.conclusion,
324    ));
325
326    out.push_str("## DSA Calibration Grid\n\n");
327    out.push_str(&format!(
328        "- Grid points evaluated: {}\n- Optimization priority order: {}\n- Legacy one-run nuisance/recall sweep gate: {}\n- Rows meeting the legacy gate in the bounded grid: {}\n- Cross-feature corroboration effect: {}\n- Limiting factor: {}\n",
329        cohort_summary.grid_point_count,
330        cohort_summary.optimization_priority_order.join(" | "),
331        cohort_summary.primary_success_condition,
332        cohort_summary
333            .cohort_results
334            .iter()
335            .filter(|row| row.primary_success)
336            .count(),
337        cohort_summary.cross_feature_corroboration_effect,
338        cohort_summary.limiting_factor,
339    ));
340    if let Some(row) = &cohort_summary.closest_to_success {
341        out.push_str(&format!(
342            "- Closest to the legacy sweep gate: grid_row_id={}, cohort={}, W={}, K={}, tau={:.2}, m={}, recall={}/{}, mean lead={}, nuisance={:.4}, precursor quality={}, compression ratio={}\n",
343            row.grid_row_id,
344            row.cohort_name,
345            row.window,
346            row.persistence_runs,
347            row.alert_tau,
348            row.corroborating_m,
349            row.failure_recall,
350            row.failure_runs,
351            format_option_f64(row.mean_lead_time_runs),
352            row.pass_run_nuisance_proxy,
353            format_option_f64(row.precursor_quality),
354            format_option_f64(row.compression_ratio),
355        ));
356    }
357    if let Some(row) = &cohort_summary.best_precursor_quality_row {
358        out.push_str(&format!(
359            "- Highest precursor-quality row: grid_row_id={}, cohort={}, W={}, K={}, tau={:.2}, m={}, precursor quality={}\n",
360            row.grid_row_id,
361            row.cohort_name,
362            row.window,
363            row.persistence_runs,
364            row.alert_tau,
365            row.corroborating_m,
366            format_option_f64(row.precursor_quality),
367        ));
368    }
369    out.push_str("- Saved grid artifacts: `dsa_grid_results.csv` and `dsa_grid_summary.json`\n\n");
370    out.push_str(&cohort_report_section(feature_cohorts, cohort_summary));
371    out.push_str(&heuristics_policy_engine_markdown_section(
372        heuristics,
373        dsa,
374        cohort_summary,
375    ));
376    out.push_str(&semantics_of_silence_markdown_section(metrics, dsa));
377    out.push_str(&non_intrusive_integration_markdown_section());
378    out.push_str(&true_dsfb_structural_semiotics_markdown_section());
379    out.push_str(&grouped_coordinated_semiotics_markdown_section());
380    out.push_str(&missed_failure_analysis_markdown_section(failure_driven));
381    out.push_str(&failure_priority_markdown_section(failure_driven));
382    out.push_str(&feature_motif_grounding_markdown_section(failure_driven));
383    out.push_str(&feature_role_validation_markdown_section(failure_driven));
384    out.push_str(&minimal_heuristics_markdown_section(failure_driven));
385    out.push_str(&heuristic_provenance_markdown_section(failure_driven));
386    out.push_str(&group_validation_markdown_section(failure_driven));
387    out.push_str(&negative_control_markdown_section(failure_driven));
388    out.push_str(&dsfb_vs_ewma_markdown_section(failure_driven));
389    out.push_str(&secom_limitation_markdown_section(secom_addendum));
390    out.push_str(&metric_regrounding_markdown_section(secom_addendum));
391    out.push_str(&target_d_regression_markdown_section(secom_addendum));
392    out.push_str(&lead_time_explanation_markdown_section(secom_addendum));
393    out.push_str(&which_delta_matters_markdown_section(optimization));
394    out.push_str(&predeclared_operator_delta_targets_markdown_section(
395        optimization,
396    ));
397    out.push_str(&operator_optimization_frontier_markdown_section(
398        optimization,
399    ));
400    out.push_str(&recall_recovery_efficiency_markdown_section(optimization));
401    out.push_str(&operator_target_attainment_markdown_section(optimization));
402    out.push_str(&predeclared_delta_target_markdown_section(
403        delta_target_assessment,
404    ));
405    out.push_str(&recall_recovery_diagnostics_markdown_section(optimization));
406    out.push_str(&feature_aware_governance_markdown_section(optimization));
407    out.push_str(&missed_failure_diagnostics_markdown_section(optimization));
408    out.push_str(&two_stage_optimization_frontier_markdown_section(
409        optimization,
410        delta_target_assessment,
411    ));
412    out.push_str(&target_attainment_markdown_section(delta_target_assessment));
413    out.push_str(&rating_forecast_report_section(rating_delta_forecast));
414    out.push_str(&claims_intentionally_not_made_markdown_section());
415
416    out.push_str("## Density Summary\n\n");
417    out.push_str(&format!(
418        "- Density window: {} runs\n- Mean persistent boundary density, failure-labeled runs: {:.4}\n- Mean persistent boundary density, pass-labeled runs: {:.4}\n- Mean persistent violation density, failure-labeled runs: {:.4}\n- Mean persistent violation density, pass-labeled runs: {:.4}\n- Mean threshold density, failure-labeled runs: {:.4}\n- Mean threshold density, pass-labeled runs: {:.4}\n- Mean EWMA density, failure-labeled runs: {:.4}\n- Mean EWMA density, pass-labeled runs: {:.4}\n- Mean CUSUM density, failure-labeled runs: {:.4}\n- Mean CUSUM density, pass-labeled runs: {:.4}\n\n",
419        metrics.density_summary.density_window,
420        metrics.density_summary.mean_persistent_boundary_density_failure,
421        metrics.density_summary.mean_persistent_boundary_density_pass,
422        metrics.density_summary.mean_persistent_violation_density_failure,
423        metrics.density_summary.mean_persistent_violation_density_pass,
424        metrics.density_summary.mean_threshold_density_failure,
425        metrics.density_summary.mean_threshold_density_pass,
426        metrics.density_summary.mean_ewma_density_failure,
427        metrics.density_summary.mean_ewma_density_pass,
428        metrics.density_summary.mean_cusum_density_failure,
429        metrics.density_summary.mean_cusum_density_pass,
430    ));
431
432    out.push_str(&drsc_dsa_combined_markdown_section(figures));
433    out.push_str(&drsc_markdown_section(figures));
434    out.push_str(&dsa_focus_markdown_section(figures));
435
436    out.push_str("## Motif Calibration Summary\n\n");
437    out.push_str(
438        "| Motif | Point hits | Run hits | Pre-failure window run hits | Precision proxy |\n",
439    );
440    out.push_str("|---|---:|---:|---:|---:|\n");
441    for metric in &metrics.motif_metrics {
442        out.push_str(&format!(
443            "| {} | {} | {} | {} | {} |\n",
444            metric.motif_name,
445            metric.point_hits,
446            metric.run_hits,
447            metric.pre_failure_window_run_hits,
448            format_option_f64(metric.pre_failure_window_precision_proxy),
449        ));
450    }
451    out.push('\n');
452
453    out.push_str("## Heuristics Bank\n\n");
454    out.push_str(
455        "| Motif | Provenance | Contributes to DSA scoring | Severity | Recommended action |\n",
456    );
457    out.push_str("|---|---|---|---|---|\n");
458    for entry in heuristics {
459        out.push_str(&format!(
460            "| {} | {} | {} | {} | {} |\n",
461            entry.motif_name,
462            entry.provenance_status,
463            entry.contributes_to_dsa_scoring,
464            entry.severity,
465            entry.recommended_action,
466        ));
467    }
468    out.push('\n');
469
470    out.push_str("## Figures\n\n");
471    for file in &figures.files {
472        out.push_str(&format!("- figures/{}\n", file));
473    }
474    out.push('\n');
475
476    out.push_str("## Artifact Inventory\n\n");
477    out.push_str("| Path | Role |\n|---|---|\n");
478    for entry in &artifact_inventory {
479        out.push_str(&format!("| {} | {} |\n", entry.path, entry.role));
480    }
481    out.push('\n');
482
483    out.push_str("## PHM 2018 Status\n\n");
484    out.push_str(&format!(
485        "- Official page: {}\n- Manual archive path: {}\n- Archive summary support implemented: {}\n- Implemented now: {}\n- Blocker: {}\n\n",
486        phm_status.official_page,
487        phm_status.manual_placement_path.display(),
488        phm_status.archive_summary_supported,
489        phm_status.fully_implemented,
490        phm_status.blocker,
491    ));
492
493    out.push_str("## Limitations of This Run\n\n");
494    out.push_str("- SECOM is anonymized and instance-level; this run does not validate chamber-mechanism attribution or run-to-failure prognostics.\n");
495    out.push_str("- The comparator set is still intentionally bounded: raw threshold, EWMA, positive CUSUM, run-level residual energy, PCA T2/SPE multivariate FDC, DSFB boundary, and DSFB Violation. ML baselines are intentionally not claimed here.\n");
496    out.push_str("- Lead-time and nuisance values are bounded proxy metrics derived from SECOM labels and a fixed lookback, not fab-qualified operational KPIs.\n");
497    out.push_str("- PHM 2018 support is still limited to the manual-placement contract, archive probe, grouped CSV-schema summary, and archive-shape ingestion summary until the real archive is present and verified end to end.\n");
498    out.push_str("- DRSC keeps the DSFB state semantics intact, but now overlays DSA/run-level comparator traces for the selected feature window.\n");
499    out.push_str("- PDF generation depends on a local `pdflatex` installation.\n\n");
500
501    out.push_str("## Explicit Non-Claims\n\n");
502    out.push_str("- No universal superiority claim over SPC, EWMA, FDC, or ML baselines\n");
503    out.push_str("- No standards-compliance or completed qualification claim\n");
504    out.push_str("- No SEMI compatibility claim\n");
505    out.push_str("- No chamber-mechanism or physical root-cause attribution from SECOM alone\n");
506    out.push_str("- No PHM 2018 completion claim unless the real archive is staged and verified\n");
507    out.push_str("- No Kani verification claim for this crate\n");
508    out.push_str("- No no_alloc, SIMD, rayon, or parallel-acceleration claim for this crate\n");
509    out
510}
511
512fn latex_report(
513    config: &PipelineConfig,
514    metrics: &BenchmarkMetrics,
515    dsa: &DsaEvaluation,
516    optimization: &OptimizationExecution,
517    delta_target_assessment: &DeltaTargetAssessment,
518    failure_driven: &FailureDrivenArtifacts,
519    feature_cohorts: &FeatureCohorts,
520    cohort_summary: &CohortDsaSummary,
521    rating_delta_forecast: &RatingDeltaForecast,
522    secom_addendum: &SecomAddendumArtifacts,
523    figures: &FigureManifest,
524    heuristics: &[HeuristicEntry],
525    phm_status: &Phm2018SupportStatus,
526    secom_layout: &SecomArchiveLayout,
527) -> String {
528    let mut out = String::new();
529    let artifact_inventory = artifact_inventory(
530        figures,
531        cohort_summary.failure_analysis.is_some(),
532        !rating_delta_forecast.primary_success_met,
533    );
534
535    out.push_str("\\documentclass[11pt]{article}\n");
536    out.push_str("\\usepackage[margin=1in]{geometry}\n");
537    out.push_str("\\usepackage{booktabs}\n");
538    out.push_str("\\usepackage{graphicx}\n");
539    out.push_str("\\usepackage{longtable}\n");
540    out.push_str("\\usepackage{hyperref}\n");
541    out.push_str("\\begin{document}\n");
542    out.push_str("\\title{DSFB Semiconductor Engineering Report}\n");
543    out.push_str("\\author{Automatically generated by dsfb-semiconductor}\n");
544    out.push_str("\\date{}\n\\maketitle\n\n");
545    out.push_str(&executive_summary_latex_section(
546        optimization,
547        secom_addendum,
548    ));
549
550    out.push_str("\\section*{Dataset}\n");
551    out.push_str("This report documents a real-data DSFB run on the SECOM dataset from the UCI Machine Learning Repository. It is a Stage II public-benchmark artifact, not a deployment or qualification report.\n\n");
552
553    out.push_str("\\section*{Archive layout note}\n");
554    out.push_str(&format!(
555        "The current distributed archive parses as {} numeric columns in \\texttt{{secom.data}}. The \\texttt{{secom.names}} metadata text claims {} attributes. The crate uses the numeric columns actually present in \\texttt{{secom.data}} and reads labels and timestamps separately from \\texttt{{secom\\_labels.data}}.\n\n",
556        secom_layout.data_file_numeric_column_count,
557        secom_layout
558            .metadata_attribute_count_claim
559            .map(|value| value.to_string())
560            .unwrap_or_else(|| "unknown".into()),
561    ));
562
563    out.push_str("\\section*{Preprocessing summary}\n");
564    out.push_str("\\begin{tabular}{lr}\n\\toprule\n");
565    out.push_str(&format!(
566        "Runs & {} \\\\\nFeatures used by crate & {} \\\\\nPassing runs & {} \\\\\nFailure runs & {} \\\\\nDataset missing fraction & {:.4} \\\\\nHealthy passing runs requested & {} \\\\\nHealthy passing runs found & {} \\\\\n",
567        metrics.summary.dataset_summary.run_count,
568        metrics.summary.dataset_summary.feature_count,
569        metrics.summary.dataset_summary.pass_count,
570        metrics.summary.dataset_summary.fail_count,
571        metrics.summary.dataset_summary.dataset_missing_fraction,
572        metrics.summary.dataset_summary.healthy_pass_runs_requested,
573        metrics.summary.dataset_summary.healthy_pass_runs_found,
574    ));
575    out.push_str("\\bottomrule\n\\end{tabular}\n\n");
576
577    out.push_str("\\section*{DSFB instantiation}\n");
578    out.push_str(&latex_escape(&format!(
579        "The nominal reference is the healthy-window mean over the first {} passing runs. Residuals are defined as x(k) - x_hat. The admissibility envelope radius is {:.1} sigma on the healthy residual distribution. The drift window is W = {}. The boundary rule in this implementation is |r| > {:.1} rho with drift above {:.1} healthy drift sigma. Abrupt slew tags use {:.1} healthy slew sigma. Hysteresis-confirmed state changes require {} confirmations, persistent-state alarms require {} consecutive confirmed steps, and density metrics use a {}-run sliding window. The comparator set contains a raw residual threshold, a univariate EWMA on residual norms with alpha = {:.2} and a threshold at the healthy-window EWMA mean plus {:.1} sigma, a positive CUSUM on residual norms with kappa = {:.1} healthy sigma and alarm threshold = {:.1} healthy sigma, a run-level residual-energy baseline with threshold mean plus {:.1} healthy run-energy sigma, and a PCA T2/SPE multivariate FDC baseline retaining {:.0}% healthy variance with T2/SPE thresholds at mean plus {:.1}/{:.1} healthy sigma. DSFB Violation remains the instantaneous hard envelope exit state. DSA is additive, sits above the existing DSFB outputs, and uses W = {}, K = {}, tau = {:.2}, m = {}, fixed unit weights, primary run signal {}, and a consistency rule that rejects thresholded inward drift and thresholded drift-sign flips.",
580        config.healthy_pass_runs,
581        config.envelope_sigma,
582        config.drift_window,
583        config.boundary_fraction_of_rho,
584        config.drift_sigma_multiplier,
585        config.slew_sigma_multiplier,
586        config.state_confirmation_steps,
587        config.persistent_state_steps,
588        config.density_window,
589        config.ewma_alpha,
590        config.ewma_sigma_multiplier,
591        config.cusum_kappa_sigma_multiplier,
592        config.cusum_alarm_sigma_multiplier,
593        config.run_energy_sigma_multiplier,
594        config.pca_variance_explained * 100.0,
595        config.pca_t2_sigma_multiplier,
596        config.pca_spe_sigma_multiplier,
597        dsa.summary.config.window,
598        dsa.summary.config.persistence_runs,
599        dsa.summary.config.alert_tau,
600        dsa.summary.config.corroborating_feature_count_min,
601        dsa.run_signals.primary_run_signal,
602    )));
603    out.push_str("\n\n");
604
605    out.push_str("\\section*{Deterministic Structural Accumulator (DSA)}\n");
606    out.push_str(&latex_escape(
607        "The predeclared 40% nuisance-reduction target is evaluated separately below; the legacy one-run nuisance/recall sweep gate reported in this section is not sufficient for target attainment.",
608    ));
609    out.push_str("\n\n");
610    out.push_str("\\begin{tabular}{lr}\n\\toprule\n");
611    out.push_str(&format!(
612        "Failure-run recall, DSA & {}/{} \\\\\nFailure-run recall, threshold & {}/{} \\\\\nFailure-run recall, EWMA & {}/{} \\\\\nFailure-run recall, CUSUM & {}/{} \\\\\nFailure-run recall, run energy & {}/{} \\\\\nFailure-run recall, PCA T2/SPE & {}/{} \\\\\nFailure-run recall, DSFB Violation & {}/{} \\\\\nMean lead time, DSA & {} \\\\\nMedian lead time, DSA & {} \\\\\nPass-run nuisance proxy, DSA & {:.4} \\\\\nLead delta vs CUSUM & {} \\\\\nLead delta vs run energy & {} \\\\\nLead delta vs PCA T2/SPE & {} \\\\\nLead delta vs threshold & {} \\\\\nLead delta vs EWMA & {} \\\\\nNuisance delta vs threshold & {:.4} \\\\\nNuisance delta vs EWMA & {:.4} \\\\\nNuisance delta vs DSFB Violation & {:.4} \\\\\nNuisance delta vs CUSUM & {:.4} \\\\\nNuisance delta vs run energy & {:.4} \\\\\nNuisance delta vs PCA T2/SPE & {:.4} \\\\\nNuisance delta vs raw boundary & {:.4} \\\\\nRaw boundary episodes & {} \\\\\nDSA episodes & {} \\\\\nDSA episodes preceding failure & {} \\\\\nPrecursor quality & {} \\\\\nCompression ratio & {} \\\\\nNon-escalating DSA episode fraction & {} \\\\\nLegacy one-run nuisance/recall sweep gate met & {} \\\\\nLegacy threshold-minus-one recall gate passed & {} \\\\\nLegacy boundary nuisance gate passed & {} \\\\\nStricter validation passed & {} \\\\\n",
613        dsa.comparison_summary.dsa.failure_run_recall,
614        dsa.comparison_summary.dsa.failure_runs,
615        dsa.comparison_summary.threshold.failure_run_recall,
616        dsa.comparison_summary.threshold.failure_runs,
617        dsa.comparison_summary.ewma.failure_run_recall,
618        dsa.comparison_summary.ewma.failure_runs,
619        dsa.comparison_summary.cusum.failure_run_recall,
620        dsa.comparison_summary.cusum.failure_runs,
621        dsa.comparison_summary.run_energy.failure_run_recall,
622        dsa.comparison_summary.run_energy.failure_runs,
623        dsa.comparison_summary.pca_fdc.failure_run_recall,
624        dsa.comparison_summary.pca_fdc.failure_runs,
625        dsa.comparison_summary.dsfb_violation.failure_run_recall,
626        dsa.comparison_summary.dsfb_violation.failure_runs,
627        format_option_f64(dsa.comparison_summary.dsa.mean_lead_time_runs),
628        format_option_f64(dsa.comparison_summary.dsa.median_lead_time_runs),
629        dsa.comparison_summary.dsa.pass_run_nuisance_proxy,
630        format_option_f64(dsa.comparison_summary.dsa.mean_lead_delta_vs_cusum_runs),
631        format_option_f64(dsa.comparison_summary.dsa.mean_lead_delta_vs_run_energy_runs),
632        format_option_f64(dsa.comparison_summary.dsa.mean_lead_delta_vs_pca_fdc_runs),
633        format_option_f64(dsa.comparison_summary.dsa.mean_lead_delta_vs_threshold_runs),
634        format_option_f64(dsa.comparison_summary.dsa.mean_lead_delta_vs_ewma_runs),
635        dsa.comparison_summary.pass_run_nuisance_delta_vs_threshold,
636        dsa.comparison_summary.pass_run_nuisance_delta_vs_ewma,
637        dsa.comparison_summary.pass_run_nuisance_delta_vs_violation,
638        dsa.comparison_summary.pass_run_nuisance_delta_vs_cusum,
639        dsa.comparison_summary.pass_run_nuisance_delta_vs_run_energy,
640        dsa.comparison_summary.pass_run_nuisance_delta_vs_pca_fdc,
641        dsa.comparison_summary.pass_run_nuisance_delta_vs_raw_boundary,
642        dsa.episode_summary.raw_boundary_episode_count,
643        dsa.episode_summary.dsa_episode_count,
644        dsa.episode_summary.dsa_episodes_preceding_failure,
645        format_option_f64(dsa.episode_summary.precursor_quality),
646        format_option_f64(dsa.episode_summary.compression_ratio),
647        format_option_f64(dsa.episode_summary.non_escalating_dsa_episode_fraction),
648        dsa.comparison_summary.primary_success_condition_met,
649        dsa.comparison_summary.threshold_recall_gate_passed,
650        dsa.comparison_summary.boundary_nuisance_gate_passed,
651        dsa.comparison_summary.validation_passed,
652    ));
653    out.push_str("\\bottomrule\n\\end{tabular}\n\n");
654    out.push_str(&latex_escape(&dsa.comparison_summary.conclusion));
655    out.push_str("\n\n");
656
657    out.push_str("\\section*{DSA calibration grid}\n");
658    out.push_str(&latex_escape(&format!(
659        "Grid points evaluated: {}. Optimization priority order: {}. Legacy one-run nuisance/recall sweep gate: {}. Rows meeting the legacy gate in the bounded grid: {}. Cross-feature corroboration effect: {}. Limiting factor: {}.",
660        cohort_summary.grid_point_count,
661        cohort_summary.optimization_priority_order.join(" | "),
662        cohort_summary.primary_success_condition,
663        cohort_summary
664            .cohort_results
665            .iter()
666            .filter(|row| row.primary_success)
667            .count(),
668        cohort_summary.cross_feature_corroboration_effect,
669        cohort_summary.limiting_factor,
670    )));
671    out.push_str("\n\n");
672    out.push_str(&feature_cohort_latex_section(
673        feature_cohorts,
674        cohort_summary,
675    ));
676    out.push_str(&heuristics_policy_engine_latex_section(
677        heuristics,
678        dsa,
679        cohort_summary,
680    ));
681    out.push_str(&semantics_of_silence_latex_section(metrics, dsa));
682    out.push_str(&non_intrusive_integration_latex_section());
683    out.push_str(&true_dsfb_structural_semiotics_latex_section());
684    out.push_str(&grouped_coordinated_semiotics_latex_section());
685    out.push_str(&missed_failure_analysis_latex_section(failure_driven));
686    out.push_str(&failure_priority_latex_section(failure_driven));
687    out.push_str(&feature_motif_grounding_latex_section(failure_driven));
688    out.push_str(&feature_role_validation_latex_section(failure_driven));
689    out.push_str(&minimal_heuristics_latex_section(failure_driven));
690    out.push_str(&heuristic_provenance_latex_section(failure_driven));
691    out.push_str(&group_validation_latex_section(failure_driven));
692    out.push_str(&negative_control_latex_section(failure_driven));
693    out.push_str(&dsfb_vs_ewma_latex_section(failure_driven));
694    out.push_str(&secom_limitation_latex_section(secom_addendum));
695    out.push_str(&metric_regrounding_latex_section(secom_addendum));
696    out.push_str(&target_d_regression_latex_section(secom_addendum));
697    out.push_str(&lead_time_explanation_latex_section(secom_addendum));
698    out.push_str(&operator_sections_latex(optimization));
699    out.push_str(&optimization_sections_latex(
700        optimization,
701        delta_target_assessment,
702    ));
703    out.push_str(&rating_forecast_latex_section(rating_delta_forecast));
704    out.push_str(&claims_intentionally_not_made_latex_section());
705
706    out.push_str("\\section*{Motif metrics}\n");
707    out.push_str("\\begin{longtable}{p{0.26\\linewidth}rrrr}\n\\toprule\n");
708    out.push_str(
709        "Motif & Point hits & Run hits & Pre-failure run hits & Precision proxy \\\\\n\\midrule\n",
710    );
711    for metric in &metrics.motif_metrics {
712        out.push_str(&motif_row(metric));
713    }
714    out.push_str("\\bottomrule\n\\end{longtable}\n\n");
715
716    out.push_str("\\section*{Heuristics bank}\n");
717    out.push_str("\\begin{longtable}{p{0.18\\linewidth}p{0.15\\linewidth}p{0.12\\linewidth}p{0.37\\linewidth}}\n\\toprule\n");
718    out.push_str("Motif & Provenance & In DSA score & Recommended action \\\\\n\\midrule\n");
719    for entry in heuristics {
720        out.push_str(&format!(
721            "{} & {} & {} & {} \\\\\n",
722            latex_escape(&entry.motif_name),
723            latex_escape(&entry.provenance_status),
724            latex_escape(&entry.contributes_to_dsa_scoring.to_string()),
725            latex_escape(&entry.recommended_action),
726        ));
727    }
728    out.push_str("\\bottomrule\n\\end{longtable}\n\n");
729
730    out.push_str(&drsc_dsa_combined_latex_section(figures));
731    out.push_str(&drsc_latex_section(figures));
732    out.push_str(&dsa_focus_latex_section(figures));
733
734    out.push_str("\\section*{Artifact inventory}\n");
735    out.push_str("\\begin{longtable}{p{0.38\\linewidth}p{0.52\\linewidth}}\n\\toprule\n");
736    out.push_str("Path & Role \\\\\n\\midrule\n");
737    for entry in &artifact_inventory {
738        out.push_str(&format!(
739            "{} & {} \\\\\n",
740            latex_escape(&entry.path),
741            latex_escape(&entry.role),
742        ));
743    }
744    out.push_str("\\bottomrule\n\\end{longtable}\n\n");
745
746    out.push_str("\\section*{PHM 2018 status}\n");
747    out.push_str(&latex_escape(&format!(
748        "Official page: {}. Manual archive path: {}. Archive summary support implemented: {}. Implemented now: {}. Blocker: {}.",
749        phm_status.official_page,
750        phm_status.manual_placement_path.display(),
751        phm_status.archive_summary_supported,
752        phm_status.fully_implemented,
753        phm_status.blocker,
754    )));
755    out.push_str("\n\n");
756
757    out.push_str("\\section*{Explicit non-claims}\n");
758    out.push_str("\\begin{itemize}\n");
759    out.push_str("\\item No universal superiority claim over SPC, EWMA, FDC, or ML baselines.\n");
760    out.push_str(
761        "\\item No standards-compliance, completed qualification, or SEMI compatibility claim.\n",
762    );
763    out.push_str(
764        "\\item No chamber-mechanism or physical root-cause attribution from SECOM alone.\n",
765    );
766    out.push_str(
767        "\\item No PHM 2018 completion claim unless the real archive is staged and verified.\n",
768    );
769    out.push_str("\\item No Kani verification, no\\_alloc, SIMD, rayon, or parallel-acceleration claim for this crate.\n");
770    out.push_str("\\end{itemize}\n\n");
771
772    out.push_str(&figure_blocks(figures));
773    out.push_str("\\end{document}\n");
774    out
775}
776
777fn heuristics_policy_engine_markdown_section(
778    heuristics: &[HeuristicEntry],
779    dsa: &DsaEvaluation,
780    cohort_summary: &CohortDsaSummary,
781) -> String {
782    let mut out = String::new();
783    out.push_str("## Heuristics-Governed DSA Policy Engine\n\n");
784    out.push_str("- Current motif set used: ");
785    out.push_str(
786        &heuristics
787            .iter()
788            .map(|entry| entry.motif_name.clone())
789            .collect::<Vec<_>>()
790            .join(", "),
791    );
792    out.push_str("\n");
793    out.push_str("- Policy fields used: `alert_class_default`, `requires_persistence`, `requires_corroboration`, `minimum_window`, `minimum_hits`, `maximum_allowed_fragmentation`, `suppresses_alert`, `promotes_alert`\n");
794    out.push_str("- Legacy one-run-tolerance cohort gate used in the bounded sweep: ");
795    out.push_str(&cohort_summary.primary_success_condition);
796    out.push_str("\n\n");
797    out.push_str("| Motif | Default class | Persistence | Corroboration | Min window | Min hits | Max fragmentation | Suppresses | Promotes |\n");
798    out.push_str("|---|---|---|---|---:|---:|---:|---|---|\n");
799    for entry in heuristics {
800        out.push_str(&format!(
801            "| {} | {:?} | {} | {} | {} | {} | {:.4} | {} | {} |\n",
802            entry.motif_name,
803            entry.alert_class_default,
804            entry.requires_persistence,
805            entry.requires_corroboration,
806            entry.minimum_window,
807            entry.minimum_hits,
808            entry.maximum_allowed_fragmentation,
809            entry.suppresses_alert,
810            entry.promotes_alert,
811        ));
812    }
813    out.push('\n');
814    if let Some(selected) = &cohort_summary.selected_configuration {
815        out.push_str(&format!(
816            "- Best cohort result: {} with recall {}/{}, nuisance {:.4}, numeric-only nuisance {:.4}, mean lead {}, precursor quality {}, and compression {}\n",
817            selected.cohort_name,
818            selected.failure_recall,
819            selected.failure_runs,
820            selected.pass_run_nuisance_proxy,
821            selected.numeric_pass_run_nuisance_proxy,
822            format_option_f64(selected.mean_lead_time_runs),
823            format_option_f64(selected.precursor_quality),
824            format_option_f64(selected.compression_ratio),
825        ));
826    }
827    out.push_str(&format!(
828        "- Legacy one-run-tolerance cohort gate met: {}\n",
829        cohort_summary.any_primary_success
830    ));
831    if let Some(analysis) = &cohort_summary.failure_analysis {
832        out.push_str(&format!(
833            "- Failure analysis: {}\n- Policy vs numeric-only DSA: {}\n- Nuisance-dominant motif class: {}\n- Useful precursor motif class: {}\n",
834            analysis.limiting_factor,
835            analysis.policy_vs_numeric_note,
836            analysis.nuisance_motif_classes,
837            analysis.useful_precursor_motif_classes,
838        ));
839    }
840    out.push_str(&format!(
841        "- Feature-state counts in selected evaluation: Watch={}, Review={}, Escalate={}, Silent suppression points={}\n\n",
842        dsa.summary.watch_point_count,
843        dsa.summary.review_point_count,
844        dsa.summary.escalate_point_count,
845        dsa.summary.silenced_point_count,
846    ));
847    out
848}
849
850fn executive_summary_markdown_section(
851    optimization: &OptimizationExecution,
852    secom_addendum: &SecomAddendumArtifacts,
853) -> String {
854    let mut out = String::new();
855    out.push_str("## Executive Summary\n\n");
856    out.push_str("- DSFB remains a non-intrusive, read-only, deterministic companion layer over existing SPC/EWMA/controller residuals; it does not modify thresholds, actuation, timing, or certification boundaries.\n");
857    out.push_str(&format!(
858        "- {}\n- Required SECOM limitation statement supported by data: {}\n- Paper abstract artifact: `paper_abstract_artifact.txt`\n",
859        secom_addendum.executive_summary_text,
860        secom_addendum.required_tradeoff_statement_supported,
861    ));
862    out.push_str(&format!(
863        "- Exact operator deltas in the selected SECOM row: investigation load {:.1}%, episode count {:.1}%, review points/pass-run {:.1}%, review episodes/pass-run {:.1}%, recall {}/{}, precursor quality {}, nuisance vs EWMA {:.1}%\n\n",
864        optimization.operator_delta_targets.delta_investigation_load * 100.0,
865        optimization.operator_delta_targets.delta_episode_count * 100.0,
866        optimization.operator_delta_targets.delta_review_points_per_pass_run * 100.0,
867        optimization.operator_delta_targets.delta_review_episodes_per_pass_run * 100.0,
868        optimization.operator_delta_targets.selected_configuration.failure_recall,
869        optimization.operator_delta_targets.selected_configuration.failure_runs,
870        format_option_f64(
871            optimization
872                .operator_delta_targets
873                .selected_configuration
874                .precursor_quality,
875        ),
876        optimization.operator_delta_targets.delta_nuisance_vs_ewma * 100.0,
877    ));
878    out
879}
880
881fn secom_limitation_markdown_section(secom_addendum: &SecomAddendumArtifacts) -> String {
882    let stats = &secom_addendum.recurrent_boundary_stats;
883    let mut out = String::new();
884    out.push_str("## SECOM Structural Limitation\n\n");
885    out.push_str(&format!(
886        "- recurrent_boundary_approach points: {}\n- Runs hit by recurrent_boundary_approach: {}\n- Pre-failure runs hit: {}\n- Pass runs hit: {}\n- Pre-failure precision: {:.4}\n- Pass-run precision: {:.4}\n\n",
887        stats.total_boundary_points,
888        stats.total_run_hits,
889        stats.total_pre_failure_hits,
890        stats.pass_run_hits,
891        stats.precision_pre_failure,
892        stats.precision_pass,
893    ));
894    out.push_str(&format!(
895        "{} Supported by tradeoff sweep: {}.\n\n",
896        secom_addendum.required_tradeoff_statement,
897        secom_addendum.required_tradeoff_statement_supported,
898    ));
899    out.push_str("- Tradeoff artifacts: `recurrent_boundary_stats.json`, `recurrent_boundary_tradeoff_curve.csv`, and `recurrent_boundary_tradeoff_plot.png`\n\n");
900    out
901}
902
903fn metric_regrounding_markdown_section(secom_addendum: &SecomAddendumArtifacts) -> String {
904    let mut out = String::new();
905    out.push_str("## Metric Re-Grounding\n\n");
906    out.push_str("Every delta below is baseline-specific; no 40% claim is made without naming the comparator.\n\n");
907    out.push_str("| Metric | Baseline | DSFB value | Baseline value | Delta % |\n");
908    out.push_str("|---|---|---:|---:|---:|\n");
909    for row in &secom_addendum.metric_regrounding {
910        out.push_str(&format!(
911            "| {} | {} | {:.4} | {:.4} | {:.2}% |\n",
912            row.metric,
913            row.baseline,
914            row.dsfb_value,
915            row.baseline_value,
916            row.delta_percent * 100.0,
917        ));
918    }
919    out.push('\n');
920    out.push_str(&format!(
921        "- Episode precision is promoted as the primary operator metric: {:.1}% vs a raw-boundary precision proxy of {:.2}%, a {:.1}x gain.\n\n",
922        secom_addendum.episode_precision_metrics.dsfb_precision * 100.0,
923        secom_addendum.episode_precision_metrics.raw_alarm_precision * 100.0,
924        secom_addendum.episode_precision_metrics.precision_gain_factor,
925    ));
926    out
927}
928
929fn target_d_regression_markdown_section(secom_addendum: &SecomAddendumArtifacts) -> String {
930    let analysis = &secom_addendum.target_d_regression_analysis;
931    let mut out = String::new();
932    out.push_str("## Target D Regression Analysis\n\n");
933    out.push_str(&format!(
934        "- Contributing features: {}\n- Contributing motifs: {}\n- Contributing heuristics: {}\n- Contributing policy rules: {}\n- Action taken: {}\n\n",
935        join_or_none(&analysis.contributing_features),
936        join_or_none(&analysis.contributing_motifs),
937        join_or_none(&analysis.contributing_heuristics),
938        join_or_none(&analysis.contributing_policy_rules),
939        analysis.action_taken,
940    ));
941    out.push_str(&format!(
942        "{}\n\n{}\n\n",
943        analysis.why_regression_occurred, analysis.tradeoff_justification
944    ));
945    out.push_str("Causal chain:\n");
946    for item in &analysis.causal_chain {
947        out.push_str(&format!("- {}\n", item));
948    }
949    out.push('\n');
950    out
951}
952
953fn lead_time_explanation_markdown_section(secom_addendum: &SecomAddendumArtifacts) -> String {
954    let explanation = &secom_addendum.lead_time_explanation;
955    let mut out = String::new();
956    out.push_str("## Lead-Time Deficit Explanation\n\n");
957    out.push_str(&format!(
958        "- Mean DSA lead: {}\n- Mean threshold lead: {}\n- Mean earliest semantic-match lead: {}\n- Failures where threshold leads DSA: {}\n- Failures where DSA leads threshold: {}\n- Failures where semantic matches precede threshold: {}\n- Failures where motif emergence precedes threshold: {}\n\n{}\n\n{}\n\n",
959        format_option_f64(explanation.mean_dsfb_lead_runs),
960        format_option_f64(explanation.mean_threshold_lead_runs),
961        format_option_f64(explanation.mean_semantic_match_lead_runs),
962        explanation.threshold_earlier_failure_count,
963        explanation.dsfb_earlier_failure_count,
964        explanation.semantic_match_precedes_threshold_count,
965        explanation.motif_emergence_precedes_threshold_count,
966        explanation.explanation,
967        explanation.validation_note,
968    ));
969    out.push_str(
970        "- Saved artifacts: `lead_time_comparison.csv` and `lead_time_explanation.json`\n\n",
971    );
972    out
973}
974
975fn semantics_of_silence_markdown_section(
976    metrics: &BenchmarkMetrics,
977    dsa: &DsaEvaluation,
978) -> String {
979    format!(
980        "## Semantics of Silence\n\n- Silence rule: {}\n- Grammar-state suppressions due to imputation: {}\n- Numeric-only DSA alert points: {}\n- Policy-governed Review/Escalate alert points: {}\n- Explicitly silenced points: {}\n- Policy nuisance: {:.4} versus numeric-only DSA {:.4} and EWMA {:.4}\n- Policy recall: {}/{} versus numeric-only DSA {}/{}\n- Watch/Review/Escalate points: {}/{}/{}\n- Raw boundary episodes: {}\n- Policy-governed DSA episodes: {}\n- Compression ratio: {}\n- Precursor quality: {}\n\n",
981        dsa.parameter_manifest.silence_rule,
982        metrics.summary.grammar_imputation_suppression_points,
983        dsa.summary.numeric_alert_point_count,
984        dsa.summary.alert_point_count,
985        dsa.summary.silenced_point_count,
986        dsa.summary.pass_run_nuisance_proxy,
987        dsa.summary.numeric_primary_pass_run_nuisance_proxy,
988        dsa.comparison_summary.ewma.pass_run_nuisance_proxy,
989        dsa.summary.failure_run_recall,
990        dsa.summary.failure_runs,
991        dsa.summary.numeric_primary_failure_run_recall,
992        dsa.summary.failure_runs,
993        dsa.summary.watch_point_count,
994        dsa.summary.review_point_count,
995        dsa.summary.escalate_point_count,
996        dsa.episode_summary.raw_boundary_episode_count,
997        dsa.episode_summary.dsa_episode_count,
998        format_option_f64(dsa.episode_summary.compression_ratio),
999        format_option_f64(dsa.episode_summary.precursor_quality),
1000    )
1001}
1002
1003fn non_intrusive_integration_markdown_section() -> String {
1004    let mut out = String::new();
1005    out.push_str("## Non-Intrusive Integration Model\n\n");
1006    out.push_str("- Integration mode: `read_only_side_channel`\n");
1007    out.push_str(
1008        "- Fixed layer order: `Residual -> Sign -> Syntax -> Grammar -> Semantics -> Policy`\n",
1009    );
1010    out.push_str("- Inputs consumed by DSFB: immutable residual streams, upstream alarm streams, and metadata only.\n");
1011    out.push_str("- Outputs emitted by DSFB: advisory interpretations only; no controller, threshold, recipe, or actuation API exists.\n");
1012    out.push_str(
1013        "- No feedback path exists from DSFB outputs back into SPC/EWMA/controller logic.\n",
1014    );
1015    out.push_str("- No upstream latency claim is made; the contract is that DSFB runs observer-style and must not change primary control timing.\n");
1016    out.push_str("- Replay is deterministic and fail-safe isolated: identical ordered inputs yield identical outputs, and DSFB failure leaves upstream behavior unchanged.\n");
1017    out.push_str("- Contract artifacts: `non_intrusive_interface_spec.md`, `figures/dsfb_non_intrusive_architecture.png`, and `figures/dsfb_non_intrusive_architecture.svg`\n\n");
1018    out
1019}
1020
1021fn claims_intentionally_not_made_markdown_section() -> String {
1022    let mut out = String::new();
1023    out.push_str("## Claims intentionally not made\n\n");
1024    out.push_str(
1025        "- DSFB does not replace SPC, EWMA, threshold logic, APC, or controller actuation.\n",
1026    );
1027    out.push_str("- SECOM does not prove universal early-warning superiority.\n");
1028    out.push_str("- PHM 2018 does not prove burden reduction because PHM burden metrics are not computed here.\n");
1029    out.push_str("- No universal superiority claim is made against scalar baselines.\n");
1030    out.push_str(
1031        "- No SEMI compliance, completed qualification, or deployment readiness claim is made.\n\n",
1032    );
1033    out
1034}
1035
1036fn heuristics_policy_engine_latex_section(
1037    heuristics: &[HeuristicEntry],
1038    dsa: &DsaEvaluation,
1039    cohort_summary: &CohortDsaSummary,
1040) -> String {
1041    let mut out = String::new();
1042    out.push_str("\\section*{Heuristics-Governed DSA Policy Engine}\n");
1043    out.push_str(&latex_escape(&format!(
1044        "Current motif set: {}. Policy fields used: alert_class_default, requires_persistence, requires_corroboration, minimum_window, minimum_hits, maximum_allowed_fragmentation, suppresses_alert, and promotes_alert. Legacy one-run-tolerance cohort gate used in the bounded sweep: {}.",
1045        heuristics
1046            .iter()
1047            .map(|entry| entry.motif_name.clone())
1048            .collect::<Vec<_>>()
1049            .join(", "),
1050        cohort_summary.primary_success_condition,
1051    )));
1052    out.push_str("\n\n");
1053    out.push_str("\\begin{longtable}{p{0.22\\linewidth}p{0.12\\linewidth}ccrrcc}\n\\toprule\n");
1054    out.push_str("Motif & Default class & Persist & Corrob & Window & Hits & Suppress & Promote \\\\\n\\midrule\n");
1055    for entry in heuristics {
1056        out.push_str(&format!(
1057            "{} & {} & {} & {} & {} & {} & {} & {} \\\\\n",
1058            latex_escape(&entry.motif_name),
1059            latex_escape(&format!("{:?}", entry.alert_class_default)),
1060            latex_escape(&entry.requires_persistence.to_string()),
1061            latex_escape(&entry.requires_corroboration.to_string()),
1062            entry.minimum_window,
1063            entry.minimum_hits,
1064            latex_escape(&entry.suppresses_alert.to_string()),
1065            latex_escape(&entry.promotes_alert.to_string()),
1066        ));
1067    }
1068    out.push_str("\\bottomrule\n\\end{longtable}\n\n");
1069    if let Some(selected) = &cohort_summary.selected_configuration {
1070        out.push_str(&latex_escape(&format!(
1071            "Best cohort result: {} with recall {}/{}, nuisance {:.4}, numeric-only nuisance {:.4}, mean lead {}, precursor quality {}, and compression {}. Legacy one-run-tolerance cohort gate met: {}.",
1072            selected.cohort_name,
1073            selected.failure_recall,
1074            selected.failure_runs,
1075            selected.pass_run_nuisance_proxy,
1076            selected.numeric_pass_run_nuisance_proxy,
1077            format_option_f64(selected.mean_lead_time_runs),
1078            format_option_f64(selected.precursor_quality),
1079            format_option_f64(selected.compression_ratio),
1080            cohort_summary.any_primary_success,
1081        )));
1082        out.push_str("\n\n");
1083    }
1084    if let Some(analysis) = &cohort_summary.failure_analysis {
1085        out.push_str(&latex_escape(&format!(
1086            "Failure analysis: {}. Policy vs numeric-only DSA: {}. Nuisance-dominant motif class: {}. Useful precursor motif class: {}.",
1087            analysis.limiting_factor,
1088            analysis.policy_vs_numeric_note,
1089            analysis.nuisance_motif_classes,
1090            analysis.useful_precursor_motif_classes,
1091        )));
1092        out.push_str("\n\n");
1093    }
1094    out.push_str(&latex_escape(&format!(
1095        "Selected-evaluation state counts: Watch={}, Review={}, Escalate={}, Silent suppression points={}.",
1096        dsa.summary.watch_point_count,
1097        dsa.summary.review_point_count,
1098        dsa.summary.escalate_point_count,
1099        dsa.summary.silenced_point_count,
1100    )));
1101    out.push_str("\n\n");
1102    out
1103}
1104
1105fn executive_summary_latex_section(
1106    optimization: &OptimizationExecution,
1107    secom_addendum: &SecomAddendumArtifacts,
1108) -> String {
1109    let mut out = String::new();
1110    out.push_str("\\section*{Executive summary}\n");
1111    out.push_str(&latex_escape(&format!(
1112        "DSFB remains a non-intrusive, read-only, deterministic companion layer over existing SPC/EWMA/controller residuals. {} Required SECOM limitation statement supported by data: {}. Exact operator deltas in the selected row are investigation load {:.1}%, episode count {:.1}%, review points/pass-run {:.1}%, review episodes/pass-run {:.1}%, recall {}/{}, precursor quality {}, and nuisance vs EWMA {:.1}%.",
1113        secom_addendum.executive_summary_text,
1114        secom_addendum.required_tradeoff_statement_supported,
1115        optimization.operator_delta_targets.delta_investigation_load * 100.0,
1116        optimization.operator_delta_targets.delta_episode_count * 100.0,
1117        optimization.operator_delta_targets.delta_review_points_per_pass_run * 100.0,
1118        optimization.operator_delta_targets.delta_review_episodes_per_pass_run * 100.0,
1119        optimization.operator_delta_targets.selected_configuration.failure_recall,
1120        optimization.operator_delta_targets.selected_configuration.failure_runs,
1121        format_option_f64(
1122            optimization
1123                .operator_delta_targets
1124                .selected_configuration
1125                .precursor_quality,
1126        ),
1127        optimization.operator_delta_targets.delta_nuisance_vs_ewma * 100.0,
1128    )));
1129    out.push_str("\n\n");
1130    out
1131}
1132
1133fn non_intrusive_integration_latex_section() -> String {
1134    let mut out = String::new();
1135    out.push_str("\\section*{Non-Intrusive Integration Model}\n");
1136    out.push_str("Integration mode: \\texttt{read\\_only\\_side\\_channel}. Fixed layer order: \\texttt{Residual -> Sign -> Syntax -> Grammar -> Semantics -> Policy}. Inputs consumed by DSFB are immutable residual streams, upstream alarm streams, and metadata only. Outputs are advisory interpretations only; no controller, threshold, recipe, or actuation API exists. No feedback path exists from DSFB outputs back into SPC/EWMA/controller logic. No upstream latency claim is made; the contract is that DSFB runs observer-style and must not change primary control timing. Replay is deterministic and fail-safe isolated: identical ordered inputs yield identical outputs, and DSFB failure leaves upstream behavior unchanged. Contract artifacts: \\texttt{non\\_intrusive\\_interface\\_spec.md}, \\texttt{figures/dsfb\\_non\\_intrusive\\_architecture.png}, and \\texttt{figures/dsfb\\_non\\_intrusive\\_architecture.svg}.\n\n");
1137    out
1138}
1139
1140fn claims_intentionally_not_made_latex_section() -> String {
1141    let mut out = String::new();
1142    out.push_str("\\section*{Claims intentionally not made}\n");
1143    out.push_str("\\begin{itemize}\n");
1144    out.push_str(
1145        "\\item DSFB does not replace SPC, EWMA, threshold logic, APC, or controller actuation.\n",
1146    );
1147    out.push_str("\\item SECOM does not prove universal early-warning superiority.\n");
1148    out.push_str("\\item PHM 2018 does not prove burden reduction because PHM burden metrics are not computed here.\n");
1149    out.push_str("\\item No universal superiority claim is made against scalar baselines.\n");
1150    out.push_str("\\item No SEMI compliance, completed qualification, or deployment readiness claim is made.\n");
1151    out.push_str("\\end{itemize}\n\n");
1152    out
1153}
1154
1155fn secom_limitation_latex_section(secom_addendum: &SecomAddendumArtifacts) -> String {
1156    let stats = &secom_addendum.recurrent_boundary_stats;
1157    let mut out = String::new();
1158    out.push_str("\\section*{SECOM structural limitation}\n");
1159    out.push_str(&latex_escape(&format!(
1160        "recurrent_boundary_approach points: {}. Runs hit: {}. Pre-failure runs hit: {}. Pass runs hit: {}. Pre-failure precision: {:.4}. Pass-run precision: {:.4}. {} Supported by tradeoff sweep: {}.",
1161        stats.total_boundary_points,
1162        stats.total_run_hits,
1163        stats.total_pre_failure_hits,
1164        stats.pass_run_hits,
1165        stats.precision_pre_failure,
1166        stats.precision_pass,
1167        secom_addendum.required_tradeoff_statement,
1168        secom_addendum.required_tradeoff_statement_supported,
1169    )));
1170    out.push_str("\n\n");
1171    out
1172}
1173
1174fn metric_regrounding_latex_section(secom_addendum: &SecomAddendumArtifacts) -> String {
1175    let mut out = String::new();
1176    out.push_str("\\section*{Metric re-grounding}\n");
1177    out.push_str("\\begin{longtable}{p{0.20\\linewidth}p{0.14\\linewidth}rrr}\n\\toprule\n");
1178    out.push_str("Metric & Baseline & DSFB value & Baseline value & Delta \\% \\\\\n\\midrule\n");
1179    for row in &secom_addendum.metric_regrounding {
1180        out.push_str(&format!(
1181            "{} & {} & {:.4} & {:.4} & {:.2} \\\\\n",
1182            latex_escape(&row.metric),
1183            latex_escape(&row.baseline),
1184            row.dsfb_value,
1185            row.baseline_value,
1186            row.delta_percent * 100.0,
1187        ));
1188    }
1189    out.push_str("\\bottomrule\n\\end{longtable}\n\n");
1190    out.push_str(&latex_escape(&format!(
1191        "Episode precision is promoted as the primary operator metric: {:.1}\\% versus a raw-boundary precision proxy of {:.2}\\%, a {:.1}x gain.",
1192        secom_addendum.episode_precision_metrics.dsfb_precision * 100.0,
1193        secom_addendum.episode_precision_metrics.raw_alarm_precision * 100.0,
1194        secom_addendum.episode_precision_metrics.precision_gain_factor,
1195    )));
1196    out.push_str("\n\n");
1197    out
1198}
1199
1200fn target_d_regression_latex_section(secom_addendum: &SecomAddendumArtifacts) -> String {
1201    let analysis = &secom_addendum.target_d_regression_analysis;
1202    let mut out = String::new();
1203    out.push_str("\\section*{Target D regression analysis}\n");
1204    out.push_str(&latex_escape(&format!(
1205        "Contributing features: {}. Contributing motifs: {}. Contributing heuristics: {}. Contributing policy rules: {}. Action taken: {}. {} {}",
1206        join_or_none(&analysis.contributing_features),
1207        join_or_none(&analysis.contributing_motifs),
1208        join_or_none(&analysis.contributing_heuristics),
1209        join_or_none(&analysis.contributing_policy_rules),
1210        analysis.action_taken,
1211        analysis.why_regression_occurred,
1212        analysis.tradeoff_justification,
1213    )));
1214    out.push_str("\n\n");
1215    out
1216}
1217
1218fn lead_time_explanation_latex_section(secom_addendum: &SecomAddendumArtifacts) -> String {
1219    let explanation = &secom_addendum.lead_time_explanation;
1220    let mut out = String::new();
1221    out.push_str("\\section*{Lead-time deficit explanation}\n");
1222    out.push_str(&latex_escape(&format!(
1223        "Mean DSA lead: {}. Mean threshold lead: {}. Mean earliest semantic-match lead: {}. Failures where threshold leads DSA: {}. Failures where DSA leads threshold: {}. Failures where semantic matches precede threshold: {}. Failures where motif emergence precedes threshold: {}. {} {}",
1224        format_option_f64(explanation.mean_dsfb_lead_runs),
1225        format_option_f64(explanation.mean_threshold_lead_runs),
1226        format_option_f64(explanation.mean_semantic_match_lead_runs),
1227        explanation.threshold_earlier_failure_count,
1228        explanation.dsfb_earlier_failure_count,
1229        explanation.semantic_match_precedes_threshold_count,
1230        explanation.motif_emergence_precedes_threshold_count,
1231        explanation.explanation,
1232        explanation.validation_note,
1233    )));
1234    out.push_str("\n\n");
1235    out
1236}
1237
1238fn semantics_of_silence_latex_section(metrics: &BenchmarkMetrics, dsa: &DsaEvaluation) -> String {
1239    let mut out = String::new();
1240    out.push_str("\\section*{Semantics of Silence}\n");
1241    out.push_str(&latex_escape(&format!(
1242        "Silence rule: {}. Grammar-state suppressions due to imputation: {}. Numeric-only DSA alert points: {}. Policy-governed Review/Escalate alert points: {}. Explicitly silenced points: {}. Policy nuisance is {:.4} versus numeric-only DSA {:.4} and EWMA {:.4}. Policy recall is {}/{} versus numeric-only DSA {}/{}. Watch/Review/Escalate points are {}/{}/{}. Raw boundary episodes: {}. Policy-governed DSA episodes: {}. Compression ratio: {}. Precursor quality: {}.",
1243        dsa.parameter_manifest.silence_rule,
1244        metrics.summary.grammar_imputation_suppression_points,
1245        dsa.summary.numeric_alert_point_count,
1246        dsa.summary.alert_point_count,
1247        dsa.summary.silenced_point_count,
1248        dsa.summary.pass_run_nuisance_proxy,
1249        dsa.summary.numeric_primary_pass_run_nuisance_proxy,
1250        dsa.comparison_summary.ewma.pass_run_nuisance_proxy,
1251        dsa.summary.failure_run_recall,
1252        dsa.summary.failure_runs,
1253        dsa.summary.numeric_primary_failure_run_recall,
1254        dsa.summary.failure_runs,
1255        dsa.summary.watch_point_count,
1256        dsa.summary.review_point_count,
1257        dsa.summary.escalate_point_count,
1258        dsa.episode_summary.raw_boundary_episode_count,
1259        dsa.episode_summary.dsa_episode_count,
1260        format_option_f64(dsa.episode_summary.compression_ratio),
1261        format_option_f64(dsa.episode_summary.precursor_quality),
1262    )));
1263    out.push_str("\n\n");
1264    out
1265}
1266
1267fn predeclared_delta_target_markdown_section(assessment: &DeltaTargetAssessment) -> String {
1268    let mut out = String::new();
1269    out.push_str("## Predeclared Delta Target\n\n");
1270    out.push_str(&format!(
1271        "- Primary target: {}\n- Secondary target: {}\n- EWMA nuisance baseline: {:.6}\n- Current policy-governed DSA nuisance baseline: {:.6}\n- Primary nuisance ceiling implied by the 40% target: {:.6}\n- Secondary nuisance ceiling implied by the 40% target: {:.6}\n\n{}\n\n",
1272        assessment.primary_target_definition,
1273        assessment.secondary_target_definition,
1274        assessment.ewma_nuisance_baseline,
1275        assessment.current_policy_dsa_nuisance_baseline,
1276        assessment.primary_target_nuisance_ceiling,
1277        assessment.secondary_target_nuisance_ceiling,
1278        assessment.assessment_note,
1279    ));
1280    out
1281}
1282
1283fn which_delta_matters_markdown_section(optimization: &OptimizationExecution) -> String {
1284    let targets = &optimization.operator_delta_targets;
1285    let mut out = String::new();
1286    out.push_str("## Which Delta Matters on SECOM\n\n");
1287    out.push_str("On the current SECOM evidence, the operator-facing delta is investigation burden on structurally active pass windows, not binary run-level nuisance alone. This crate therefore evaluates Review/Escalate burden, episode fragmentation, precursor quality, and recall-recovery efficiency before lead-time claims.\n\n");
1288    out.push_str(&format!(
1289        "- Baseline structural investigation points: {}\n- Optimized Review/Escalate points: {}\n- Baseline episode count: {}\n- Optimized episode count: {}\n- Baseline review burden per pass run: {:.4}\n- Optimized review burden per pass run: {:.4}\n\n",
1290        optimization.operator_baselines.baseline_investigation_points,
1291        targets.optimized_review_escalate_points,
1292        optimization.operator_baselines.baseline_episode_count,
1293        targets.optimized_episode_count,
1294        optimization
1295            .operator_baselines
1296            .baseline_review_escalate_points_per_pass_run,
1297        targets.optimized_review_points_per_pass_run,
1298    ));
1299    out
1300}
1301
1302fn true_dsfb_structural_semiotics_markdown_section() -> String {
1303    let mut out = String::new();
1304    out.push_str("## True DSFB Structural Semiotics Instantiation\n\n");
1305    out.push_str("This pass preserves the DSFB Structural Semiotics Engine as an explicit layered architecture: `Residual -> Sign -> Syntax -> Grammar -> Semantics -> Policy`.\n\n");
1306    out.push_str(
1307        "- Residual: deterministic discrepancy from the healthy-window nominal reference.\n",
1308    );
1309    out.push_str("- Sign: per-run tuples `sigma_i(t) = (r_i(t), d_i(t), s_i(t))`, saved in `dsfb_signs.csv` and `dsfb_feature_signs.csv`.\n");
1310    out.push_str("- Syntax: deterministic temporal motifs over sign trajectories, saved in `dsfb_motifs.csv`, `dsfb_motif_labels_per_time.csv`, and `dsfb_feature_motif_timeline.csv`.\n");
1311    out.push_str("- Grammar: admissibility-envelope states, saved in `dsfb_grammar_states.csv`, `dsfb_feature_grammar_states.csv`, and `dsfb_envelope_interaction_summary.csv`.\n");
1312    out.push_str("- Semantics: grammar-qualified heuristic retrieval only after syntax and grammar, saved in `dsfb_semantic_matches.csv` and `dsfb_semantic_ranked_candidates.csv`.\n");
1313    out.push_str("- Policy: operator burden control and bounded recall rescue using semantic outputs plus grammar-qualified persistence, with decisions logged in `dsfb_feature_policy_decisions.csv`.\n\n");
1314    out.push_str("No semantic label in this crate is assigned directly from raw feature magnitude, EWMA, or threshold behavior alone.\n\n");
1315    out
1316}
1317
1318fn grouped_coordinated_semiotics_markdown_section() -> String {
1319    let mut out = String::new();
1320    out.push_str("## Grouped / Coordinated Semiotics\n\n");
1321    out.push_str("Candidate grouped-semiotics structures are logged in `dsfb_group_definitions.json`, with grouped signs, grammar states, and semantic matches emitted only for groups that survive strict validation.\n\n");
1322    out.push_str("- Candidate Group A: `S059`, `S133`\n");
1323    out.push_str("- Candidate Group B: `S123`, `S540`, `S128`\n");
1324    out.push_str("- Candidate Group C: `S104`\n\n");
1325    out.push_str("A group is accepted only when feature co-activation is visible in failure windows and absent in pass runs; otherwise grouped semiotics is explicitly rejected rather than assumed.\n\n");
1326    out
1327}
1328
1329fn missed_failure_analysis_markdown_section(failure_driven: &FailureDrivenArtifacts) -> String {
1330    let mut out = String::new();
1331    out.push_str("## Missed Failure Analysis\n\n");
1332    out.push_str(&format!(
1333        "- Baseline missed failures indexed: {}\n",
1334        failure_driven.failures_index.missed_failure_ids.len()
1335    ));
1336    for case in &failure_driven.failure_cases {
1337        out.push_str(&format!(
1338            "- Failure {}: stage=`{}`, exact_miss_rule=`{}`, optimized_detected=`{}`, artifact=`failure_case_{}.json`\n",
1339            case.failure_id,
1340            case.failure_stage,
1341            case.exact_miss_rule,
1342            case.optimized_detected_by_dsa,
1343            case.failure_id,
1344        ));
1345    }
1346    out.push('\n');
1347    out
1348}
1349
1350fn failure_priority_markdown_section(failure_driven: &FailureDrivenArtifacts) -> String {
1351    let mut out = String::new();
1352    out.push_str("## Failure Priority Ranking\n\n");
1353    if failure_driven.missed_failure_priority.is_empty() {
1354        out.push_str("- No missed-failure priority rows were emitted.\n\n");
1355        return out;
1356    }
1357    for row in failure_driven.missed_failure_priority.iter().take(8) {
1358        out.push_str(&format!(
1359            "- Failure {}: priority_score={:.4}, top_feature={:?}, signal_strength={:.4}, feature_concentration={:.4}, separation_from_noise={:.4}, recoverability_estimate={:.4}, exact_miss_rule=`{}`\n",
1360            row.failure_id,
1361            row.priority_score,
1362            row.top_feature_name,
1363            row.signal_strength,
1364            row.feature_concentration,
1365            row.separation_from_noise,
1366            row.recoverability_estimate,
1367            row.exact_miss_rule,
1368        ));
1369    }
1370    out.push('\n');
1371    out
1372}
1373
1374fn feature_motif_grounding_markdown_section(failure_driven: &FailureDrivenArtifacts) -> String {
1375    let mut out = String::new();
1376    out.push_str("## Feature -> Motif Grounding\n\n");
1377    for row in failure_driven.feature_motif_grounding.iter().take(10) {
1378        out.push_str(&format!(
1379            "- {}: motif=`{}`, dominant_dsfb_motif=`{}`, failure_semantic_hits={}, pass_semantic_hits={}\n",
1380            row.feature_name,
1381            row.motif_type,
1382            row.dominant_dsfb_motif,
1383            row.failure_window_semantic_hits,
1384            row.pass_run_semantic_hits,
1385        ));
1386    }
1387    out.push('\n');
1388    out
1389}
1390
1391fn feature_role_validation_markdown_section(failure_driven: &FailureDrivenArtifacts) -> String {
1392    let mut out = String::new();
1393    out.push_str("## Feature Role Validation\n\n");
1394    for row in &failure_driven.feature_role_validation {
1395        out.push_str(&format!(
1396            "- {}: initial_role=`{}`, initial_motif=`{}`, validation=`{}`, final_role=`{}`, final_motif=`{}`\n",
1397            row.feature_id,
1398            row.initial_role,
1399            row.initial_motif,
1400            row.supported_or_revised_or_rejected,
1401            row.final_role,
1402            row.final_motif,
1403        ));
1404    }
1405    out.push('\n');
1406    out
1407}
1408
1409fn minimal_heuristics_markdown_section(failure_driven: &FailureDrivenArtifacts) -> String {
1410    let mut out = String::new();
1411    out.push_str("## Heuristics With Justification\n\n");
1412    out.push_str(&format!(
1413        "- Minimal heuristic count: {}\n",
1414        failure_driven.minimal_heuristics_bank.len()
1415    ));
1416    for row in &failure_driven.minimal_heuristics_bank {
1417        out.push_str(&format!(
1418            "- {}: target=`{}` / `{}`, status=`{}`, action={}\n",
1419            row.heuristic_id,
1420            row.target_problem_type,
1421            row.target_identifier,
1422            row.status,
1423            row.policy_action,
1424        ));
1425    }
1426    out.push('\n');
1427    out
1428}
1429
1430fn heuristic_provenance_markdown_section(failure_driven: &FailureDrivenArtifacts) -> String {
1431    let mut out = String::new();
1432    out.push_str("## Heuristic Provenance\n\n");
1433    if failure_driven.heuristic_provenance.is_empty() {
1434        out.push_str("- No heuristic provenance rows were emitted.\n\n");
1435        return out;
1436    }
1437    for row in &failure_driven.heuristic_provenance {
1438        out.push_str(&format!(
1439            "- {}: failures=`{}`, features=`{}`, intended_effect=`{}`, nuisance_class=`{}`, motif_signature=`{}`, grammar_states=`{}`\n",
1440            row.heuristic_id,
1441            row.derived_from_failures,
1442            row.uses_features,
1443            row.intended_effect,
1444            row.targets_nuisance_class,
1445            row.motif_signature,
1446            row.allowed_grammar_states,
1447        ));
1448    }
1449    out.push('\n');
1450    out
1451}
1452
1453fn group_validation_markdown_section(failure_driven: &FailureDrivenArtifacts) -> String {
1454    let mut out = String::new();
1455    out.push_str("## Grouped Semiotics Validation\n\n");
1456    if failure_driven.group_validation.is_empty() {
1457        out.push_str("- No group-validation rows were emitted.\n\n");
1458        return out;
1459    }
1460    for row in &failure_driven.group_validation {
1461        out.push_str(&format!(
1462            "- {} [{}]: failure_coactivation={}, pass_coactivation={}, decision=`{}`, reason={}\n",
1463            row.group_id,
1464            row.group_members,
1465            row.failure_coactivation_count,
1466            row.pass_coactivation_count,
1467            row.retained_or_rejected,
1468            row.reason,
1469        ));
1470    }
1471    out.push('\n');
1472    out
1473}
1474
1475fn negative_control_markdown_section(failure_driven: &FailureDrivenArtifacts) -> String {
1476    let report = &failure_driven.negative_control_report;
1477    let mut out = String::new();
1478    out.push_str("## Negative Control\n\n");
1479    out.push_str(&format!(
1480        "- Pass runs: false_activation_rate={:.4}, false_episode_rate={:.4}, review_escalate_points={}, review_escalate_episodes={} ({}/{}, {}/{})\n- Clean windows: false_activation_rate={:.4}, false_episode_rate={:.4}, review_escalate_points={}, review_escalate_episodes={} ({}/{}, {}/{})\n\n",
1481        report.false_activation_rate,
1482        report.false_episode_rate,
1483        report.review_escalate_points_on_pass_runs,
1484        report.review_escalate_episodes_on_pass_runs,
1485        report.pass_run_false_activation_count,
1486        report.pass_run_count,
1487        report.pass_run_false_episode_count,
1488        report.pass_run_count,
1489        report.clean_window_false_activation_rate,
1490        report.clean_window_false_episode_rate,
1491        report.review_escalate_points_on_clean_runs,
1492        report.review_escalate_episodes_on_clean_runs,
1493        report.clean_window_false_activation_count,
1494        report.clean_window_count,
1495        report.clean_window_false_episode_count,
1496        report.clean_window_count,
1497    ));
1498    out
1499}
1500
1501fn dsfb_vs_ewma_markdown_section(failure_driven: &FailureDrivenArtifacts) -> String {
1502    let mut out = String::new();
1503    out.push_str("## DSFB vs EWMA Separation\n\n");
1504    if failure_driven.dsfb_vs_ewma_cases.is_empty() {
1505        out.push_str(
1506            "- No recovered failure produced a DSFB-vs-EWMA case artifact in this run.\n\n",
1507        );
1508        return out;
1509    }
1510    for case in &failure_driven.dsfb_vs_ewma_cases {
1511        out.push_str(&format!(
1512            "- Failure {} recovered on feature `{}`; artifact=`dsfb_vs_ewma_case_{}.json`; EWMA_detected=`{}`.\n",
1513            case.failure_id,
1514            case.recovered_feature_name,
1515            case.failure_id,
1516            case.ewma_detected,
1517        ));
1518    }
1519    out.push('\n');
1520    out
1521}
1522
1523fn predeclared_operator_delta_targets_markdown_section(
1524    optimization: &OptimizationExecution,
1525) -> String {
1526    let targets = &optimization.operator_delta_targets;
1527    let mut out = String::new();
1528    out.push_str("## Predeclared Operator Delta Targets\n\n");
1529    out.push_str("- Target A: `delta_investigation_load >= 0.40`\n");
1530    out.push_str("- Target B: `delta_episode_count >= 0.40`\n");
1531    out.push_str("- Target C: `delta_review_points_per_pass_run >= 0.40`\n");
1532    out.push_str("- Target D: `delta_review_episodes_per_pass_run >= 0.40`\n");
1533    out.push_str("- Target E: precursor quality preserved or improved\n");
1534    out.push_str("- Target F: recall `>= 103/104`\n");
1535    out.push_str("- Target G: recall `= 104/104`\n");
1536    out.push_str("- Target H: nuisance delta thresholds `>= 0.15`, `>= 0.25`, `>= 0.40`\n");
1537    out.push_str(&format!(
1538        "\nBaseline layers used:\n- Investigation load baseline: `{}` ({})\n- Episode baseline: `{}` ({})\n- Review-burden baseline: `{}` ({:.4} points/pass-run)\n\n",
1539        optimization.operator_baselines.investigation_baseline_layer,
1540        optimization.operator_baselines.baseline_investigation_points,
1541        optimization.operator_baselines.episode_baseline_layer,
1542        optimization.operator_baselines.baseline_episode_count,
1543        optimization.operator_baselines.review_burden_baseline_layer,
1544        optimization
1545            .operator_baselines
1546            .baseline_review_escalate_points_per_pass_run,
1547    ));
1548    out.push_str(&format!(
1549        "Selected-row operator deltas:\n- delta_investigation_load = {:.4}\n- delta_episode_count = {:.4}\n- delta_review_points_per_pass_run = {:.4}\n- delta_review_episodes_per_pass_run = {:.4}\n- precursor quality status = {}\n- recall equals threshold = {}\n- recall within tolerance = {}\n\n",
1550        targets.delta_investigation_load,
1551        targets.delta_episode_count,
1552        targets.delta_review_points_per_pass_run,
1553        targets.delta_review_episodes_per_pass_run,
1554        targets.precursor_quality_status,
1555        targets.recall_equals_threshold,
1556        targets.recall_within_tolerance,
1557    ));
1558    out
1559}
1560
1561fn operator_optimization_frontier_markdown_section(optimization: &OptimizationExecution) -> String {
1562    let mut out = String::new();
1563    out.push_str("## Optimization Frontier\n\n");
1564    out.push_str(&format!(
1565        "- Pareto frontier rows: {}\n- Stage 1 burden-reduction candidates: {}\n- Stage 2 recall-recovery candidates: {}\n- Single-change iterations logged: {} (accepted: {})\n",
1566        optimization.pareto_frontier.len(),
1567        optimization.stage1_candidates.len(),
1568        optimization.stage2_candidates.len(),
1569        optimization.single_change_iteration_log.len(),
1570        optimization
1571            .single_change_iteration_log
1572            .iter()
1573            .filter(|row| row.accepted)
1574            .count(),
1575    ));
1576    if let Some(selected) = &optimization
1577        .optimized_execution
1578        .summary
1579        .selected_configuration
1580    {
1581        out.push_str(&format!(
1582            "- Best optimized configuration: {} [{}], W={}, K={}, tau={:.2}, m={}, recall={}/{}, Review/Escalate points={}, episodes={}, precursor quality={}, nuisance={:.4}\n\n",
1583            selected.cohort_name,
1584            selected.ranking_strategy,
1585            selected.window,
1586            selected.persistence_runs,
1587            selected.alert_tau,
1588            selected.corroborating_m,
1589            selected.failure_recall,
1590            selected.failure_runs,
1591            selected.investigation_point_count,
1592            selected.dsa_episode_count,
1593            format_option_f64(selected.precursor_quality),
1594            selected.pass_run_nuisance_proxy,
1595        ));
1596    } else {
1597        out.push('\n');
1598    }
1599    out
1600}
1601
1602fn recall_recovery_efficiency_markdown_section(optimization: &OptimizationExecution) -> String {
1603    let mut out = String::new();
1604    out.push_str("## Recall Recovery Efficiency\n\n");
1605    if optimization.recall_recovery_efficiency.is_empty() {
1606        out.push_str("- No recall-recovery efficiency rows were emitted.\n\n");
1607        return out;
1608    }
1609    for row in &optimization.recall_recovery_efficiency {
1610        out.push_str(&format!(
1611            "- {} -> {}: recovered_failures={}, added_review_escalate_points={}, added_episode_count={}, added_review_points_per_pass_run={:.4}, added_review_episodes_per_pass_run={:.4}, added_nuisance_runs={}, recovered_failures_per_added_review_escalate_point={}, recovered_failures_per_added_episode={}, recovered_failures_per_added_pass_run_burden={}, recovered_failures_per_added_nuisance_run={}\n",
1612            row.baseline_configuration,
1613            row.optimized_configuration,
1614            row.recovered_failures,
1615            row.added_review_escalate_points,
1616            row.added_episode_count,
1617            row.added_review_points_per_pass_run,
1618            row.added_review_episodes_per_pass_run,
1619            row.added_nuisance_runs,
1620            format_option_f64(row.recovered_failures_per_added_review_escalate_point),
1621            format_option_f64(row.recovered_failures_per_added_episode),
1622            format_option_f64(row.recovered_failures_per_added_pass_run_burden),
1623            format_option_f64(row.recovered_failures_per_added_nuisance_run),
1624        ));
1625    }
1626    out.push('\n');
1627    out
1628}
1629
1630fn operator_target_attainment_markdown_section(optimization: &OptimizationExecution) -> String {
1631    let targets = &optimization.operator_delta_targets;
1632    let mut out = String::new();
1633    out.push_str("## Target Attainment Assessment\n\n");
1634    out.push_str(&format!(
1635        "- Target A (`delta_investigation_load >= 0.40`): {}\n- Target B (`delta_episode_count >= 0.40`): {}\n- Target C (`delta_review_points_per_pass_run >= 0.40`): {}\n- Target D (`delta_review_episodes_per_pass_run >= 0.40`): {}\n- Target E (precursor quality preserved or improved): {}\n- Target F (`recall >= 103/104`): {}\n- Target G (`recall = 104/104`): {}\n- Target H nuisance thresholds: >=0.15={}, >=0.25={}, >=0.40={}\n- Mean lead >= EWMA: {}\n- Mean lead >= threshold: {}\n\n",
1636        targets.delta_investigation_load >= 0.40,
1637        targets.delta_episode_count >= 0.40,
1638        targets.delta_review_points_per_pass_run >= 0.40,
1639        targets.delta_review_episodes_per_pass_run >= 0.40,
1640        targets.precursor_quality_status != "degraded",
1641        targets.recall_ge_103,
1642        targets.recall_eq_104,
1643        targets.delta_nuisance_vs_ewma >= 0.15,
1644        targets.delta_nuisance_vs_ewma >= 0.25,
1645        targets.delta_nuisance_vs_ewma >= 0.40,
1646        targets.mean_lead_delta_vs_ewma.unwrap_or(f64::NEG_INFINITY) >= 0.0,
1647        targets.mean_lead_delta_vs_threshold.unwrap_or(f64::NEG_INFINITY) >= 0.0,
1648    ));
1649    out
1650}
1651
1652fn recall_recovery_diagnostics_markdown_section(optimization: &OptimizationExecution) -> String {
1653    let baseline = optimization
1654        .baseline_execution
1655        .summary
1656        .selected_configuration
1657        .as_ref();
1658    let optimized = optimization
1659        .optimized_execution
1660        .summary
1661        .selected_configuration
1662        .as_ref();
1663    let mut out = String::new();
1664    out.push_str("## Recall Recovery Diagnostics\n\n");
1665    if let Some(baseline) = baseline {
1666        out.push_str(&format!(
1667            "- Previous limiting result: {} with recall {}/{}, nuisance {:.4}, mean lead {}\n",
1668            baseline.cohort_name,
1669            baseline.failure_recall,
1670            baseline.failure_runs,
1671            baseline.pass_run_nuisance_proxy,
1672            format_option_f64(baseline.mean_lead_time_runs),
1673        ));
1674    }
1675    if let Some(optimized) = optimized {
1676        out.push_str(&format!(
1677            "- Optimized result: {} [{}] with recall {}/{}, nuisance {:.4}, mean lead {}, rescued points {}, Watch->Review rescues {}\n",
1678            optimized.cohort_name,
1679            optimized.ranking_strategy,
1680            optimized.failure_recall,
1681            optimized.failure_runs,
1682            optimized.pass_run_nuisance_proxy,
1683            format_option_f64(optimized.mean_lead_time_runs),
1684            optimized.rescued_point_count,
1685            optimized.rescued_watch_to_review_points,
1686        ));
1687    }
1688    out.push_str("- Rescue rules added: bounded feature-level near-miss rescue on explicit override features only; no global threshold reduction.\n");
1689    if let (Some(baseline), Some(optimized)) = (baseline, optimized) {
1690        out.push_str(&format!(
1691            "- Recall delta: {} -> {} (change {}). Nuisance delta: {:.4} -> {:.4}.\n\n",
1692            baseline.failure_recall,
1693            optimized.failure_recall,
1694            optimized.failure_recall as i64 - baseline.failure_recall as i64,
1695            baseline.pass_run_nuisance_proxy,
1696            optimized.pass_run_nuisance_proxy,
1697        ));
1698    } else {
1699        out.push('\n');
1700    }
1701    out
1702}
1703
1704fn feature_aware_governance_markdown_section(optimization: &OptimizationExecution) -> String {
1705    let mut out = String::new();
1706    out.push_str("## Feature-Aware Heuristic Governance\n\n");
1707    out.push_str("- Motif defaults remain the global policy baseline.\n");
1708    out.push_str(&format!(
1709        "- Explicit feature overrides written: {}\n",
1710        optimization.feature_policy_overrides.len()
1711    ));
1712    if optimization.feature_policy_overrides.is_empty() {
1713        out.push_str("- No feature-specific overrides met the deterministic selection rule.\n\n");
1714        return out;
1715    }
1716    out.push_str("| Feature | Rescue priority | Persistence override | Corroboration override | Window | Hits | Max fragmentation | Review-without-escalate | Suppress-if-isolated |\n");
1717    out.push_str("|---|---:|---|---|---:|---:|---:|---|---|\n");
1718    for row in &optimization.feature_policy_summary {
1719        out.push_str(&format!(
1720            "| {} | {} | {} | {} | {} | {} | {} | {} | {} |\n",
1721            row.feature_name,
1722            row.rescue_priority,
1723            row.requires_persistence_override
1724                .map(|value| value.to_string())
1725                .unwrap_or_else(|| "default".into()),
1726            row.requires_corroboration_override
1727                .map(|value| value.to_string())
1728                .unwrap_or_else(|| "default".into()),
1729            row.minimum_window_override
1730                .map(|value| value.to_string())
1731                .unwrap_or_else(|| "default".into()),
1732            row.minimum_hits_override
1733                .map(|value| value.to_string())
1734                .unwrap_or_else(|| "default".into()),
1735            row.maximum_allowed_fragmentation_override
1736                .map(|value| format!("{value:.4}"))
1737                .unwrap_or_else(|| "default".into()),
1738            row.allow_review_without_escalate
1739                .map(|value| value.to_string())
1740                .unwrap_or_else(|| "default".into()),
1741            row.suppress_if_isolated
1742                .map(|value| value.to_string())
1743                .unwrap_or_else(|| "default".into()),
1744        ));
1745    }
1746    out.push('\n');
1747    for row in &optimization.feature_policy_summary {
1748        out.push_str(&format!(
1749            "- {}: {}\n",
1750            row.feature_name, row.override_reason
1751        ));
1752    }
1753    out.push('\n');
1754    out
1755}
1756
1757fn missed_failure_diagnostics_markdown_section(optimization: &OptimizationExecution) -> String {
1758    let mut out = String::new();
1759    out.push_str("## Missed-Failure Diagnostics\n\n");
1760    if optimization.missed_failure_diagnostics.is_empty() {
1761        out.push_str("- No baseline-missed failures remained to diagnose.\n\n");
1762        return out;
1763    }
1764    for row in &optimization.missed_failure_diagnostics {
1765        out.push_str(&format!(
1766            "- Failure {}: nearest feature {:?}, score {}, policy_state {:?}, resolved_class {:?}, consistent={}, fragmentation={}, exact miss rule `{}`, recovered_after_optimization={}, bounded_rescue_would_recover={}\n",
1767            row.failure_run_index,
1768            row.nearest_feature_name,
1769            format_option_f64(row.nearest_feature_score),
1770            row.nearest_feature_policy_state,
1771            row.nearest_feature_resolved_alert_class,
1772            format_option_bool(row.nearest_feature_consistent),
1773            format_option_f64(row.nearest_feature_fragmentation_proxy_w),
1774            row.exact_miss_rule,
1775            row.recovered_after_optimization,
1776            row.bounded_rescue_would_recover,
1777        ));
1778    }
1779    out.push('\n');
1780    if !optimization.recall_critical_features.is_empty() {
1781        out.push_str(&format!(
1782            "- Recall-critical feature rows written: {} (`dsa_recall_critical_features.csv`).\n\n",
1783            optimization.recall_critical_features.len()
1784        ));
1785    }
1786    out
1787}
1788
1789fn two_stage_optimization_frontier_markdown_section(
1790    optimization: &OptimizationExecution,
1791    assessment: &DeltaTargetAssessment,
1792) -> String {
1793    let mut out = String::new();
1794    out.push_str("## Two-Stage Optimization Frontier\n\n");
1795    out.push_str(&format!(
1796        "- Pareto frontier rows: {}\n- Stage A nuisance-first candidates: {}\n- Stage B recall-recovery candidates: {}\n",
1797        optimization.pareto_frontier.len(),
1798        optimization.stage_a_candidates.len(),
1799        optimization.stage_b_candidates.len(),
1800    ));
1801    if let Some(selected) = &optimization
1802        .optimized_execution
1803        .summary
1804        .selected_configuration
1805    {
1806        out.push_str(&format!(
1807            "- Best achieved configuration: {} [{}], W={}, K={}, tau={:.2}, m={}, recall={}/{}, nuisance {:.4}, mean lead {}, precursor quality {}, compression {}\n",
1808            selected.cohort_name,
1809            selected.ranking_strategy,
1810            selected.window,
1811            selected.persistence_runs,
1812            selected.alert_tau,
1813            selected.corroborating_m,
1814            selected.failure_recall,
1815            selected.failure_runs,
1816            selected.pass_run_nuisance_proxy,
1817            format_option_f64(selected.mean_lead_time_runs),
1818            format_option_f64(selected.precursor_quality),
1819            format_option_f64(selected.compression_ratio),
1820        ));
1821    }
1822    if let Some(best_stage_a) = &assessment.best_stage_a_delta_candidate {
1823        out.push_str(&format!(
1824            "- Best Stage A nuisance-collapse candidate: {} with delta_nuisance_vs_ewma {:.4}, delta_nuisance_vs_current_dsa {:.4}, recall {}/{}\n",
1825            best_stage_a.configuration,
1826            best_stage_a.delta_nuisance_vs_ewma,
1827            best_stage_a.delta_nuisance_vs_current_dsa,
1828            best_stage_a.failure_recall,
1829            best_stage_a.failure_runs,
1830        ));
1831    }
1832    if let Some(best_recall_103) = &assessment.best_recall_103_candidate {
1833        out.push_str(&format!(
1834            "- Best recall-preserving candidate (>=103/104): {} with delta_nuisance_vs_ewma {:.4}, nuisance {:.4}, precursor quality {}, compression {}\n\n",
1835            best_recall_103.configuration,
1836            best_recall_103.delta_nuisance_vs_ewma,
1837            best_recall_103.pass_run_nuisance_proxy,
1838            format_option_f64(best_recall_103.precursor_quality),
1839            format_option_f64(best_recall_103.compression_ratio),
1840        ));
1841    } else {
1842        out.push('\n');
1843    }
1844    out
1845}
1846
1847fn target_attainment_markdown_section(assessment: &DeltaTargetAssessment) -> String {
1848    let mut out = String::new();
1849    out.push_str("## Legacy Nuisance Target Assessment\n\n");
1850    out.push_str(&format!(
1851        "- Primary target reached: {}\n- Ideal target reached: {}\n- Secondary target reached: {}\n- Selected delta vs EWMA: {:.4}\n- Selected delta vs current policy DSA: {:.4}\n- Mean lead >= EWMA: {}\n- Mean lead >= threshold: {}\n\n{}\n\n",
1852        assessment.primary_target_met,
1853        assessment.ideal_target_met,
1854        assessment.secondary_target_met,
1855        assessment.selected_configuration.delta_nuisance_vs_ewma,
1856        assessment.selected_configuration.delta_nuisance_vs_current_dsa,
1857        assessment.mean_lead_time_ge_ewma,
1858        assessment.mean_lead_time_ge_threshold,
1859        assessment.assessment_note,
1860    ));
1861    out
1862}
1863
1864fn optimization_sections_latex(
1865    optimization: &OptimizationExecution,
1866    assessment: &DeltaTargetAssessment,
1867) -> String {
1868    let mut out = String::new();
1869    out.push_str("\\section*{Predeclared Delta Target}\n");
1870    out.push_str(&latex_escape(&format!(
1871        "Primary target: {}. Secondary target: {}. EWMA nuisance baseline {:.6}; current policy-governed DSA nuisance baseline {:.6}. Primary nuisance ceiling {:.6}; secondary nuisance ceiling {:.6}. {}",
1872        assessment.primary_target_definition,
1873        assessment.secondary_target_definition,
1874        assessment.ewma_nuisance_baseline,
1875        assessment.current_policy_dsa_nuisance_baseline,
1876        assessment.primary_target_nuisance_ceiling,
1877        assessment.secondary_target_nuisance_ceiling,
1878        assessment.assessment_note,
1879    )));
1880    out.push_str("\n\n");
1881    out.push_str("\\section*{Recall Recovery Diagnostics}\n");
1882    if let Some(baseline) = &optimization
1883        .baseline_execution
1884        .summary
1885        .selected_configuration
1886    {
1887        out.push_str(&latex_escape(&format!(
1888            "Previous limiting result: {} with recall {}/{}, nuisance {:.4}, mean lead {}.",
1889            baseline.cohort_name,
1890            baseline.failure_recall,
1891            baseline.failure_runs,
1892            baseline.pass_run_nuisance_proxy,
1893            format_option_f64(baseline.mean_lead_time_runs),
1894        )));
1895        out.push_str("\n\n");
1896    }
1897    if let Some(optimized_row) = &optimization
1898        .optimized_execution
1899        .summary
1900        .selected_configuration
1901    {
1902        out.push_str(&latex_escape(&format!(
1903            "Optimized result: {} [{}] with recall {}/{}, nuisance {:.4}, mean lead {}, rescued points {}, Watch-to-Review rescues {}.",
1904            optimized_row.cohort_name,
1905            optimized_row.ranking_strategy,
1906            optimized_row.failure_recall,
1907            optimized_row.failure_runs,
1908            optimized_row.pass_run_nuisance_proxy,
1909            format_option_f64(optimized_row.mean_lead_time_runs),
1910            optimized_row.rescued_point_count,
1911            optimized_row.rescued_watch_to_review_points,
1912        )));
1913        out.push_str("\n\n");
1914    }
1915    out.push_str("\\section*{Feature-Aware Heuristic Governance}\n");
1916    out.push_str(&latex_escape(&format!(
1917        "Explicit feature overrides written: {}. Recall-critical feature rows written: {}.",
1918        optimization.feature_policy_overrides.len(),
1919        optimization.recall_critical_features.len(),
1920    )));
1921    out.push_str("\n\n");
1922    out.push_str("\\section*{Missed-Failure Diagnostics}\n");
1923    out.push_str(&latex_escape(&format!(
1924        "Baseline missed failures diagnosed: {}.",
1925        optimization.missed_failure_diagnostics.len(),
1926    )));
1927    out.push_str("\n\n");
1928    out.push_str("\\section*{Two-Stage Optimization Frontier}\n");
1929    out.push_str(&latex_escape(&format!(
1930        "Pareto frontier rows: {}. Stage A nuisance-first candidates: {}. Stage B recall-recovery candidates: {}.",
1931        optimization.pareto_frontier.len(),
1932        optimization.stage_a_candidates.len(),
1933        optimization.stage_b_candidates.len(),
1934    )));
1935    out.push_str("\n\n");
1936    out.push_str("\\section*{Legacy Nuisance Target Assessment}\n");
1937    out.push_str(&latex_escape(&format!(
1938        "Primary target reached: {}. Ideal target reached: {}. Secondary target reached: {}. Selected delta vs EWMA {:.4}; selected delta vs current policy DSA {:.4}. Mean lead >= EWMA: {}. Mean lead >= threshold: {}.",
1939        assessment.primary_target_met,
1940        assessment.ideal_target_met,
1941        assessment.secondary_target_met,
1942        assessment.selected_configuration.delta_nuisance_vs_ewma,
1943        assessment.selected_configuration.delta_nuisance_vs_current_dsa,
1944        assessment.mean_lead_time_ge_ewma,
1945        assessment.mean_lead_time_ge_threshold,
1946    )));
1947    out.push_str("\n\n");
1948    out
1949}
1950
1951fn true_dsfb_structural_semiotics_latex_section() -> String {
1952    let mut out = String::new();
1953    out.push_str("\\section*{True DSFB Structural Semiotics Instantiation}\n");
1954    out.push_str(&latex_escape(
1955        "This pass preserves the DSFB Structural Semiotics Engine as an explicit layered architecture: Residual -> Sign -> Syntax -> Grammar -> Semantics -> Policy. Residuals are saved first, sign tuples sigma_i(t) = (r_i(t), d_i(t), s_i(t)) are exported in dsfb_signs.csv and dsfb_feature_signs.csv, syntax motifs are exported in dsfb_motifs.csv and dsfb_feature_motif_timeline.csv, grammar states are exported in dsfb_grammar_states.csv and dsfb_feature_grammar_states.csv, semantics are exported in dsfb_semantic_matches.csv and dsfb_semantic_ranked_candidates.csv, and policy decisions are saved in dsfb_feature_policy_decisions.csv. No semantic label is assigned directly from raw feature magnitude or scalar baselines alone.",
1956    ));
1957    out.push_str("\n\n");
1958    out
1959}
1960
1961fn grouped_coordinated_semiotics_latex_section() -> String {
1962    let mut out = String::new();
1963    out.push_str("\\section*{Grouped / Coordinated Semiotics}\n");
1964    out.push_str(&latex_escape(
1965        "Candidate grouped semiotics is logged in dsfb_group_definitions.json, and grouped signs, grouped grammar states, and grouped semantic matches are exported only for groups that survive strict failure-vs-pass validation. Grouped structure is therefore tested rather than assumed and does not assert unique causal meaning.",
1966    ));
1967    out.push_str("\n\n");
1968    out
1969}
1970
1971fn missed_failure_analysis_latex_section(failure_driven: &FailureDrivenArtifacts) -> String {
1972    let mut out = String::new();
1973    out.push_str("\\section*{Missed Failure Analysis}\n");
1974    out.push_str(&latex_escape(&format!(
1975        "Baseline missed failures indexed: {}. Failure-case artifacts were written as failure_case_<id>.json for each baseline miss.",
1976        failure_driven.failures_index.missed_failure_ids.len()
1977    )));
1978    out.push_str("\n\n");
1979    out
1980}
1981
1982fn failure_priority_latex_section(failure_driven: &FailureDrivenArtifacts) -> String {
1983    let mut out = String::new();
1984    out.push_str("\\section*{Failure Priority Ranking}\n");
1985    if let Some(row) = failure_driven.missed_failure_priority.first() {
1986        out.push_str(&latex_escape(&format!(
1987            "Highest-priority missed failure: {} with priority score {:.4}, top feature {:?}, and miss rule {}.",
1988            row.failure_id, row.priority_score, row.top_feature_name, row.exact_miss_rule
1989        )));
1990    } else {
1991        out.push_str("No missed-failure priority rows were produced.");
1992    }
1993    out.push_str("\n\n");
1994    out
1995}
1996
1997fn feature_motif_grounding_latex_section(failure_driven: &FailureDrivenArtifacts) -> String {
1998    let mut out = String::new();
1999    out.push_str("\\section*{Feature to Motif Grounding}\n");
2000    if let Some(row) = failure_driven.feature_motif_grounding.first() {
2001        out.push_str(&latex_escape(&format!(
2002            "Grounding artifacts were written to feature_motif_grounding.json. Example: {} grounded as {} with dominant DSFB motif {}.",
2003            row.feature_name, row.motif_type, row.dominant_dsfb_motif
2004        )));
2005    } else {
2006        out.push_str("No feature-to-motif grounding rows were produced.");
2007    }
2008    out.push_str("\n\n");
2009    out
2010}
2011
2012fn feature_role_validation_latex_section(failure_driven: &FailureDrivenArtifacts) -> String {
2013    let mut out = String::new();
2014    out.push_str("\\section*{Feature Role Validation}\n");
2015    if let Some(row) = failure_driven.feature_role_validation.first() {
2016        out.push_str(&latex_escape(&format!(
2017            "Feature-role validation rows produced: {}. Example: {} starts as role {} with initial motif {}, is marked {}, and ends at role {} with motif {}.",
2018            failure_driven.feature_role_validation.len(),
2019            row.feature_id,
2020            row.initial_role,
2021            row.initial_motif,
2022            row.supported_or_revised_or_rejected,
2023            row.final_role,
2024            row.final_motif,
2025        )));
2026    } else {
2027        out.push_str("No feature-role validation rows were produced.");
2028    }
2029    out.push_str("\n\n");
2030    out
2031}
2032
2033fn minimal_heuristics_latex_section(failure_driven: &FailureDrivenArtifacts) -> String {
2034    let mut out = String::new();
2035    out.push_str("\\section*{Heuristics With Justification}\n");
2036    out.push_str(&latex_escape(&format!(
2037        "Failure-driven minimal heuristics bank size: {}. The bank is written to dsfb_heuristics_bank_minimal.json and each entry targets one missed failure or one nuisance class.",
2038        failure_driven.minimal_heuristics_bank.len()
2039    )));
2040    out.push_str("\n\n");
2041    out
2042}
2043
2044fn heuristic_provenance_latex_section(failure_driven: &FailureDrivenArtifacts) -> String {
2045    let mut out = String::new();
2046    out.push_str("\\section*{Heuristic Provenance}\n");
2047    out.push_str(&latex_escape(&format!(
2048        "Heuristic provenance rows produced: {}. Every minimal heuristic is linked to explicit failure IDs, feature IDs, nuisance class, intended effect, and constraints in dsfb_heuristic_provenance.csv.",
2049        failure_driven.heuristic_provenance.len()
2050    )));
2051    out.push_str("\n\n");
2052    out
2053}
2054
2055fn group_validation_latex_section(failure_driven: &FailureDrivenArtifacts) -> String {
2056    let mut out = String::new();
2057    out.push_str("\\section*{Grouped Semiotics Validation}\n");
2058    out.push_str(&latex_escape(&format!(
2059        "Grouped semiotics validation rows produced: {}. Each candidate group records failure co-activation, pass co-activation, retain/reject status, and reason in dsfb_group_validation.csv.",
2060        failure_driven.group_validation.len()
2061    )));
2062    out.push_str("\n\n");
2063    out
2064}
2065
2066fn negative_control_latex_section(failure_driven: &FailureDrivenArtifacts) -> String {
2067    let report = &failure_driven.negative_control_report;
2068    let mut out = String::new();
2069    out.push_str("\\section*{Negative Control}\n");
2070    out.push_str(&latex_escape(&format!(
2071        "Pass-run false activation rate {:.4}, pass-run false episode rate {:.4}, pass-run Review/Escalate points {}, pass-run Review/Escalate episodes {}, clean-window false activation rate {:.4}, clean-window false episode rate {:.4}, clean-window Review/Escalate points {}, and clean-window Review/Escalate episodes {}.",
2072        report.false_activation_rate,
2073        report.false_episode_rate,
2074        report.review_escalate_points_on_pass_runs,
2075        report.review_escalate_episodes_on_pass_runs,
2076        report.clean_window_false_activation_rate,
2077        report.clean_window_false_episode_rate,
2078        report.review_escalate_points_on_clean_runs,
2079        report.review_escalate_episodes_on_clean_runs,
2080    )));
2081    out.push_str("\n\n");
2082    out
2083}
2084
2085fn dsfb_vs_ewma_latex_section(failure_driven: &FailureDrivenArtifacts) -> String {
2086    let mut out = String::new();
2087    out.push_str("\\section*{DSFB vs EWMA Separation}\n");
2088    out.push_str(&latex_escape(&format!(
2089        "Recovered DSFB-vs-EWMA case files produced: {}.",
2090        failure_driven.dsfb_vs_ewma_cases.len()
2091    )));
2092    out.push_str("\n\n");
2093    out
2094}
2095
2096fn operator_sections_latex(optimization: &OptimizationExecution) -> String {
2097    let targets = &optimization.operator_delta_targets;
2098    let mut out = String::new();
2099    out.push_str("\\section*{Which Delta Matters on SECOM}\n");
2100    out.push_str(&latex_escape(
2101        "On the current SECOM evidence, the operator-facing delta is investigation burden on structurally active pass windows, not binary run-level nuisance alone. This report therefore prioritizes Review/Escalate burden, episode fragmentation, precursor quality, and recall-recovery efficiency before lead-time claims.",
2102    ));
2103    out.push_str("\n\n");
2104    out.push_str("\\section*{Predeclared Operator Delta Targets}\n");
2105    out.push_str(&latex_escape(&format!(
2106        "Target A: delta_investigation_load >= 0.40. Target B: delta_episode_count >= 0.40. Target C: delta_review_points_per_pass_run >= 0.40. Target D: delta_review_episodes_per_pass_run >= 0.40. Target E: precursor quality preserved or improved. Target F: recall >= 103/104. Target G: recall = 104/104. Investigation baseline {} = {}. Episode baseline {} = {}. Review-burden baseline {} = {:.4} points/pass-run.",
2107        optimization.operator_baselines.investigation_baseline_layer,
2108        optimization.operator_baselines.baseline_investigation_points,
2109        optimization.operator_baselines.episode_baseline_layer,
2110        optimization.operator_baselines.baseline_episode_count,
2111        optimization.operator_baselines.review_burden_baseline_layer,
2112        optimization
2113            .operator_baselines
2114            .baseline_review_escalate_points_per_pass_run,
2115    )));
2116    out.push_str("\n\n");
2117    out.push_str("\\section*{Optimization Frontier}\n");
2118    out.push_str(&latex_escape(&format!(
2119        "Pareto frontier rows: {}. Stage 1 burden-reduction candidates: {}. Stage 2 recall-recovery candidates: {}. Single-change iterations logged: {} with {} accepted.",
2120        optimization.pareto_frontier.len(),
2121        optimization.stage1_candidates.len(),
2122        optimization.stage2_candidates.len(),
2123        optimization.single_change_iteration_log.len(),
2124        optimization
2125            .single_change_iteration_log
2126            .iter()
2127            .filter(|row| row.accepted)
2128            .count(),
2129    )));
2130    out.push_str("\n\n");
2131    out.push_str("\\section*{Recall Recovery Efficiency}\n");
2132    if let Some(row) = optimization.recall_recovery_efficiency.first() {
2133        out.push_str(&latex_escape(&format!(
2134            "{} to {} recovered {} failures with added Review/Escalate points {}, added episodes {}, added pass-run review burden {:.4}, and added nuisance runs {}.",
2135            row.baseline_configuration,
2136            row.optimized_configuration,
2137            row.recovered_failures,
2138            row.added_review_escalate_points,
2139            row.added_episode_count,
2140            row.added_review_points_per_pass_run,
2141            row.added_nuisance_runs,
2142        )));
2143        out.push_str("\n\n");
2144    }
2145    out.push_str("\\section*{Target Attainment Assessment}\n");
2146    out.push_str(&latex_escape(&format!(
2147        "delta_investigation_load {:.4}. delta_episode_count {:.4}. delta_review_points_per_pass_run {:.4}. delta_review_episodes_per_pass_run {:.4}. precursor quality status {}. recall >= 103/104 {}. recall = 104/104 {}. delta_nuisance_vs_ewma {:.4}.",
2148        targets.delta_investigation_load,
2149        targets.delta_episode_count,
2150        targets.delta_review_points_per_pass_run,
2151        targets.delta_review_episodes_per_pass_run,
2152        targets.precursor_quality_status,
2153        targets.recall_ge_103,
2154        targets.recall_eq_104,
2155        targets.delta_nuisance_vs_ewma,
2156    )));
2157    out.push_str("\n\n");
2158    out
2159}
2160
2161fn artifact_inventory(
2162    figures: &FigureManifest,
2163    include_cohort_failure_analysis: bool,
2164    include_rating_failure_analysis: bool,
2165) -> Vec<ArtifactInventoryEntry> {
2166    let mut entries = vec![
2167        ArtifactInventoryEntry {
2168            path: "dataset_summary.json".into(),
2169            role: "Dataset summary and healthy-window counts.".into(),
2170        },
2171        ArtifactInventoryEntry {
2172            path: "parameter_manifest.json".into(),
2173            role: "Saved deterministic DSFB parameter values.".into(),
2174        },
2175        ArtifactInventoryEntry {
2176            path: "dsa_parameter_manifest.json".into(),
2177            role: "Saved deterministic DSA parameter values, fixed weights, run-level signal choice, and consistency rule.".into(),
2178        },
2179        ArtifactInventoryEntry {
2180            path: "run_configuration.json".into(),
2181            role: "CLI, data-root, and output-root configuration.".into(),
2182        },
2183        ArtifactInventoryEntry {
2184            path: "benchmark_metrics.json".into(),
2185            role: "Top-level benchmark metrics, summaries, and feature metrics.".into(),
2186        },
2187        ArtifactInventoryEntry {
2188            path: "baseline_comparison_summary.json".into(),
2189            role: "Baseline comparison summary across DSFB, threshold, EWMA, CUSUM, run energy, PCA T2/SPE, and DSA.".into(),
2190        },
2191        ArtifactInventoryEntry {
2192            path: "dsa_vs_baselines.json".into(),
2193            role: "Saved DSA recall, lead-time, nuisance, validation, and compression summary.".into(),
2194        },
2195        ArtifactInventoryEntry {
2196            path: "dsa_grid_results.csv".into(),
2197            role: "Full bounded cohort DSA grid with cohort, W, K, tau, and corroboration m.".into(),
2198        },
2199        ArtifactInventoryEntry {
2200            path: "dsa_grid_summary.json".into(),
2201            role: "Saved cohort-grid summary, closest-to-success row, corroboration effect, and limiting-factor analysis.".into(),
2202        },
2203        ArtifactInventoryEntry {
2204            path: "dsa_feature_ranking.csv".into(),
2205            role: "Deterministic analyzable-feature ranking used for cohort selection.".into(),
2206        },
2207        ArtifactInventoryEntry {
2208            path: "dsa_feature_ranking_recall_aware.csv".into(),
2209            role: "Recall-aware deterministic feature ranking emphasizing pre-failure coverage.".into(),
2210        },
2211        ArtifactInventoryEntry {
2212            path: "dsa_feature_ranking_dsfb_aware.csv".into(),
2213            role: "DSFB-semantics-aware ranking emphasizing grammar-qualified semantic persistence, grouped support, and bounded burden penalties.".into(),
2214        },
2215        ArtifactInventoryEntry {
2216            path: "dsa_feature_ranking_burden_aware.csv".into(),
2217            role: "Operator-burden-aware feature ranking that penalizes pass-run Review/Escalate burden.".into(),
2218        },
2219        ArtifactInventoryEntry {
2220            path: "dsa_feature_ranking_comparison.csv".into(),
2221            role: "Side-by-side comparison of compression-biased, recall-aware, burden-aware, and DSFB-semantics-aware ranking positions.".into(),
2222        },
2223        ArtifactInventoryEntry {
2224            path: "dsa_seed_feature_check.json".into(),
2225            role: "Standalone seed-feature inclusion report for S059, S044, S061, S222, S354, and S173.".into(),
2226        },
2227        ArtifactInventoryEntry {
2228            path: "dsa_feature_cohorts.json".into(),
2229            role: "Explicit top_4, top_8, top_16, and all-feature cohorts plus seed-feature inclusion report.".into(),
2230        },
2231        ArtifactInventoryEntry {
2232            path: "dsa_feature_policy_overrides.json".into(),
2233            role: "Explicit feature-aware heuristic override table and rescue eligibility.".into(),
2234        },
2235        ArtifactInventoryEntry {
2236            path: "dsa_feature_policy_summary.csv".into(),
2237            role: "Feature-level policy summary with override rationale and ranking positions.".into(),
2238        },
2239        ArtifactInventoryEntry {
2240            path: "dsa_recall_rescue_results.csv".into(),
2241            role: "Per-configuration rescue activation counts and recovered-alert summaries.".into(),
2242        },
2243        ArtifactInventoryEntry {
2244            path: "dsa_recall_critical_features.csv".into(),
2245            role: "Per-missed-failure recall-critical feature table with closest structural candidates and bounded override recoverability.".into(),
2246        },
2247        ArtifactInventoryEntry {
2248            path: "dsa_pareto_frontier.csv".into(),
2249            role: "Nuisance-versus-recall Pareto frontier across the optimized search.".into(),
2250        },
2251        ArtifactInventoryEntry {
2252            path: "dsa_stage_a_candidates.csv".into(),
2253            role: "Stage A nuisance-first candidate set with recall kept at or above 100/104.".into(),
2254        },
2255        ArtifactInventoryEntry {
2256            path: "dsa_stage_b_candidates.csv".into(),
2257            role: "Stage B recall-recovery candidates selected from the nuisance-first frontier.".into(),
2258        },
2259        ArtifactInventoryEntry {
2260            path: "dsa_stage1_candidates.csv".into(),
2261            role: "Stage 1 burden-reduction candidates under the operator-priority objective.".into(),
2262        },
2263        ArtifactInventoryEntry {
2264            path: "dsa_stage2_candidates.csv".into(),
2265            role: "Stage 2 recall-recovery candidates under the operator-priority objective.".into(),
2266        },
2267        ArtifactInventoryEntry {
2268            path: "dsa_missed_failure_diagnostics.csv".into(),
2269            role: "Per-failure diagnostic table for baseline-missed failures and rescue recoverability.".into(),
2270        },
2271        ArtifactInventoryEntry {
2272            path: "dsa_operator_baselines.json".into(),
2273            role: "Explicit operator-burden baseline layers: numeric-only DSA, current policy DSA, and raw boundary.".into(),
2274        },
2275        ArtifactInventoryEntry {
2276            path: "dsa_operator_delta_targets.json".into(),
2277            role: "Predeclared operator delta targets and selected-row attainment numbers.".into(),
2278        },
2279        ArtifactInventoryEntry {
2280            path: "dsa_operator_delta_attainment_matrix.csv".into(),
2281            role: "Explicit pass/fail matrix for the operator-facing burden, recall, nuisance, and lead thresholds.".into(),
2282        },
2283        ArtifactInventoryEntry {
2284            path: "dsa_policy_operator_burden_contributions.csv".into(),
2285            role: "Motif- and feature-level contributions to operator burden and recovered recall.".into(),
2286        },
2287        ArtifactInventoryEntry {
2288            path: "dsa_recall_recovery_efficiency.csv".into(),
2289            role: "Recovered failures per added Review/Escalate point, per added episode, per added burden, and per added nuisance run.".into(),
2290        },
2291        ArtifactInventoryEntry {
2292            path: "dsfb_single_change_iteration_log.csv".into(),
2293            role: "Failure- or nuisance-justified single-change optimization log with per-iteration metric deltas and acceptance decisions.".into(),
2294        },
2295        ArtifactInventoryEntry {
2296            path: "optimization_log.json".into(),
2297            role: "JSON mirror of the single-change optimization log for deterministic audit and replay.".into(),
2298        },
2299        ArtifactInventoryEntry {
2300            path: "missed_failure_priority.csv".into(),
2301            role: "Priority-ranked missed failures using signal strength, feature concentration, separation from noise, and recoverability estimate.".into(),
2302        },
2303        ArtifactInventoryEntry {
2304            path: "feature_to_motif.json".into(),
2305            role: "Hard-locked feature-to-motif assignment for the top failure-relevant SECOM features.".into(),
2306        },
2307        ArtifactInventoryEntry {
2308            path: "negative_control_report.json".into(),
2309            role: "Pass-run and clean-window false-activation and false-episode rates used as anti-overfit controls.".into(),
2310        },
2311        ArtifactInventoryEntry {
2312            path: "non_intrusive_interface_spec.md".into(),
2313            role: "Run-local advisory-only interface contract documenting the read-only side-channel integration model.".into(),
2314        },
2315        ArtifactInventoryEntry {
2316            path: "dsfb_heuristic_provenance.csv".into(),
2317            role: "Explicit failure IDs, feature IDs, nuisance class, intended effect, and constraints for each minimal heuristic.".into(),
2318        },
2319        ArtifactInventoryEntry {
2320            path: "dsfb_feature_role_validation.csv".into(),
2321            role: "Empirical support, revision, or rejection of the locked SECOM feature-role scaffold.".into(),
2322        },
2323        ArtifactInventoryEntry {
2324            path: "dsfb_group_validation.csv".into(),
2325            role: "Failure/pass co-activation validation table for the locked grouped-semiotics candidates.".into(),
2326        },
2327        ArtifactInventoryEntry {
2328            path: "dsa_cohort_results.csv".into(),
2329            role: "Cohort-level DSA nuisance, recall, lead-time, episode, compression, and corroboration sweep results.".into(),
2330        },
2331        ArtifactInventoryEntry {
2332            path: "dsa_cohort_results_recall_aware.csv".into(),
2333            role: "Recall-aware cohort results under the optimized deterministic rescue policy.".into(),
2334        },
2335        ArtifactInventoryEntry {
2336            path: "dsa_cohort_results_dsfb_aware.csv".into(),
2337            role: "DSFB-semantics-aware cohort results under the optimized deterministic rescue policy.".into(),
2338        },
2339        ArtifactInventoryEntry {
2340            path: "dsa_cohort_results_burden_aware.csv".into(),
2341            role: "Burden-aware cohort results under the optimized deterministic rescue policy.".into(),
2342        },
2343        ArtifactInventoryEntry {
2344            path: "dsa_cohort_summary.json".into(),
2345            role: "Saved cohort-level DSA summary, closest-to-success row, and best cohort when present.".into(),
2346        },
2347        ArtifactInventoryEntry {
2348            path: "dsa_cohort_summary_recall_aware.json".into(),
2349            role: "Recall-aware cohort summary for direct comparison with the compression-biased ranking.".into(),
2350        },
2351        ArtifactInventoryEntry {
2352            path: "dsa_cohort_summary_dsfb_aware.json".into(),
2353            role: "DSFB-semantics-aware cohort summary for direct comparison with the other ranking strategies.".into(),
2354        },
2355        ArtifactInventoryEntry {
2356            path: "dsa_cohort_summary_burden_aware.json".into(),
2357            role: "Burden-aware cohort summary for direct comparison with the other ranking strategies.".into(),
2358        },
2359        ArtifactInventoryEntry {
2360            path: "dsa_cohort_precursor_quality.csv".into(),
2361            role: "Cohort-level precursor-quality table across the corroboration sweep.".into(),
2362        },
2363        ArtifactInventoryEntry {
2364            path: "dsa_motif_policy_contributions.csv".into(),
2365            role: "Per-grid motif contributions to Watch/Review/Escalate and explicit silent suppression.".into(),
2366        },
2367        ArtifactInventoryEntry {
2368            path: "dsa_policy_contribution_analysis.csv".into(),
2369            role: "Best-configuration contribution analysis for nuisance suppression, rescued recall, and rescue transitions.".into(),
2370        },
2371        ArtifactInventoryEntry {
2372            path: "dsa_rating_delta_forecast.json".into(),
2373            role: "Bounded rating-delta forecast grounded in the saved DSA nuisance, recall, lead-time, and cohort metrics.".into(),
2374        },
2375        ArtifactInventoryEntry {
2376            path: "dsa_delta_target_assessment.json".into(),
2377            role: "Explicit predeclared 40% delta-target evaluation against EWMA and the prior policy-governed DSA baseline.".into(),
2378        },
2379        ArtifactInventoryEntry {
2380            path: "dsfb_signs.csv".into(),
2381            role: "Residual, drift, and slew sign tuples exported per feature and run.".into(),
2382        },
2383        ArtifactInventoryEntry {
2384            path: "dsfb_feature_signs.csv".into(),
2385            role: "Scaffolded top-feature sign tuples r(t), d(t), s(t) for the mapped SECOM features.".into(),
2386        },
2387        ArtifactInventoryEntry {
2388            path: "dsfb_motifs.csv".into(),
2389            role: "Deterministic temporal motif summary built from residual, drift, and slew trajectories.".into(),
2390        },
2391        ArtifactInventoryEntry {
2392            path: "dsfb_motif_labels_per_time.csv".into(),
2393            role: "Per-feature, per-run temporal motif labels from the syntax layer.".into(),
2394        },
2395        ArtifactInventoryEntry {
2396            path: "dsfb_feature_motif_timeline.csv".into(),
2397            role: "Scaffolded per-feature motif timeline for the mapped SECOM features.".into(),
2398        },
2399        ArtifactInventoryEntry {
2400            path: "dsfb_grammar_states.csv".into(),
2401            role: "DSFB admissibility grammar states per feature and run.".into(),
2402        },
2403        ArtifactInventoryEntry {
2404            path: "dsfb_feature_grammar_states.csv".into(),
2405            role: "Feature-scaffold grammar labels for the mapped SECOM features.".into(),
2406        },
2407        ArtifactInventoryEntry {
2408            path: "dsfb_envelope_interaction_summary.csv".into(),
2409            role: "Per-feature envelope interaction summary over boundary grazing, drift pressure, violations, and recovery.".into(),
2410        },
2411        ArtifactInventoryEntry {
2412            path: "dsfb_heuristics_bank_expanded.json".into(),
2413            role: "Expanded DSFB heuristics bank with grammar constraints, feature scope, ambiguity notes, and burden classes.".into(),
2414        },
2415        ArtifactInventoryEntry {
2416            path: "dsfb_semantic_matches.csv".into(),
2417            role: "Grammar-filtered heuristic semantic matches.".into(),
2418        },
2419        ArtifactInventoryEntry {
2420            path: "dsfb_semantic_ranked_candidates.csv".into(),
2421            role: "Ranked semantic candidates after grammar and motif filtering.".into(),
2422        },
2423        ArtifactInventoryEntry {
2424            path: "dsfb_feature_policy_decisions.csv".into(),
2425            role: "Feature-scaffold policy decisions produced only after grammar-qualified semantic retrieval.".into(),
2426        },
2427        ArtifactInventoryEntry {
2428            path: "dsfb_traceability.json".into(),
2429            role: "End-to-end event traceability chain from residual and sign through motif, grammar, semantic label, and policy state.".into(),
2430        },
2431        ArtifactInventoryEntry {
2432            path: "dsfb_group_definitions.json".into(),
2433            role: "Data-grounded grouped-semiotics scaffold definitions with member roles, preferred motifs, and empirical support counts.".into(),
2434        },
2435        ArtifactInventoryEntry {
2436            path: "dsfb_group_signs.csv".into(),
2437            role: "Grouped residual sign tuples for the scaffolded coordinated-semiotics pass.".into(),
2438        },
2439        ArtifactInventoryEntry {
2440            path: "dsfb_group_grammar_states.csv".into(),
2441            role: "Grouped admissibility states for scaffolded coordinated semiotics.".into(),
2442        },
2443        ArtifactInventoryEntry {
2444            path: "dsfb_group_semantic_matches.csv".into(),
2445            role: "Grouped semantic matches for coordinated DSFB scaffold motifs.".into(),
2446        },
2447        ArtifactInventoryEntry {
2448            path: "dsfb_structural_delta_metrics.json".into(),
2449            role: "Grammar violation precision, motif precision pre-failure, structural separation, precursor stability, episode precision, and compression ratio metrics.".into(),
2450        },
2451        ArtifactInventoryEntry {
2452            path: "figures/dsfb_non_intrusive_architecture.png".into(),
2453            role: "Operator-facing grayscale side-channel architecture figure proving read-only DSFB integration.".into(),
2454        },
2455        ArtifactInventoryEntry {
2456            path: "figures/dsfb_non_intrusive_architecture.svg".into(),
2457            role: "Vector version of the non-intrusive DSFB side-channel architecture figure.".into(),
2458        },
2459        ArtifactInventoryEntry {
2460            path: "recurrent_boundary_stats.json".into(),
2461            role: "SECOM structural-limitation summary for recurrent_boundary_approach as both precursor and nuisance source.".into(),
2462        },
2463        ArtifactInventoryEntry {
2464            path: "recurrent_boundary_tradeoff_curve.csv".into(),
2465            role: "Suppression sweep over recurrent_boundary_approach showing recall versus nuisance reduction.".into(),
2466        },
2467        ArtifactInventoryEntry {
2468            path: "recurrent_boundary_tradeoff_plot.png".into(),
2469            role: "Plot of the recurrent_boundary_approach suppression tradeoff curve.".into(),
2470        },
2471        ArtifactInventoryEntry {
2472            path: "dsfb_metric_regrounding.csv".into(),
2473            role: "Metric table with deltas regrounded separately against EWMA, threshold, and numeric-only DSA baselines.".into(),
2474        },
2475        ArtifactInventoryEntry {
2476            path: "target_d_regression_analysis.json".into(),
2477            role: "Causal analysis of the review-episodes-per-pass-run regression, with either a bounded fix or a formal tradeoff justification.".into(),
2478        },
2479        ArtifactInventoryEntry {
2480            path: "missed_failure_root_cause.json".into(),
2481            role: "Root-cause artifact for the former 103/104 limiting failure and its bounded recovery path.".into(),
2482        },
2483        ArtifactInventoryEntry {
2484            path: "lead_time_comparison.csv".into(),
2485            role: "Per-failure comparison of threshold lead, DSA lead, and earliest semantic-match lead.".into(),
2486        },
2487        ArtifactInventoryEntry {
2488            path: "lead_time_explanation.json".into(),
2489            role: "Why DSFB fires later than threshold on SECOM, validated against semantic-emergence timing.".into(),
2490        },
2491        ArtifactInventoryEntry {
2492            path: "episode_precision_metrics.json".into(),
2493            role: "Primary operator-facing episode-precision summary, including the raw-boundary precision proxy and gain factor.".into(),
2494        },
2495        ArtifactInventoryEntry {
2496            path: "paper_abstract_artifact.txt".into(),
2497            role: "Bounded abstract-ready value statement grounded in the saved SECOM artifacts.".into(),
2498        },
2499        ArtifactInventoryEntry {
2500            path: "feature_metrics.csv".into(),
2501            role: "Per-feature DSFB and baseline point counts.".into(),
2502        },
2503        ArtifactInventoryEntry {
2504            path: "dsa_metrics.csv".into(),
2505            role: "Per-feature, per-run DSA structural features, score inputs, consistency flags, and alerts.".into(),
2506        },
2507        ArtifactInventoryEntry {
2508            path: "dsa_run_signals.csv".into(),
2509            role: "Run-level DSA primary signal and alerting-feature counts.".into(),
2510        },
2511        ArtifactInventoryEntry {
2512            path: "per_failure_run_signals.csv".into(),
2513            role: "Per-failure DSFB state-layer earliest-signal and lead-time records.".into(),
2514        },
2515        ArtifactInventoryEntry {
2516            path: "per_failure_run_dsa_signals.csv".into(),
2517            role: "Per-failure DSA earliest-signal and lead-time records.".into(),
2518        },
2519        ArtifactInventoryEntry {
2520            path: "lead_time_metrics.csv".into(),
2521            role: "Flattened DSFB, threshold, EWMA, CUSUM, and run-energy lead-time table.".into(),
2522        },
2523        ArtifactInventoryEntry {
2524            path: "density_metrics.csv".into(),
2525            role: "Sliding-window density metrics per run.".into(),
2526        },
2527        ArtifactInventoryEntry {
2528            path: "residuals.csv".into(),
2529            role: "Residual trace export.".into(),
2530        },
2531        ArtifactInventoryEntry {
2532            path: "drifts.csv".into(),
2533            role: "Drift trace export.".into(),
2534        },
2535        ArtifactInventoryEntry {
2536            path: "slews.csv".into(),
2537            role: "Slew trace export.".into(),
2538        },
2539        ArtifactInventoryEntry {
2540            path: "ewma_baseline.csv".into(),
2541            role: "EWMA baseline trace export.".into(),
2542        },
2543        ArtifactInventoryEntry {
2544            path: "cusum_baseline.csv".into(),
2545            role: "Positive CUSUM baseline trace export.".into(),
2546        },
2547        ArtifactInventoryEntry {
2548            path: "run_energy_baseline.csv".into(),
2549            role: "Run-level residual-energy baseline trace export.".into(),
2550        },
2551        ArtifactInventoryEntry {
2552            path: "pca_fdc_baseline.csv".into(),
2553            role: "PCA T2/SPE multivariate FDC baseline trace export.".into(),
2554        },
2555        ArtifactInventoryEntry {
2556            path: "grammar_states.csv".into(),
2557            role: "Raw and confirmed DSFB grammar states per feature and run.".into(),
2558        },
2559        ArtifactInventoryEntry {
2560            path: "heuristics_bank.json".into(),
2561            role: "Provenance-aware heuristic guidance and active DSA policy-engine defaults.".into(),
2562        },
2563        ArtifactInventoryEntry {
2564            path: "secom_archive_layout.json".into(),
2565            role: "Archive-layout inspection and metadata mismatch note.".into(),
2566        },
2567        ArtifactInventoryEntry {
2568            path: "phm2018_support_status.json".into(),
2569            role: "PHM 2018 manual-placement and support-status record.".into(),
2570        },
2571        ArtifactInventoryEntry {
2572            path: "engineering_report.md".into(),
2573            role: "Markdown engineering report.".into(),
2574        },
2575        ArtifactInventoryEntry {
2576            path: "engineering_report.tex".into(),
2577            role: "LaTeX source for the report PDF.".into(),
2578        },
2579        ArtifactInventoryEntry {
2580            path: "engineering_report.pdf".into(),
2581            role: "Compiled report PDF when pdflatex is available.".into(),
2582        },
2583        ArtifactInventoryEntry {
2584            path: "artifact_manifest.json".into(),
2585            role: "Machine-readable manifest of output artifact paths.".into(),
2586        },
2587        ArtifactInventoryEntry {
2588            path: "run_bundle.zip".into(),
2589            role: "ZIP archive containing the complete run directory.".into(),
2590        },
2591    ];
2592
2593    if include_cohort_failure_analysis {
2594        entries.push(ArtifactInventoryEntry {
2595            path: "dsa_cohort_failure_analysis.md".into(),
2596            role: "Closest-cohort, corroboration, ranking-quality, and all-feature-vs-cohort failure analysis.".into(),
2597        });
2598        entries.push(ArtifactInventoryEntry {
2599            path: "dsa_heuristic_policy_failure_analysis.md".into(),
2600            role: "Heuristics-governed DSA policy failure analysis, including policy-vs-numeric and motif-class diagnostics.".into(),
2601        });
2602    }
2603    if include_rating_failure_analysis {
2604        entries.push(ArtifactInventoryEntry {
2605            path: "dsa_rating_delta_failure_analysis.md".into(),
2606            role: "Failure analysis for the rating-delta primary success condition.".into(),
2607        });
2608    }
2609
2610    if figures.drsc.is_some() {
2611        entries.push(ArtifactInventoryEntry {
2612            path: "drsc_top_feature.csv".into(),
2613            role: "Aligned DRSC trace export for the selected feature window.".into(),
2614        });
2615    }
2616    if figures.drsc_dsa_combined.is_some() {
2617        entries.push(ArtifactInventoryEntry {
2618            path: "drsc_dsa_combined.csv".into(),
2619            role:
2620                "Aligned DRSC+DSA publication figure trace export for the selected feature window."
2621                    .into(),
2622        });
2623    }
2624    if figures.dsa_focus.is_some() {
2625        entries.push(ArtifactInventoryEntry {
2626            path: "dsa_top_feature.csv".into(),
2627            role: "Aligned DSA structural-focus trace export for the selected feature window."
2628                .into(),
2629        });
2630    }
2631
2632    for file in &figures.files {
2633        entries.push(ArtifactInventoryEntry {
2634            path: format!("figures/{file}"),
2635            role: "Crate-generated PNG figure.".into(),
2636        });
2637    }
2638
2639    entries
2640}
2641
2642fn feature_cohort_latex_section(
2643    feature_cohorts: &FeatureCohorts,
2644    cohort_summary: &CohortDsaSummary,
2645) -> String {
2646    let mut out = String::new();
2647    out.push_str("\\section*{Feature-Cohort DSA Selection}\n");
2648    out.push_str(&latex_escape(&format!(
2649        "Ranking formula: {}. Missingness penalty: {:.1} when missing_fraction > {:.2}. Legacy one-run-tolerance cohort gate used inside the bounded sweep: {}.",
2650        cohort_summary.ranking_formula,
2651        feature_cohorts.missingness_penalty_value,
2652        feature_cohorts.missingness_penalty_threshold,
2653        cohort_summary.primary_success_condition,
2654    )));
2655    out.push_str("\n\n");
2656    out.push_str(&latex_escape(&format!(
2657        "Selected cohorts: top_4={}, top_8={}, top_16={}, all_features={}.",
2658        feature_cohorts.top_4.len(),
2659        feature_cohorts.top_8.len(),
2660        feature_cohorts.top_16.len(),
2661        feature_cohorts.all_features.len(),
2662    )));
2663    out.push_str("\n\n");
2664    out.push_str("\\begin{longtable}{p{0.14\\linewidth}rccc}\n\\toprule\n");
2665    out.push_str("Seed feature & Rank & Top 4 & Top 8 & Top 16 \\\\\n\\midrule\n");
2666    for seed in &feature_cohorts.seed_feature_report {
2667        out.push_str(&format!(
2668            "{} & {} & {} & {} & {} \\\\\n",
2669            latex_escape(&seed.feature_name),
2670            latex_escape(
2671                &seed
2672                    .rank
2673                    .map(|value| value.to_string())
2674                    .unwrap_or_else(|| "n/a".into())
2675            ),
2676            latex_escape(&seed.in_top_4.to_string()),
2677            latex_escape(&seed.in_top_8.to_string()),
2678            latex_escape(&seed.in_top_16.to_string()),
2679        ));
2680    }
2681    out.push_str("\\bottomrule\n\\end{longtable}\n\n");
2682    out.push_str("\\begin{longtable}{p{0.15\\linewidth}rrrrrr}\n\\toprule\n");
2683    out.push_str(
2684        "Cohort & m & Recall & Mean lead & Nuisance & Compression & Legacy gate \\\\\n\\midrule\n",
2685    );
2686    for best in &cohort_summary.best_by_cohort {
2687        let result = &best.best_row;
2688        out.push_str(&format!(
2689            "{} & {} & {}/{} & {} & {:.4} & {} & {} \\\\\n",
2690            latex_escape(&result.cohort_name),
2691            result.corroborating_m,
2692            result.failure_recall,
2693            result.failure_runs,
2694            latex_escape(&format_option_f64(result.mean_lead_time_runs)),
2695            result.pass_run_nuisance_proxy,
2696            latex_escape(&format_option_f64(result.compression_ratio)),
2697            latex_escape(&result.primary_success.to_string()),
2698        ));
2699    }
2700    out.push_str("\\bottomrule\n\\end{longtable}\n\n");
2701    if let Some(best_row) = &cohort_summary.selected_configuration {
2702        out.push_str(&latex_escape(&format!(
2703            "Best cohort/grid result: {} with recall {}/{}, nuisance {:.4}, mean lead {}, compression {}, and precursor quality {}.",
2704            best_row.cohort_name,
2705            best_row.failure_recall,
2706            best_row.failure_runs,
2707            best_row.pass_run_nuisance_proxy,
2708            format_option_f64(best_row.mean_lead_time_runs),
2709            format_option_f64(best_row.compression_ratio),
2710            format_option_f64(best_row.precursor_quality),
2711        )));
2712        out.push_str("\n\n");
2713    }
2714    if let Some(failure_analysis) = &cohort_summary.failure_analysis {
2715        out.push_str(&latex_escape(&format!(
2716            "Failure analysis: closest cohort {} at {}. Limiting factor: {}. Corroboration effect: {}. Ranking quality: {}. All-feature vs cohort: {}.",
2717            failure_analysis.closest_cohort,
2718            failure_analysis.closest_grid_point,
2719            failure_analysis.limiting_factor,
2720            failure_analysis.corroboration_effect,
2721            failure_analysis.ranking_quality_note,
2722            failure_analysis.all_feature_dsa_vs_cohort_note,
2723        )));
2724        out.push_str("\n\n");
2725    }
2726    out
2727}
2728
2729fn rating_forecast_latex_section(rating_delta_forecast: &RatingDeltaForecast) -> String {
2730    let mut out = String::new();
2731    out.push_str("\\section*{Rating Delta Forecast}\n");
2732    out.push_str(&latex_escape(&format!(
2733        "Primary success condition: {}. Primary success met: {}. Forecast score if primary success only: {:.1}. Forecast score if primary plus secondary success: {:.1}. Achieved forecast under the measured result: {:.1}. This is a forecast, not an achieved score.",
2734        rating_delta_forecast.primary_success_condition,
2735        rating_delta_forecast.primary_success_met,
2736        rating_delta_forecast.forecast_score_if_primary_success_only,
2737        rating_delta_forecast.forecast_score_if_primary_plus_secondary_success,
2738        rating_delta_forecast.achieved_forecast_score,
2739    )));
2740    out.push_str("\n\n");
2741    out.push_str(&latex_escape(&rating_delta_forecast.forecast_justification));
2742    out.push_str("\n\n");
2743    out
2744}
2745
2746fn drsc_dsa_combined_markdown_section(figures: &FigureManifest) -> String {
2747    if let Some(combined) = &figures.drsc_dsa_combined {
2748        format!(
2749            "## Deterministic Residual Stateflow Chart with Structural Accumulation (DRSC+DSA)\n\nThe crate emits a publication-oriented combined figure and aligned trace CSV for the representative top boundary-activity feature in the current run (`{}`). The figure keeps the DSFB semantics frozen while making four aligned layers readable in one glance: normalized residual / drift / slew; the actual persistent DSFB state band (`Admissible`, `Boundary`, `Violation`); the DSA precursor layer rendered as feature-level plus corroborated run-level activation; and run-level threshold / EWMA scalar trigger timing. This figure is grayscale-safe, generated from crate outputs, and does not claim scalar lag unless it is visible in the saved traces.\n\n- Figure: figures/{}\n- Trace CSV: {}\n- Feature selection basis: {}\n- Normalization: {}\n- State display: {}\n- DSA rendering: {}\n- Baseline rendering: {}\n\n",
2750            combined.feature_name,
2751            combined.figure_file,
2752            combined.trace_csv,
2753            combined.feature_selection_basis,
2754            combined.normalization_note,
2755            combined.state_display_note,
2756            combined.dsa_rendering_note,
2757            combined.baseline_rendering_note,
2758        )
2759    } else {
2760        String::new()
2761    }
2762}
2763
2764fn drsc_markdown_section(figures: &FigureManifest) -> String {
2765    if let Some(drsc) = &figures.drsc {
2766        format!(
2767            "## Deterministic Residual Stateflow Chart (DRSC)\n\nThe crate emits a DRSC figure and aligned trace CSV for the top persistent-boundary feature in the current run (`{}`). The chart keeps the DSFB state semantics intact: top layer residual/drift/slew, middle persistent DSFB states, bottom admissibility and comparator occupancy. DSA and run-level comparator overlays are added to the same selected feature window without redefining DSFB state semantics.\n\n- Figure: figures/{}\n- Trace CSV: {}\n\n",
2768            drsc.feature_name, drsc.figure_file, drsc.trace_csv,
2769        )
2770    } else {
2771        String::new()
2772    }
2773}
2774
2775fn dsa_focus_markdown_section(figures: &FigureManifest) -> String {
2776    if let Some(dsa_focus) = &figures.dsa_focus {
2777        format!(
2778            "## DSA Structural Focus Figure\n\nThe crate emits a DSA-specific figure and aligned trace CSV for the selected feature window (`{}`). This separate chart exposes the rolling structural inputs, DSA score, persistence gate, and feature-level comparator band, including run energy and PCA T2/SPE overlays.\n\n- Figure: figures/{}\n- Trace CSV: {}\n\n",
2779            dsa_focus.feature_name, dsa_focus.figure_file, dsa_focus.trace_csv,
2780        )
2781    } else {
2782        String::new()
2783    }
2784}
2785
2786fn drsc_dsa_combined_latex_section(figures: &FigureManifest) -> String {
2787    if let Some(combined) = &figures.drsc_dsa_combined {
2788        format!(
2789            "\\section*{{Deterministic Residual Stateflow Chart with Structural Accumulation (DRSC+DSA)}}\nThe crate emits a publication-oriented combined figure and aligned trace CSV for the representative top boundary-activity feature in the current run (\\texttt{{{}}}). The figure keeps the DSFB semantics frozen while making four aligned layers readable in one glance: normalized residual / drift / slew; the actual persistent DSFB state band (\\texttt{{Admissible}}, \\texttt{{Boundary}}, \\texttt{{Violation}}); the DSA precursor layer rendered as feature-level plus corroborated run-level activation; and run-level threshold / EWMA scalar trigger timing. The figure is generated from crate outputs and does not claim scalar lag unless it is visible in the saved traces. The aligned trace CSV is \\texttt{{{}}}.\n\n",
2790            latex_escape(&combined.feature_name),
2791            latex_escape(&combined.trace_csv),
2792        )
2793    } else {
2794        String::new()
2795    }
2796}
2797
2798fn drsc_latex_section(figures: &FigureManifest) -> String {
2799    if let Some(drsc) = &figures.drsc {
2800        format!(
2801            "\\section*{{Deterministic Residual Stateflow Chart (DRSC)}}\nThe crate emits a DRSC figure and aligned trace CSV for the top persistent-boundary feature in the current run (\\texttt{{{}}}). The chart keeps the DSFB state semantics intact: top layer residual, drift, and slew; middle layer persistent DSFB states; bottom layer admissibility and comparator occupancy. DSA and run-level comparator overlays are added to the same selected feature window without redefining DSFB state semantics. The aligned trace CSV is \\texttt{{{}}}.\n\n",
2802            latex_escape(&drsc.feature_name),
2803            latex_escape(&drsc.trace_csv),
2804        )
2805    } else {
2806        String::new()
2807    }
2808}
2809
2810fn dsa_focus_latex_section(figures: &FigureManifest) -> String {
2811    if let Some(dsa_focus) = &figures.dsa_focus {
2812        format!(
2813            "\\section*{{DSA structural focus figure}}\nThe crate emits a DSA-specific figure and aligned trace CSV for the selected feature window (\\texttt{{{}}}). This separate chart exposes the rolling structural inputs, DSA score, persistence gate, and feature-level comparator band, including run energy and PCA T2/SPE overlays. The aligned trace CSV is \\texttt{{{}}}.\n\n",
2814            latex_escape(&dsa_focus.feature_name),
2815            latex_escape(&dsa_focus.trace_csv),
2816        )
2817    } else {
2818        String::new()
2819    }
2820}
2821
2822fn figure_blocks(figures: &FigureManifest) -> String {
2823    figures
2824        .files
2825        .iter()
2826        .map(|file| {
2827            let caption = if figures
2828                .drsc_dsa_combined
2829                .as_ref()
2830                .map(|combined| combined.figure_file == *file)
2831                .unwrap_or(false)
2832            {
2833                "Deterministic Residual Stateflow Chart with Structural Accumulation (DRSC+DSA) for the representative SECOM feature selected by the current run. Top: normalized residual, drift, and slew. Second: persistent deterministic DSFB state evolution. Third: feature-level and corroborated run-level DSA activation. Bottom: run-level threshold and EWMA trigger timing. The figure is generated from crate outputs and is intended to expose the difference between raw structural activity and persistence-constrained precursor regimes."
2834                    .to_string()
2835            } else if figures
2836                .drsc
2837                .as_ref()
2838                .map(|drsc| drsc.figure_file == *file)
2839                .unwrap_or(false)
2840            {
2841                "Deterministic Residual Stateflow Chart (DRSC) for the selected feature window."
2842                    .to_string()
2843            } else if figures
2844                .dsa_focus
2845                .as_ref()
2846                .map(|dsa_focus| dsa_focus.figure_file == *file)
2847                .unwrap_or(false)
2848            {
2849                "DSA structural focus figure for the selected feature window.".to_string()
2850            } else if file == "dsfb_non_intrusive_architecture.png" {
2851                "Non-intrusive DSFB side-channel architecture. The primary SPC/EWMA/controller path remains authoritative; DSFB reads residual and alarm taps only, emits advisory interpretations, and has no feedback arrow into control."
2852                    .to_string()
2853            } else {
2854                format!("Generated artifact: {}", file)
2855            };
2856            format!(
2857                "\\begin{{figure}}[htbp]\n\\centering\n\\includegraphics[width=0.92\\linewidth]{{figures/{}}}\n\\caption{{{}}}\n\\end{{figure}}\n",
2858                latex_escape(file),
2859                latex_escape(&caption),
2860            )
2861        })
2862        .collect::<String>()
2863}
2864
2865fn motif_row(metric: &MotifMetric) -> String {
2866    format!(
2867        "{} & {} & {} & {} & {} \\\\\n",
2868        latex_escape(&metric.motif_name),
2869        metric.point_hits,
2870        metric.run_hits,
2871        metric.pre_failure_window_run_hits,
2872        latex_escape(&format_option_f64(
2873            metric.pre_failure_window_precision_proxy
2874        )),
2875    )
2876}
2877
2878fn compile_pdf(tex_path: &Path, output_dir: &Path) -> (Option<PathBuf>, Option<String>) {
2879    crate::output_paths::compile_pdf(tex_path, output_dir)
2880}
2881
2882fn format_option_f64(value: Option<f64>) -> String {
2883    value
2884        .map(|value| format!("{value:.4}"))
2885        .unwrap_or_else(|| "n/a".into())
2886}
2887
2888fn join_or_none(values: &[String]) -> String {
2889    if values.is_empty() {
2890        "none".into()
2891    } else {
2892        values.join(", ")
2893    }
2894}
2895
2896fn format_option_bool(value: Option<bool>) -> String {
2897    value
2898        .map(|value| value.to_string())
2899        .unwrap_or_else(|| "n/a".into())
2900}
2901
2902fn latex_escape(input: &str) -> String {
2903    input
2904        .replace('≥', "$\\geq$")
2905        .replace('≤', "$\\leq$")
2906        .replace('\\', "\\textbackslash{}")
2907        .replace('&', "\\&")
2908        .replace('%', "\\%")
2909        .replace('$', "\\$")
2910        .replace('#', "\\#")
2911        .replace('_', "\\_")
2912        .replace('{', "\\{")
2913        .replace('}', "\\}")
2914        .replace('~', "\\textasciitilde{}")
2915        .replace('^', "\\textasciicircum{}")
2916}