Changes from 0.2
Contents of DISL 0.8
DISL 0.3 (draft, 2026-10-05) adds the constructs listed below, approved by the product owner on 2026-10-05; each is optional, and its absence is the 0.2 behaviour. This section then lists every place where 0.3 gives a meaning that 0.2 left open or stated otherwise, with the reason. Everything not listed keeps its 0.2 meaning, and no valid 0.2 specification becomes invalid.
| Construct | Section | Schema |
|---|---|---|
bounds.neighbour on node and relation types: ordered attributes kept a gap apart |
4.3 | NodeType.bounds, RelationType.bounds, $defs/NeighbourBounds |
An enum value's color as a theme token |
4.5, 6.13 | EnumValue.color |
minUnit on a ruler |
5.13 | Ruler.minUnit |
tooltip on a shape part |
6.8 | ShapePart.tooltip |
drawnFrom on anchors |
6.9 | AnchorSpec.drawnFrom |
pointer on a connect gesture |
6.10 | ConnectGesture.pointer, $defs/GesturePointer |
editText on a label |
6.12 | Label.editText |
accepts and refusal on a label's parse |
6.12 | Label.parse.accepts, Label.parse.refusal |
place on a drop and a create action; behavior.placements |
7.2, 9.1, 9.4, 12.3 | DropSpec.place, Action.create.place, Behavior.placements, $defs/ParentPlacement |
display and parse on form items |
7.5 | FormItem.display, FormItem.parse, $defs/FieldParse |
Form items of kind type; when on a retype entry |
7.5, 9.5 | FormItem.kind, FormItem.optionLabel, FormItem.refusals, Behavior.retype.*.when |
A computed code on a built-in |
8.1 | BuiltInSetting.code |
detail.count of std.duplicateId, detail.end of std.references |
8.7 | – |
refusals on the layout action |
9.4 | Action.layout.refusals |
The standard layout algorithms rowPacked, rows and tidyTree |
10.1–10.3, B.10 | LayoutConfig.rowPacked, .rows, .tidyTree, $defs/RowPacked, $defs/RowsLayout, $defs/TidyTree |
typeMap for a format binding |
11.2 | Persistence.typeMap, $defs/TypeMapEntry |
plans, add and move on a persistence plugin |
13.1 | Plugin.plans, Plugin.add, Plugin.move |
| # | Change | 0.2 said | 0.3 says | Reason | Section |
|---|---|---|---|---|---|
| 1 | Snapping of a new element | Which notation's snapping a drop of a new element uses, and what point a rule receives, was unstated. | The node notation of the created type, merged over the coordinate system's; the rule receives the point reference selects, with the placement anchor at the pointer. |
Trends and notes dropped on one hype cycle find their rows differently. | 5.9 |
| 2 | Layout algorithms | DISL names algorithms and defines none. | Three standard algorithms are defined; the rest are still only named. | Two runtimes drew different trees and rows. | 10 |
| 3 | Bound coordinates under layout | Never changed by layout. | Still never changed, except the attributes an algorithm declares in writes (rows), written as one model edit. |
Arranging rows writes the row attribute. | 10, 10.2 |
| 4 | A relation with an end that names nothing | Only an optional target end may be missing. |
Under typeMap, a relation read with a mapped end that names nothing is kept with that end unset, not drawn, and reported by std.references. |
A hand-edited file keeps a broken influence until the user fixes it. | 4.9, 11.2 |
| 5 | An editable label with a computed text | An editable label requires an attribute binding in text. |
An attribute binding in editText satisfies it. |
A label shows more than the user edits. | 6.12 |
| 6 | A move sent to a persistence plugin | FBL 0.1 named a move without fields. | A plugin that does not declare move in plans is sent a remove and an add. |
Only a declared move can keep the element's bytes. | 13.1 |
| 7 | What textMetric governs |
Every measurement that affects geometry, autoSize, wrapping and ellipsis included, uses the declared metric. |
Layout-time measurement uses it: textWidth, textHeight and the layout inputs computed with them. Drawing measures with the real font, and a runtime may do so for autoSize, wrapping and ellipsis. |
Hosts measure drawn labels with the font they draw; only the layout must agree everywhere. | 6.5 |
The draft's additions were amended on 2026-10-06 so that they state the behaviour of today's hype cycle and agent behavior modelling tools, which the code shows:
| Construct | The draft said | It now says | Section |
|---|---|---|---|
Choices of a type form item |
The types behavior.retype[self.type].to allows, limited by options, which leaves out the element's own type. |
The types options gives, the element's own type among them; without options, the own type and the allowed targets. Choosing the own type applies the type's attributeMapping and nothing else. |
7.5 |
when on a retype entry |
The type item and the retype action refuse a type whose when is false; the example used when for a refusal that depends on the children. |
when is optional and defaults to true. A refusal that depends on the element's state is the writer's, stated as the type item's refusals and kept out of the choices by options. |
9.5 |
rows: refusals.nothingDrawn |
Fires while the scope holds no element of a type in extent. |
Fires while no element has a drawable extent: an element whose extent does not evaluate, with no id, or with an id an earlier element has, does not take part. | 9.4, 10.2 |
rows: elements covering several rows |
The fewest rows any assignment could use. | Each element takes a top row from which all its rows are free; rows an element covering several rows spans are pinned and never swapped. The fewest rows are guaranteed only while every extent covers one row. | 10.2 |
tidyTree distances |
Children spacing.layer beyond their parent; minGap from the parent; top-level elements packed apart. |
spacing.layer and minGap are gaps from the parent's far edge to the row's near edge; the top-level elements share one row. |
10.3 |
The rows example |
A trigger's extent from x - 16.0 - textWidth(self.name, 12.0) to x + 8.0, 8 units off with x the left edge, measuring the name only. |
From x - 8.0 less the width of the name and date to x2, as the hype cycle definition has it. |
10.2 |
Five more constructs became standard on 2026-10-06, by Peter's ruling ("Spec all but wire ids"). The hype cycle and agent behavior modelling definitions had declared them under x- keys shaped as these proposals, and now use the standard keys. Each is optional, and its absence is the 0.2 behaviour. The wire-id maps those definitions declare (x-ghg, x-abm) stay extension keys.
| Construct | Was | Section | Schema |
|---|---|---|---|
group on a context-menu entry: consecutive entries with one name form one menu group |
x-menu.group |
7.3 | ContextTool.group |
id on a form item: an explicit row id |
x-field.id |
7.5 | FormItem.id |
constraints.order: findings by the order of their codes, then by line; a group of duplicates by its first member |
constraints.x-order |
8.1, 8.6 | Constraints.order |
oncePerGroup on a built-in: a group of duplicates reported once, at its second or its last member |
x-builtIn.oncePerGroup |
8.1, 8.7 | BuiltInSetting.oncePerGroup |
detail.violation of std.endpoints (source, target, selfLoop or parallel), which a computed code reads |
read as detail.?violation, not listed |
8.7 | – |