03 — Integration

Asset Lifecycle is a member of the Work & Supply network (message protocol v1) with the network domain lifecycle. Its contract is schema/asset_lifecycle.integration.dsl (authoring spec v1.5), generated with python -m codegen.cli integration asset_lifecycle --network work_supply; the handlers are in integration/handlers.py. The whole network is in networks/work_supply/NETWORK_MAP.md.

What it owns

Network entity Model Business reference
lifecycle.usage_metric_type UsageMetricType code
lifecycle.usage_meter UsageMeter meter_number
lifecycle.meter_correction MeterCorrection —
lifecycle.life_model LifeModel model_code
lifecycle.life_forecast LifeForecast forecast_number (LF-{sequence:05})
lifecycle.derating DeratingEvent —

Messages

Kind Message What
publishes lifecycle.usage_threshold_crossed a limit enters watch; carries that limit's consumed_life and remaining_life
publishes lifecycle.life_forecast_changed the headline status changes (status and predicted date only)
publishes lifecycle.life_due a limit becomes due or overdue; carries remaining_life, the headline forecast_status and is_governing
publishes lifecycle.exposure_revised a meter correction was recorded (a technician's reading that disagrees with the history, or an explicit correction); ask component_exposure for the revised figures
publishes lifecycle.usage_metric_type_reference_changed a corrected metric code, to the copies
publishes lifecycle.derating_started / derating_ended an operating limit placed / lifted
consumes asset.component_installed start a span (model by maintenance group + SMCS)
consumes asset.component_removed end it and store the exposure
consumes work.component_installed / work.component_removed the unit's main SMU entered on the work order: a reading at the event's date (source manual), a correction "entered on work order …" if it differs from the history, and a recalculation of the spans it reaches. Blank changes nothing. Either arrival order (this or the Register's event first) gives the same figures
consumes asset.component_rebuilt close the cycle; open the next with the rebuild's life factor
consumes asset.asset_group_reference_changed, classification.smcs_reference_changed refreshed copies
accepts lifecycle.record_usage a meter reading (telematics, FMS, manual, work order …)
accepts lifecycle.apply_meter_correction a reset / rollover / replacement / calibration / manual adjustment
answers lifecycle.usage_at the last known reading at or before a date (value, quality, as_of, age_days)
answers lifecycle.search_usage_metric_types the metric picker
answers lifecycle.current_usage (with daily_rate), usage_history, life_status read-only
answers lifecycle.component_exposure the stored exposure since the last rebuild: life_consumed and usage_unit (the first limit), and by_metric for Warranty's claim snapshot

References

LifeModel.asset_group_cid → asset.asset_group (picker asset.search_asset_groups) and LifeModel.smcs_cid → classification.smcs (picker classification.search_smcs); both keep a _ref and are refreshed when the code is corrected. Components are asset.component; units are asset.asset. The Register is asked for asset.group_membership directly; if it is unreachable the fitting is acknowledged as unmatched (no model), never failed.

Differences from the pack

The pack published "when material"; the spec has no such expression, so the events are status transitions. Because the figures now live per limit, usage_threshold_crossed and life_due are triggered by the limit rows (one event per limit crossing). lifecycle.exposure_revised is triggered by the correction record, so it carries the correction rather than the figures per component. Derating events name lifecycle.derating.