From cd6d2346ef1f48f4d892992008d9c051efa81aa6 Mon Sep 17 00:00:00 2001 From: coding-dev-tools Date: Tue, 25 Aug 2026 10:22:10 -0400 Subject: [PATCH 1/2] fix: respect nonadditive token counters, finer importance steps, galaxy live-limit guard Three small fixes salvaged from local review-worktree iteration: - core/context.py: the compact-header retry path recomputed available budget as `budget - self._count(base)` without guarding against nonadditive custom token counters (a header-aware counter can make base grow after compaction, driving `available` negative). Clamp to zero and skip the excerpt when no positive room remains; also propagate `compact_available` after adopting a compact header so subsequent accounting stays truthful. Covered by a new deterministic regression test. - dashboard editor: importance slider step 0.05 -> 0.025 for finer memory weighting; asserted in test_dashboard_v2. - ledger.js: galaxy engine selection now requires the scene to be within GRAPH_INITIAL_NODE_LIMIT/EDGE_LIMIT before engaging full physics; oversized complete scenes fall back to the lightweight Every renderer. Folded into main's transactional candidate pipeline (scene-marker keyed detection kept; the stale pre-refactor graphIsGalaxy() condition dropped). --- engraphis/core/context.py | 4 ++-- engraphis/dashboard_assets/index.html | 2 +- engraphis/dashboard_assets/ledger.js | 8 ++++++-- tests/test_context_packing.py | 26 ++++++++++++++++++++++++++ tests/test_dashboard_v2.py | 2 ++ 5 files changed, 37 insertions(+), 5 deletions(-) diff --git a/engraphis/core/context.py b/engraphis/core/context.py index ec85521a..388ae115 100644 --- a/engraphis/core/context.py +++ b/engraphis/core/context.py @@ -115,8 +115,8 @@ def pack( excerpt = "" truncated = False reason = "" - if self._count(base) < budget: - available = budget - self._count(base) + available = max(0, budget - self._count(base)) + if available: excerpt, truncated, reason = self._excerpt( query, candidate, available ) diff --git a/engraphis/dashboard_assets/index.html b/engraphis/dashboard_assets/index.html index c5c10925..fb078074 100644 --- a/engraphis/dashboard_assets/index.html +++ b/engraphis/dashboard_assets/index.html @@ -221,7 +221,7 @@

Choose a memory

