Inspect a retained run

Each non-dry runner invocation reserves a new timestamped directory under run.output_dir. Read run_manifest.json first: it records stage states, artefact paths, warnings and execution failures. Directory existence alone does not show that a stage ran or produced valid evidence.

DirectoryRole
00_run_metadataResolved configuration, provenance and CLI log
05_prior_sensitivityPrepared alternative configurations
08_ai_advisorLocal configuration evidence and rules
10_pre_diagnosticsPrior predictive and pre-fit evidence
20_model_fitFitted model.nc and fit evidence
30_model_assessmentPosterior predictive assessment
35_holdout_validationOptional fresh-fit predictive evidence
40_decompositionModel component summaries
50_diagnosticsDiagnostic reports and resolved gate policy
60_response_curvesAdstock and saturation outputs
70_optimisationReserved stage; no validated YAML optimisation block
75_prior_sensitivity_fitsOptional fitted-scenario comparisons
80_interpretationInterpretation inventory
90_ai_advisorFinal local or provider-backed evidence review

The CLI retains 00_run_metadata/run.log; failures can also retain 00_run_metadata/error.traceback.txt. The resolved configuration is 00_run_metadata/config.resolved.yaml. Use the manifest’s recorded paths rather than treating a list of filenames from another release as exhaustive.

Stage states distinguish completed, skipped, failed and not-reached work. A run can complete while its diagnostic floor is fail; inspect 50_diagnostics/diagnostics_report.csv separately. Failed runs retain completed stages and error information. A fitted file in a failed run is not equivalent to a completed run accepted by scenario mode.

Optional outputs have explicit limits. Stage 05 alone does not establish prior robustness; stage 75 runs only when fit_scenarios: true. An advisor response is an interpretation of retained evidence, and the optimisation stage is currently skipped because no validated YAML block exists. See prior sensitivity, advisor policy and scenario recipes.

Manifest schema and provenance

run_manifest.json has schema version 2. The fields below describe execution identity; they do not constitute model approval (src/ammm/pipeline/manifest.py:40, src/ammm/pipeline/manifest.py:120).

FieldsMeaning
run_name, timestamp, output_dirName, UTC directory timestamp, absolute retained directory
config_path, config_sha256, model_classSource config identity and resolved class
dataInput path/hash entries where configured; preserve actual inputs separately
overridesApplied sampler, sample-count, stage and quick-mode changes
status, finished_at, warnings, errorRun lifecycle; error includes failing stage, type and message
stagesMapping from stage key to the record below

Each stage record has directory, status, started_at, finished_at, artifacts, warnings and error. artifacts maps semantic keys to retained paths; resolve those paths from the run directory. Stage states are pending, running, completed, skipped, failed and not_reached. Run states are pending, running, completed and failed (src/ammm/pipeline/manifest.py:10). A skipped directory can exist without usable evidence, and a later exception leaves earlier completed outputs intact.

Retain source/config/data identity, the lockfile and effective environment, all random seeds, study evidence and the analysis rationale for reproduction. Stage 00 records selected package versions and a Git SHA, but does not archive every dependency, data file or uncommitted source change. Its release_status: supported is a static metadata label, not estimator qualification (src/ammm/pipeline/stages/core.py:243, src/ammm/pipeline/stages/core.py:274). The runner uses an integer sampler seed for its predictive/curve context, otherwise 42; fit settings themselves retain their configured sampler semantics (src/ammm/pipeline/runner.py:405).

Files and conditional presence

These filenames are written by the listed stages at the reviewed commit. Read the manifest before opening them because disabled, failed or not-reached stages may leave them absent. Plots are presentation artefacts; retain the numeric source and model for reanalysis.

