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}