docs: priceCurveAlgo gotchas section in CLAUDE.md#64
Merged
Conversation
Surfaces algorithm-side pitfalls that emerged during multi-round cc tuning sweeps. New section under Key Concepts. Five entries covering: - Force-charge ignores nivChasePeriods.chargeCurve gates (workaround: size approach via assumedChargePower + chargeCushionMins) - peak.dynamic HOLD-on-LONG slack constraint (use minEndOfPeakSoe to manufacture slack) - assumedChargePower must reflect realistic charge rate (importLimit − houseLoad), not BESS nameplate - Cutoff alignment: volumeCutoffForPrediction == nivCutoffForSystemStateAssumption to avoid split-signal regime - Time-to-empty math is a static snapshot of bess_max_power_discharge; very tight slack budgets are unreliable Companion to the new skypro-service/tuning/ skill (separate repo) which points at this section as the source of truth for these gotchas. No code change. v2.1.1 stays.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds a new "priceCurveAlgo gotchas" section to
CLAUDE.mdunder Key Concepts. Captures algorithm-side pitfalls that emerged during multi-round cc tuning sweeps.Five entries:
Force-charge ignores
nivChasePeriods.chargeCurve = []gates. The peak-approach force curve sits parallel to niv-chase; it imports based purely on the SoE-vs-time curve. Usepeak.approach.assumedChargePowerandchargeCushionMinsto size the approach so the force ramp ends before any premium-import window — not via nivchargeCurvegating.peak.dynamicHOLD-on-LONG only fires when there's slack. The check requiresdischargeable_soe / bess_max_power_discharge < peak_window − time_step. Without slack, every HH falls through to "must full discharge" and the dynamic block silently no-ops. Usepeak.dynamic.minEndOfPeakSoe(added v2.1.1) to manufacture slack.assumedChargePowershould match realistic charge rate, not BESS nameplate. IfgridConnection.importLimit < BESS.nameplatePower, settingassumedChargePowerabove the import limit makes the algo plan for power it cannot deliver —approach_durationshortens, force-curve starts too late,toSoeis never reached.Cutoffs should be aligned across niv-chase and microgrid-control.
nivChasePeriods.niv.volumeCutoffForPredictionandmicrogrid.imbalanceControl.nivCutoffForSystemStateAssumptionshould match — mismatch creates a split-signal regime where niv-chase classifies UNKNOWN while microgrid-control classifies LONG/SHORT.Time-to-empty math uses a static snapshot of
bess_max_power_discharge. Realised effective power varies HH-to-HH (solar contribution, residual load); very tight slack budgets (<20 min) are unreliable in the dynamic HOLD branch.Why now
Companion to a new
skypro-service/tuning/skill (separate repo) which points at this section as the source of truth for these gotchas. The skill encodes the round-pattern and scoring rules; this CLAUDE.md section codifies the algorithm-side knowledge that any tuning round needs to respect.No code change. v2.1.1 stays.
Test plan