Skip to content

Commit d0d44da

Browse files
abrichrclaude
andcommitted
fix: expand steps, add full-res links, increase thumbnail width
- Remove collapsed <details> sections — all steps visible by default - Add full-resolution image copies when originals are available - Thumbnails link to full-res versions (clickable) - Increase default thumbnail width from 400 to 600px - Skip resize if source is already smaller than target width Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 724958f commit d0d44da

2 files changed

Lines changed: 56 additions & 44 deletions

File tree

.beads/issues.jsonl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,5 @@
1313
{"id":"openadapt-evals-hvm","title":"VL model fix PR #18 ready to merge","notes":"2026-02-08: openadapt-ml PR #18 was already merged on 2026-01-29. VL model fix is done.","status":"closed","priority":0,"issue_type":"task","owner":"richard.abrich@gmail.com","created_at":"2026-01-29T16:17:03.491938-05:00","created_by":"Richard Abrich","updated_at":"2026-02-08T12:55:19.233249-05:00","closed_at":"2026-02-08T12:55:19.233249-05:00","close_reason":"PR #18 already merged 2026-01-29"}
1414
{"id":"openadapt-evals-mx8","title":"Analyze evaluation results and publish findings","description":"After demo-conditioned evaluation completes, analyze results: success rates, failure modes, demo impact. Create data-driven roadmap for improvements.","status":"open","priority":1,"issue_type":"task","owner":"richard.abrich@gmail.com","created_at":"2026-02-14T12:23:06.328838-05:00","created_by":"Richard Abrich","updated_at":"2026-02-14T12:23:06.328838-05:00"}
1515
{"id":"openadapt-evals-sz4","title":"RCA: Windows product key prompt recurring issue","status":"closed","priority":0,"issue_type":"task","owner":"richard.abrich@gmail.com","created_at":"2026-01-20T18:59:36.266286-05:00","created_by":"Richard Abrich","updated_at":"2026-01-20T20:32:06.493102-05:00","closed_at":"2026-01-20T20:32:06.493102-05:00","close_reason":"RCA complete - root cause is VERSION mismatch (CLI=11, Dockerfile=11e). Fix documented in RECURRING_ISSUES.md and WINDOWS_PRODUCT_KEY_RCA.md"}
16-
{"id":"openadapt-evals-vcb","title":"Run demo-conditioned WAA evaluation","description":"Once demos are recorded, run WAA evaluation with demo-conditioned agents (RetrievalAugmentedAgent with real demos). Target: measure improvement over zero-shot baseline. Requires real demos from recording task.","notes":"2026-03-01: GPU grant applications reviewed and rewritten (11 files). Writing done, blocked on eval results (DC signal on harder tasks). Detailed status tracked in openadapt-internal (private repo).","status":"open","priority":0,"issue_type":"task","owner":"richard.abrich@gmail.com","created_at":"2026-02-14T12:23:04.624305-05:00","created_by":"Richard Abrich","updated_at":"2026-03-01T23:35:11.042286-05:00"}
16+
{"id":"openadapt-evals-vcb","title":"Run demo-conditioned WAA evaluation","description":"Once demos are recorded, run WAA evaluation with demo-conditioned agents (RetrievalAugmentedAgent with real demos). Target: measure improvement over zero-shot baseline. Requires real demos from recording task.","notes":"2026-03-01: GPU grant applications reviewed and rewritten (11 files). Writing done, blocked on eval results (DC signal on harder tasks). Detailed status tracked in openadapt-internal (private repo).","status":"open","priority":0,"issue_type":"task","owner":"richard.abrich@gmail.com","created_at":"2026-02-14T12:23:04.624305-05:00","created_by":"Richard Abrich","updated_at":"2026-03-02T00:14:45.008446-05:00"}
1717
{"id":"openadapt-evals-wis","title":"Add pre-flight check to detect Windows install issues","status":"closed","priority":1,"issue_type":"task","owner":"richard.abrich@gmail.com","created_at":"2026-01-20T18:59:36.865052-05:00","created_by":"Richard Abrich","updated_at":"2026-01-20T20:32:06.757261-05:00","closed_at":"2026-01-20T20:32:06.757261-05:00","close_reason":"Duplicate of openadapt-evals-0dt"}

