The #19 design relies on constructing Skill field-by-field in TimeSlice::filtered_step, so that adding a field to Skill becomes a compile error there rather than a silently-defaulted wrong answer. That holds in filtered_step.
But TimeSlice::add_events still constructs Skill { forward, elapsed, ..Default::default() }. So a new field added to Skill would break the build in filtered_step while being silently absorbed at the other construction site — which is the site that feeds production convergence.
Either construct field-by-field there too, or record why the asymmetry is acceptable. Found during the final whole-branch review of the #19 branch; the code is correct today, this is about the tripwire the design depends on.
The #19 design relies on constructing `Skill` field-by-field in `TimeSlice::filtered_step`, so that adding a field to `Skill` becomes a compile error there rather than a silently-defaulted wrong answer. That holds in `filtered_step`.
But `TimeSlice::add_events` still constructs `Skill { forward, elapsed, ..Default::default() }`. So a new field added to `Skill` would break the build in `filtered_step` while being silently absorbed at the other construction site — which is the site that feeds production convergence.
Either construct field-by-field there too, or record why the asymmetry is acceptable. Found during the final whole-branch review of the #19 branch; the code is correct today, this is about the tripwire the design depends on.
Fixed in eeb43e3. TimeSlice::add_events now spells out all four Skill fields instead of ..Default::default(), so a new field is a compile error at both construction sites rather than only in filtered_step.
The values are unchanged — backward: N_INF, likelihood: N_INF is exactly what Skill::default() supplied — so this is purely about restoring the tripwire the design leans on.
Fixed in `eeb43e3`. `TimeSlice::add_events` now spells out all four `Skill` fields instead of `..Default::default()`, so a new field is a compile error at both construction sites rather than only in `filtered_step`.
The values are unchanged — `backward: N_INF, likelihood: N_INF` is exactly what `Skill::default()` supplied — so this is purely about restoring the tripwire the design leans on.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
The #19 design relies on constructing
Skillfield-by-field inTimeSlice::filtered_step, so that adding a field toSkillbecomes a compile error there rather than a silently-defaulted wrong answer. That holds infiltered_step.But
TimeSlice::add_eventsstill constructsSkill { forward, elapsed, ..Default::default() }. So a new field added toSkillwould break the build infiltered_stepwhile being silently absorbed at the other construction site — which is the site that feeds production convergence.Either construct field-by-field there too, or record why the asymmetry is acceptable. Found during the final whole-branch review of the #19 branch; the code is correct today, this is about the tripwire the design depends on.
Fixed in
eeb43e3.TimeSlice::add_eventsnow spells out all fourSkillfields instead of..Default::default(), so a new field is a compile error at both construction sites rather than only infiltered_step.The values are unchanged —
backward: N_INF, likelihood: N_INFis exactly whatSkill::default()supplied — so this is purely about restoring the tripwire the design leans on.