line-tracing
Client-side graph digitizer: calibrate axes, place points, export a table. Images never leave the browser.
Install / Use
npx skills add brianmanderson/UCSD_GraphEvaluator --skill line-tracingInstalls into whichever agent you are using.
SKILL.md
Installable skill definition
Quality Score
Category
AutomationSupported Platforms
Our assessment of line-tracing
line-tracing scores 57/100 on our quality scale, 2743rd of 2,873 Automation skills we index.
Its SKILL.md is 9.1 KB long, split into 6 sections and no code examples: a thorough specification that gives an agent plenty to work with.
It has no GitHub stars yet, so there is no community track record; judge it on its content.
Maintenance, license and trust
- We could not determine when the repository was last updated.
- No license is declared. By default that means all rights are reserved: you can read it, but reusing or redistributing it is not clearly permitted. Ask the author before building on it commercially.
- Its trust signals score 68/100, with 3 cautions from licensing, adoption, age or documentation. These come from repository metadata, not a code audit — read the skill file before letting an agent act on it.
Safety scan
No issues foundOur scan of the whole file found no instruction hijacking, hidden characters, credential access, data exfiltration or destructive commands. An AI review of the same text found nothing harmful.
AI review by kimi-k2.7-code on 2026-11-07. Automated pattern scan on 2026-11-07. It catches known dangerous patterns, not every risk — read a skill before letting an agent act on it.
line-tracing compared with similar skills
All 4 of these similar skills score higher than line-tracing; compare them before choosing.
| Skill | Score | Stars | Updated | Format |
|---|---|---|---|---|
| line-tracing (this skill)by brianmanderson | 57 | 0 | — | SKILL.md |
| taste-skillby Leonxlnx | 100 | 111.4k | 2d ago | CLAUDE.md |
| Agent-Reachby Panniantong | 100 | 109.8k | 1d ago | CLAUDE.md |
| Scraplingby D4Vinci | 100 | 99.1k | 1d ago | MCP Server |
| LocalAIby mudler | 100 | 50.2k | today | MCP Server |
Frequently asked questions
- How do I install line-tracing?
- Run
npx skills add brianmanderson/UCSD_GraphEvaluator --skill line-tracing. The install tabs above show the steps for each supported agent. - Which AI agents does line-tracing work with?
- It is written for Universal, as a SKILL.md file. Other agents that read the same format can often use it too.
- Is line-tracing safe to use?
- Our scan of the whole file found no instruction hijacking, hidden characters, credential access, data exfiltration or destructive commands. An AI review of the same text found nothing harmful. It declares no license and scores 68/100 on trust signals. Skills are instructions an agent will follow, so read the file before installing it and do not approve commands you do not understand.
- Is line-tracing still maintained?
- We could not determine when the repository was last updated.
Skill content
View source on GitHubname: line-tracing description: > How automatic line tracing works — traceLine() in src/auto/trace/ (one click on a plotted series → its centreline or markers → suggested points) — and its benchmark (bench/lines/, npm run bench:lines): the fixed TraceRequest/TraceResult contract the Data-step UI codes against, the colour model, the column walker with gap bridging and retry, step corners, dotted lines, markers, resampling, the corpus and its truth format, and how the baseline gates regressions. Load it BEFORE editing anything in src/auto/trace/ or bench/lines/, before changing the contract or the worker/UI code that calls traceLine, when bench:lines reports a regression, when a trace follows the wrong series, loses a step corner or stops early, and when adding a figure to the line corpus. Skipping it risks breaking the UI's contract, DOM code in the worker-safe engine, "fixing" a failure by tuning the corpus, seeds or baseline instead of the tracer, or a suggestion applied without the user's Accept.
Line tracing and its benchmark
Rules
- The contract is fixed:
src/auto/trace/types.ts(TraceRequest,TracedPoint,TraceResult,TraceMode,LineStyle;TraceResult.stylesince Phase 6) is what the Data-step UI codes against. Doc comments may change; a shape change must updatedocs/SPEC.md→ Auto-trace in the same change and be called out to whoever owns the UI.traceLinenever throws: failures areok: false, kind: 'none'with a user-facingmessage. - Pure TS, worker-safe, like the rest of
src/auto(checked bytsconfig.core.json, ESLint bans browser globals). Input is plain RGBA. Noperformanceglobal types: timing goes through theglobalThiscast inindex.ts. - Pixel convention: integer = pixel centre, in the engine, the generator and the truth.
- Suggestions are never applied silently — the UI shows
pointsand adds them on Accept. - Never tune the corpus to the tracer. Don't edit, drop or regenerate charts, move seeds or
loosen
bench/lines/score.tsbecause a trace fails. Fix the tracer, or accept and document the failure (SPEC → Auto-trace → Known failures). Changing the generator is fine for realism (then regenerate, rebaseline, explain in the commit), never to dodge a failure. - Gate:
npm run bench:linesis innpm run verifyand exits 1 when kind accuracy, coverage, median/p95 centreline error, wrong-series rate, corner recall or marker recall / precision, wrong-group rate or style accuracy gets worse thanbench/lines/baseline.json, overall or in any category. It is deterministic. Rebaseline (npm run bench:lines -- --update) only when every change is an improvement or an explained trade-off, and say why in the commit. The plot box comes fromdetectAxes, so a detection change can move bench:lines — run both benches.
Pipeline (traceLine in src/auto/trace/index.ts)
- Region (
region.ts): given box → elsedetectAxesbox if it contains the seed → else image. - Colour (
color.ts): background median; seed = nearest ink within 4 px, hill-climbed to the strongest shade — or, in markers/auto mode, a click on background enclosed by ink withinmarkerMax(enclosedHole: inside an open marker, whatever its size) seeds on the enclosing ink and hands the hole tomarkerTemplate, which then cuts the open shape around it (never the filled marker the ring may be merged with); ink colour, then scaled to the line's typical peak (typicalStrength). Coverage α per pixel with a saturation-dependent residual tolerance (tight for black/grey/brown, loose for saturated colours JPEG washes out).othermarks ink of another colour. A frame line along an edge is excluded only when it has the series colour (excludeEdgeLines). - Style (
style.ts → classifyStyle): the chain of blobs around the seed → solid / dashed / dotted / dash-dot / unknown (gaps that agree, piece lengths; occlusions end a chain, crossings of same-colour ink don't count). Mode: blobs of "on" pixels (markers.ts → findBlobs); seed blob small + round and not patterned → markers (also a larger blob from whichmarkerTemplatecuts a marker found ≥ 3 times: a marker with error bars); a dotted chain whose pattern wasn't read →chainPath. OtherwiseapplyStyle(same-colour ink of another style becomes an occluder; a patterned seed's own gaps are filled,unfillafter the walk) and the column walker. - Column walker (
curve.ts → traceColumns): runs per column; prediction = centre + median slope, or after a long run straight-through-then-far-end; hole bridging on verticals; peak consistency (PEAK_RATIO); open gaps ≤defaultMaxGap, hidden (occluded) gaps ≤defaultMaxHiddenGap; under a marker-sized occluder a kink allowance (KINK_SLOPE,KINK_COLUMNS) whose runs must emerge from the ink and are only a fallback; retry from the last fork (RETRY_COLUMNS,MAX_RETRY_DEPTH; kink-only runs make no fork; the branch that followed most ink wins). Walk order: right, left primed with right, right primed with left. columnsToPath: centroids; thin long-run groups entered at one end → two corner points; square groups wider than a stroke sticking out past the curve (same-colour markers) → one corner at their centroid; thin groups sticking out on both sides ('+') dropped.kinks.ts: vertices hidden under other-colour markers (occluder centroid, or the intersection of the stretches either side, both only over ink) and line ends under a marker.resample.ts: ends + corners + extrema + DP kinks always, rest evenly in x up tomaxPoints.- Markers ("Find points",
markers.ts):markerTemplatecuts the clicked marker out of its blob (filled: opening wider than the attached strokes; open: the enclosed hole + ring),findMarkersmatches its ink / defining background / margin everywhere (filled on the opened image, corners raw), splits clumps by area, drops legend samples (legendSample). No template → blob match.
Debugging a failing trace
npm run bench:lines -- --only l31 --verboseprints per-trace kind, coverage, error, corners, markers. Tags of a series (in the verbose line's category rows) say what it is.- Draw an overlay: decode the image (
bench/axes/decode.ts), runtraceLinewith the truth seed (bench/lines/truth.ts → loadCorpus), paint truth andpath/pointsinto a PNG (pngjs) at 4–10× zoom — the failure is usually obvious (a dash tip, a marker tip dead end, a gridline crossing, colours confused in a JPEG). Keep such scripts in the scratchpad, not the repo. - A temporary
console.logper column (x, prediction, runs, candidates) insidewalkFromis the fastest way to see why a walk stops;src/autohas noconsoletype (reach it through aglobalThiscast) and the debug line must not be committed.
Corpus and truth
bench/lines/generate.py→synthetic/lNN.{png,jpg,json}(96 charts, 208 series; committed, ~2.8 MB; charts are only ever appended — l60–l71 are thekinksscenario, l72–l83same-colour(solid + dashed/dotted pairs of one colour), l84–l95find-points(filled vs open or circle vs square scatter of one colour with error bars) — so earlier ones stay byte-identical: checkgit statusafter regenerating). Per series:kind(line|step|scatter),tags,color,style,marker,lineWidthPx,markerSizePx,seed,data,pixels, andpath(drawn polyline),markers(centres),corners(step corners; for kink polylines every vertex). Seeds: visible ink of the series (coverage ≥ 0.6), no ink of another colour within 3 px (exact-blend test on the render), clear of other series and the legend, at a random position in the middle half.bench/lines/real/manifest.jsonlists figures beyond the generated corpus; their label JSON'sknownValues(series,x: [x0, x1]in data units,y, optionalpy) become partial truth (horizontal segments; x via the labelled x ticks), or apointslist (px,py) becomes full truth for a polyline with a marker on every point (line + marker series; entry needsmarkerSizePx;sourcenames its top category, e.g.fixture); an optionalstylesmap (series → line style) feeds the style metric; amarkerSerieslist (series,markerSizePx,seed,markers) gives full marker truth for scatter groups (Graph.png). Add a figure: label plateaus from measured pixels (±1 px), add it to the manifest with tags, run-- --verbose, rebaseline (new categories) and commit image + label + manifest + baseline together.
Known failures (baseline)
Dense staircases in thick lines lose corners (corner recall 68 %); 42 % of kink vertices under small/JPEG markers are still missed; a series hidden under another along a step ends the trace; thin faint lines in low-DPI JPEGs fragment; four-series JPEG charts on dark gridlines still switch series sometimes (dense 10.7 % wrong); legend samples count as markers; same-colour (Phase 6): a dashed series merged into the solid one for a stretch ends the dashed trace there, dashed/dotted KM steps keep few corners. Numbers: docs/SPEC.md → Auto-trace → Baseline / Known failures.
Related Skills
taste-skill
111.4kAgent skills that give coding agents taste: art direction, reference images and a browser check instead of generic AI pages
Agent-Reach
109.8kGive your AI agent eyes to see the entire internet. Read & search Twitter, Reddit, YouTube, GitHub, Bilibili, XiaoHongShu — one CLI, zero API fees.
Scrapling
99.1k🕷️ The BEST Web Scraping framework that handles everything from a single request to a full-scale crawl! Don't be shy, join here: https://discord.gg/EMgGbDceNQ and follow here for daily tips and tricks: https://x.com/Scrapling_dev
LocalAI
50.2kLocalAI is the open-source AI engine. Run any model - LLMs, vision, voice, image, video - on any hardware. No GPU required.
Trust signals
From repository metadata: license, adoption, age and documentation. Not a code audit — see the Safety scan above for what the skill file itself contains.
