Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
5274489
Note broken EarthCODE example URLs (see #11)
nsnarayanam Aug 5, 2026
c09384d
Update scaffolding files from bblocks-template
nsnarayanam Aug 5, 2026
0eba30b
Add ogc.osc.prov-processing-step: PROV profile for a single geospatia…
nsnarayanam Aug 6, 2026
3bb3ef6
Fix schema to PROV-O object model: entity refs in used/generated, rol…
nsnarayanam Aug 6, 2026
e49c3d9
Bind processType to dct:type and label to rdfs:label in JSON-LD context
nsnarayanam Aug 7, 2026
b95a515
Trigger Actions after enabling workflows on fork
nsnarayanam Aug 7, 2026
1aa06d6
Activity 2: profile the Anvikshana drought pipeline — 8 worked exampl…
nsnarayanam Aug 7, 2026
b4afcf7
Add SMDI step and join ML branch: provenance chain now self-assembles…
nsnarayanam Aug 12, 2026
85c4a44
Building blocks postprocessing
nsnarayanam Aug 12, 2026
20d37b2
Restore executable bit on create-clean-pr.sh after merge
nsnarayanam Aug 12, 2026
7902a84
merge
nsnarayanam Aug 26, 2026
eae9b01
Fix typo in openscience ontology dependency: processes-ontology -> pr…
nsnarayanam Aug 26, 2026
efe2818
Building blocks postprocessing
nsnarayanam Aug 26, 2026
43345eb
Merge remote-tracking branch 'fork-parent/master'
nsnarayanam Sep 10, 2026
235afbf
Ignore .DS_Store
nsnarayanam Sep 10, 2026
4ee87e8
Building blocks postprocessing
nsnarayanam Sep 10, 2026
8d27999
Remove build output from contribution branch
nsnarayanam Sep 10, 2026
14fe558
Point README build link at this fork's Pages
nsnarayanam Sep 10, 2026
bd1207e
Type qualifiedUsage nodes as prov:Usage to satisfy cross-domain-model…
nsnarayanam Sep 10, 2026
72cb7fb
Stop tracking .DS_Store
nsnarayanam Sep 10, 2026
952282e
Merge branch 'master' of https://github.com/nsnarayanam/bblocks-opens…
nsnarayanam Sep 10, 2026
be70210
Building blocks postprocessing
nsnarayanam Sep 10, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,7 @@ build-local/
.idea/
.claude/
.volumes
*.bak
.DS_Store
build/
.DS_Store
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
Note: see issue #11 — EarthCODE example URLs currently 404 and block the register build.
# Open Science Building Blocks

The repository documents a set of [OGC Building Blocks](https:blocks.ogc.org). for Open Science, which in turn leverage reusable ontologies, schemas, APIs etc. from published OGC standards.

The set of building blocks and the interoperability specifications composed from them are visble here https://ogcincubator.github.io/bblocks-openscience/
The set of building blocks and the interoperability specifications composed from them are visble here https://nsnarayanam.github.io/bblocks-openscience/

An overview of the architecture and status :

Expand Down
13 changes: 13 additions & 0 deletions _sources/prov-processing-step/bblock.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"name": "Geospatial Processing Step Provenance",
"abstract": "A profile of the PROV-O building block constrained to the description of a single geospatial processing step, with a required link to a registered process type.",
"status": "under-development",
"dateTimeAddition": "2026-08-05T00:00:00Z",
"itemClass": "schema",
"version": "0.1.0",
"dateOfLastChange": "2026-08-05",
"maturity": "development",
"scope": "unstable",
"tags": ["provenance", "prov-o", "processing", "ospd"],
"dependsOn": ["ogc.ogc-utils.prov"]
}
20 changes: 20 additions & 0 deletions _sources/prov-processing-step/description.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Geospatial Processing Step Provenance

This building block profiles `ogc-utils.prov` down to a single unit: one
geospatial processing step.

PROV-O is deliberately general. Any valid PROV document is a valid description
of a processing step, which makes validation weak and cross-platform comparison
hard.

OGC API - Processes Part 5 (draft 26-038) narrows this for job provenance: a
job entity, a process entity, an activity joining them, and input/output
artifacts carrying roles. This profile follows that shape.

Part 5 does not define any link from a process to a registered process type.
This profile makes that link required, via the processType property. It is the
point at which the OSPD 2026 profile-plus-register pattern closes: the profile
gives the structure, the register gives the controlled term.

