recordInvocation

Records one attempt against a running run, on its own child node.

One statement again, and the same shape as save: read the run's status and the attempt's prior outcome and fingerprint, write only if the run is still running and the attempt is not locked as terminal under a different payload — and, per this class's KDoc, only create the node at all once that decision comes back yes. A caller that holds only the attempt never has to hold the header, and this can never overwrite one.

Once the attempt is terminal, only an identical write reaches the row. The incoming record's fingerprint — ExtractionInvocationRowMapper.fingerprint — is compared straight against the string already stored on the node, always computed fresh from the record a caller handed this method; the run's own terminal write follows the identical stored-string, compared-verbatim rule, one level down.

Runs and retries under ownedTransaction — see that method for the two shapes.