Skip to content

feat: [LC-1442][LC-1522][LC-1484][LC-1465] Self-Assigned Skills + other skill UI updates#1006

Merged
smurflo2 merged 84 commits intomainfrom
lc-1442-self-assigned-skills
Feb 25, 2026
Merged

feat: [LC-1442][LC-1522][LC-1484][LC-1465] Self-Assigned Skills + other skill UI updates#1006
smurflo2 merged 84 commits intomainfrom
lc-1442-self-assigned-skills

Conversation

@smurflo2
Copy link
Copy Markdown
Collaborator

@smurflo2 smurflo2 commented Feb 12, 2026

Overview

🎟 Relevant Jira Issues

LC-1442
LC-1522
LC-1484
LC-1465

πŸ“š What is the context and goal of this PR?

Give users the ability to assign themselves skills from a specific framework. They should be able to click the plus button from the Skills page, select skills they desire, query for skills in the framework with semantic search, include a proficiency level if they so choose, click save, and then those skills should show up on their skills hub. When opening the skill info a special skill card should show up under "issuances" for the self-assigned skills. If the proficiency level was set to anything other than "hidden" it will be displayed on the skill info modal as well.

This PR also updates that skill info modal. Specifically, it adds tabs for the skill info + issuances and puts the framework info + related skills (parent, siblings, and similar) under a Details tab.

Also, when selecting skills, at the bottom of the search results there is a button to suggest a skill (i.e. your search query), which adds a row of data to this Google Sheet (needs an LEF account to view)

πŸ₯΄ TL; RL:

Self-Assigned Skills! And skill UI updates.

πŸ’‘ Feature Breakdown (screenshots & videos encouraged!)

https://www.loom.com/share/4d10ba31b45b47a29a7c827a1e7f2eeb

πŸ›  Important tradeoffs made:

πŸ” Types of Changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Chore (refactor, documentation update, etc)

πŸ’³ Does This Create Any New Technical Debt? ( If yes, please describe and add JIRA TODOs )

  • No
  • Yes

Testing

