This is a public, read-only report. Striff reads this repository's docs, turns each sentence that makes a claim about the code into a rule, and checks the rule against the code on the default branch. How this works
ADR 0010, Title Validator Name Collision Resolution, Summary ValidatorProcessor.calculateValidatorName() , skip-first-token strategy
ValidatorProcessor has a calculateValidatorName method
Holds
Read Oct 2
Term SharedTypeLookup, Definition The interface through which the processor queries the shared type registry before generating a class
SharedTypeLookup is a contract
Holds
Read Oct 2
Term TupleInfo, Definition An enum parameterizing Pair/Triple/Quartet/Quintet by arity, class reference, and accessor names to eliminate tuple code duplication
TupleInfo is an enumeration
Holds
Read Oct 2
Define a BlueprintTypeRegistry SPI (service-provider interface) that can look up a RegisteredType (a decoupled value object with packageName and simpleName) for a given schema signature.
BlueprintTypeRegistry is a contract
Holds
Read Oct 2
The context flows from BlueprintAnnotationProcessor through FieldSpecProcessor, ValidatorProcessor, and DataTypeProcessUtil to every registry lookup call.
BlueprintAnnotationProcessor depends on FieldSpecProcessor
Holds
Read Oct 2
LookupContext.EMPTY provides a no-hints fallback.
LookupContext has EMPTY
Holds
Read Oct 2
The registry also exposes dispatchNestedSerialization() and dispatchNestedDeserialization() methods that composite generators call to recursively process their element types.
2 rules from this sentence
FieldCodeGeneratorRegistry has a dispatchNestedSerialization method
Holds
FieldCodeGeneratorRegistry has a dispatchNestedDeserialization method
Holds
Read Oct 2
Each builder handles one SchemaClassification and produces a complete TypeSpec: Builder ClassConverterBuilder, Classification CLASS, Responsibility Iterates ClassDefinition.getFields() , delegates each field to the registry, assembles toPlutusData() and fromPlutusData() methods
ClassConverterBuilder depends on SerDeMethodBuilder
Holds
Read Oct 2
TupleCodeGenerator generates serialization/deserialization code for any arity by looping over TupleInfo.accessors:
TupleCodeGenerator depends on TupleInfo
Holds
Read Oct 2
ElementCodeGenerator is a @FunctionalInterface that the registry provides as a callback:
ElementCodeGenerator is annotated with FunctionalInterface
Extender DeployValidatorExtender, Provides deploy() only
DeployValidatorExtender has a deploy method
Holds
Read Oct 2
The compatibility method RetryPolicy.isRetryable(Throwable) has no phase information.
RetryPolicy has an isRetryable method
Holds
Read Oct 2
FlowExecutionHandle.await() returns a FlowExecutionResult for every normal terminal outcome.
2 rules from this sentence
FlowExecutionHandle has an await method
Holds
FlowExecutionHandle depends on FlowExecutionResult
Holds
Read Oct 2
Accessor executionId(), Meaning Request correlation and durable lookup identity
FlowExecutionHandle has an executionId method
Holds
Read Oct 2
FlowError.code() is the stable, specific value for program logic.
FlowError has a code method
Holds
Read Oct 2
category() is a coarser dimension for metrics and routing: validation, policy, resource, build, sign, submission, network, backend unavailable, confirmation, rollback, persistence, recovery, cancellation, or internal.
FlowError has a category method
Holds
Read Oct 2
retryable() is advisory context, not permission to submit a replacement transaction.
FlowError has a retryable method
Holds
Read Oct 2
Calling getEventsAfter(cursor) again returns only newer handle events.
FlowExecutionHandle has a getEventsAfter method
Holds
Read Oct 2
With a durable store, use FlowExecutionStore.readEvents(executionId, cursor, limit) for restart-safe consumption.
FlowExecutionStore has a readEvents method
Holds
Read Oct 2
FlowListener is configured with FlowExecutor.withListener(...);
The boolean cancel() method is shorthand for a reasonless request and returns true only for the first accepted signal.
FlowExecutionHandle has a cancel method
Holds
Read Oct 2
Each FlowDiagnostic has a stable code, severity, message, JSONPath-like document path, optional source line/column, and optional step ID.
6 rules from this sentence
FlowDiagnostic has code
Holds
FlowDiagnostic has severity
Holds
FlowDiagnostic has message
Holds
FlowDiagnostic has line
Holds
FlowDiagnostic has column
Holds
FlowDiagnostic has stepId
Holds
Read Oct 2
FlowRecoveryResult reports the reconciled AttemptState, transaction hash, whether this call resubmitted the identical payload, an optional structured error, and newly observed inclusion metadata.
3 rules from this sentence
FlowRecoveryResult has transactionHash
Holds
FlowRecoveryResult has error
Holds
FlowRecoveryResult depends on AttemptState
Holds
Read Oct 2
PlutusBlueprintUtil.getPlutusScriptFromCompiledCode applies the double-CBOR wrapping CCL's PlutusScript.cborHex expects — pass the blueprint hex as-is, never pre-wrap it yourself.
PlutusBlueprintUtil has getPlutusScriptFromCompiledCode
Holds
Read Oct 2
The utxo selection strategy can be changed by providing a custom implementation of UtxoSelectionStrategy interface.
Existing API TxFlow.fromYaml(yaml), Migration target TxFlowCodec.parse(...), Compatibility action Keep as legacy convenience delegate
TxFlow has a fromYaml method
Holds
Read Oct 2
Existing API flow.toYaml(), Migration target TxFlowCodec.write(...), Compatibility action Keep, but fail on semantic loss
TxFlow has a toYaml method
Holds
Read Oct 2
Existing API StepDependency.filter(...Predicate...), Migration target FlowOutputSelector / UtxoFilterSpec, Compatibility action Keep for Java-only flows reject portable encoding
StepDependency has a filter method
Holds
Read Oct 2
Existing API FlowExecutor.create(...).with, Migration target immutable FlowEngine.builder(), Compatibility action Keep through adapter/deprecation window
FlowExecutor has a create method
Holds
Read Oct 2
Existing API executor.execute(flow), Migration target engine.start(FlowExecutionRequest), Compatibility action Generate execution ID for legacy call
FlowExecutor has an execute method
Holds
Read Oct 2
Existing API executor.resume(flow, previousResult), Migration target engine.recover(FlowRecoveryRequest), Compatibility action Retain current best-effort result resume separately
FlowExecutor has a resume method
Holds
Read Oct 2
submit(item) → receipt with a CompletionStage, try-with-resources lifecycle, and progressive disclosure for advanced use.
TxFlowStream has a submit method
Holds
Read Oct 2
TxWorkItem.idempotencyKey is carried but never consumed: redelivery from any real source produces duplicate on-chain transactions.
TxWorkItem has idempotencyKey
Holds
Read Oct 2
P2 — Projection read access (compaction-safe).handleForStoredSnapshot(...) (FlowEngine.java:480-499) returns a completed handle with an empty event list and no step results, so a MATCHED idempotent re-submit after a restart cannot be projected into a meaningful receipt.
FlowEngine has a handleForStoredSnapshot method
Holds
Read Oct 2
FlowRuntime owns one ordinary engine and the resources it creates;
FlowRuntime depends on FlowEngine
Holds
Read Oct 2
TxFlowStream still delegates every execution to that engine:
TxFlowStream depends on FlowEngine
Holds
Read Oct 2
Each planned flow is submitted as a FlowExecutionRequest via FlowEngine.start(...);
2 rules from this sentence
FlowEngine has a start method
Holds
FlowEngine depends on FlowExecutionRequest
Holds
Read Oct 2
Deterministic execution identity (new in 0.3 — required so MATCHED and the write-ahead binding agree).FlowExecutionRequest.executionId defaults to a random UUID, so a redelivered request would carry a different execution id than the one the stream's write-ahead binding recorded — MATCHED would return the stored execution and the binding would point at an execution that never ran.
FlowExecutionRequest has executionId
Holds
Read Oct 2
TxStreamReceipt exposes completion() (CompletionStage<TxStreamItemResult>), executionId(), and an event cursor.
2 rules from this sentence
TxStreamReceipt has a completion method
Holds
TxStreamReceipt has an executionId method
Holds
Read Oct 2
TxFlowStream v2 accepts only engine-compilable items — TxPlan-backed payloads and portable FlowSteps — and validates this eagerly at submit(), failing the item immediately with the portability diagnostic instead of poisoning a whole planned flow at compile time.
TxFlowStream depends on TxPlan
Holds
Read Oct 2
perItem() planner only — one flow per item, one statically configured lane (LanePolicy.single(ResolvedLane)) with mechanical funding-scope enforcement from day one, no custom planners yet.
LanePolicy has a single method
Holds
Read Oct 2
LanePolicy.explicit() with dynamic LaneIdentityResolver resolution and multiple concurrent lanes (alias-sharing and overlap validation per Decision 2).
LanePolicy has an explicit method
Holds
Read Oct 2
Despite its name, FlowRuntime is only an optional, explicit resource-owning composition boundary around the existing engine and stream. It creates and exposes a normal FlowEngine;
FlowRuntime depends on FlowEngine
Holds
Read Oct 2
The decision does not create another transaction execution runtime or status machine, create threads inside FlowEngine or TxFlowStream, auto-enable unsafe batching or durability, hide uncertain outcomes, or weaken any funds-safety invariant established by ADRs 0002–0004. Despite its name, FlowRuntime is only an optional, explicit resource-owning composition boundary around the existing engine and stream.
FlowRuntime depends on TxFlowStream
Holds
Read Oct 2
txflow already has an API dependency on backend, and FlowExecutor.create(BackendService) already establishes the standard mapping.
FlowExecutor has a create method
Holds
Read Oct 2
Add a public TxStreamCodes constants class covering codes emitted by the core txflow module.
TxStreamCodes is exported
Holds
Read Oct 2
TxStreamException.getCode() remains supported.
TxStreamException has a getCode method
Holds
Read Oct 2
runtime.engine() returns that exact underlying instance;
FlowRuntime has an engine method
Holds
Read Oct 2
runtime.open(streamId) builds an ordinary TxFlowStream against the same engine.
FlowRuntime has an open method
Holds
Read Oct 2
graceful close() drains without a default timeout, while close(Duration) bounds the wait.
FlowRuntime has a close method
Holds
Read Oct 2
runtime.open(...) is the discoverable first-hour path and static/builder TxFlowStream.open(...) serves application-owned engines.
TxFlowStream has an open method
Holds
Read Oct 2
trySubmit already provides a non-throwing outcome surface.
EngineTxFlowStream has trySubmit
Holds
Read Oct 2
TxFlow.validate() checks for:
TxFlow has a validate method
Holds
Read Oct 2
Validation runs automatically before execution (executeSync / execute).
On restart, the executor calls findStillConfirmedSteps() to identify which transactions are still on-chain, then skips those steps during re-execution.
FlowExecutor has a findStillConfirmedSteps method
Holds
Read Oct 2
Method getStatus(), Description Current FlowStatus (PENDING, IN_PROGRESS, COMPLETED, FAILED, CANCELLED)
FlowHandle has a getStatus method
Holds
Read Oct 2
Method getCurrentStepId(), Description ID of the step currently executing
FlowHandle has a getCurrentStepId method
Holds
Read Oct 2
Method getCompletedStepCount(), Description Number of completed steps
FlowHandle has a getCompletedStepCount method
Holds
Read Oct 2
Method getTotalStepCount(), Description Total number of steps
FlowHandle has a getTotalStepCount method
Holds
Read Oct 2
Method isRunning(), Description True if status is IN_PROGRESS
FlowHandle has an isRunning method
Holds
Read Oct 2
Method isDone(), Description True if the underlying future is complete
FlowHandle has an isDone method
Holds
Read Oct 2
Method await(), Description Block until complete, return FlowResult
FlowHandle has an await method
Holds
Read Oct 2
Method getResult(), Description Non-blocking get result if available
FlowHandle has a getResult method
Holds
Read Oct 2
Method getResultFuture(), Description Access the underlying CompletableFuture
FlowHandle has a getResultFuture method
Holds
Read Oct 2
Method cancel(), Description Request cancellation (in-progress steps cannot be undone)
FlowHandle has a cancel method
Holds
Read Oct 2
A no-op implementation (FlowStateStore.NOOP) is available for testing.
FlowStateStore has NOOP
Holds
Read Oct 2
For crash-safe execution, use FlowEngine with a FlowExecutionStore.
FlowEngine depends on FlowExecutionStore
Holds
Read Oct 2
For an uncertain disposition the step settles via FlowStepResult.submissionPendingAt(...) — status IN_PROGRESS with the hash retained — never FAILED (a FAILED verdict invites retrying a payment that can still land).
FlowStepResult has a submissionPendingAt method
Holds
Read Oct 2
The legacy FlowResult is then FAILED with an empty getFailedStep(), and listeners receive onStepUncertain/onFlowUncertain instead of the failed callbacks.
Listeners are wrapped in CompositeFlowListener which catches and logs exceptions from individual listeners, preventing buggy callbacks from crashing flow execution.
CompositeFlowListener depends on FlowListener
Holds
Read Oct 2
S->>St: registerItem(record) fail-closed, BEFORE planning
TxFlowStream depends on TxStreamStateStore
Holds
Read Oct 2
S->>E: start(request) with claim-derived executionId
TxFlowStream depends on FlowEngine
Holds
Read Oct 2
E->>X: execute flow
FlowEngine depends on FlowExecutor
Holds
Read Oct 2
FWS -->|trySubmit| Sink[TxWorkSink]
FlowWorkSource depends on TxWorkSink
Holds
Read Oct 2
Path stream/TxFlowStream.java, Role Public interface + builder
2 rules from this sentence
TxFlowStream is a contract
Holds
TxFlowStream is exported
Holds
Read Oct 2
Path stream/EngineTxFlowStream.java, Role Implementation (~5,146 lines)
EngineTxFlowStream is a concrete implementation
Holds
Read Oct 2
Path stream/TxStreamStateStore.java + in-memory impls, Role Stream-side persistence SPI
TxStreamStateStore is a contract
Holds
Read Oct 2
ExecutionJournalSession has two operations with different guarantees: record(type, stepId, hash, data) — appends to the in-memory event list (visible on the handle immediately) and buffers for the next durable append.
ExecutionJournalSession has a record method
Holds
Read Oct 2
FlowEngine wraps it with everything needed to make execution safe to retry and safe to crash:
File (under txflow/src/main/java/.../txflow/ ) exec/DurableExecutionPersistence.java, Role PersistencePort implementation persists the AttemptState lifecycle + transaction journal events under the fence
DurableLeaseGuard owns acquisition and background renewal (on the maintenance executor) for the execution lease and each resource lease, and produces the MutationFence — execution lease + all resource leases as one composite proof.
DurableLeaseGuard depends on MutationFence
Holds
Read Oct 2
persist(state, dataMutation) — flushes buffered events + the snapshot mutation in one fenced append.
S->>St: registerItem(record) — authoritative, BEFORE receipt publication
EngineTxFlowStream depends on TxStreamStateStore
Holds
Read Oct 2
E->>X: execute flow
FlowEngine depends on FlowExecutor
Holds
Read Oct 2
FlowEventType events (EXECUTION_STARTED, TRANSACTION_SUBMITTED, TRANSACTION_CONFIRMED, STEP_COMPLETED, …, RECOVERY_REQUIRED) recorded via ExecutionJournalSession before effects are acknowledged.
5 rules from this sentence
FlowEventType has EXECUTION_STARTED
Holds
FlowEventType has TRANSACTION_SUBMITTED
Holds
FlowEventType has TRANSACTION_CONFIRMED
Holds
FlowEventType has STEP_COMPLETED
Holds
FlowEventType has RECOVERY_REQUIRED
Holds
Read Oct 2
confirmation via ConfirmationTracker (which needs TransactionObservationCapabilities .supportsAuthoritativeAbsence() to distinguish "not seen yet" from "authoritatively absent" for rollback detection).
2 rules from this sentence
ConfirmationTracker depends on TransactionObservationCapabilities
Holds
TransactionObservationCapabilities has a supportsAuthoritativeAbsence method
Holds
Read Oct 2
onExecutionComplete(execution, result, failure):
EngineTxFlowStream has an onExecutionComplete method
Holds
Read Oct 2
Otherwise each member is mapped by memberTerminalStatus(stepResult, flowState) (per-member, step result takes precedence) or templateFlowStatus(flowState) (template items, flow-level):
2 rules from this sentence
EngineTxFlowStream has a memberTerminalStatus method
Holds
EngineTxFlowStream has a templateFlowStatus method
Holds
Read Oct 2
Template projection first checks step and durable-attempt evidence through templateTerminalStatus / templateSnapshotStatus: a CANCELLED flow with any submitted-but-undecided transaction projects RECOVERY_REQUIRED.
2 rules from this sentence
EngineTxFlowStream has templateTerminalStatus
Holds
EngineTxFlowStream has templateSnapshotStatus
Holds
Read Oct 2
All projection writes funnel through project(state, target, mutator, …), which enforces monotonic advancement and store persistence.
The FlowExecutor settlement sites preserve the captured outputs > of the submitted transaction, but StepRunner.uncertainFailure settles with an empty > list.
StepRunner has uncertainFailure
Holds
Read Oct 2
the cancel branch in FlowExecutor's terminal handling returns through cancelledFlowResult(...)before the step-terminal notification runs.
FlowExecutor has a cancelledFlowResult method
Holds
Read Oct 2
Area Definition graph, Package or module com.bloxbean.cardano.client.txflow, Owns TxFlow , FlowStep , legacy dependencies, retry value objects
2 rules from this sentence
TxFlow is in com.bloxbean.cardano.client.txflow
Holds
FlowStep is in com.bloxbean.cardano.client.txflow
Holds
Read Oct 2
NibblePath.EMPTY represents root path
NibblePath has EMPTY
Holds
Read Oct 2
Storage Abstraction - NodeStore interface for pluggable backends
NodeStore is a contract
Holds
Read Oct 2
Hash Functions - Generic HashFunction interface with Blake2b-256 implementation
HashFunction is a contract
Holds
182 rules from 19 docs
See these where the change is. The browser extension puts a pull request's doc findings, and a diagram of what it changed, on the GitHub page itself, so the code and what your docs say about it are side by side.