Skip to content

v0.18.0

Choose a tag to compare

@github-actions github-actions released this 31 Aug 08:26
c645f59

Added

  • A type's id.width takes a min/max span as well as an exact count. A mnemonic drawn from a concept rather
    than cut to a length can then admit both std-PR and std-SECRET under one declaration. kac validate reports an
    id outside the span as id-format and names both ends. An exact width: 4 behaves as it always has.
  • filename.carries-id: false keeps a type's id out of its filenames. Its records are filed by topic alone, and
    nothing then reads the head of a filename as an id: id-matches-filename stays silent, slug-length measures the
    whole stem, and a link to the file is a link rather than a citation. kac validate refuses the three spans it
    cannot act on. One beside a filename that still carries the id, because secret-handling.md would otherwise bind
    to whichever id its first segment happens to spell. One on a numbered type, which pads to a single width so that
    ids sort. One whose min: sits above its max:, which no id can meet.
  • A field can require the part of the record it points at. A type declares part-required: true beside the
    field's ref:, and kac validate reports an id there that names the record whole. The message uses the target
    type's own word for a part, so a field pointing at policies asks for a clause. kac validate also reports the key
    declared with no ref: to resolve against, and one pointing at a type that keeps no parts.

Changed

  • Standards take mnemonic ids. std-0001 becomes std-VCS. A number records the order things were created, and
    a reader meeting one in a control's verifies: learns nothing. Filenames are untouched, because a standard is
    already named for its rule area. A corpus that wants its numbered standards back claims
    .schema/standards.yaml with a skip: entry in .corpus.yaml, which stops kac update replacing it.
  • kac generate heads a table per folder in a type's index. A type that declares a field with from: sub-path
    groups its index rows on the first folder below the type, so a policy folder holding Delivery, Governance,
    Operations and Security reads as four tables instead of one long list. A record filed deeper joins the table its
    first folder heads. A type whose records all sit directly in its folder gets the single table it has always had.
  • implements: on a standard names clauses. implements: [ pol-EVER ] becomes one entry per clause the standard
    puts into practice, as pol-EVER.BRANCH. The bare id claimed the whole policy, so a standard discharging six of
    eight clauses read to a coverage report as full cover and the other two disappeared. The shorthand is refused
    rather than admitted beside the list, because it is a keystroke shorter than the honest form. A corpus that wants
    the old reading back claims .schema/standards.yaml with a skip: entry in .corpus.yaml, which stops
    kac update replacing it.
  • The derived column is dropped from a table that repeats it. Every row under a heading of Security carries
    security, so the Category column says nothing there and is left out. A record filed deeper keeps it, because
    platform/node under a heading of Platform is the one place node is written down. A corpus using no folders at
    all loses a column that was empty in every row.

Fixed

  • A schema key spelled no or off now switches its behaviour off. on-type-page: no in _checks.yaml read as
    on-type-page: true, because only the exact word false was taken, and the check was then written onto a type page
    the schema had excused it from. Both spellings of each answer are read.
  • kac update finds a seeded record the corpus filed in a sub-folder. A record's folder sets its category, so a
    corpus files a seeded policy under policies/governance/ and still holds it. Compared by path, the corpus read as
    holding none, and update offered a second copy at the seeded path. Accepting it left two records carrying one id,
    which kac validate then failed on id-unique. A seed absent from its path is now looked for by the id it carries,
    anywhere under its type's folder, and a match is left alone under --policy full as well as under cautious. A
    record's relative links are written for the depth it was seeded at, so there is no copy full could write a folder
    down that would resolve.