Repository navigation
Conversation
a370487 to
989b6c5
Compare
33b1193 to
4a62a77
Compare
989b6c5 to
d509711
Compare
Coherence4 spec problems · 0 failing chokepoints · 2 spec gaps · 0 guard failures 44 components, 7 bullets (5 invariants, 2 requirements), 4 problems Spec problems (spec --check)
Chokepoints: none declared. Spec gaps: 2 entrances with outside or unknown trust and no traced control, and 10 more held by the adoption baseline
Close one with |
Node SDK compliance v2Commit: fb9640e Capture v0 — acceptance✅ 28 passed / ❌ 3 non-passing / Drill-down: run artifacts → ❌ server_snapshot_payload_false — failed_assertionExpected native data result Code: Failed step: acceptance/public/evaluate-flags.feature:868 the public snapshot outcomes should have these semantics: ❌ server_snapshot_payload_zero — failed_assertionExpected native data result Code: Failed step: acceptance/public/evaluate-flags.feature:868 the public snapshot outcomes should have these semantics: ❌ server_snapshot_payload_null — failed_assertionExpected native data result Code: Failed step: acceptance/public/evaluate-flags.feature:868 the public snapshot outcomes should have these semantics: Harness exit: 1; report validation exit: 1. Capture v1 — acceptance✅ 28 passed / ❌ 3 non-passing / Drill-down: run artifacts → ❌ server_snapshot_payload_false — failed_assertionExpected native data result Code: Failed step: acceptance/public/evaluate-flags.feature:868 the public snapshot outcomes should have these semantics: ❌ server_snapshot_payload_zero — failed_assertionExpected native data result Code: Failed step: acceptance/public/evaluate-flags.feature:868 the public snapshot outcomes should have these semantics: ❌ server_snapshot_payload_null — failed_assertionExpected native data result Code: Failed step: acceptance/public/evaluate-flags.feature:868 the public snapshot outcomes should have these semantics: Harness exit: 1; report validation exit: 1. Capture v0 — migration✅ 55 passed / ❌ 1 non-passing / Drill-down: run artifacts → ❌ migration/yaml-parity-v1/remote-flags-v1.feature::Omitted GeoIP settings default to enabled in flag requests — failed_assertionFlags field differs Code: Failed step: migration/yaml-parity-v1/remote-flags-v1.feature:134 the first flags request field "geoip_disable" should equal JSON false Operation: Field: Expected: false Actual value: true Harness exit: 1; report validation exit: 1. Capture v1 — migration✅ 120 passed / ❌ 1 non-passing / Drill-down: run artifacts → ❌ migration/yaml-parity-v1/remote-flags-v1.feature::Omitted GeoIP settings default to enabled in flag requests — failed_assertionFlags field differs Code: Failed step: migration/yaml-parity-v1/remote-flags-v1.feature:134 the first flags request field "geoip_disable" should equal JSON false Operation: Field: Expected: false Actual value: true Harness exit: 1; report validation exit: 1. |
d509711 to
f98f32c
Compare
Moves PostHog#5373 (feat/node-emails-code-fields at abeb197) onto the local template slice: both code-form cases take copies, custom headers, tags and attachments, an older server's refusal names the field, and the template form refuses them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
f98f32c to
fb9640e
Compare
95be057 to
da59e27
Compare
Part of the code-first rebuild of posthog-node's email API; replaces PostHog#5373.
Problem
A team moving from Resend sends receipts with a PDF, copies to a shared inbox, and tags for their own analytics. This PR adds
cc,bcc,headers,tagsandattachmentsto the code form, rendered content and local templates alike.Stacks on #7. Needs the server's fields and attachments arms of
send/email/.Impact
Same as the stack: Grow Workflows, billed
workflows_emailsfrom API sends. These fields remove the most common reason a Resend caller cannot switch.Merge Danger
Caution
🔴 Merge risk: high · one-way door (merge-risk rubric)
Changes
invalid_formon that field instead of sending without it. The types refuse them there too.ccandbcc(a string becomes a one-item list),headersandtagsas given,attachmentsas{ filename, content, content_type?, content_id? }with aBufferorUint8Arrayas Base64.path, content that is not aBuffer,Uint8Arrayor string, orattachmentsthat is not a list, asinvalid_attachmentnamedvalidation_errorwithfield: attachments__<n>__....capture_engagementsenttruewhen absent; the five fields join the code form's field set from feat(node): send transactional email from code with emails.send #5.Evidence
posthog.emails.send()on a real client withFakeEmailsApi; the accepted and refused shapes as type tests.BufferandUint8Array; one encoding across retries and the resend after upload; eachinvalid_attachmentandinvalid_formrefusal; no attachment content in an error.d5097112: nodevitest(1340 passed), edge (1340 passed),tsc,oxlint,oxfmt, build, references committed; corevitest.400 invalid_requestnaming the field infield; live check stays a gap.Decisions
No load-bearing decisions.
Involvement: carries the PostHog#5373 review rounds; a fresh HEAD read and a final read on the restack (both clean), no live proof yet.
Release info Sub-libraries affected
Libraries affected
Checklist
If releasing new changes
pnpm changesetto generate a changeset file🤖 Agent context
Autonomy: Human-driven (agent-assisted)
claude-opus-5-5) in Claude Code, as build lane js2 of map Map: send code-managed email templates with one PostHog call posthog#461, directed by Michael. The code comes from the reviewed stack feat(node): send transactional email with the flat SDK contract PostHog/posthog-js#5312, feat(node): send email content from code, uploading local templates by hash PostHog/posthog-js#5371, feat(node): send cc, bcc, headers, tags and attachments with a code send PostHog/posthog-js#5373 and feat(node): read an email's status with emails.get PostHog/posthog-js#5372 (closed; fork copies feat(node): send transactional email with the flat SDK contract #1–feat(node): read an email's status with emails.get #4), restacked code-first. The equality with each reviewed head is checked by diff and listed in the lane ledger.🤖 Generated with Claude Code