Follow-up to #2 (closed). Captures only the work that is actually still pending.
Source-of-truth for "done" is the repo state on main, not prior checklists.
Progress as of 1cca764: Phase 1 + Phase 2 + Phase 3 + Phase 4A + Phase 5A/5B + 5D-CI + Phase 6 quality gates (the parts that do not need live infrastructure) + Wave 11 all shipped. Remaining: Phase 4B (Admin — deferred), Phase 5D regeneration (manual), Phase 6 manual ops (Stripe test mode + Docker build), Phase 7 (launch). See § Closed since this tracker was opened at the bottom for the full receipts.
Phase 1 — gem foundation — DONE
1.5 seams:install
1.6 generic seams:engine
1.7 seams:remove
1.8 CLI commands
Phase 2 — Auth + Notifications
2A Auth — DONE
2B Notifications — DONE
2C integration
Phase 3 — Billing — DONE
3A Billing engine — service-object refactor
3A scope review — decisions taken
3B integration
Phase 4 — Teams + Admin
4A Teams
4B Admin engine — deferred decision
Earlier scope decision: drop the Admin engine, use ActiveAdmin or Avo. No work planned unless the decision is reversed.
4C integration
Phase 5 — infrastructure + reference app
5A CI
5B deployment
5D reference example app
Phase 6 — quality gates
6A full integration test suite
Phase 7 — launch
Wave 11 — PII encryption + GDPR — DONE
Closed since this tracker was opened
| Commit |
Phase / Wave |
Scope |
5dd68c0 |
Wave 11 |
PII encryption + GDPR README |
f920d94 |
Phase 2A finish |
Auth factories + spec coverage |
31c8596 |
Phase 2B (1/3) |
Notifications dummy app + factories + model specs |
ac01613 |
Phase 2B (2/3) |
TypeRegistry + --channels flag |
3367a0b |
Phase 2B (3/3) |
HTML+text mailer variants + bell broadcast spec |
8b452e5 |
Phase 1.7 |
seams:remove drop-table migration |
7e4922b |
Phase 1.5 |
Install gaps (gem + scripts + ARCHITECTURE.md) |
8ea9d69 |
Phase 3 (1/4) |
ServiceResult + StripeService + --gateway + CurrencyHelper + factories + 13 fixtures |
da15c37 |
Phase 3 (2/4) |
5 service objects + 4 new Stripe::Client endpoints |
38a5caf |
Phase 3 (3/4) |
Webhook router refactor — Handler base + EventRouter + ProcessEventJob + 13 handlers |
926db77 |
Phase 3 (4/4) |
Subscriptions/Invoices controllers + gateway contract shared_examples + README |
55ed7ea |
Phase 1.6 |
Generic engine: ApplicationRecord + locales + Gemfile + Rakefile + dummy app |
6b7e181 |
Phase 1.8 |
CLI aggregator + seams:test:changed + seams:quality:all + seams:list deps |
fa89db6 |
Phase 1.7 follow-up |
seams:remove runs bundle install --quiet after removal |
5492a66 |
Phase 2C integration |
rails_new_spec asserts user.signed_up.auth → AuthSubscriber → Notifications::Notification |
a568aca |
Phase 3B integration |
rails_new_spec asserts invoice.paid.billing → BillingSubscriber → Notifications::Notification |
1763da0 |
Phase 4A (1/2) |
Teams --with flag + AccountScoped concern + factories |
656e9b5 |
Phase 4A (2/2) |
Teams views + lifecycle integration verification |
1cca764 |
Phase 5A + 5B + 5D-CI |
Static verification of generated CI YAML + Dockerfile; confirmed seams-example CI exists |
Closed earlier (pre-#5, kept for traceability)
- Auth API tokens (
ApiToken model, GenerateApiToken, ApiAuthenticatable) — Wave 10
- Rate limiting (
SessionsController 10/min, RegistrationsController 5/hr, PasswordResetsController 5/hr) — Wave 10
CleanupExpiredSessionsJob + Auth::ApplicationJob — Wave 10
- Engine registry events:
api_token.issued.auth, api_token.revoked.auth — Wave 10
Follow-up to #2 (closed). Captures only the work that is actually still pending.
Source-of-truth for "done" is the repo state on
main, not prior checklists.Phase 1 — gem foundation — DONE
1.5
seams:installgem "seams"to host Gemfile —7e4922bscript/collate_coverage.rb—7e4922bscript/run_affected_tests.sh—7e4922bdoc/ARCHITECTURE.mdtemplate generated into the host —7e4922b1.6 generic
seams:engineapp/models/<name>/application_record.rb—55ed7eaconfig/locales/en.yml—55ed7eaGemfile—55ed7eaRakefile—55ed7eatest/dummy/(usesDummyAppWriter) —55ed7ea1.7
seams:remove<name>_*tables —8b452e5bundle installafter removal —fa89db61.8 CLI commands
lib/seams/cli.rbtop-level aggregator class —6b7e181seams:listreports inter-engine dependencies —6b7e181(subscribes / depends-on lines parsed from each engine'sPublisher.subscribecalls)seams:test --changed(rake taskseams:test:changed) —6b7e181(resolves merge-base via git, falls back to all-engines on shallow clones)seams:qualityaggregation (rake taskseams:quality:all) —6b7e181(RuboCop + Brakeman + bundler-audit + SimpleCov collation)Phase 2 — Auth + Notifications
2A Auth — DONE
f920d94f920d94f920d94f920d942B Notifications — DONE
Notifications::TypeRegistry—ac01613--channelsgenerator flag —ac01613NotificationMailer—3367a0b3367a0b31c859631c859631c8596+3367a0b3367a0b2C integration
5492a66(integration_full asserts the canonical user.signed_up.auth event creates a Notifications::Notification row via the AuthSubscriber)Phase 3 — Billing — DONE
3A Billing engine — service-object refactor
--gatewaygenerator flag —8ea9d69Billing::ServiceResultvalue object —8ea9d69Billing::StripeServicebase class —8ea9d69Billing::Customers::FindOrCreateService—da15c37Billing::Subscriptions::CancelService—da15c37Billing::Subscriptions::ChangePlanService—da15c37Billing::Subscriptions::ReactivateService—da15c37Billing::Invoices::SyncService—da15c37Billing::Webhooks::EventRouter—38a5cafBilling::Webhooks::ProcessEventJob—38a5caf38a5cafBilling::SubscriptionsController—926db77spec/support/stripe_helpers.rb—8ea9d69spec/fixtures/stripe/events/*.json—8ea9d69(13 fixtures)shared_examples—926db778ea9d69926db77(README walkthrough)3A scope review — decisions taken
Billing::Customermodel — deferred (ref-only).Billing::LineItemmodel — deferred.Billing::Paymentmodel — deferred.Billing::InvoicesController— shipped in926db77.Billing::CurrencyHelper— shipped in8ea9d69.3B integration
a568aca(integration_full asserts invoice.paid.billing → BillingSubscriber → Notifications::Notification(template: billing/invoice_paid))Phase 4 — Teams + Admin
4A Teams
--withgenerator flag (invitations / roles) —1763da0Current.team— pairs with Core'sTenantScoped) —1763da0(Teams::AccountScopedconcern)656e9b51763da0(team / membership / invitation / host User)1763da0+656e9b5(model specs + factories + 12 new generator specs)656e9b5(integration_full asserts Team.create + Membership.create + team.created.teams event in the host)4B Admin engine — deferred decision
Earlier scope decision: drop the Admin engine, use ActiveAdmin or Avo. No work planned unless the decision is reversed.
seams:admingeneratorAdmin::AdminUsermodel +admin_usersmigrationAuth::AdminUseron a separateauth_admin_userstableAdmin::AdministrableconcernAdmin::DashboardControllerAdmin::UsersControllerAdmin::SessionsControllerwith impersonation--with=impersonationflagrole_method,impersonation_enabled)4C integration
defined?()guardsPhase 5 — infrastructure + reference app
5A CI
.github/workflows/ci.ymlis structurally valid —1cca764(parses as YAML, declares the four required jobs, runners pinned to ubuntu-latest, every action pinned to a major version). Realact/ PR run remains a manual one-off check5B deployment
Dockerfilebuilds successfully with multiple engines5D reference example app
seams:engine billing --gateway=stripe,seams:engine notifications --channels=in_app,email,seams:engine teams --with=invitations,roles,seams:engine admin --with=impersonationPhase 6 — quality gates
6A full integration test suite
f920d94(auth_login_flow_spec runs inside the integration_full pipeline via theengines/auth/spec/runtimeglob)3367a0b(notifications_bell_broadcast_spec runs in integration_full via theengines/notifications/spec/runtimeglob, asserts broadcast_to with the right payload)926db77)5492a66(auth signup → Notification) +a568aca(billing invoice → Notification) +656e9b5(team.created → subscriber)seams:listshows correct dependencies —6b7e181(parses each engine.rb for Publisher.subscribe calls and emits depends-on lines)seams:test:changeddetects changes correctly —6b7e181(resolves merge-base via git, falls back to all-engines on shallow clones)seams:quality:allproduces a valid aggregated report —6b7e181(RuboCop + Brakeman + bundler-audit + SimpleCov collation, prints unified summary)1cca764(paired with 5A)1cca764; realdocker buildrequires a Docker daemon)Phase 7 — launch
Wave 11 — PII encryption + GDPR — DONE
Auth::User:encrypts :email, deterministic: true, downcase: true—5dd68c0Auth::OAuthProvider:encrypts :provider_uid, deterministic: true—5dd68c0seams:auth:rotate_pii_encryptionrake task —5dd68c05dd68c05dd68c05dd68c0Auth::ExportUserDataservice for Article 15 / 20 portabilityClosed since this tracker was opened
5dd68c0f920d9431c8596ac01613--channelsflag3367a0b8b452e5seams:removedrop-table migration7e4922b8ea9d69da15c3738a5caf926db77shared_examples+ README55ed7ea6b7e181seams:test:changed+seams:quality:all+seams:listdepsfa89db6seams:removerunsbundle install --quietafter removal5492a66a568aca1763da0656e9b51cca764Closed earlier (pre-#5, kept for traceability)
ApiTokenmodel,GenerateApiToken,ApiAuthenticatable) — Wave 10SessionsController10/min,RegistrationsController5/hr,PasswordResetsController5/hr) — Wave 10CleanupExpiredSessionsJob+Auth::ApplicationJob— Wave 10api_token.issued.auth,api_token.revoked.auth— Wave 10