{% extends "dashboard/base.html" %} {% block title %}{{ project.title or 'Project' }} - Cyborg Dashboard{% endblock %} {% block content %}
← Back to Projects

{{ project.title or 'Untitled Project' }}

{{ project.id }} {% if project.state == 'planning' %} PLANNING {% elif project.state == 'active' %} ACTIVE {% elif project.state == 'closed' %} COMPLETED {% elif project.state == 'paused' %} PAUSED {% endif %}
{% if project.state == 'active' %}
{% elif project.state == 'paused' %}
{% endif %}
PROGRESS
{% if project.total_tasks > 0 %} {{ (project.completed_tasks / project.total_tasks * 100)|int }}% {% else %} 0% {% endif %}
{{ project.completed_tasks or 0 }}/{{ project.total_tasks or 0 }} tasks completed
HEALTH SCORE
{% if health_checks and health_checks[0].health_score is not none %} {{ (health_checks[0].health_score * 100)|int }}% {% else %} N/A {% endif %}
{% if health_checks and health_checks[0].risk_level %} {{ health_checks[0].risk_level|upper }} RISK {% else %} Not checked {% endif %}
CREATED
{{ project.created_at[:10] if project.created_at else '' }}
{{ project.created_at|relative_time if project.created_at else '' }}
{% if project.state == 'planning' or specs %}

Specs & Planning

{% if project.state == 'planning' %}
{% if not specs %} Waiting for spec generation… {% elif specs[0].status == 'rejected' %} Spec rejected — generating revised spec… {% elif specs[0].status == 'pending_approval' %} Spec pending approval — review and approve to start execution {% else %} Planning in progress {% endif %}
{% endif %} {% if specs %}
{% for spec in specs %}
v{{ spec.version_number }} {% if spec.status == 'approved' %} APPROVED {% elif spec.status == 'pending_approval' %} PENDING {% elif spec.status == 'rejected' %} REJECTED {% endif %} {{ spec.created_at[:16] }}
Aim: {{ spec.aim }}
{% if spec.method %}
Method: {{ spec.method }}
{% endif %} {% if spec.plan %}
Plan ({{ spec.plan|length }} steps):
    {% for step in spec.plan %}
  1. {{ step.order + 1 }}. {{ step.title }} — {{ step.description }}
  2. {% endfor %}
{% endif %} {% if spec.success_criteria %}
Success Criteria:
    {% for c in spec.success_criteria %}
  • {{ c.description or c.check }}
  • {% endfor %}
{% endif %} {% if spec.feedback %}
Rejection Feedback
{{ spec.feedback }}
{% endif %} {% if spec.status == 'pending_approval' and loop.first %}
{% endif %}
{% endfor %}
{% else %}
No specs submitted yet
{% endif %}
{% endif %}

Project Definition

AIM
{{ project.aim or 'Not specified' }}
{% if project.method %}
METHOD
{{ project.method }}
{% endif %} {% if project.conclusion %}
CONCLUSION
{{ project.conclusion }}
{% endif %}

Success Criteria

{% if project.success_criteria %}
{% for criterion in project.success_criteria %}
{{ criterion.check }}
{% endfor %}
{% else %}
No success criteria defined
{% endif %}

Tasks

{% for task in tasks[:10] %}
{% if task.status == 'completed' %}✓ {% elif task.status == 'active' %}◈ {% elif task.status == 'failed' %}✖ {% else %}○{% endif %}
{{ task.title or 'Untitled Task' }}
{{ task.id[:8] }}
{{ task.status|upper }}
{% else %}
No tasks found
{% endfor %}

Project Files {{ file_count }}

{% if file_categories %}
{% for category, files in file_categories.items() %}

{{ category }}/

{% if category == "tasks" %} {% set ns = namespace(grouped=[]) %} {% for f in files %} {% if f.task_title %} {% set ns.grouped = ns.grouped + [f] %} {% endif %} {% endfor %} {% if ns.grouped %} {% for f in ns.grouped %} {% if loop.first or f.task_short_id != ns.grouped[loop.index0 - 1].task_short_id %}
{{ f.task_title }}
{% endif %} {{ f.name|file_icon }} {{ f.name }} {{ f.size_bytes|file_size }} {% endfor %} {% endif %} {% else %} {% endif %}
{% endfor %}
{% else %}
No files found in project workspace
{% endif %}

Prompt History {{ prompts|length }}

{% for prompt in prompts[:20] %} {% set category_colors = { 'plan_generation': 'text-accent-cyan bg-accent-cyan/15', 'criteria_evaluation': 'text-accent-cyan bg-accent-cyan/15', 'strategy_refinement': 'text-accent-cyan bg-accent-cyan/15', 'learning_extraction': 'text-accent-cyan bg-accent-cyan/15', 'task_planning': 'text-accent-cyan bg-accent-cyan/15', 'health_analysis': 'text-accent-cyan bg-accent-cyan/15', 'follow_up_generation': 'text-accent-cyan bg-accent-cyan/15', 'task_assignment': 'text-accent-purple bg-accent-purple/15', 'needs_input': 'text-accent-orange bg-accent-orange/15', 'notification': 'text-accent-pink bg-accent-pink/15', } %}
{{ prompt.category.replace('_', ' ') }} {% if prompt.session_key %} {{ prompt.session_key }} {% endif %} {% if prompt.task_id %} task:{{ prompt.task_id[:8] }} {% endif %} {% if prompt.token_count_estimate %} {{ prompt.token_count_estimate }} tokens {% endif %} {{ prompt.timestamp|relative_time }}
{{ prompt.prompt_text }}
{% else %}
No prompts logged yet
{% endfor %}

Journal & Activity

{% for entry in journal[:20] %}
{{ entry.created_at|relative_time }}
{{ entry.entry_type }} {{ entry.content[:200] }}
{% else %}
No journal entries
{% endfor %}

Danger Zone

Permanently delete this project and all associated data. This cannot be undone.

{% endblock %}