DirectoryNumeric and text evidenceWriter
00_run_metadataconfig.original.yaml, config.resolved.yaml, config.txt, config.yml, data_dictionary.csv, dataset_metadata.json, design_matrix_manifest.csv, estimator_manifest.yaml, estimator_summary.txt, git_sha.txt, model_metadata.json, output.txt, session_info.txt, spec_summary.csv; conditional holiday manifest; CLI log/tracebacksrc/ammm/pipeline/stages/core.py:148
05_prior_sensitivityScenario directories containing config.resolved.yaml; plan metadata as recorded in manifestsrc/ammm/prior_sensitivity/scenarios.py:177
08_ai_advisorevidence.json, rules_summary.json, advisor_status.json when enabled and writing outputssrc/ammm/pipeline/stages/ai_advisor.py:41
10_pre_diagnosticsPrior-predictive plot, stationarity_summary.csv, transfer_entropy_summary.csvsrc/ammm/pipeline/stages/core.py:356
20_model_fitmodel.nc, posterior_summary.csv, trace.pngsrc/ammm/pipeline/stages/core.py:425
30_model_assessmentposterior_predictive.nc, posterior_predictive_summary.csv, fitted.csv, observed.csv, residuals.csv, fit_metrics.json and diagnostic plotssrc/ammm/pipeline/stages/core.py:455
35_holdout_validationvalidation_metadata.json, holdout_predictive_report.json, holdout_predictive_summary.csv, holdout_posterior_predictive.nc, holdout_fitted.csv, holdout_observed.csv, holdout_residuals.csv, plotssrc/ammm/pipeline/stages/validation.py:85
40_decompositionchannel_contributions.csv, baseline_contributions.csv, mean_contributions_over_time.csv, decomposition plotssrc/ammm/pipeline/stages/core.py:539
50_diagnosticsdiagnostics_report.csv, diagnostics_summary.txt, diagnostic_gates.resolved.yaml; design, MCMC, predictive, Bayesian-criteria and calibration reports; VIF/residual summariessrc/ammm/pipeline/stages/core.py:659
60_response_curvesadstock_curve, saturation_curve, forward_pass_contribution_curve: each .nc, _summary.csv and .png; all_response_curves.csv, current_input_response.csv, response_curves.pngsrc/ammm/pipeline/stages/core.py:819
70_optimisationNo optimisation result; reserved stage is skippedsrc/ammm/pipeline/stages/core.py:969
75_prior_sensitivity_fitsscenario_fit_diagnostics.csv, sensitivity_comparison.csv, channel_robustness.csv, roas_sensitivity.png; no alternative posterior filessrc/ammm/pipeline/stages/core.py:584
80_interpretationinterpretation_report.md, evidence_inventory.mdsrc/ammm/pipeline/stages/core.py:979
90_ai_advisorLocal evidence/rules/status and advisor_review.md; parameter-identification report and local lookup; conditional accepted response and patch/approval recordssrc/ammm/pipeline/stages/ai_advisor.py:88

The local parameter lookup is not a provider-safe evidence bundle. See advisor operations for exact invocation flags and conditional proposal files. A manifest contains what was actually retained, so do not infer a live provider call from the directory name.

Table keys, units and intervals

Dimension columns are coordinate keys: commonly date and channel, with configured panel axes such as geo added where retained. Join by named keys, never by row position. The following schemas describe this writer; optional parameter columns from ArviZ depend on the installed package settings.

