tracer

Dashboard

Monitor job and SFT progress locally or online

tracer ships a self-contained progress dashboard that scans your current status and artifacts, then renders a single interactive HTML page — open it locally, or publish it to Cloudflare Pages for remote viewing.

Live board: swe-tracer-databoard-eir.pages.dev

What it monitors

SourceFilesShown as
Latest archived runartifacts/index.yaml → latest runs entryOperations page: run id, completion time, status, archive, and notes
Harbor jobsartifacts/jobs/<job>/result.jsonOperations page: Harbor Jobs table + expandable eval breakdown
Harbor trialsartifacts/jobs/<job>/<trial>/result.json by defaultInstances/Trajectories pages: pass rate, reward, model/scaffold, failure drilldown
SFT conversionartifacts/sft_data/<job>/lf.stats.jsonOperations page: SFT Datasets table
SFT quality factsartifacts/sft_data/<job>/im.jsonl score metadataInstances/Trajectories pages: score distribution, low-score cards, score breakdown
SFT samplesartifacts/sft_data/<job>/im.jsonl or lf.jsonTrajectories page: bounded previews; full-load actions are shown only for Harbor payloads the R2 flow can upload

The page has four sidebar sections:

  • Overview — KPI cards, programming-language distribution, and quality score histogram.
  • Instances — instance-level table plus multi-dimensional segment analysis by programming language, domain, category, difficulty, source, model, scaffold, or job.
  • Trajectories — searchable card explorer for failed, low-score, high-score, error-only, or random trajectories, with bounded preview and optional /api/traj full load.
  • Operations — latest archived-run status from artifacts/index.yaml, searchable Harbor/SFT artifact tables, copy-path actions, and per-job eval breakdowns.

For each Harbor job it surfaces trial counts, error counts, per-eval reward means, and reward == 1.0 / 0.0 outcome counts. For each SFT dataset it surfaces token-length, turn-count, score distributions, tool-call error rates, and on-disk sizes.

Each generation also writes analysis data under dashboard/site/data/:

FileContents
summary.jsongeneration time, source paths, indexed counts, global score/pass summaries
task_dim.jsontask metadata from artifacts/tasks/**/task.toml
trial_fact.*.jsonlsharded rows for indexed Harbor trial results
quality_fact.jsonlone row per scored SFT record
segments.jsonprecomputed multi-dimensional aggregates used by the Instances page
instances.jsonlnormalized task/instance aggregates with pass, score, token, tool, model, scaffold, and source fields
traj_cards.jsonlbounded trajectory-card export used by the public Trajectories page
error_summary.jsonstatus counts, exception counts, per-job/per-language aggregates, and score histogram

When operating through the tracer plugin, /tracer:dashboard covers both the visual dashboard and one-off SFT data/stat refreshes via scripts/convert_trajectories.sh.

Run it locally

The generator is dashboard/progress_monitor.py. It carries PEP 723 inline metadata and a uv run shebang, so it needs no pip install — just uv on PATH. Run from subblock/tracer/:

./dashboard/progress_monitor.py                              # one-shot generate
./dashboard/progress_monitor.py --serve --open               # generate + local preview
./dashboard/progress_monitor.py --loop 60 --serve --port 8765  # auto-refresh every 60s
./dashboard/progress_monitor.py --sample-limit 50            # smaller published page
./dashboard/progress_monitor.py --no-include-samples         # disable sample browser payload
./dashboard/progress_monitor.py --index-job <harbor-job>     # add an extra local Harbor batch to Instances/Trajectories
./dashboard/progress_monitor.py --local-mode public --public-no-samples  # metrics-only public payload

Then open dashboard/site/index.html directly, or visit http://127.0.0.1:8765/index.html. The page self-refreshes so an open tab stays current while --loop keeps writing snapshots.

Use the header's Black / White toggle to switch between light and dark monochrome themes. The selected theme is stored in browser localStorage; first load follows the system color-scheme preference.

Trajectory previews

The dashboard embeds bounded previews and trajectory cards by default, not full multi-GB data files. This keeps the HTML portable:

