Coding Semantic Intelligence
August 25, 2026 ยท View on GitHub
Scope
Semantic intelligence is repository-local. A language-server process owns one
repository root and rejects documents outside it. Cross-repository discovery
remains the responsibility of code_context; semantic rename, code actions,
formatting, diagnostics, and AI ChangeSets never silently expand their write
scope to a sibling repository.
The feature deliberately excludes code completion, next-edit prediction, debugger/AI-debug modes, Local History, and run/debug configurations.
LSP contract
The persistent LSP client supports:
- diagnostics tied to the current document version;
- hover;
- code actions and quick fixes;
- repository-local rename;
- document formatting;
- organize imports;
- document and workspace symbols;
- definition and references.
The client stores advertised server capabilities and answers the standard
server-to-client requests required by semantic servers. A server-requested
workspace/applyEdit is rejected: all semantic mutations must become a
reviewed ChangeSet.
Managed language-server lifecycle
Language-server packages are machine-level, regeneratable dependencies under
EVOFLUX_CACHE_DIR/language-servers. They are never written into a repository.
The runtime resolves a pinned EvoFlux-managed executable first and falls back
to a compatible executable on the system PATH.
Settings โ Language servers scans the active project's authorized repository
set for known source extensions. Detection respects .gitignore, skips
symlinked directories, and is bounded to 50,000 files per repository. One
managed installation is shared by every repository, while each
(repository, language) pair still owns an independent LSP process and
document-version state.
Installation is never automatic. A user confirms one catalog entry, then the
backend installs allowlisted, pinned packages from a fixed public registry into
a staging directory, validates the expected executable, atomically activates
the cache entry, and restarts only clients for that language. Node-based
servers use npm with lifecycle scripts and user npm configuration disabled;
Python uses an isolated uv tool directory. SDK-coupled servers such as clangd,
sourcekit-lsp, Dart, rust-analyzer, and jdtls remain system-managed and expose a
toolchain-specific setup hint instead of invoking an OS package manager. Known
toolchain proxies are probed before being reported ready; for example, a rustup
rust-analyzer shim without the installed component remains missing.
Automatic post-edit feedback
Every successful edit, write, or patch mutation in Coding mode triggers
the post-edit diagnostic hook. A multi-file patch produces one aggregated
observation. The hook:
- captures a pre-edit diagnostic baseline;
- synchronizes the changed content with its language server;
- requires a diagnostic publication for the current document version;
- rejects results when the file hash changes while diagnostics are in flight;
- reports newly introduced and resolved diagnostics;
- publishes the complete current snapshot into Problems.
Because publishDiagnostics.version is optional in LSP, a server that omits it
is accepted only after a new publication generation arrives following the
corresponding didOpen/didChange; cached pre-edit diagnostics are not reused.
Python falls back to Ruff when no language server is available. Clean output explicitly states that static/LSP evidence does not replace behavioral tests.
Guarded ChangeSets
AI, LSP, review, and Git workflows produce the same ChangeSet contract:
- repository-relative paths only;
- base SHA-256 and optional document version;
- UTF-16-aware conversion of LSP
WorkspaceEdittext edits; - multi-file preview through Monaco DiffEditor;
- per-file and whole-set Accept/Reject;
- stale-base validation before any write;
- atomic file replacement with rollback of earlier files on failure;
- optional session snapshot;
- bounded LSP and deterministic existing-project test/lint verification.
Model-provided verification strings never expand execution authority. EvoFlux derives commands from existing project manifests and lockfiles, shows them in the ChangeSet review before apply, and invokes them without a shell.
No model or language server writes proposed edits directly. AI may replace an existing file only when its complete content and SHA-256 were present in the reviewed context. Truncated or unseen existing files are rejected; new files remain guarded by expected absence at apply time. Project-bound Coding sessions may run explicit editor and Git AI actions in any repository that is a persisted member of that project; arbitrary sibling paths remain unauthorized.
Problems hub
Problems normalizes these producers into one repository view:
- LSP;
- Ruff/tsc static diagnostics;
- shell build and test output;
- AI self-review;
- security review;
- Agent Plugin validation.
Each finding keeps source, severity, location, stable rule code, scope, provenance, optional structured fix, and suppression identity. Users can stage a fix, add it to a plan, dismiss it, suppress its rule, or send it to the agent. Re-publishing one producer scope replaces stale findings without removing unrelated sources.
Explicit AI editor boundary
The editor never calls a model on keystrokes. A user chooses an AI action, reviews the assembled context, and explicitly starts the call. Supported actions are explanation, diagnostic fixing, refactoring, tests, documentation, problem finding, simplification, pattern conversion, API-change propagation, and terminal build/test failure explanation. Action kinds are closed: explanation actions cannot return file changes, problem scans cannot return mutations, and change actions must return a Guarded ChangeSet.
EditorContextEnvelope contains:
- active file, document version, selection, and cursor symbol;
- current diagnostics and Git hunks;
- related symbols, callers, and callees from repository code context;
- recent agent changes and selected terminal failure;
- applicable
AGENTS.mdfiles; - explicitly mentioned files and bounded folder listings;
- provenance and content hashes for every context category.
.aiignore is enforced before content enters the envelope. Provider-bound
messages pass through the existing outbound secret/PII policy. Source payloads
are not written to application logs. The preview returns a digest of the exact
envelope; execution is rejected if Git hunks, attachments, instructions, graph
evidence, or other context changed before the user starts the action.
Git AI
Git actions are also explicit. The service supports self-review, commit-message
generation, commit explanation, PR title/description generation, incoming PR
summaries, merge-conflict proposals, and post-resolution review. Review and
security findings enter Problems; conflict resolutions enter Guarded
ChangeSets. Commit references are resolved to a verified commit SHA before
git show; option-like input is never passed through as a revision. Only
conflict-resolution actions may emit file proposals, and every existing target
is bound to the working-file hash captured in the reviewed conflict evidence.
Search Everywhere
The command palette merges local actions/settings/agents with asynchronous repository results for files, folders, symbols, text/code, Git branches and commits, Problems, skills, workflows, and recent files. Caller-shaped natural language queries are routed to code graph traversal; known navigation phrases can route directly to the corresponding action.