{
  "agentPolicy": {
    "clientAdoptionQualified": false,
    "consentQualified": false,
    "currentUpstreamFreshness": "unverified",
    "nativeMutationSupported": false,
    "nativeSenderQualified": false,
    "observedPayloadQualified": false,
    "readOnly": true,
    "referenceOwnershipQualified": false,
    "runtimeAuthorizationQualified": false,
    "scope": "RetainedSchemaClassificationOnly"
  },
  "bounds": {
    "blankDepth": 32,
    "fieldDependencyNodes": 128,
    "fieldDependencyTriples": 2048,
    "querySeconds": 120,
    "reviewOffers": 4096,
    "sourceBytes": 67108864,
    "sourceFiles": 256
  },
  "configSource": "src/profiles/relay-data-classification/review-context-config.json",
  "criticalProgramPaths": [
    ".node-version",
    "imports/dpv/dpv-2.3.ttl",
    "imports/dpv/pd-2.3.ttl",
    "imports/w3c/prov-o.ttl",
    "package-lock.json",
    "package.json",
    "pyproject.toml",
    "scripts/curate-classifications",
    "scripts/validate-classification-review-context.py",
    "src/modules/classification-review-context/engine.cjs",
    "src/modules/classification-review-context/ontology-owl.ttl",
    "src/modules/classification-review-context/ontology.ttl",
    "src/modules/classification-review-context/queries/action-evidence-needed.rq",
    "src/modules/classification-review-context/queries/materialize-standing.rq",
    "src/modules/classification-review-context/queries/pending-review.rq",
    "src/modules/classification-review-context/queries/pipeline.json",
    "src/modules/classification-review-context/queries/review-standing.rq",
    "src/modules/classification-review-context/shapes.ttl",
    "src/modules/confidence/ontology-owl.ttl",
    "src/modules/confidence/ontology.ttl",
    "src/modules/data-classification/ontology-owl.ttl",
    "src/modules/data-classification/ontology.ttl",
    "src/modules/data-classification/shapes.ttl",
    "src/profiles/relay-data-classification/generate.mjs",
    "src/profiles/relay-data-classification/review-context-config.json",
    "src/profiles/relay-data-classification/shapes.ttl",
    "uv.lock"
  ],
  "materializerSource": "src/modules/classification-review-context/queries/materialize-standing.rq",
  "ordinaryContract": {
    "canonicalContext": {
      "allValues": "Candidate extraction uses all distinct sorted lexical values for label/comment/alternateName, joins them deterministically; preferred namespace subject/prefix must be unique, not favorable-first. Context retains all typed values.",
      "dependencyTraversal": "Start selected scoped property. Preserve every outgoing predicate/object typed/language term for every visited subject. Follow every blank object recursively and only configured namedDependencyPredicates into existing subjects inside the same sourceNamespace. Sort named descriptions by IRI and predicate; recursively sort blank-tree descriptions without labels; preserve repeated distinct blank branches. Named cycles visited once, blank cycles and blank nodes with multiple incoming edges anywhere in the source are unqualified. Bounds explicit; missing referenced external named resource remains its exact IRI.",
      "keys": [
        "provider",
        "sourceNamespace",
        "predicate",
        "metadata",
        "versions",
        "contextDefinition",
        "dependencies",
        "useFacts",
        "candidate"
      ],
      "literals": "Decoded literal value plus exact datatype/language; no lowercase/literal trim/number conversion. RDF graph set semantics deduplicate identical named triples; distinct same-content blank trees remain distinct.",
      "providerMetadata": "Only complete declared selected metadataKeys, sorted canonical JSON; generated output-byte hashes stay custody evidence. versions.ttl: complete typed RDF graph canonicalized with bounded blanks, absence explicit. JSON-LD selected actual type scoped definition, not a caller alias.",
      "representation": "Dependencies are sorted [{subject:IRI,properties:[{predicate:IRI,objects:[typed term]}]}]. Terms: {kind:iri,value}, {kind:literal,value,datatype,language}, {kind:blank,properties}. All strings/typed literals retain exact meaning; blank labels excluded. Semantic digest is sorted compact UTF8 JSON+LF SHA256.",
      "scopedContext": "Inspect every type-scoped definition in one unconditional expanded-id pass. Preserve exact typeKey/fieldKey wire aliases; expand typeId and definition @id/@type or string IRI against the retained prefix map. Equivalent compact/absolute identifiers preserve meaning, while altered type/field wire aliases change it. No first favorable definition selection.",
      "unqualified": "contextSupported false with complete finite reason and retained candidate, no approved authority or fabricated digest equivalence; no random blank labels."
    },
    "errors": [
      "ReviewProgramChanged",
      "SourceChanged",
      "InvalidReviewOffer",
      "InvalidApprovalRegistry",
      "SnapshotStale",
      "InvalidSource",
      "InvalidResult"
    ],
    "generatedIndex": {
      "curatorTrust": "--snapshot path and --snapshot-sha256 external caller anchor mandatory; default path allowed only with external anchor. Caller obtains/pins actual CI artifact, no adjacent self-seal counted as authority. Curator captures source + generated profiles + decisions + registry current bytes/modes nonblocking before stats/record. Strict stale SnapshotStale before any mutation, independent action axes unchanged.",
      "generatedModes": "All output hash bindings include independently captured executable modes; generated index excludes only its own bytes/mode from output self-hash.",
      "offers": "--record-offer PREDICATE --provider PROVIDER --decision confirm|reject --reviewer NAME --snapshot PATH --snapshot-sha256 SHA --source-root TREE --decisions PATH saves a context-bound unanchored intent. Preserve all legacy/offers; identical retry does not erase history; after save old snapshot is stale until CI regeneration.",
      "required": [
        "schema",
        "agentPolicy",
        "sourceFiles",
        "sourceModes",
        "decisionsPath",
        "decisionsSha256",
        "decisionsExecutable",
        "registryPath",
        "registrySha256",
        "providerReports",
        "generatedFiles",
        "generatedModes"
      ],
      "schema": "classification-review-index/1",
      "sourceFiles": "Exact declared postpublication source closure byte/mode hashes, obtained from precomputed catalog/XML bytes; all providerReports sourceFiles/sourceModes and carrier sourceFrameDigest bind the same postframe. generatedFiles/generatedModes bind every generated profile. The index excludes its own bytes/mode. Preinput custody remains in the held session/library publication receipt separately so persistent snapshot bytes stay deterministic and have no self-hash cycle."
    },
    "generatorOptions": {
      "--approval-registry": "physical independently admitted registry, optional",
      "--approval-sha256": "external caller SHA256 required whenever registry supplied",
      "--context-report": "one discovered provider JSON report, no output mutation",
      "--decisions": "physical v1/v2 decisions input, defaults actual empty retained curation file",
      "--python": "qualified locked Python executable for the captured generic SHACL validator",
      "--source-root": "absolute requested physical tree, default authenticated entrypoint root"
    },
    "library": "Authenticated generate.mjs exports async runGenerator(options,{beforePublish}). The generic optional callback runs exactly after all output precomputation/validation and before held-source recheck/publication. It never changes domain standing and no environment variable selects a hook.",
    "ordinaryPreservation": "Independent original all16 protected profile candidate/key/rule/target census must be retained on the actual original source corpus, with stable old classification/element IRIs and exact existing candidate targets. New all-values behavior may add pending candidates; any deliberate displacement needs separately reviewed explicit source acceptance instead of weakening this frozen census.",
    "publisher": "All-provider ordinary generation computes every output and validates actual carrier/output before mutation, then holds/rechecks physical input identities at each output boundary. Preserve exact all bytes outside declared catalog/XML blocks and ordered XML aliases. No symlink/FIFO/directory/hardlink/mode ambiguity and no unowned output mutation. Generation is CI-only; curator never launches Node/generation.",
    "registry": {
      "criticalPrograms": "Exact closed map path->{sha256,executable}, sorted compact JSON+LF digest. Authenticate external registry SHA256, physical kind/mode, strict duplicate-key JSON and this complete frame before compiling captured requested helpers.",
      "offers": "Closed unique id->immutable offerDigest map. Missing/mismatched admitted offer refuses InvalidApprovalRegistry; unknown/missing/source-changed/duplicate paths or mode mismatch refuses before compilation. No registry means unanchored, no human/current-provider truth claim.",
      "required": [
        "schema",
        "programDigest",
        "criticalPrograms",
        "offers"
      ],
      "schema": "classification-review-approval-registry/1"
    },
    "report": {
      "fieldRequired": [
        "provider",
        "predicate",
        "path",
        "semanticDigest",
        "programDigest",
        "canonicalContext",
        "contextSupported",
        "standing",
        "classificationStatus",
        "requiresReview",
        "category",
        "sensitivity",
        "historicalOffers",
        "authorizationStanding",
        "ownershipStanding",
        "consentStanding",
        "payloadStanding",
        "humanActivityVerified"
      ],
      "historicalOffers": "Preserve all legacy entries as {version:1,provider,predicate,record:exact original full decision body}, followed by exact immutable v2 offer bodies in retained offer order. Each legacy HistoricalReview retainedRecord is canonical JSON+LF of that complete wrapper including note and nested reviewer fields. Neither record ordering nor count replaces exact retained bodies.",
      "humanActivityVerified": false,
      "losslessCarrier": "Actual current RDF has exactly one canonicalContext string matching canonical JSON+LF, and sourceFrameDigest matches the complete physical source frame. Every original historical/offer RDF record has exactly one retainedRecord canonical JSON+LF; whole actual retained carrier and named-plane inventory remain available. No imported source can assert generated approvalMatched authority.",
      "readerIds": [
        "review-standing",
        "pending-review",
        "action-evidence-needed"
      ],
      "required": [
        "provider",
        "agentPolicy",
        "programDigest",
        "sourceFiles",
        "sourceModes",
        "fields",
        "carrier",
        "derived",
        "readers"
      ],
      "schema": "classification-review-report/1"
    },
    "reviewOffer": {
      "decision": [
        "confirm",
        "reject"
      ],
      "decisions": "Retained immutable v1 history map, never reclassified as anchored",
      "digest": "SHA256 UTF8 sorted compact JSON+LF of complete offer body excluding offerDigest; unknown keys rejected; finite numbers only and duplicate JSON keys rejected. supersedesDigest pins the exact immutable target body identity.",
      "offers": "All immutable unique IRI-keyed offer records; missing candidate/provider refuses",
      "required": [
        "id",
        "provider",
        "predicate",
        "scope",
        "reviewedSemanticDigest",
        "reviewedProgramDigest",
        "decision",
        "category",
        "sensitivity",
        "reviewer",
        "reviewedAt",
        "supersedes",
        "supersedesDigest",
        "offerDigest"
      ],
      "supersession": "null/null or exact extant same-key/purpose id and target digest, acyclic; neither id nor edge refresh inherits registry admission.",
      "version": 2
    },
    "runtimeTrust": "The caller authenticates the executing bootstrap, interpreter and npm-ci/uv-sync-locked dependencies through the configured CI job. Sanitized loader environment has no Node/Python preload/search-path overrides. The closed program identity includes dependency locks and selected runtime version contract; no claim of authenticating an arbitrary replaced binary/dependency/bootstrap.",
    "schema": "classification-review-context-contract/1",
    "trustedBootstrap": "The caller authenticates the generator entrypoint and installed locked runtime. --source-root selects requested data/programs, never executes a foreign entrypoint. Capture requested and trusted critical bytes/modes before helper compilation; exact mismatch refuses ReviewProgramChanged. An arbitrary replaced bootstrap executed directly is outside this boundary."
  },
  "planes": {
    "current": "urn:inferal:classification-review:current",
    "history": "urn:inferal:classification-review:history",
    "offers": "urn:inferal:classification-review:offers"
  },
  "processor": "Captured typed/canonical RDF and physical source transport; domain standing remains in SPARQL.",
  "readerPlane": "validated carrier plus standing; raw provider RDF never supplies generated approval authority",
  "readers": [
    "review-standing",
    "pending-review",
    "action-evidence-needed"
  ],
  "schema": "classification-review-context-pipeline/1",
  "scope": "RetainedSchemaClassificationOnly",
  "sourcePaths": [
    ".node-version",
    "catalog-v001.xml",
    "imports/dpv/dpv-2.3.ttl",
    "imports/dpv/pd-2.3.ttl",
    "imports/relay/amadeus/context.jsonld",
    "imports/relay/amadeus/generation-manifest.json",
    "imports/relay/amadeus/ontology.ttl",
    "imports/relay/amadeus/versions.ttl",
    "imports/relay/chatgptads/context.jsonld",
    "imports/relay/chatgptads/generation-manifest.json",
    "imports/relay/chatgptads/ontology.ttl",
    "imports/relay/chatgptads/versions.ttl",
    "imports/relay/chatgptcommerce/context.jsonld",
    "imports/relay/chatgptcommerce/generation-manifest.json",
    "imports/relay/chatgptcommerce/ontology.ttl",
    "imports/relay/chatgptcommerce/versions.ttl",
    "imports/relay/googleads/context.jsonld",
    "imports/relay/googleads/generation-manifest.json",
    "imports/relay/googleads/ontology.ttl",
    "imports/relay/googleads/versions.ttl",
    "imports/relay/googlehotels/context.jsonld",
    "imports/relay/googlehotels/generation-manifest.json",
    "imports/relay/googlehotels/ontology.ttl",
    "imports/relay/googlehotels/versions.ttl",
    "imports/relay/hyros/context.jsonld",
    "imports/relay/hyros/generation-manifest.json",
    "imports/relay/hyros/ontology.ttl",
    "imports/relay/hyros/versions.ttl",
    "imports/relay/inferal-relay/context.jsonld",
    "imports/relay/inferal-relay/generation-manifest.json",
    "imports/relay/inferal-relay/ontology.ttl",
    "imports/relay/inferal-relay/versions.ttl",
    "imports/relay/klaviyo/context.jsonld",
    "imports/relay/klaviyo/generation-manifest.json",
    "imports/relay/klaviyo/ontology.ttl",
    "imports/relay/klaviyo/versions.ttl",
    "imports/relay/linkedin/context.jsonld",
    "imports/relay/linkedin/generation-manifest.json",
    "imports/relay/linkedin/ontology.ttl",
    "imports/relay/linkedin/versions.ttl",
    "imports/relay/mailchimp/context.jsonld",
    "imports/relay/mailchimp/generation-manifest.json",
    "imports/relay/mailchimp/ontology.ttl",
    "imports/relay/mailchimp/versions.ttl",
    "imports/relay/meta/context.jsonld",
    "imports/relay/meta/generation-manifest.json",
    "imports/relay/meta/ontology.ttl",
    "imports/relay/meta/versions.ttl",
    "imports/relay/microsoftads/context.jsonld",
    "imports/relay/microsoftads/generation-manifest.json",
    "imports/relay/microsoftads/ontology.ttl",
    "imports/relay/microsoftads/versions.ttl",
    "imports/relay/pinterest/context.jsonld",
    "imports/relay/pinterest/generation-manifest.json",
    "imports/relay/pinterest/ontology.ttl",
    "imports/relay/pinterest/versions.ttl",
    "imports/relay/shopify/context.jsonld",
    "imports/relay/shopify/generation-manifest.json",
    "imports/relay/shopify/ontology.ttl",
    "imports/relay/shopify/versions.ttl",
    "imports/relay/triplewhale/context.jsonld",
    "imports/relay/triplewhale/generation-manifest.json",
    "imports/relay/triplewhale/ontology.ttl",
    "imports/relay/woocommerce/context.jsonld",
    "imports/relay/woocommerce/generation-manifest.json",
    "imports/relay/woocommerce/ontology.ttl",
    "imports/relay/woocommerce/versions.ttl",
    "imports/w3c/prov-o.ttl",
    "package-lock.json",
    "package.json",
    "pyproject.toml",
    "scripts/curate-classifications",
    "scripts/validate-classification-review-context.py",
    "src/catalog.ttl",
    "src/modules/classification-review-context/README.md",
    "src/modules/classification-review-context/engine.cjs",
    "src/modules/classification-review-context/examples.ttl",
    "src/modules/classification-review-context/ontology-owl.ttl",
    "src/modules/classification-review-context/ontology.ttl",
    "src/modules/classification-review-context/queries/action-evidence-needed.rq",
    "src/modules/classification-review-context/queries/materialize-standing.rq",
    "src/modules/classification-review-context/queries/pending-review.rq",
    "src/modules/classification-review-context/queries/pipeline.json",
    "src/modules/classification-review-context/queries/review-standing.rq",
    "src/modules/classification-review-context/shapes.ttl",
    "src/modules/classification-review-context/source-qualification.json",
    "src/modules/confidence/ontology-owl.ttl",
    "src/modules/confidence/ontology.ttl",
    "src/modules/data-classification/ontology-owl.ttl",
    "src/modules/data-classification/ontology.ttl",
    "src/modules/data-classification/shapes.ttl",
    "src/profiles/relay-data-classification/README.md",
    "src/profiles/relay-data-classification/generate.mjs",
    "src/profiles/relay-data-classification/review-context-config.json",
    "src/profiles/relay-data-classification/shapes.ttl",
    "uv.lock"
  ]
}
