Repository navigation
Conversation
Replaces the 501 stubs with the full feature (API Reference → Push Notifications), Phase 2 item 9: - internal/push: APNs (HTTP/2, ES256 provider tokens), FCM HTTP v1 (service-account OAuth), and Web Push (VAPID, RFC 8291 aes128gcm, checked against the RFC's test vector), with cached provider auth, outcome classification, a recording fake, and a log backend - migration 0003: push_credentials, devices, notifications, notification_deliveries (test/live RLS), applications. receives_platform_notifications, notifications.send for superadmin, new audit actions - push credentials (people only, write-only KMS-encrypted key material, generated VAPID keys), device registration (token-keyed upsert, session binding, 20-device cap, token moves between Users), send (access check, push preference, per-recipient limit, 4 KB payload check, deliveries in the same transaction), and the inbox - delivery worker with leases, retries within the TTL, device deactivation on gone tokens, credential failure handling, and push summaries; notification.push_failed / device.* / push_credential.failed webhooks - platform alerts (new sign-in, password and email changes, MFA disabled, token reuse, organization invitation, developer-granted access), raised before any session revocation - devices deactivate on every session revocation, suspension, and deletion; export, erasure cascade, test-data purge, and a daily push-maintenance job - PUSH_BACKEND (live | log); push shares the webhook queue, worker, and sweep - integration tests for every endpoint and outcome, provider protocol tests - docs updated: implementation status, schema counters, DEPLOYMENT, README, PLAN, Changelog Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The first production deploy failed with 'Not authorized to perform sts:AssumeRoleWithWebIdentity': this repository issues immutable subject claims (repo:CompositeCode@38675098/substratalapps.com@1403762290:...), and the plan and deploy roles trusted the name-only form. The subject is now a variable defaulting to the immutable form, which also means a renamed or recreated repository can't inherit the roles. Already applied. Also ignore .claude/settings.local.json. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The first production apply failed: 'Cannot find version 16.6 for aurora-postgresql'. 16.6 has been retired; 16.15 is the newest 16.x, keeping the major version CI and local development test against (postgres:16), and supports the Data API on Serverless v2. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2 of 3 tasks
2 of 3 tasks
Everything in them is either built and documented where it belongs, or consolidated into plan-remaining.md. - infra/README.md: DEPLOYMENT.md's as-built content, next to the Terraform that implements it, plus the real account setup (Projects Organization, the SCP exception for substratal-prod, aws login). The unbuilt sections (growth trajectory, scale-out, MCP scaling, dedicated tenancy provisioning and its migration runbook) moved out; the finished build checklist was dropped. - plan-remaining.md: test-mode User expiry (its migration renumbered to 0005, since 0004 is the protected superadmin), the first-party web pages (dashboard, hosted sign-in), Phase 3, dedicated tenancy infrastructure, growth trajectory, scale-out, MCP scaling, production verification of the phase exit criteria, and the rules for every change. - remaining_manual_steps.md: the one-time steps left to go live (Lambda quota, redeploy, superadmin password, alert emails, SES production access, Stripe, push credentials, registering Applications, the plan-job fix, legal, the optional domain transfer). - ORIGINAL-SPEC-DRAFT.md: fully superseded by the docs site; deleted. - Every link and comment repointed: docs site, README, Terraform, Go. Historical Changelog links point at the last commit that had the files. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
3 of 4 tasks
Retire PLAN.md, DEPLOYMENT.md, ORIGINAL-SPEC-DRAFT.md; add plan-remaining.md and remaining_manual_steps.md
1 of 2 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Release notes
Push notifications (API Reference → Push Notifications) are built. All 17 operations work, and the
501 not_implementedstubs are gone. This is Phase 2 item 9 inPLAN.md.What's in it
internal/push: provider clients, with no database access.aes128gcmencryption. The encryption is verified byte for byte against the RFC's test vector.0003_push.sql(expand-only):applications.receives_platform_notifications;notifications.sendfor superadmin;failed, its owner is emailed, andpush_credential.failedfires.notification.push_failedwhen nothing went out.push-maintenancejob handles stale devices and inbox retention.PUSH_BACKENDislive(production default) orlog(local default).push-maintenanceschedule.No API shape changed, so
openapi.yamlonly loses the "returns 501" note on the Notifications tag.Verification
make checkpasses locally. That covers lint, gen-check, and every unit, integration, and contract test, including the new push suites. Every response in them is validated againstopenapi.yaml. It also covers the Lambda builds andterraform fmt.internal/pushhas provider protocol tests:sentthrough the in-process worker.staticcheckwith CI's check set is clean on new code.Before turning on
livein production: each Application needs its own APNs, FCM, or Web Push credential configured. Until one exists, sends for that app settle asskipped: no_credentials.🤖 Generated with Claude Code