{% extends "base.html" %} {% block title %}FORGE Academy — ICDEV™{% endblock %} {% block extra_css %} {% include "forge_academy/partials/_chrome_clearance.html" %} {% endblock %} {% block content %}

FORGE Academy

// Gamified AI Training — Mission-Ready AI Engineers

{% if fa_user %}
{{ level_ctx.level.icon if level_ctx and level_ctx.level else '⬡' }}
Rank
{{ level_ctx.level.label if level_ctx and level_ctx.level else 'Recruit' }}
{# aca-ux-07: this bar is filled by EARNED XP while the figure beside it is the running total, attendance included. Unlabelled, the two read as an arithmetic bug — 1815 XP next to "250 XP to Operative". Name each one. #}
Rank progress — earned XP {{ level_ctx.earned_xp|default(0) }} XP
{% if level_ctx and level_ctx.next %}
{{ level_ctx.xp_needed }} XP to {{ level_ctx.next.label }} {{ level_ctx.pct }}%
{% else %}
MAX RANK — SENSEI
{% endif %} {% if level_ctx and level_ctx.attendance_xp %} {# role="status" so a screen reader picks it up when the hub re-renders after the daily-login award, matching faEnrolNotice / the XP live region (aca-trn-06). Standing text, not a dismissible one-time notice: the split is permanent, so an apology that can be dismissed would just leave the next confused learner with nothing. #}
Rank is computed from {{ level_ctx.earned_xp|default(0) }} XP earned from graded work. Separately, {{ level_ctx.attendance_xp }} XP of daily-login attendance is recorded but not ranked ({{ level_ctx.total_xp|default(0) }} XP combined) — showing up does not buy a promotion.
{% endif %}
🏆 {{ stats.achievement_count|default(0) }} ⚙ Profile
{# aca-empty-demo: the "INTEL FEED" ticker was hardcoded copy with no data source ("Guild challenge active — 48 hours remaining" while no challenge exists), and it rendered as an empty dark box between scroll passes. Removed rather than given a fake feed. #} {% else %}

Set up your profile to begin your mission.

Begin Mission {% endif %}
{% if daily_login %}
✓ Daily login bonus: +{{ daily_login.xp }} XP {% if daily_login.streak > 1 %}  |  🔥 {{ daily_login.streak }}-day streak (+{{ daily_login.bonus }} bonus){% endif %}
{% endif %} {% if fa_user %}
{# aca-numbers-demo: the headline chip was fa_users.xp — 7635 live, 7385 of it daily logins — beside a "Recruit" badge. The headline is now the figure the rank is computed from; attendance gets its own, labelled chip. #}
{{ level_ctx.earned_xp|default(0) }}
Earned XP (rank)
{{ level_ctx.attendance_xp|default(0) }}
Attendance XP (not ranked)
{{ stats.achievement_count|default(0) }}
Achievements
{{ stats.user.streak_days|default(1) }}
Day Streak
{{ fa_user.tier_unlocked|default(1) }}
Tier
{% endif %}
📋 All Missions 🌐 Skill Tree 🏆 Leaderboard ⚔ Guild {% if has_challenges %} ⚡ Arena {% endif %} ⬡ Workflow Builder 🔮 Oracle Intel
{# aca-ux-03: continue where you left off. Only rendered when the learner has actually submitted work on an unfinished mission — resume_target requires fa_step_progress evidence, not just a progress row, because before aca-int-04 merely opening a page created one. #} {% if resume %}
Continue where you left off
▶ {{ resume.title }} Tier {{ resume.tier }} {%- if resume.steps_total %} · {{ resume.steps_done }} of {{ resume.steps_total }} steps complete {%- endif %} Resume → {% endif %}
Active Missions
{% for m in missions %}
{{ m.title }}
{{ m.mission_type|default('coding') }}

{{ m.tagline|default('') }}

{% else %}

No missions loaded yet. {% if not fa_user %}Set up your profile to unlock missions.{% endif %}

{% endfor %}
View all missions →
🔮 Oracle Intel
— predictions
— critical
— convergence
View Oracle →
{% endblock %}