Repository navigation
Conversation
a370487 to
989b6c5
Compare
5e040ec to
03baabd
Compare
989b6c5 to
d509711
Compare
03baabd to
f08bfdb
Compare
Node SDK compliance v2Commit: 8d8d65b 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. |
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 |
d509711 to
f98f32c
Compare
f08bfdb to
5539cb1
Compare
Moves PostHog#5372 (feat/node-emails-get at fc5dc17) onto the code fields slice. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`.` and `..` survive `encodeURIComponent`, and URL parsing would resolve them to a route other than the email's status. They now return `invalid_message_id` before any request. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
f98f32c to
fb9640e
Compare
5539cb1 to
8d8d65b
Compare
Part of the code-first rebuild of posthog-node's email API; replaces PostHog#5372.
Problem
After a send, a server wants to know whether the email went out, bounced or was dropped, without a webhook. This PR adds
posthog.emails.get(id), which reads an email's status by theidthatsendreturned.Top of the stack, on #8. Needs the server's email status read.
Impact
Same as the stack: Grow Workflows. A status read is part of the Resend surface a caller expects before switching.
Merge Danger
Warning
🟠 Merge risk: medium · one-way door (merge-risk rubric)
Changes
emails.get(id)readsGET /api/projects/@current/messaging/emails/{id}/on the app host with the secret key, the id as one encoded path segment.{ data: { id, status, createdAt, statusAt, reason? }, error: null }or{ data: null, error }, with the same error names assend.404 not_foundfor its first seconds; the docs say so, and thatstatusis not Resend'slast_event.missing_secret_key,missing_app_host,client_disabled,client_closed, andinvalid_message_idfor an empty id or one that can't be encoded.capture_engagementdefault below it.Evidence
posthog.emails.get()on a real client withFakeEmailsApi, which keeps each sent email's status.f08bfdb4: nodevitest(1356 passed), edge (1356 passed),tsc,oxlint,oxfmt, build, references committed; corevitest.Decisions
No load-bearing decisions.
Involvement: carries the PostHog#5372 review rounds; a fresh HEAD read (1 fixed:
.and..ids are refused before any request) and a final read (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