Appearance
Package lifecycle integration
Omega Lisp packages and Matrix-3 packages have separate manifests: manifest.json (Omega) vs matrix.json (Matrix). They cover different concerns, but the metadata model is parallel — once you know one, you can read the other.
Side-by-side: a Lisp package vs a Matrix package
Omega package — packages/agents/
json
// manifest.json
{
"name": "agents",
"version": "0.1.0",
"description": "Agent delegation with amb-based selection",
"entry": "lib/agents.lisp",
"exports": ["agents"],
"effects": ["agent.spawn.op", "agent.run.op"],
"requires": []
}lisp
;; lib/agents.lisp
(define-package "agents"
:description "Agent delegation with amb-based selection"
:exports '(agents)
:effects '(agent.spawn.op agent.run.op)
:requires '()
:version "0.1.0"
)The two MUST stay in sync. The define-package form is the in-language declaration; manifest.json is the load-time metadata used by the package loader.
Matrix package — projects/matrix-3/packages/agents/
json
// matrix.json
{
"name": "@open-matrix/agents",
"version": "0.1.7",
"namespace": "system.agents",
"tier": 1,
"root": { "type": "AgentsRoot", "export": "AgentsRoot" },
"components": [
{ "type": "MemoryActor", "mount": "memory", "surface": "headless" },
{ "type": "EmbeddingService", "mount": "embeddings", "surface": "headless" }
],
"exports": ["memory", "embeddings"],
"storage": { "sqlite": { ... } },
"permissions": { "fsPolicy": "project-readwrite", ... }
}How the lifecycles compare
| Stage | Omega | Matrix |
|---|---|---|
| Build | pnpm --filter @omega/<name> build | pnpm --filter @open-matrix/<name> build |
| Install | (require '<name>) at REPL or in another package | matrix install <name> then matrix up <name> |
| Discover | :packages, :doc, :apropos | system.registry.list, system.catalog.search |
| Mount | implicit on require (binds exports into caller's env) | runtime mounts components at declared mounts via system.runtimes.start |
| Unmount | drop the binding | matrix down <runtime-id> or system.runtimes.stop |
Cross-package references
When an Omega Lisp package wants to invoke a Matrix actor (e.g. system.registry), the path is:
- The host Matrix actor for the Omega session knows the bus context.
- Omega's
(effect matrix.invoke.op target op payload)(via the wiredEffectBackend) callsRequestReply.execute. - The result is an Omega value the caller can use.
When a Matrix package wants to call an Omega routine, the path is:
- The Matrix actor invokes
system.agents$evalwith the source. - The session's
OmegaSandboxevaluates and returns.
Neither model imports the other's package directly. The bridge is always the bus or the sandbox.
Versioning
Omega packages use version in manifest.json and the :version keyword in define-package. Bumps are manual; there's no auto-published registry.
Matrix packages use version in matrix.json and package.json. The tier field (in matrix.json) is a separate organizing concept (tier: 1 for system actors).
See also
Source:
projects/omega-lisp/packages/agents/lib/agents.lisp(canonical Lisp manifest),projects/matrix-3/packages/agents/matrix.json(canonical Matrix manifest),projects/omega-lisp/src/core/modules/compileModule.ts(manifest consumer).