indicium-standard 2.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. indicium_standard-2.0.0/.gitignore +8 -0
  2. indicium_standard-2.0.0/CHANGELOG.md +320 -0
  3. indicium_standard-2.0.0/LICENSE +21 -0
  4. indicium_standard-2.0.0/PKG-INFO +268 -0
  5. indicium_standard-2.0.0/README.md +233 -0
  6. indicium_standard-2.0.0/pyproject.toml +85 -0
  7. indicium_standard-2.0.0/src/indicium/__init__.py +96 -0
  8. indicium_standard-2.0.0/src/indicium/adapters/__init__.py +0 -0
  9. indicium_standard-2.0.0/src/indicium/adapters/astra.py +44 -0
  10. indicium_standard-2.0.0/src/indicium/adapters/kgmemory.py +23 -0
  11. indicium_standard-2.0.0/src/indicium/adapters/scitask.py +56 -0
  12. indicium_standard-2.0.0/src/indicium/astra_bridge.py +242 -0
  13. indicium_standard-2.0.0/src/indicium/augmentation/__init__.py +0 -0
  14. indicium_standard-2.0.0/src/indicium/augmentation/alignment.ttl +11 -0
  15. indicium_standard-2.0.0/src/indicium/augmentation/supplemental-shapes.ttl +38 -0
  16. indicium_standard-2.0.0/src/indicium/generated/__init__.py +0 -0
  17. indicium_standard-2.0.0/src/indicium/generated/model.py +581 -0
  18. indicium_standard-2.0.0/src/indicium/generated/ontology.ttl +1970 -0
  19. indicium_standard-2.0.0/src/indicium/generated/schema.json +1251 -0
  20. indicium_standard-2.0.0/src/indicium/generated/shapes.ttl +651 -0
  21. indicium_standard-2.0.0/src/indicium/iri_bindings.py +234 -0
  22. indicium_standard-2.0.0/src/indicium/schema/context.jsonld +445 -0
  23. indicium_standard-2.0.0/src/indicium/schema/indicium.yaml +652 -0
  24. indicium_standard-2.0.0/src/indicium/validate.py +41 -0
  25. indicium_standard-2.0.0/src/indicium/verify.py +166 -0