πŸ”¬ How Can Someone QA This?

  • First, you'll need to put the SKILL_EMBEDDING_GOOGLE_API_KEY in compose-local.yaml
    • You can grab it from Infisical
    • SKILL_EMBEDDING_GOOGLE_API_KEY: ${SKILL_EMBEDDING_GOOGLE_API_KEY:-secretSecretHere}
    • If you don't do this before creating the framework, then semantic search won't work
  • Then you'll need a framework. Upload one (Skills Hub -> Admin Panel (need to have a certain role like dev or admin) -> Create Framework -> Add Skills -> upload JSON). Here's one you can use.
    wef_global_skills_taxonomy_edited.json
  • Then get the id for that framework. e.g. put this in SelfAssignedSkillsModal, then open the modal and grab it from the logs.
    // Replace the id from the LD flag with the following
    // const frameworkId = flags?.selfAssignedSkillsFrameworkId; // https://app.launchdarkly.com/projects/default/flags/selfAssignedSkillsFrameworkId/targeting?env=test&env=production&selected-env=test

    const { data: frameworks } = useListMySkillFrameworks();
    console.log('πŸ”₯πŸ”₯πŸ”₯πŸ”₯πŸ”₯πŸ”₯πŸ”₯πŸ”₯πŸ”₯πŸ”₯πŸ”₯πŸ”₯πŸ”₯πŸ”₯πŸ”₯πŸ”₯πŸ”₯πŸ”₯');
    console.log('frameworks:', frameworks);
    const frameworkId = frameworks?.[0].id;
    console.log('frameworkId:', frameworkId);
  • You can either use it like that or put that framework id in the LD flag
  • Then you'll need the initialSkillIds. I recommend typing anything into the search bar and then logging it with this:
    // put below the useSemanticSearchSkills hook
    console.log(
        JSON.stringify(
            {
                skillIds: (semanticResultsApiData?.records ?? []).map(s => s.id),
            },
            null,
            2
        )
    );
  • Put that in this LD flag. And now you're ready to go.
    • Or you can just hardcode the value of initialSkillIds if you don't want to deal with LD
  • Hopefully it's all pretty intuitive
    • Click the plus button -> Self Assign Skills (there should be no modal for users that don't have the admin panel available)
    • Select some skills, set some proficiency levels
    • The search should return semanticically similar results (e.g. "talking" returns things like "speaking", "asking questions", "multi-lingualism", etc.)
    • If you scroll to the bottom of the search and click "Suggest Skill", your skill suggestion (i.e. your search query) should appear in this google sheet
  • When you save, the skills you selected should show up in your Skills Hub
    • You should not see a "Self-Assigned Skills" credential anywhere in your wallet
  • When you click on a skill, you should see the self attested skill level (unless you set it to hidden) and a special-looking "Self-Assigned" skill card under Issuances
image
  • On the Details tab you should see the framework info (+ skill path + brows framework) and related skills (parent, siblings, and similar)
  • Confirm that you can repeat the process to add/remove skills and edit proficiency levels

πŸ“± πŸ–₯ Which devices would you like help testing on?

πŸ§ͺ Code Coverage

Documentation

πŸ“ Documentation Checklist

User-Facing Docs (docs/ β†’ docs.learncard.com)

  • Tutorial β€” New capability that users need to learn (docs/tutorials/)
  • How-To Guide β€” New workflow or integration (docs/how-to-guides/)
  • Reference β€” New/changed API, config, or SDK method (docs/sdks/)
  • Concept β€” New mental model or architecture explanation (docs/core-concepts/)
  • App Flows β€” Changes to LearnCard App or ScoutPass user flows (docs/apps/)

Internal/AI Docs

  • AGENTS.md β€” New pattern, flow, or context that AI assistants need
  • Code comments/JSDoc β€” Complex logic that needs inline explanation

Visual Documentation

  • Mermaid diagram β€” Complex flow, state machine, or architecture

πŸ’­ Documentation Notes

βœ… PR Checklist

  • Related to a Jira issue (create one if not)
  • My code follows style guidelines (eslint / prettier)
  • I have manually tested common end-2-end cases
  • I have reviewed my code
  • I have commented my code, particularly where ambiguous
  • New and existing unit tests pass locally with my changes
  • I have completed the Documentation Checklist above (or explained why N/A)

πŸš€ Ready to squash-and-merge?:

  • Code is backwards compatible
  • There is not a "Do Not Merge" label on this PR
  • I have thoughtfully considered the security implications of this change.
  • This change does not expose new public facing endpoints that do not have authentication

✨ PR Description

Purpose: Add self-assigned skills feature to Skills Hub enabling users to self-attest skill proficiency levels stored on boost-skill relationships

Main changes:

  • Implemented SelfAssignSkillsModal with semantic skill search, proficiency slider (Hidden/Novice/Beginner/Proficient/Advanced/Expert), and skill suggestion submission
  • Added proficiencyLevel field to ALIGNED_TO relationship between Boost and Skill nodes with database relationship property storage
  • Refactored Skills Hub UI by removing CenteredSubHeader, consolidating skill info display components, and adding related skills carousel with semantic search

Generated by LinearB AI and added by gitStream.
AI-generated content may contain inaccuracies. Please verify before using.
πŸ’‘ Tip: You can customize your AI Description using Guidelines Learn how

Copy link
Copy Markdown
Contributor

@gitstream-cm gitstream-cm Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✨ PR Review

The PR implements a comprehensive self-assigned skills feature with proficiency levels. The implementation is generally well-structured, but there is a critical logic error in the error detection for framework loading.

1 issues detected:

🐞 Bug - The boolean logic is inverted - it checks for loading=true instead of loading=false for the error condition πŸ› οΈ

Details: The errorLoadingFramework condition incorrectly treats the loading state as an error state. The current logic !selfAssignedSkillFramework && selfAssignedSkillFrameworkLoading evaluates to true WHILE the framework is still loading, which will incorrectly display an error message and disable UI buttons during the loading phase. The error state should only be true when loading is complete but no framework was returned.
File: apps/learn-card-app/src/pages/skills/SelfAssignSkillsModal.tsx (239-239)
πŸ› οΈ A suggested code correction is included in the review comments.

Generated by LinearB AI and added by gitStream.
AI-generated content may contain inaccuracies. Please verify before using.
πŸ’‘ Tip: You can customize your AI Review using Guidelines Learn how

Comment thread apps/learn-card-app/src/pages/skills/SelfAssignSkillsModal.tsx Outdated
Copy link
Copy Markdown
Collaborator

@rhen92 rhen92 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @smurflo2, I selected 5 skills to self assign to myself. When I clicked save and went to view the skills, I only saw 3 out of 5 skills show up for me.

Screen.Recording.2026-02-23.at.3.18.15.PM.mov

@smurflo2
Copy link
Copy Markdown
Collaborator Author

@rhen92 Aha! Skill tiers were showing up in the modal, but those don't get displayed in Skills Hub because they're not actually skills, they're just containers. Updated semantic search to exclude tiers and added a safeguard so that SelfAssignedSkilsRow just doesn't display if it's a tier in case anything gets through (e.g. through initialSkillIds)

Copy link
Copy Markdown
Collaborator

@rhen92 rhen92 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@smurflo2 its working great for me now! Nice work! πŸš€

Copy link
Copy Markdown
Contributor

@gitstream-cm gitstream-cm Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✨ PR Review

The PR implements a comprehensive self-assigned skills feature with proficiency levels. The code is generally well-structured, but there's a critical bug in the proficiency level synchronization logic that will prevent external updates to the "Hidden" proficiency level from being applied.

1 issues detected:

🐞 Bug - The falsy check treats 0 (SkillLevel.Hidden) as false, preventing synchronization when proficiency level is set to Hidden πŸ› οΈ

Details: The effect that syncs external proficiencyLevel changes uses a falsy check (if (proficiencyLevel && ...)) which fails when proficiencyLevel is 0 (SkillLevel.Hidden). This prevents external updates to the Hidden proficiency level from being applied to the component's internal state, breaking synchronization for that specific value.
File: apps/learn-card-app/src/pages/skills/SkillProficiencyBar.tsx (203-203)
πŸ› οΈ A suggested code correction is included in the review comments.

Generated by LinearB AI and added by gitStream.
AI-generated content may contain inaccuracies. Please verify before using.
πŸ’‘ Tip: You can customize your AI Review using Guidelines Learn how

Comment thread apps/learn-card-app/src/pages/skills/SkillProficiencyBar.tsx Outdated
Co-authored-by: gitstream-cm[bot] <111687743+gitstream-cm[bot]@users.noreply.github.com>
Copy link
Copy Markdown
Contributor

@gitstream-cm gitstream-cm Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✨ PR Review

The PR implements a comprehensive self-assigned skills feature with proficiency levels. The code is generally well-structured, but there's a minor issue with the error state condition in the SelfAssignSkillsModal that could show a misleading error during initial flag loading.

1 issues detected:

🐞 Bug - Error state is triggered before the query runs, showing misleading error during initialization πŸ› οΈ

Details: The errorLoadingFramework condition evaluates to true before the framework query runs, causing a misleading error message to appear briefly during initial flag loading or when the frameworkId flag is not set. The condition checks !selfAssignedSkillFramework && !selfAssignedSkillFrameworkLoading but doesn't account for when the query is disabled (frameworkId is undefined). This results in showing "Error loading framework" even though no loading attempt was made.
File: apps/learn-card-app/src/pages/skills/SelfAssignSkillsModal.tsx (239-239)
πŸ› οΈ A suggested code correction is included in the review comments.

Generated by LinearB AI and added by gitStream.
AI-generated content may contain inaccuracies. Please verify before using.
πŸ’‘ Tip: You can customize your AI Review using Guidelines Learn how

Comment thread apps/learn-card-app/src/pages/skills/SelfAssignSkillsModal.tsx
@gitstream-cm
Copy link
Copy Markdown
Contributor

gitstream-cm Bot commented Feb 25, 2026

πŸ₯· Code experts: TaylorBeeston

TaylorBeeston has most πŸ‘©β€πŸ’» activity in the files.
TaylorBeeston has most 🧠 knowledge in the files.

See details

apps/learn-card-app/src/components/category-descriptor/CategoryDescriptorModal.tsx

Activity based on git-commit:

TaylorBeeston
FEB
JAN
DEC 19 additions & 11 deletions
NOV 92 additions & 0 deletions
OCT
SEP

Knowledge based on git-blame:
TaylorBeeston: 100%

apps/learn-card-app/src/components/main-subheader/MainSubHeader.tsx

Activity based on git-commit:

TaylorBeeston
FEB
JAN
DEC 1 additions & 2 deletions
NOV 176 additions & 1 deletions
OCT
SEP

Knowledge based on git-blame:
TaylorBeeston: 99%

apps/learn-card-app/src/pages/SkillFrameworks/CompetencyIcon.tsx

Activity based on git-commit:

TaylorBeeston
FEB
JAN
DEC 22 additions & 0 deletions
NOV
OCT
SEP

Knowledge based on git-blame:
TaylorBeeston: 100%

apps/learn-card-app/src/pages/SkillFrameworks/CompetencyRow.tsx

Activity based on git-commit:

TaylorBeeston
FEB
JAN
DEC 211 additions & 0 deletions
NOV
OCT
SEP

Knowledge based on git-blame:
TaylorBeeston: 99%

apps/learn-card-app/src/pages/SkillFrameworks/DeleteFrameworkConfirmationModal.tsx

Activity based on git-commit:

TaylorBeeston
FEB
JAN
DEC 42 additions & 0 deletions
NOV
OCT
SEP

Knowledge based on git-blame:
TaylorBeeston: 100%

apps/learn-card-app/src/pages/SkillFrameworks/FrameworkColumn.tsx

Activity based on git-commit:

TaylorBeeston
FEB
JAN
DEC 644 additions & 0 deletions
NOV
OCT
SEP

Knowledge based on git-blame:
TaylorBeeston: 100%

apps/learn-card-app/src/pages/SkillFrameworks/ManageSkillsCancelUpdateModal.tsx

Activity based on git-commit:

TaylorBeeston
FEB
JAN
DEC 47 additions & 0 deletions
NOV
OCT
SEP

Knowledge based on git-blame:
TaylorBeeston: 100%

apps/learn-card-app/src/pages/SkillFrameworks/SimpleFrameworkAdminDisplay.tsx

Activity based on git-commit:

TaylorBeeston
FEB
JAN
DEC 23 additions & 0 deletions
NOV
OCT
SEP

Knowledge based on git-blame:
TaylorBeeston: 100%

apps/learn-card-app/src/pages/SkillFrameworks/SkillBreadcrumbText.tsx

Activity based on git-commit:

TaylorBeeston
FEB
JAN
DEC 55 additions & 0 deletions
NOV
OCT
SEP

Knowledge based on git-blame:
TaylorBeeston: 100%

apps/learn-card-app/src/pages/login/LoginPage.tsx

Activity based on git-commit:

TaylorBeeston
FEB
JAN
DEC
NOV 335 additions & 13 deletions
OCT
SEP

Knowledge based on git-blame:
TaylorBeeston: 100%

apps/learn-card-app/src/pages/skills/SkillDetails.tsx

Activity based on git-commit:

TaylorBeeston
FEB
JAN
DEC 230 additions & 0 deletions
NOV
OCT
SEP

Knowledge based on git-blame:
TaylorBeeston: 100%

apps/learn-card-app/src/pages/skills/SkillInfoModal.tsx

Activity based on git-commit:

TaylorBeeston
FEB
JAN
DEC 136 additions & 0 deletions
NOV
OCT
SEP

Knowledge based on git-blame:
TaylorBeeston: 100%

apps/learn-card-app/src/pages/skills/SkillsPage.tsx

Activity based on git-commit:

TaylorBeeston
FEB
JAN
DEC 84 additions & 12 deletions
NOV 114 additions & 1 deletions
OCT
SEP

Knowledge based on git-blame:
TaylorBeeston: 94%

apps/learn-card-app/src/theme/variables.css

Activity based on git-commit:

TaylorBeeston
FEB
JAN
DEC
NOV 2136 additions & 0 deletions
OCT
SEP

Knowledge based on git-blame:
TaylorBeeston: 100%

apps/learn-card-app/tailwind.config.js

Activity based on git-commit:

TaylorBeeston
FEB
JAN
DEC 11 additions & 0 deletions
NOV 311 additions & 0 deletions
OCT
SEP

Knowledge based on git-blame:
TaylorBeeston: 100%

apps/scouts/compose-local.yaml

Activity based on git-commit:

TaylorBeeston
FEB 15 additions & 0 deletions
JAN 58 additions & 9 deletions
DEC 1 additions & 1 deletions
NOV 256 additions & 0 deletions
OCT
SEP

Knowledge based on git-blame:
TaylorBeeston: 90%

docs/apps/learn-card-app/README.md

Activity based on git-commit:

TaylorBeeston
FEB
JAN
DEC
NOV
OCT
SEP

Knowledge based on git-blame:

packages/learn-card-base/src/components/generic/GenericErrorBoundary.tsx

Activity based on git-commit:

TaylorBeeston
FEB
JAN
DEC
NOV 109 additions & 0 deletions
OCT
SEP

Knowledge based on git-blame:
TaylorBeeston: 100%

packages/learn-card-base/src/helpers/credentialHelpers.ts

Activity based on git-commit:

TaylorBeeston
FEB 8 additions & 1 deletions
JAN
DEC 33 additions & 43 deletions
NOV 1253 additions & 0 deletions
OCT
SEP

Knowledge based on git-blame:
TaylorBeeston: 100%

packages/learn-card-base/src/react-query/mutations/boosts.ts

Activity based on git-commit:

TaylorBeeston
FEB
JAN
DEC
NOV 870 additions & 7 deletions
OCT
SEP

Knowledge based on git-blame:
TaylorBeeston: 100%

packages/learn-card-base/src/react-query/queries/queries.ts

Activity based on git-commit:

TaylorBeeston
FEB 42 additions & 0 deletions
JAN
DEC 6 additions & 3 deletions
NOV 1027 additions & 12 deletions
OCT
SEP

Knowledge based on git-blame:
TaylorBeeston: 94%

packages/learn-card-base/src/react-query/queries/vcQueries.ts

Activity based on git-commit:

TaylorBeeston
FEB
JAN
DEC 14 additions & 5 deletions
NOV 1027 additions & 0 deletions
OCT
SEP

Knowledge based on git-blame:
TaylorBeeston: 94%

packages/learn-card-base/src/svgs/Checkmark.tsx

Activity based on git-commit:

TaylorBeeston
FEB
JAN
DEC
NOV 63 additions & 0 deletions
OCT
SEP

Knowledge based on git-blame:
TaylorBeeston: 100%

packages/learn-card-base/src/svgs/InfoIcon.tsx

Activity based on git-commit:

TaylorBeeston
FEB
JAN
DEC
NOV 35 additions & 0 deletions
OCT
SEP

Knowledge based on git-blame:
TaylorBeeston: 100%

packages/learn-card-base/src/svgs/Plus.tsx

Activity based on git-commit:

TaylorBeeston
FEB
JAN
DEC
NOV 24 additions & 0 deletions
OCT
SEP

Knowledge based on git-blame:
TaylorBeeston: 100%

packages/learn-card-types/src/lcn.ts

Activity based on git-commit:

TaylorBeeston
FEB 23 additions & 1 deletions
JAN 168 additions & 114 deletions
DEC 41 additions & 0 deletions
NOV 550 additions & 64 deletions
OCT
SEP 876 additions & 0 deletions

Knowledge based on git-blame:
TaylorBeeston: 76%

packages/plugins/learn-card-network/src/plugin.ts

Activity based on git-commit:

TaylorBeeston
FEB 27 additions & 9 deletions
JAN 36 additions & 14 deletions
DEC 69 additions & 2 deletions
NOV 185 additions & 14 deletions
OCT
SEP 1462 additions & 149 deletions

Knowledge based on git-blame:
TaylorBeeston: 80%

packages/plugins/learn-card-network/src/types.ts

Activity based on git-commit:

TaylorBeeston
FEB 18 additions & 3 deletions
JAN 14 additions & 1 deletions
DEC 4 additions & 0 deletions
NOV 130 additions & 5 deletions
OCT
SEP 473 additions & 7 deletions

Knowledge based on git-blame:
TaylorBeeston: 78%

services/learn-card-network/brain-service/src/accesslayer/boost/relationships/create.ts

Activity based on git-commit:

TaylorBeeston
FEB
JAN
DEC
NOV 29 additions & 0 deletions
OCT
SEP 63 additions & 0 deletions

Knowledge based on git-blame:
TaylorBeeston: 100%

services/learn-card-network/brain-service/src/accesslayer/boost/relationships/read.ts

Activity based on git-commit:

TaylorBeeston
FEB
JAN
DEC
NOV 220 additions & 23 deletions
OCT
SEP 1483 additions & 0 deletions

Knowledge based on git-blame:
TaylorBeeston: 95%

services/learn-card-network/brain-service/src/models/Boost.ts

Activity based on git-commit:

TaylorBeeston
FEB
JAN
DEC
NOV 11 additions & 0 deletions
OCT
SEP 111 additions & 0 deletions

Knowledge based on git-blame:
TaylorBeeston: 98%

services/learn-card-network/brain-service/src/routes/boosts.ts

Activity based on git-commit:

TaylorBeeston
FEB
JAN
DEC 222 additions & 3 deletions
NOV 415 additions & 5 deletions
OCT 11 additions & 3 deletions
SEP 1983 additions & 2 deletions

Knowledge based on git-blame:
TaylorBeeston: 81%

services/learn-card-network/brain-service/src/routes/skill-frameworks.ts

Activity based on git-commit:

TaylorBeeston
FEB
JAN
DEC
NOV 785 additions & 0 deletions
OCT
SEP

Knowledge based on git-blame:
TaylorBeeston: 85%

services/learn-card-network/brain-service/src/routes/skills.ts

Activity based on git-commit:

TaylorBeeston
FEB 111 additions & 0 deletions
JAN
DEC
NOV 725 additions & 0 deletions
OCT
SEP

Knowledge based on git-blame:
TaylorBeeston: 99%

services/learn-card-network/brain-service/src/services/skills-provider/inject.ts

Activity based on git-commit:

TaylorBeeston
FEB
JAN
DEC
NOV 154 additions & 0 deletions
OCT
SEP

Knowledge based on git-blame:
TaylorBeeston: 73%

✨ Comment /gs review for LinearB AI review. Learn how to automate it here.

@smurflo2 smurflo2 merged commit caf231b into main Feb 25, 2026
28 of 29 checks passed
@smurflo2 smurflo2 deleted the lc-1442-self-assigned-skills branch February 25, 2026 19:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants