{% extends "base.html" %} {% block title %}Experiment {{ exp_id }} — ABREKA{% endblock %} {% block extra_css %} {{ pygments_css }} /* Tabs */ .tab-bar { display: flex; gap: 0; border-bottom: 2px solid var(--border); margin-bottom: 16px; } .tab-btn { padding: 8px 20px; font-size: 13px; font-weight: 600; color: var(--muted); background: none; border: none; border-bottom: 2px solid transparent; margin-bottom: -2px; cursor: pointer; transition: color 0.15s, border-color 0.15s; } .tab-btn:hover { color: var(--text); } .tab-btn.active { color: var(--primary); border-bottom-color: var(--primary); } .tab-panel { display: none; } .tab-panel.active { display: block; } /* File browser (VS Code style) */ .file-browser { display: flex; border: 1px solid var(--border); border-radius: 8px; background: var(--surface); min-height: 500px; --sidebar-width: 260px; --splitter-width: 8px; } .file-sidebar { width: var(--sidebar-width); min-width: var(--sidebar-width); border-right: 1px solid var(--border); overflow-y: auto; max-height: 600px; font-family: var(--mono); font-size: 13px; flex-shrink: 0; transition: width 0.2s, min-width 0.2s, padding 0.2s, border 0.2s; } .file-sidebar.collapsed { width: 0; min-width: 0; overflow: hidden; border-right: none; } .file-splitter { width: var(--splitter-width); flex-shrink: 0; cursor: col-resize; background: transparent; position: relative; } .file-splitter::before { content: ''; position: absolute; top: 0; bottom: 0; left: 50%; width: 1px; transform: translateX(-50%); background: var(--border); } .file-browser.resizing, .file-browser.resizing * { cursor: col-resize !important; user-select: none; } .file-browser.sidebar-collapsed .file-splitter { display: none; } .file-sidebar-header { padding: 10px 12px; font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; color: var(--muted); border-bottom: 1px solid var(--border); display: flex; align-items: center; justify-content: space-between; } .file-item { display: flex; align-items: center; padding: 3px 8px; cursor: pointer; color: var(--text); border-left: 2px solid transparent; } .file-item:hover { background: var(--primary-light); } .file-item.active { background: var(--primary-light); border-left-color: var(--primary); } .file-item.dir { font-weight: 600; color: var(--muted); cursor: default; } .file-item.binary { opacity: 0.5; cursor: default; } .file-item .name { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .file-item .size { font-size: 11px; color: var(--muted); margin-left: 8px; } .file-content-area { flex: 1; min-width: 0; overflow: auto; max-height: 600px; display: flex; flex-direction: column; } .file-content-header { padding: 8px 12px; font-size: 12px; font-family: var(--mono); border-bottom: 1px solid var(--border); display: flex; align-items: center; justify-content: space-between; background: #fafbfc; flex-shrink: 0; } .file-content-header .file-path { color: var(--text); font-weight: 600; } .file-content-header .file-meta-inline { color: var(--muted); display: flex; gap: 12px; align-items: center; } .file-content-body { flex: 1; overflow: auto; padding: 0; } .file-content-body .highlight { border-radius: 0; margin: 0; } .file-content-body .highlight pre { margin: 0; padding: 12px; overflow-x: auto; font-size: 12px; line-height: 1.6; } .file-placeholder { display: flex; align-items: center; justify-content: center; height: 100%; color: var(--muted); font-size: 14px; } .truncation-warning { background: #fef3c7; border-bottom: 1px solid #f59e0b; padding: 6px 12px; font-size: 12px; color: #92400e; flex-shrink: 0; } .binary-notice { display: flex; align-items: center; justify-content: center; height: 100%; color: var(--muted); font-size: 14px; } /* Toolbar buttons */ .icon-btn { background: none; border: 1px solid var(--border); border-radius: 4px; padding: 3px 8px; cursor: pointer; font-size: 12px; color: var(--muted); display: inline-flex; align-items: center; gap: 4px; } .icon-btn:hover { background: var(--primary-light); color: var(--text); } /* Run output full width */ .run-output-card pre { max-height: 400px; overflow-y: auto; } {% endblock %} {% block content %}

Experiment {{ exp_id }}

{{ exp.status.value }}

Details

{% if exp.completed_at %} {% endif %}
Status{{ exp.status.value }}
Created{{ exp.created_at.isoformat()[:19] }}
Completed{{ exp.completed_at.isoformat()[:19] }}
Parents {% for p in exp.parents %} {{ p }}{% if not loop.last %}, {% endif %} {% endfor %} {% if not exp.parents %}none{% endif %}
Children {% for c in children %} {{ c }}{% if not loop.last %}, {% endif %} {% endfor %} {% if not children %}none{% endif %}
Tags {% for t in exp.tags %} {{ t }} {% endfor %} {% if not exp.tags %}none{% endif %}

Hypothesis

{{ exp.hypothesis }}

Method

{{ exp.method }}

{% if exp.failure_reason %}

Failure Reason

{{ exp.failure_reason }}

{% endif %}
{% if exp.metrics %}

Metrics

{% for split, kvs in exp.metrics.items() %} {% for key, val in kvs.items() %} {% endfor %} {% endfor %}
SplitMetricValue
{{ split }} {{ key }} {{ "%.6f" | format(val) if val is number else val }}
{% endif %} {% if runtime_rows %}

Runtime Costs

{% for row in runtime_rows %} {% endfor %}
StageAttemptsTotal (s)Last (s)Status
{{ row.stage }} {{ row.attempts }} {{ "%.2f" | format(row.seconds_total) }} {{ "%.2f" | format(row.seconds_last) }} {{ row.last_status }}

Total runtime: {{ runtime_total_seconds | human_duration }}

{% endif %}

Sessions

{% if sessions %} {% for s in sessions %} {% endfor %}
StageSize
{{ s.stage }} {{ "%.0f" | format(s.size_kb) }} KB View session
{% else %}

No session recordings found.

{% endif %}
{% if run_output %}

Run Output

Show output ({{ run_output | length }} chars)
{{ run_output }}
{% endif %} {% if findings %}

Findings

{{ findings | md }}
{% endif %}
Explorer
{% if file_entries %} {% for e in file_entries %}
{% if e.is_dir %}{{ e.name }}/{% else %}{{ e.name }}{% endif %} {% if not e.is_dir %} {{ e.size_bytes | filesize }} {% endif %}
{% endfor %} {% else %}
No files found.
{% endif %}
Select a file to view its contents
{% endblock %}