Catalog PyPI
Back to packageRELEASE DETAILS

0.2.3

PyPI

agience-chorus

Agience Chorus — the tekton standard library: operators by domain, and the host that serves them.

agiencechorusmcpoperatororganonpersonatekton
Published12 Oct 2026
Direct dependencies21
Transitive dependenciesNot calculated

README

Version 0.2.3 documentation

Agience Chorus

License Python Protocol Sponsor

Operators, by domain. Chorus is the tekton standard library: seven MCP services, each holding the operators of one domain, served from one host or deployed one at a time.

A tekton is a chorus member — a condensor whose tools are organons, invoked by condensation. Each declares a module-level PERSONA in its own server.py, and src/agience_chorus/personas.py discovers them and hands the roster to the host:

tektondomainmount
ariaPresentation & Interface/aria/mcp
astraIngestion & Indexing/astra/mcp
sageResearch & Retrieval/sage/mcp
irisRouting & Communication/iris/mcp
ophanEconomic Operations/ophan/mcp
seraphSecurity & Governance/seraph/mcp
lumenWisdom & Inference/lumen/mcp

Tektons are reached over the wire — HTTP and MCP — and are independently deployable, so an operator runs only the ones they need. Each constructs its own server auth and signs with its own identity, and no tekton imports another.

Running it

pip install agience-chorus                  # every tekton
pip install "agience-chorus[iris,seraph]"   # only what those two need
python -m agience_chorus.server             # every tekton on one process, :8082

MCP_HOST (default 0.0.0.0), MCP_PORT (default 8082) and LOG_LEVEL (default INFO) configure the host. uvicorn agience_chorus.server:app resolves too — the app is built at import time. CHORUS_CRYSTALS=aria,seraph boots a node holding a subset.

The import name is agience_chorus, and the tektons are subpackages of it — agience_chorus.aria, .astra, .iris, .lumen, .ophan, .sage, .seraph.

The extras select dependencies, not modules. agience-chorus[ophan] installs all seven tektons and adds Stripe; Python has no mechanism for an extra to exclude code. What it saves is real, all the same: a node running only iris and seraph otherwise installs Stripe, HuggingFace datasets, pypdf, sympy and numpy to run none of them. Whether an operator may discharge is still the capability gate's answer, not the installer's.

For a checkout, pip install -e ".[all,dev]" — which is what requirements.txt resolves to.

Running the tests

pytest -q src tests --rootdir=src

Both paths, and --rootdir=src, are load-bearing. Each tekton carries its own pyproject.toml, so without the flag pytest picks one of them as the rootdir and src/conftest.py — which wires the organons — never loads; the symptom is a phantom _op_retrieve is None rather than an error naming the cause.

pytest tests/ on its own does not work, and the way it fails is misleading: it stops at a collection error on import seraph.server, which reads like a broken test. The import is correct (seraph is its own distribution, agience-server-seraph); what is missing is the environment the invocation above sets up. Verified 2026-09-16 — under the full command that file collects and its twenty tests pass. Reach for the whole command before concluding anything from a subset that fails.

The bundles

src/agience_chorus/bundles/ holds the operator payloads, one JSON per group, built from the sources named in src/agience_chorus/seraph/bundle_spec.json. Each carries a sha256 that the mesh publishes.

They live inside the package so the wheel carries them: the runtime executes the payload, so an installed chorus without them could not discharge an operator at all.

The runtime reads the payload, not the source file. An edit to a tekton that is not rebuilt has no effect, and the published sha then disagrees with the tree. src/tests/test_bundles_match_source.py fails when they drift.

Layout

pathwhat it is
src/agience_chorus/<tekton>/server.pyone deployable tekton service, with its own manifest.py, tests/ and ui/
src/agience_chorus/<tekton>/ui/<top>/<sub>/type.jsonthe content types that tekton owns; it registers them with the gateway at host startup
src/agience_chorus/server.pythe unified host, mounting every tekton on one process
src/agience_chorus/​_chorus_identity.py · _persona.py · _host_seams.pythe identity, artifact and host-seam helpers tektons load at runtime
src/agience_chorus/​reach_host.py · reach_wiring.py · reading_junction.pythe reach surfaces shared across tektons
src/agience_chorus/personas.pytekton discovery and host binding: module loading, service-identity boot, and the roster the host consumes
src/agience_chorus/​corpus_fts.py · corpus_stats.py · live_service.pythe corpus and live-service surfaces shared across tektons
src/conftest.py · src/tests/the test process's environment, and the cross-tekton suite — outside the package, so neither ships
tests/the repo-level invariants, one file per property: that every persona transport verifies its caller, that no persona shells out, that the runtime data a node reads is declared package-data, and that the Facet source tree stays out of the distribution. Each names the incident it exists for
pyproject.tomlthe distribution: dependencies, per-tekton extras, and what goes in the wheel

