diff --git a/Dockerfile b/Dockerfile
index 3a013c2..0b20175 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -7,4 +7,4 @@ RUN ./verify_jena.sh
ENV PATH="${PATH}:/app/apache-jena/bin/"
ENV PYTHONUNBUFFERED=1
COPY . .
-ENTRYPOINT ["/app/shacl_validate.py"]
+ENTRYPOINT ["/app/shacl_validate.py"]
\ No newline at end of file
diff --git a/ops/C04/credit-class-metadata/C04-ruuts-credit-class.jsonld b/ops/C04/credit-class-metadata/C04-ruuts-credit-class.jsonld
new file mode 100644
index 0000000..f79504b
--- /dev/null
+++ b/ops/C04/credit-class-metadata/C04-ruuts-credit-class.jsonld
@@ -0,0 +1,134 @@
+{
+ "@context": {
+ "schema": "http://schema.org/",
+ "regen": "https://schema.regen.network#",
+ "xsd": "http://www.w3.org/2001/XMLSchema#",
+ "schema:itemListElement": {
+ "@container": "@list"
+ },
+ "schema:url": {
+ "@type": "schema:URL"
+ },
+ "regen:sectoralScope": {
+ "@container": "@list"
+ },
+ "regen:offsetGenerationMethod": {
+ "@container": "@list"
+ },
+ "regen:measuredGHGs": {
+ "@container": "@list"
+ },
+ "regen:coBenefits": {
+ "@container": "@list"
+ },
+ "regen:eligibleActivities": {
+ "@container": "@list"
+ },
+ "regen:landOwnershipType": {
+ "@container": "@list"
+ },
+ "regen:ecosystemType": {
+ "@container": "@list"
+ },
+ "regen:verificationMethods": {
+ "@container": "@list"
+ },
+ "regen:additionalityApproach": {
+ "@container": "@list"
+ },
+ "regen:leakageApproach": {
+ "@container": "@list"
+ },
+ "regen:creditingTerm": {
+ "@type": "schema:activityDuration"
+ },
+ "regen:lookbackPeriod": {
+ "@type": "schema:activityDuration"
+ },
+ "regen:permanencePeriod": {
+ "@type": "schema:activityDuration"
+ },
+ "regen:monitoringFrequency": {
+ "@type": "schema:frequency"
+ },
+ "regen:verificationFrequency": {
+ "@type": "schema:frequency"
+ }
+ },
+ "@type": "regen:C04-CreditClass",
+ "schema:name": "Ruuts Credit Class for Soil Carbon Sequestration through Regenerative Grazing",
+ "schema:description": "The Credit Class and its accompanying methodology provide farmers with a measuring and monitoring process for soil organic carbon sequestration in regenerative grazing systems, enabling them to generate carbon credits that also include robust ecological co-benefits such as water infiltration and biodiversity.",
+ "schema:url": "https://library.regen.network/v/regen-registry-credit-classes/regen-registry-credit-classes-1/ruuts-credit-class-for-soil-carbon-sequestration-through-regenerative-grazing",
+ "regen:sourceRegistry": {
+ "schema:name": "Regen Registry",
+ "schema:url": "https://library.regen.network/v/regen-registry-guide/"
+ },
+ "regen:sectoralScope": [
+ "Livestock & Manure Management"
+ ],
+ "regen:offsetGenerationMethod": [
+ "Carbon Removal"
+ ],
+ "regen:measuredGHGs": [
+ "Carbon Dioxide (CO2)",
+ "Nitrous Oxide (NO2)",
+ "Methane (CH4)"
+ ],
+ "regen:coBenefits": [
+ "Water Infultration",
+ "Biodiversity"
+ ],
+ "regen:geographicApplicability": "Global",
+ "regen:eligibleActivities": [
+ "Improved Grazing",
+ "Rotational Grazing"
+ ],
+ "regen:landOwnershipType": [
+ "Public",
+ "Private"
+ ],
+ "regen:ecosystemType": [
+ "Pasture",
+ "Native Grasslands",
+ "Integrated Cro-Livestock (ICL)"
+ ],
+ "regen:creditingTerm": "P10Y",
+ "regen:lookbackPeriod": "P-14Y",
+ "regen:permanencePeriod": "P20Y",
+ "regen:aggregatedProjects": true,
+ "regen:monitoringFrequency": "Annual",
+ "regen:verificationFrequency": "Five year",
+ "regen:verificationMethods": [
+ "Ruuts Internal Quality Assurance",
+ "Third-Party ISO 14064-3 Verification"
+ ],
+ "regen:approvedMethodologies": {
+ "@type": "schema:ItemList",
+ "schema:itemListElement": [
+ {
+ "schema:name": "Ruuts Protocol Soil Carbon Sequestration Methodology v1",
+ "schema:url": "https://library.regen.network/v/methodology-library/published-methodologies/ruuts-methodology-for-soil-carbon-sequestration",
+ "schema:identifier": "",
+ "schema:version": "V1.0"
+ }
+ ],
+ "schema:url": ""
+ },
+ "regen:bufferPoolAccounts": {
+ "@type": "schema:ItemList",
+ "schema:itemListElement": [
+ {
+ "schema:name": "Credit Class (Pooled) Buffer Pool",
+ "regen:walletAddress": "regen17pmq7hp4upvmmveqexzuhzu64v36re3w3447n7dt46uwp594wtpsuuh7f6",
+ "regen:poolAllocation": "5%"
+ }
+ ]
+ },
+ "regen:additionalityApproach": [
+ "Common Practice Analysis",
+ "Regulatory Additionality"
+ ],
+ "regen:leakageApproach": [
+ "Activity Shifting Leakage"
+ ]
+}
diff --git a/shacl/common.ttl b/shacl/common.ttl
index 93e5199..bf17666 100644
--- a/shacl/common.ttl
+++ b/shacl/common.ttl
@@ -1,3 +1,4 @@
+@prefix schema: .
@prefix sh: .
@prefix regen: .
@prefix xsd: .
@@ -81,4 +82,4 @@ regen:RequiredUrlPropertyShape sh:path schema:url ;
sh:maxCount 1 ;
sh:minLength 1 ;
sh:datatype schema:URL ;
-.
\ No newline at end of file
+.
diff --git a/shacl/credit-classes/C04-ruuts-credit-class.ttl b/shacl/credit-classes/C04-ruuts-credit-class.ttl
new file mode 100644
index 0000000..2dd01db
--- /dev/null
+++ b/shacl/credit-classes/C04-ruuts-credit-class.ttl
@@ -0,0 +1,170 @@
+@prefix schema: .
+@prefix sh: .
+@prefix xsd: .
+@prefix regen: .
+@prefix dash: .
+@prefix rdf: .
+
+regen:C04-CreditClassShape a sh:NodeShape ;
+ sh:targetClass regen:C04-CreditClass ;
+ sh:property [
+ sh:path regen:measuredGHGs ;
+ sh:node dash:ListShape ;
+ sh:property [
+ sh:path ( [ sh:zeroOrMorePath rdf:rest ] rdf:first ) ;
+ sh:datatype xsd:string ;
+ sh:minLength 1 ;
+ ] ;
+ sh:minCount 1 ;
+ sh:maxCount 1 ;
+ ] ;
+ sh:property [
+ sh:path regen:coBenefits ;
+ sh:node dash:ListShape ;
+ sh:property [
+ sh:path ( [ sh:zeroOrMorePath rdf:rest ] rdf:first ) ;
+ sh:datatype xsd:string ;
+ sh:minLength 1 ;
+ ] ;
+ sh:minCount 1 ;
+ sh:maxCount 1 ;
+ ] ;
+ sh:property [
+ sh:path regen:geographicApplicability ;
+ sh:datatype xsd:string ;
+ ] ;
+ sh:property [
+ sh:path regen:eligibleActivities ;
+ sh:node dash:ListShape ;
+ sh:property [
+ sh:path ( [ sh:zeroOrMorePath rdf:rest ] rdf:first ) ;
+ sh:datatype xsd:string ;
+ sh:minLength 1 ;
+ ] ;
+ sh:minCount 1 ;
+ sh:maxCount 1 ;
+ ] ;
+ sh:property [
+ sh:path regen:landOwnershipType ;
+ sh:node dash:ListShape ;
+ sh:property [
+ sh:path ( [ sh:zeroOrMorePath rdf:rest ] rdf:first ) ;
+ sh:datatype xsd:string ;
+ sh:minLength 1 ;
+ ] ;
+ sh:minCount 1 ;
+ sh:maxCount 1 ;
+ ] ;
+ sh:property [
+ sh:path regen:ecosystemType ;
+ sh:node dash:ListShape ;
+ sh:property [
+ sh:path ( [ sh:zeroOrMorePath rdf:rest ] rdf:first ) ;
+ sh:datatype xsd:string ;
+ sh:minLength 1 ;
+ ] ;
+ sh:minCount 1 ;
+ sh:maxCount 1 ;
+ ] ;
+ sh:property [
+ sh:path regen:creditingTerm ;
+ sh:node schema:activityDuration ;
+ sh:minCount 1 ;
+ sh:maxCount 1 ;
+ sh:minLength 1 ;
+ ] ;
+ sh:property [
+ sh:path regen:lookbackPeriod ;
+ sh:node schema:activityDuration ;
+ sh:minCount 1 ;
+ sh:maxCount 1 ;
+ sh:minLength 1 ;
+ ] ;
+ sh:property [
+ sh:path regen:aggregatedProjects ;
+ sh:node schema:Boolean ;
+ sh:minCount 1 ;
+ sh:maxCount 1 ;
+ sh:minLength 1 ;
+ ] ;
+ sh:property [
+ sh:path regen:monitoringFrequency ;
+ sh:datatype schema:frequency ;
+ sh:minCount 1 ;
+ sh:maxCount 1 ;
+ sh:minLength 1 ;
+ ] ;
+ sh:property [
+ sh:path regen:verificationFrequency ;
+ sh:node schema:frequency ;
+ sh:minCount 1 ;
+ sh:maxCount 1 ;
+ sh:minLength 1 ;
+ ] ;
+ sh:property regen:BufferPoolAccountsShape ;
+ sh:property [
+ sh:path regen:additionalityApproach ;
+ sh:node dash:ListShape ;
+ sh:property [
+ sh:path ( [ sh:zeroOrMorePath rdf:rest ] rdf:first ) ;
+ sh:datatype xsd:string ;
+ sh:minLength 1 ;
+ ] ;
+ sh:minCount 1 ;
+ sh:maxCount 1 ;
+ ] ;
+ sh:property [
+ sh:path regen:leakageApproach ;
+ sh:node dash:ListShape ;
+ sh:property [
+ sh:path ( [ sh:zeroOrMorePath rdf:rest ] rdf:first ) ;
+ sh:datatype xsd:string ;
+ sh:minLength 1 ;
+ ] ;
+ sh:minCount 1 ;
+ sh:maxCount 1 ;
+ ] ;
+ sh:property [
+ sh:path regen:permanencePeriod ;
+ sh:node schema:activityDuration ;
+ sh:minCount 1 ;
+ sh:maxCount 1 ;
+ sh:minLength 1 ;
+ ] ;
+.
+
+regen:BufferPoolAccountShape a sh:NodeShape ;
+ sh:property [
+ sh:path schema:name ;
+ sh:datatype xsd:string ;
+ sh:minCount 1 ;
+ sh:maxCount 1 ;
+ sh:minLength 1 ;
+ ] ;
+ sh:property [
+ sh:path regen:walletAddress ;
+ sh:datatype xsd:string ;
+ sh:minCount 1 ;
+ ] ;
+ sh:property [
+ sh:path regen:poolAllocation ;
+ sh:datatype xsd:string ;
+ sh:minCount 1 ;
+ ] ;
+.
+
+regen:BufferPoolAccountsShape sh:path regen:bufferPoolAccounts ;
+ sh:node dash:ItemList ;
+ sh:minCount 1 ;
+ sh:maxCount 1 ;
+ sh:property [
+ sh:path schema:itemListElement ;
+ sh:minCount 1 ;
+ sh:maxCount 1 ;
+ sh:property [
+ sh:path ( [ sh:zeroOrMorePath rdf:rest ] rdf:first ) ;
+ sh:node regen:BufferPoolAccountShape ;
+ sh:minCount 1 ;
+ ] ;
+ ]
+.
\ No newline at end of file
diff --git a/shacl/credit-classes/credit-class.ttl b/shacl/credit-classes/credit-class.ttl
index a842141..6f2131a 100644
--- a/shacl/credit-classes/credit-class.ttl
+++ b/shacl/credit-classes/credit-class.ttl
@@ -7,7 +7,7 @@
@prefix rdfs: .
regen:CreditClassShape a sh:NodeShape ;
- sh:targetClass regen:CreditClass, regen:C01-CreditClass, regen:C02-CreditClass, regen:C03-CreditClass;
+ sh:targetClass regen:CreditClass, regen:C01-CreditClass, regen:C02-CreditClass, regen:C03-CreditClass, regen:C04-CreditClass;
sh:property [
sh:path schema:name ;
sh:minCount 1 ;
@@ -46,13 +46,29 @@ regen:CreditClassShape a sh:NodeShape ;
sh:maxCount 1 ;
] ;
sh:property regen:OffsetGenerationMethodPropertyShape ;
- sh:property [
- sh:path regen:verificationMethod ;
- sh:minCount 1 ;
- sh:maxCount 1 ;
- sh:minLength 1 ;
- sh:datatype xsd:string ;
- ] ;
+ sh:or (
+ [
+ sh:property [
+ sh:path regen:verificationMethod ;
+ sh:minCount 1 ;
+ sh:maxCount 1 ;
+ sh:minLength 1 ;
+ sh:datatype xsd:string ;
+ ] ;
+ ] [
+ sh:property [
+ sh:path regen:verificationMethods ;
+ sh:node dash:ListShape ;
+ sh:property [
+ sh:path ( [ sh:zeroOrMorePath rdf:rest ] rdf:first ) ;
+ sh:datatype xsd:string ;
+ sh:minLength 1 ;
+ ] ;
+ sh:minCount 1 ;
+ sh:maxCount 1 ;
+ ] ;
+ ]
+ ) ;
sh:property regen:ApprovedMethodologiesPropertyShape ;
sh:property [
sh:path regen:certifications;