Skip to content

Conversation

@BaiyuScope3
Copy link
Collaborator

@BaiyuScope3 BaiyuScope3 commented Jan 7, 2026

catch 2.6.x up with latest main updates

BaiyuScope3 and others added 30 commits January 5, 2026 20:00
chore: sync v2.6-rc docs from 2.6.x branch
* Add member search, introduction emails, and analytics

Features:
- search_members tool for Addie to find member organizations
- request_introduction tool to send introduction emails via Resend
- Member search analytics tracking (impressions, clicks, introductions)
- Admin analytics endpoint and Addie tool for viewing search analytics
- Improved member profile search to include offerings and tokenize queries

Security:
- Event delegation for member card clicks (no inline onclick)
- Email validation for introduction requests
- Subject line sanitization for introduction emails

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Fix migration version conflict (141 -> 142)

Renamed member_search_analytics migration from 141 to 142 to avoid conflict
with 141_fix_feed_email_slugs.sql on main branch.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
- Public API: Include 'completed' events when querying past events (?past=true)
- Addie: Rename list_upcoming_events to list_events with include_past option
- Registration: Match by email in addition to workos_user_id

This allows Luma-imported registrations (which only have email) to be
associated with users who later sign up with the same email.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
#628)

* Skip welcome goals for highly engaged users

The outbound planner was suggesting the "Welcome - What Brings You" goal
to users who are clearly already engaged with the community (e.g.,
committee leaders, working group members). These users don't need to be
asked what brings them here.

Added eligibility check to skip intro goals for users who show any of
these engagement indicators:
- Committee leader status
- Working group membership
- Council membership
- 10+ Slack messages in the last 30 days

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Add passive note extraction from public channels

Two improvements to how Addie understands members:

1. Enriched LLM context in outbound planner:
   - Role in Community now prominently shows Committee Leader, Council Member, WG Member
   - Notes from channel conversations displayed separately for context
   - Removed duplicate committee leader from capabilities section

2. Passive note extraction from public channels:
   - New 'note' insight type for storing interesting tidbits as text
   - Watches all public channels Addie is in
   - Rate-limited queue (5s between LLM calls) to avoid API overload
   - Only extracts notable statements (interests, what they're building, opinions)
   - Stores as observations with medium confidence

Example flow:
Christina posts "I'm really interested in doing more with user data"
→ Extracted note: "Mentioned being interested in doing more with user data (in #wg-creative)"
→ Shows in planner context: "Notes from Channel Conversations: - Mentioned being interested..."

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Fix duplicate migration version number

Rename 141_note_insight_type.sql to 142_note_insight_type.sql since
141_fix_feed_email_slugs.sql already exists on main.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Fix migration version conflict (142 -> 143)

Rename note_insight_type migration to 143 since 142_member_search_analytics.sql
was added to main.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
…642)

The company profile modal on the dashboard was getting stuck on "Saving..."
when users selected "Data & Measurement" or "AI & Tech Platforms" because
the backend validation only accepted 5 company types (brand, publisher,
agency, adtech, other) while the frontend offered 7.

Changes:
- Update billing-public.ts and organizations.ts to use centralized
  COMPANY_TYPE_VALUES instead of hardcoded arrays
- Add migration to update database CHECK constraint to accept all types
- Update admin-tools.ts MCP schema enums to use centralized values

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* fix: industry alerts not posting to Slack channels

The `hasAlertedPerspective()` check was blocking articles from being
posted to real Slack channels if they had already been posted to
website-only channels. The function checked if a perspective was
alerted to ANY channel, but the SQL query already handles per-channel
deduplication via the NOT EXISTS clause with channel_id filter.

Changes:
- Remove redundant hasAlertedPerspective() call from processAlerts()
- Remove unused hasAlertedPerspective() function
- Remove unused getPerspectivesToAlert() function (had same bug)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* chore: sync package-lock.json version

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Replace filesystem symlinks (v2, v2.5, v1) with dynamic HTTP middleware that resolves version aliases at request time. This improves Docker compatibility where symlinks can cause issues.

