Main coves client

feat(richtext): render block-level facets with hardened federated-input handling master

Client-side support for the new block vocabulary in the social.coves.richtext.facet lexicon (blockquote, heading, code, codeBlock), unblocking the renderers-first step of the block-facet rollout: the tidepool bridge must not strip markdown markers until both renderers can display block structure. Facet model now parses all ten feature types (mention, bold, italic, strikethrough, spoiler, blockquote, heading, code, codeBlock, link) and follows the backend's degradation philosophy: unknown $types and known types with invalid attributes render as plain text instead of throwing, and parseFacetsFromRecord drops malformed facets individually so one bad entry never strips rich text from a record. RichTextRenderer rewritten around the lexicon's wire conventions: - Full mode segments text into real blocks: quote bars per nesting level, scaled headings, monospace code cards with language labels and horizontal scroll; malformed mid-line ranges extend to line boundaries (with leading/trailing-newline back-off); cross-type containment (codeBlock inside blockquote) recurses. - Compact mode (maxLines set, feed previews) keeps one Text.rich so ellipsis works, approximating block features as character styles. - Overlapping inline facets compose via style-run splitting instead of being dropped; earlier-starting facet wins taps in an overlap. - Spoilers redact until tapped, with semantics labels so screen readers do not speak concealed text (including inside code blocks). - Mentions navigate to profile/community by DID. Hardening from an 8-stream multi-model review (all Critical/Important findings fixed): - Non-string \$type no longer throws a TypeError past the on-Exception guards (previously a one-poisoned-record stuck-spinner feed DoS); _fetchFeed clears loading flags in a finally and CommentsResponse gained per-item fault isolation. - Mention DIDs validated against DID syntax before any tap handler, closing a verified /profile/../login route-traversal primitive. - Client-side caps mirror the backend sanitizer (200 facets, 20 features/facet) against pre-sanitizer federated records; byte-to-char resolution encodes the text once per resolve and is cached across rebuilds; oversized byteEnd drops the facet instead of styling to end-of-text. Tests: +76 cases across model and renderer suites, including a GoRouter mention-navigation harness, emoji + block-facet offsets, straddling and quote-in-quote degradation, and spoiler/link tap precedence. Full suite: 938 passing; flutter analyze introduces no new findings. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>