SENT BACK FOR REWORK. The code works correctly, all the done criteria are met. I return it because of one violation of the rule "one source of truth" in the tests, I was asked directly to assess it, and it is fixed mechanically.
make check in the copy is green: types, linter, 283 tests, build. The formatting of the changed files is clean. I made a mutation check: in the copy I removed the early exit in the announcement, and both tests with an observer of changes failed, so they really check that the area is not rewritten.
Serious remarks.
First. Two helpers in the new set of tests verbatim repeat the helpers from the set "summary explanation". This breaks the rule "one concept is described in one place". The executor's argument that they are local there too does not hold: the second block that needed them is the very reason to raise them to the file level and delete both copies. Then they can be used also in the block about the delete button captions, where adding a participant is now called three times in a row. The observer helper is used in one block, it can stay local.
Second. The search for the announcement area is written twice: in reading the announcement and in the observer. One function at the file level is needed that throws an error if the area is missing. At the same time the silent substitution of an empty string will go away: now if the area disappears the test will fail with an unclear comparison instead of a clear error.
Third. The comment in the summary section promises that a bill with expenses from a link is announced on load, but this is not guaranteed: the area is inserted into the DOM and immediately in the same task changes the text, and many readers do not announce changes of an area they have not had time to register. On hashchange everything works. The code does not need to be changed, the comment must be fixed.
Fourth. The words that the digest is not laid over role alert are true only on load. If on hashchange one goes from a bill with expenses to a broken link, both the alert and the digest will sound, but polite goes into the queue after assertive, and the messages are different. There is no double announcement with the message areas. This is for information, the comment can be refined together with the third point.
Fifth. For two completely identical expenses the captions coincide. The criterion is met for different amounts, the visible rows in such a case coincide too. This is an edge case and a separate fork for the human, it does not need to be fixed in this task.
What is fine: the live area is created together with the section with a non-empty text; hiding by the standard clipping technique, without display none, so the element stays in the accessibility tree; aria-atomic is appropriate; there are no nested live areas; the caption "Remove expense: …" starts with the visible text, WCAG 2.5.3 is respected; the area texts match the criteria; the declension is gathered in one place and covered by a test; the visible interface did not change; there are no secrets or personal data.