Skip to main content

culture-library

Culture's library of your own content and media: recordings, books, newspapers, articles, EPUBs, PDFs, docs and more. One catalog to ingest, index, search and serve it all, published at library.culture.dev.

culture-library is an AgentCulture mesh agent: a Python package with an agent-first CLI, a mesh identity, and the canonical skill kit.

Status

Built, not yet deployed. The library is in culture_library/. It has:

  • a storage and ingest core;
  • an HTTP API compatible with xteink's;
  • search;
  • repo documents;
  • send to device;
  • OPDS and WebDAV;
  • an MCP server for agents;
  • the site.

It was specified and built with devague: spec in docs/specs/, plan in docs/plans/, the run's record in docs/deliveries/. Deploy files are in deploy/, and runbooks in docs/operations/. Deploying and provisioning library.culture.dev are still to do (see Roadmap).

What's here today

  • An agent-first CLI cited from teken (afi-cli). The runtime package has no third-party dependencies.
  • A mesh identity: culture.yaml (suffix: culture-library, backend: claude) plus the matching resident prompt file, CLAUDE.md.
  • Four harness prompt files, one per agent harness (see Prompt files by harness).
  • The guildmaster skill kit under .claude/skills/, vendored cite-don't-import. See docs/skill-sources.md.
  • A build + deploy baseline: pytest, lint, the agent-first rubric gate, a per-harness smoke check, and PyPI Trusted Publishing in GitHub Actions.

RAG and evals

Agents can fetch citable passages, not just titles. POST /api/rag/retrieve (also the MCP rag_retrieve tool) takes a query and returns ranked passages with item_id, chunk_no, chunk_sha, full text and scores, optionally reranked. Before this, search (core/search.py Hit) was item-level with a 200-char snippet, and docs/evidence/t7-embedding-cost.md measured embedding cost but not retrieval quality (issue #7 compares embedders).

The eval verbs measure retrieval with RAGAS context precision and recall, stored in the library so runs compare across modes and embedders:

uv sync --extra eval                          # ragas lives in the [eval] extra only
uv run culture-library eval generate ITEM_ID  # a book's own text, or a newspaper's sources sidecar
uv run culture-library eval run SET_ID --mode hybrid --k 5
uv run culture-library eval show --set SET_ID

Newspaper sets use the sources sidecar at PUT /api/library/{id}/sources. Eval sets and runs live behind /api/eval/sets and /api/eval/runs. The judge is an OpenAI-compatible endpoint (default: the local lobes gateway); text from non-public items is never sent to a non-local judge. Install culture-library[eval] to use it; the base package and the server image do not include it.

Planned, not done: embeddings are not yet enabled on the live library (see "Enable embeddings" in docs/operations/deploy.md), and the baseline eval runs have not been recorded.

Quickstart

uv sync
uv run pytest -n auto                 # run the test suite
uv run culture-library whoami         # identity from culture.yaml
uv run culture-library learn          # self-teaching prompt (add --json)
uv run culture-library doctor         # agent-identity invariants
uv run teken cli doctor . --strict    # the agent-first rubric gate CI runs

CLI

Verb What it does
whoami Report this agent's nick, version, backend, and model from culture.yaml.
learn Print a structured self-teaching prompt.
explain <path> Markdown docs for any noun/verb path.
overview Read-only descriptive snapshot of the agent.
doctor Check the agent-identity invariants (prompt-file-present, backend-consistency).
cli overview Describe the CLI surface itself.

Every command supports --json. Results go to stdout, errors/diagnostics to stderr (never mixed). Exit codes: 0 success, 1 user error, 2 environment error, 3+ reserved. Library verbs (ingest, search, serve, …) will be added as new noun groups on the same contract.

Roadmap

  • Ingest: bring your own recordings, books, newspapers, articles, EPUBs, PDFs and docs into one catalog.
  • Index & search across everything in the catalog.
  • Serve the catalog, published at library.culture.dev.

The design is not settled yet. This list restates the project's goal; it does not describe a committed design.

Prompt files by harness

Four harnesses, four root files, no shared base — each file is read by exactly one harness:

Harness File(s)
Claude Code CLAUDE.md
Pi / associate AGENTS.override.md + .pi/SYSTEM.md
colleague AGENTS.colleague.md
Qwen Code QWEN.md

CLAUDE.md is the fullest write-up of the repo's conventions; read it first. AGENTS.override.md stops Pi inheriting CLAUDE.md, and .pi/SYSTEM.md gives Pi the non-coding associate identity (read/find/summarize only). There is intentionally no AGENTS.md at the root: it would shadow the Pi and colleague prompt cascades, and the CI smoke check fails if one appears.

Two selections, not one

  1. The interactive harness is whichever binary you run (claude, pi, colleague, qwen). All four are live over the same clone at once, and choosing one never requires editing a file. See docs/automation-contract.md.
  2. The mesh resident is the single backend in culture.yaml. It is what the Culture daemon starts and what steward doctor checks, and only guild harness use <name> changes it.

See docs/harness-selection.md for the full writeup.

Development

  • Every PR bumps the version (the version-bump skill updates pyproject.toml and CHANGELOG.md). The version-check CI job fails the PR otherwise.
  • Lint: black, isort, flake8 (line length 100), bandit, markdownlint, and scripts/scan-secrets.py. See CLAUDE.md for the exact commands.
  • Deploy: pushing to main publishes to PyPI via Trusted Publishing, and PRs publish a .devN build to TestPyPI (.github/workflows/publish.yml).

The gate section

culture.yaml carries a top-level gate section that declares how to set up and test this repo, so tooling (for example a PR-fixer that re-runs the checks before pushing) needs no per-repo knowledge:

gate:
  setup:
  - [uv, sync]
  test:
  - [uv, run, pytest, -n, auto]

setup and test are each a list of commands, and each command is an argv list (never a shell string), run in order from the repo root. The values are configuration only; no tool supplies a default. Culture's loader ignores unknown top-level keys, so the section is safe alongside agents.

License

Apache 2.0 — see LICENSE.

Metadata

Release files for culture-library 0.16.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for culture-library 0.16.3
File Size Uploaded Provenance
culture_library-0.16.3.tar.gz 6.7 MB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for culture-library 0.16.3
File Interpreter ABI Platform
culture_library-0.16.3-py3-none-any.whl Python 3 none any Details

Total release size: 7.0 MB

Release files / culture_library-0.16.3.tar.gz

Download URL culture_library-0.16.3.tar.gz
Size 6.7 MB
Tags Source
SHA-256 checksum
How to use checksums
906deef353eea936af9d73b66ca731f3041df160e2f1daa03492a53072138d47
BLAKE2b-256 checksum
How to use checksums
9b340bbf6603e47005ee9f81408ef78e0571184ee2b945b9307333a6f0d77759
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / culture_library-0.16.3-py3-none-any.whl

Download URL culture_library-0.16.3-py3-none-any.whl
Size 344.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
f52cd23d35040c2f50436ecabf358e16f6d386518d6ecc6949894b633467d399
BLAKE2b-256 checksum
How to use checksums
c28329cf68fc0ad5a72e2a4e27e8a3e2e122cc3e89a7702ff15f31c0eeb369bb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Security for culture-library 0.16.3

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page