Under development as part of OSPD 2026, deliverable D104 (Aganitha Space
Technologies, Workflow Profiler).
294 changes: 294 additions & 0 deletions _sources/prov-processing-step/examples.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,294 @@
- title: Ingest of mandal-level vegetation and soil moisture
description: >-
Retrieval of source observations into the workflow. Ingest is where
external provenance ends and workflow provenance begins: the generated
entity is the first thing downstream steps can cite.
snippets:
- language: json
code: |
{
"id": "urn:aganitha:step:ingest-dicra:20260807T060000Z",
"provType": "Activity",
"processType": "https://example.org/ospd/process-types/ingest",
"label": "Ingest mandal NDVI and soil moisture",
"startedAtTime": "2026-08-07T06:00:00Z",
"endedAtTime": "2026-08-07T06:03:41Z",
"used": ["urn:aganitha:source:dicra-mandal-archive"],
"generated": ["urn:aganitha:dataset:mandal-ndvi-sm-merged"],
"qualifiedUsage": [
{
"@type": "prov:Usage",
"entity": "urn:aganitha:source:dicra-mandal-archive",
"hadRole": "https://example.org/ospd/roles/sourceArchive"
}
]
}

- title: Normalisation of vegetation index to a condition index
description: >-
Rescaling an observed index against its own historical extremes. The
reference extrema are inputs rather than inline constants, so the period
they were derived from is recoverable from the provenance.
snippets:
- language: json
code: |
{
"id": "urn:aganitha:step:vci:20260807T061000Z",
"provType": "Activity",
"processType": "https://example.org/ospd/process-types/index-normalisation",
"label": "Compute vegetation condition index from NDVI",
"used": [
"urn:aganitha:dataset:mandal-ndvi-sm-merged",
"urn:aganitha:reference:ndvi-extrema"
],
"generated": ["urn:aganitha:dataset:vci"],
"qualifiedUsage": [
{
"@type": "prov:Usage",
"entity": "urn:aganitha:dataset:mandal-ndvi-sm-merged",
"hadRole": "https://example.org/ospd/roles/observedIndex"
},
{
"@type": "prov:Usage",
"entity": "urn:aganitha:reference:ndvi-extrema",
"hadRole": "https://example.org/ospd/roles/normalisationReference"
}
]
}

- title: Normalisation of soil moisture to a deficit index
description: >-
The companion to the vegetation index step, and the piece that closes
the gap in the chain: without it, the combined index consumes an entity
no recorded activity produced, so a consumer walking the provenance
backwards hits a dead end.
snippets:
- language: json
code: |
{
"id": "urn:aganitha:step:smdi:20260807T061500Z",
"provType": "Activity",
"processType": "https://example.org/ospd/process-types/index-normalisation",
"label": "Compute soil moisture deficit index",
"used": [
"urn:aganitha:dataset:mandal-ndvi-sm-merged",
"urn:aganitha:reference:soil-moisture-extrema"
],
"generated": ["urn:aganitha:dataset:smdi"],
"qualifiedUsage": [
{
"@type": "prov:Usage",
"entity": "urn:aganitha:dataset:mandal-ndvi-sm-merged",
"hadRole": "https://example.org/ospd/roles/observedIndex"
},
{
"@type": "prov:Usage",
"entity": "urn:aganitha:reference:soil-moisture-extrema",
"hadRole": "https://example.org/ospd/roles/normalisationReference"
}
]
}

- title: Weighted composition of a combined drought index
description: >-
Combination of two condition indices under fixed weights. Both inputs
share the same role, and the weights are step parameters rather than
properties of the process type — a case that bears directly on how
finely process types should be registered.
snippets:
- language: json
code: |
{
"id": "urn:aganitha:step:cdsi:20260807T062000Z",
"provType": "Activity",
"processType": "https://example.org/ospd/process-types/index-composition",
"label": "Compose combined drought severity index",
"used": [
"urn:aganitha:dataset:vci",
"urn:aganitha:dataset:smdi"
],
"generated": ["urn:aganitha:dataset:cdsi"],
"qualifiedUsage": [
{
"@type": "prov:Usage",
"entity": "urn:aganitha:dataset:vci",
"hadRole": "https://example.org/ospd/roles/indexComponent"
},
{
"@type": "prov:Usage",
"entity": "urn:aganitha:dataset:smdi",
"hadRole": "https://example.org/ospd/roles/indexComponent"
}
],
"parameters": {
"weights": { "vci": 0.6, "smdi": 0.4 }
}
}