scripts/generate_demo_review.py

Lines changed: 55 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
Reads a WAA recording (meta.json + screenshots), creates thumbnail images,
55
and produces a markdown file showing the pipeline output for each step.
66
The markdown is suitable for embedding in docs or PR descriptions and
7-
renders on GitHub with relative image paths.
7+
renders on GitHub with relative image paths. Thumbnails link to full-resolution
8+
originals when available.
89
910
Usage:
1011
python scripts/generate_demo_review.py \
@@ -17,13 +18,14 @@
1718

1819
import json
1920
import re
21+
import shutil
2022
import sys
2123
from pathlib import Path
2224

2325
from PIL import Image
2426

2527

26-
THUMBNAIL_WIDTH = 400
28+
THUMBNAIL_WIDTH = 600
2729

2830

2931
def _parse_demo_steps(demo_text: str) -> dict[int, str]:
@@ -54,6 +56,9 @@ def _parse_demo_steps(demo_text: str) -> dict[int, str]:
5456
def _create_thumbnail(src: Path, dst: Path, width: int = THUMBNAIL_WIDTH) -> None:
5557
"""Resize an image to the given width, preserving aspect ratio."""
5658
with Image.open(src) as img:
59+
if img.width <= width:
60+
shutil.copy2(src, dst)
61+
return
5762
ratio = width / img.width
5863
new_height = int(img.height * ratio)
5964
resized = img.resize((width, new_height), Image.LANCZOS)
@@ -65,7 +70,6 @@ def _relpath(target: Path, start: Path) -> str:
6570
try:
6671
return str(target.resolve().relative_to(start.resolve()))
6772
except ValueError:
68-
# target is not under start; compute relative via os
6973
import os
7074
return os.path.relpath(target.resolve(), start.resolve())
7175

