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.
- indicium_standard-2.0.0/.gitignore +8 -0
- indicium_standard-2.0.0/CHANGELOG.md +320 -0
- indicium_standard-2.0.0/LICENSE +21 -0
- indicium_standard-2.0.0/PKG-INFO +268 -0
- indicium_standard-2.0.0/README.md +233 -0
- indicium_standard-2.0.0/pyproject.toml +85 -0
- indicium_standard-2.0.0/src/indicium/__init__.py +96 -0
- indicium_standard-2.0.0/src/indicium/adapters/__init__.py +0 -0
- indicium_standard-2.0.0/src/indicium/adapters/astra.py +44 -0
- indicium_standard-2.0.0/src/indicium/adapters/kgmemory.py +23 -0
- indicium_standard-2.0.0/src/indicium/adapters/scitask.py +56 -0
- indicium_standard-2.0.0/src/indicium/astra_bridge.py +242 -0
- indicium_standard-2.0.0/src/indicium/augmentation/__init__.py +0 -0
- indicium_standard-2.0.0/src/indicium/augmentation/alignment.ttl +11 -0
- indicium_standard-2.0.0/src/indicium/augmentation/supplemental-shapes.ttl +38 -0
- indicium_standard-2.0.0/src/indicium/generated/__init__.py +0 -0
- indicium_standard-2.0.0/src/indicium/generated/model.py +581 -0
- indicium_standard-2.0.0/src/indicium/generated/ontology.ttl +1970 -0
- indicium_standard-2.0.0/src/indicium/generated/schema.json +1251 -0
- indicium_standard-2.0.0/src/indicium/generated/shapes.ttl +651 -0
- indicium_standard-2.0.0/src/indicium/iri_bindings.py +234 -0
- indicium_standard-2.0.0/src/indicium/schema/context.jsonld +445 -0
- indicium_standard-2.0.0/src/indicium/schema/indicium.yaml +652 -0
- indicium_standard-2.0.0/src/indicium/validate.py +41 -0
- indicium_standard-2.0.0/src/indicium/verify.py +166 -0
|
@@ -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.
|