[
  {
    "version": "0.2.18",
    "date": "2026-10-28T20:45:21-04:00",
    "kind": "patch",
    "changes": [
      {
        "commit": null,
        "text": "PATCH: docs only, with no change to the API.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "The package README has a table of each doc that the comments name, with its link in the repository.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "The TSDoc of `ShapeBound` has the table of what a bound value proves, so a consumer reads it in the package.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      }
    ],
    "links": [
      {
        "label": "GitHub release",
        "url": "https://github.com/mark1russell7/layout-contract/releases/tag/v0.2.18"
      },
      {
        "label": "Changelog",
        "url": "https://github.com/mark1russell7/layout-contract/blob/dfa6691a45e35dad8ce69d178c60c1394ac69326/packages/layout-contract/CHANGELOG.md#0218"
      },
      {
        "label": "npm",
        "url": "https://www.npmjs.com/package/@mark1russell7/layout-contract/v/0.2.18"
      }
    ]
  },
  {
    "version": "0.2.17",
    "date": "2026-10-28T20:30:59-04:00",
    "kind": "patch",
    "changes": [
      {
        "commit": null,
        "text": "`bound` lists the kinds where the value of a measure is a bound of the true value, and its side `upper` or `lower`.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`docs/SHAPES.md` tells what a bound value proves for each `direction` of a measure, and why the level is `bound` and not `safe`.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`ShapeCheck.level` has the new value `bound`.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`shapeLevel(use, kind)` gives `exact`, `safe`, `bound` or `none`.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`shapeSupportProblems` refuses a kind in two of the lists `shapes`, `safe` and `bound.shapes`.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "A sample throws a `RangeError` only when the space has no config for the kinds.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "By default, `checkShapes` refuses a bound kind.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "Each input, manifest, record, hash and `configId` of 0.2.16 stays the same.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "Each sample that 0.2.16 gave stays the same, byte for byte.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "Fix: with `meta: \"sample\"` and `shapes`, a sample does not throw for a meta option without a member list.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "PATCH: a new optional field, new exports and a fix, with no break.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "The new exports are `shapeLevel`, `ShapeLevel` and `ShapeBound`.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      }
    ],
    "links": [
      {
        "label": "GitHub release",
        "url": "https://github.com/mark1russell7/layout-contract/releases/tag/v0.2.17"
      },
      {
        "label": "Changelog",
        "url": "https://github.com/mark1russell7/layout-contract/blob/dfa6691a45e35dad8ce69d178c60c1394ac69326/packages/layout-contract/CHANGELOG.md#0217"
      },
      {
        "label": "npm",
        "url": "https://www.npmjs.com/package/@mark1russell7/layout-contract/v/0.2.17"
      }
    ]
  },
  {
    "version": "0.2.16",
    "date": "2026-10-28T19:40:44-04:00",
    "kind": "patch",
    "changes": [
      {
        "commit": null,
        "text": "`boxArea` gives the area of a box, or `undefined` for a `free` box.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`checkShapes` refuses a safe kind by default, as before.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`precision` changes only that compare.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`precision` rounds a numeric value and its default before the `invalidates` compare.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`regionArea` gives the exact area of a region.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`safe` lists the kinds with a safe count.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`shapeSupportProblems` refuses a kind in `shapes` and in `safe`, an unknown kind and a repeated kind.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "Each input, manifest, record, hash and `configId` of 0.2.15 stays the same.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "PATCH: new optional exports and fields, with no break (L57).",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "The new exports are `regionArea`, `boxArea`, `ruleLevel`, `RuleLevel`, `shapeSupportProblems` and `ShapeCheck`.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "The new optional fields are `ShapeSupport.safe`, `MemberRule.view` and `CorpusDimension.precision`.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "With `view: \"bounds\"`, `checkConfig`, `spaceSize`, `enumerateSpace` and the pool entries use `rect` for the members.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "With `view: \"bounds\"`, a meta option gives its members the bounding box of each item.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      }
    ],
    "links": [
      {
        "label": "GitHub release",
        "url": "https://github.com/mark1russell7/layout-contract/releases/tag/v0.2.16"
      },
      {
        "label": "Changelog",
        "url": "https://github.com/mark1russell7/layout-contract/blob/dfa6691a45e35dad8ce69d178c60c1394ac69326/packages/layout-contract/CHANGELOG.md#0216"
      },
      {
        "label": "npm",
        "url": "https://www.npmjs.com/package/@mark1russell7/layout-contract/v/0.2.16"
      }
    ]
  },
  {
    "version": "0.2.15",
    "date": "2026-10-28T18:34:06-04:00",
    "kind": "patch",
    "changes": [
      {
        "commit": null,
        "text": "`checkInput` refuses `along` without a side, outside [0, 1] or with `x` or `y`.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`dimensionSupports(dim, value)` tells a site if a family accepts a value.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`invalidates` lists the output fields that a value other than the default makes wrong.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`ownerDimension(name, spec)` gives a dimension of one owner.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`Port.along` fixes a port at a fraction of its side (L56).",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`resolve` and `generate` of a registry refuse another value with a `RangeError` that has the text \"not supported by\".",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`supported` marks the values that one family accepts (L51).",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "Each input, manifest, record and hash of 0.2.14 stays the same.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "PATCH: new optional exports and fields, with no break.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "The new exports are `ownerDimension`, `OwnerDimensionSpec`, `dimensionSupports`, `SupportedValues`, `SupportedRange`, `INVALIDATED_FIELD` and `portPoint`.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "The new optional fields are `CorpusDimension.supported`, `CorpusDimension.invalidates`, `CorpusFamily.hash`, `LayoutInput.invalidated` and `Port.along`.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      }
    ],
    "links": [
      {
        "label": "GitHub release",
        "url": "https://github.com/mark1russell7/layout-contract/releases/tag/v0.2.15"
      },
      {
        "label": "Changelog",
        "url": "https://github.com/mark1russell7/layout-contract/blob/dfa6691a45e35dad8ce69d178c60c1394ac69326/packages/layout-contract/CHANGELOG.md#0215"
      },
      {
        "label": "npm",
        "url": "https://www.npmjs.com/package/@mark1russell7/layout-contract/v/0.2.15"
      }
    ]
  },
  {
    "version": "0.2.14",
    "date": "2026-10-28T17:35:18-04:00",
    "kind": "patch",
    "changes": [
      {
        "commit": null,
        "text": "`canonicalInput` sorts the pairs.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`checkInput` refuses an unknown box, a pair of one box, a repeated pair in either order, a bad `gap` and bad `lanes`.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`checkSpace` checks each entry of a pool.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`LayoutInput.pairGaps` gives a minimum distance to a pair of boxes (L49).",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`MemberRule.pool` is a fixed list of member lists (L39).",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "A pair of the list breaks `no-overlap` only when the boxes are nearer than the gap on each axis.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "Each input, verdict, record, hash and `configId` of 0.2.13 stays the same.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "PATCH: new optional exports and fields, with no break: `MemberRule.pool`, `PairGap`, `LayoutInput.pairGaps` and `canonicalInput`.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "The fix: `generate`, `resolve`, `cellOf` and `rngOf` of a registry accept a cell of `cellOf`.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "The hard rule `no-overlap` reads `pairGaps`.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "With a `pool`, `spaceSize` counts each entry one time.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "With a pool of 1 list on `cell-portfolio`, the meta count of `packing` at 3 levels goes from approximately 1.49e25 to approximately 1.72e15.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      }
    ],
    "links": [
      {
        "label": "GitHub release",
        "url": "https://github.com/mark1russell7/layout-contract/releases/tag/v0.2.14"
      },
      {
        "label": "Changelog",
        "url": "https://github.com/mark1russell7/layout-contract/blob/dfa6691a45e35dad8ce69d178c60c1394ac69326/packages/layout-contract/CHANGELOG.md#0214"
      },
      {
        "label": "npm",
        "url": "https://www.npmjs.com/package/@mark1russell7/layout-contract/v/0.2.14"
      }
    ]
  },
  {
    "version": "0.2.13",
    "date": "2026-10-28T16:46:24-04:00",
    "kind": "patch",
    "changes": [
      {
        "commit": null,
        "text": "`LayoutBox.shapeKind`, the cell dimension `itemShape` and the record field `shapes` are new and optional.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`MeasureSpec.shapes` and `PACK_HARD_RULES` give the kinds of each measure and rule.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`SHAPE_KINDS` declares 4 kinds: `rect`, `polygon`, `circle` and `free`.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`StageOption.supports.shape` gives the kinds of an option.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "Each input, record, hash and `configId` of 0.2.12 stays the same.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "The shape kind of an item is a dimension of the contract (L46).",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      }
    ],
    "links": [
      {
        "label": "GitHub release",
        "url": "https://github.com/mark1russell7/layout-contract/releases/tag/v0.2.13"
      },
      {
        "label": "Changelog",
        "url": "https://github.com/mark1russell7/layout-contract/blob/dfa6691a45e35dad8ce69d178c60c1394ac69326/packages/layout-contract/CHANGELOG.md#0213"
      },
      {
        "label": "npm",
        "url": "https://www.npmjs.com/package/@mark1russell7/layout-contract/v/0.2.13"
      }
    ]
  },
  {
    "version": "0.2.12",
    "date": "2026-10-28T15:05:19-04:00",
    "kind": "patch",
    "changes": [
      {
        "commit": null,
        "text": "`breadth` is `{ against, of, ties }`: the count of the families against the side of the verdict, of all the families and of the ties.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`scope` is `\"these families\"`.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`summary` gives the label, the scope and the breadth in one line, for example `better on these families, worse on 2 of 6 (1 tie)`.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "The result of `verdict` has 3 new fields: `scope`, `breadth` and `summary`.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      }
    ],
    "links": [
      {
        "label": "GitHub release",
        "url": "https://github.com/mark1russell7/layout-contract/releases/tag/v0.2.12"
      },
      {
        "label": "Changelog",
        "url": "https://github.com/mark1russell7/layout-contract/blob/dfa6691a45e35dad8ce69d178c60c1394ac69326/packages/layout-contract/CHANGELOG.md#0212"
      },
      {
        "label": "npm",
        "url": "https://www.npmjs.com/package/@mark1russell7/layout-contract/v/0.2.12"
      }
    ]
  },
  {
    "version": "0.2.11",
    "date": "2026-10-28T14:41:28-04:00",
    "kind": "patch",
    "changes": [
      {
        "commit": null,
        "text": "`checkDeclared` checks the keys: a missing dimension, a missing kind, a kind without an entry and two cells with the same key.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`docs/PROMOTION.md` has the new shared block `verdict-family`.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`verdict(records, options)` compares two strategies on one measure, with the family as the unit.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "A verdict counts only when it holds under both weightings.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "The claim `claims.declared` can have `familyBy`: the key of the family of each input.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "The flat form of `familyBy` is a list of dimensions.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "The verdict gives the mean of the family means and the mean of the inputs, each with a seeded bootstrap interval.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      }
    ],
    "links": [
      {
        "label": "GitHub release",
        "url": "https://github.com/mark1russell7/layout-contract/releases/tag/v0.2.11"
      },
      {
        "label": "Changelog",
        "url": "https://github.com/mark1russell7/layout-contract/blob/dfa6691a45e35dad8ce69d178c60c1394ac69326/packages/layout-contract/CHANGELOG.md#0211"
      },
      {
        "label": "npm",
        "url": "https://www.npmjs.com/package/@mark1russell7/layout-contract/v/0.2.11"
      }
    ]
  },
  {
    "version": "0.2.10",
    "date": "2026-10-28T14:24:12-04:00",
    "kind": "patch",
    "changes": [
      {
        "commit": null,
        "text": "`checkSpace` and `checkConfig` give a `ClaimBreak` for each problem.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`enumerateSpace` gives the grid, or a seeded Latin hypercube sample.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`spaceSize` counts the grid points, with the meta configs apart.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "A meta option has `members`: whole configs of the same space, with a depth of 1.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "A param can have a `when`.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "The contract has the strategy space `strategy-space/1`: the stages of an engine, their options and the ranges of their params, as data.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      }
    ],
    "links": [
      {
        "label": "GitHub release",
        "url": "https://github.com/mark1russell7/layout-contract/releases/tag/v0.2.10"
      },
      {
        "label": "Changelog",
        "url": "https://github.com/mark1russell7/layout-contract/blob/dfa6691a45e35dad8ce69d178c60c1394ac69326/packages/layout-contract/CHANGELOG.md#0210"
      },
      {
        "label": "npm",
        "url": "https://www.npmjs.com/package/@mark1russell7/layout-contract/v/0.2.10"
      }
    ]
  },
  {
    "version": "0.2.9",
    "date": "2026-10-28T11:23:49-04:00",
    "kind": "patch",
    "changes": [
      {
        "commit": null,
        "text": "`checkDeclared(inputs, declares, claim, ids)` checks the claim `claims.declared`.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`checkSplit(split, corpus, name)` checks a split file `corpus-split/1`.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`ClaimBreak` is one broken claim of a corpus.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`corpusHashOf(corpus, inputs)` gives the hash of a corpus.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`declaredCounts` counts the inputs of each property.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`leaveOneSeedOut(seeds)` gives one fold for each seed.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "The contract has the corpus checks of `packing`, `highways` and the joint corpus.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      }
    ],
    "links": [
      {
        "label": "GitHub release",
        "url": "https://github.com/mark1russell7/layout-contract/releases/tag/v0.2.9"
      },
      {
        "label": "Changelog",
        "url": "https://github.com/mark1russell7/layout-contract/blob/dfa6691a45e35dad8ce69d178c60c1394ac69326/packages/layout-contract/CHANGELOG.md#029"
      },
      {
        "label": "npm",
        "url": "https://www.npmjs.com/package/@mark1russell7/layout-contract/v/0.2.9"
      }
    ]
  },
  {
    "version": "0.2.8",
    "date": "2026-10-28T07:20:55-04:00",
    "kind": "patch",
    "changes": [
      {
        "commit": null,
        "text": "`portfolio` has the option `hashes`.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "A value of `hashes` that is not `all` or `pick` causes a `RangeError`.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "The output hash is most of the key cost of a member.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "Under `pick`, a hash that throws makes `pick` throw a `RangeError`.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "With `hashes: \"pick\"`, the members get no output hash before the pick.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      }
    ],
    "links": [
      {
        "label": "GitHub release",
        "url": "https://github.com/mark1russell7/layout-contract/releases/tag/v0.2.8"
      },
      {
        "label": "Changelog",
        "url": "https://github.com/mark1russell7/layout-contract/blob/dfa6691a45e35dad8ce69d178c60c1394ac69326/packages/layout-contract/CHANGELOG.md#028"
      },
      {
        "label": "npm",
        "url": "https://www.npmjs.com/package/@mark1russell7/layout-contract/v/0.2.8"
      }
    ]
  },
  {
    "version": "0.2.7",
    "date": "2026-10-28T05:44:09-04:00",
    "kind": "patch",
    "changes": [
      {
        "commit": null,
        "text": "`compareMeasure` compares whole grid steps of `RECORD_EPS`.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`RECORD_SCALE` (1000) is the count of grid steps in one unit, and `RECORD_EPS` is `1 / RECORD_SCALE`.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "A change below one grid step is a tie.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "A live value and its rounded record give the same verdict.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "Round with `Math.round(v * RECORD_SCALE)`, as the records do.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      }
    ],
    "links": [
      {
        "label": "GitHub release",
        "url": "https://github.com/mark1russell7/layout-contract/releases/tag/v0.2.7"
      },
      {
        "label": "Changelog",
        "url": "https://github.com/mark1russell7/layout-contract/blob/dfa6691a45e35dad8ce69d178c60c1394ac69326/packages/layout-contract/CHANGELOG.md#027"
      },
      {
        "label": "npm",
        "url": "https://www.npmjs.com/package/@mark1russell7/layout-contract/v/0.2.7"
      }
    ]
  },
  {
    "version": "0.2.6",
    "date": "2026-10-28T02:55:35-04:00",
    "kind": "patch",
    "changes": [
      {
        "commit": null,
        "text": "`pickMoves(trace)` gives the move `pick` (the trace measure `move.pick` of a record), so `exercised` reads the effect of a pick.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`portfolio(id, members, key, options)` starts a list of members on an input and gives the output of the best member.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`selectBest(candidates, levels)` is the pick rule.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "The level 0 of a portfolio is the count of hard breaks.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "The options `maxMembers` and `budgetMs` cut the members.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      }
    ],
    "links": [
      {
        "label": "GitHub release",
        "url": "https://github.com/mark1russell7/layout-contract/releases/tag/v0.2.6"
      },
      {
        "label": "Changelog",
        "url": "https://github.com/mark1russell7/layout-contract/blob/dfa6691a45e35dad8ce69d178c60c1394ac69326/packages/layout-contract/CHANGELOG.md#026"
      },
      {
        "label": "npm",
        "url": "https://www.npmjs.com/package/@mark1russell7/layout-contract/v/0.2.6"
      }
    ]
  },
  {
    "version": "0.2.5",
    "date": "2026-10-28T00:04:33-04:00",
    "kind": "patch",
    "changes": [
      {
        "commit": null,
        "text": "`docs/PROMOTION.md` tells the two promotion guards.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`documentHash` gives the input hash of `docs/FORMAT.md` of `packing`.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`outputGroups` puts the candidates with equal output hashes on each decision input in one `OutputGroup`.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`outputHash(value, options)` gives the first 16 hex characters of the SHA-256 of the canonical JSON of an output.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "The option `grid` (`HashOptions`) sets the step of the grid.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      }
    ],
    "links": [
      {
        "label": "GitHub release",
        "url": "https://github.com/mark1russell7/layout-contract/releases/tag/v0.2.5"
      },
      {
        "label": "Changelog",
        "url": "https://github.com/mark1russell7/layout-contract/blob/dfa6691a45e35dad8ce69d178c60c1394ac69326/packages/layout-contract/CHANGELOG.md#025"
      },
      {
        "label": "npm",
        "url": "https://www.npmjs.com/package/@mark1russell7/layout-contract/v/0.2.5"
      }
    ]
  },
  {
    "version": "0.2.4",
    "date": "2026-10-27T23:26:47-04:00",
    "kind": "patch",
    "changes": [
      {
        "commit": null,
        "text": "`countOutside` and `packHard` have the optional last parameter `options` (`ContainerTest`).",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`rectInRegion(region, rect)` tells if all of a rectangle is inside a region and not over a hole.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "The exact test applies only to a shaped container with the size `fixed`.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      }
    ],
    "links": [
      {
        "label": "GitHub release",
        "url": "https://github.com/mark1russell7/layout-contract/releases/tag/v0.2.4"
      },
      {
        "label": "Changelog",
        "url": "https://github.com/mark1russell7/layout-contract/blob/dfa6691a45e35dad8ce69d178c60c1394ac69326/packages/layout-contract/CHANGELOG.md#024"
      },
      {
        "label": "npm",
        "url": "https://www.npmjs.com/package/@mark1russell7/layout-contract/v/0.2.4"
      }
    ]
  },
  {
    "version": "0.2.3",
    "date": "2026-10-27T22:36:20-04:00",
    "kind": "patch",
    "changes": [
      {
        "commit": null,
        "text": "`EdgeShape`, `EdgeStepParams`, `EDGE_DENSITY` and `EDGE_STEP_VERSION` describe the step.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`edgeStep(input, params, seed)` adds edges, groups and ports to an input without positions, from its topology alone.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`LayoutInput` has the optional field `steps`: the stamps of the steps after the generator.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`mulberry32`, `fnv1a32`, `stepRandom` and `randomInt` give the seeded random numbers of the generators.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      }
    ],
    "links": [
      {
        "label": "GitHub release",
        "url": "https://github.com/mark1russell7/layout-contract/releases/tag/v0.2.3"
      },
      {
        "label": "Changelog",
        "url": "https://github.com/mark1russell7/layout-contract/blob/dfa6691a45e35dad8ce69d178c60c1394ac69326/packages/layout-contract/CHANGELOG.md#023"
      },
      {
        "label": "npm",
        "url": "https://www.npmjs.com/package/@mark1russell7/layout-contract/v/0.2.3"
      }
    ]
  },
  {
    "version": "0.2.2",
    "date": "2026-10-27T22:33:57-04:00",
    "kind": "patch",
    "changes": [
      {
        "commit": null,
        "text": "`compareMeasure(candidate, baseline, spec)` gives `better`, `worse` or `tie` for one measure on one input.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`MeasureSpec` has the field `minEffect`: an absolute change, or `{ rel }`, a share of the larger of the two values.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      }
    ],
    "links": [
      {
        "label": "GitHub release",
        "url": "https://github.com/mark1russell7/layout-contract/releases/tag/v0.2.2"
      },
      {
        "label": "Changelog",
        "url": "https://github.com/mark1russell7/layout-contract/blob/dfa6691a45e35dad8ce69d178c60c1394ac69326/packages/layout-contract/CHANGELOG.md#022"
      },
      {
        "label": "npm",
        "url": "https://www.npmjs.com/package/@mark1russell7/layout-contract/v/0.2.2"
      }
    ]
  },
  {
    "version": "0.2.1",
    "date": "2026-10-27T20:34:27-04:00",
    "kind": "patch",
    "changes": [
      {
        "commit": null,
        "text": "A record can have `env` (`RunEnv`), the facts of the computer of the run.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "A record can have `msRuns`, the time of each timed repeat.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "A record can have `outputHash`, the hash of the output of the stage.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      }
    ],
    "links": [
      {
        "label": "GitHub release",
        "url": "https://github.com/mark1russell7/layout-contract/releases/tag/v0.2.1"
      },
      {
        "label": "Changelog",
        "url": "https://github.com/mark1russell7/layout-contract/blob/dfa6691a45e35dad8ce69d178c60c1394ac69326/packages/layout-contract/CHANGELOG.md#021"
      },
      {
        "label": "npm",
        "url": "https://www.npmjs.com/package/@mark1russell7/layout-contract/v/0.2.1"
      }
    ]
  },
  {
    "version": "0.2.0",
    "date": "2026-10-27T19:20:48-04:00",
    "kind": "minor",
    "changes": [
      {
        "commit": null,
        "text": "`checkInput` gives the problems of an input file, for example a locked box without a position.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`packHard(input, output, tolerance)` applies the output itself.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`Port.side` and `LayoutInput.container` are optional.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "`turnPort` turns a port with only `x` or only `y`.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "A locked box breaks `locked-kept` only for a move of more than `RECORD_EPS`, or without a placement.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "New: `toLayoutRecord`, `StrategyInfo`, `MeasureSpec` and the specs of the joint measures (`JOINT_MEASURES`, `JOINT_MOVED_MIN`).",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "The input has the fields `generator`, `cell` and `step`, and `change` has the value `packed`.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      },
      {
        "commit": null,
        "text": "The type-fit tests of `highways` (highways#82) and `packing` (packing#21) found gaps.",
        "packages": [
          "@mark1russell7/layout-contract"
        ]
      }
    ],
    "links": [
      {
        "label": "Changelog",
        "url": "https://github.com/mark1russell7/layout-contract/blob/dfa6691a45e35dad8ce69d178c60c1394ac69326/packages/layout-contract/CHANGELOG.md#020"
      }
    ]
  },
  {
    "version": "0.1.0",
    "date": "2026-10-27T19:20:48-04:00",
    "kind": "first",
    "changes": [],
    "links": [
      {
        "label": "Changelog",
        "url": "https://github.com/mark1russell7/layout-contract/blob/dfa6691a45e35dad8ce69d178c60c1394ac69326/packages/layout-contract/CHANGELOG.md#010"
      }
    ]
  }
]
