Extension points

ExtensionAPIUse when
Presetregister_presetYou want reusable defaults for a contract pattern.
Source resolverregister_source_resolverYou need to read a new source type.
Write moderegister_write_modeYou need a new target write semantics.
Quality ruleregister_quality_ruleYou need a reusable rule beyond built-ins.
HooksIngestionHooksYou need controlled custom logic around ingestion.

Source resolver example

from contractforge import SourceResolution, register_source_resolver

def resolve_custom_source(spec, spark):
    df = spark.read.format("json").load(spec.path)
    return SourceResolution(
        dataframe=df,
        metadata={"source_connector": "custom_json"},
        capabilities={"batch": True},
    )

register_source_resolver("custom_json", resolve_custom_source)

Design rules

  • Do not add dataset-specific branches to core modules.
  • Return redacted operational metadata.
  • Keep source resolvers focused on reading, not business shaping.
  • Prefer declarative configuration over hidden conventions.
  • Add tests at the lowest layer that proves the extension contract.