Skip to content

feat: complete Skej Pro facets, teams, calendar, and analytics - #24

Merged
CountableNewt merged 8 commits into
devfrom
feature/skej-pro-completion
Aug 31, 2026
Merged

CountableNewt merged 8 commits into
devfrom
feature/skej-pro-completion

Conversation

@CountableNewt

Copy link
Copy Markdown
Contributor

Summary

  • establishes one canonical native-facet contract across TypeScript, Swift, gateway persistence, shadow records, and outbound PDS records, including resolved mention typeahead
  • makes Pro access viewer-scoped and entitlement-aware, with manual actor/team entitlements and audited administration
  • completes team, member, group, brand, grant, invitation, and brand-OAuth lifecycle administration
  • makes public community.lexicon.calendar.event records authoritative and adds the all-account calendar
  • adds 90-day cross-account engagement collection and the accessible multi-line/grouped-bar analytics dashboard

Closes SKJ-1.

Implementation notes

  • migrations are idempotent and fail closed for ambiguous legacy secondary accounts
  • SKEJ_PRO_ENABLED remains the global kill switch and defaults off in Production
  • analytics uses public Bluesky author-feed/post views; combined engagement is likes + reposts + replies + quotes, with bookmarks separate
  • current collector settings are SKEJ_ENGAGEMENT_ENABLED, SKEJ_ENGAGEMENT_INTERVAL_SECONDS, and SKEJ_BSKY_APPVIEW_ORIGIN; legacy aliases remain accepted
  • billing and ICS interoperability remain intentionally out of scope

Verification

  • SkejKit Swift: 15/15 tests
  • Skej gateway: 102/102 tests across 13 suites
  • verified Lexicons: 49/49 tests
  • web: 72/72 tests
  • monorepo lint and typecheck
  • web production build
  • Swift release build via the repository CI script and Command Line Tools; the Xcode-beta optimizer still crashes in unchanged SwiftSoup 2.13.5
  • API and web Docker builds
  • git diff --check, added-secret pattern review, and self-review

Development release gate

Production is unchanged. After the Development deployment, verify multiple real accounts and roles, inspect exact PDS facet/calendar records, compare chart totals with AppView responses, and monitor engagement snapshot growth/failures for at least 24 hours. Production promotion requires explicit approval after that soak.

Risk and migration notes

  • secondary accounts with ambiguous legacy ownership will require reconnecting
  • brand grants may allow analytics reads, but publishing and calendar writes require an authorized brand OAuth connection
  • authoritative calendar records deliberately block publication when missing or invalid
  • automated unit/component coverage is complete for the implemented contracts; real browser touch/keyboard behavior and live multi-account data remain part of the Development verification gate

Adds viewer-scoped access, manual entitlements, team lifecycle operations, authoritative calendar records, native facet validation, and cross-account engagement collection behind the global Pro kill switch.
Unifies UTF-8 link, mention, and tag behavior across editor previews and native projection, adds resolved mention typeahead, and rejects malformed explicit facets instead of silently repairing them.
Adds shared authenticated navigation, account reconnect and default controls, team lifecycle management, invitations, brand grants, and authorized actor or team entitlement administration.
Publishes metadata-only AT calendar records before schedule projections and replaces the selected-account modal with a URL-filtered calendar across every accessible account.
Adds entitlement-scoped multi-line trends, grouped engagement bars, URL-backed filters, coverage notices, and a semantic table over all accessible accounts.
Covers viewer isolation, entitlement and invitation lifecycles, UTF-8 facets, event-first calendar reconciliation, AppView batching and deltas, typed XRPC routes, and exact outbound PDS records.
Falls back to the canonical Skej origin when container build arguments are empty or malformed so production page-data collection remains deterministic.
Makes the planned SKEJ_ENGAGEMENT_ENABLED, SKEJ_ENGAGEMENT_INTERVAL_SECONDS, and SKEJ_BSKY_APPVIEW_ORIGIN names authoritative while retaining compatibility aliases.
@linear-code

linear-code Bot commented Aug 31, 2026

Copy link
Copy Markdown

SKJ-1

@CountableNewt
CountableNewt merged commit c4900f7 into dev Aug 31, 2026
5 checks passed
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