How to Interpret Rebuild Reports and Regressions
Report Location
Each rebuild run writes a machine-readable report:
runtime/logs/instance_rebuild_report-<run_id>.json
Start with the run summary at top-level keys:
run_idfailedoutcomes(step execution details)artifact_referencesmetricsinvariant_resultsbaselineregression_gate
Step Outcomes
Use outcomes first to confirm command execution order and status.
For each step, review:
step_idstatus(okorfailed)duration_secondserror(if present)
If any required step failed, treat the run as invalid and resolve that before interpreting downstream metrics.
Invariant Results
invariant_results evaluates spec-defined checks against measured metrics.
Each result includes:
invariant_idseverity(fatalorwarn)metriccomparatortargetmeasuredstatus(pass,warn,fail)remediation
Interpretation rule:
Any
fatalinvariant withstatus=failis a hard regression.warnshould be reviewed and either remediated or explicitly accepted.
Baseline and Allowlist Diffs
baseline captures structural drift from snapshot comparisons.
Focus fields:
statusdiff(track/XML structural differences)allowlistallowlist_result
Key metrics:
metrics.baseline_diff_countmetrics.baseline_unexpected_diff_countmetrics.baseline_allowlist_match
If unexpected diffs are intentional, update
config/rebuild.allowlist.yaml and re-run.
Regression Gate
regression_gate is the final pass/fail policy summary.
Critical fields:
step_failurefatal_invariant_failureunexpected_diff_regressionbaseline_unexpected_diff_thresholdbaseline_unexpected_diff_count
The run is blocked when any of these are true:
step_failurefatal_invariant_failureunexpected_diff_regression
Evidence Trend Drift Across Releases
When evidence is promoted with
femic instance promote-evidence (or via
femic instance refresh-reference-evidence), the normalized artifact includes
trend_drift for release-over-release interpretation.
Key fields:
trend_drift.previous_summarytrend_drift.warn_increasetrend_drift.baseline_diff_increasetrend_drift.thresholds.max_warn_increasetrend_drift.thresholds.max_baseline_diff_increasetrend_drift.warnings
Interpretation rule:
Positive
warn_increasemeans more warning-level invariant results than the previously promoted evidence.Positive
baseline_diff_increasemeans additional structural drift versus the previously promoted evidence.Non-empty
trend_drift.warningsmeans configured thresholds were exceeded and should trigger explicit maintainer review before release.
Recommended release workflow:
Refresh evidence with thresholds:
femic instance refresh-reference-evidence --reference-root . --max-warn-increase 0 --max-baseline-diff-increase 0Inspect
trend_driftdeltas and warning messages.If drift is intentional, document rationale in roadmap/changelog and update baseline/allowlist artifacts as needed.
Re-run rebuild and evidence refresh until drift warnings are either cleared or explicitly accepted with documented rationale.
Triage Workflow
Confirm step execution succeeded in
outcomes.Resolve any
fatalinvariant failures.Review baseline diff scope in
baseline.diff.Distinguish intentional vs unintentional drift: update allowlist only for intentional changes.
Re-run rebuild and confirm
regression_gateis clear.
Common Patterns
Block/topology join regressions: non-zero
block_join_mismatch_countusually indicates model-side join/key inconsistency betweenblocks.shpandtracks/blocks.csv.Seral-account regressions: low/zero
seral_account_counttypically indicates XML export or matrix build drift.Baseline drift regressions:
unexpected_diff_regression=truemeans structural changes exceeded accepted allowlist thresholds.