Model-free

A tekton's answer path is grounded operators over the artifact graph, so nothing imports a judgement made elsewhere that a caller cannot re-derive. Reaching a model stays legitimate as a deliberate act through a tekton that offers it, where the call is explicit and the provenance records who chose it. resolve_llm_credentials in src/agience_chorus/seraph/server.py raises and names the rule in the @mcp.tool description a caller reads.

Security issues: email connect@agience.ai rather than opening a public issue.

Dual-licensed — see LICENSE, COMMERCIAL_LICENSE.md, NOTICE and CLA.md.

Declaration of generative AI use

The author used Anthropic's Claude Opus (versions 4.8, 5, and 5.5) in the preparation of this work. Its contribution was to write code, and to generate and validate content. The ideas, the construction and the claims are the author's. No other generative AI tool was used. The author reviewed and edited all output and takes full responsibility for the content of this publication.

Downloads & popularity

Awaiting observations

No metric observations yet

Download counts and popularity will appear here as the collector receives them.

Declared dependencies 23

Native requirements
21 direct targetsNot calculated transitive count
Package / targetRequirementRelationship
mcp
Environment
{
  "extras": "cli",
  "marker": null,
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
mcp[cli]<2,>=1.6.0runtime
httpx
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
httpx>=0.27runtime
fastapi
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
fastapi>=0.115runtime
starlette
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
starlette>=0.37runtime
uvicorn
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
uvicorn>=0.30runtime
cryptography
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
cryptography>=42.0runtime
python-jose
Environment
{
  "extras": "cryptography",
  "marker": null,
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
python-jose[cryptography]>=3.3runtime
pydantic
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
pydantic>=2.0runtime
agience-prism
Environment
{
  "extras": "trust,wire",
  "marker": null,
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
agience-prism[trust,wire]>=0.1.4runtime
agience-crystal
Environment
{
  "extras": "ontology,service",
  "marker": null,
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
agience-crystal[ontology,service]>=0.1.0runtime
agience-mantle
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
agience-mantle>=0.1.3runtime
pypdf
Environment
{
  "extras": "",
  "marker": "extra == \"astra\"",
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
pypdf>=5.0; extra == "astra"runtime
numpy
Environment
{
  "extras": "",
  "marker": "extra == \"astra\"",
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
numpy>=1.24; extra == "astra"runtime
datasets
Environment
{
  "extras": "",
  "marker": "extra == \"astra\"",
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
datasets>=2.14; extra == "astra"runtime
numpy
Environment
{
  "extras": "",
  "marker": "extra == \"lumen\"",
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
numpy>=1.24; extra == "lumen"runtime
sympy
Environment
{
  "extras": "",
  "marker": "extra == \"lumen\"",
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
sympy>=1.12; extra == "lumen"runtime
sympy
Environment
{
  "extras": "",
  "marker": "extra == \"sage\"",
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
sympy>=1.12; extra == "sage"runtime
stripe
Environment
{
  "extras": "",
  "marker": "extra == \"ophan\"",
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
stripe>=9.0; extra == "ophan"runtime
agience-chorus
Environment
{
  "extras": "aria,astra,iris,lumen,ophan,sage,seraph",
  "marker": "extra == \"all\"",
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
agience-chorus[aria,astra,iris,lumen,ophan,sage,seraph]; extra == "all"runtime
pytest
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
pytest>=8; extra == "dev"runtime
pytest-asyncio
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
pytest-asyncio>=0.23; extra == "dev"runtime
pytest-timeout
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
pytest-timeout>=2.2; extra == "dev"runtime
build
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.11",
  "evaluation": "NOT_EVALUATED"
}
build>=1.0; extra == "dev"runtime

Distribution files

2 collected
agience_chorus-0.2.3-py3-none-any.whl

bdist_wheel · 985.6 KB · Python py3

Source file
agience_chorus-0.2.3.tar.gz

sdist · 881.46 KB · Python source

Source file

Repository

PENDING
agience/agience-chorus

Shared repository data · GitHub

License detected in repository
Not collected

Metadata history

Meaningful changes
Current collected state Current

Observed since 21 Oct, 09:04 UTC

No superseded metadata states collected. Unchanged observations do not create new revisions.

Record identity

package_version:da8caca146119e58a31ed8fc15b2acef3dcbe89ef867e5f72a2e42f59cfde7a4

Other collected versions

View all collected versions →