Skip to content

Phase 6: guides, compliance fixes, credential checks, release prep - #6

Merged
timimsms merged 1 commit into
mainfrom
phase-6-release
Oct 16, 2026
Merged

timimsms merged 1 commit into
mainfrom
phase-6-release

Conversation

@timimsms

Copy link
Copy Markdown
Owner

Implements Phase 6 of docs/SPEC.md. Stacked on #5 (then #4 to #1). Merge in order. The version is unchanged and nothing is published; cutting 1.0 is left to the maintainer.

What's included

  • Guides in docs/guides, linked from the README:
    • getting started;
    • migrating from direct twilio-ruby calls;
    • migrating from Noticed's twilio_messaging;
    • a compliance primer;
    • writing a provider adapter.
  • Documentation test. It checks that every setting, Smswire constant, and generator named in the README, spec, and guides exists. I confirmed it fails on a planted typo.
  • Smswire.verify_credentials!. It makes one read-only authenticated call per provider: the Twilio account, the Telnyx balance, or the Vonage balance. It's useful for boot checks and health endpoints. It was in spec section 6.8 but no phase had built it.
  • Release prep. RELEASING.md covers one-time trusted-publisher setup, a pre-1.0 checklist, release steps, and recovery. .github/workflows/release.yml runs tests on a v* tag, checks the tag matches the gem version, and publishes with trusted publishing.

Changes from compliance research

Checking current FCC and CTIA guidance for the primer exposed gaps in the shipped defaults:

  • HELP reply. CTIA expects HELP replies to name the brand and a support contact; ours named only the brand. A new support_contact setting is interpolated into the reply. Without one, the reply omits it and a warning is logged.
  • Opt-out confirmation. It now uses CTIA's wording, "will no longer receive any further messages."
  • Keyword matching. It ignores internal spaces and hyphens, so the FCC's "opt out" matches, as does "stop all."
  • opt_out_all_scopes. This setting makes STOP apply to every consent scope, ahead of the FCC revoke-all provision, which is delayed to January 31, 2027.

Bug fixed

The Noticed adapter read wait, queue, and priority from the deliver_by block, but Noticed uses those keys for its own job, so config.wait delayed a message twice. Smswire's job options are now sms_queue and sms_priority, and a test asserts the delay applies once.

Spec

  • Open decisions 4 to 6 are proposed as settled, matching the implementation:
    • phone validation is built in, with phonelib used when present;
    • deliver_now is allowed;
    • MMS is a capability, not a requirement.
  • Known limitations are listed under Phase 6.

Verification

  • 203 tests, 739 assertions, passing on Rails 7.1, 7.2, 8.0, and 8.1.
  • Five consecutive randomized runs pass on Rails 8.1.
  • The three skips are the generated provider skeleton's webhook tests, which it doesn't declare.

🤖 Generated with Claude Code

https://claude.ai/code/session_01L5SuBiSMN4r9qr5CXbKkHV

…se prep

Add guides for getting started, migrating from twilio-ruby, migrating
from Noticed's Twilio method, a compliance primer, and writing a
provider, plus a test that every setting, constant, and generator they
name exists.

Compliance research changed defaults: HELP replies name a support
contact (support_contact), the opt-out confirmation follows CTIA
wording, keywords ignore internal spaces so "opt out" matches, and
opt_out_all_scopes prepares for the FCC revoke-all provision.

Fix the Noticed adapter reusing Noticed's own wait/queue/priority keys,
which delayed a message twice; its job options are now sms_queue and
sms_priority. Implement Smswire.verify_credentials! for Twilio, Telnyx,
and Vonage.

Settle open decisions 4 to 6 as implemented, list known limitations,
and add RELEASING.md and a tag-triggered trusted-publishing workflow.
The version is unchanged; publishing 1.0 is left to the maintainer.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L5SuBiSMN4r9qr5CXbKkHV
@timimsms
timimsms changed the base branch from phase-5-breadth to main October 16, 2026 05:21
@timimsms
timimsms merged commit ab9b415 into main Oct 16, 2026
13 checks passed
@timimsms
timimsms deleted the phase-6-release branch October 16, 2026 05:22
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