Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
0d0af95
fix(galaxy): disable forced inward convergence that collapsed orbits …
Coding-Dev-Tools Aug 16, 2026
b604850
fix(tests): update Galaxy convergence tests for stable orbits (rate=0)
Coding-Dev-Tools Aug 16, 2026
a6eb891
fix(graph): preserve bounded galaxy layout
Coding-Dev-Tools Aug 17, 2026
45230bd
Improve graph rendering and context efficiency
Coding-Dev-Tools Aug 18, 2026
3a5438d
feat(graph): improve rendering pipeline and context packing efficiency
Coding-Dev-Tools Aug 18, 2026
7e94533
fix(dashboard): gate spacetime collapse forces on canonical scene flag
Coding-Dev-Tools Aug 18, 2026
77d7367
revert: restore dashboard graph to main orbital physics
Coding-Dev-Tools Aug 19, 2026
e2ab691
Revert "revert: restore dashboard graph to main orbital physics"
Coding-Dev-Tools Aug 19, 2026
e12e2e3
Revert "fix(dashboard): gate spacetime collapse forces on canonical s…
Coding-Dev-Tools Aug 19, 2026
0cc32b5
Revert "feat(graph): improve rendering pipeline and context packing e…
Coding-Dev-Tools Aug 19, 2026
be4fc68
fix: restore graph visualization to c120c16 working state
Coding-Dev-Tools Aug 19, 2026
e570a09
fix: restore test_dashboard_v2.py to c120c16 state
Coding-Dev-Tools Aug 19, 2026
427a8a8
fix(graph): restore exact orbital physics from screenshot reference (…
Coding-Dev-Tools Aug 19, 2026
2586bf3
fix(graph): use main branch graph_scene.py to fix scene computation hang
Coding-Dev-Tools Aug 19, 2026
f754bf2
perf(graph): fix O(edges×communities) algorithms in galaxy-v12 graph_…
Coding-Dev-Tools Aug 19, 2026
141985e
fix(graph): restore correct visual hierarchy in _community_positions
Coding-Dev-Tools Aug 19, 2026
b05e5f4
tune(graph): fix slider response and increase default gravity
Coding-Dev-Tools Aug 19, 2026
a880795
tune(graph): strong gravity, black hole mass scaling, immediate slide…
Coding-Dev-Tools Aug 20, 2026
a1db0da
tune(graph): 1.5x gravity boost, fix double-normalization bug, update…
Coding-Dev-Tools Aug 20, 2026
e134c62
tune(graph): 2x gravity, sqrt(mass) G coupling, 0.8x orbital speed gain
Coding-Dev-Tools Aug 20, 2026
b66c238
test(e2e): align graph physics expectations
Coding-Dev-Tools Aug 20, 2026
1199aae
test(e2e): cover immediate gravity and revised orbit response
Coding-Dev-Tools Aug 20, 2026
1f7d32d
chore: normalize touched graph files to repository line endings
Coding-Dev-Tools Aug 20, 2026
e11ae73
fix(types): accept mapping edges in component discovery
Coding-Dev-Tools Aug 20, 2026
d5602c7
fix(graph): reserve full nested system envelopes
Coding-Dev-Tools Aug 20, 2026
62ed700
fix(graph): bound orbital speed response and diagnostics
Coding-Dev-Tools Aug 20, 2026
c098b16
fix(dashboard): double range-control response
Coding-Dev-Tools Aug 20, 2026
ff4584f
fix(dashboard): keep importance round-trip exact under slider respons…
Aug 22, 2026
fb2391e
fix(review): keep withdrawn Hermes integration out of PR
Coding-Dev-Tools Aug 24, 2026
b8f5133
Merge origin/main into fix/galaxy-orbit-collapse
Coding-Dev-Tools Aug 24, 2026
741d316
fix(graph,cloud): refine galaxy renderer and entitlement preflight
Coding-Dev-Tools Aug 24, 2026
db00373
docs(mcp): align classic tool count
Coding-Dev-Tools Aug 24, 2026
abcc920
Merge remote-tracking branch 'origin/main' into HEAD
Coding-Dev-Tools Aug 24, 2026
853230f
Merge remote-tracking branch 'origin/main' into HEAD
Coding-Dev-Tools Aug 24, 2026
54575d3
fix(graph): count cross-community edges symmetrically
Coding-Dev-Tools Aug 24, 2026
3aac51d
fix(graph,context): preserve scope values and compact budgets
Coding-Dev-Tools Aug 24, 2026
ba8ef02
Merge remote-tracking branch 'origin/main' into HEAD
Coding-Dev-Tools Aug 24, 2026
d97d6e9
Merge remote-tracking branch 'origin/main' into HEAD
Coding-Dev-Tools Aug 24, 2026
8f43a08
fix graph subtree summary envelopes
Coding-Dev-Tools Aug 24, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ selection, set `ENGRAPHIS_UPDATE_EXTRAS` to a comma-separated list (for example
`server,mcp`), or set it to `none` for the base package only.

> **Upgrading to 1.4:** `engraphis-mcp` now exposes the nine-tool Smart gateway. Integrations that
> require the former 34 direct tool names should run `engraphis-mcp-classic`. The SQLite schema
> require the former 35 direct tool names should run `engraphis-mcp-classic`. The SQLite schema
> in the 1.4.0 release was version 9. Existing v7-to-v8 databases already contain `confidence`
> and `pinned_at`/`unpinned_at`; v9 adds the `memory_tombstones` repository-scope column/table
> and performs a one-time entity-canonicalization repair, then migrates automatically on first
Expand Down Expand Up @@ -387,7 +387,7 @@ the indicated read or action executor; no profile selection is required. The gat
the discovered capability again before it runs it, and clients remain responsible for their
normal destructive-action approval boundary.

Existing clients that pin the historical 34 named tools can use
Existing clients that pin the historical 35 named tools can use
`engraphis-mcp-classic` (or `engraphis-mcp-http --classic`). The complete classic inventory,
including `engraphis_check_update`, is in the [MCP tool reference](https://github.com/Coding-Dev-Tools/engraphis/blob/main/docs/MCP_TOOLS.md).

Expand Down Expand Up @@ -562,7 +562,7 @@ when you are ready to evaluate the service boundary and billing options.
| | Free (available now) | Pro: $10/mo or $100/yr | Team: $20/seat/mo or $200/seat/yr |
|---|---|---|---|
| Dashboard WebUI (with built-in inspector) | ✓ | ✓ | ✓ |
| Memory engine + Smart MCP (Classic 34-tool compatibility) | ✓ | ✓ | ✓ |
| Memory engine + Smart MCP (Classic 35-tool compatibility) | ✓ | ✓ | ✓ |
| Version-chain diffs, offline knowledge graph | ✓ | ✓ | ✓ |
| Manual local consolidation (dry-run by default) | ✓ | ✓ | ✓ |
| Local workspace export (portable v2 JSON: memories, source manifests, graph/code evidence, sessions, audit, and receipts) | ✓ | ✓ | ✓ |
Expand All @@ -580,7 +580,7 @@ when you are ready to evaluate the service boundary and billing options.

## MCP tools

Engraphis exposes a zero-configuration Smart MCP gateway plus a 34-tool Classic compatibility
Engraphis exposes a zero-configuration Smart MCP gateway plus a 35-tool Classic compatibility
server across memory, recall, code graphs, governance, sessions, and privacy-safe audit receipts.
The focused [MCP tool reference](https://github.com/Coding-Dev-Tools/engraphis/blob/main/docs/MCP_TOOLS.md) is the source for
the full inventory and parameters.
Expand Down Expand Up @@ -758,7 +758,7 @@ engraphis/
│ ├── backends/ # pluggable embedder / vector index / reranker / codegraph / sync transports / encryption
│ ├── factory.py # outer v2 composition root; selects and injects concrete backends
│ ├── service.py # validated MemoryService facade
│ ├── mcp_server.py # Smart MCP gateway + 34-tool Classic compatibility server
│ ├── mcp_server.py # Smart MCP gateway + 35-tool Classic compatibility server
│ ├── dashboard_app.py # dashboard WebUI (FastAPI)
│ ├── dashboard_assets/ # primary Ledger interface + graph engine
│ ├── classic_assets/ # selectable full operator dashboard backup
Expand Down
2 changes: 1 addition & 1 deletion docs/AGENT_CONNECT.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ middleware. Do not expose it through a LAN address or proxy. For a remote deploy
`engraphis[all]`, set a strong `ENGRAPHIS_API_TOKEN`, terminate TLS, and use the dashboard's
authenticated `/mcp` endpoint instead.

Use `engraphis-mcp-http --classic` only for an existing integration that requires the 34 direct
Use `engraphis-mcp-http --classic` only for an existing integration that requires the 35 direct
tool names. New integrations should keep the nine-tool Smart default.

Engraphis documents and tests generic MCP transports; it does not claim client-specific support
Expand Down
2 changes: 1 addition & 1 deletion docs/KILO_CODE_INTEGRATION.md
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,7 @@ class, and the appropriate executor revalidates all of it before running.
| `engraphis_conflict_review` | List pending/quarantined/conflicted records for review (read-only inbox). |

`engraphis-mcp-classic` is only for an existing configuration that pins direct tool names. It
preserves the former 34-tool surface below; new Kilo Code installations should keep the zero-config
preserves the former 35-tool surface below; new Kilo Code installations should keep the zero-config
Smart command shown above.

### Classic 35-tool inventory
Expand Down
4 changes: 2 additions & 2 deletions engraphis/classic_assets/dashboard.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion engraphis/classic_assets/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -350,6 +350,6 @@
graph view. dashboard.js fetches both on demand from graphRender(); see loadForceGraph()
and loadGraphEngine(). scripts/externalize_dashboard_assets.py enforces both halves:
they stay out of this file, and the lazy references still have to resolve. -->
<script src="/classic-assets/dashboard.js?v=20260814-all-controls-2"></script>
<script src="/classic-assets/dashboard.js?v=20260819-tuned-physics-final"></script>
</body>
</html>
4 changes: 4 additions & 0 deletions engraphis/cloud_features.py
Original file line number Diff line number Diff line change
Expand Up @@ -635,6 +635,10 @@ def run_managed_job(service: Any, workspace: str, kind: str, *,
if not resolved_id:
raise CloudFeatureError("The selected workspace does not exist.", status=404)
cloud = client or CloudFeatureClient.from_environment(resolved_id)
# Read the entitlement-gated policy before taking the local write lock. The snapshot
# builder reserves and commits a generation, so uploading first would let a lapsed
# subscriber mutate local state before the Cloud control plane returns 402.
cloud.get_policy(resolved_id)
workspace_id, snapshot = build_managed_snapshot(service, workspace)
receipt = cloud.upload_snapshot(workspace_id, snapshot)
generation = int(receipt.get("generation", snapshot["generation"]))
Expand Down
56 changes: 47 additions & 9 deletions engraphis/core/context.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,15 +109,35 @@ def pack(
continue

prefix = "\n\n" if context else ""
header = self._header(candidate, len(packed) + 1)
ordinal = len(packed) + 1
header = self._header(candidate, ordinal)
base = f"{context}{prefix}{header}\n"
if self._count(base) >= budget:
continue
excerpt = ""
truncated = False
reason = ""
if self._count(base) < budget:
available = budget - self._count(base)
excerpt, truncated, reason = self._excerpt(
query, candidate, available
)
Comment thread
Coding-Dev-Tools marked this conversation as resolved.

available = budget - self._count(base)
excerpt, truncated, reason = self._excerpt(
query, candidate, available
)
# Keep the established single-pass behavior for ordinary sources.
# Only retry against the cheaper ordinal-only header when the selected
# excerpt already starts with the exact displayed title (or the titled
# header left no room). This removes prompt duplication without deleting
# evidence or weakening the stable ``[n]`` citation bridge.
if not excerpt or _starts_with_title(excerpt, record.title):
compact_base = (
f"{context}{prefix}"
f"{self._header(candidate, ordinal, include_title=False)}\n"
)
if self._count(compact_base) < budget:
compact_available = budget - self._count(compact_base)
compact = self._excerpt(query, candidate, compact_available)
if compact[0] and _starts_with_title(compact[0], record.title):
base = compact_base
available = compact_available
excerpt, truncated, reason = compact
if not excerpt:
continue
proposed = f"{base}{excerpt}"
Expand Down Expand Up @@ -370,15 +390,21 @@ def semantically_safe(excerpt: str) -> bool:
high = middle - 1
return best

def _header(self, candidate: Candidate, ordinal: int) -> str:
def _header(
self,
candidate: Candidate,
ordinal: int,
*,
include_title: bool = True,
) -> str:
record = candidate.record
if record is None:
return f"[{ordinal}]"
# The compact source list carries identity/scope. Repeating ULIDs and
# scope labels inside the context spends reader tokens without adding
# evidence; the ordinal is the citation bridge.
header = f"[{ordinal}]"
if record.title:
if include_title and record.title:
title = " ".join(record.title.split())[:120]
header += f" {title}"
return header
Expand Down Expand Up @@ -415,6 +441,18 @@ def _terms(text: str) -> set[str]:
return {match.group(0).casefold() for match in _WORD_RE.finditer(text or "")}


def _starts_with_title(excerpt: str, title: str) -> bool:
"""Whether an excerpt already opens with the exact displayed title text."""
displayed_title = " ".join((title or "").split())[:120].casefold()
normalized_excerpt = " ".join((excerpt or "").split()).casefold()
if not displayed_title or not normalized_excerpt.startswith(displayed_title):
return False
return (
len(normalized_excerpt) == len(displayed_title)
or not normalized_excerpt[len(displayed_title)].isalnum()
)


def _family_representatives(
candidates: list[Candidate],
) -> tuple[list[Candidate], int]:
Expand Down
Loading