Decisions: how the package reads [WU26]¶
Generated by tools/equation_map.py from schema.DECISIONS and the [D9] / [E13] tags in the
code; edit those, not this file. "paper" is the paper's own reading, "ours" a choice it leaves
open. The plans hold the reasoning behind each.
| id | rule | paper or ours | plan | implemented in | tested by |
|---|---|---|---|---|---|
| D1 | the attack cost counts devices (a SCADA terminal and a PMU per bus) moved beyond noise | ours | docs/plans/WU_MSFDIA_PLAN.md, Decisions | engine.attacks.minimize._Window._devices |
none |
| D2 | the fewest-tamper search runs for every generated family, At and Am | ours | docs/plans/WU_MSFDIA_PLAN.md, Decisions | none | tests.test_minimize.test_new_generation_searches_by_default |
| D3 | PGLib-OPF v23.07 rate_a as the alternative line ratings | ours | docs/plans/WU_MSFDIA_PLAN.md, Decisions | none | none |
| D4 | PMUs read the current phasor of every branch at their bus (eqs. 19-20) | paper | docs/plans/WU_MSFDIA_PLAN.md, Decisions | none | none |
| D5 | the overload goal (24)-(25) holds on the noiseless reading of the false state | paper | docs/plans/WU_MSFDIA_PLAN.md, Decisions | none | tests.test_overload.test_the_goal_rides_on_the_true_flow_and_ends_at_the_rating |
| D6 | generation makes the multi-snapshot At and Am only | ours | docs/plans/WU_MSFDIA_PLAN.md, Decisions | none | none |
| D7 | At's stealth bound and tamper count use the meters' rated accuracy | ours | docs/plans/WU_MSFDIA_PLAN.md, Decisions | engine.attacks.minimize.MinimizeMixin.min_tamperengine.attacks.minimize._Window._current_stepengine.attacks.minimize._Window._currentsengine.attacks.minimize._Window._sigmasengine.attacks.minimize._Window._snapshotmodels.config.RampSettingsmodels.config.TimelineKnobsmodels.frames.FrameKnobstimeline.generate_timeline |
tests.test_overload.test_am_counts_against_the_paper_noise_and_at_against_the_rated_accuracytests.test_overload.test_am_has_no_stealth_bound_and_at_keeps_its_own |
| D8 | Am's tamper threshold is the paper's case-study noise, 0.03 pu SCADA, 0.01 pu PMU | paper | docs/plans/WU_MSFDIA_PLAN.md, Decisions | engine.attacks.minimizeengine.attacks.minimize._Window._currentsengine.attacks.minimize._Window._sigmasengine.attacks.overloadformulas.noise.paper_sigma |
tests.test_attack_area.test_every_attack_the_search_returns_is_validtests.test_overload.test_am_counts_against_the_paper_noise_and_at_against_the_rated_accuracytests.test_overload.test_am_has_no_stealth_bound_and_at_keeps_its_own |
| D9 | the goal adds the share k/T of the gap to the rating to each snapshot's true flow | ours | docs/plans/WU_MSFDIA_PLAN.md, Decisions | engine.attacks.overload._schedulemodels.frames.FlowGoal |
tests.test_overload.test_the_goal_rides_on_the_true_flow_and_ends_at_the_rating |
| D10 | hybrid meters: an angle only at a PMU, and PMU branch currents | paper | docs/plans/WU_MSFDIA_PLAN.md, Decisions | dataset.baseengine.attacks.minimize._Window.__init__engine.core.FdiaGenerator.__init__generation.emitmodels.choices.MeterModelmodels.fields.PmuCurrentFieldsmodels.grid.MeterPlantimeline.generate_timeline |
tests.test_modelstests.test_pmu_channelstests.test_pmu_channels.test_a_scada_voltmeter_reads_no_angle_under_the_hybrid_modeltests.test_schema.test_the_fixture_carries_exactly_the_schema |
| D11 | Am has no between-snapshot bound: noise only sets the l0 threshold | paper | docs/plans/WU_MSFDIA_PLAN.md, Decisions | engine.attacks.episodes.OverloadDesigner.designengine.attacks.minimize._Window.__init__engine.attacks.minimize._Window._sigmasgeneration.write.search_attrsmodels.config.TimelineKnobsmodels.frames.FrameKnobstimeline.generate_timeline |
tests.test_overload.test_am_has_no_stealth_bound_and_at_keeps_its_owntests.test_overload.test_am_reaches_the_rating_on_the_held_support |
| D12 | what the meters measure is its own knob of the meter plan | ours | docs/plans/WU_MSFDIA_PLAN.md, Decisions | none | tests.test_pmu_channels.test_new_generation_is_hybrid_only |
| D13 | the previous frame's PMU currents are offered for the eq. (3) pseudo-measurements | ours | docs/plans/WU_MSFDIA_PLAN.md, Decisions | none | none |
| D14 | generators of the support move freely within (22)-(23) | paper | docs/plans/WU_MSFDIA_PLAN.md, Decisions | engine.attacks.false_state.FalseStateMixin.free_injection_buses |
tests.test_overload.test_a_generator_at_its_p_limit_keeps_its_q_free |
| D15 | a line's rating defaults to 1.25 times its peak flow over the pool | ours | docs/plans/WU_MSFDIA_PLAN.md, Decisions | engine.attacks.overloadengine.attacks.overload.OverloadMixin.use_line_ratingsgeneration.write.search_attrsmodels.choices.RatingSourcemodels.config.OverloadSettings |
none |
| D16 | the support's edge keeps (22)-(23), and a moved load changes by at most load_cap [YUA11] | ours | docs/plans/WU_MSFDIA_PLAN.md, Decisions | engine.attacks.false_state.FalseStateMixin._out_of_boundsengine.attacks.false_state.FalseStateMixin.solve_flow_localengine.attacks.minimize.MinimizeMixin._flow_goal_statemodels.config.OverloadSettingsmodels.frames.FrameKnobs |
tests.test_overload.test_an_edge_generator_stays_inside_its_limitstests.test_search_speed |
| D17 | an overload episode drives two lines by default, as the paper's case studies | paper | docs/plans/WU_MSFDIA_PLAN.md, Decisions | engine.attacks.overloadengine.attacks.overload.OverloadMixin._target_setsengine.attacks.overload.OverloadMixin.overload_goalgeneration.emit.overload_episodemodels.config.OverloadSettingsmodels.frames.FlowGoaltimeline._knobs |
tests.test_overload.test_two_lines_by_default_and_the_pairs_share_one_areatests.test_search_speed.test_exhaustive_searches_return_their_pinned_answerstests.test_wu_scenarios |
| D18 | the attacker's area: the paper's where stated, else Sec. III-A's rules (1-2 checked, 3-4 our score) | paper | docs/plans/WU_MSFDIA_PLAN.md, Decisions | engine.attacks.area.AreaMixin.rule_area |
tests.test_attack_area.test_the_ieee118_area_is_fig_9_and_the_search_uses_ittests.test_attack_area.test_the_rules_check_1_and_2_and_charge_for_size |
| E1 | trust is incremental: a trusted PMU keeps the offset its bus had before its slot (eqs. 29-30) | paper | docs/plans/WU_DEFENSE_PLAN.md, Decisions | trust.wu26 |
tests.test_trusted_pmus.test_trust_accumulates_from_its_slot |
| E2 | a trusted PMU pins its own | V | and angle only (eqs. 27, 32) | paper | docs/plans/WU_DEFENSE_PLAN.md, Decisions |
| E3 | the defense's cost is the devices tampered at any snapshot (Fig. 12); eq. (33)'s net l0 also reported | paper | docs/plans/WU_DEFENSE_PLAN.md, Decisions | models.choices.CostUnitmodels.config.WuDefenseConfigtrust.defensetrust.wu26 |
tests.test_wu_defense_env.test_the_reward_is_the_rise_in_the_search_cost |
| E4 | 1-minute attack snapshots interpolated from the 5-minute pool | ours | docs/plans/WU_DEFENSE_PLAN.md, Decisions | none | none |
| E5 | IEEE-118: 10 snapshots, one trust slot each (Figs. 10-11) | paper | docs/plans/WU_DEFENSE_PLAN.md, Decisions | none | none |
| E6 | Algorithm 1 line 8 ends an episode with no reward, as written | paper | docs/plans/WU_DEFENSE_PLAN.md, Decisions | none | tests.test_wu_defense_env.test_line_8_ends_the_episode_without_a_reward |
| E7 | the DQN's state is Fig. 1's: the readings, the target lines' loading, the trusted set | paper | docs/plans/WU_DEFENSE_PLAN.md, Decisions | none | tests.test_wu_defense_env.test_the_state_is_what_fig_1_lists |
| E8 | IEEE-118's 100 tests run as 10 training sessions of 10 test windows | ours | docs/plans/WU_DEFENSE_PLAN.md, Decisions | none | none |
| E9 | the Q network is ours (two hidden layers of 128); its hyperparameters are the paper's | ours | docs/plans/WU_DEFENSE_PLAN.md, Decisions | trust.dqn.q_network |
tests.test_trusted_pmus_dqn.test_the_stated_hyperparameters_are_the_defaults |
| E10 | detection with PMU support is the residual test with trusted PMUs reading truth | ours | docs/plans/WU_DEFENSE_PLAN.md, Decisions | none | none |
| E11 | the single-snapshot trusted-meter classes stay as the linear analogue | ours | docs/plans/WU_DEFENSE_PLAN.md, Decisions | none | none |
| E12 | IEEE-1354 is not reproduced | ours | docs/plans/WU_DEFENSE_PLAN.md, Decisions | none | none |
| E13 | one support is held for the window (a support per trust slot never changed an answer, removed) | ours | docs/plans/WU_DEFENSE_PLAN.md, Decisions | none | none |
| E14 | reproduction ratings: each target's last flow plus 0.10 pu (Fig. 4's scale); k times the peak as a sensitivity | ours | docs/plans/WU_DEFENSE_PLAN.md, Decisions | none | tests.test_attack_area.test_delta_ratings_generate_am_episodes |
| E15 | generation keeps the linear ramp of D9 | ours | docs/plans/WU_DEFENSE_PLAN.md, Decisions | none | none |
| E16 | the attack minimizes the l1 of the window's summed attack, eq. (12) read literally ([37]'s l1) | paper | docs/plans/WU_DEFENSE_PLAN.md, Decisions | trust.wu26 |
none |
| E17 | the reproduction meters every branch at both ends, each node's SCADA its incident flows ([29]) | paper | docs/plans/WU_DEFENSE_PLAN.md, Decisions | trust.wu26 |
none |
| E19 | the faithful attack's goal is (24)-(25) as written: the end at S_max, the flow never falling; D9's ramp stays for generation | paper | docs/plans/WU_DEFENSE_PLAN.md, Decisions | trust.wu26trust.wu26._WindowProblem.constraints |
tests.test_wu26_faithful.test_the_goal_is_eqs_24_25_as_written |
| E18 | the reproduction's overload rho, per-snapshot l1 weight tau and trust region are ours | ours | docs/plans/WU_DEFENSE_PLAN.md, Decisions | trust.wu26 |
none |