C# API reference

Spanfold for .NET.

Public C# types and members for recording temporal windows, comparing histories, analysing episodes, exporting evidence, and testing results.

dotnet add package Spanfold --version 0.1.0-preview.2
dotnet add package Spanfold.Testing --version 0.1.0-preview.2

NuGet.org publishes these packages at 0.1.0-preview.2. The repository's 0.2.0-preview.1 release set adds Spanfold.Artifacts as a supported package alongside Spanfold and Spanfold.Testing; Spanfold.Cli remains checkout-only.

static class

Spanfold

Entry point for configuring a Spanfold event pipeline.

MemberPurpose
For<TEvent>()Creates an `EventPipelineBuilder<TEvent>` for the event type.

sealed class

EventPipelineBuilder<TEvent>

Top-level builder for windows, callbacks, event time, and history recording.

MemberPurpose
Window(...)Adds a source window and returns a `WindowPipelineBuilder<TEvent>`.
TrackWindow(...)Builds a pipeline for one state-driven source window.
RecordWindows()Enables recording of open and closed windows during ingestion.
WithEventTime(...)Sets the event timestamp selector.
OnEmission(...)Registers a callback for emitted transitions.
Build()Builds the configured `EventPipeline<TEvent>`.

sealed class

WindowPipelineBuilder<TEvent>

Builder returned after adding a window. It keeps window and roll-up concepts close together.

MemberPurpose
Window(...)Adds another independent source window.
RollUp(...)Adds a parent window derived from child activity.
RecordWindows()Enables recorded history.
WithEventTime(...)Configures timestamps.
Build()Builds the pipeline.

sealed class

EventPipeline<TEvent>

Runtime pipeline that ingests events and exposes recorded history.

MemberPurpose
HistoryRecorded `WindowHistory` for direct queries, annotations, snapshots, and comparison.
MetadataConfigured event type and window hierarchy metadata.
Ingest(event)Processes one event without source context.
Ingest(event, source)Processes one event with source/lane context.
Ingest(event, source, partition)Processes one event with source and partition context.
IngestMany(events)Processes events sequentially.

sealed class

WindowDefinitionBuilder<TEvent>

Defines one state window: key, active predicate, segments, tags, and callbacks.

MemberPurpose
Named(name)Sets the public window name.
Key(...)Selects the logical key that owns state.
ActiveWhen(...)Predicate that keeps the window active.
Segment(name, ...)Adds a boundary-aware segment dimension.
Tag(name, ...)Captures descriptive metadata when a window opens.
OnOpened(...) / OnClosed(...)Registers transition callbacks.

sealed class

SegmentBuilder<TEvent>

Builds segment dimensions, including nested segment hierarchies.

MemberPurpose
Value(...)Selects the segment value from the event.
Child(name, ...)Adds a child segment under this segment.

record

WindowEmission<TEvent>

Represents an emitted window transition from ingestion.

MemberPurpose
WindowName, Key, EventIdentity and source event for the transition.
Kind`Opened` or `Closed`.
Source, PartitionLane and partition context.
Segments, TagsAnalytical context captured with the emission.

abstract record

WindowRecord, OpenWindow, ClosedWindow

Recorded temporal evidence created from emissions.

MemberPurpose
WindowName, Key, Source, PartitionScope identity.
StartPosition, EndPositionProcessing-position bounds.
StartTime, EndTimeTimestamp bounds when event time is configured.
Segments, TagsContext for filtering, grouping, and debug output.
IdStable `WindowRecordId` derived from the window identity.

sealed class

WindowHistory

Recorded open and closed windows plus query, annotation, snapshot, and comparison entry points.

MemberPurpose
ClosedWindows / OpenWindows / WindowsMaterialized recorded history.
Query()Direct read-only history query.
SnapshotAt(horizon)Read-only horizon snapshot.
Compare(name)Starts a staged comparison.
Annotate(...)Append-only late metadata.
CompareSources(...), CompareHierarchy(...)Source matrix and hierarchy explanation helpers.

sealed class

WindowHistoryQuery

Filters recorded history by window, key, source/lane, partition, segment, and tag.

MemberPurpose
Window(...), Key(...), Lane(...)Restrict query scope.
Segment(...), Tag(...)Require context values.
Windows(), ClosedWindows(), OpenWindows()Materialize matching records.
WindowsAt(...), OpenWindowsAt(...)Evaluate at a horizon.
LatestWindow() / LatestWindowAt(...)Return the latest matching record.

sealed class

WindowHistorySnapshot

Read-only view of recorded history at an explicit horizon.

MemberPurpose
HorizonThe point used to evaluate open and closed windows.
Query()Starts a `WindowSnapshotQuery` over snapshot records.

records

WindowAnnotation and WindowAnnotationTarget

Append-only metadata attached after a window opens or closes.

MemberPurpose
Name, Value, KnownAtAnnotation payload and point-in-time safety.
RevisionAppend order for repeated annotation names.
WindowAnnotationTarget.From(window)Stable target based on the window start identity.

sealed class

WindowComparisonBuilder