Changes:
- Add version alias middleware that rewrites /v2.5/* → /2.5.1/*
- Fix version matching bug: use semver parsing instead of string prefix matching
- Add caching for version directory listing (60s TTL)
- Add directory redirect middleware to serve /schemas/2.6.0/ → /schemas/2.6.0/index.json
- Add schema discovery endpoint at GET /schemas/ with available versions and aliases
- Remove createSymlink() function from build script

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>
- Add hasRelevantUpcomingEvents() to check if user has relevant events
- Skip "Discover Events" goal when no relevant events exist for user
- Personalize list_events tool to show only relevant events:
  - Events user is registered for
  - Events at industry gatherings they're interested in
  - Events in regional chapters they're members of
  - Major global summits
- Exclude virtual webinars (belong in education goals)
- Prompt users to share location when unknown
- Fix N+1 query in chapter events lookup (single query with unnest)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
…ty parsing (#647)

- Add generic numeric HTML entity decoding (&#8217; etc) using fromCodePoint
- Populate published_at field in addie_knowledge for proper chronological sorting
- Normalize article URLs before storage to prevent duplicates across feeds
- Add migration to backfill published_at and clean up existing duplicates

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
- Add error hook system to Pino logger that captures error/fatal logs
- Create initPostHogErrorTracking() to connect logger to PostHog
- Remove duplicate captureException call in global error handler
- Add rate limiting (100ms) and deduplication (5s window) to prevent flooding
- Use addEventListener instead of window.onerror to not overwrite handlers
- Add try-catch around PostHog client initialization

All logger.error() calls are now automatically captured to PostHog
with module context and stack traces when POSTHOG_API_KEY is configured.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
- Remove engagement_reasons column from queries (computed dynamically, not stored)
- Fix next_step/next_step_due_date references to use org_activities table
- Fix stripe_subscription_status to use correct subscription_status column

These columns were queried from the organizations table but either:
1. Don't exist (engagement_reasons is computed in functions)
2. Are on a different table (next_step fields are on org_activities)
3. Have a different name (subscription_status not stripe_subscription_status)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
- Add RSS content validation to detect when feeds return HTML instead of XML
  (e.g., when sites disable their RSS feeds and redirect to homepage)
- Allow NULL feed_url for email-only feeds in database schema
- Update getFeedsToFetch() to exclude email-only feeds (feed_url IS NULL)
- Migrate existing email:// placeholder URLs to NULL

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Two improvements to Addie's conversational behavior in Slack threads:

1. Auto-respond in active threads: When a user replies to a thread where
   Addie has already participated, Addie now responds automatically without
   requiring an explicit @mention. This creates natural conversation flow -
   users can say "Yes please" to Addie's follow-up questions without needing
   to @mention her again.

2. Conversation history for @mentions: Addie now remembers what she said in
   previous @mention interactions. Previously, she only had access to other
   users' messages in the thread (not her own), which caused hallucinations
   where she would confabulate what she had previously said/done.

Implementation details:
- Added checkAddieThreadParticipation() to detect Addie's presence in threads
- Added handleActiveThreadReply() to handle implicit mentions in active threads
- Added conversation history fetching to handleAppMention() for Claude context
- Optimized to reuse thread messages from participation check (single API call)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
…lity (#646)

Changes all schemas from additionalProperties: false to additionalProperties: true. This enables clients running older versions to accept responses from servers with newer schemas without breaking validation - a standard practice for protocol evolution in distributed systems.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>
…654)

This PR addresses an issue where committee leaders were showing as Slack
user IDs (like U0A1RAMRWNS) instead of their names.

Changes:
- Add LEFT JOIN to slack_user_mappings in getLeaders/getLeadersBatch to
  look up names for leaders stored with Slack user IDs
- Add resolveSlackMentions() to convert <@u123> to <@u123|Name> before
  sending to LLM, so Claude/Addie can correctly identify mentioned users
- Update add/remove_committee_leader handlers to auto-resolve Slack IDs
  to WorkOS IDs when possible
- Use more robust Slack ID pattern matching (/^U[A-Z0-9]{8,}$/)
- Escape $ characters in names during replacement to prevent issues

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
- Always show all price tiers (no personalization based on login)
- Company Membership now displays both $10K ($5M+) and $2,500 (Under $5M) tiers
- Industry Council Leader uses "Sign Up Now" button instead of "Contact Us"
- Remove invoice request modal and related code
- All tiers use unified signup flow

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
- Add founding member designation for members who joined before April 1, 2026
- Add is_founding_member column to member_profiles with migration
- Display founding member badge on member cards and detail view
- Fix invoice voiding/deletion to immediately update local cache (don't wait for webhook)
- Add invoice deduplication in Stripe queries to prevent duplicates
- Fix XSS vulnerability in org-index.html dynamic member rendering
- Update AAO homepage with "Go Agentic" section and static founding member logos

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
- Remove JS references to non-existent HTML elements (engagedProspects, trials)
- Move /accounts/view-counts route before /accounts/:orgId to fix 404
- Add early error buffer to capture JS errors before PostHog loads

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
#658)

- Add OpenTelemetry logging integration for PostHog Logs feature
  - New otel-logs.ts module with OTLP HTTP exporter
  - Integrates with Pino logger via setLogHook()
  - Configurable min log level via OTEL_MIN_LOG_LEVEL env var
  - Configurable service name via OTEL_SERVICE_NAME env var
  - Reads version from package.json for accurate version tracking

- Fix client-side JavaScript errors shown in PostHog Error Tracking:
  - admin-prospects.html: Fix quickInvoice() referencing non-existent
    invoice-step elements
  - dashboard.html: Add optional chaining for DashboardNav.showLeadershipNav
    to handle cached JS files

- Performance optimization: Add early return in logger hook when no hooks
  are set to avoid unnecessary argument parsing

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
- Add new Activity tab showing unified activity stream (Slack, emails, events, payments, working groups)
- Fix "Needs Attention" to exclude paying members in good standing
- Fix fire emoji display by removing letter-spacing that broke rendering
- Loosen "Hot Prospects" criteria (engagement >= 50 OR high interest)
- Extend "New Insights" from 7 days to 30 days
- Add source filter validation for security
- Improve escapeHtml to handle quotes
- Add expiring_soon attention badge styling

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Website/app-only changes should not bump the protocol version.
Converted 18 changesets to empty format (---\n---) so they don't
trigger version bumps in adcontextprotocol.

Changes affected:
- Addie bot fixes (DM threading, email linking, role suggestions, etc.)
- Admin UI improvements (clickable username, engagement scoring)
- Documentation fixes (broken links, versioning)
- Various app fixes (daily digest, company validation, login display)

Kept protocol version bumps for actual schema changes:
- allow-extra-fields.md (additionalProperties change)
- error-details-type.md (error.json details property)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix: decode HTML entities in news feed API responses

RSS feeds sometimes contain HTML entities like &#x27; (apostrophe) that
weren't being decoded before being displayed in the API responses.

Changes:
- Create shared decodeHtmlEntities utility in server/src/utils/html-entities.ts
- Apply HTML entity decoding in /api/latest/sections/:slug/articles endpoint
- Apply HTML entity decoding in /api/latest/featured endpoint
- Apply HTML entity decoding in admin feeds route for article titles
- Consolidate duplicate decodeHtmlEntities implementations across codebase
- Add unit tests for the HTML entities utility

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* chore: add empty changeset for HTML entities fix

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
For security, billing notifications should not go to public channels.
This change:
- Only shows private channels in the billing channel dropdown
- Adds server-side validation to reject public channel IDs
- Shows a helpful message when no private channels are found

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Show actual user names instead of raw Slack user IDs in the admin
outreach history table. Joins member_outreach with slack_user_mappings
to fetch display_name/real_name, falling back to slack_user_id if
no name is available.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
- Add collapse/expand button to chat sidebar (like Claude's UI)
- Persist collapsed state in localStorage
- Fix iframe sandbox to allow external links to open in browser
- Add proper ARIA attributes for accessibility
- Add focus-visible styles for keyboard navigation
- Handle localStorage unavailability in private browsing

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Names like "Brian O'Kelley" were causing JavaScript syntax errors when clicking
on user name links because the apostrophe broke the string in onclick attributes.

Added escapeJs() function to properly escape strings for JavaScript contexts and
updated all onclick handlers that include user names to use it.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
The Home button in the Addie chat sidebar was clearing the entire
messagesContainer innerHTML, which destroyed the addieHomeContainer
element that lives inside it. After clearing, trying to show the home
content failed silently because the elements no longer existed.

Changes:
- Add clearChatMessages() helper that selectively removes only .message
  elements instead of wiping the entire container
- Update switchToHome, switchToConversation, and startNewChat to use
  the new helper
- Add proper visibility toggling for addieHomeContainer in addMessage()
  and createStreamingMessage() to ensure home content hides when
  chatting

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Slack-only users (those who haven't signed up for an AAO account) were
showing empty engagement scores in the admin dashboard. This updates the
unified_contacts view to compute scores on-the-fly based on:
- Slack activity (messages, reactions, thread replies) from last 30 days
- Addie conversations and insights from last 30 days

Uses LATERAL joins for efficient single-pass computation.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
bokelley and others added 4 commits January 7, 2026 06:19
…pages (#666)

Fixed two issues reported by David Porzelt on the German chapter page:

1. Duplicate members in chapter lists - Users belonging to multiple
   organizations appeared multiple times due to a SQL JOIN that returned
   multiple rows per user. Fixed by using LEFT JOIN LATERAL with LIMIT 1
   to ensure only one organization membership row per user.

2. Leader actions not working - The /api/config endpoint was not returning
   the user's ID, causing the frontend leader check to always fail since
   currentUser.id was undefined. Added id field to the response.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
- Remove 3 value prop points from hero section (index.html)
- Move Go Agentic section immediately after release banner
- Remove gray mission statement band (org-index.html)
- Tighten hero padding and typography on both pages
- Update Go Agentic prompts to be more actionable
- Add focus states for accessibility
- Standardize prompt hint styling across both pages

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
…on (#668)

- Simplified engagement scoring: 10 points per Slack action + 20 points
  per event (capped at 100). Removed email engagement, conversation score,
  and complex org_activities scoring - these either weren't good signals
  or measured things that were on us to initiate, not the member.

- Fixed working group count to include leaders as implicit members.
  Committee leaders were tracked in working_group_leaders but not counted
  in working_group_count, which only queried working_group_memberships.

- Committee leaders no longer receive "Discover Working Groups"
  recommendations, which was nonsensical for someone leading 3 groups.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Merged 32 commits from main including:
- Schema: Allow additional properties for forward compatibility (#646)
- Schema versioning: Replace symlinks with HTTP middleware (#644)
- Workflow: Add schema sync to versioned docs (#639)
- Addie: Home button fix, sidebar, thread flow improvements
- Admin: PostHog integration, activity feed, engagement scoring
- Slack: User mentions, leader names, channel fixes
- Members: Search, intro emails, founding badge
- Server: Company type validation, HTML entity parsing

Conflicts resolved:
- .github/workflows/sync-versioned-docs.yml: kept main version with schema sync
- package-lock.json: accepted main version
@BaiyuScope3 BaiyuScope3 changed the title Feature/merge main into 2.6.x chore: catch 2.6.x up with latest main updates Jan 7, 2026
Rebuilds 2.6.0 schemas to include the relaxed validation from #646.
All schema objects now allow unknown fields for forward compatibility.
@BaiyuScope3 BaiyuScope3 merged commit 1e3324e into 2.6.x Jan 7, 2026
6 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.

3 participants