diff --git a/automaton/dashboard/html/dashboard.js b/automaton/dashboard/html/dashboard.js
index 5cc114a..6b6b3ea 100644
--- a/automaton/dashboard/html/dashboard.js
+++ b/automaton/dashboard/html/dashboard.js
@@ -138,6 +138,14 @@ function renderBoard() {
attachCardListeners();
}
+const ARTIFACT_LABELS = {
+ 'research': 'SPEC.md', 'decomposition': 'DECOMPOSITION.md',
+ 'design': 'DESIGN.md', 'test_design': 'TEST_PLAN.md',
+ 'implement': 'IMPLEMENTATION.md', 'bug_find': 'BUG_REPORT.md',
+ 'adv_bug_find': 'ADVERSARIAL_BUG_REPORT.md', 'doc_review': 'DOC_REVIEW.md',
+ 'referee': 'VERDICT.md',
+};
+
function renderTaskCard(task) {
const statusClass = task.state === 'done' ? 'done' : task.state === 'blocked' ? 'blocked' : 'in_progress';
const statusIcon = task.state === 'done' ? '✅' : task.state === 'blocked' ? '❌' : '🔄';
@@ -156,9 +164,16 @@ function renderTaskCard(task) {
return `
${stIcon}${st.name}
`;
}).join('')}`
: '';
+ const artifactsHtml = (reviewStatus === 'pending' || reviewStatus === 'changes_requested')
+ ? `${COLUMNS.filter(col => task.artifacts[col.id]).map(col => {
+ const label = ARTIFACT_LABELS[col.id] || col.label;
+ return `${label}`;
+ }).join('')}
`
+ : '';
return `
${subLabel}
+ ${artifactsHtml}
${progressHtml ? `` : ''}
${subtasksHtml}
`;
diff --git a/automaton/dashboard/html/styles.css b/automaton/dashboard/html/styles.css
index 0546b75..84685e4 100644
--- a/automaton/dashboard/html/styles.css
+++ b/automaton/dashboard/html/styles.css
@@ -246,6 +246,8 @@ kbd {
.review-btn.changes { border-color: var(--error); color: var(--error); }
.review-btn.changes:hover { background: var(--error-bg); }
.review-comment { font-size: 12px; color: var(--text-secondary); padding: 8px; background: var(--bg-primary); border-radius: 4px; margin-top: 4px; }
+.task-card-artifacts { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 6px; }
+.artifact-badge { font-size: 10px; padding: 1px 6px; background: var(--bg-primary); border: 1px solid var(--border-color); border-radius: 3px; color: var(--text-secondary); font-family: monospace; }
@media (max-width: 768px) {
.header { flex-wrap: wrap; gap: 8px; }