Staged comparison flow for target, against, scope, normalization, comparator selection, and execution.

var result = pipeline.History
    .Compare("Provider QA")
    .Target("provider-a", s => s.Source("provider-a"))
    .Against("provider-b", s => s.Source("provider-b"))
    .Within(scope => scope.Window("DeviceOffline"))
    .Using(c => c.Overlap().Residual().Missing())
    .Run();
MemberPurpose
Target(...), Against(...)Select comparison sides.
AgainstCohort(...)Compare against a derived cohort side.
Within(...)Set scope.
Normalize(...)Set temporal normalization policy.
Using(...)Select comparator row families.
Prepare(), Run(), RunLive(...)Materialize stages or execute comparison.

sealed class

ComparisonSelectorBuilder

Creates serializable or runtime selectors for target and comparison sides.

MemberPurpose
WindowName(...), Key(...), Source(...)Select by identity.
Sources(...)Select multiple source identities.
Partition(...)Select a partition.
PositionRange(...), TimeRange(...)Select temporal ranges.
Runtime(...)Creates a runtime-only predicate selector.

sealed class

ComparisonCohortBuilder and CohortActivity

Collapses several sources into one derived comparison side before comparators run.

MemberPurpose
Sources(...)Declares cohort members.
Activity(CohortActivity)Sets when the cohort is active.
CohortActivity.Any() / All() / None()Basic activity rules.
AtLeast(n), AtMost(n), Exactly(n)Threshold rules.

sealed class

ComparisonNormalizationBuilder

Makes temporal policies explicit before alignment.

MemberPurpose
RequireClosedWindows()Rejects open windows for historical comparison.
ClipOpenWindowsTo(horizon)Clips open windows to a live horizon.
OnPosition() / OnEventTime()Selects processing-position or timestamp analysis.
KnownAtPosition(...) / KnownAt(...)Prevents future leakage.

sealed class

ComparisonComparatorBuilder

Selects result row families.

MemberPurpose
Overlap()Both sides active.
Residual()Target active without comparison coverage.
Missing()Comparison active without target coverage.
Coverage()Coverage rows and summaries.
Gap(), SymmetricDifference(), Containment()Additional shape and invariant checks.
LeadLag(...), AsOf(...)Transition timing drift and point-in-time lookup.

sealed class

ComparisonResult

Structured comparison artifact containing diagnostics, stages, rows, summaries, finality, and metadata.

MemberPurpose
Prepared, AlignedComparison stages when execution reached them.
OverlapRows, ResidualRows, MissingRowsCore row families.
CoverageRows, GapRows, LeadLagRows, AsOfRowsAdditional row families.
DiagnosticsValidation and execution diagnostics.
RowFinalitiesFinal or provisional status for live rows.
IsValidTrue when no error diagnostics are present.

Spanfold.Episodes ยท .NET preview

Episode builders and extensions

Forms occurrence sets from recorded windows or compares two formed sets.

Public type or memberPurpose
WindowHistoryEpisodeExtensions.FormEpisodes(WindowHistory, string)Starts an EpisodeFormationBuilder.
WindowHistoryEpisodeExtensions.CompareEpisodes(WindowHistory, string)Starts an EpisodeComparisonBuilder.
EpisodeFormationBuilder.From(Func<ComparisonSelectorBuilder, ComparisonSelector>)Selects source windows for one episode set.
EpisodeFormationBuilder.Within(Func<ComparisonScopeBuilder, ComparisonScope>)Sets the named window scope and temporal axis.
EpisodeFormationBuilder.Normalize(Func<ComparisonNormalizationBuilder, ComparisonNormalizationBuilder>)Sets temporal normalization before stitching.
EpisodeFormationBuilder.StitchGapsUpTo(long) / StitchGapsUpTo(TimeSpan)Sets side-local processing-position or timestamp stitching.
EpisodeFormationBuilder.Build(), Run(), RunLive(TemporalPoint)Builds a plan or materializes an EpisodeSet.
EpisodeComparisonBuilder.Target(string, Func<ComparisonSelectorBuilder, ComparisonSelector>)Selects and names the target side.
EpisodeComparisonBuilder.Against(string, Func<ComparisonSelectorBuilder, ComparisonSelector>)Selects and names the against side.
EpisodeComparisonBuilder.Within(Func<ComparisonScopeBuilder, ComparisonScope>)Applies one scope to both sides.
EpisodeComparisonBuilder.Normalize(Func<ComparisonNormalizationBuilder, ComparisonNormalizationBuilder>)Applies one normalization policy to both sides.
EpisodeComparisonBuilder.StitchGapsUpTo(long) / StitchGapsUpTo(TimeSpan)Sets the shared side-local formation tolerance.
EpisodeComparisonBuilder.RelateWithin(long) / RelateWithin(TimeSpan)Sets the cross-side relation tolerance.
EpisodeComparisonBuilder.Build(), Run(), RunLive(TemporalPoint)Builds a plan or materializes an EpisodeComparisonResult.

Spanfold.Episodes

Episode plans and policies

