update docs, especially progress on matching in meetings

This commit is contained in:
2026-03-14 16:21:03 -06:00
parent 5547148aa3
commit 58f52bc73a
5 changed files with 54 additions and 15 deletions

View File

@@ -31,7 +31,7 @@ These repos are found on the local filesystem in the `repos` directory, ie. `../
### Related Documentation ### Related Documentation
- **[Time Safari / Endorser Overview](../../tech/README-time-safari-endorser.md)** - High-level technical overview - **[Time Safari / Endorser Overview](../../tech/README.md)** - High-level technical overview
- **[Endorser.ch API Context](../../tech/README-endorser-context.md)** - Detailed API documentation - **[Endorser.ch API Context](../../tech/README-endorser-context.md)** - Detailed API documentation
- **[Active Projects & Tasks](../../tech/progress/)** - Current technical projects and tasks - **[Active Projects & Tasks](../../tech/progress/)** - Current technical projects and tasks
- **[Strategic Planning](../../docs/)** - Project vision and strategic planning documents - **[Strategic Planning](../../docs/)** - Project vision and strategic planning documents

View File

@@ -181,14 +181,17 @@ Phase 1.4:
- [X] For anyone with the generateEmbeddings flag on their profile: call to OpenAI to get their embedding vector when the flag is set, and also when a profile with that flag is changed. - [X] For anyone with the generateEmbeddings flag on their profile: call to OpenAI to get their embedding vector when the flag is set, and also when a profile with that flag is changed.
- [X] Allow blank value for embedding and hard-code their vector as the "data.empty.embedding" value from the test/embedding-empty-string.json file - [X] Allow blank value for embedding and hard-code their vector as the "data.empty.embedding" value from the test/embedding-empty-string.json file
- [x] Allow organizers with generateEmbeddings flag to select from their list of contacts, and then hit a button to "Check for Profile" that takes them to a screen which will check each of those contacts for a valid profile, one-by-one, and give a report. Each contact should have a link to the DID view so they can see that person's contact info. - [x] Allow organizers with generateEmbeddings flag to select from their list of contacts, and then hit a button to "Check for Profile" that takes them to a screen which will check each of those contacts for a valid profile, one-by-one, and give a report. Each contact should have a link to the DID view so they can see that person's contact info.
- [x] Display on that page the "embedding metadata" much like on the DID view page.
- [ ] Implement matching algorithm - [x] Implement matching algorithm
- [X] Meeting organizer can trigger a pairing session - [X] Meeting organizer can trigger a pairing session
- [ ] Allow attendees to be excluded - [x] Allow attendees to be excluded (ban icon toggle per member; persisted in localStorage scoped to meeting)
- [x] Pairing data is saved in the DB - [x] Pairing data is saved in the DB
- [x] Calculate similarity scores between all pairs - [x] Calculate similarity scores between all pairs
- [x] Create pairing algorithm (maximize total similarity) - [x] Create pairing algorithm (maximize total similarity)
- [ ] Create "do not pair" groups - [x] Create "do not pair" groups (named, color-coded groups; members within a group are never paired)
- [x] Pre-match confirmation dialog showing included members, excluded members, do-not-pair groups, and previous pair count
- [x] "Not Paired" summary after matching shows who was left out and why (individually excluded, do-not-pair group, or odd number)
- [x] Basic matching endpoint - [x] Basic matching endpoint
- [x] POST endpoint for organizer to trigger matching - [x] POST endpoint for organizer to trigger matching
@@ -202,6 +205,21 @@ Phase 1.4:
**Validation:** Organizer can trigger matching, and all attendees can see AI-generated pairs with reasonable similarity **Validation:** Organizer can trigger matching, and all attendees can see AI-generated pairs with reasonable similarity
#### Exclusion & Do-Not-Pair Implementation Summary (Phase 2 + Phase 4 overlap)
**Backend (endorser-ch):** No changes needed. `matchParticipants()` in `matching.service.js` already accepts `excludedDids`, `excludedPairDids`, and `previousPairDids`. The POST `/api/partner/groupOnboardMatch` endpoint passes these through.
**Frontend (crowd-funder-for-time-pwa) files changed:**
- `src/interfaces/user.ts` — Added `DoNotPairGroup` and `MeetingExclusionState` interfaces
- `src/components/MeetingExclusionGroups.vue` (new, ~240 lines) — Standalone component for managing do-not-pair groups. Color-coded group cards with member chips, add/remove controls, and a `disabled` prop for read-only mode when matches exist.
- `src/components/MeetingMembersList.vue` — Added `excludedDids` / `exclusionLocked` props, ban icon toggle per admitted member, `getAdmittedMembers()` method exposed for parent, `members-loaded` emit for parent sync.
- `src/views/OnboardMeetingSetupView.vue` — Orchestration: exclusion state management with localStorage persistence (scoped to meeting), pre-match confirmation dialog, "Not Paired" summary after matching, locking when matches exist, expanded `postNewMatchesThenRefresh()` body with all three constraint fields.
**Key design decisions:**
- Exclusion state persists in localStorage under key `meeting-exclusion-state`, scoped by `meetingGroupId`. Automatically clears when the organizer switches meetings.
- Locking: all exclusion controls become read-only when `hasActiveMatches` is true. "Erase to Start Over" unlocks them.
- `admittedMembers` is a reactive data property (not a computed via `$refs`) populated via the `members-loaded` event from `MeetingMembersList`, avoiding `$refs` timing issues.
--- ---
### Phase 3: Matching UI and Participant Experience ### Phase 3: Matching UI and Participant Experience
@@ -229,13 +247,18 @@ Phase 1.4:
### Phase 4: Multiple Rounds and Constraints ### Phase 4: Multiple Rounds and Constraints
**Goal:** Support advanced matching scenarios **Goal:** Support advanced matching scenarios
- [ ] Exclusion groups - [x] Exclusion groups ("Do Not Pair")
- [ ] UI for organizer to select people - [x] UI for organizer to create named, color-coded groups and assign members
- [ ] Persist exclusion rules across rounds - [x] Persist exclusion rules in localStorage scoped to meeting (auto-clears on meeting change)
- [ ] Exclude non-participants - [x] Groups expand to all DID pairs and are sent as `excludedPairDids` to the server
- [ ] Option to mark organizer or others as excluded - [x] Controls are locked (read-only) while matches exist; unlock on "Erase to Start Over"
- [ ] Ensure excluded people don't appear in matching pool - [x] Exclude non-participants
- [ ] Multiple matching rounds - [x] Ban icon toggle per admitted member to exclude from matching pool
- [x] Excluded members shown with strikethrough and amber styling
- [x] Ban icon always visible; shows notification explaining lock state when matches exist
- [x] Excluded DIDs sent as `excludedDids` in POST body
- [x] "Erase to Start Over" always clickable; shows notification when no matches exist or matching is in progress
- [x] Multiple matching rounds
- [x] Track previous pairs in meeting state - [x] Track previous pairs in meeting state
- [x] Constraint: don't repeat previous pairs - [x] Constraint: don't repeat previous pairs
- [x] Calculate when no more unique pairs possible - [x] Calculate when no more unique pairs possible

View File

@@ -1,6 +1,6 @@
# Endorser.ch Context # Endorser.ch Context
> **Note**: This is technical API documentation. For the overall project vision, see the [main README](../README.md). For the tech ecosystem overview, see [Time Safari / Endorser Tech Overview](./README-time-safari-endorser.md). > **Note**: This is technical design documentation. For the overall project vision, see the [main README](../README.md). For the tech ecosystem overview, see [Time Safari / Endorser Tech Overview](./README.md).
## Project Overview ## Project Overview
Endorser.ch is an API for creating and querying claims in privacy-preserving ways. The system allows users to make cryptographically signed claims (attestations) and confirmations while maintaining control over their personal identifiers' visibility. Endorser.ch is an API for creating and querying claims in privacy-preserving ways. The system allows users to make cryptographically signed claims (attestations) and confirmations while maintaining control over their personal identifiers' visibility.
@@ -58,7 +58,7 @@ There are other features that gather personal data like names and interests and
#### Onboarding Meetings #### Onboarding Meetings
See [the onboarding meetings doc](./README-onboarding-meeting.md). Organizers can create password-protected meetings to register and connect attendees in bulk, then trigger AI-powered profile matching to pair people with similar interests. See [the onboarding meetings doc](./README-onboarding-meeting.md) for details.
## Implementation Goals ## Implementation Goals

View File

@@ -1,6 +1,6 @@
# Onboarding Meeting # Onboarding Meeting
This is a part of the [Gift Economies app](./README-time-safari-endorser.md). This is a part of the [Gift Economies app](./README.md).
This is a tool whereby an organizer can gather a number of attendees into a meeting together, where they can all get registered by the organizer and they can give all others visibility into their activities in the app. The connections are all one-to-one and managed individually, but this is a way to allow the permissions to be done in bulk. This is a tool whereby an organizer can gather a number of attendees into a meeting together, where they can all get registered by the organizer and they can give all others visibility into their activities in the app. The connections are all one-to-one and managed individually, but this is a way to allow the permissions to be done in bulk.
@@ -14,6 +14,20 @@ This is a tool whereby an organizer can gather a number of attendees into a meet
- The system will automatically make the organizer visible to the attendee. - The system will automatically make the organizer visible to the attendee.
## Matching & Exclusions
The organizer can trigger AI-powered pairing of attendees based on profile similarity.
To enable similarity comparisons, admins must enable "embedding" on each user and the user must create their public profile (on the "profile" screen), in any order. These are persistent settings, lasting outside the meeting context.
Before matching, the organizer can:
- Exclude individual attendees from the matching pool (ban icon toggle)
- Create "do not pair" groups so certain people are never matched together
- Review a confirmation dialog showing who will be included, excluded, and grouped
All exclusion settings persist across page reloads (scoped to the current meeting) and lock automatically once matches exist. The organizer clicks "Erase to Start Over" to unlock and adjust. After matching, any unmatched members are listed with the reason they were left out.
## Attendee Steps ## Attendee Steps
- Attendee goes to the meeting link (or finds the meeting and enters the password). Once the organizer allows them in, they see existing people. - Attendee goes to the meeting link (or finds the meeting and enters the password). Once the organizer allows them in, they see existing people.

View File

@@ -8,7 +8,9 @@ Other repos are located in the `repos` directory.
For more details, see: For more details, see:
- [Tech Ecosystem Cursor Rules](../.cursor/rules/tech/README.mdc) - Detailed technical context for AI conversations - [Tech Ecosystem Cursor Rules](../.cursor/rules/tech/README.mdc) - Detailed technical context for AI conversations
- [Endorser.ch API Context](./README-endorser-context.md) - Detailed API documentation - [Endorser.ch Server](./README-endorser-context.md) - Claim-Server design
- [Partner Server](./README-partner-server.md) - Partner-Server design
- [Time Safari Client App](./README-time-safari.md) - Client design
- [Active Projects & Tasks](./progress/) - Current technical projects and tasks - [Active Projects & Tasks](./progress/) - Current technical projects and tasks
Kudos: Kudos: