Search: ArtifactDocumentBuilder assemble() ATF block (parser + inscription scalars)

Part of #2616, stacked on the nested-objects MR (!1237). It targets that branch, so this diff is only the ATF block.

This is the last field group. AtfParser ports the ATF stage of the Logstash Ruby filter (artifacts.rb:212-285), parsing an inscription's atf string into the seven atf_* fields. It also emits the raw atf/jtf/annotation scalars, which the data layer already fetched but no stage was emitting yet. Pure transform over the same fetchData() bundle, no DB or fetch changes. With it, assemble() produces every field the Logstash filter does.

Most of the diff is fixtures: ~580 lines of code, ~1,800 of input/ + expected/ JSON.

Parity. The comparator gains one rule for the ATF record arrays: they're document-ordered (top to bottom of the tablet), so they're compared in order, normalising only the per-record key order. Plus two small comparator fixes: a witness ": " that over-split one side, and a leading empty-reference that wasn't read as null.

One faithful-port choice. Inline ($…$) notes inside transliteration lines are deliberately not pulled into atf_comments. The Ruby that meant to is a dead no-op, so the current index has none and the builder matches, reviving it would be its own decision.

Tests. Parser unit tests (dispatch order, slice edges, the surface state machine, a multibyte case, a real-corpus smoke test) and two new parity fixtures. The parity test's covered set is now the whole document.

Merge request reports

Loading