Reference
Three-repository audit
Recorded 2026-11-01.
Dev Guru (product and presentation), Ananke Plexus (harness and compute) and Dex Trove (reusable capability memory) are being built as three repositories. Before writing contracts, the plan requires recording what the existing code really exposes: pinned commits, interfaces, baseline tests, dependency direction and gaps. This page is that record. The planned names in the design bundle are targets; everything below was read from source or observed by running it.
How the three fit together
- Ananke is the only harness. Dev Guru calls Ananke through one client port and never analyses code itself. Dex never imports Ananke or Dev Guru to publish or browse its catalog.
- Dev Guru starts on Ananke’s existing Python facade (
ananke.plexus.api.Ananke) over anin-processtransport. It negotiates the supported range explicitly (ananke-plexus>=0.3.12,<0.4since Dev Guru 0.1.0), plus the specific capabilities it calls. An isolated-process transport and a local gateway come later. Exactly one transport is used per run, and failures are reported, never retried on another transport. - The capability source port maps onto Ananke’s registry: learn, importers, sources, resolver and lockfile. It does not become a second authority. The registry stays the record of identity, versions, digests, trust and locks.
- Dex stays optional everywhere. Ananke reaches Dex only through the
ananke.trovesentry point and the optional[dex]extra. Dev Guru declaresdexas an optional extra and never importsdex_trovein its core (tested).
Pinned revisions
| Repository | Revision audited | Python | Baseline at audit |
|---|---|---|---|
| Ananke Plexus | v0.3.11 · a7391347776e7c336f2cb9a76117a623645b1204 | >=3.11 (CI 3.11 to 3.14) | 1,821 unit tests pass (1 skipped); acceptance 83 pass, 1 recorded known issue (CONDITIONAL); distribution scan PASS |
| Dex Trove | v0.1.6 · 05cb07c2d19e61f995ae64154a65077195a71c11 | >=3.11 | 50 unit tests; acceptance PROMOTE (36 scenarios, with site journeys) |
| Dev Guru | new: f378dd3 (initial commit) → scaffold in this change | >=3.11 | 23 unit tests; acceptance PROMOTE (dev and built wheel, Dex absent) |
Neither ananke-plexus nor dex-trove ships a py.typed marker, so type checkers treat them as untyped. Dev Guru’s
mypy follows them explicitly for now; adding py.typed to Ananke is a small follow-up.
What Ananke exposes today
Facade (ananke.plexus.api.Ananke)
Ananke.open(repository_root) returns a facade whose methods return
CommandResult(ok: bool, summary: str, details: dict[str, Any]). The groups relevant to Dev Guru:
| Area | Methods | Notes |
|---|---|---|
| Graph | graph_build(), graph_query(needle), graph_impact(changed_files), graph_export(fmt) | graph_build persists .ananke/graph/metadata.json and returns its path |
| Specs and BMAD | create_spec(...), plan, tasks, lock, validate, diff, converge, verify | spec lifecycle, gates |
| Architecture | arch_init/validate/diff/reconcile/render | CALM |
| Runs | run_start(spec_id), run_status(run_id), run_cancel, run_replay | run state is JSON under .ananke/runs/<id>/ |
| Registry | .registry → Registry | see below |
| Lifecycle | branches, issues, PRs, worktrees, Confluence, telemetry, evidence | SCM integrations |
details is an untyped dict, so results are summaries rather than typed models. Dev Guru reads typed data
directly from the owning service. For example, graph_summary calls graph_build() and then
ananke.plexus.graph.service.load_graph, which returns a GraphSnapshot.
Graph model (ananke.plexus.graph.models)
GraphSnapshot(snapshot_id, provider, nodes: list[GraphNode], edges: list[GraphEdge]).
GraphNode(node_id, kind, name, path, provider, metadata).GraphEdge(source, target, kind, origin, provider, confidence, source_location, snapshot_id).
origin is one of extracted | inferred | ambiguous | declared. Providers: native, plus optional graphifyy and
code-review-graph adapters behind the GraphProvider protocol (build, impact).
At the audit, the native provider kept only top-level functions and classes, with owns and imports edges:
no call edges, methods or notebooks. 0.3.12 adds methods, line, doc and signature metadata, and inferred
calls and inherits edges (see Code graph). snapshot_id is still a UTC timestamp, so
two builds of the same code differ. Dev Guru’s report manifest uses a content digest instead.
Registry (ananke.plexus.registry)
- Artifact kinds:
skill, agent, tool, workflow, evaluator, prompt, policy, bundle, runtime-profile. There is noinstructionkind; Dex maps instructions toprompt. - Lifecycle
active | deprecated | yanked | quarantined | archived; trustunknown | discovered | verified | approved | restricted | quarantined. - Immutable versions in a content-addressed store, with digests, signatures (ed25519), channels, aliases and
revisions.
register,promote,yank,deprecate,quarantine,set_trustandalias_setare onRegistry. - Resolution:
Resolverwithlocked,highest-compatible,highest-approved,lowest-compatible,stable-onlyandexactmodes. Lockfile entries areLockEntry(id, version, digest, source, kind, dependencies, ...), checked byverify_lock. - Sources: federation priority
project → user → enterprise → public. Remote sources are pull-only, and pulled versions arrive asdiscovered(trust is never inherited). - Ingestion:
learn(registry, source)through importers (filesystem,framework,manifest,mcp,python_pkg,registry,rust_crate,vcs_archive), with a secret scanner and permission review. Installed libraries plug in through theananke.trovesentry point, selected per project by[troves.<name>].
Execution, events and evidence
execution.plan.ExecutionPlan/ExecutionStepwith approvals, checkpoints (save/load/resume_from_checkpoint), compensation and a scheduler (run_plan, with concurrent steps).workflows.Workflow/WorkflowStepare project-authored argv steps with their own runner, a second, simpler workflow notion.events.Event(event_id, event_type, run_id, timestamp, actor, payload, correlation_id, causation_id)goes over an in-processEventBus. Events have no sequence number and no persisted, replayable log.- Evidence bundles, SARIF output and retention (
evidence/). - Interfaces: the
anankeCLI (166 commands),apm, and an MCP server speaking JSON-RPC 2.0. - Plugins: entry-point groups
ananke.graph,ananke.backend,ananke.spec_provider,ananke.gateandananke.lifecycle.
What Dex Trove exposes today
- CLI
dex:sources,learn,validate,list,search,show,install,license,notices,catalog,ananke sync,docs export. This change addsfacets list|show|build|doc, facetedsearchand Claude-safeinstall. - Data:
trove/catalog.json(every item’sdex.json),EXCLUDED.json,trove.lock.json, per-itemananke.yaml. This change addstrove/facets.json. Items keep upstream bytes verbatim, with acontent_hashand a SemVerversion. - Integration: the
ananke.trovesentry point (dex_trove.paths:trove_root) anddex ananke sync, which stages items and runsananke registry learn. - Dependency direction: Dex imports Ananke in one place only.
dex validateoptionally imports Ananke’sArtifactManifestfor its strongest manifest check, and skips it when Ananke is absent. Catalog browsing and publishing don’t need Ananke.
Dependency direction (verified)
flowchart LR DG[Dev Guru] -->|in-process facade, version-negotiated| AN[Ananke Plexus] DEX[Dex Trove] -.->|ananke.troves entry point, optional extra| AN DG -.->|optional extra, never imported by the core| DEX
- Ananke never imports Dev Guru or Dex (Dex is found only through the entry point).
- Dev Guru’s tests assert that
dex_troveis never imported and that no Node runtime is needed. - Dev Guru’s acceptance suite runs from a built wheel in an environment without Dex.
Reuse map: planned task → existing code → gap
| Backlog task | Reuse | Gap to close |
|---|---|---|
AN-SOURCE-PORT | registry.sources (federation), registry.learn + importers.filesystem (the local-directory provider), registry.troves | A source-neutral provider protocol: discover / resolve / fetch / refresh / publish with stable descriptors. Troves assume Dex’s catalog.json shape. |
AN-INTERNAL-SKILLS | importers.filesystem imports plain SKILL.md folders; learn’s secret scanner and permission review | The sidecar format from the plan (source namespace, relative path, digest, declared requirements); explicit “unknown” metadata |
AN-CAPABILITY-LOCKS | lockfile.LockEntry (id, version, digest, source), verify_lock, ResolutionMode.LOCKED | Lock entries keyed by source-id + namespace + id, so two sources’ same-named skills stay distinct; source defaults to local-registry today |
AN-APP-FACADE | api.Ananke (above) | A typed, versioned facade: capability listing for negotiation and typed results instead of details: dict |
AN-RUN-EVENTS | events.Event, EventBus, execution.state, checkpoints | Idempotent submission, a sequence-numbered persisted event log, and a resumable stream |
AN-EXTERNAL-RENDERER | entry-point discovery in plugins.discovery | A generic artifact-producer group and contract (input digest in, artifact + digest out), recorded as evidence |
ASM-A03 (compiler) | ExecutionPlan, scheduler.run_plan | One workflow notion: workflows.Workflow and ExecutionPlan overlap |
Deterministic reports (DG-OFFLINE-HTML) | GraphSnapshot | A content-derived snapshot_id (or a separate digest) so identical input gives an identical report manifest |
| Graph breadth (Phase 4) | native provider, graphifyy and code-review-graph adapters | Partly closed in 0.3.12: methods, symbol metadata, and inferred calls/inherits edges. Still open: notebooks, runtime traces, data lineage |
DEX-MEMORY-RELEASES | per-item version + content_hash, trove.lock.json, git history | Release receipts, deprecation metadata, v1 and v2 of an item side by side (today the trove holds only the latest) |
ASM-D01 to ASM-D05 | done in Dex 0.2.0: taxonomy, facet sidecar, faceted search, site filters, education docs | Taxonomy landing pages and typed related edges (ASM-D06) |
Dev Guru scaffold (DG-PACKAGE)
The repository is Neo-Pragnya/Dev-Guru. Package dev-guru, module
dev_guru and command dev are provisional; the names are free on PyPI and TestPyPI, and nothing is reserved.
dev_guru.client: the port (AnankeClientprotocol,HarnessInfo,GraphSummary),connect(transport)and thein-processadapter. Negotiation checks the installed version against the supported range and probes six capabilities, two of them required (graph.build,graph.load).dev_guru.errors.GuruErrorwith stable codes:HARNESS_MISSING,HARNESS_INCOMPATIBLE,CAPABILITY_MISSING,UNSUPPORTED_TRANSPORT,WORKSPACE_INVALIDandHARNESS_FAILED.dev doctor [--json]reports the harness.graph_summary(workspace)runs real Ananke analysis; the tests use a fixture project, not a mock.- The same tooling as Ananke and Dex: uv + hatchling, ruff, strict mypy, pytest, the capability-acceptance harness
(byte-identical),
scripts/scan_dist.py(byte-identical), and CI pinned to the same action SHAs.
Next, in backlog order: AN-SOURCE-PORT → AN-INTERNAL-SKILLS → AN-CAPABILITY-LOCKS → AN-APP-FACADE,
then DG-CLIENT → DG-VIEW-MODELS → DG-CLI-SDK → DG-OFFLINE-HTML. That leads to the Dex-free acceptance
path: an internal skill, a lock, a graph run and an offline HTML report.