- title: Classification into drought severity classes
description: >-
Assignment of continuous index values to discrete classes. The class
scheme is an input entity, so the thresholds applied are recoverable
from the provenance without reading the code.
snippets:
- language: json
code: |
{
"id": "urn:aganitha:step:classify:20260807T063000Z",
"provType": "Activity",
"processType": "https://example.org/ospd/process-types/classification",
"label": "Classify drought severity",
"used": [
"urn:aganitha:dataset:cdsi",
"urn:aganitha:scheme:drought-severity-classes"
],
"generated": ["urn:aganitha:dataset:drought-classes"],
"qualifiedUsage": [
{
"@type": "prov:Usage",
"entity": "urn:aganitha:dataset:cdsi",
"hadRole": "https://example.org/ospd/roles/inputField"
},
{
"@type": "prov:Usage",
"entity": "urn:aganitha:scheme:drought-severity-classes",
"hadRole": "https://example.org/ospd/roles/classificationScheme"
}
],
"parameters": {
"classBreaks": [0.30, 0.45, 0.60, 0.75]
}
}

- title: Standardised precipitation index over an accumulation window
description: >-
Derivation of a standardised index from an accumulated series against a
fitted reference period. Two entities of the same kind distinguished
only by role — the case where entity references alone would be
ambiguous and qualifiedUsage does real work.
snippets:
- language: json
code: |
{
"id": "urn:aganitha:step:spi:20260807T064000Z",
"provType": "Activity",
"processType": "https://example.org/ospd/process-types/standardised-index",
"label": "Compute standardised precipitation index",
"used": [
"urn:aganitha:dataset:precipitation-series",
"urn:aganitha:dataset:precipitation-reference-period"
],
"generated": ["urn:aganitha:dataset:spi"],
"qualifiedUsage": [
{
"@type": "prov:Usage",
"entity": "urn:aganitha:dataset:precipitation-series",
"hadRole": "https://example.org/ospd/roles/inputSeries"
},
{
"@type": "prov:Usage",
"entity": "urn:aganitha:dataset:precipitation-reference-period",
"hadRole": "https://example.org/ospd/roles/fittingReference"
}
]
}

- title: Model training as a processing step
description: >-
Training a predictive model, expressed as an ordinary processing
activity. The generated entity is a fitted model rather than a data
product, and the fold assignment is an input entity so the spatial
cross-validation design is recoverable from the provenance.

This is the case the profile is least obviously shaped for, and the
reason it is included: if a trained model cannot be expressed as an
entity generated by an activity, the profile cannot describe machine
learning workflows at all.
snippets:
- language: json
code: |
{
"id": "urn:aganitha:step:train:20260807T070000Z",
"provType": "Activity",
"processType": "https://example.org/ospd/process-types/model-training",
"label": "Train drought prediction model with spatial cross-validation",
"used": [
"urn:aganitha:dataset:cdsi",
"urn:aganitha:dataset:spi",
"urn:aganitha:dataset:drought-classes",
"urn:aganitha:partition:district-folds"
],
"generated": [
"urn:aganitha:model:drought-classifier",
"urn:aganitha:report:validation-metrics"
],
"qualifiedUsage": [
{
"@type": "prov:Usage",
"entity": "urn:aganitha:dataset:cdsi",
"hadRole": "https://example.org/ospd/roles/trainingFeatures"
},
{
"@type": "prov:Usage",
"entity": "urn:aganitha:dataset:spi",
"hadRole": "https://example.org/ospd/roles/trainingFeatures"
},
{
"@type": "prov:Usage",
"entity": "urn:aganitha:dataset:drought-classes",
"hadRole": "https://example.org/ospd/roles/trainingTarget"
},
{
"@type": "prov:Usage",
"entity": "urn:aganitha:partition:district-folds",
"hadRole": "https://example.org/ospd/roles/validationPartition"
}
]
}

- title: Inference using a trained model
description: >-
Applying a fitted model to produce a projection. The same model entity
that was generated by training is here consumed as an input — the
round trip that makes model provenance chainable, and something no
purely data-oriented profile has to handle.
snippets:
- language: json
code: |
{
"id": "urn:aganitha:step:project:20260807T071500Z",
"provType": "Activity",
"processType": "https://example.org/ospd/process-types/model-inference",
"label": "Generate forward drought projection",
"used": [
"urn:aganitha:model:drought-classifier",
"urn:aganitha:dataset:cdsi"
],
"generated": ["urn:aganitha:dataset:drought-projection"],
"qualifiedUsage": [
{
"@type": "prov:Usage",
"entity": "urn:aganitha:model:drought-classifier",
"hadRole": "https://example.org/ospd/roles/fittedModel"
},
{
"@type": "prov:Usage",
"entity": "urn:aganitha:dataset:cdsi",
"hadRole": "https://example.org/ospd/roles/inferenceInput"
}
]
}

- title: Minimal conforming step
description: >-
The smallest document that satisfies this profile.
snippets:
- language: json
code: |
{
"id": "urn:example:step:0001",
"provType": "Activity",
"processType": "https://example.org/ospd/process-types/ingest",
"used": ["urn:example:input:0001"],
"generated": ["urn:example:output:0001"]
}
Loading