@@ -0,0 +1,8 @@
1
+ .venv/
2
+ __pycache__/
3
+ *.pyc
4
+ .pytest_cache/
5
+ site/
6
+ dist/
7
+ .ruff_cache/
8
+ .wheel-env/
@@ -0,0 +1,320 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ---
9
+
10
+ ## 2.0.0 — 2026-11-01
11
+
12
+ First public release. These breaking changes landed *before* any Indicium package
13
+ release. Existing downstream records may still embed the earlier context.
14
+
15
+ ### Breaking
16
+ - **The `asb:` vocabulary base moved to `https://w3id.org/asb#`.** It had two
17
+ earlier bases. 1.x used `https://asb.holobiomics.org/ns/asb#`, a domain that was
18
+ never registered, so a third party could have taken it and served arbitrary
19
+ definitions for this standard's term IRIs. Indicium PR #4 (2026-06-14) then moved
20
+ it to `https://holobiomicslab.eu/ns/asb#`, and 2.0.0 settles on the permanent
21
+ w3id identifier. Every `asb:` term IRI therefore changes. The 2.0.0 SHACL shapes
22
+ target the w3id IRIs, so they do not recognise a claim typed with either earlier
23
+ base: such a claim goes unchecked instead of failing.
24
+ Released data carries the intermediate base: the 106 `indicium/*.jsonld` files of
25
+ the asb-skill-collections pre-release `metabolomics-v0.1.0` (2026-06-22) bind
26
+ `https://holobiomicslab.eu/ns/asb#` and do not validate against the 2.0.0 shapes.
27
+ To migrate such data, bind the `asb:` prefix of its JSON-LD context (or rewrite
28
+ its IRIs) to `https://w3id.org/asb#`; the local names are unchanged. Then validate
29
+ it with `indicium.validate_graph`. Consumers that bind the `asb:` prefix
30
+ themselves, notably the shape files in `indicium-adapters-metabolomics`, must be
31
+ updated in lockstep.
32
+ - **The distribution is renamed `indicium` → `indicium-standard`.** The import
33
+ package is unchanged: `import indicium` still works. The PyPI name `indicium` is
34
+ held by an unrelated, abandoned key-value-store package that also ships a
35
+ top-level `indicium` module; installing both into one environment clobbers the
36
+ import. Depend on `indicium-standard`, never on `indicium`.
37
+ - **Two SEPIO bindings are corrected before the namespace deposit.**
38
+ `supports_claim` now expands to `sepio:0000427` (`is_evidence_line_for`),
39
+ an evidence-line-to-claim relation, instead of the oppositely directed
40
+ `sepio:0000007`. Skill reliance `asserts` now expands to `indicium:asserts`,
41
+ declared in the LinkML schema, instead of `sepio:0000130` (`authored_by`).
42
+ JSON keys and the local `for_claim` predicate are unchanged. Refresh embedded
43
+ contexts and regenerate previously expanded RDF. Supporting, disputing or
44
+ inconclusive direction is a separate `sepio:0000183` annotation; the
45
+ historical `supports_claim` key alone does not establish that direction.
46
+
47
+ ### Added
48
+ - `LICENSE` (MIT). 1.x declared MIT in `pyproject.toml` but shipped no licence
49
+ text, so a wheel would have distributed MIT-claimed code without the required
50
+ notice.
51
+ - **`indicium.ASB_BASE`, `indicium.INDICIUM_BASE`, `indicium.asb_term()`** — the
52
+ vocabulary bases are now part of the public API, read from the generated model's
53
+ prefix map so they cannot drift from the SHACL shapes. Consumers that hardcoded
54
+ the IRI kept validating against a dead namespace after the base moved: the shapes
55
+ matched nothing and every graph reported `conforms=True`. Import these instead.
56
+ - `tests/test_namespace_base.py` — guards against reintroducing an unowned
57
+ namespace base, and pins the metadata lookup to the declared distribution name.
58
+ - A reproducible JSON-LD context generated from the schema, shipped in the
59
+ package and copied into the documentation site. OBO prefixes expand in JSON-LD
60
+ 1.1; property IRIs and enum meanings now agree with the SHACL shapes.
61
+ - Local release checks and a Trusted Publishing workflow with matching tag,
62
+ package version and dated changelog checks before publication.
63
+
64
+ ### Fixed
65
+ - **`__version__` reported the wrong version.** It queried `importlib.metadata`
66
+ for the distribution `indicium`, which after the rename resolves either to
67
+ nothing (falling back to `0.0.0+unknown`) or to the unrelated squatting PyPI
68
+ package, reporting *its* version as ours. It now queries `indicium-standard`.
69
+ The `wheel-smoke` CI job asserts the installed wheel reports the built version.
70
+ - `docs/changelog.md` is now generated from this file (`make docs-changelog`)
71
+ rather than hand-maintained. It had been frozen at 1.0.0 for twelve releases,
72
+ and `release.yml` extracts its release notes from it.
73
+ - Installation examples now consistently name `indicium-standard`, including
74
+ its optional extras. Schema generation works on Linux and macOS.
75
+ - The generated OWL ontology uses the namespace root `https://w3id.org/indicium` as
76
+ its document IRI and carries the version and the licence (`pav:version`,
77
+ `dct:license`), which the LinkML source now declares; the model and the JSON
78
+ Schema carry the version too. RDF serialization is deterministic for release verification.
79
+ - The published SHACL file, `docs/schema-assets/indicium.shapes.ttl` (a release
80
+ asset), now holds the supplemental shapes as well as the generated ones, so a
81
+ SHACL processor run on it agrees with `validate_graph`: before, it accepted a
82
+ claim with neither `qualifier` nor `domain_qualifier`.
83
+ - The sdist includes only package source, schema assets and release metadata;
84
+ internal development plans are excluded.
85
+ - The package metadata names its author, states the licence as the SPDX
86
+ expression `MIT` with `LICENSE` as its licence file (instead of the full text in
87
+ the License field), and lists Documentation and Issues URLs.
88
+ - SEPIO binding regression tests use an attributed excerpt of the ontology's
89
+ inverse, domain and range axioms. The documentation explains the target link,
90
+ separate evidence direction and the local reliance predicate.
91
+
92
+ ### Namespace registration
93
+ - Canonical bases remain `https://w3id.org/indicium/` and
94
+ `https://w3id.org/asb#`. The vocabulary deposit and redirects are prepared
95
+ separately; registration does not create a hosted store of claim instances.
96
+ - Prepared term redirects send HTML clients to
97
+ `https://holobiomicslab.eu/indicium/reference/<Name>/` and RDF clients to the
98
+ vocabulary representation under `/ns/indicium/`. The reference pages must be
99
+ live before the w3id registration is submitted.
100
+ - ASB validation assertions use `SEPIO_0000183` with `SEPIO_0000403`,
101
+ `SEPIO_0000404` or `SEPIO_0000405`, and `RO_0002558` with `ECO_0000501`.
102
+ These are external assertion annotations, not Indicium claim-status values.
103
+
104
+ ---
105
+
106
+ ## 1.12.0 — 2026-06-10
107
+ - New `SourceTaskKind` enum {reproduction, analysis, component_reconstruction, extension} + optional `Claim.source_task_kind` slot (`asb:sourceTaskKind`) — a claim-level reproducibility-provenance qualifier, sibling of `Evidence.workflow_coupling` (Suter et al. 2025) at claim↔source-task granularity. Canonical replacement for ASB's out-of-schema `asbext:source_task_kind`. Added to `context.jsonld` for portability. Additive, backward-compatible; SHACL non-closed.
108
+
109
+ ---
110
+
111
+ ## 1.11.0 — 2026-06-03
112
+ - New `SSSOMMapping` class (SSSOM term mapping) + `IndiciumDocument.sssom_mappings` collection, with a `derived_from` lineage slot (cthoyt 2026-05-29). Adds sssom/semapv/skos prefixes. Additive, backward-compatible.
113
+
114
+ ---
115
+
116
+ ## 1.10.0 — 2026-06-03
117
+ - Evidence gains optional `workflow_coupling` (`WorkflowCoupling` enum: tight/loose/ad_hoc/unknown) — a reproducibility qualifier per Suter et al. 2025 (DOI 10.1016/j.future.2025.107974). Additive, backward-compatible; SHACL non-closed.
118
+
119
+ ---
120
+
121
+ ## [1.9.0] - 2026-05-29
122
+
123
+ ### Added
124
+
125
+ - **`VerificationResult.char_span`** — a 5th, defaulted field
126
+ (`tuple[int, int] | None = None`) giving `(start, end)` offsets into the
127
+ matched candidate's *original* (un-normalized) text. Populated for verified
128
+ matches from the regex span; best-effort for repaired matches (the recovered
129
+ span is re-located in the original candidate, and may remain `None`). Lets
130
+ callers highlight or re-slice the exact source region without re-searching.
131
+ - **`verify_quote(..., punctuation_flexible=True)`** — an opt-in pass between
132
+ exact containment and LCS that matches the quote's alphanumeric tokens
133
+ (`[A-Za-z0-9]+(?:\.[A-Za-z0-9]+)*`) in order across arbitrary non-alphanumeric
134
+ padding, with per-token boundary guards. A hit is `verified` with `score = 1.0`
135
+ and a `char_span` spanning first-token-start → last-token-end. This recognises
136
+ a verbatim-modulo-punctuation quote (e.g. `P=0.001` ~ `P = 0.001,`) instead of
137
+ degrading it to a sub-threshold LCS, mirroring ASB `claim_ledger`'s
138
+ token-sequence matcher.
139
+
140
+ ### Why
141
+
142
+ Lets ASB `claim_ledger` and Perspicacité consume one shared verification kernel:
143
+ `char_span` carries the exact source offsets downstream, and the opt-in
144
+ punctuation-flexible pass matches numeric/statistical quotes whose punctuation
145
+ shifts between extraction and source. **Backward-compatible and additive only**:
146
+ both changes are defaulted off / defaulted `None`, existing thresholds and the 11
147
+ prior kernel tests are unchanged, and there are no changes to `generated/model.py`,
148
+ the SHACL shapes, or any enum.
149
+
150
+ ---
151
+
152
+ ## [1.8.0] - 2026-05-29
153
+
154
+ ### Added
155
+
156
+ - **`verify_quote` kernel** (`indicium.verify`, exported from the package root)
157
+ — a pure-Python, dependency-light, never-raises verifier that matches an
158
+ LLM-extracted quote against source passage texts. Returns
159
+ `VerificationResult(status, matched_index, quote_exact, score)` where status
160
+ is `verified` (whitespace-flexible, case-sensitive containment; recovers the
161
+ source's verbatim span, `score = 1.0`), `repaired` (no containment, but the
162
+ longest common substring vs the best candidate clears `near_threshold`,
163
+ default 0.9), or `unverified`. Structurally guarantees
164
+ `unverified ⇒ matched_index is None`; degenerate input (empty/whitespace
165
+ quote, empty candidates, or `None`/non-str entries) degrades safely instead
166
+ of raising.
167
+ - Exported `verify_quote` and `VerificationResult` from the package root.
168
+
169
+ ### Why
170
+
171
+ Lets downstream projects (Perspicacité R3, ASB) ground claim / parameter /
172
+ failure-mode quotes against original source text — verifying provenance and
173
+ catching paraphrase or hallucination — without depending on rdflib or the
174
+ generated model. **Additive only**: no changes to `generated/model.py`, the
175
+ SHACL shapes, or any enum.
176
+
177
+ ---
178
+
179
+ ## [1.7.0] - 2026-05-29
180
+
181
+ ### Added
182
+
183
+ - **`domain_qualifier` slot** (`slot_uri: asb:domainQualifier`) — an OPEN,
184
+ snake_case-patterned (`^[a-z][a-z0-9_]*$`) qualifier slot for domain-adapter
185
+ vocabularies (e.g. transcriptomics `aligned_with`,
186
+ `differentially_expressed_in`). This is the standard's side-channel for
187
+ domain extensions, mirroring how enrichment terms ride on
188
+ `asb:*_ontology_term`. The closed Bucur `SuperPatternQualifier` enum on
189
+ `asb:qualifier` is **unchanged** — domain terms never pollute it.
190
+ - **`QualifierPresenceShape`** (supplemental SHACL, `sh:or`) — a Claim must
191
+ carry at least one of `asb:qualifier` (closed Bucur SuperPattern) or
192
+ `asb:domainQualifier` (open domain extension).
193
+
194
+ ### Changed
195
+
196
+ - **`qualifier` slot is no longer `required` on its own.** A Claim previously
197
+ had to carry a core Bucur qualifier; it may now satisfy the "at least one
198
+ qualifier" rule via `domain_qualifier` instead. The closed enum and its
199
+ `maxCount 1` are retained; only the slot-level `minCount 1` moved to the
200
+ either-or `QualifierPresenceShape`.
201
+
202
+ ### Why
203
+
204
+ Resolves **indicium#1** (reported by Dina, 2026-05-29). Domain-adapter
205
+ qualifiers extended `asb:qualifier` directly, but that slot is a CLOSED 20-term
206
+ LinkML enum (Bucur K-CAP 2021), so the generated `sh:in` shapes rejected every
207
+ extended qualifier — blocking all domain adapters (metabolomics, metabokg, emi,
208
+ transcriptomics) and the ASB benchmark. SHACL merges additively
209
+ (`validate_graph` graph-union), so an adapter-side shape could never relax the
210
+ existing `sh:in`; the fix had to live in the core standard. We chose to keep
211
+ `asb:qualifier` pristine and route domain qualifiers to a new open slot
212
+ (Reading 1) rather than dilute the published closed vocabulary.
213
+
214
+ ### Compatibility
215
+
216
+ Additive. v1.6 serialisations always carry a core `asb:qualifier`, so they
217
+ still satisfy `QualifierPresenceShape` and remain valid. Consumers gain the
218
+ `domain_qualifier` slot; no existing slot changed its `slot_uri` or range.
219
+
220
+ ---
221
+
222
+ ## [1.6.1] - 2026-05-26
223
+
224
+ ### Fixed
225
+
226
+ - **Package `context.jsonld` for downstream consumers.** Move
227
+ `docs/context.jsonld` into `src/indicium/schema/context.jsonld` (canonical
228
+ location) and symlink it back to `docs/` so mkdocs continues to publish it.
229
+ Wheels now ship the file, so consumers can load it via
230
+ `importlib.resources.files("indicium.schema") / "context.jsonld"`.
231
+
232
+ ---
233
+
234
+ ## [1.6.0] - 2026-05-24
235
+
236
+ ### Added
237
+
238
+ - **Claim aliases:** `predicate` (alias for `relation`) and `super_pattern`
239
+ (alias for `qualifier`) — explicit names matching the ASB spec.
240
+ - **Evidence aliases + new slots:** `quote_exact` (alias for `quote`),
241
+ `supports_claim` (alias for `for_claim`, mapped to `sepio:0000007`),
242
+ `quote_location` (string locator), `eco_code` (range:
243
+ `EcoCodeAsbSubset`).
244
+ - **`EcoCodeAsbSubset` enum** — 8 ECO codes ASB emits (textual_quotation,
245
+ computational_evidence, expert_curation, inference_from_background_knowledge,
246
+ author_statement, experimental_evidence, combinatorial_evidence,
247
+ traceable_author_statement).
248
+ - **Source slots:** `doi`, `paragraph_id`, `xpath_pointer` — explicit
249
+ forms of the InformationSource locators ASB targets.
250
+ - **`SoftwareEntity` class** — new class for globally-identified tools
251
+ (`canonical_url`, `version`, `edam_operation`, `edam_topics`,
252
+ `bio_tools_id`). Added to `IndiciumDocument.software_entities`.
253
+ - **JSON-LD `@context`** at `docs/context.jsonld` — stable mapping for
254
+ downstream consumers. To be served at `w3id.org/indicium/context.jsonld`
255
+ pending the w3id PR; currently published at
256
+ `holobiomicslab.github.io/indicium/context.jsonld`.
257
+ - **`docs/sepio-assertion.md`** — reference for the SEPIO assertion
258
+ pattern (skill → claim).
259
+ - **`docs/uri-scheme.md`** — reference for `indicium:claim/<uuid>` +
260
+ content-hash citation variant.
261
+ - **`tests/fixtures/asb_skill_roundtrip/`** — canonical fixture consumed
262
+ by Plan 1c's round-trip CI test in indicium-adapters.
263
+
264
+ ### Compatibility
265
+
266
+ All Wave 1 changes are **additive**: every new slot is non-required and
267
+ shares its `slot_uri` with an existing slot (where one exists). v1.5
268
+ serialisations remain valid; v1.6 consumers gain the spec-required
269
+ names.
270
+
271
+ ---
272
+
273
+ ## [1.5.0] - 2026-05-23
274
+
275
+ ### Added
276
+ - `extra_shapes` keyword argument to `validate_graph()` — callers (e.g. domain adapters via
277
+ `SHACLProvider`) can now inject additional SHACL shapes that are merged with the built-in
278
+ schema shapes before validation.
279
+
280
+ ### Fixed
281
+ - `allow_warnings=True` now passed to pyshacl in `validate_graph()` so that `sh:Warning`-severity
282
+ shapes no longer set `conforms=False`; warnings are reported in the validation report text only.
283
+ - Conditional SHACL constraint added: `superseded_by` is now required when `claim_status = superseded`.
284
+ - Core types (`Claim`, `Evidence`, `Source`, and status enums) are now re-exported from the
285
+ top-level `indicium` package for ergonomic imports.
286
+
287
+ ### Deprecated
288
+ - `indicium.adapters.astra.claim_to_insight` — use `astra_bridge` instead.
289
+
290
+ ---
291
+
292
+ ## [1.4.0] - 2026-05-20
293
+
294
+ ### Added
295
+ - `IndiciumDocument` container type for grouping claims.
296
+ - `superseded_by` field on `Claim`.
297
+ - Fixed `ClaimLink` URI generation.
298
+
299
+ ---
300
+
301
+ ## [1.3.0] - 2026-05-15
302
+
303
+ ### Added
304
+ - `ClaimLink`, `ClaimStatus` types.
305
+ - OA (Web Annotation) selectors for evidence provenance.
306
+ - ASTRA bridge adapter.
307
+
308
+ ---
309
+
310
+ ## [1.2.0] - 2026-05-10
311
+
312
+ ### Added
313
+ - `Script` and `DataAsset` classes for code/data artefacts as evidence.
314
+
315
+ ---
316
+
317
+ ## [1.1.0] - 2026-05-05
318
+
319
+ ### Added
320
+ - `Figure` class and `FigureType` enum for figure-as-evidence support.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Louis-Felix Nothias
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,268 @@
1
+ Metadata-Version: 2.5
2
+ Name: indicium-standard
3
+ Version: 2.0.0
4
+ Summary: Shared claim/evidence standard (ECO/CiTO/SEPIO/PROV-O + Bucur SuperPattern)
5
+ Project-URL: Homepage, https://holobiomicslab.github.io/indicium
6
+ Project-URL: Documentation, https://holobiomicslab.github.io/indicium/
7
+ Project-URL: Repository, https://github.com/HolobiomicsLab/indicium
8
+ Project-URL: Issues, https://github.com/HolobiomicsLab/indicium/issues
9
+ Project-URL: Changelog, https://holobiomicslab.github.io/indicium/changelog/
10
+ Author-email: Louis-Félix Nothias <louis-felix.nothias@cnrs.fr>
11
+ License-Expression: MIT
12
+ License-File: LICENSE
13
+ Keywords: agentic-science,cito,claims,eco,evidence,linkml,prov-o,scientific-standard,sepio
14
+ Classifier: Development Status :: 5 - Production/Stable
15
+ Classifier: Intended Audience :: Science/Research
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Topic :: Scientific/Engineering :: Information Analysis
21
+ Requires-Python: >=3.11
22
+ Requires-Dist: pydantic>=2.0
23
+ Requires-Dist: pyshacl>=0.26
24
+ Requires-Dist: rdflib>=7.0
25
+ Provides-Extra: astra
26
+ Requires-Dist: pyyaml>=6.0; extra == 'astra'
27
+ Provides-Extra: codegen
28
+ Requires-Dist: linkml-runtime>=1.8; extra == 'codegen'
29
+ Requires-Dist: linkml>=1.8; extra == 'codegen'
30
+ Requires-Dist: pyyaml>=6.0; extra == 'codegen'
31
+ Provides-Extra: docs
32
+ Requires-Dist: mkdocs-material>=9.5; extra == 'docs'
33
+ Requires-Dist: mkdocstrings[python]>=0.25; extra == 'docs'
34
+ Description-Content-Type: text/markdown
35
+
36
+ <p align="center">
37
+ <picture>
38
+ <source media="(prefers-color-scheme: dark)" srcset="docs/assets/brand/indicium-mark-dark.svg">
39
+ <source media="(prefers-color-scheme: light)" srcset="docs/assets/brand/indicium-mark.svg">
40
+ <img src="https://raw.githubusercontent.com/HolobiomicsLab/indicium/main/docs/assets/brand/indicium-mark.svg" width="120" alt="Indicium mark">
41
+ </picture>
42
+ </p>
43
+
44
+ <h1 align="center">Indicium</h1>
45
+
46
+ <p align="center">A versioned standard for a typed scientific claim bound to the evidence that grounds it.</p>
47
+
48
+ <p align="center">
49
+ <a href="https://github.com/HolobiomicsLab/indicium/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-00284b" alt="License: MIT"></a>
50
+ <a href="https://github.com/HolobiomicsLab/indicium/blob/main/pyproject.toml"><img src="https://img.shields.io/badge/python-3.11%2B-00284b" alt="Python 3.11+"></a>
51
+ <a href="https://github.com/HolobiomicsLab/indicium/actions/workflows/ci.yml"><img src="https://github.com/HolobiomicsLab/indicium/actions/workflows/ci.yml/badge.svg" alt="Tests"></a>
52
+ <!-- Uncomment once indicium-standard is on PyPI (RELEASING.md, follow-ups):
53
+ <a href="https://pypi.org/project/indicium-standard/"><img src="https://img.shields.io/pypi/v/indicium-standard?color=00284b" alt="PyPI"></a>
54
+ -->
55
+ </p>
56
+
57
+ ---
58
+
59
+ ## What it is
60
+
61
+ Indicium is a small, standalone, versioned **standard for a typed scientific claim
62
+ bound to the evidence that grounds it.** One LinkML source of truth generates pydantic
63
+ models, JSON Schema, SHACL shapes and OWL. It reuses community ontologies rather than
64
+ reinventing them:
65
+
66
+ | Axis | Standard |
67
+ |------|----------|
68
+ | Evidence type | **ECO** (Evidence & Conclusion Ontology) |
69
+ | Claim to citation relation | **CiTO** |
70
+ | Source and document type | **DoCO** and **IAO** |
71
+ | Article type | **FaBiO** |
72
+ | Assertion and evidence structure | **SEPIO** |
73
+ | Provenance | **PROV-O** |
74
+ | Claim structure | **Bucur et al.** 5-slot SuperPattern (K-CAP 2021) |
75
+
76
+ The one thing Indicium mints is the **binding**: a claim, its typed evidence, and the
77
+ source that evidence points to, provenance-stamped. That binding is the load-bearing
78
+ contribution. The claim structure is borrowed from Bucur; the value Indicium
79
+ standardizes is the *typed grounding of claims in evidence.*
80
+
81
+ Indicium is a vocabulary and a standard, not a tool and not a store. Every tool that
82
+ mints claims imports it, so a claim minted by any of them is structurally identical to
83
+ one minted by another, merges with it, and never travels without its evidence trace.
84
+
85
+ | Part | Where |
86
+ |------|-------|
87
+ | LinkML schema, the source of truth | `src/indicium/schema/indicium.yaml` |
88
+ | Pydantic models (`Claim`, `Evidence`, `Source`, `CitationLink`, `ClaimLink`, `IndiciumDocument`, ...) | `indicium.generated.model`, re-exported from `indicium` |
89
+ | 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/` |
90
+ | JSON-LD context | `src/indicium/schema/context.jsonld` |
91
+ | SHACL validation | `indicium.validate_graph` |
92
+ | Quote verification kernel | `indicium.verify_quote` |
93
+ | Projections to ASB task cards, ASTRA and KGmemory | `indicium.adapters`, `indicium.astra_bridge` |
94
+
95
+ ### The name
96
+
97
+ *Indicium* (Latin) is "a sign or mark that points to the truth"; in law, the
98
+ evidentiary indication. The package is named for what it standardizes: every claim
99
+ carries its **indicia**, the traces that justify believing it.
100
+
101
+ - **`indicium`** (singular) is the standard and this package.
102
+ - **indicia** (plural) is the body of evidence attached to a claim, and the term
103
+ consumer APIs use for the produced collection.
104
+
105
+ ## Install
106
+
107
+ Requires Python 3.11 or newer.
108
+
109
+ ```bash
110
+ pip install indicium-standard # distribution name
111
+ python -c "import indicium" # import name
112
+ ```
113
+
114
+ Optional extras:
115
+
116
+ ```bash
117
+ pip install "indicium-standard[astra]" # ASTRA bridge (PyYAML)
118
+ pip install "indicium-standard[codegen]" # regenerate the artefacts from the LinkML source
119
+ ```
120
+
121
+ The 2.0.0 upload to PyPI is pending ([RELEASING.md](https://github.com/HolobiomicsLab/indicium/blob/main/RELEASING.md)). Until
122
+ `pip install indicium-standard` finds it, install from the repository:
123
+
124
+ ```bash
125
+ pip install "git+https://github.com/HolobiomicsLab/indicium"
126
+ ```
127
+
128
+ > **The distribution is `indicium-standard`; the import package is `indicium`.**
129
+ > The PyPI name `indicium` belongs to an unrelated, abandoned key-value-store
130
+ > package that also ships a top-level `indicium` module. Installing both into the
131
+ > same environment will clobber the import. Always depend on `indicium-standard`.
132
+
133
+ ## Quickstart
134
+
135
+ Validate a claim against the SHACL shapes (adapted from `tests/test_validate.py`):
136
+
137
+ ```python
138
+ import rdflib
139
+ from indicium import ASB_BASE, validate_graph
140
+
141
+ claim = f"""
142
+ @prefix asb: <{ASB_BASE}> .
143
+ <urn:claim:1> a asb:Claim ;
144
+ asb:context "in vitro" ;
145
+ asb:subject "compound A" ;
146
+ asb:qualifier "inhibits" ;
147
+ asb:relation "inhibits growth of" ;
148
+ asb:object "cell line B" .
149
+ """
150
+ conforms, report = validate_graph(rdflib.Graph().parse(data=claim, format="turtle"))
151
+ print(conforms) # True
152
+
153
+ incomplete = f"""
154
+ @prefix asb: <{ASB_BASE}> .
155
+ <urn:claim:2> a asb:Claim ; asb:context "in vitro" .
156
+ """
157
+ conforms, report = validate_graph(rdflib.Graph().parse(data=incomplete, format="turtle"))
158
+ print(conforms) # False
159
+ ```
160
+
161
+ `report` names each missing slot. The [quickstart](https://holobiomicslab.github.io/indicium/quickstart/) continues with
162
+ the typed model and the adapters; every Python example in this README and on the Home,
163
+ Quickstart and URI scheme pages runs in the test suite (`tests/test_docs_examples.py`).
164
+
165
+ ## Vocabulary and IRIs
166
+
167
+ Import the namespace bases; never copy the IRI string into your own code. A
168
+ hardcoded base keeps pointing at the old namespace when the standard moves, and
169
+ the SHACL shapes then match nothing: every graph validates as `conforms=True`
170
+ while no constraint is actually checked.
171
+
172
+ ```python
173
+ from indicium import ASB_BASE, INDICIUM_BASE, asb_term
174
+
175
+ asb_term("Claim") # 'https://w3id.org/asb#Claim'
176
+ ```
177
+
178
+ ```python
179
+ ASB = "https://w3id.org/asb#" # don't: silently dead after a move
180
+ ```
181
+
182
+ | Prefix | Namespace | Names | Resolves (measured 2026-10-30) |
183
+ |--------|-----------|-------|------------------|
184
+ | `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 |
185
+ | `asbval:` | `https://w3id.org/asb/validation#` | Validation assertion terms used beside `asb:` by ASB | Yes. Same registration; 303 to `holobiomicslab.eu/ns/asbval` |
186
+ | `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/`](https://github.com/HolobiomicsLab/indicium/tree/main/docs/release/w3id-indicium) |
187
+
188
+ [`docs/uri-scheme.md`](https://holobiomicslab.github.io/indicium/uri-scheme/) has the redirect chains, the identifier
189
+ conventions for claims and evidence, and what the `/indicium` registration will point
190
+ at. `tests/test_namespace_resolves.py` fetches each namespace when
191
+ `INDICIUM_NETWORK_TESTS=1` is set.
192
+
193
+ ## Ecosystem
194
+
195
+ Indicium is the shared layer; the projects below mint, store or consume its claims.
196
+
197
+ | Project | What it is | Relation to Indicium |
198
+ |---------|------------|----------------------|
199
+ | [ASTRA](https://astra-spec.org) | A declarative YAML format for scientific analyses: inputs, outputs, decisions and evidence ([astra-spec](https://github.com/LightconeResearch/astra-spec)) | `indicium.astra_bridge` turns claims into ASTRA insights and reads ASTRA findings back as claims |
200
+ | 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 |
201
+ | [asb-skill-collections](https://github.com/HolobiomicsLab/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 |
202
+ | `asb-skills-<domain>` | The skill collections, one repository per domain | Built by ASB; same vocabulary |
203
+ | [Perspicacité](https://github.com/HolobiomicsLab/Perspicacite-AI) | 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 |
204
+ | Scriptorium | Manuscript authoring | Depends on `indicium-standard>=2.0.0,<3` and the adapters |
205
+ | KGmemory | Where claims are stored and reasoned over | `indicium.adapters.kgmemory` emits a JSON-LD node typed `mem:SemanticMemory` |
206
+ | `indicium-adapters` | The `DomainAdapter` and `SHACLProvider` protocols and entry-point discovery | Domain shapes reach `validate_graph(..., extra_shapes=...)` |
207
+ | `indicium-adapters-<domain>` | Domain bundles: agentic-ai, astronomy, epigenomics, genomics, metabarcoding, metabolomics, metagenomics, multi-omics, proteomics, transcriptomics | Ontology terms and SHACL shapes per domain |
208
+
209
+ AgenticScienceBuilder, Scriptorium, KGmemory, the `asb-skills-<domain>` collections
210
+ and the `indicium-adapters` family are not public yet.
211
+
212
+ ## Development
213
+
214
+ ```bash
215
+ uv sync --frozen --extra codegen --extra docs
216
+ uv run pytest -q # includes the conformance suite (parity with the Scriptorium SHACL)
217
+ make lint # ruff over src/ and scripts/
218
+ make gen # regenerate model.py, shapes.ttl, ontology.ttl, schema.json
219
+ make context # regenerate the packaged JSON-LD context from the LinkML URI bindings
220
+ make schema-assets # make gen and make context, then copy the artefacts and the changelog into docs/
221
+ uv run mkdocs build --strict # the documentation site, as docs.yml deploys it
222
+ ```
223
+
224
+ `docs/changelog.md` is a copy of `CHANGELOG.md` (`make docs-changelog`); edit only the
225
+ latter. `make gen` writes canonical Turtle, so a second run is byte-identical to the
226
+ committed files; `release.yml` fails when it is not.
227
+
228
+ Namespace bases are stable identifiers. Their registration and the vocabulary site are
229
+ prepared separately from the Python release; they do not provide an instance store.
230
+ Read the [URI scheme](https://holobiomicslab.github.io/indicium/uri-scheme/) and the
231
+ [SEPIO compatibility notes](https://holobiomicslab.github.io/indicium/sepio-assertion/)
232
+ before exporting RDF.
233
+
234
+ ## Release and versioning policy
235
+
236
+ Indicium follows [Semantic Versioning](https://semver.org/), read for a vocabulary:
237
+
238
+ - **Term IRIs are immutable after a tagged release.** Published data embeds them.
239
+ - **Additive changes are minor:** a new class, slot or enum value.
240
+ - **An IRI change or a slot removal is major,** as is a tighter cardinality. This is
241
+ why the move of the `asb:` base to `https://w3id.org/asb#` is 2.0.0.
242
+
243
+ A tag `v<version>` that matches `pyproject.toml` and a dated `CHANGELOG.md` section
244
+ runs the release (`.github/workflows/release.yml`): the checks, tests, documentation
245
+ build and installed-wheel check first, then the upload of the wheel and the sdist to
246
+ PyPI through Trusted Publishing, then the GitHub release with the same files and the
247
+ three schema artefacts.
248
+ [RELEASING.md](https://github.com/HolobiomicsLab/indicium/blob/main/RELEASING.md) is the maintainer checklist. Changes are listed in
249
+ [CHANGELOG.md](https://github.com/HolobiomicsLab/indicium/blob/main/CHANGELOG.md).
250
+
251
+ ## Citation
252
+
253
+ [CITATION.cff](https://github.com/HolobiomicsLab/indicium/blob/main/CITATION.cff) holds the citation metadata, which GitHub offers as
254
+ "Cite this repository". No DOI exists yet. BibTeX, derived from that file with
255
+ `cffconvert -f bibtex` (citation key renamed):
256
+
257
+ ```bibtex
258
+ @misc{nothias_indicium,
259
+ author = {Nothias, Louis-Félix},
260
+ title = {Indicium: a standard for typed scientific claims bound to their evidence},
261
+ url = {https://github.com/HolobiomicsLab/indicium}
262
+ }
263
+ ```
264
+
265
+ ## License
266
+
267
+ MIT, see [LICENSE](https://github.com/HolobiomicsLab/indicium/blob/main/LICENSE). Developed at the Holobiomics Lab, CNRS / Université Côte
268
+ d'Azur.