Public typePublic contract
EpisodeFormationPlanName, Selector, Scope, Normalization, and Formation.
EpisodeFormationPolicyConstruct with (TemporalAxis, long stitchToleranceMagnitude); exposes TimeAxis and StitchToleranceMagnitude.
EpisodeComparisonPlanName, side names and selectors, Scope, Normalization, Formation, and Relation.
EpisodeRelationPolicyConstruct with (TemporalAxis, long toleranceMagnitude); exposes TimeAxis and ToleranceMagnitude.

Spanfold.Episodes

Episode domain and relation graph

Public typePublic contract
EpisodeIdDeterministic episode identifier with Value.
EpisodeFragmentWindow, normalized Range, Finality, and RecordId.
EpisodeId, identity fields, TimeAxis, authoritative Fragments, Envelope, Finality, and active, elapsed, and internal-gap magnitudes.
EpisodeSetName, Plan, ordered Episodes, Summary, and optional EvaluationHorizon.
EpisodeRelationKindOneToOne, Split, Merge, Complex, UnmatchedTarget, and UnmatchedAgainst.
EpisodeRelationMetricsActive magnitudes, overlap and coverage ratios, intersection-over-union, minimum gap, and directional timing and magnitude deltas.
EpisodeRelationKind, complete target and against episode lists, Metrics, and Finality.
EpisodeComparisonResultName, Plan, both episode sets, exhaustive Relations, neutral Summary, and optional EvaluationHorizon.

Spanfold.Episodes

Episode summaries and analysis extensions

Public type or memberPurpose
EpisodeDistributionSummaryCount, minimum, mean, median, nearest-rank 95th percentile, and maximum.
EpisodeSetSummaryEpisode and fragment counts, finality, fragmentation rates, and active, elapsed, and internal-gap distributions.
EpisodeComparisonSummaryNeutral target/against match, relation, bias, coverage, overlap, and one-to-one delta metrics.
EpisodeReferenceScorecardExplicit reference/detection counts plus recall, precision, and F1.
EpisodeAnalysisExtensions.RelationsOfKind(EpisodeComparisonResult, EpisodeRelationKind)Returns relation components with one classification.
UnmatchedTargetEpisodes(EpisodeComparisonResult), UnmatchedAgainstEpisodes(EpisodeComparisonResult)Returns the unmatched episodes for one side.
AsReference(EpisodeComparisonResult)Interprets target episodes as references and against episodes as detections.

Live finality is relative to the explicit evaluation horizon. It does not imply watermark or late-record completeness.

static class

ComparisonExportExtensions

Deterministic export helpers for plans and results.

MemberPurpose
ExportJson()Stable JSON for plans or results.
ExportJsonLines()Lazy JSON Lines for result rows.
ExportMarkdown()Deterministic Markdown explanation.
ExportDebugHtml()Self-contained visual comparison document.
ExportLlmContext()Agent-readable JSON with instructions, summary, Markdown orientation, full result data, and row documents.
AuditBundleWriter.Write(...)Atomic, integrity-verifiable audit bundle output in the optional Spanfold.Artifacts package.

readonly record struct

TemporalPoint

Explicit point on a temporal axis.

MemberPurpose
ForPosition(long)Processing-position point.
ForTimestamp(DateTimeOffset, clock)Timestamp point.
CompareTo(...), IsBefore(...), IsAfter(...)Axis-safe comparison helpers.

readonly record struct

TemporalRange

Half-open range used by windows, aligned segments, and result rows.

MemberPurpose
Closed(start, end)Known-ended range.
Open(start)Open range for ongoing windows.
WithEffectiveEnd(...)Clips or evaluates the range at an effective end.
GetPositionLength(), GetTimeDuration()Measures range magnitude.
Overlaps(...), Contains(...)Range predicates.

sealed class

LaneLivenessTracker

Converts sparse observations into liveness signals that can be recorded as ordinary windows.

MemberPurpose
ForLanes(...)Creates a deterministic tracker for expected lanes.
Observe(lane, observedAt)Records that a lane reported.
Check(horizon)Emits silence or recovery signals at a horizon.
LaneLivenessSignalEvent shape for recording silence windows.

Spanfold.Testing sealed class

WindowHistoryFixtureBuilder

Builds compact recorded histories for comparator and contract tests.

MemberPurpose
AddClosedWindow(...)Adds a closed fixture window.
AddOpenWindow(...)Adds an open fixture window.
Build()Creates a `WindowHistory` fixture.

Spanfold.Testing static class

SpanfoldAssert

Framework-neutral assertions for comparison artifacts.

MemberPurpose
IsValid(...)Asserts that a comparison result has no error diagnostics.
HasNoDiagnostics(...)Asserts that no diagnostics were emitted.
HasDiagnostic(...)Returns a matching diagnostic code or fails.
HasRowCount(...)Asserts an expected row count for a named row family.

Spanfold.Testing static class

SpanfoldSnapshot

Snapshot helpers for deterministic JSON and Markdown artifacts.

MemberPurpose
Normalize(...)Normalizes line endings, trailing whitespace, and deterministic record IDs.
AssertEqual(...)Compares two normalized snapshot strings.