@@ -134,11 +138,15 @@ def main(
134138
else:
135139
print(f"Warning: VLM demo not found at {vlm_demo_path}")
136140

137-
# --- Create thumbnails ---
141+
# --- Create thumbnails and copy full-res originals ---
138142
thumb_dir = output_path.parent / "artifacts" / "thumbnails"
139143
thumb_dir.mkdir(parents=True, exist_ok=True)
140144

141-
thumbnail_map: dict[str, Path] = {} # e.g. "step_00_before" -> path
145+
full_dir = output_path.parent / "artifacts" / "full"
146+
full_dir.mkdir(parents=True, exist_ok=True)
147+
148+
thumbnail_map: dict[str, Path] = {}
149+
full_map: dict[str, Path] = {}
142150
for i in range(num_steps):
143151
for suffix in ("before", "after"):
144152
name = f"step_{i:02d}_{suffix}"
@@ -147,8 +155,14 @@ def main(
147155
dst = thumb_dir / f"{name}.png"
148156
_create_thumbnail(src, dst, width=thumbnail_width)
149157
thumbnail_map[name] = dst
158+
# Copy full-resolution original
159+
full_dst = full_dir / f"{name}.png"
160+
shutil.copy2(src, full_dst)
161+
full_map[name] = full_dst
150162

151163
print(f"Created {len(thumbnail_map)} thumbnails in {thumb_dir}")
164+
if full_map:
165+
print(f"Copied {len(full_map)} full-resolution images to {full_dir}")
152166

153167
# --- Build markdown ---
154168
md_dir = output_path.parent
@@ -189,83 +203,81 @@ def main(
189203

190204
lines.append("")
191205

192-
# --- Per-step details ---
193-
lines.append("## Step-by-Step Detail")
194-
lines.append("")
195-
206+
# --- Per-step details (expanded, not collapsed) ---
196207
for i in range(num_steps):
197208
step_num = i + 1
198209
gt = steps[i].get("suggested_step", f"(step {step_num})") if i < len(steps) else f"(step {step_num})"
199210

200-
lines.append(f"<details>")
201-
lines.append(f"<summary><strong>Step {step_num}:</strong> {gt}</summary>")
211+
lines.append(f"### Step {step_num}: {gt}")
202212
lines.append("")
203213

204-
# Screenshots
214+
# Screenshots — thumbnails that link to full-resolution when available
205215
before_key = f"step_{i:02d}_before"
206216
after_key = f"step_{i:02d}_after"
207217
has_before = before_key in thumbnail_map
208218
has_after = after_key in thumbnail_map
209219

210220
if has_before or has_after:
211-
lines.append("#### Screenshots")
212-
lines.append("")
213-
214221
if has_before and has_after:
215-
before_rel = _relpath(thumbnail_map[before_key], md_dir)
216-
after_rel = _relpath(thumbnail_map[after_key], md_dir)
217-
lines.append("| Before | After |")
218-
lines.append("|--------|-------|")
219-
lines.append(
220-
f"| ![before]({before_rel}) | ![after]({after_rel}) |"
221-
)
222+
before_thumb = _relpath(thumbnail_map[before_key], md_dir)
223+
after_thumb = _relpath(thumbnail_map[after_key], md_dir)
224+
if before_key in full_map:
225+
before_full = _relpath(full_map[before_key], md_dir)
226+
after_full = _relpath(full_map[after_key], md_dir)
227+
lines.append(
228+
f"[![before]({before_thumb})]({before_full}) "
229+
f"[![after]({after_thumb})]({after_full})"
230+
)
231+
else:
232+
lines.append(
233+
f"![before]({before_thumb}) "
234+
f"![after]({after_thumb})"
235+
)
222236
elif has_before:
223-
before_rel = _relpath(thumbnail_map[before_key], md_dir)
224-
lines.append(f"**Before:**")
225-
lines.append("")
226-
lines.append(f"![before]({before_rel})")
237+
before_thumb = _relpath(thumbnail_map[before_key], md_dir)
238+
if before_key in full_map:
239+
before_full = _relpath(full_map[before_key], md_dir)
240+
lines.append(f"[![before]({before_thumb})]({before_full})")
241+
else:
242+
lines.append(f"![before]({before_thumb})")
227243
elif has_after:
228-
after_rel = _relpath(thumbnail_map[after_key], md_dir)
229-
lines.append(f"**After:**")
230-
lines.append("")
231-
lines.append(f"![after]({after_rel})")
244+
after_thumb = _relpath(thumbnail_map[after_key], md_dir)
245+
if after_key in full_map:
246+
after_full = _relpath(full_map[after_key], md_dir)
247+
lines.append(f"[![after]({after_thumb})]({after_full})")
248+
else:
249+
lines.append(f"![after]({after_thumb})")
232250

233251
lines.append("")
234252

235253
# Ground truth
236-
lines.append("#### Ground Truth (meta.json)")
237-
lines.append("")
238-
lines.append(f"> {gt}")
254+
lines.append(f"**Ground truth:** {gt}")
239255
lines.append("")
240256

241257
# Text-only demo output
242258
if text_steps:
243259
text_content = text_steps.get(step_num)
244-
lines.append("#### Text-Only Demo Output")
245-
lines.append("")
246260
if text_content:
247-
lines.append(_indent_block(text_content))
261+
lines.append(f"**Text demo:** {text_content}")
248262
else:
249-
lines.append("> *(not available)*")
263+
lines.append("**Text demo:** *(not available)*")
250264
lines.append("")
251265

252266
# VLM-enriched demo output
253267
if vlm_steps:
254268
vlm_content = vlm_steps.get(step_num)
255-
lines.append("#### VLM-Enriched Demo Output")
256-
lines.append("")
257269
if vlm_content:
270+
lines.append("**VLM demo:**")
271+
lines.append("")
258272
lines.append(_indent_block(vlm_content))
259273
else:
260-
lines.append("> *(not available)*")
274+
lines.append("**VLM demo:** *(not available)*")
261275
lines.append("")
262276

263-
lines.append("</details>")
277+
lines.append("---")
264278
lines.append("")
265279

266280
# --- Footer ---
267-
lines.append("---")
268-
lines.append("")
269281
lines.append(
270282
f"*Generated by `scripts/generate_demo_review.py` from recording "
271283
f"`{recording_dir.name}`*"

0 commit comments

Comments
 (0)