You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
test.yml on main has been red since the issue #170 merge chain landed, with two more failures added by the template edits that followed. Tracking issue for the fix PR.
tests/test_apriori.py::TestWorkerSeam::test_flag_off_call_signature_unchanged — 'No data after filtering (1 group reads raised)' != 'No data after filtering'
tests/test_lambda_build.py::TestTemplateEnvironment::test_execution_role_grants_zagg_index_store — the template's zagg-index role statement was broadened from Get/Put on arn:aws:s3:::sliderule-public-cors/zagg-index/* to Get/Put/Delete on arn:aws:s3:::sliderule-public-cors/*
Verdict on the #170 group: test artifact, not a regression
All six failures share one mechanism. The tests drive process_shard with doubles aimed at the hierarchical seam: monkeypatch.setattr("zagg.processing._read_group", fake) plus H5Coro = lambda *a, **k: object(). That seam is only wired through HierarchicalIndex.read_group, which late-binds _processing._read_groupspecifically so monkeypatched fakes keep working (its own docstring, src/zagg/index/hierarchical.py). InlineIndex.read_group (src/zagg/index/inline.py) never calls zagg.processing._read_group — it routes through _planned_read_group/_read_group_full with a compiled read_fn that tries build_chunk_map(h5obj, …) and falls back to h5obj.readDatasets(…). Against the fake object() that raises ('object' object has no attribute 'readDatasets'), the worker's per-group handler counts it as a read error, and the issue #116 accounting correctly reports "No data after filtering (N group reads raised)".
The plain vs. "(N group reads raised)" message split predates #170 (issue #116, worker.py) and is unchanged; real callers with real HDF5 objects see identical semantics on both backends. What changed is only which backend the unpinned test configs exercise by default. Note test_apriori.py::TestWorkerSeam::test_granule_url_passed_when_enabled still passes — its chunk_boundaries source keeps the hierarchical default per the #170 carve-out in index_from_config.
Fix: pin index: {backend: hierarchical} in the test configs that test the _read_group seam / worker mechanics through monkeypatched fakes — the same approach PR #173 took for the benchmark-config pins. No production code change.
Template fixes
260221b makes default RecycleMaxInvocations="1" (recycle after every invocation = cold-every-time) the deliberate posture; the fix updates test_lambda_build.py:212 to pin "1" rather than reverting the template.
The zagg-index role statement is restored to the issue Virtual index entry point: pluggable chunk-index backends for the read path #160 scope (Get/Put on zagg-index/* only): the comment directly above it still reads "scoped to the public zagg-index prefix only", the admin copy deployment/aws/execution_role.yaml still carries the scoped form (the two are pinned to lockstep by the same test), and nothing in-tree issues DeleteObject. If the broader grant is actually needed for the cold-restart hammer work, that wants a deliberate commit + test update — question raised on the fix PR.
🤖 from Claude
test.ymlonmainhas been red since the issue #170 merge chain landed, with two more failures added by the template edits that followed. Tracking issue for the fix PR.Forensics
a86fe51(#172: force_cold flip + telemetry + self-recycle)5f29a04(#170 chain: compiled read path becomes the package default)5c9b1e2("cold restart hammer", template-only)260221b(RecycleMaxInvocations default "0"→"1"):212now'1' != '8')Full failure list (reproduced locally on
260221b):From the #170 default flip (6):
tests/test_apriori.py::TestWorkerSeam::test_flag_off_call_signature_unchanged—'No data after filtering (1 group reads raised)' != 'No data after filtering'tests/test_streaming.py::TestStreamingWorker::test_single_buffer_is_byte_identical_to_pooled—KeyError: 'h_tdigest'tests/test_streaming.py::TestStreamingWorker::test_multi_flush_counts_exact_quantiles_close—KeyError: 'count'tests/test_streaming.py::TestStreamingWorker::test_streaming_releases_buffer_per_flush—assert 0 > 0tests/test_streaming.py::TestStreamingWorker::test_streaming_empty_shard_matches_pooled_no_data— error-message mismatch as abovetests/test_streaming.py::TestStreamingReviewFolds::test_profile_charges_merge_to_read_phase—{'read'} != {'aggregate', 'index', 'read'}From the template edits (2):
tests/test_lambda_build.py::TestTemplateEnvironment::test_self_recycle_env_defaults—RecycleMaxInvocationsdefault pin (now'1' != '8')tests/test_lambda_build.py::TestTemplateEnvironment::test_execution_role_grants_zagg_index_store— the template's zagg-index role statement was broadened from Get/Put onarn:aws:s3:::sliderule-public-cors/zagg-index/*to Get/Put/Delete onarn:aws:s3:::sliderule-public-cors/*Verdict on the #170 group: test artifact, not a regression
All six failures share one mechanism. The tests drive
process_shardwith doubles aimed at the hierarchical seam:monkeypatch.setattr("zagg.processing._read_group", fake)plusH5Coro = lambda *a, **k: object(). That seam is only wired throughHierarchicalIndex.read_group, which late-binds_processing._read_groupspecifically so monkeypatched fakes keep working (its own docstring,src/zagg/index/hierarchical.py).InlineIndex.read_group(src/zagg/index/inline.py) never callszagg.processing._read_group— it routes through_planned_read_group/_read_group_fullwith a compiledread_fnthat triesbuild_chunk_map(h5obj, …)and falls back toh5obj.readDatasets(…). Against the fakeobject()that raises ('object' object has no attribute 'readDatasets'), the worker's per-group handler counts it as a read error, and the issue #116 accounting correctly reports"No data after filtering (N group reads raised)".The plain vs.
"(N group reads raised)"message split predates #170 (issue #116,worker.py) and is unchanged; real callers with real HDF5 objects see identical semantics on both backends. What changed is only which backend the unpinned test configs exercise by default. Notetest_apriori.py::TestWorkerSeam::test_granule_url_passed_when_enabledstill passes — itschunk_boundariessource keeps the hierarchical default per the #170 carve-out inindex_from_config.Fix: pin
index: {backend: hierarchical}in the test configs that test the_read_groupseam / worker mechanics through monkeypatched fakes — the same approach PR #173 took for the benchmark-config pins. No production code change.Template fixes
260221bmakes defaultRecycleMaxInvocations="1"(recycle after every invocation = cold-every-time) the deliberate posture; the fix updatestest_lambda_build.py:212to pin"1"rather than reverting the template.zagg-index/*only): the comment directly above it still reads "scoped to the public zagg-index prefix only", the admin copydeployment/aws/execution_role.yamlstill carries the scoped form (the two are pinned to lockstep by the same test), and nothing in-tree issues DeleteObject. If the broader grant is actually needed for the cold-restart hammer work, that wants a deliberate commit + test update — question raised on the fix PR.