Philosophy#
macroforecast is designed for research workflows where the difficult part is not calling a model function. The difficult part is choosing a valid forecasting path, keeping comparisons fair, and making every deviation auditable.
Defaults are explicit#
Defaults are part of the research design. They must be visible, versioned, and written to artifacts. A simple run should remain short, but the resolved manifest must show what was actually used.
Layers own decisions#
Each layer owns a different class of decisions:
L0: study setup and execution grammar.
L1: data source, target, predictor universe.
L2: cleaning and preprocessing.
L3: feature engineering and target construction (DAG).
L4: forecasting model fit, tuning, and ensembling (DAG).
L5: evaluation, benchmarking, ranking.
L6: statistical tests.
L7: interpretation and importance (DAG).
L8: export and provenance.
Layer boundaries matter because they prevent silent leakage, hidden preprocessing, and ambiguous model comparisons.
Contracts are enforced#
Some choices are free. Some are derived. Some are disabled because another selection makes them invalid. The docs and Navigator should show the same constraint system.
Custom methods are first-class#
Method researchers should be able to add a custom Layer 2 representation or Layer 3 generator and compare it against built-ins without editing package internals.
Artifacts are part of the API#
Predictions, metrics, manifests, sidecar reports, and provenance files are not incidental outputs. They are how a run is audited, replicated, and compared.