← Commit history

0.1.49: named outlines compose the single-stroke name in every style (two-line names, hairline)

John Lauer ·38881dbeb1 ·3d ago ·parent 9feabcf
8 files changed +20−16
Cargo.lock+10−10
@@ -4,7 +4,7 @@ version = 4  [[package]] name = "adom-aiflow"-version = "0.1.48"+version = "0.1.49" dependencies = [  "aiflow-analyze",  "aiflow-board",@@ -24,7 +24,7 @@ dependencies = [  [[package]] name = "aiflow-analyze"-version = "0.1.48"+version = "0.1.49" dependencies = [  "serde",  "serde_json",@@ -33,7 +33,7 @@ dependencies = [  [[package]] name = "aiflow-board"-version = "0.1.48"+version = "0.1.49" dependencies = [  "serde",  "serde_json",@@ -41,7 +41,7 @@ dependencies = [  [[package]] name = "aiflow-bridge"-version = "0.1.48"+version = "0.1.49" dependencies = [  "aiflow-board",  "serde",@@ -50,7 +50,7 @@ dependencies = [  [[package]] name = "aiflow-copper"-version = "0.1.48"+version = "0.1.49" dependencies = [  "aiflow-board",  "aiflow-grid",@@ -60,7 +60,7 @@ dependencies = [  [[package]] name = "aiflow-grid"-version = "0.1.48"+version = "0.1.49" dependencies = [  "aiflow-board",  "serde",@@ -69,7 +69,7 @@ dependencies = [  [[package]] name = "aiflow-place"-version = "0.1.48"+version = "0.1.49" dependencies = [  "aiflow-board",  "serde",@@ -78,7 +78,7 @@ dependencies = [  [[package]] name = "aiflow-pours"-version = "0.1.48"+version = "0.1.49" dependencies = [  "aiflow-board",  "aiflow-copper",@@ -88,7 +88,7 @@ dependencies = [  [[package]] name = "aiflow-router"-version = "0.1.48"+version = "0.1.49" dependencies = [  "aiflow-board",  "aiflow-grid",@@ -98,7 +98,7 @@ dependencies = [  [[package]] name = "aiflow-run"-version = "0.1.48"+version = "0.1.49" dependencies = [  "serde",  "serde_json",
Cargo.toml+1−1
@@ -14,7 +14,7 @@ members = [ ]  [workspace.package]-version = "0.1.48"+version = "0.1.49" edition = "2021" license = "MIT" repository = "https://wiki.adom.inc/adom/adom-aiflow"
bin/adom-aiflow
⋯ 1 unchanged line ⋯
docs/release-0.1.48.md+4
@@ -8,3 +8,7 @@ From John's rule (2026-10-03): a part-number laser mark runs along the longest u - **Named outline = the mark** (`adom-aiflow-etch outline`): the service's single-stroke name drawn on the planned band and mapped exactly into the standard iso pose; failing SVGs are written as `*.FAILED-GATE.svg`, never silently. - `finish` recognises `Adom.LaserEtch` as well as the legacy `laser_etch`. Skills (adom-aiflow, aiflow-molecule, aiflow-sourcing) and the board flow carry the Marking checklist. - Tested on TPS54202DDCR, CR0402-FX-1002GLF, CL21A226MPQNNNE, AMPLH5030S-150MT (vendor marking kept) and IN-S63BTG (side wall).++## 0.1.49++- `adom-aiflow-etch outline`: a two-line or long name (more strokes than the plate has edges) and the hairline style are now drawn in the single-stroke font on the planned band in every style, instead of falling back to the etched model's own edges.
package.json+1−1
@@ -1,7 +1,7 @@ {   "slug": "adom-aiflow",   "type": "app",-  "version": "0.1.48",+  "version": "0.1.49",   "title": "AI Flow",   "description": "Adom's AI Flow: a tool to help the AI follow all of the steps it takes to build a board. One Rust binary with a crate per step (placement helpers, a grid router with Kelvin taps, pours with keepouts, KiCad's DRC gate, live landing through the KiCad Bridge, copper measurement, current and thermal analysis) and a finish line that refuses an unfinished board. Every command answers with hints for the AI; every turn, its thinking time and every rework loop go into run.jsonl, so Claude, Codex and any other engine are compared on the same flow. KiCad today; Altium, Fusion and Adom's own web apps next.",   "summary": "Adom's AI Flow: a tool to help the AI follow all of the steps it takes to build a board. The AI thinks its way from placement through routing, pours, current and thermal analysis to a delivered video; the binary does the fast, deterministic parts of every step, hands back hints, and keeps a ledger of every turn, every return to an earlier step, and the clock from the prompt to done.",
page.json+1−1
@@ -1,7 +1,7 @@ {   "slug": "adom-aiflow",   "type": "app",-  "version": "0.1.48",+  "version": "0.1.49",   "title": "AI Flow",   "description": "Adom's AI Flow: a tool to help the AI follow all of the steps it takes to build a board. One Rust binary with a crate per step (placement helpers, a grid router with Kelvin taps, pours with keepouts, KiCad's DRC gate, live landing through the KiCad Bridge, copper measurement, current and thermal analysis) and a finish line that refuses an unfinished board. Every command answers with hints for the AI; every turn, its thinking time and every rework loop go into run.jsonl, so Claude, Codex and any other engine are compared on the same flow. KiCad today; Altium, Fusion and Adom's own web apps next.",   "summary": "Adom's AI Flow: a tool to help the AI follow all of the steps it takes to build a board. The AI thinks its way from placement through routing, pours, current and thermal analysis to a delivered video; the binary does the fast, deterministic parts of every step, hands back hints, and keeps a ledger of every turn, every return to an earlier step, and the clock from the prompt to done.",
tools/laser-etch/mark_check.py+2−2
@@ -41,7 +41,7 @@ def _polylines(svg):     return out  -def outline_text(svg):+def outline_text(svg, plate=False):     """Split an outline SVG into (name strokes, part strokes). adom-aiflow-etch outline wraps the name in     <g id="adom-mark-name">; a service-drawn name is the trailing run of one stroke class that follows a     different class, is no wider and has fewer strokes (multi-layer styles: hidden dashed / glow / core)."""@@ -60,7 +60,7 @@ def outline_text(svg):             runs.append([t])     if len(runs) >= 2:         last, prev = runs[-1], runs[-2]-        if last[0]["w"] <= prev[0]["w"] and len(last) < len(prev) and not last[0].get("dash"):+        if plate or (last[0]["w"] <= prev[0]["w"] and len(last) < len(prev) and not last[0].get("dash")):             return last, [t for r in runs[:-1] for t in r]     return None, pl 
tools/laser-etch/mark_outline.py+1−1
@@ -90,7 +90,7 @@ def outlines(step, plan, etched=None, out_dir=".", styles=("dark",), stem=None,         svg_name = named.get(style + "-named")         out_svg = None         if svg_name:-            txt, plate_body = MC.outline_text(svg_name)+            txt, plate_body = MC.outline_text(svg_name, plate=True)             c1 = calibrate(MC._polylines(svg_body), verts)             c2 = calibrate(plate_body, plate_pts) if plate_body else None             if txt and c2 and c1["agree"] < 0.03 and c2["agree"] < 0.03: