app
AI Flow
Public Made by Adomby adom
Adom's AI Flow: a tool to help the AI follow all of the steps it takes to build a board.
← Commit history
0.1.49: named outlines compose the single-stroke name in every style (two-line names, hairline)
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: