Task · SKT-0015.04

Make high_dpm a floor, not a forced cadence

Description

SKT-0015.01 shipped high_dpm.metric_interval as an OVERRIDE: instanceMetricInterval in internal/runner/runner.go returns the declared interval for every metric-bearing instance when high_dpm is set, logging metric interval %v overridden by explicit high_dpm.metric_interval %v when they differ. An instance asking for a LONGER interval than the declared one is sped up.

Decision taken 2026-08-28 (Rob): it should be a FLOOR, not a force. high_dpm lowers the clamp; an instance that declares a longer interval keeps it.

The distinction is inert today and that is exactly why it needs fixing now rather than later. Every one of the 25 Interval() implementations across internal/construct/** and internal/workload/** returns 60 * time.Second, so no instance can currently be slowed by the clamp or sped up by the override – the two semantics produce identical behaviour. The moment a construct legitimately models a slower poll – a CloudWatch metric stream, a cloud provider scraper, a five-minute billing export – the override silently makes it unrealistic, and the fidelity gate will not catch it because cadence is not part of the compared shape.

The corrected rule:

effective = max(declared_instance_interval, blueprint_floor)

where blueprint_floor is high_dpm.metric_interval when declared and MinMetricInterval otherwise. A non-metric-bearing instance is untouched, as it is today.

Keep the clamp log line for the case that still clamps. Drop or reword the “overridden” line, since nothing is being overridden any more.

projectHighDPMCost currently assumes every metric-bearing instance runs at the blueprint interval. Under a floor rule that stops being true as soon as one instance is slower, so the projection must sum per-instance rates rather than multiplying one cadence by an instance count. Today the numbers are identical; the code must not quietly depend on that.

Acceptance Criteria

Definition of Done

Implementation Plan

Add failing fixture tests for longer-than-floor and shorter/equal intervals plus mixed per-instance DPM projection; implement effective=max(declared,floor), sum per-instance rates, and verify high-dpm-churn projection remains 690 DPM.

Implementation Notes

Root start after SKT-0010.15 measured delta. This is the frozen floor decision from goal section 6; it is not being reopened.

Failing-first evidence: the longer 2m fixture was forced to 10s, and mixed 10s/30s projection reported 6 DPM per series and 78 projected DPM. After the floor change, longer=2m, shorter 5s clamps to 10s, equal 10s stays 10s; mixed projection averages (6+2)/2=4 DPM per series and projects 80 DPM. Current high-dpm-churn keeps network_topology at its declared 60s while the blueprint floor is 10s; the budget projection remains 690 DPM, with projected capacity changing from 115 series at 6 DPM to 690 at 1 DPM. Focused runner tests pass.

Final verification: runner tests pass for longer, shorter and equal declared intervals, mixed per-instance projection, and the unchanged 690 DPM reference projection. make blueprint-schema regenerated cleanly; complete 28-blueprint dry-run inventory, make e2e at 650/650 and make gate passed.

Exact implementation SHA 1729e2068321fc53b6d973a6fc981fc1066c4c42 passed GitHub ci run 33186760476, including signal-fidelity, go, docker, hygiene, helm, ui, secret-scan, e2e and ci-success.

Final Summary

Changed high_dpm to a floor, made cost projection sum per-instance cadence, and preserved the 690 DPM reference result; direction, projection, inventory and full gates passed.

View the source file on GitHub