- +
diff --git a/engraphis/dashboard_assets/ledger.js b/engraphis/dashboard_assets/ledger.js index 008da727..d31d4e79 100644 --- a/engraphis/dashboard_assets/ledger.js +++ b/engraphis/dashboard_assets/ledger.js @@ -3388,8 +3388,12 @@ oldHost.insertAdjacentElement('afterend', candidateHost); /* Authored-Galaxy detection must key off scene markers, not the toolbar preset: entering Every via its chip sets the preset to 'every', but a complete scene - with system anchors still needs the hierarchical orbit engine and overlay. */ - const galaxyQuality = fullGraph + with system anchors still needs the hierarchical orbit engine and overlay. + The live-limit guard keeps very large complete scenes on the lightweight + Every renderer instead of the full physics galaxy. */ + const galaxyWithinLiveLimit = data.nodes.length <= GRAPH_INITIAL_NODE_LIMIT + && data.links.length <= GRAPH_INITIAL_EDGE_LIMIT; + const galaxyQuality = fullGraph && galaxyWithinLiveLimit && data.nodes.some(node => node.anchor_role === 'community' && (node.system_anchor_id !== undefined || Number.isFinite(Number(node.galactic_radius)))); diff --git a/tests/test_context_packing.py b/tests/test_context_packing.py index 3db2c63c..30017b07 100644 --- a/tests/test_context_packing.py +++ b/tests/test_context_packing.py @@ -147,6 +147,32 @@ def test_nonduplicate_title_remains_in_the_citation_header() -> None: assert chunks[0].excerpt == "Deploy only after signed checks." +def test_compact_header_respects_nonadditive_counter_budget() -> None: + class HeaderOverheadCounter: + identity = "test.header-overhead" + + def __call__(self, text: str) -> int: + count = len(text.split()) + if text.startswith("[1]") and len(text) > 4: + count += 3 if text.splitlines()[0] != "[1]" else ( + 1 if text == "[1]\nAlpha rest" else 0 + ) + return count + + packer = DeterministicContextPacker(HeaderOverheadCounter()) + candidate = _candidate( + "mem_compact_header", + "Alpha rest", + title="Alpha", + ) + + context, chunks, usage = packer.pack("alpha", [candidate], token_budget=3) + + assert context.startswith("[1]\nAlpha") + assert chunks[0].excerpt.startswith("Alpha") + assert usage.context_tokens <= usage.budget_tokens == 3 + + def test_sentence_excerpt_marks_omission_and_preserves_qualifying_evidence() -> None: packer = DeterministicContextPacker() candidate = _candidate( diff --git a/tests/test_dashboard_v2.py b/tests/test_dashboard_v2.py index 150bd038..3fc4f543 100644 --- a/tests/test_dashboard_v2.py +++ b/tests/test_dashboard_v2.py @@ -914,6 +914,7 @@ def test_graph_motion_saved_views_and_tuning_controls_are_wired(monkeypatch, tmp assert behavior in script.text assert "syncGraphSpacetimeTuning(" in script.text assert "state.graphSpacetimeOverlay.setEnabled(graphIsGalaxy())" in script.text + assert 'id="editor-memory-importance" type="range" min="0" max="1" step="0.025"' in page.text def test_code_overlay_scopes_only_to_known_repositories(monkeypatch, tmp_path): @@ -940,6 +941,7 @@ def test_all_nodes_mode_preserves_scope_preferences_and_bounds_heavy_work(monkey assert "if (loadAll) {" in script.text assert "return Promise.all([ensureGraphAllAsset(), ensureGraphAssets(false)]);" in script.text assert "const graphFactory = galaxyQuality ? window.EngraphisGraph" in script.text + assert "const galaxyWithinLiveLimit = data.nodes.length <= GRAPH_INITIAL_NODE_LIMIT" in script.text assert "scopeControl.disabled = full" not in script.text assert "graph.setCollapse(byId('graph-collapse').checked ? 'auto' : false)" in script.text assert "const includeCode = targetIncludeCode ? '&include_code=true' : '';" in script.text From a3e9668040ae0b907c40622f631fc3fca8eeffc7 Mon Sep 17 00:00:00 2001 From: coding-dev-tools Date: Tue, 25 Aug 2026 10:58:02 -0400 Subject: [PATCH 2/2] test: align every-asset galaxy guard assertions with live-limit check --- tests/test_graph_every_asset.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/test_graph_every_asset.py b/tests/test_graph_every_asset.py index 2c57d6a5..c984ec55 100644 --- a/tests/test_graph_every_asset.py +++ b/tests/test_graph_every_asset.py @@ -420,7 +420,8 @@ def test_ledger_routes_the_every_layout_and_restores_filters() -> None: def test_ledger_keeps_authored_galaxy_scenes_on_the_hierarchical_engine() -> None: ledger = LEDGER.read_text(encoding="utf-8") - assert "const galaxyQuality = fullGraph\n && data.nodes.some" in ledger + assert "const galaxyQuality = fullGraph && galaxyWithinLiveLimit\n && data.nodes.some" in ledger + assert "const galaxyWithinLiveLimit = data.nodes.length <= GRAPH_INITIAL_NODE_LIMIT" in ledger assert "candidateOverlay.setEnabled(galaxyQuality || graphIsGalaxy())" in ledger # The Every-node chip changes the toolbar preset before the complete scene arrives. Both # candidates must therefore be preloaded so a fast entry cannot select a missing Galaxy