/ CHANGELOG
67 releases
What shipped, release by release.
Every release, the diagram engines and fixes it shipped — with the rendered output for each diagram it touched. Click any render, or open the gallery’s by-type view.
Unreleased
v1.0.14
2026-09-031 diagram- ·Furniture can be fitted and mirrored without asking an agent to do rotated-bounds arithmetic.
fit [margin n]rotates first, scales down without distortion, and centers the final envelope in the room;mirror x|yreflects the symbol around its center while keeping labels such as a stair'sUPreadable. Existing explicitat x,y,size, androtatebehavior is unchanged. - ·Façade openings can be laid out as measured chains. Doors, windows, and archways accept
from start|end n, a trailingid, andbefore|after <id> gap n. Direction is stable—west to east on horizontal walls, north to south on vertical walls—and references must name an earlier opening on the same resolved wall, so an AI agent cannot accidentally create a cross-wall or forward-reference chain. - ·One resolved wall model now drives drawing and openings.
wall exterior thickness n,wall interior thickness n, andwall between A B thickness nproduce deduplicated wall segments with explicit ownership and thickness. Openings inherit their host wall's actual thickness; semantic SVG exposesdata-wall-scopeanddata-wall-thickness. Omitting wall rules preserves the existing 0.20 m default. - ·Room labels are layout-owned annotations. A deterministic center-out pass avoids furniture's full visible envelope—including chairs generated around a table—MEP symbols, hinged-door swing sectors, and protected-zone captions. Small service rooms automatically use a compact name-only label. The SVG marks automatic placement with
data-label-placement="auto".
- ·The reference, website documentation, README, AI generation profile, and examples use the same canonical sentence shapes. New behavior remains a modifier on the existing domain noun—
furniture … fit,door … from start,wall … thickness—instead of introducing parallel POC-only commands. Circuit membership and a split-level stair primitive remain explicitly unsupported rather than being documented ahead of the engine. - ·Three visual benchmarks now exercise residential, L-shaped townhouse, and restaurant plans. Each benchmark keeps its source DSL, generated SVG/PNG, image reference, and machine-readable diagnostics together; all three render
validwith zero diagnostics. The browser comparison page makes visual review repeatable instead of treating parser success as image quality. - ·Stricter door-clearance validation exposed old examples instead of being waived for them. Nine public floor-plan examples and one production regression fixture now describe the intended real-world door behavior—out-swinging exterior doors or non-hinged warehouse openings—so the gallery stays warning-free without suppressing the new check.
- ·Regression coverage is broader than the release surface. Sixteen focused visual-contract tests cover transforms, measured opening chains, wall hierarchy, door clearance, automatic labels, symbol envelopes, zone captions, and compact rooms; the complete floorplan and regression set contains 418 passing tests.
v1.0.13
2026-08-21Changeda misplaced rectangle no longer throws away the building
- ·Half of one production floor-plan site's generations were failing, and the largest single cause was that two rooms touched. Replaying thirty real prompts through the full retry loop, eleven of the twenty-one first-attempt failures carried *only*
room-overlap,opening-no-shared-walloritem-collision— a plan the engine had already laid out and then refused to hand over. Someone who asks for a floor plan would rather have one with a visible overlap than a validation panel and nothing else; the overlap tells them what to move, the panel does not. - ·Seven position conflicts are now warnings:
room-overlap,opening-no-shared-wall,opening-no-wall,fixture-no-wall,array-does-not-fit,zone-outside-roomandprotected-zone-obstructed. Nothing else changed — every one of those sites already skipped the offending element and carried on, so the severity alone was keeping the drawing off the page and the engine diff is seven words. - ·This is the line 1.0.10 drew for furniture overshoot, extended to the rest of the same family. Fatal now means there is nothing to render: a reference to a room that was never declared, an extension of something that is not a room, no rooms at all. Those are structural rather than positional, and a diagnostic is the only honest output.
- ·Measured on the same thirty production prompts, scoring both engines against identical model transcripts: first-attempt success moves 37% → 47% and after-retry success 73% → 80% on one model, 10% → 17% and 23% → 33% on another. About ten points either way, from a change that adds no logic.
v1.0.12
2026-08-20Changednetlists are laid out as schematics, not as graphs
- ·A netlist used to be drawn in the order it was typed. Placement was
x = declaration index × 96pxacross three fixed vertical bands, so canvas height was constant while width grew with every part: four components came out at 1.7:1 and twenty at 6.7:1, a strip too wide to read on any page. Power and ground were drawn as full-width rails that every pin dropped onto, which meant parts also had to line up along those rails to reach them. Nothing in the resulting picture said what the circuit did — the file's own header called its output "readable but not publication-grade". - ·Power and ground are no longer wires. Each pin on a supply net now gets a local flag beside it instead of a run to a shared rail. That removes most of the wires in a typical drawing and, more importantly, frees placement. Flags are decoration, not parts: they live in their own
flagschannel and never enteritems, so they cannot leak into the scene graph, ERC, or any export that enumerates components. A ground symbol the author declared is re-used as the flag for pins on its net rather than being dropped from the drawing. - ·Signal flows left to right. X position comes from breadth-first depth over the signal graph; a feedback net simply fails to deepen a component that was already reached, which is the treatment feedback deserves. Crossing reduction is the standard barycenter sweep. Long chains fold onto the next row, always left to right — a deliberate choice over the more compact serpentine fold, because a row running
R9 R8 R7 R6reads as a numbering mistake rather than as a wrap. - ·Pin coordinates constrain placement, not just routing. A two-pin part returning to ground hangs vertically off the node it taps; a supply-fed part carries the chain horizontally. A part whose upstream pin was written second is mirrored so the signal still enters from the left — mirroring reflects netlist pin order and never cosmetic tidying, so a diode written cathode-first draws as a diode pointing the other way rather than being silently corrected. An orientation the author wrote with
dir=still outranks anything layout infers.
v1.0.11
2026-08-20Changedan unknown word is no longer a fatal error
- ·Two releases in a row shipped an alias list, and production kept finding new words. 1.0.10 added sixteen circuit component types; within a day, production DSL turned up
outlet,switch_no,prox_sensor,MAX17048,ESP32,1N4007, and a set of block-diagram roles the grammar had never heard of. A third list would have bought another few weeks, because there is no finite set of ways to name a thing in English. The disposition was the defect, not the coverage: an unrecognised *value* inside a well-formed statement now degrades instead of killing the drawing, and the vocabulary tables become a quality layer rather than the thing standing between a user and any output at all. - ·Decorative values fall back and warn. A block's
[role: ...]selects a shape; an unknown one now renders asgenericand reportsblockdiagram/unknown-roleinstead of throwing. Unrecognised connection attributes (a -> b [route: above]) are ignored the same way. Nothing is lost but styling, which never justified discarding the diagram. - ·
inputandoutputare first-class block roles. They were the two most natural words in the whole vocabulary and the grammar rejected both. Treating them as junk to be aliased away would have been the cheap answer; a block diagram genuinely has input and output blocks, so they now render as themselves. - ·An unknown circuit component becomes a labeled box, not a refusal.
U2 sda scl vcc gnd type=MAX17048draws a rectangle reading MAX17048, wired to every net it declared, which is exactly what a draftsman does with an unfamiliar part. This replaces the red?placeholder, which was worse than useless — it looked like damage while reporting success, so it sailed through publication gates and onto public galleries. Part numbers now work for free as a consequence rather than as a special case. A wrong symbol is still never guessed: when the family is uncertain, it is a box.
Addedthe safety catalogue answers to the words people use
- ·Evacuation plans rejected the everyday spelling of their own symbols. The ISO 7010 / NFPA 170 catalogue has twenty-eight kinds, and
fire-extinguisher,assembly-point,emergency-exit,fire-alarm,you-are-herewere none of them — the parser even computed a did-you-mean suggestion and then threw anyway, so the matching already worked and only the disposition was wrong. Those spellings now resolve, through one exported resolver rather than a second lookup table beside the first, which is the mistake 1.0.10 had to unwind on the circuit side. - ·
escape-routeis deliberately not an alias. An escape route is a path, not a point symbol; mapping it ontoexitwould have answered a different question than the one asked. It belongs to theroutestatement, and saying so in a diagnostic is more useful than quietly drawing the wrong thing. - ·
exit-directioncompletes the egress set, and the evacuation documentation and worked examples were expanded to match — the symbols that shipped in earlier releases were never demonstrated, which is how 1.0.8's electrical work ended up being requested as a new feature after it already existed. - ·--
v1.0.10
2026-08-191 diagram- ·Every P&ID SVG is valid XML again. Its accessibility description wrote the literal
P&IDthrough the low-level element builder, bypassing XML escaping, so the raw ampersand made every export malformed and<img>embeds failed as broken gallery cards. P&ID and State descriptions now follow the same escaped path as their adjacent titles; the audit also found and fixed unescaped UML generic member types such asMap<String,List<int>>. A strict XML-parser test now renders all 219 bundled examples across every engine, pinning the entire SVG catalog rather than this one string. - ·Production electronics vocabulary resolves to electrically honest symbols. Circuit's positional and netlist parsers maintained separate alias tables, so familiar names could work in one mode and throw
Unknown component typein the other. Both modes now share one resolver formcu,pushbutton,ntc,regulator,ldo_3v3,dc_supply,selector,switch_spst_nc,pullup, anddc_motor; real IEEE 315 / IEC 60617-style symbols cover combined NO and SPDT relays, a maintained NC switch, fan, photovoltaic cell, and thermionic triode. Sixteen realistic netlist fixtures pin both the accepted production spellings and the relay pin mappings. - ·Boilers, burners, and generators no longer degrade into unknown P&ID placeholders. The equipment catalog stopped at general chemical-process vessels and rotating machinery, leaving common utility and fired-equipment names outside the parser even though they belong on plant P&IDs. Each now has explicit ports, measured geometry, and a recognizable ISO/ISA-style equipment glyph; a fired boiler train fixture proves the three symbols route together without warnings.
- ·Furniture overshoot is advisory instead of diagram-fatal. Floorplan validation treated the room boundary as a hard containment constraint, which erased the whole drawing for survey noise as small as 0.05 m and for intentional edge-straddling equipment such as loading docks. Out-of-bounds furniture now renders at the exact authored coordinates without clamping or repositioning and returns the unchanged quantified message as a
floorplan/item-outside-roomwarning. Fixtures replay the reported sink, 2.8 m loading-dock, and ten-seat round-table cases, while a fully contained plan remains warning-free.
v1.0.9
2026-08-10Fixedwall-mounted fixtures are no longer buried by the wall
- ·The wall band was painted over every wall-mounted fixture. The furniture layer was emitted before the wall layer, so the solid poché band covered the top of any glyph anchored to a wall — 83% of a
whiteboardorsmartboard, 67% of a wall-mountedtv, and a third of aswitchoroutlet. Anchored fixtures now render in their ownsx-fp-wall-fixtureslayer after the walls and openings, which is where the electrical symbol layer sits in normal drafting practice. Free-standing furniture keeps its existing z-order. - ·This defect predates the 1.0.8 electrical work — the older wall fixtures were buried worse than the new electrical ones. It went unnoticed because a half-hidden whiteboard is cosmetic, whereas on an electrical plan the wall symbols *are* the drawing. A test now pins the layer ordering on all four walls so it cannot silently regress.
- ·The electrical plans are in the static gallery. 1.0.8 added the two worked electrical examples to the site but not to the pre-rendered
examples/sheet, so they were missing anywhere the static SVGs are used. Both are now generated:apartment-electrical-nec.svgandapartment-electrical-iec.svg. - ·--
v1.0.8
2026-08-102 diagrams- ·A floor plan now declares which electrical symbol convention it follows.
symbols nec|iecon the header selects between ANSI Y32.9 / NEC forms (switches asS,S₃,S₄,S_D; receptacles as slotted circles) and IEC 60617 forms (semicircle sockets with a stem, dot-and-lever switches) for the whole document.necis the default. A GFCI receptacle correctly annotates asGFCIundernecandRCDunderiec, because that is what each audience calls it. - ·Eighteen new fixtures cover what a code-compliant plan actually needs. Switches
switch-3wayswitch-4wayswitch-dimmer; receptaclesgfci-outletoutlet-240vfloor-outletweatherproof-outlet; luminairesrecessed-lightwall-lightpendant-lightfluorescent-lightemergency-light; detection and controlsmoke-detectorthermostatmotion-sensor; communicationstv-outletphone-outletjunction-box. Three-way switches and GFCI/RCD protection were the two most conspicuous gaps — a stairwell light and a code-mandated kitchen receptacle were both previously undrawable. European and colloquial vocabulary resolves through aliases (rcd,sconce,downlight,troffer,pir, …). - ·
controlsdraws which switch operates which luminaire.controls SW1 -> L1, L2renders a dashed curve from a switch or motion sensor to each luminaire it drives, crossing rooms where it needs to, with two switches on one light expressing stairwell two-way control. This is the *situational* half of an installation drawing — the part that makes it useful to an electrician rather than just a symbol-placement exercise — and it is what [#85](https://github.com/SchemaTex/SchemaTex/issues/85) asked for. Undefined ids, self-control, a non-switch source, and a non-luminaire target are all rejected with a diagnostic rather than silently drawing nothing. - ·Wall-mounted glyphs orient themselves against the wall they hang on. IEC sockets and wall lights are directional, so a fixture placed on the south wall now rotates to face into the room. The flag lives on the symbol definition rather than in a separate list, and a test rejects any future symbol that is drawn wall-facing without it.
Fixedthe electrical symbols no longer mix two standards
- ·One drawing could previously contain both US and European conventions. The switch glyph was drawn as an IEC dot-and-lever while the ceiling light used the ANSI circle-and-cross, in an engine that documented itself as following US practice. Each symbol now belongs to a declared convention. The default switch glyph changes shape as a result; no published example was affected, because none used an electrical symbol.
- ·Eight symbol names were only four drawings.
lightandceiling-lightdiffered by the letter in their label;data-outlet,electrical-panelanddistribution-boardwere one rectangle with different text inside. Each now has its own form. - ·The floor plan standards citation no longer implies US-only output. The engine is metric-native — rooms in metres, 0.28 m treads, 0.65 m seating pitch, with
unit ftas opt-in conversion — but cited only Ramsey & Sleeper, which reasonably read as "this tool draws US plans" ([#82](https://github.com/SchemaTex/SchemaTex/issues/82)). References now name Neufert, *Architects' Data* and ISO 128 / ISO 129 alongside AGS, and state narrowly what each governs. No geometry changed.
- ·Multi-pin ICs declared in netlist mode now bind every net the user wrote.
IC1 0 2 3 8 0 2 7 8 type=icpreviously rendered an eight-pin box with no wires at all:generic_iccarried an emptynetlistPinsarray, the empty-array-is-truthy guard ingetNetlistPinOrderreturned zero expected pins, and every net the user declared was dropped without a word. Pins are now auto-numbered1..Nfrom the declared net count along the DIP convention, the box grows to show exactly N legs, and each leg is wired. Reported in [#79](https://github.com/SchemaTex/SchemaTex/issues/79). - ·The same silent drop affected far more than the reported case.
X/USPICE prefixes andtype=555were equally broken.type=555now binds the real 555 pinout in SPICE order —1 GND, 2 TRIG, 3 OUT, 4 RESET, 5 CTRL, 6 THRESH, 7 DISCH, 8 VCC— onto the existing timer symbol's anchors. - ·
terminal_blockhad the same defect and is fixed alongside it. Its pin anchors were documented as per-instance but never implemented, sopins="L,N,PE"bound the nets and then drew no wires. Pin legs and wire anchors are now generated from one shared, label-independent geometry helper, so the two can no longer drift apart. - ·A component that cannot honour its declared nets now says so. Explicit
pins=lists that receive more nets than they name raiseCIRCUIT_PIN_OVERSPECIFIEDinstead of silently truncating.
Fixedevery reference page in the docs sidebar
- ·The documentation sidebar linked English pages to a route that does not exist. fumadocs prefixes every locale by default, including the default one, so the sidebar pointed at
/en/docs/<page>while English is served bare at/docs/<page>— every reference link 404'd ([#67](https://github.com/SchemaTex/SchemaTex/issues/67)). Fixed at the source withhideLocale: 'default-locale'; three call sites that had each grown their own/en/workaround now trust the corrected URL instead of double-compensating. Non-default locales keep their prefix. - ·--
v1.0.7
2026-07-28Fixedtrustworthy validation and measured layout across generation-heavy diagrams
- ·
validnow means the requested diagram is semantically representable. Domain validation errors stop normal SVG rendering instead of producing a plausible-looking partial result, while stable diagnostic codes and authored source lines remain available for repair. - ·Pedigree family structure routes as family structure. Couples are packed as semantic segments and multi-partner relationships use an upper avoidance track, preventing spouse and descent lines from colliding or implying the wrong topology.
- ·Floorplan rejects structural ambiguity before geometry cascades. A document contract is fixed by its first header; repeated headers fail at their own line, multiline labels preserve logical statements, generated rooms and furniture use measured bounds, and collision checks distinguish intentional placement from impossible overlap. Machine-readable capabilities now expose supported furniture and fail closed for unknown runtime modes.
- ·Mindmap and Block Diagram preserve the source they validate. A shared logical-line reader handles physical and escaped newlines inside quoted labels. Markdown-wrapped Mindmaps keep their one-root contract; Block rejects unknown statements and undeclared endpoints, spreads boundary ports, reserves routed label lanes, and places measured fan-out peers on distinct rows.
v1.0.6
2026-07-282 diagrams- ·The AI profile now derives its compact
types:vocabulary from the live floorplan catalog. The six 0.9.9 restaurant symbols (range,fryer,walk-in,commercial-sink,prep-table,booth) can no longer exist in the engine while remaining invisible to generation; a mechanical test rejects any future catalog/profile drift. - ·Seven production-requested AGS-style symbols are now first-class. Added
bench,grill,easel,fountain,teacher-desk,toy-box, andbeanbagas original theme-class SVG line art.teacher-deskis a separate front-facing lectern/worktop because the existing officedeskalways adds a chair. - ·Every accepted furniture name participates in one lookup and one recovery list. Added
lounge-chair→armchair,stool→bar-stool,closet→wardrobe,file-cabinet→filing-cabinet, and householdoven→stove; unknown-type diagnostics now list aliases alongside canonical catalog keys.
- ·One source of truth for plot + patch.
stageplotis a first-class type served by the floorplan plugin'saltTypesmode. Measuredstagesurfaces reuse the metre/foot coordinate model; microphone/DI nodes automatically produce the input list, while wedges, IEMs, and side fills produce a quantity-bearing monitor-output schedule. - ·Live-sound symbol catalog. Added original builder-only symbols for drums/backline, microphones and stands, DI/mixer/FOH/snake, wedges/side fills/IEM, power, music stands, set lists, and the namespaced
stage-riser; existing stage, dance-floor, DJ booth, podium, row-chair, and piano art is reused. - ·Formal, print-safe technical advance. Venue/date/revision/contact metadata, automatic width/depth dimensions, stage-position codes, explicit
CH NversusMIX Nlabels, and a compact legend remain unambiguous in grayscale. - ·Correct performer-view directions. The audience is fixed at the bottom, with STAGE RIGHT on page-left and STAGE LEFT on page-right. Every monitor endpoint carries its console mix/send number.
v1.0.4
2026-07-27FixedLLM-generated DSL no longer fails on wrappers, valid names, labels, pins, or empty dates
- ·LLM wrappers are removed once, before every parser. The shared preprocess pass strips Markdown fences, leaked
<artifact>wrappers, Anthropicfunction_calls/invoke/parametertags, and DeepSeek fullwidth-pipe control tokens. Clean DSL is byte-for-byte unchanged, source offsets remain stable, and legitimate angle-bracket syntax such as circuit<ep>endpoints survives. - ·One Unicode identifier contract. Parsers that validate user-facing ids now share one grammar: a Unicode letter or underscore followed by Unicode letters, digits, combining marks, underscores, or hyphens. Arabic, Chinese, Hebrew, and accented Latin ids render without per-engine exceptions.
- ·More tolerant flowchart labels. Unquoted labels accept balanced parentheses, including nested function-style text. Ambiguous label syntax now recommends quoting the label; unsupported Mermaid-style
note forstatements remain errors but include a concrete rewrite. - ·Breadboard names match real pinouts. Expanded Arduino Nano and Raspberry Pi Pico pin catalogs, plus aliases for common MCU and module notation such as
D2,A1, andpin1. Side-placed grid modules such as servos receive a deterministic default coordinate, while genuinely unknown pins report the closest valid name.
v1.0.3
2026-07-271 diagramFixed
prisma rejected any wholesale-indented block, and said the wrong thing about whyPRISMA 2020 flow diagram- ·Common leading margin is stripped before levels are measured. Only relative indentation is meaningful, so a uniformly indented block now parses identically to the flat form at any margin width, including odd ones that are not multiples of the two-space level. Relative nesting is untouched.
- ·The error names the real defect. Indentation and keyword are now separate checks. The failure previously reported
first non-blank line must be "prisma", got "prisma"— self-contradictory, because the message printed the trimmed text while the indent test was what actually failed — sending readers hunting for a typo that was not there. A header sitting deeper than its body now says exactly that. - ·
check-doc-dslsvalidates the string the site renders. The script readinitial={\…\}straight out of the MDX source, while the MDX compiler hands the component that block with its common margin already removed. Nineprismadocs were consequently reported as broken for a condition that never reached a reader; the script now dedents the same way the compiler does. - ·--
v1.0.2
2026-07-261 diagram- ·Multi-floor floorplans.
floor N "Label"sections assemble horizontal or vertical plates at one shared scale. Stair instance ids register across levels, inferUP/DN, warn above 0.1 m misalignment, and reject cross-floor references. Legacy level-0 single-floor SVG output remains byte-identical. - ·Evacuation mode.
evacuation/escapeplanis a first-class diagram type served by the floorplan engine. It adds 40 renderable ISO 7010 / NFPA 170 safety-sign variants, original 24×24 line art on semantic colour plates, orthogonal escape routes with chevrons, fire/smoke-door marks, a mandatory Tier-M legend, and evacuation-specific layer switching. - ·Compliance computation.
iso,nfpa, anduaeprofiles compute a conventional print scale and fixed-sheet symbol size for A2/A3/A4/Letter/Tabloid, then run all 13 ISO 23601 / NFPA 170 / UAE Civil Defence checks with standard-cited diagnostics. Monochrome remains renderable for diagnosis but is reported as non-compliant. - ·Launch surfaces. Added six validated examples, nine-language evacuation docs, multi-floor sections in every floorplan locale, AI routing/profile coverage, gallery output, and the corrected ISO identities for emergency push/slide doors and F004/F006.
v1.0.1
2026-07-24Addedhost-layer viewport pan, zoom, pinch, and fit
- ·Coordinate-safe viewport.
attachViewport()applies translate/scale to the SVG host rather than an inner SVG group, sogetScreenCTM()keeps node dragging correct at every zoom level. - ·Gesture arbitration. Blank-space drag pans, editable-node drag keeps moving the node, modifier-wheel and trackpad pinch zoom around the pointer, and a second touch semantically cancels an in-progress node drag before pinch begins.
- ·React APIs.
SchematexDiagramandInteractiveSchematexDiagramaccept opt-inviewport,onViewportChange, andviewportRefprops. Existing markup and touch behavior remain unchanged when viewport is omitted. - ·Imperative controls. Applications can call
zoomIn,zoomOut,zoomTo,panBy,fit,reset,getState, andsetStatewithout adopting React or a third-party pan/zoom dependency.
v1.0.0
2026-07-17Addedopen-source interactive editor and AI-safe editing
- ·Public React editor.
InteractiveSchematexDiagramis a controlled Client Component with WYSIWYG label editing, semantic drag constraints, live connector previews, selection callbacks, and preview-safe diagnostics. Applications retain ownership of DSL state, persistence, undo, and collaboration. - ·Parser-native Canvas capability contract. Twenty engines expose deterministic authored text/field editing; 17 also support stable-ID drag or native geometry handles. The other 30 remain source-editable and renderable without guessed handles. A single typed registry drives SDK, website, and AI discovery.
- ·AI and MCP editing. Vercel AI SDK, local stdio MCP, and hosted Streamable HTTP MCP share eight tool manifests, including revision-guarded
inspectDiagramand atomicapplyDiagramEdits. - ·Editable website workspaces. Full-size homepage, docs, example, and Playground render surfaces use the public editor. The Playground adds a searchable, grouped example rail covering published examples and a 53-specimen interactive test lab.
Changed
- ·Package versions are now
schematex@1.0.0and@schematex/mcp@1.0.0. - ·The React bundle preserves its
"use client"boundary for Next.js and other React Server Component consumers. - ·The interactive React styling prop is finalized as
canvasClassName: it names the inner host<div>that directly contains the generated SVG. - ·Canvas writes now fail closed: core rejects stale source revisions and mismatched expected text, default renders contain no
data-sx-*hooks, and non-native engines no longer use SVG/source text matching to infer edit ranges.
v0.9.19
2026-07-09Fixedreadable, electrically correct household-lighting schematics
- ·Household AC layout. A source, protection/control chain, and lighting load now read left to right on the live conductor, with neutral returning on a clear lower rail instead of wrapping around the top of the page.
- ·Correct two-way switching. Two
switch_spdtcomponents sharing traveler nets render as facing changeover switches with separate parallel travelers. Either traveler declaration order is supported without creating an apparent crossing or short. - ·Clear labels. Labels stay above horizontal symbols and to the right of vertical symbols, so
V_mains, values, and reverse-facing switch labels no longer overlap wires, symbols, or the SVG edge. - ·Canonical lamp type.
lampis now a first-class circuit component type;type=lamp,type=light, andtype=bulball select the lamp symbol. Household examples useL1 ... type=lamprather than the misleadingRL1designator.
v0.9.18
2026-07-091 diagramFixed
circuit silently dropped unknown-type lines + rejected ; comments (production failure)Circuit schematic- ·Positional mode silently dropped unrecognized component lines. A model that wrote SPICE-style connectivity *without* the
netlistheader — e.g.breaker CB1 (L L1) 16A,rcd RCD1 …,switch SW1 …— had each unknown-type line silently discarded, rendering a schematic with almost nothing on it. CruciallyvalidateDslandrenderDslstill returnedok: truewith zero warnings, so no downstream check (in-loopvalidateDsl, or a caller's post-generation gate) could catch it. An identifier-led line whose head is not a known component type now raisesUnknown component type: "<x>"with a hint to add thenetlistheader — matching theid: typecolon form and every other diagram's unknown-kind handling. Known types and the netlist path are unchanged. - ·
;comments hard-failed in netlist mode. The grammar advertises "SPICE-style netlist", and;is SPICE's in-line comment marker, so models routinely write; notelines. These failed withInvalid component id: ";".;is now stripped as a comment (full-line and trailing) in both netlist and positional circuit modes, alongside the existing*,#, and%%markers.;stays circuit-local — it is not promoted to a universal marker, because other diagram types (e.g.network) use;as a statement separator. - ·--
v0.9.16
2026-07-091 diagram- ·
~x~divorced couple operator. The grammar's keyword list and examples advertise~x~for divorce, but the parser only recognized the ASCII alias-x-— soa ~x~ bfailed withUnknown individual 'x~ b'. This was the single most common genogram failure (Spanish, Hebrew, Chinese, English prompts alike).~x~is now accepted;-x-remains a valid alias. - ·Non-ASCII condition labels. The
conditions: name(fill)label was matched with an ASCII-only regex, sohipertensión(full)or右側半癱(half-right)failed withInvalid condition formateven though the fill was valid. Labels may now be any Unicode text. - ·Status synonyms.
stillbirth→stillborn, plusmiscarried/aborted/died/dead→ their canonical tokens. - ·Bare age vs year. A bare 1–3 digit number in
[...](e.g.[male, 28]) is now read as an age; a 4-digit number remains a birth year.
v0.9.15
2026-07-082 diagramsFixedthe header line is optional when the diagram type is already known
- ·Header recovery. When the type is forced and the body does not
detect()as that type, the canonical header is prepended and kept only if the result parses cleanly. A genuinely malformed body (a real syntax error, an unsupported node form) still fails with its true error — recovery never masks it. - ·Dialect-aware. erd recovers with
erDiagram(the Mermaid crow's-foot dialect), not bareerd(which selects the nativetable/refparser). Other engines use the bare type name. - ·Headerless-by-design grammars (mindmap's
# Title) alreadydetect()true, so they short-circuit untouched. Applies uniformly toparse,parseResult,render, andrenderResult.
Fixed
usecase non-ASCII actor names + network device-kind synonymsUML use case diagramNetwork topology- ·
usecase— non-ASCII auto-generated ids. When an actor/use-case had no explicitas <id>, the synthetic id stripped every non-[A-Za-z0-9_]character to_. Korean actors (순원,순장) all collapsed to__and collided (identifier '__' already declared) — a recurring production failure for CJK use-case diagrams. Ids now preserve Unicode letters/digits, so non-ASCII names stay distinct. - ·
network— device-kind synonyms. Added common everyday aliases so a valid topology doesn't fail on a vocabulary gap:webserver/mailserver/dns/dhcp/ntp/database/db/dbserver/vm/host/hypervisor/activedirectory/domaincontroller→server,desktop→pc,smartphone/tablet→mobile,accesspoint/wap→ap,hub/bridge/l2switch→switch,ngfw/utm→firewall,mfp→printer. - ·--
v0.9.14
2026-07-082 diagramsFixedaccept forms the model reasonably writes (
erd titles, floorplan furniture synonyms)Entity-Relationship Diagram (ERD)Floor plan- ·
erd—title:/direction:/notation:under the MermaiderDiagramheader. The nativeerdheader already accepted these attributes, but the MermaiderDiagrampaste-compat path hard-failed on them (Unrecognized erDiagram line: title: "…") — and it didn't even carry a title. A model that writeserDiagram+title: "…"(mixing the two dialects' most natural forms) lost the whole diagram. TheerDiagrampath now accepts the same header attributes and mapstitle:to the diagram title. Genuinely malformed lines (e.g. a trailing over-closing}) still throw. - ·
floorplan— common furniture synonyms. Added aliases for everyday words that map cleanly onto an existing type:console-table/console/end-table→side-table,couch→sofa,settee→loveseat,tv-console/media-console/entertainment-center→tv-stand,refrigerator→fridge,cooktop/stovetop→stove,armoire→wardrobe,wc/water-closet→toilet. A valid layout no longer fails on a vocabulary gap. - ·--
v0.9.13
2026-07-08Fixedconsistent comment handling across all diagram types
- ·Universal
%%comments. Mermaid-style%%line and inline comments are now stripped once in the shared preprocess pass, so every diagram type accepts them regardless of its own lexer.%%never begins valid content in any schematex grammar, so this is collision-free; comment-only lines are blanked (not removed) so diagnostic line numbers stay stable. - ·
circuithonors SPICE*comments. A line whose first non-blank character is*is now treated as a full-line comment, matching the SPICE-style syntax the grammar advertises.*can never begin a valid component id, so this is unambiguous. (#inline comments continue to work.) - ·
stripLineComment(line, markers?)now takes an optional marker set (default%%////#, unchanged for existing callers); the shared pass narrows it to%%only, so#///stay content where diagrams use them (e.g.#headings inmindmap). - ·--
v0.9.12
2026-06-301 diagram- ·
siteplanengine. Added parser, layout, renderer, package export (schematex/siteplan), AI registry/profile entries, docs navigation, icon, tests, and reference standard ([52-SITEPLAN-STANDARD.md](docs/reference/52-SITEPLAN-STANDARD.md)). - ·DSL primitives. Supports irregular
parcelpolygons,structurefootprints,parking/landscape/zonepolygons,road/driveway/walkway/trailpaths, planning overlays (frontage,setback,easement,fence,utility,boundary), markers (tree,car,pin,entry,hydrant,well),dim,callout,north,scale, andlegend. - ·Professional plan-sheet styling. White sheet, heavy property lines, hatched building footprints, roofline hints, side-panel legend/north/scale, architectural dimension ticks, line-following labels, subdued roads, and plan-symbol trees.
- ·Commercial parking/driveway language. Driveways render as paved aisles with edge lines; commercial-width drive aisles add lane markings and directional arrows. Parking polygons use stall-striping style instead of generic hatch fills.
v0.9.11
2026-06-294 diagramsAddeduser-feedback electrical layout hardening (
breadboard, sld, floorplan, circuit)Breadboard / Physical wiringSingle-line diagramFloor planCircuit schematic- ·
breadboard— pin aliases + common maker modules. ESP32/Arduino endpoints now tolerate the names users actually type (D22/IO22/22forGPIO22,5V/VBUSfor ESP32VIN,A4/A5forSDA/SCL, potentiometerA/WIPER/B). Addedpotentiometer,sensor vl53l0x,display tm1637, andmodule l298n, plus ESP32-C3/S3 subtype aliases to the existing ESP32 footprint. - ·
sld— first-class IEC residential distribution primitives.rcd/rcbo/rccbnow render as typed RCD devices instead of generic ground-fault symbols;consumer_unit/distribution_board/panelnow render as consumer-unit symbols instead of industrial busbars. Breaker/RCD attrs (curve,icn,rcd_type,sensitivity) and structured cable attrs (cable_csa,cable_length_m,cable_insulation) are preserved and rendered. - ·
floorplan— electrical fittings overlay. Added room-relative overlay fixtures:outlet,duplex-outlet,switch,light,ceiling-light,data-outlet,electrical-panel, anddistribution-board. Parser aliases cover common prompt words (socket,receptacle,consumer-unit,section), andsize Nnow means squareN×N. - ·
circuit— control-cabinet / panel-layout MVP. Positional mode now supports absoluteat=x,ycoordinates plusenclosure,din_rail,wire_duct,plc,pilot_light,selector_switch, andemergency_stop, so DIN-rail/control-panel front-layout prompts do not need to fall back to raw SVG.
v0.9.10
2026-06-263 diagramsFixedAI generation context surfaced shipped capabilities (
floorplan, matrix, timing)Floor planMatrix / quadrantTiming / waveform diagram- ·
floorplan— named seating charts. Theseats "Alice" "Bob" …clause (write occupant names onto auto-seated chairs — the difference between a venue plan and a seating chart) shipped in 0.9.x but was absent from the generation-tier grammar card and from every featured example, so the model couldn't emit it. Addedseatsto thefurnitureclause + apreferbullet (withplan de table/ 席次表 phrasing), and promoted "Wedding seating chart — named guests" to a featured example. - ·
matrix— QFD / SIPOC / Punnett body grammar. The three computational modes (matrix qfdHouse-of-Quality,matrix sipoc,matrix punnett) were named as headers but their body syntax was missing from the grammar card, and no QFD/SIPOC/Punnett example was featured — the model knew the modes existed but couldn't write a valid document. Added thewhat:/how:/rel/roof,suppliers:/inputs:/process:/outputs:/customers:, andcross:/traitgrammar + inline forms +preferguidance, and featured the House of Quality, monohybrid Punnett, and SIPOC examples. - ·
timing— removed a phantom keyword. The grammar card advertisedphase: FLOAT (0.0–1.0), which the timing engine never implemented — the model would emit it and the parse would fail. Removed. - ·--
v0.9.8
2026-06-152 diagrams- ·
decision/pugh— the computational centrepiece. Stuart Pugh's controlled-convergence method (ASQ / Six-Sigma concept selection): each criterion carries aweight:, each option a numeric score, and the engine computes every option's weighted total Σ(weight × score), ranks them, highlights the winner, and shows vs-datum deltas against an optionalbaseline:. You never type the totals — getting a score wrong changes the computed winner. Same "engine computes the answer" stance aspertandfaulttree. - ·
matrix— options × criteria comparison grid; cells takeyes/no/partialmarks (→ ✓ / ✗ / ~) or free text. A typo'd option name is flagged, not silently dropped. - ·
tchart/ychart— 2–N compare/contrast columns, rendered as distinct rounded cards with per-column coloured headers. - ·
pros-cons— green ✓ / red ✗ valence with pill headers and circular badges.
v0.9.7
2026-06-15AddedRBD time-dependent reliability R(t) + criticality importance
- ·
mission: <t>+ a per-block failure distribution:rate=λormtbf=N(exponential, R(t) = e^(−λt)) orweibull=β,η(R(t) = e^(−(t/η)^β)). The engine evaluates R(t) per block and rolls it up exactly as for static reliabilities; the headline becomesR(t=…) = …. ConstantR=/p=blocks still work and mix freely. A distribution with nomission:warns and falls back to the constantR. Keepmissionand rates in consistent time units. - ·Criticality importance
I_C(i) = Iᴮ(i)·(1−Rᵢ)/(1−R_sys)for every block — derived cheaply from the existing Birnbaum computation. - ·New worked example (pump station 1-year mission, MTBF + Weibull) + an R(t) section in the RBD docs.
Fixedfault-tree top-event probability no longer collapses to
1- ·--
v0.9.6
2026-06-151 diagram- ·
gantt "Title"header (sugar forpert+layout: gantt), orlayout: gantton apertdocument. - ·Calendar axis:
start: YYYY-MM-DDturns the axis into dates (omit for a numeric day-offset axis);calendar: continuous(default, spans weekends) orcalendar: 5day(excludes Sat/Sun). Pure integer date arithmetic (days-from-civil) — deterministic, zero-dependency. - ·One row per task, grouped into sections by
lane:; off-critical-path bars drawn in the resting blue with their slack annotated, critical bars in red. - ·
progress: 60%completion overlays,milestonediamonds, dependency connectors, and an optionaltoday: YYYY-MM-DDmarker line.
v0.9.5
2026-06-152 diagramsAdded
rbd: reliability block diagram engine (50-RBD-STANDARD)Reliability Block Diagram (RBD)Control-systems block diagram- ·Brace-nested success logic:
series { … },parallel { … }, andkofn k/n { … }groups nest freely aroundblock ID "Label" R=0.99leaves. Reliability is given asR=0.99, failure probabilityp=0.01, or a percentageR=99%. A bare top-level block list is treated as a series chain. CJK quotes welcome. - ·Computation is the differentiator: system reliability by exact reduction (∏ for series, 1−∏(1−Rᵢ) for parallel, 2ⁿ state enumeration for k-of-n); Birnbaum reliability importance Iᴮ(i) = R_sys(Rᵢ=1) − R_sys(Rᵢ=0) for every block (the highest is the improvement target, accented); and single-point-of-failure detection (a block where R_sys(Rᵢ=0) = 0, drawn in red). High reliabilities keep their nines — the figure is never rounded up to "1".
- ·Left-to-right layout: recursive bounding-box packing — series chains wired end-to-end, parallel/k-of-n groups stacked on rails fanning out of a split node and back into a join node, bracketed by input/output terminals. k-of-n groups are labelled
k/nat the join. - ·Shared risk-reliability palette: neutral blocks, blue reliability numerals, red SPOF borders;
monochromefalls back to border weight (regulator print),darkis the Catppuccin variant. Semantic SVG withdata-id/data-r/data-spof/data-critical.
v0.9.4
2026-06-111 diagram- ·One
SportModuleper sport, shared everything else: parser, layout resolver, and renderer are sport-agnostic; each sport (football.ts/basketball.ts/soccer.ts) owns its coordinate model, formation/set roster, named-route + landmark resolution, field markings, and legend. A fourth sport is purely additive. - ·Three real coordinate models: football in yards (offense attacking up, downfield = +y, ball at origin); basketball in feet (NBA half-court, baseline + hoop at top); soccer in metres (full IFAB 105 × 68 m pitch, attack toward +x, or
view half). - ·Players by formation or by hand: football
formation i-form|shotgun|spread|trips|empty|goal-line|wishbone|…(+ strength), basketballset horns|spread-pnr|5-out|1-4-low|box|…, soccerformation 4-3-3|4-4-2|4-2-3-1|3-5-2|…; or place individuals withplayer <id> <pos> at x,y label …for set-pieces. - ·Movement verbs drawn in each sport's own line style — and the pass-vs-run convention is *inverted* between sports, honoured rather than flattened: football
route(route tree) /run/handoff/pull/block(solid routes, arrowheads, block T-bars) + dashed throws; basketballpass(dashed) /cut(solid) /dribble(wavy) /screen(T-bar) to named landmarks (rim, elbow, wing, corner); soccerpass(solid) /run(dashed) /dribble(wavy) /shot(double line). The rendered legend always matches the sport.
v0.9.3
2026-06-091 diagram- ·Rooms → walls, computed: rectangular rooms with explicit dims chain via
right-of/below(+align/offset); adjacent rooms share an edge and their poché wall bands merge automatically. L/T/U-shaped rooms viaextend <room> at x,y size WxH— a rect-union model that mirrors how professionals measure L-rooms (split into rectangles, sum), chosen over polygon vertices for LLM ergonomics; walls open along interior seams, the area reports as one number, the label centers on the largest part. - ·Openings hung on walls, not coordinates:
door between A B at 50%resolves the shared wall segment (multi-part aware) and positions along the overlap; wall-side form (door hall west at 50%) positions along the concatenated exterior segments. Door types single/double/sliding/pocket/bifold; window types fixed/sliding/casement/bay (bay draws the splayed projection);openingarchways; openings clamp to their segment with a warning. - ·Stairs per drafting convention:
stairs/stairs-l/stairs-u/spiral-stairs— 0.28 m (11″) tread lines, direction arrow from the lowest tread with anUPlabel (item label overrides forDN), the 45° zigzag cut-plane break line with dashed treads beyond, blank landings; pluselevatorandcolumn. - ·93-symbol auto-seating furniture catalog across seven demand clusters (residential incl. sectional/fireplace/grand piano/ceiling fan; kitchen/bath incl. dashed wall-cabinet & range-hood above-cut-plane conventions, double vanity, urinal; classroom/office incl. desk-l, lockers, filing; event/banquet; retail/warehouse
shelving/checkout/clothing-rack/fitting-room/pallet-rack/loading-dock/forklift; salon/gymsalon-chair/shampoo-bowl/manicure-table/treadmill/weight-bench/power-rack/yoga-mat; site/outdoortree/car) —round-table-8*is* 8 countable chairs (60″ top), dining/banquet/conference tables seat both long edges at 0.65 m pitch,manicure-tableseats client + technician,row-chairsplaces theater strips at 0.55 m. Arrays:grid/rowwith row-majorcounttruncation (27 desks in a 5×6 grid drops the tail),arcfor semicircle seating facing center.
v0.9.1
2026-06-094 diagramsFixedfive renderer bugs visible in any gallery (P0)
- ·Sociogram group colors actually render now. The base
.schematex-sociogram-nodeCSS rule setfill, which beats per-nodefill=""presentation attributes by CSS specificity — every node painted accent-blue regardless of its group color, contradicting the legend (girls declared#EF5350rendered blue). Nodes now carry the generated.schematex-sociogram-group-<id>class (emitted after the base rule, so it wins); role classes (star/isolate/…) keep priority over group color. - ·Timing title no longer collides with the first waveform. A
TITLE_Hband is reserved above the grid whentitleis set (and the title style moved from an inlinestyle=""to the stylesheet, where it belongs). - ·Network labels are legible. Device labels/sublabels and the new icon badges get a
paint-order: strokehalo so the tiered layout's diagonal links no longer strike through them; the PoE/GW/VPN/×N badges moved from near-invisibledeviceAccent(pale blue on white) to a haloedsubLabelclass; link annotations are placed by a candidate-position pass that clears device boxes (estimated at full text width via the new core text-metrics) and previously placed labels, degrading gracefully when the corridor is crowded. - ·QFD roof sits on the matrix again. The HOW-label band was a fixed 130px, leaving a dead band between the correlation roof and short rotated labels; it is now sized from the actual painted extent of the longest label (
estimateTextWidth × sin 60°), clamped 48–220px.
Added
src/core/text-metrics.ts (P1)Changedone title style across every family (P1)
- ·*Centered on content, not canvas. Six families (epc, bowtie, eventtree, faulttree, idef0, causalloop) draw the title *inside* a
translate(pad, pad)content group but were centering it atwidth / 2(canvas center) — so the title landed one padding-width (~20px) right of the actual content. Fixed tolayout.width / 2(content-area center); threatmodel got the matching fix for its untranslated root. EPC layout also reserved the back-edge routing margin (BACK_MARGIN) unconditionally, leaving a one-sided whitespace band on acyclic charts that pushed both content and title off-center — now only reserved when loop-back edges exist.
ChangedBPMN, state, matrix, blockdiagram join the theme system (P2)BPMN business processMatrix / quadrant
- ·
BpmnTokens— BPMN gets a *designed* default palette per the de-facto tool colour language (Camunda/Bizagio/Signavio): green start events, red end events, amber gateway diamonds with deep-amber glyphs, blue-tinted tasks, slate pools/flows — replacing the previous all-grey look.monochromeis the pure OMG-spec print stance;darkis Catppuccin. - ·
StateTokens— unifies the renderer's two hardcoded body blacks (#1a1a1a vs #2a2a2a) onto slate, keeps the conventional sticky-note yellow as a token, adds monochrome + dark. - ·
MatrixTokens— the entire quadrant/heatmap/correlation/SIPOC/QFD/Punnett stylesheet (≈90 hardcoded colors) is parameterised across ~26 semantic tokens; data palettes (category colors, heat ramp, quadrant tints) deliberately stay renderer-local since they encode data semantics that hold across themes. - ·
BlockTokens— role fills move from Material-Design tints onto the house Tailwind-100 tints (controller blue, sensor purple, actuator green, filter yellow, disturbance orange), aligning blockdiagram with flowchart/bpmn; monochrome + dark added.
- ·
wrapLabel()(src/diagrams/flowchart/layout.ts) — greedy line breaking that prefers spaces (consumed at the break), treats every full-width glyph as a valid break point (spaceless CJK prose wraps cleanly), and hard-breaks unbreakable over-wide tokens (URLs, ids) rather than letting them overflow. Applied once atlayoutFlowchartentry, so sizing, the existing multi-line height growth, and the renderer's<tspan>output all see the same wrapped text. - ·Deliberately conservative: labels with explicit
<br/>/\nbreaks keep the author's line choices, and labels containing inline<b>/<i>markup pass through untouched (a styled span cannot be split across the per-line segment parser without breaking styling). - ·
FC_CONST.maxLabelWidth(420) is retained as the final clamp, but now only bites on unbreakable single tokens that survive wrapping.
- ·
isConventionalOpenNet()(src/diagrams/circuit/lint.ts) — single-pin nets matching power-rail conventions (vcc/vdd/vee/vss/vref/… , voltage literals+5V/3.3V/3V3), I/O-port names (in/out/vin/vout, numbered variants,_in/_outcompound suffixes likepwm_in), or header-broken-out serial/control pins (sda1,tx,clk,rst, …) now skip the floating-net and typo checks entirely. Such circuits validatevalidinstead ofpartial. - ·Everything else keeps the full ERC: non-conventional dangling names (
base1,gate) are still flagged, and the one-edit-awayCIRCUIT_NET_TYPOdetection is unchanged. - ·--
v0.9.0
2026-06-05AddedLLM-emittable grammar cards: all 45 families hardened + single-shot context (PR #35)
- ·
buildPromptContext(type, opts?)— new export. Assembles the canonical grammar card + featured worked examples into a single inject-ready string (one call instead of separategetSyntax+getExamples). Options:examples(default 2),detail,preferFeatured,maxComplexity. - ·All 45 grammar cards hardened to a uniform bar: concrete
forms, ≥3prefer/avoidhints naming real tokens, and a new compactkeywordsline enumerating each family's full vocabulary. Cards that taught syntax the parser rejects were corrected (e.g. SFCtransition from:/to:, blockdiagram auto-created ids). - ·Error-matched repair hints —
repairHint()now matches the actual validator diagnostic to the repair entry whose quoted error fragment fits, instead of always returning the first entry. When nothing matches, it no longer attaches a misleading hint — the raw error (already shown) plus a re-validate instruction stands on its own. Repair entries are authored as'<real error message>' -> <fix>. - ·Profile-completeness gate (
tests/ai/profile-completeness.test.ts) — a scorecard that scores every family's card across forms/prefer/avoid/repair/examples + featured + core-construct coverage, and hard-fails if any shipped example does notvalidateDslgreen. Keeps card quality from drifting as families are added.
v0.8.3
2026-06-03Addeddiagram
aliases + keywords discoverability metadata (first installment)- ·Populated for the nine diagram types added since 0.7.0 —
eventtree,fmea,causalloop,markov,gitgraph,epc,idef0,threatmodel,welding. The remaining types are tracked for the next installment. - ·
listDiagrams()(src/ai/tools.ts) now returnsaliases/keywordswhen present, so the LLM can map a request like "draw a STRIDE diagram" or "焊接符号" to the right type.
Fixeddocs navigation drift: 9 diagram pages were unreachable
- ·--
v0.8.2
2026-06-03Fixedentity
cluster [members: [...]] no longer fails to parse- ·Root cause (
src/diagrams/entity/parser.ts): the attribute-block regex captured the bracket body with[^\]]*, which stops at the *first*]. Becausemembers: [a, b]contains its own], the match terminated early, the outer bracket never closed, and the whole line fell through to the parse error. The capture now tolerates one level of nested[...], so the members array no longer truncates the attribute block. The downstreamparseProps/parseIdListhelpers already handled nesting correctly — only the line-level extraction was broken. - ·Tests (
tests/entity/parser.test.ts, new): the entity engine previously had no parser tests. Added regression coverage for empty / bracketed-members / members+color / color-only clusters, plus an end-to-end render assertion that members actually produce a grouping box.
Changed
- ·AI discoverability (
src/ai/profiles.ts): the entity generation profile now lists theclusterform and states thatmembersmust be a bracketed list, sogetSyntax("entity")surfaces grouping to the model instead of leaving it to guess Mermaid-stylesubgraph. - ·Docs (
docs/reference/12-ENTITY-STRUCTURE-STANDARD.md): the §5.3 mixed-jurisdiction cluster example used the un-bracketedmembers: a, bform, which contradicts the EBNF grammar ("members:" "[" ID_LIST "]") and is not parseable. Corrected to the bracketed form. - ·--
v0.8.1
2026-06-032 diagrams- ·
welding— full glyph catalog (16 types: fillet · square / V / bevel / U / J / flare-V / flare-bevel grooves · plug · slot · spot · seam · back · backing · surfacing · edge), drawn as original line-art. Dimension slots — size, throat(E), length, length-pitch, count×length, groove angle, root opening. Supplementary symbols — weld-all-around circle, field-weld flag, tail process/spec/NDE, contour (flush / convex / concave) + finish letter. AWS A2.4 single reference line, ISO 2553 System A (solid + dashed dual line, inverted side convention) and System B; arrow / other /both:sides; multi-joint vertical stacking. The structural differentiator: AI-readable validation of illegal type/side/dimension combinations (a fillet needssize,angleis groove-only,pitchneedslength, surfacing is arrow-side only).
- ·matrix →
punnett—cross: Bb x Bbwith allele-case dominance and optionaltraitphenotype names. Computes the canonical ratios — monohybrid 3:1, dihybrid 9:3:3:1 — reduced to lowest terms, with each box tinted by phenotype class. Mono / di / trihybrid (2×2 / 4×4 / 8×8). Three gallery examples: monohybrid (3:1), test cross (1:1), and dihybrid (9:3:3:1). - ·--
v0.8.0
2026-06-03AddedBucket B: 8 new diagram engines
- ·
eventtree— Event Tree Analysis (IEC 62502 / NUREG). Header function columns, success-up/failure-down pruned tree; the engine computes each outcome's path frequency = initiating freq × Π branch probabilities. - ·
fmea— Failure Mode and Effects Analysis (AIAG-VDA / IEC 60812 / SAE J1739). The engine computes RPN = S×O×D and the AIAG-VDA Action Priority, ranks the sheet, and colour-fills the RPN/AP cells by risk. Schematex's first table-shaped diagram. - ·
causalloop— Causal Loop Diagram (Sterman system dynamics). Signed links; the engine detects feedback loops and classifies each reinforcing (R) / balancing (B) by negative-link parity. - ·
markov— Discrete-time Markov chain. The engine computes the stationary distribution (power iteration) and classifies states recurrent/transient/absorbing; absorbing states render with a double ring.
v0.7.0
2026-06-02AddedBucket A: 4 engine-extension modes
- ·phylo →
dendrogram— merge-height (cophenetic) layout, rectangular elbows, height axis, andcut <value>flat-cluster slicing. - ·decisiontree →
influence— Howard & Matheson influence diagram: compact DAG with decision (rectangle) / chance (oval) / value (octagon) nodes and destination-derived arc semantics. - ·matrix →
sipoc+qfd— Six Sigma SIPOC table and the Akao House of Quality with a computed technical-importance row (Σ weight×strength) and a HOW×HOW diamond-cell correlation roof. - ·mindmap →
futureswheel+driver— Jerome Glenn concentric-ring consequence map and the IHI aim→drivers→change-ideas tree.
v0.6.10
2026-06-021 diagram- ·Minor-process line class (
src/diagrams/pid/renderer.ts): line types now map to explicit CSS classes —process→lt-pid-process,process_minor→lt-pid-process-min(was the unstyledlt-pid-process-minor). - ·No-fill guard class: every line
<path>now carries a sharedlt-pid-line-pathclass (with.lt-pid-line-path { fill: none; }), so no line can inherit a fill. - ·Z-order layering: render split into ordered groups — process pipes (
lt-pid-process-lines) behind equipment (lt-pid-equipment), with signal lines (lt-pid-signal-lines) + instruments above. - ·Line-mounted instrument placement (
src/diagrams/pid/layout.ts): an instrument thatmeasures/controlsa *pipe* (not equipment) now anchors to that pipe's midpoint x instead of a fixed offset.
v0.6.9
2026-06-011 diagramAddedLLM input recovery: code-fence stripping + abbreviated-header normalization (
src/core/api.ts)- ·Markdown code-fence stripping. Input wrapped in ```
mermaid …,schematex …, or a bare…fence now has the fence lines removed before detection. Previously the opening fence line (``mermaid) was read as the diagram header and the whole diagram failed to detect. A leading fence line and a trailing fence line are stripped independently, so a truncated artifact with only an opening fence is still recovered; unfenced input is untouched. - ·Abbreviated-header normalization. Once the target engine is known, a first-token header that is a prefix (≥3 chars) of the resolved diagram type is rewritten to the canonical keyword —
flow→flowchart,org→orgchart,gen→genogram,ped→pedigree,seq→sequence,socio→sociogram,eco→ecomap. Headerless grammars (mindmap's# Title), already-canonical headers, and unrelated first tokens (e.g. flowchart's alternategraphkeyword) are left untouched. - ·New test suite
tests/core/input-recovery.test.ts(14 cases across fence stripping, abbreviation recovery, and the two combined).
- ·
CIRCUIT_DUPLICATE_ID— a reference designator declared twice (silently overwrites a pinMap entry). Runs in both positional and netlist modes. - ·
CIRCUIT_NO_GROUND— the circuit has a source (voltage_source/ac_source/battery/current_source) but no ground reference anywhere; node voltages are undefined. - ·
CIRCUIT_FLOATING_NET— a net only one pin connects to (dangling node), excluding intentional single-terminal reference symbols (ground / vcc / port / label / test_point / no_connect / antenna) and auto no-connect padding. - ·
CIRCUIT_NET_TYPO— a dangling net whose name is one edit (Levenshtein) from a properly wired net (e.g.votvsvout) — surfaced as a likely misspelled connection with a rename suggestion, in place of the generic floating-net warning.
v0.6.8
2026-05-311 diagram- ·
signal("label")with no consumer (only incoming edges, no outgoing) was silently dropped: the edge lost its label and the layout discarded it because the target had no anchor. Two fixes: the parser now applies the signal label to the surviving edge, and the layout synthesises a lightweight output-port anchor for any signal ID that is an edge target but not declared as a block/sum/port. - ·Compact height for pure-forward diagrams: an unconditional
FWD_Y + 170height floor overrode the natural canvas height even when there were no feedback rows, producing unnecessarily tall SVGs. The floor now applies only when at least one feedback row is present, reducing the canvas for simple diagrams. - ·Fixes the last non-P&ID pre-existing test failure (
tests/blockdiagram/renderer.test.ts). The 5 remaining P&ID test failures describe unimplemented layout features (z-order, instrument fan-out,process_minorCSS class) tracked indocs/issues/06-pid-layout-quality.md. - ·--
v0.6.7
2026-05-313 diagramsFixedParser tolerance: degrade-not-reject for circuit / orgchart / mindmapOrganisation chartCircuit schematicMindmap
- ·Circuit (
src/diagrams/circuit/netlist.ts): a multi-terminal component given fewer nets than its pin count (e.g. a 4-pin transformer given only 2 nets) no longer throws. Missing pins are padded with floating no-connect nets and the component is rendered; aCIRCUIT_PIN_UNDERSPECIFIEDlint warning names the shortfall and gives a minimal correct example. Newlint()hook incircuit/index.ts. - ·Orgchart (
src/diagrams/orgchart/parser.ts): unparseable lines are now skipped with anORGCHART_UNPARSEABLE_LINEwarning instead of aborting the whole chart. Edge-only (Mermaid-style) input (CEO -> CTO) synthesises implied nodes rather than throwing "unknown node" (ORGCHART_IMPLIED_NODE). Duplicate node ids keep the first declaration (ORGCHART_DUPLICATE_ID). Newlint()hook inorgchart/index.ts. - ·Mindmap (
src/diagrams/mindmap/parser.ts): a missing# Titlecentral topic is recovered — the first plain text line is adopted as the centre (rootInferred:"line"), or a "Mindmap" placeholder is inserted over top-level bullets (rootInferred:"placeholder"). The orphan-node throw is gone. Newlint()hook inmindmap/index.tssurfaces aMINDMAP_SYNTHESIZED_ROOTwarning.
Fixed
validateDsl now surfaces status and warnings- ·The return type of
validateDslis extended:ok:trueresults now carrystatus: "valid" | "partial"andwarnings: SchematexValidationError[], so upstream LLMs can see exactly what was recovered and self-correct rather than only seeing a binary pass/fail.
- ·New test suites:
tests/mindmap/degradation.test.ts,tests/orgchart/degradation.test.ts,tests/circuit/degradation.test.ts— 35 new passing tests covering degradation paths, lint warnings, and glyph coverage. - ·Updated
tests/ai/tools.test.tsto assert the new degradation contract (partial render + warnings) instead of the old hard-error expectation. - ·--
v0.6.6
2026-05-301 diagram- ·New
bowtieengine (src/diagrams/bowtie/) for CCPS / Energy Institute 2018 barrier-based risk management (IEC 31010 §B.4.6, ICAO Doc 9859) — the sibling offaulttreein the Risk & Reliability cluster. A central top event (the knot) with threats fanning in from the left through chains of preventative barriers and consequences fanning out to the right through chains of mitigative barriers, shaped like a bow tie. Spec:38-BOWTIE-STANDARD.md. - ·The differentiator is not computation (bowtie is qualitative — no probability rollup) but a rigid, correct-by-construction symmetric layout that no general-purpose box-and-arrow tool produces, plus structural validation of the CCPS/EI barrier rule set: every threat must reach the top event through ≥ 1 barrier, every consequence must hang off it through ≥ 1 barrier, every escalation factor must attach to a named barrier — violations are *rejected* with plain-English errors, not silently drawn.
- ·Full element vocabulary:
hazardheader,topevent(green-disc knot),threat(orange),prevent/mitigatebarriers (grey, chained, declaration-order = outer→inner),consequence(red),escalationfactor (amber, drops below the barrier it degrades), escalation-factorbarrier. Indentation-structured DSL mirroring the CCPS 7-step build; CJK quotes accepted. - ·Bespoke symmetric band model (not the flowchart DAG engine): wings centred independently about the knot, centre-anchored barrier columns, escalation factors dropping into the whitespace below without breaking line symmetry. Theme:
BowtieTokens(BowTieXP/bowtiemaster colour scheme indefault, shape/border-basedmonochromefor regulator print, Catppuccindark).
v0.6.5
2026-05-301 diagram- ·New
faulttreeengine (src/diagrams/faulttree/) for NUREG-0492 / IEC 61025 fault tree analysis, opening a new Risk & Reliability cluster. Likepertandpetri, the engine *computes the semantics*: it runs MOCUS (Fussell-Vesely 1972) to enumerate the minimal cut sets (with idempotence + absorption, so repeated/shared events are handled correctly) and the top-event probability (prob: rare | mcub | exact), then highlights the cut sets in red and single points of failure in the strongest red. Spec:37-FAULT-TREE-STANDARD.md. - ·Events:
top/gate(intermediate) rectangles,basiccircles withp:,undevelopeddiamonds,houseevents withstate: 0|1, conditioning ellipses. Gates:AND(dome),OR/XOR(shield),VOTING(k/n; …),INHIBIT(x) if cond(hexagon),PAND(…) order: …. Flat declaration wired by id (DAG-friendly); keywordfaulttree(aliasfta). - ·Deterministic tidy top-down layout with content-sized event boxes; shared leaves duplicated (NUREG convention); cut-set boxes drawn behind nodes. Theme:
ReliabilityTokens(coloured-housedefault, faithful black/whitemonochrome, Catppuccindark). - ·Validation: exactly-one-top, undefined-reference (named), cycle detection, probability range, VOTING bounds, conditioning-gate placement — all readable errors.
v0.6.4
2026-05-301 diagram- ·New
umlclassengine (src/diagrams/umlclass/) for UML 2.5.1 §9–§11 class diagrams — the largest unfilled gap below Mermaid'sclassDiagram. Standard-correct adornments (hollow triangle → parent, filled diamond at the composite end), a generalization-driven layered layout (Sugiyama with dummy-node edge routing, so connectors never cross a box), and tree-merged inheritance heads (N children of one parent share one trunk + one triangle). Five classifier kinds, all six relationship kinds, visibility glyphs, multiplicity, roles, stereotypes. Spec:36-UMLCLASS-STANDARD.md. - ·Accepts the Mermaid
classDiagramheader and glyph aliases for one-line migration (<|--,*--,o--,-->,..>,..|>,--,..).
- ·Namespaces / packages:
namespace Name { … }renders a labelled containment frame (union + padding, C4-style). Dot-notationnamespace A.B.Cauto-creates parent packages; blocks nest syntactically; explicit["Label"]supported. A package-clustering pass keeps same-package classifiers contiguous so frames stay clean rectangles. - ·Mermaid member forms: tilde-generics
List~int~→List<int>(nested + on class names), single-lineClass : +member/Class : <<interface>>, member classifiers*(abstract) /$(static), and space-return-typegetId() String. A lone leading~stays the package-visibility glyph. - ·Single-line class bodies (
class Foo { +a +b }) now parse correctly (depth-aware member splitter). - ·Registered across
DiagramType,src/core/api.ts,src/index.ts,src/ai/registry.ts,src/ai/profiles.ts, andSYNTAX_KEYS. Theme tokens (incl. package-frame tints) insrc/core/theme.ts. Tests intests/umlclass/. Docs:website/content/docs/umlclass.mdx; examples:umlclass-shape-hierarchy.mdx,umlclass-order-model.mdx,umlclass-payment-strategy.mdx,umlclass-namespaces.mdx,umlclass-generics-mermaid.mdx.
v0.6.3
2026-05-293 diagramsChangedgraceful degradation for the highest-failure industrial diagrams (
SLD, P&ID, logic gate)Single-line diagramP&ID (Piping & Instrumentation)Logic gate netlist- ·L1 — the generation profiles now teach the full controlled vocabulary.
src/ai/profiles.tslists the complete equipment / node / gate-type enum forSLD,P&ID, andlogic gatein eachpreferblock, so the LLM emits canonical names instead of inventing synonyms. Repair hints gained example mappings (e.g.exchanger → hx_shell_tube,vessel_horizontal → vessel_h). This is a vocabulary fix, not a hard-coded alias table. - ·L2 — an unknown type keyword no longer blanks the diagram. When a parser hits an unrecognised node/equipment/gate kind, it keeps the element with an
"unknown"sentinel + the originalrawTypetoken instead of throwing. The renderer draws a visibly-flagged placeholder (dashed box +?+ the raw word, accent-coloured) so the output is never silently wrong, and the lint pass emits a non-fatal warning naming the bad token with a did-you-mean suggestion (SLD_UNKNOWN_DEVICE/PID_UNKNOWN_EQUIP/LOGIC_UNKNOWN_GATE). Genuine structural errors (duplicate ids, malformed syntax) stay fatal. - ·
P&ID— modifier keywords degrade to a safe default rather than a placeholder: an unknown linetype:falls back toprocessand an unknown instrument category tofield_discrete. The instrument-tag grammar was relaxed to accept dash-less tags (e.g.inst PLC : cr_shared). - ·Added
tests/{sld,pid,logic}/graceful-degradation.test.ts(17 cases): no-throw parsing,"unknown"sentinel +rawTypepreservation, flagged-placeholder markers in the SVG, the three lint warning codes, modifier-default fallback, dash-lessP&IDtags, and regression guards that fully-known diagrams stayvalid.
v0.6.2
2026-05-272 diagramsChangedMermaid header compatibility for
sequence and erdUML sequence diagramEntity-Relationship Diagram (ERD)- ·
sequence— accepts the MermaidsequenceDiagramheader. Under that header the arrow tokens take Mermaid meaning (->>synchronous call,-->>reply/return,-)async, plus--)/--x); under the nativesequence "Title"header the long-standing Schematex meaning is preserved (->>= async), so existing documents are unaffected.participant/actor,Note over A,B:, activation suffixes, andloop/alt/opt/par … endwork in both. Canonical profile now recommendssequenceDiagram. - ·
erd— accepts the MermaiderDiagramheader. Bare relationships (CUSTOMER ||--o{ ORDER : places, norefkeyword) auto-create their entities, and type-first entity blocks (ORDER { int id PK }, KEY ∈ PK/FK/UK) are parsed. The nativeerdheader withtable NAME { name type PK }+ref …is unchanged. Canonical profile now recommendserDiagram.
Addedshowcase examples
- ·
timing-clock-rle-shorthand— synchronous bus read using theclock Nandrle <state>*<count>shorthands (0.6.1 features). - ·
circuit-pullup-orientation-hint— netlist pull-up circuit demonstrating thedir=orientation hint (0.6.1 feature). - ·Added
tests/sequence/mermaid-compat.test.tsandtests/erd/mermaid-compat.test.ts(header detection, Mermaid arrow/cardinality semantics, native-mode regression guards). - ·--
v0.6.1
2026-05-27ChangedLLM-friendlier DSL for the highest-failure diagram types
- ·
circuit— netlist is now the recommended generation path. Canonical syntax (src/ai/profiles.ts) and docs lead with the SPICE-style netlist (circuit "…" netlist); the positional/cursor mode is reframed as hand-drawing only (it requires tracking a moving cursor across lines, the dominant LLM failure). Added an optional per-component orientation hintdir=right|left|up|down(Lcapy-style L2 control) that rotates a symbol without affecting connectivity. - ·
circuit— netlist auto-layout compaction. Two-pin components with one pin on ground are now recognised as shunt legs and dropped vertically beneath the node they tap; series / multi-pin components stay on a top spine row and spacing is tightened. Footprint: RC low-pass −36%, voltage divider −40%, common-emitter amp −32%; output now follows the conventional schematic idiom instead of one wide row. - ·
network— minimal core keeps the cheap structural hints. Canonical guidance is now: device + link skeleton pluslayout:/tier:(recommended — they drive the hierarchy at near-zero cost). The verbose per-link annotations (vlan:/port:/ speed /trunk) are demoted to "only when asked" — they don't affect layout and are the main source of generation errors. - ·
state— MermaidstateDiagram-v2is now the recommended header/form. Aligns generation with the dominant training-data prior ([*]start/end,-->transitions). The nativestate "…"+initial/finalform still works; the parser already accepted both.
v0.6.0
2026-05-253 diagramsChanged
- ·
petrireclassified into a newconcurrencycluster (wasbehavior-modeling), matching the type-system intent (Concurrency / discrete-event formalism) and the docs navigation. Petri nets model concurrent / distributed / asynchronous systems, so they now group on their own in the gallery's by-type view with a dedicated line-glyph. - ·Clearer registry taglines for
usecaseandsequence— both now lead with purpose (what the diagram is *for*) before the feature list, matching the house definition style.
- ·New dedicated
pertengine (src/diagrams/pert/) implementing the activity-on-node / Precedence Diagramming Method per PMI PMBOK 7 + Moder 1983. Unlike every other text-DSL diagram tool, the engine computes the schedule: a forward pass + backward pass return Early/Late Start & Finish, total slack, project duration, and the critical path — the render is downstream of the computation. Spec:32-PERT-STANDARD.md. - ·Six-field activity box (ES | Duration | EF / Name + id / LS | Slack | LF), the canonical Kerzner / Primavera P6 representation. Every computed field is mirrored onto
data-*attributes. - ·Full PDM dependencies — FS (default), SS, FF, SF — with integer/fractional lag (
after: A+2d) and lead (after: A SS-1). Edge labels render the type + lag (SS+1d,FF); FS with zero lag stays unlabelled. - ·Three-point (PERT) estimation —
duration: O/M/Pcomputeste = (O+4M+P)/6and varianceσ² = ((P−O)/6)²; the project-level standard deviation over the critical path is reported in the footer.
- ·New dedicated
petriengine (src/diagrams/petri/) for place/transition nets per Murata 1989 + ISO/IEC 15909-1. Likepert, the engine computes the dynamics: it validates the bipartite structure, applies afire:sequence to the initial marking, and highlights which transitions are *enabled* in the resulting marking. Spec:34-PETRINET-STANDARD.md. - ·Places, transitions, and four arc types —
place <id> *<tokens>circles,transition <id>bars (immediate) ortimed rate: <λ>boxes (GSPN), with standard->, inhibitor-o, read--, and reset=>arcs. Weighted arcs (weight: n/*n) and placecapacity:. - ·Subclass detection — source/sink, workflow-net (van der Aalst), state-machine, and marked-graph structures are recognised and noted in the SVG
<desc>. - ·House-style palette with green reserved for "enabled" and red for "inhibitor/dead"; faithful black-and-white Murata textbook look under
monochrome.layout: lr|tbwith cycle-removal back-edge routing.
- ·New dedicated
networkengine (src/diagrams/network/) for IT / CCTV network topology with Cisco-convention device icons, typed links, subnets/VLANs, and topology-correct layout. Spec:35-NETWORK-STANDARD.md. - ·31 device kinds (router, switch, l3switch, firewall, loadbalancer, ap, wlc, gateway, server, serverfarm, pc, laptop, mobile, ipphone, printer, storage, camera with
type: fixed|bullet|dome|ptz|turret, nvr, dvr, poeswitch, encoder, monitor, internet/wan/cloud/pstn, lan, …) connected with--(undirected),->(directed), or==(LAG). - ·Rich link specs after
:— link type (fiber/wireless/serial/poe/vpn/lag),trunk/access,vlan:, speed, andport: a>b; each rendered with a distinct line style. - ·Physical + logical boundaries —
site/rack(solid) vssubnet/vlan/zone/dmz(dashed, tinted) nested blocks. Layoutstiered(default),tree,star,ring,bus,mesh,spine-leaf,manual. Validates VLAN range 1–4094 and device-IP-in-subnet-CIDR; never drops a device/port/link.
v0.5.2
2026-05-22Fixedparser preview resilience
- ·Preview surfaces stay visible when strict parsing or rendering fails. New
- ·React, browser, and AI integrations use the non-blank preview boundary.
- ·Circuit netlist explicit
type=now owns pin order. A component such as - ·Docs cover strict versus preview APIs. The README, reference overview,
v0.5.0
2026-05-192 diagrams- ·New dedicated
prismaengine (src/diagrams/prisma/) implementing the PRISMA 2020 flow diagram (Page MJ et al., BMJ 2021;372:n71). Rigid four-row layout (Identification → Screening → Eligibility → Included) that is correct by construction — the author writes record counts and exclusion reasons; the layout, mandatoryn =fields, and exclusion side-boxes are prescribed. Spec:28-PRISMA-STANDARD.md. - ·Single + dual pipeline.
mode: 2020-single(databases & registers only) andmode: 2020-dual(adds the "Identification via other methods" column, merged into Screening via a Y-junction). Auto-detects dual when another:block is present. - ·Canonical column-group layout. "Records removed before screening" is its own box in the right column; the orange/slate section header is an independent capsule bar spanning the column group (matrix-style), and the left Identification/Screening/Included stage bands are independent capsules that bracket the cards.
- ·Vocabulary overlays.
kind: scoping-review(PRISMA-ScR — "sources of evidence"),kind: ipd(participants count),kind: systematic-review(default).
- ·Unified actor anchor. Every association line from an actor now fans out from a single anchor point (facing-side, torso height) instead of each line exiting the actor box at a different edge point — matching canonical UML rendering.
- ·Aesthetic pass. Soft blue tinted use-case ellipses, bold names, rounded stick-figure strokes, a quiet rounded subject boundary, and crisper dashed include/extend lines.
- ·Added
website/content/docs/usecase.mdx(the syntax doc was registered inSYNTAX_KEYSbut missing) and curated example MDX. - ·--
v0.4.3
2026-05-16Fixedproduction parser bugs from ChatDiagram 2026-05-15 report
- ·Ladder
RESreset coil now parses. Rockwell / Allen-Bradley counter-reset - ·Ladder element regex no longer breaks on parens inside quoted names.
- ·Ladder
rung Naccepts a trailing colon or none. LLMs routinely omit it - ·SLD residential vocabulary. Added
mcb,mccb,rcd,rcbo,rccb,
AddedMermaid-compatibility scaffolding
- ·YAML frontmatter title block.
---\ntitle: My diagram\n---at the top - ·Universal
%%comment marker. All parsers touched by this release - ·"Did you mean…?" suggestions. New
src/core/dsl-suggest.tsreturns - ·Engine-bug error telemetry.
extractError()now tags runtime errors
v0.4.1
2026-05-061 diagram- ·
style: tabledirective for matrix diagrams. Flips any 2×2 or 3×3 quadrant diagram from scatter/bubble mode into a text-in-cell table layout — the canonical form for Eisenhower, Johari, Impact-Effort, and 9-box. Settingstyle: tableautomatically disables axis arrows, axis labels, grid lines, and the quadrant-annotation overlay; quadrant titles are instead rendered as cell-header text inside each cell, and multiple items for the same cell stack as a bullet list. Renderer gains three new CSS classes (sx-matrix-cell-title,sx-matrix-cell-subtitle,sx-matrix-cell-item) for theming. - ·
Q1…Q4shorthand for 2×2 table mode. Instead ofcell (col, row) label: "…", authors can writeQ2: "Ship hotfix"— one line per item, repeating the key to stack items. Q1 = top-right, Q2 = top-left, Q3 = bottom-left, Q4 = bottom-right. Designed to match what LLMs naturally emit for Eisenhower-style prompts. - ·3×3
style: tablesupport.renderQuadrantBackgroundextended to cover 3×3 grids with a diagonal severity heatmap (green → amber → red, following the GE/McKinsey 9-box convention).renderCellLabelsunified from a 3×3-only helper into a shared 2×2/3×3 path. - ·Four new example MDX files.
matrix-eisenhower-week(updated to table form),matrix-impact-effort,matrix-johari-window, andmatrix-9-box-talent— each a canonical AI-grounding few-shot for LLM DSL generation. All four also added tosrc/ai/_generated.ts.
v0.4.0
2026-05-055 diagramsEntity-Relationship Diagram (ERD)
Breadboard / Physical wiring
BPMN business process
Function Block Diagram (FBD)
Sequential Function Chart (SFC)
- ·Full pipeline: parser → layered LR/TB layout → tabular SVG renderer with crow's-foot endpoint glyphs (bar, open circle, foot, foot+circle).
- ·DBML-compatible DSL:
Table Name { col type PK FK -> X.y }with Mermaid}o--||ASCII glyph aliases as input shorthand. - ·Automatic crow's-foot rendering: endpoint cardinality symbols (
|,o,<) read from relation glyphs and rendered per notation standard. - ·AI registry entry under new
data-modelingcluster with explicit disambiguation from theentitytype (corporate ownership vs. database schema).
- ·Section-based DSL:
board:dimensions,partswith@col-rowhole addressing, power-rail notation (@+t8), span placements, off-board MCU side placement. - ·Parts catalog: resistors (auto color-bands from value), LED, capacitors, diode, button, DIP ICs, headers, MCU breakouts (Arduino Uno/Nano, ESP32, Raspberry Pi Pico), HC-SR04, DHT11/22, SSD1306 OLED, LCD 1602 I²C, rotary encoder, servo.
- ·Cubic Bézier wire routing with
via @coordoverride; post-layout shift with copy-on-return fix for shared pin references. - ·Z-ordered renderer: substrate + rails + trough + parts + wires, semantic SVG with CSS class hooks.
- ·Full pipeline: parser → longest-path layered layout with DFS cycle-break → orthogonal Manhattan routing → SVG renderer.
- ·Pools & lanes:
pool "Name"+lane "Name"for horizontal swimlane partitioning; black-box pools. - ·Events: start · intermediate · end, with none / message / timer trigger variants; correct IEC-style circle glyphs.
- ·Tasks: plain tasks + 6 marker types (user / service / send / receive / manual / script) + collapsed subprocess.
- ·Full pipeline: parser → layered-DAG layout → SVG renderer.
fbd "Title"keyword auto-detects. - ·40+ standard blocks with correct IEC distinctive symbols:
&(AND),≥1(OR),=1(XOR),1(BUF/NOT),SR,RS,TON,TOF,CTU,CTD,ADD,SUB,MUL,DIV,MOD,LT,GT,LE,GE,EQ,NE,SEL,MUX,LIMIT,MOVE,BOOL_TO_INT, and more. - ·Output negation bubbles on NAND, NOR, XNOR, NOT (small circle on output port per IEC standard).
- ·Wire data-type coloring: BOOL = black, INT = blue, REAL = orange, TIME = magenta — follows TIA Portal convention.
- ·Full pipeline: parser → recursive-region layout → SVG renderer.
sfc "Title"keyword auto-detects. - ·Steps:
step S0 [initial],step S1 [label: "Filling"]— initial step renders with double border per IEC §6.5.1.2. - ·Transitions:
transition from: S0 to: S1: StartBtn— condition text rendered next to the horizontal bar. - ·Action blocks: right-side action boxes with qualifier compartment (N/S/R/L/D/P/P0/P1/SD/DS/SL) + body text + optional time row (
D Mixer_Run T#10s).
Addedinfrastructure and docs
- ·11 new example MDX files covering ERD, Breadboard, BPMN, FBD, and SFC — all with industry context, complexity ratings, and
featuredflags. - ·5 new reference docs:
docs/reference/23-FBD-STANDARD.md,24-SFC-STANDARD.md,25-ERD-STANDARD.md,26-BREADBOARD-STANDARD.md,27-BPMN-STANDARD.md. - ·New Data modeling cluster added to
docs/reference/00-OVERVIEW.mdand AI registry. - ·AI registry: all 5 types in
src/ai/registry.ts; syntax keys inscripts/build-ai-content.mjs; total AI-bundled syntax docs 27, examples 58.
v0.3.5
2026-05-04Fixedproduction-audit findings (3 items)
- ·Logic parser: ref-before-decl now a warning, not a hard error. When a gate references a signal that was never declared with
input, the parser previously threwUnknown signal "X" in gate Y. It now auto-declares the signal as an input and appends a string toast.warnings. Active-low markers (~) are preserved on auto-declared signals. This matches real production patterns where LLMs emit gate-first DSL without explicitinputlines.LogicGateInputgainsautoDeclared?: boolean;LogicGateASTgainswarnings?: string[]. - ·Smart-quote support across all diagram header titles. Eleven parsers extracted diagram titles with the regex
/"([^"]*)"/, which rejected Unicode curly quotes and other locale-specific pairs used by non-English speakers. A new shared helper (src/core/quotes.ts) recognises"…"'…'"…"'…'«…»「…」『…』and\"/\'escape sequences. All header-title extraction in blockdiagram, circuit, entity, ladder, logic, orgchart, phylo, sld, sociogram, timing, and venn parsers now uses this helper. - ·Venn tokenizer: smart-quote support in title, set labels, region values, and comment stripping.
parseTitleAndProps,parseConfigProps,splitTopLevelCommas, andparseValueall updated to be quote-pair-aware. ThestripCommenthelper now correctly skips over non-ASCII quote pairs (e.g.«…») before looking for#. Fixes both theunterminated quoted titleerror and the\"escape robustness gap reported in Spanish-locale sessions. - ·--
v0.3.4
2026-05-02Changedbackground handling
- ·Removed
background:from inline<style>blocks across all 19 - ·PNG export (
svgToPngBlob) defaults to transparent. Previously - ·Dark theme requires a dark host wrapper. When using
theme: "dark", - ·--
v0.3.3
2026-05-01Fixedproduction-audit findings (4 items)
- ·flowchart
linkStylenow actually renders. Parser already acceptedlinkStyle 1,5,6 stroke:#ff0000,stroke-width:4pxbut stored the result without applying it. Renderer now emitsdata-edge-index="N"per edge and emits matching CSS overrides. Multiple comma-separated indices supported per statement. - ·flowchart inline
<b>/<i>in node labels.multilineTextpreviously stripped these tags. Now per-line segments inside<b>...</b>render withfont-weight=bold;<i>...</i>withfont-style=italic. Mid-line bolding works (Foo <b>bar</b> baz). Combines with existing<br/>line-break support. - ·circuit
Cannot infer typeerror message rewrite. Old:Cannot infer type from id "X" — use type= override. New message lists the valid SPICE prefixes (R/C/L/D/V/I/Q/M/J/S/F/B/K/U/X/W/T), gives an explicittype=…example using the user's id, and states the engine's scope (electrical schematics only — hydraulic/pneumatic prefixes likeEV*,BOMBA*,TANK*are not supported). - ·genogram dual-union sibship regression test. New test in
tests/genogram/layout.test.tscovers the case where one shared parent has children with two different partners (Case F from the 2026-05-01 audit). Confirms the existing layout already groups offspring per-union with cross-union gap > 1.25× within-sibship gap. No layout change required — added as regression guard.
v0.3.2
2026-04-30ChangedInternal cleanup of v0.3.1 fixes
- ·circuit/netlist: consolidated 4 separate ground-check codepaths (
GROUND_NETSset,isGroundNetName,GROUND_ID_PATTERN, inline error-hint regex) into oneisGroundRefhelper. Trimmed redundant error-message hint that duplicated the auto-resolve branch. - ·timeline/parser: removed unreachable
ifblock (startsWith("")is always true) and its empty body. The block was also silently dropping the colon validation that previously existed fortrack "Name":. - ·react.tsx: restored a concise inline comment explaining why
onErroris excluded fromuseMemodeps. Previous 3-line comment was self-contradictory ("no disable comment is needed" — written as a 3-line replacement for a 1-line disable comment). - ·eslint.config / orgchart / svg / circuit symbols / pedigree / blockdiagram / flowchart / genogram: trimmed multi-line "story" comments down to single-line intent. Removed comments that re-narrated obvious code or self-referenced the audit PR.
v0.3.1
2026-04-305 diagramsFixedBlockdiagram: inline
[id] -> [id] no longer rejected (Case F)- ·--
v0.3.0
2026-04-295 diagrams- ·--
v0.2.5
2026-04-271 diagram- ·--
v0.2.4
2026-04-251 diagram- ·*Fix: the sibship bar now extends to
min(leftX, midX) … max(rightX, midX), guaranteeing the parent drop always lands on it regardless of where children are positioned. - ·--
v0.2.3
2026-04-25 (backfilled)AddedStructured parse errors (Pass A)
- ·--
v0.2.3
2026-04-25AddedUnified legend system
- ·
bottom-inline(new default): sections flow left-to-right in rows; canvas minimum width 480 px - ·
bottom-right: compact floating legend anchored to the lower-right corner; does not widen the chart canvas - ·
none/legend: none: suppress legend entirely - ·
LegendItem.fill— new field on theLegendItemtype; separates shape-fill color from stroke/line color so swatches render WYSIWYG
AddedAI tool layer (
schematex/ai, schematex/ai/sdk, @schematex/mcp)- ·*
schematex/ai— five tools with JSON schemas: - ·*
schematex/ai/sdk— drop-in Vercel AI SDK adapter: - ·*
@schematex/mcp— standalone stdio MCP server (separate package, same five tools):
Changed
- ·Genogram legend: auto-derivation excludes Male/Female shapes, Married, and Parent-Child — universal McGoldrick conventions omitted by default
- ·No legend border/box: hairline box dropped; legend is borderless and minimal
- ·Chart centering: when the legend widens the canvas beyond the chart's natural width, chart content is translated to remain horizontally centered
Fixed
- ·Mindmap left-align: node label text is now flush with the left edge of the underline; previously offset ~2 px due to an incorrect anchor calculation
- ·Genogram condition fill:
.schematex-genogram-condition-fill:not([fill])— theme CSS no longer overrides per-individual inlinefillattributes - ·Quad clip-path: switched to
clipPathUnits="objectBoundingBox"with 0..1 fractional coordinates;quad-tl/quad-trnow clip to the correct quadrant - ·--
v0.2.2
2026-04-231 diagram- ·*bold text / *italic* /
code - ·Multi-line text wrapping via
%% maxLabelWidth: Ndirective (default 240 px) - ·New
InlineTokendiscriminated union insrc/core/types.ts:text | code | link | checkbox - ·New
MindmapLabelLinetype;MindmapLayoutNodegainsfontSizeandlinesfields
- ·All nodes use a single underline-based visual: no root capsule border, no node box at any depth
- ·Bezier edges terminate precisely at the underline stroke (fixed 2 px y-offset bug from previous release)
- ·Same-depth nodes share identical
labelWidth(global equalization), so bezier curves at the same depth span identical horizontal distances - ·Root node gets a 1.5× wrap budget (proportional to its 20 pt font) so short titles stay on one line
v0.2.0
2026-04-201 diagramAdded
- ·Timeline diagram type — three visual styles in one DSL:
- ·
style: swimlane— proportional/equidistant/log scale axis; auto-track packing via greedy interval scheduling; bidirectional label cascade with leader lines; era bands - ·
style: gantt— milestone pin zone with label cascade; category lane grouping - ·
style: lollipop— event-only axis with lollipop stems and cards
ChangedBreaking
- ·Package renamed from
lineagetoschematex— update all imports: - ·License changed to AGPL-3.0
- ·Phase 1 — crossing minimization: Barth–Junger–Mutzel barycenter with forward/backward sweep and best-of-N selection
- ·Phase 2 — x-coordinate assignment: Brandes–Kopf 4-alignment (new shared module
src/core/layered/bk.ts) with type-1 conflict detection, block compaction, and balanced-median merge - ·Phase 3 — subgraph support: lane-based x-coord assignment so cluster bboxes never overlap foreign-lane nodes;
subgraph Title … end/endblock syntax; cluster and title labels have correct viewport padding - ·*8 new M2 node shapes (in addition to the 7 M1 shapes from 0.1.1):
Changed
- ·Unified
DiagramPlugininterface:render(text, config?)andparse?(text, config?)are now the canonical entry points per plugin; all renderers migrated - ·--
v0.1.1
2026-04-18Added5 new diagram types
- ·Flowchart — initial implementation:
- ·Mermaid-compatible DSL (
-->,--label-->,-.->,==>) - ·7 M1 node shapes: rectangle
[…], rounded(…), stadium([…]), circle((…)), rhombus{…}, trapezoid[/…/], asymmetric>…] - ·Layered layout (basic, no crossing minimization — see 0.2.0 for full Sugiyama)
Changed
- ·Per-diagram subpath exports: every diagram type now has its own addressable entry point:
- ·Unified semantic color tokens: all 6 engineering diagrams (circuit, logic, ladder, SLD, block, timing) now respect the shared
default/monochrome/darktheme — previously these diagrams used hardcoded colors - ·Theme token cleanup: removed redundant/dead tokens from
src/core/theme.ts; token surface area reduced without breaking existing theme customization
Fixed
- ·Venn label placement: label placement algorithm rewritten — set labels, intersection labels, and count chips no longer overlap on 3-circle and 4-circle diagrams
- ·Fishbone: new DSL layout options —
sides: both | left | right,density: compact | normal | wide,cause-side:,rib-slope: <degrees>, per-rib[side: …, order: …]overrides; alternating rib placement; improved spine and header sizing - ·--
v0.1.0
2026-03-15Added
- ·Core pipeline: Text DSL → Parser → AST → Layout → SVG
- ·Relationships: Genogram (McGoldrick standard), Ecomap (Hartman categories), Pedigree (genetic status / carrier / presymptomatic)
- ·Biological: Phylogenetic tree (Newick/NHX format; clade coloring)
- ·Social science: Sociogram (Moreno sociometry; force-directed layout; valence edges)