A versioned standard for a typed scientific claim bound to the evidence that grounds it.
Indicium is a small, standalone, versioned standard for a typed scientific claim bound to the evidence that grounds it. One LinkML source of truth generates pydantic models, JSON Schema, SHACL shapes and OWL. It reuses community ontologies rather than reinventing them:
| Axis | Standard |
|---|---|
| Evidence type | ECO (Evidence & Conclusion Ontology) |
| Claim to citation relation | CiTO |
| Source and document type | DoCO and IAO |
| Article type | FaBiO |
| Assertion and evidence structure | SEPIO |
| Provenance | PROV-O |
| Claim structure | Bucur et al. 5-slot SuperPattern (K-CAP 2021) |
The one thing Indicium mints is the binding: a claim, its typed evidence, and the source that evidence points to, provenance-stamped. That binding is the load-bearing contribution. The claim structure is borrowed from Bucur; the value Indicium standardizes is the typed grounding of claims in evidence.
Indicium is a vocabulary and a standard, not a tool and not a store. Every tool that mints claims imports it, so a claim minted by any of them is structurally identical to one minted by another, merges with it, and never travels without its evidence trace.
| Part | Where |
|---|---|
| LinkML schema, the source of truth | src/indicium/schema/indicium.yaml |
Pydantic models (Claim, Evidence, Source, CitationLink, ClaimLink, IndiciumDocument, ...) |
indicium.generated.model, re-exported from indicium |
| SHACL shapes, OWL ontology, JSON Schema | src/indicium/generated/, copied to docs/schema-assets/; the published SHACL file adds the supplemental shapes of src/indicium/augmentation/ |
| JSON-LD context | src/indicium/schema/context.jsonld |
| SHACL validation | indicium.validate_graph |
| Quote verification kernel | indicium.verify_quote |
| Projections to ASB task cards, ASTRA and KGmemory | indicium.adapters, indicium.astra_bridge |
Indicium (Latin) is "a sign or mark that points to the truth"; in law, the evidentiary indication. The package is named for what it standardizes: every claim carries its indicia, the traces that justify believing it.
indicium(singular) is the standard and this package.- indicia (plural) is the body of evidence attached to a claim, and the term consumer APIs use for the produced collection.
Requires Python 3.11 or newer.
pip install indicium-standard # distribution name
python -c "import indicium" # import nameOptional extras:
pip install "indicium-standard[astra]" # ASTRA bridge (PyYAML)
pip install "indicium-standard[codegen]" # regenerate the artefacts from the LinkML sourceThe 2.0.0 upload to PyPI is pending (RELEASING.md). Until
pip install indicium-standard finds it, install from the repository:
pip install "git+https://github.com/HolobiomicsLab/indicium"The distribution is
indicium-standard; the import package isindicium. The PyPI nameindiciumbelongs to an unrelated, abandoned key-value-store package that also ships a top-levelindiciummodule. Installing both into the same environment will clobber the import. Always depend onindicium-standard.
Validate a claim against the SHACL shapes (adapted from tests/test_validate.py):
import rdflib
from indicium import ASB_BASE, validate_graph
claim = f"""
@prefix asb: <{ASB_BASE}> .
<urn:claim:1> a asb:Claim ;
asb:context "in vitro" ;
asb:subject "compound A" ;
asb:qualifier "inhibits" ;
asb:relation "inhibits growth of" ;
asb:object "cell line B" .
"""
conforms, report = validate_graph(rdflib.Graph().parse(data=claim, format="turtle"))
print(conforms) # True
incomplete = f"""
@prefix asb: <{ASB_BASE}> .
<urn:claim:2> a asb:Claim ; asb:context "in vitro" .
"""
conforms, report = validate_graph(rdflib.Graph().parse(data=incomplete, format="turtle"))
print(conforms) # Falsereport names each missing slot. The quickstart continues with
the typed model and the adapters; every Python example in this README and on the Home,
Quickstart and URI scheme pages runs in the test suite (tests/test_docs_examples.py).
Import the namespace bases; never copy the IRI string into your own code. A
hardcoded base keeps pointing at the old namespace when the standard moves, and
the SHACL shapes then match nothing: every graph validates as conforms=True
while no constraint is actually checked.
from indicium import ASB_BASE, INDICIUM_BASE, asb_term
asb_term("Claim") # 'https://w3id.org/asb#Claim'ASB = "https://w3id.org/asb#" # don't: silently dead after a move| Prefix | Namespace | Names | Resolves (measured 2026-10-30) |
|---|---|---|---|
asb: |
https://w3id.org/asb# |
asb:Claim and its SuperPattern slots (context, subject, qualifier, relation, object), plus domainQualifier, sourceTaskKind and workflowCoupling |
Yes. Registered on w3id.org on 29 October 2026; 303 to holobiomicslab.eu/ns/asb, which serves Turtle, JSON-LD and HTML |
asbval: |
https://w3id.org/asb/validation# |
Validation assertion terms used beside asb: by ASB |
Yes. Same registration; 303 to holobiomicslab.eu/ns/asbval |
indicium: |
https://w3id.org/indicium/ |
The schema id, the JSON-LD context prefix, and every class and slot without its own IRI binding: claim metadata, the evidence and source slots, ClaimLink, CitationLink, IndiciumDocument |
No (404). Not registered yet; the request files are in docs/release/w3id-indicium/ |
docs/uri-scheme.md has the redirect chains, the identifier
conventions for claims and evidence, and what the /indicium registration will point
at. tests/test_namespace_resolves.py fetches each namespace when
INDICIUM_NETWORK_TESTS=1 is set.
Indicium is the shared layer; the projects below mint, store or consume its claims.
| Project | What it is | Relation to Indicium |
|---|---|---|
| ASTRA | A declarative YAML format for scientific analyses: inputs, outputs, decisions and evidence (astra-spec) | indicium.astra_bridge turns claims into ASTRA insights and reads ASTRA findings back as claims |
| AgenticScienceBuilder (ASB) | Distils research articles into agent skills, task cards and capsules | Depends on indicium-standard>=2.0.0,<3; its claims use the asb: vocabulary |
| asb-skill-collections | Registry and release tooling of the ASB skill collections | The v1 trees carry Indicium documents written before 2.0.0 (earlier asb: base, not 2.0.0-conformant); later versions will carry 2.0.0 documents |
asb-skills-<domain> |
The skill collections, one repository per domain | Built by ASB; same vocabulary |
| Perspicacité | Local-first retrieval-augmented system for searching and organizing the scientific literature | Uses the Indicium stack, when installed, for claim validation, the claim graph and the ASTRA export |
| Scriptorium | Manuscript authoring | Depends on indicium-standard>=2.0.0,<3 and the adapters |
| KGmemory | Where claims are stored and reasoned over | indicium.adapters.kgmemory emits a JSON-LD node typed mem:SemanticMemory |
indicium-adapters |
The DomainAdapter and SHACLProvider protocols and entry-point discovery |
Domain shapes reach validate_graph(..., extra_shapes=...) |
indicium-adapters-<domain> |
Domain bundles: agentic-ai, astronomy, epigenomics, genomics, metabarcoding, metabolomics, metagenomics, multi-omics, proteomics, transcriptomics | Ontology terms and SHACL shapes per domain |
AgenticScienceBuilder, Scriptorium, KGmemory, the asb-skills-<domain> collections
and the indicium-adapters family are not public yet.
uv sync --frozen --extra codegen --extra docs
uv run pytest -q # includes the conformance suite (parity with the Scriptorium SHACL)
make lint # ruff over src/ and scripts/
make gen # regenerate model.py, shapes.ttl, ontology.ttl, schema.json
make context # regenerate the packaged JSON-LD context from the LinkML URI bindings
make schema-assets # make gen and make context, then copy the artefacts and the changelog into docs/
uv run mkdocs build --strict # the documentation site, as docs.yml deploys itdocs/changelog.md is a copy of CHANGELOG.md (make docs-changelog); edit only the
latter. make gen writes canonical Turtle, so a second run is byte-identical to the
committed files; release.yml fails when it is not.
Namespace bases are stable identifiers. Their registration and the vocabulary site are prepared separately from the Python release; they do not provide an instance store. Read the URI scheme and the SEPIO compatibility notes before exporting RDF.
Indicium follows Semantic Versioning, read for a vocabulary:
- Term IRIs are immutable after a tagged release. Published data embeds them.
- Additive changes are minor: a new class, slot or enum value.
- An IRI change or a slot removal is major, as is a tighter cardinality. This is
why the move of the
asb:base tohttps://w3id.org/asb#is 2.0.0.
A tag v<version> that matches pyproject.toml and a dated CHANGELOG.md section
runs the release (.github/workflows/release.yml): the checks, tests, documentation
build and installed-wheel check first, then the upload of the wheel and the sdist to
PyPI through Trusted Publishing, then the GitHub release with the same files and the
three schema artefacts.
RELEASING.md is the maintainer checklist. Changes are listed in
CHANGELOG.md.
CITATION.cff holds the citation metadata, which GitHub offers as
"Cite this repository". No DOI exists yet. BibTeX, derived from that file with
cffconvert -f bibtex (citation key renamed):
@misc{nothias_indicium,
author = {Nothias, Louis-Félix},
title = {Indicium: a standard for typed scientific claims bound to their evidence},
url = {https://github.com/HolobiomicsLab/indicium}
}MIT, see LICENSE. Developed at the Holobiomics Lab, CNRS / Université Côte d'Azur.