Skip to content

feat(channels): email thread follow on Aurinko with keyed participant proofs, dormant behind nyxbot:thread-follow (0.59.0) - #1763

Merged
chronoai-kai merged 11 commits into
mainfrom
feat/channel-thread-follow-email
Oct 4, 2026
Merged

chronoai-kai merged 11 commits into
mainfrom
feat/channel-thread-follow-email

Conversation

@chronoai-kai

Copy link
Copy Markdown
Contributor

Summary

T1 PR E: email threads on Aurinko become followable, dormant behind nyxbot:thread-follow (default off).

  • Addressing: a thread is followed after an explicit To: of the connected mailbox (MailboxTo), or a reply verified against a retained NyxID message (VerifiedReply). Email partitions share one thread across participants.
  • Guest privacy: history includes a message only when the requester's keyed HMAC-SHA256 fingerprint (email-participant domain) is among that message's participant fingerprints. No recipient addresses are persisted.
  • Policy: email uses the existing private-chat sender gate (private_chats = everyone for guests). Conflicting legacy sender settings for one thread refuse with a reconcile message rather than picking one.
  • Replies: in-thread replies keep Aurinko's send-attempt barrier through send_bound_thread_reply.

Backward compatibility

  • Aurinko inbound and callback shape is unchanged: reply_to_platform_message_id stays None. The only addition is a raw_data.email block, which is omitted when the audit key is unavailable, leaving the legacy message intact.
  • Private DMs on adapters without private_thread (Telegram etc.) keep a zero-DB-read exit, decided from adapter capabilities before any flag or thread lookup.
  • Existing bindings whose source message has no thread facts validate with the previous eligibility rule.
  • ThreadCapabilities.private_thread is omitted unless true, so /channel-platforms output changes only for Aurinko.
  • The new ThreadAddress variants fall back to the existing serde(other) default on older replicas.

Validation

  • Implementer: 263 tests at each stack size (default and RUST_MIN_STACK=1572864); cargo +1.98.1 clippy --all-targets -D warnings; fmt.
  • Reviewer: two review rounds. Round 1 replaced unkeyed SHA-256 with keyed HMAC. Round 2 fixed the DM fast path, the missing-key fallback, the legacy reply_to value, the eligibility fallback and the HMAC wording.
  • Wizard bundle freshness passes.

chrono-kw added 10 commits October 4, 2026 07:39
…es with bounded history, dormant behind nyxbot:thread-follow (T1 A+B)
…th owner controls and UI, behind nyxbot:thread-follow (T1 C)
…ollow-c

# Conflicts:
#	Cargo.lock
#	backend/Cargo.toml
#	cli/Cargo.toml
#	cli/src/wizard/bundle-meta/index.hash
#	frontend/package-lock.json
#	frontend/package.json
…t proofs, dormant behind nyxbot:thread-follow (T1 E)

Merges origin/main (0.57.0). Aurinko threads become followable after an
explicit To: address or a verified reply; guest history requires the
requester's keyed HMAC participant proof. Legacy Aurinko inbound/callback
shape is unchanged apart from the additive raw_data.email block, private DMs
on other adapters keep a zero-read fast path, and existing bindings keep
their pre-facts eligibility.
…ollow-email

# Conflicts:
#	cli/src/wizard/bundle-meta/index.hash
…ollow-email

# Conflicts:
#	cli/src/wizard/bundle-meta/index.hash
@github-actions

github-actions Bot commented Oct 4, 2026

Copy link
Copy Markdown

📊 Code coverage

Component Lines Threshold Status Δ vs base
Backend (nyxid) 87.05% 73% ✅ 🔻 -0.02
CLI (nyxid-cli) 70.06% 64% ✅ — 0.00
Frontend (vitest) 72.10% 15% ✅ — 0.00

Gate: line coverage must stay at or above the threshold. Ratchet plan (W21): Backend → 55%, CLI → 50%, Frontend → 30% by quarter end.

…ollow-email

# Conflicts:
#	cli/src/wizard/bundle-meta/index.hash
@chronoai-kai
chronoai-kai merged commit 0e2fe06 into main Oct 4, 2026
36 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant