<commit_before>Changelog
=========

## vNext

### New Features
- **Commit save concurrency exception handling**
Concurrency exceptions can occur in a race condition where two messages are
 attempting to change the state of an aggregate instance. This can often be
  resolved by simply re-handling the message, which is what the Router now
   does if this exception bubbles up during the save operation.
   This should be safe from endless loops, because if the aggregate's state
   has since changed rendering the message now invalid, a domain exception 
   will be thrown, which is handled elsewhere being an application concern.
- **New index** `{ "_id": 1, "receivers.appId": 1 }` on commits collection to
  optimise commit publishing.
- `projectionRebuilder.rebuild` now returns a response object containing an
  error and result, which the former will be null if no non-fatal errors were
  thrown. The result contains a message and duration property.
-  `ProjectionRebuilder` now logs detailed debug information, and two info
  updates to provide feedback at the desired level.

### Changes
- Commits made in other apps will now only be processed if they contain
   messages with registered handlers in the current app. Prior to every
   commit would be returned by the observer, and then it was decided to
   publish/send, or ignore. This changes the outcome of adding handlers 
   in to existing messages, as it will process all from the start of the store,
   which may or may not be desired. It's up to the application to control this
   but is now more flexible and the system can be brought up to a consistent
   state as if the handlers were in place the whole time. **Consider this<commit_msg>Add 3.1.0 release title to changelog<commit_after>Changelog
=========

## 3.1.0

### New Features
- **Commit save concurrency exception handling**
Concurrency exceptions can occur in a race condition where two messages are
 attempting to change the state of an aggregate instance. This can often be
  resolved by simply re-handling the message, which is what the Router now
   does if this exception bubbles up during the save operation.
   This should be safe from endless loops, because if the aggregate's state
   has since changed rendering the message now invalid, a domain exception 
   will be thrown, which is handled elsewhere being an application concern.
- **New index** `{ "_id": 1, "receivers.appId": 1 }` on commits collection to
  optimise commit publishing.
- `projectionRebuilder.rebuild` now returns a response object containing an
  error and result, which the former will be null if no non-fatal errors were
  thrown. The result contains a message and duration property.
-  `ProjectionRebuilder` now logs detailed debug information, and two info
  updates to provide feedback at the desired level.

### Changes
- Commits made in other apps will now only be processed if they contain
   messages with registered handlers in the current app. Prior to every
   commit would be returned by the observer, and then it was decided to
   publish/send, or ignore. This changes the outcome of adding handlers 
   in to existing messages, as it will process all from the start of the store,
   which may or may not be desired. It's up to the application to control this
   but is now more flexible and the system can be brought up to a consistent
   state as if the handlers were in place the whole time. **Consider this
{'fraction_non_alphanumeric': 0.046579330422125184, 'fraction_numerical': 0.002911208151382824, 'mean_word_length': 4.0087463556851315, 'pattern_counts': {'":': 4, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '46754', 'n_tokens_mistral': 827, 'n_tokens_neox': 800, 'n_words': 518}