FlagDefaultPurpose
--include-samples / --no-include-samplesenabledToggle embedded sample previews
--sample-limit200Maximum samples per SFT dataset
--sample-preview-chars1200Maximum characters per message preview
--sample-message-limit12Maximum messages per sample preview
--index-fileartifacts/index.yamlArchived-run status source
--harbor-jobs-dirartifacts/jobsLocal Harbor trial source for Instances and Trajectories; HARBOR_JOBS_DIR overrides it
--tasks-dirartifacts/tasksTask metadata source for programming language/domain/category/difficulty
--index-jobnoneAdditional Harbor job name to include in trial-level analysis
--max-trials-per-job0Limit trial fact reads per Harbor job; 0 means all
--max-quality-records-per-dataset0Limit scored SFT rows per dataset; 0 means all
--local-modefullfull includes bounded analysis previews; public keeps metrics only
--public-no-samplesdisabledDisable embedded preview payload for public publishing

Use the defaults for local inspection. For public Cloudflare deploys, reduce --sample-limit or use --no-include-samples if the generated dashboard/site/index.html is too large or the sample content should not be published.

Preview only

The Trajectories page is intentionally bounded. It shows instance id, score, reward, turns, token usage, local paths, R2 object key, and truncated previews where available. Full im.jsonl / lf.json files stay on disk unless explicitly published to R2.

Publish to Cloudflare Pages

dashboard/run_cloudflare_pages_sync.sh loops the generator and deploys dashboard/site/ to Cloudflare Pages via wrangler, yielding a public *.pages.dev URL:

tmux new-session -d -s tracer-cf \
  "ENV_FILE=.env.cf bash dashboard/run_cloudflare_pages_sync.sh 2>&1 | tee /tmp/tracer_cf_sync.log"

Configuration is read from ~/.config/trajgen_progress_cloudflare.env (override with ENV_FILE). The required values are:

VariableHow to fill itDefault
CLOUDFLARE_API_TOKENAPI token with account-level Cloudflare Pages: Editrequired
CLOUDFLARE_ACCOUNT_ID32-char Account ID from the dashboardrequired
PROJECT_NAMECloudflare Pages project (sets the public URL)swe-tracer-databoard
LOOP_SECONDSSeconds between generate/deploy iterations3600
CONVERT_ENABLEDAuto-run SFT conversion in the loop (0 disables)1
CONVERT_EVERY_SECONDSMinimum interval between conversion attempts7200
DASHBOARD_INCLUDE_SAMPLESEmbed bounded trajectory preview payload (0 disables payload)1
DASHBOARD_SAMPLE_LIMITMaximum sample previews per SFT dataset200
DASHBOARD_SAMPLE_PREVIEW_CHARSMaximum characters per message preview1200
DASHBOARD_SAMPLE_MESSAGE_LIMITMaximum messages per sample preview12
DASHBOARD_LOCAL_MODEfull includes bounded analysis previews; public keeps metrics-only drilldownpublic
DASHBOARD_HARBOR_JOBS_DIRLocal Harbor jobs directory used by Instances and Trajectoriesartifacts/jobs
DASHBOARD_MAX_TRIALS_PER_JOBTrial fact limit per indexed Harbor job; 0 means all0
DASHBOARD_MAX_QUALITY_RECORDS_PER_DATASETQuality fact limit per SFT dataset; 0 means all0
TRACER_R2_UPLOADUpload local Harbor trajectory.json files referenced by trial facts0
TRACER_R2_BUCKETR2 bucket for full trajectory objects under trajs/...empty
TRACER_R2_UPLOAD_LIMITMaximum R2 objects to upload per loop; 0 means all manifest rows0
TRACER_R2_UPLOAD_CURSOR_FILEPersistent cursor used to advance bounded uploads across loopsdashboard/.cache/.r2_upload_cursor

The generated dashboard/site/_worker.js handles GET /api/traj?r2_key=trajs/.... Bind the same R2 bucket to the Pages project as TRACER_TRAJ_BUCKET to enable full online trajectory loading. Without that binding, the public page still works for metrics and bounded previews, while Load full returns a controlled error.

Token scope

wrangler pages deploy needs the account-level Cloudflare Pages: Edit permission. None of the built-in templates map to it exactly, so create a Custom Token with Account -> Cloudflare Pages -> Edit. The Account ID is separate from the token.

The same loop optionally re-runs scripts/convert_trajectories.sh --skip-unchanged at most every CONVERT_EVERY_SECONDS, so the SFT stats on the board also stay fresh online without coupling heavy conversion to the deploy cadence.

For a lighter public page, set DASHBOARD_SAMPLE_LIMIT to a smaller value, DASHBOARD_INCLUDE_SAMPLES=0, DASHBOARD_LOCAL_MODE=public, or nonzero max fact limits in the sync environment.

Two different Cloudflare projects

This is the progress dashboard project. The documentation site you are reading is a separate Cloudflare Pages project (swe-tracer-docs); see Build & deploy the docs site.

On this page