File or familyKeys and valuesUnits / interpretation
data_dictionary.csvcolumn, role, dtype, missing_count, unique_countInput schema audit
design_matrix_manifest.csvcolumn, role, dtype, variance, nonzero_countRaw-input screening, not a complete transformed estimability proof
spec_summary.csvsetting, valueModel specification summary
stationarity_summary.csvvariable, n, adf_statistic, adf_p_valueUnivariate screening; unavailable tests can have missing values
transfer_entropy_summary.csvchannel, screening_metric, value, interpretationDespite its legacy filename, this is lag-zero Pearson correlation screening, not transfer entropy or causality
posterior_summary.csv, mcmc_summary.csvparameter plus ArviZ statisticsParameter units depend on scaling; interval names/probability follow the actual ArviZ output, not a guaranteed 94% HDI
fitted.csv, observed.csv, residuals.csvObservation keys; fitted_mean, fitted_median, observed, residual as applicableOriginal outcome units; residual = observed minus fitted mean
posterior_predictive_summary.csvObservation keys; mean, median, abs_error_94_lower, abs_error_94_upper, observedOriginal outcome draws, including observation variation
channel_contributions.csvObservation/channel keys; mean, median, abs_error_94_lower, abs_error_94_upperOriginal outcome component units
mean_contributions_over_time.csvcomponent_type, observation keys, component and summary valuesOriginal outcome component units
baseline_contributions.csvcomponent, mean plus panel keys where presentMean per-period baseline contribution, not automatically a horizon total
diagnostics_report.csvcheck_id, phase, severity, status, metric, value, threshold, message, overall_statusPolicy outcomes; skipped is not pass
Metric summariesmetric, valueConsult metric definition; null is not zero
Holdout row tablesdate, observed, posterior_mean, posterior_median, residual, lower_50, upper_50, lower_80, upper_80, lower_94, upper_94 or their selected subsetsOriginal outcome units; equal-tailed predictive intervals
holdout_predictive_report.jsonschema_version: 1, evidence_type, fresh_fit, metrics, sampling_diagnosticsFresh conditional evaluation; review calibration leakage boundary
Stage 75 comparisonsScenario and coordinate keys, metric, reference/scenario means and HDI bounds, relative_change, hdi_overlap, robustContribution share or all-time incremental ROAS; flags are declared tolerance rules

Schemas come from src/ammm/pipeline/stages/core.py:196, src/ammm/pipeline/stages/core.py:356, src/ammm/pipeline/stages/core.py:455, src/ammm/pipeline/stages/core.py:539, src/ammm/pipeline/stages/core.py:684, src/ammm/mmm/blocked_holdout.py:178 and src/ammm/prior_sensitivity/comparison.py:74.

The abs_error_* columns contain interval endpoints, not errors or distances from the mean. The summary facade uses HDIs when chain and draw remain separate, but equal-tailed quantiles when only sample remains; retain the dimensions and interval method with exports (src/ammm/mmm/summary/factory.py:240). ArviZ’s parameter summary uses its installed defaults; in the reviewed execution it emitted eti89_lb and eti89_ub. Do not relabel those as 94% HDIs (src/ammm/pipeline/stages/core.py:440).

Stage 60 always summarises curves with mean, median, eti_94_lower and eti_94_upper, denoting 94% equal-tailed intervals. adstock_curve_summary.csv uses time since exposure; saturation uses scaled x plus original-unit input; forward-pass curves use history multiplier sweep plus total original input. all_response_curves.csv unions these columns and adds curve_family, so family-inapplicable fields are missing. current_input_response.csv retains total_input, mean_input, contribution summaries and marginal summaries at sweep=1; its marginal is a derivative with respect to total channel input, which is only monetary when the input is spend (src/ammm/pipeline/stages/core.py:858, src/ammm/pipeline/stages/core.py:948, src/ammm/pipeline/stages/_core_metrics.py:139).

NetCDF and review handoff

model.nc retains the model persistence metadata and canonical fitted inputs alongside inference groups. Predictive and curve .nc files retain draw and coordinate axes but are not standalone fitted models. Inspect each dataset’s variables/dimensions before combining it with another run; save coordinate labels and preserve joint posterior draws when aggregating uncertainty (src/ammm/mmm/persistence.py:62, src/ammm/pipeline/artifacts.py:147).

A review handoff should name the decision and estimand, source/data identities, resolved config and seeds, run/stage states, diagnostic policy/results, holdout design/results, calibration provenance, sensitivity alternatives and proposed allocation constraints. Include a statement of what was not evaluated. The retained files support that review; they do not make the acceptance decision.

Implementation reference at 7cb7f20: src/ammm/pipeline/artifacts.py:71, src/ammm/pipeline/runner.py:156, src/ammm/pipeline/stages/core.py:969.