Skip to content

Commit 95fb115

Browse files
Essozclaude
andcommitted
fix: fail loudly on attr_map/varid_map inconsistency, explicit not-yet-observable returns
The .get() pattern silently returned empty sets even in cases that would indicate a population bug. Replace with direct dict access guarded only by explicit "not yet observable" early returns (no vars of this type/attr have been seen yet -- the invariant simply cannot be checked and passes vacuously). Inside the iteration loop, add assertions so any discrepancy between attr_map and varid_map fails loudly rather than being masked. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 0a1d166 commit 95fb115

2 files changed

Lines changed: 29 additions & 5 deletions

File tree

traincheck/invariant/contain_relation.py

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1317,16 +1317,32 @@ def online_check(
13171317
events = []
13181318
attr_name = child_param.attr_name
13191319
with checker_data.lock:
1320-
candidate_varids = checker_data.attr_map.get(
1321-
child_param.var_type, {}
1322-
).get(attr_name, set())
1320+
# No variables of this type/attr have been observed yet — not yet checkable.
1321+
if child_param.var_type not in checker_data.attr_map:
1322+
return OnlineCheckerResult(
1323+
trace=None, invariant=inv, check_passed=True
1324+
)
1325+
if attr_name not in checker_data.attr_map[child_param.var_type]:
1326+
return OnlineCheckerResult(
1327+
trace=None, invariant=inv, check_passed=True
1328+
)
1329+
candidate_varids = checker_data.attr_map[child_param.var_type][
1330+
attr_name
1331+
]
13231332
if isinstance(child_param, VarNameParam):
13241333
candidate_varids = {
13251334
v
13261335
for v in candidate_varids
13271336
if v.var_name == child_param.var_name
13281337
}
13291338
for varid in candidate_varids:
1339+
# attr_map guarantees attr_name is in varid_map[varid]; fail loudly
1340+
# if the population logic ever violates this invariant.
1341+
assert attr_name in checker_data.varid_map[varid], (
1342+
f"attr_map/varid_map inconsistency: {varid} is in "
1343+
f"attr_map[...][{attr_name}] but "
1344+
f"varid_map[{varid}] has no '{attr_name}' entry"
1345+
)
13301346
for i in reversed(
13311347
range(1, len(checker_data.varid_map[varid][attr_name]))
13321348
):

traincheck/onlinechecker/utils.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,9 +188,17 @@ def query_var_changes_within_time_and_process(
188188
checker_data: Checker_data,
189189
) -> list:
190190
"""Extract all variable change events from the trace, within a specific time range and process."""
191-
events = []
191+
events: list = []
192192
with checker_data.lock:
193-
for varid in checker_data.attr_map.get(var_type, {}).get(attr_name, set()):
193+
if var_type not in checker_data.attr_map:
194+
return events
195+
if attr_name not in checker_data.attr_map[var_type]:
196+
return events
197+
for varid in checker_data.attr_map[var_type][attr_name]:
198+
assert attr_name in checker_data.varid_map[varid], (
199+
f"attr_map/varid_map inconsistency: {varid} in "
200+
f"attr_map[{var_type}][{attr_name}] but not in varid_map"
201+
)
194202
for i in reversed(range(1, len(checker_data.varid_map[varid][attr_name]))):
195203

196204
change_time = checker_data.varid_map[varid][attr_name][

0 commit comments

Comments
 (0)